@fumadocs/base-ui 16.6.5 → 16.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -426,6 +426,7 @@
426
426
  @source inline("use");
427
427
  @source inline("useActiveAnchor");
428
428
  @source inline("useFooterItems");
429
+ @source inline("useI18n");
429
430
  @source inline("useIsScrollTop");
430
431
  @source inline("useLinkItems");
431
432
  @source inline("useMemo");
@@ -2,6 +2,7 @@
2
2
  @source inline("!isActive");
3
3
  @source inline("!open");
4
4
  @source inline("*:rounded-lg");
5
+ @source inline("---spacing");
5
6
  @source inline("--fd-toc-width");
6
7
  @source inline("--removed-body-scroll-bar-size");
7
8
  @source inline("--spacing");
@@ -12,7 +13,6 @@
12
13
  @source inline("[&_svg]:shrink-0");
13
14
  @source inline("[&_svg]:size-4");
14
15
  @source inline("[grid-area:main]");
15
- @source inline("[scrollbar-width:none]");
16
16
  @source inline("a");
17
17
  @source inline("absolute");
18
18
  @source inline("active");
@@ -187,6 +187,7 @@
187
187
  @source inline("inline-flex");
188
188
  @source inline("input");
189
189
  @source inline("inset-0");
190
+ @source inline("inset-x-0");
190
191
  @source inline("interface");
191
192
  @source inline("invisible");
192
193
  @source inline("isActive");
@@ -207,7 +208,7 @@
207
208
  @source inline("located");
208
209
  @source inline("lucide-react");
209
210
  @source inline("main");
210
- @source inline("mask-[linear-gradient(to_bottom,transparent,white_calc(var(--spacing)*14),white_calc(100%-var(--spacing)*14),transparent)]");
211
+ @source inline("mask-[linear-gradient(to_bottom,transparent,white_--spacing(14),white_calc(100%---spacing(14)),transparent)]");
211
212
  @source inline("max");
212
213
  @source inline("max-h-[50vh]");
213
214
  @source inline("max-w-[1200px]");
@@ -221,6 +222,7 @@
221
222
  @source inline("menuItems");
222
223
  @source inline("mergeRefs");
223
224
  @source inline("min");
225
+ @source inline("min-h-0");
224
226
  @source inline("min-h-11");
225
227
  @source inline("min-w-0");
226
228
  @source inline("mode");
@@ -249,6 +251,7 @@
249
251
  @source inline("number");
250
252
  @source inline("object");
251
253
  @source inline("of");
254
+ @source inline("onAnimationComplete");
252
255
  @source inline("onClick");
253
256
  @source inline("onOpenChange");
254
257
  @source inline("opacity");
@@ -260,7 +263,6 @@
260
263
  @source inline("overflow-x-clip");
261
264
  @source inline("overflow-y-auto");
262
265
  @source inline("overflow-y-hidden");
263
- @source inline("overscroll-contain");
264
266
  @source inline("p");
265
267
  @source inline("p-1");
266
268
  @source inline("p-1.5");
@@ -314,10 +316,12 @@
314
316
  @source inline("rounded-lg");
315
317
  @source inline("rounded-xl");
316
318
  @source inline("rtl:rotate-180");
319
+ @source inline("scale");
317
320
  @source inline("searchToggle");
318
321
  @source inline("secondary");
319
322
  @source inline("selected");
320
323
  @source inline("selectedIdx");
324
+ @source inline("setBlockScroll");
321
325
  @source inline("setContainer");
322
326
  @source inline("setDate");
323
327
  @source inline("setOpen");
@@ -381,6 +385,7 @@
381
385
  @source inline("tocOptions");
382
386
  @source inline("tocPopoverEnabled");
383
387
  @source inline("tool");
388
+ @source inline("top-0");
384
389
  @source inline("transform");
385
390
  @source inline("transition");
386
391
  @source inline("transition-all");
@@ -388,6 +393,7 @@
388
393
  @source inline("transition-opacity");
389
394
  @source inline("transition-transform");
390
395
  @source inline("translate-x-[calc(-50%-var(--removed-body-scroll-bar-size,0px)/2)]");
396
+ @source inline("translateY");
391
397
  @source inline("tree");
392
398
  @source inline("true");
393
399
  @source inline("truncate");
@@ -400,10 +406,12 @@
400
406
  @source inline("use");
401
407
  @source inline("useActiveAnchor");
402
408
  @source inline("useFooterItems");
409
+ @source inline("useI18n");
403
410
  @source inline("useLinkItems");
404
411
  @source inline("useMemo");
405
412
  @source inline("usePathname");
406
413
  @source inline("useRef");
414
+ @source inline("useSearchContext");
407
415
  @source inline("useSidebar");
408
416
  @source inline("useState");
409
417
  @source inline("useTOCItems");
@@ -464,6 +464,7 @@
464
464
  @source inline("use");
465
465
  @source inline("useActiveAnchor");
466
466
  @source inline("useFooterItems");
467
+ @source inline("useI18n");
467
468
  @source inline("useIsScrollTop");
468
469
  @source inline("useLinkItems");
469
470
  @source inline("useMemo");
@@ -260,6 +260,7 @@
260
260
  @source inline("defaultTranslations");
261
261
  @source inline("defaultValue");
262
262
  @source inline("defaults");
263
+ @source inline("defineI18nUI");
263
264
  @source inline("defined");
264
265
  @source inline("delay");
265
266
  @source inline("dependencies");
@@ -473,6 +474,7 @@
473
474
  @source inline("is");
474
475
  @source inline("isActive");
475
476
  @source inline("isLoading");
477
+ @source inline("isOpen");
476
478
  @source inline("isWindows");
477
479
  @source inline("it");
478
480
  @source inline("item");
@@ -1006,6 +1008,7 @@
1006
1008
  @source inline("use");
1007
1009
  @source inline("useCopyButton");
1008
1010
  @source inline("useDocsSearch");
1011
+ @source inline("useI18n");
1009
1012
  @source inline("useMediaQuery");
1010
1013
  @source inline("useMemo");
1011
1014
  @source inline("useOnChange");
package/css/lib/shiki.css CHANGED
@@ -26,26 +26,6 @@
26
26
  filter: blur(0);
27
27
  }
28
28
 
29
- &[data-line-numbers] .twoslash-meta-line {
30
- padding-left: calc(var(--padding-left) + 7 * var(--spacing));
31
- }
32
-
33
- &[data-line-numbers] .line {
34
- counter-increment: line;
35
- padding-left: calc(var(--padding-left) + 7 * var(--spacing));
36
- }
37
-
38
- &[data-line-numbers] .line::after {
39
- position: absolute;
40
- content: counter(line);
41
- color: color-mix(
42
- in oklab,
43
- var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%,
44
- transparent
45
- );
46
- @apply top-0 left-4;
47
- }
48
-
49
29
  .diff::before {
50
30
  position: absolute;
51
31
  left: calc(var(--spacing) * 1.5);
@@ -75,14 +55,39 @@
75
55
  .highlighted {
76
56
  --fd-counter-color: var(--color-fd-primary);
77
57
  padding-left: calc(var(--padding-left) - 2px);
58
+ @apply bg-fd-primary/10;
59
+ }
78
60
 
79
- @apply border-l-2 border-fd-primary/50 bg-fd-primary/10;
61
+ .highlighted::after {
62
+ position: absolute;
63
+ content: '';
64
+ @apply inset-y-0 left-0 border-l-2 border-fd-primary/50;
80
65
  }
81
66
 
82
67
  .highlighted-word {
83
68
  padding: 1px;
84
69
  @apply border -my-px border-fd-primary/30 bg-fd-primary/10 rounded-md font-medium;
85
70
  }
71
+
72
+ &[data-line-numbers] .twoslash-meta-line {
73
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
74
+ }
75
+
76
+ &[data-line-numbers] .line {
77
+ counter-increment: line;
78
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
79
+ }
80
+
81
+ &[data-line-numbers] .line::after {
82
+ position: absolute;
83
+ content: counter(line);
84
+ color: color-mix(
85
+ in oklab,
86
+ var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%,
87
+ transparent
88
+ );
89
+ @apply inset-y-0 left-0 w-7 text-right;
90
+ }
86
91
  }
87
92
 
88
93
  .dark .shiki:not(.not-fumadocs-codeblock *) {
@@ -49,6 +49,7 @@ interface SearchProviderProps {
49
49
  }
50
50
  interface SearchContextType {
51
51
  enabled: boolean;
52
+ open: boolean;
52
53
  hotKey: HotKey[];
53
54
  setOpenSearch: (value: boolean) => void;
54
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","names":[],"sources":["../../src/contexts/search.tsx"],"mappings":";;;;UAaU,MAAA;EACR,OAAA,EAAS,SAAA;;AAHI;;EAQb,GAAA,aAAgB,CAAA,EAAG,aAAA;AAAA;AAAA,UAGJ,WAAA;EACf,IAAA;EACA,YAAA,GAAe,IAAA;AAAA;AAAA,KAGL,UAAA,IAAc,IAAA,UAAc,IAAA;AAAA,UAEvB,OAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,mBAAA;EAZW;;;;;EAkB1B,OAAA;EAbU;;;EAkBV,KAAA,GAAQ,UAAA;EAlBkC;AAE5C;;;;EAuBE,MAAA,GAAS,MAAA;EAlBM;;;;;EAyBf,YAAA,EAAc,aAAA,CAAc,WAAA;EAAd;;;EAKd,OAAA,GAAU,OAAA,CAAQ,WAAA,GAAc,MAAA;EAEhC,QAAA,GAAW,SAAA;AAAA;AAAA,UAGH,iBAAA;EACR,OAAA;EACA,MAAA,EAAQ,MAAA;EACR,aAAA,GAAgB,KAAA;AAAA;AAAA,iBASF,gBAAA,CAAA,GAAoB,iBAAA;AAAA,iBAgBpB,cAAA,CAAA;EACd,YAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EAUA;AAAA,GACC,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBA+CN,UAAA,CAAA;EAAa;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,SAAA"}
1
+ {"version":3,"file":"search.d.ts","names":[],"sources":["../../src/contexts/search.tsx"],"mappings":";;;;UAaU,MAAA;EACR,OAAA,EAAS,SAAA;;AAHI;;EAQb,GAAA,aAAgB,CAAA,EAAG,aAAA;AAAA;AAAA,UAGJ,WAAA;EACf,IAAA;EACA,YAAA,GAAe,IAAA;AAAA;AAAA,KAGL,UAAA,IAAc,IAAA,UAAc,IAAA;AAAA,UAEvB,OAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,mBAAA;EAZW;;;;;EAkB1B,OAAA;EAbU;;;EAkBV,KAAA,GAAQ,UAAA;EAlBkC;AAE5C;;;;EAuBE,MAAA,GAAS,MAAA;EAlBM;;;;;EAyBf,YAAA,EAAc,aAAA,CAAc,WAAA;EAAd;;;EAKd,OAAA,GAAU,OAAA,CAAQ,WAAA,GAAc,MAAA;EAEhC,QAAA,GAAW,SAAA;AAAA;AAAA,UAGH,iBAAA;EACR,OAAA;EACA,IAAA;EACA,MAAA,EAAQ,MAAA;EACR,aAAA,GAAgB,KAAA;AAAA;AAAA,iBAUF,gBAAA,CAAA,GAAoB,iBAAA;AAAA,iBAgBpB,cAAA,CAAA;EACd,YAAA;EACA,QAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EAUA;AAAA,GACC,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAgDN,UAAA,CAAA;EAAa;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,SAAA"}
@@ -6,6 +6,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/contexts/search.tsx
7
7
  const SearchContext = createContext({
8
8
  enabled: false,
9
+ open: false,
9
10
  hotKey: [],
10
11
  setOpenSearch: () => void 0
11
12
  });
@@ -42,9 +43,10 @@ function SearchProvider({ SearchDialog, children, preload = true, options, hotKe
42
43
  return /* @__PURE__ */ jsxs(SearchContext, {
43
44
  value: useMemo(() => ({
44
45
  enabled: true,
46
+ open: isOpen ?? false,
45
47
  hotKey,
46
48
  setOpenSearch: setIsOpen
47
- }), [hotKey]),
49
+ }), [isOpen, hotKey]),
48
50
  children: [isOpen !== void 0 && /* @__PURE__ */ jsx(Suspense, {
49
51
  fallback: null,
50
52
  children: /* @__PURE__ */ jsx(SearchDialog, {
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":[],"sources":["../../src/contexts/search.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n Suspense,\n use,\n useEffect,\n useEffectEvent,\n useMemo,\n useState,\n} from 'react';\n\ninterface HotKey {\n display: ReactNode;\n\n /**\n * Key code or a function determining whether the key is pressed.\n */\n key: string | ((e: KeyboardEvent) => boolean);\n}\n\nexport interface SharedProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport type SearchLink = [name: string, href: string];\n\nexport interface TagItem {\n name: string;\n value: string;\n}\n\nexport interface SearchProviderProps {\n /**\n * Preload search dialog before opening it\n *\n * @defaultValue `true`\n */\n preload?: boolean;\n\n /**\n * Custom links to be displayed if search is empty\n */\n links?: SearchLink[];\n\n /**\n * Hotkeys for triggering search dialog\n *\n * @defaultValue Meta/Ctrl + K\n */\n hotKey?: HotKey[];\n\n /**\n * Replace default search dialog, allowing you to use other solutions such as Algolia Search\n *\n * It receives the `open` and `onOpenChange` prop, can be lazy loaded with `next/dynamic`\n */\n SearchDialog: ComponentType<SharedProps>;\n\n /**\n * Additional props to the dialog\n */\n options?: Partial<SharedProps & Record<string, unknown>>;\n\n children?: ReactNode;\n}\n\ninterface SearchContextType {\n enabled: boolean;\n hotKey: HotKey[];\n setOpenSearch: (value: boolean) => void;\n}\n\nconst SearchContext = createContext<SearchContextType>({\n enabled: false,\n hotKey: [],\n setOpenSearch: () => undefined,\n});\n\nexport function useSearchContext(): SearchContextType {\n return use(SearchContext);\n}\n\nfunction MetaOrControl() {\n const [key, setKey] = useState('⌘');\n\n useEffect(() => {\n const isWindows = window.navigator.userAgent.includes('Windows');\n\n if (isWindows) setKey('Ctrl');\n }, []);\n\n return key;\n}\n\nexport function SearchProvider({\n SearchDialog,\n children,\n preload = true,\n options,\n hotKey = [\n {\n key: (e) => e.metaKey || e.ctrlKey,\n display: <MetaOrControl />,\n },\n {\n key: 'k',\n display: 'K',\n },\n ],\n links,\n}: SearchProviderProps) {\n const [isOpen, setIsOpen] = useState(preload ? false : undefined);\n const onKeyDown = useEffectEvent((e: KeyboardEvent) => {\n if (hotKey.every((v) => (typeof v.key === 'string' ? e.key === v.key : v.key(e)))) {\n setIsOpen((open) => !open);\n e.preventDefault();\n }\n });\n\n useEffect(() => {\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [hotKey]);\n\n return (\n <SearchContext\n value={useMemo(\n () => ({\n enabled: true,\n hotKey,\n setOpenSearch: setIsOpen,\n }),\n [hotKey],\n )}\n >\n {isOpen !== undefined && (\n <Suspense fallback={null}>\n <SearchDialog\n open={isOpen}\n onOpenChange={setIsOpen}\n // @ts-expect-error -- insert prop for official UIs\n links={links}\n {...options}\n />\n </Suspense>\n )}\n\n {children}\n </SearchContext>\n );\n}\n\n/**\n * Show children only when search is enabled via React Context\n */\nexport function SearchOnly({ children }: { children: ReactNode }) {\n const search = useSearchContext();\n\n if (search.enabled) return children;\n}\n"],"mappings":";;;;;;AA2EA,MAAM,gBAAgB,cAAiC;CACrD,SAAS;CACT,QAAQ,EAAE;CACV,qBAAqB;CACtB,CAAC;AAEF,SAAgB,mBAAsC;AACpD,QAAO,IAAI,cAAc;;AAG3B,SAAS,gBAAgB;CACvB,MAAM,CAAC,KAAK,UAAU,SAAS,IAAI;AAEnC,iBAAgB;AAGd,MAFkB,OAAO,UAAU,UAAU,SAAS,UAAU,CAEjD,QAAO,OAAO;IAC5B,EAAE,CAAC;AAEN,QAAO;;AAGT,SAAgB,eAAe,EAC7B,cACA,UACA,UAAU,MACV,SACA,SAAS,CACP;CACE,MAAM,MAAM,EAAE,WAAW,EAAE;CAC3B,SAAS,oBAAC,kBAAgB;CAC3B,EACD;CACE,KAAK;CACL,SAAS;CACV,CACF,EACD,SACsB;CACtB,MAAM,CAAC,QAAQ,aAAa,SAAS,UAAU,QAAQ,OAAU;CACjE,MAAM,YAAY,gBAAgB,MAAqB;AACrD,MAAI,OAAO,OAAO,MAAO,OAAO,EAAE,QAAQ,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAE,EAAE;AACjF,cAAW,SAAS,CAAC,KAAK;AAC1B,KAAE,gBAAgB;;GAEpB;AAEF,iBAAgB;AACd,SAAO,iBAAiB,WAAW,UAAU;AAC7C,eAAa;AACX,UAAO,oBAAoB,WAAW,UAAU;;IAEjD,CAAC,OAAO,CAAC;AAEZ,QACE,qBAAC;EACC,OAAO,eACE;GACL,SAAS;GACT;GACA,eAAe;GAChB,GACD,CAAC,OAAO,CACT;aAEA,WAAW,UACV,oBAAC;GAAS,UAAU;aAClB,oBAAC;IACC,MAAM;IACN,cAAc;IAEP;IACP,GAAI;KACJ;IACO,EAGZ;GACa;;;;;AAOpB,SAAgB,WAAW,EAAE,YAAqC;AAGhE,KAFe,kBAAkB,CAEtB,QAAS,QAAO"}
1
+ {"version":3,"file":"search.js","names":[],"sources":["../../src/contexts/search.tsx"],"sourcesContent":["'use client';\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n Suspense,\n use,\n useEffect,\n useEffectEvent,\n useMemo,\n useState,\n} from 'react';\n\ninterface HotKey {\n display: ReactNode;\n\n /**\n * Key code or a function determining whether the key is pressed.\n */\n key: string | ((e: KeyboardEvent) => boolean);\n}\n\nexport interface SharedProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nexport type SearchLink = [name: string, href: string];\n\nexport interface TagItem {\n name: string;\n value: string;\n}\n\nexport interface SearchProviderProps {\n /**\n * Preload search dialog before opening it\n *\n * @defaultValue `true`\n */\n preload?: boolean;\n\n /**\n * Custom links to be displayed if search is empty\n */\n links?: SearchLink[];\n\n /**\n * Hotkeys for triggering search dialog\n *\n * @defaultValue Meta/Ctrl + K\n */\n hotKey?: HotKey[];\n\n /**\n * Replace default search dialog, allowing you to use other solutions such as Algolia Search\n *\n * It receives the `open` and `onOpenChange` prop, can be lazy loaded with `next/dynamic`\n */\n SearchDialog: ComponentType<SharedProps>;\n\n /**\n * Additional props to the dialog\n */\n options?: Partial<SharedProps & Record<string, unknown>>;\n\n children?: ReactNode;\n}\n\ninterface SearchContextType {\n enabled: boolean;\n open: boolean;\n hotKey: HotKey[];\n setOpenSearch: (value: boolean) => void;\n}\n\nconst SearchContext = createContext<SearchContextType>({\n enabled: false,\n open: false,\n hotKey: [],\n setOpenSearch: () => undefined,\n});\n\nexport function useSearchContext(): SearchContextType {\n return use(SearchContext);\n}\n\nfunction MetaOrControl() {\n const [key, setKey] = useState('⌘');\n\n useEffect(() => {\n const isWindows = window.navigator.userAgent.includes('Windows');\n\n if (isWindows) setKey('Ctrl');\n }, []);\n\n return key;\n}\n\nexport function SearchProvider({\n SearchDialog,\n children,\n preload = true,\n options,\n hotKey = [\n {\n key: (e) => e.metaKey || e.ctrlKey,\n display: <MetaOrControl />,\n },\n {\n key: 'k',\n display: 'K',\n },\n ],\n links,\n}: SearchProviderProps) {\n const [isOpen, setIsOpen] = useState(preload ? false : undefined);\n const onKeyDown = useEffectEvent((e: KeyboardEvent) => {\n if (hotKey.every((v) => (typeof v.key === 'string' ? e.key === v.key : v.key(e)))) {\n setIsOpen((open) => !open);\n e.preventDefault();\n }\n });\n\n useEffect(() => {\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [hotKey]);\n\n return (\n <SearchContext\n value={useMemo(\n () => ({\n enabled: true,\n open: isOpen ?? false,\n hotKey,\n setOpenSearch: setIsOpen,\n }),\n [isOpen, hotKey],\n )}\n >\n {isOpen !== undefined && (\n <Suspense fallback={null}>\n <SearchDialog\n open={isOpen}\n onOpenChange={setIsOpen}\n // @ts-expect-error -- insert prop for official UIs\n links={links}\n {...options}\n />\n </Suspense>\n )}\n\n {children}\n </SearchContext>\n );\n}\n\n/**\n * Show children only when search is enabled via React Context\n */\nexport function SearchOnly({ children }: { children: ReactNode }) {\n const search = useSearchContext();\n\n if (search.enabled) return children;\n}\n"],"mappings":";;;;;;AA4EA,MAAM,gBAAgB,cAAiC;CACrD,SAAS;CACT,MAAM;CACN,QAAQ,EAAE;CACV,qBAAqB;CACtB,CAAC;AAEF,SAAgB,mBAAsC;AACpD,QAAO,IAAI,cAAc;;AAG3B,SAAS,gBAAgB;CACvB,MAAM,CAAC,KAAK,UAAU,SAAS,IAAI;AAEnC,iBAAgB;AAGd,MAFkB,OAAO,UAAU,UAAU,SAAS,UAAU,CAEjD,QAAO,OAAO;IAC5B,EAAE,CAAC;AAEN,QAAO;;AAGT,SAAgB,eAAe,EAC7B,cACA,UACA,UAAU,MACV,SACA,SAAS,CACP;CACE,MAAM,MAAM,EAAE,WAAW,EAAE;CAC3B,SAAS,oBAAC,kBAAgB;CAC3B,EACD;CACE,KAAK;CACL,SAAS;CACV,CACF,EACD,SACsB;CACtB,MAAM,CAAC,QAAQ,aAAa,SAAS,UAAU,QAAQ,OAAU;CACjE,MAAM,YAAY,gBAAgB,MAAqB;AACrD,MAAI,OAAO,OAAO,MAAO,OAAO,EAAE,QAAQ,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAE,EAAE;AACjF,cAAW,SAAS,CAAC,KAAK;AAC1B,KAAE,gBAAgB;;GAEpB;AAEF,iBAAgB;AACd,SAAO,iBAAiB,WAAW,UAAU;AAC7C,eAAa;AACX,UAAO,oBAAoB,WAAW,UAAU;;IAEjD,CAAC,OAAO,CAAC;AAEZ,QACE,qBAAC;EACC,OAAO,eACE;GACL,SAAS;GACT,MAAM,UAAU;GAChB;GACA,eAAe;GAChB,GACD,CAAC,QAAQ,OAAO,CACjB;aAEA,WAAW,UACV,oBAAC;GAAS,UAAU;aAClB,oBAAC;IACC,MAAM;IACN,cAAc;IAEP;IACP,GAAI;KACJ;IACO,EAGZ;GACa;;;;;AAOpB,SAAgB,WAAW,EAAE,YAAqC;AAGhE,KAFe,kBAAkB,CAEtB,QAAS,QAAO"}
@@ -58,7 +58,6 @@ declare function NavigationPanel({
58
58
  tabDropdown,
59
59
  tool,
60
60
  link,
61
- className,
62
61
  children,
63
62
  ...props
64
63
  }: NavigationPanelProps & Omit<ComponentProps<typeof motion.div>, 'children'> & {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/layouts/flux/index.tsx"],"mappings":";;;;;;;;;;;UAqBiB,eAAA,SAAwB,eAAA;EACvC,IAAA,EAAM,QAAA,CAAS,IAAA;EAEf,OAAA,GAAU,cAAA;EAHK;;;EAQf,cAAA,GAAiB,cAAA,CAAe,cAAA;EAEhC,qBAAA,IAAyB,KAAA,EAAO,oBAAA,KAAyB,SAAA;AAAA;AAAA,UAGjD,cAAA,SAEN,cAAA,WACA,IAAA,CAAK,cAAA,QAAsB,OAAA;EAC7B,OAAA;EACA,SAAA,GAAY,SAAA;EACZ,UAAA,GAAa,OAAA,CAAQ,yBAAA;EAnBiC;;;EAwBtD,IAAA,GAAO,mBAAA,KAAwB,qBAAA;EAE/B,MAAA,GAAS,SAAA;EACT,MAAA,GAAS,SAAA;AAAA;AAAA,iBAGK,UAAA,CAAA;EACd,IAAA;EACA,GAAA;EACA,OAAA;IACE,OAAA,EAAS,cAAA;IACT,IAAA,EAAM,WAAA;IACN,gBAAA;IACA,QAAA;IAAA,GACG;EAAA;EAEL,YAAA;EACA,WAAA;EACA,IAAA;EACA,QAAA;EACA,cAAA;EACA,qBAAA;EAAA,GACG;AAAA,GACF,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,UAuID,oBAAA;EACf,IAAA,EAAM,SAAA;EACN,WAAA,EAAa,SAAA;EACb,IAAA,EAAM,SAAA;EACN,IAAA,EAAM,SAAA;AAAA;AAAA,iBAGQ,eAAA,CAAA;EACd,IAAA;EACA,WAAA;EACA,IAAA;EACA,IAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,oBAAA,GACD,IAAA,CAAK,cAAA,QAAsB,MAAA,CAAO,GAAA;EA5LgC;;AACnE;EA+LG,QAAA,IAAY,eAAA,EAAiB,SAAA,KAAc,SAAA;AAAA,IAC5C,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiCa,sBAAA,CAAA;EACd,OAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,CAAO,GAAA;EAAS,OAAA;AAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/layouts/flux/index.tsx"],"mappings":";;;;;;;;;;;UAsBiB,eAAA,SAAwB,eAAA;EACvC,IAAA,EAAM,QAAA,CAAS,IAAA;EAEf,OAAA,GAAU,cAAA;EAHK;;;EAQf,cAAA,GAAiB,cAAA,CAAe,cAAA;EAEhC,qBAAA,IAAyB,KAAA,EAAO,oBAAA,KAAyB,SAAA;AAAA;AAAA,UAGjD,cAAA,SAEN,cAAA,WACA,IAAA,CAAK,cAAA,QAAsB,OAAA;EAC7B,OAAA;EACA,SAAA,GAAY,SAAA;EACZ,UAAA,GAAa,OAAA,CAAQ,yBAAA;EAnBiC;;;EAwBtD,IAAA,GAAO,mBAAA,KAAwB,qBAAA;EAE/B,MAAA,GAAS,SAAA;EACT,MAAA,GAAS,SAAA;AAAA;AAAA,iBAGK,UAAA,CAAA;EACd,IAAA;EACA,GAAA;EACA,OAAA;IACE,OAAA,EAAS,cAAA;IACT,IAAA,EAAM,WAAA;IACN,gBAAA;IACA,QAAA;IAAA,GACG;EAAA;EAEL,YAAA;EACA,WAAA;EACA,IAAA;EACA,QAAA;EACA,cAAA;EACA,qBAAA;EAAA,GACG;AAAA,GACF,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,UAuID,oBAAA;EACf,IAAA,EAAM,SAAA;EACN,WAAA,EAAa,SAAA;EACb,IAAA,EAAM,SAAA;EACN,IAAA,EAAM,SAAA;AAAA;AAAA,iBAGQ,eAAA,CAAA;EACd,IAAA;EACA,WAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,oBAAA,GACD,IAAA,CAAK,cAAA,QAAsB,MAAA,CAAO,GAAA;EA3LgC;;AACnE;EA8LG,QAAA,IAAY,eAAA,EAAiB,SAAA,KAAc,SAAA;AAAA,IAC5C,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAyCa,sBAAA,CAAA;EACd,OAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,CAAO,GAAA;EAAS,OAAA;AAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -5,6 +5,7 @@ import { buttonVariants } from "../../components/ui/button.js";
5
5
  import { TreeContextProvider } from "../../contexts/tree.js";
6
6
  import { SidebarViewport, useSidebar } from "../../components/sidebar/base.js";
7
7
  import { LinkItem } from "../../utils/link-item.js";
8
+ import { useSearchContext } from "../../contexts/search.js";
8
9
  import { SearchToggle } from "../shared/search-toggle.js";
9
10
  import { renderTitleNav, useLinkItems } from "../shared/index.js";
10
11
  import { LanguageToggle } from "../shared/language-toggle.js";
@@ -117,10 +118,16 @@ function NavigationSidebarTrigger() {
117
118
  })
118
119
  });
119
120
  }
120
- function NavigationPanel({ head, tabDropdown, tool, link, className, children = (v) => v, ...props }) {
121
+ function NavigationPanel({ head, tabDropdown, tool, link, children = (v) => v, ...props }) {
122
+ const { open } = useSearchContext();
121
123
  return /* @__PURE__ */ jsx(motion.div, {
122
- className: cn("fixed left-1/2 w-[calc(100%-var(--removed-body-scroll-bar-size,0px))] translate-x-[calc(-50%-var(--removed-body-scroll-bar-size,0px)/2)] bottom-0 z-40 bg-fd-popover text-fd-popover-foreground border-t shadow-lg sm:bottom-6 sm:rounded-2xl sm:border sm:max-w-[380px]", className),
123
124
  ...props,
125
+ className: cn("fixed left-1/2 w-[calc(100%-var(--removed-body-scroll-bar-size,0px))] translate-x-[calc(-50%-var(--removed-body-scroll-bar-size,0px)/2)] bottom-0 z-40 bg-fd-popover text-fd-popover-foreground border-t shadow-lg sm:bottom-6 sm:rounded-2xl sm:border sm:max-w-[380px]", props.className),
126
+ animate: props.animate ?? {
127
+ scale: open ? .9 : 1,
128
+ translateY: open ? 20 : 0,
129
+ opacity: open ? .8 : 1
130
+ },
124
131
  children: children(/* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("div", {
125
132
  className: "flex flex-row items-center ps-2.5 p-1 gap-2 min-h-11",
126
133
  children: [head, /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Sidebar"],"sources":["../../../src/layouts/flux/index.tsx"],"sourcesContent":["'use client';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport type { BaseLayoutProps } from '@/layouts/shared';\nimport { TreeContextProvider } from '@/contexts/tree';\nimport { getSidebarTabs, type GetSidebarTabsOptions } from '@/components/sidebar/tabs';\nimport type { SidebarPageTreeComponents } from '@/components/sidebar/page-tree';\nimport { type ComponentProps, HTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { SidebarViewport, useSidebar } from '@/components/sidebar/base';\nimport { SidebarTabsDropdown, type SidebarTabWithProps } from './tab-dropdown';\nimport { Sidebar, SidebarContent, SidebarLinkItem, SidebarPageTree } from './sidebar';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Languages, SidebarIcon, XIcon } from 'lucide-react';\nimport { renderTitleNav, useLinkItems } from '../shared';\nimport { LanguageToggle } from '../shared/language-toggle';\nimport { SearchToggle } from '../shared/search-toggle';\nimport { ThemeToggle } from '../shared/theme-toggle';\nimport { LinkItem } from '@/utils/link-item';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { RemoveScroll } from 'react-remove-scroll';\n\nexport interface DocsLayoutProps extends BaseLayoutProps {\n tree: PageTree.Root;\n\n sidebar?: SidebarOptions;\n\n /**\n * Props for the `div` container\n */\n containerProps?: HTMLAttributes<HTMLDivElement>;\n\n renderNavigationPanel?: (props: NavigationPanelProps) => ReactNode;\n}\n\ninterface SidebarOptions\n extends\n ComponentProps<'aside'>,\n Pick<ComponentProps<typeof Sidebar>, 'defaultOpenLevel' | 'prefetch'> {\n enabled?: boolean;\n component?: ReactNode;\n components?: Partial<SidebarPageTreeComponents>;\n\n /**\n * Root Toggle options\n */\n tabs?: SidebarTabWithProps[] | GetSidebarTabsOptions | false;\n\n banner?: ReactNode;\n footer?: ReactNode;\n}\n\nexport function DocsLayout({\n tree,\n nav = {},\n sidebar: {\n enabled: sidebarEnabled = true,\n tabs: sidebarTabs,\n defaultOpenLevel,\n prefetch,\n ...sidebarProps\n } = {},\n searchToggle = {},\n themeSwitch = {},\n i18n = false,\n children,\n containerProps,\n renderNavigationPanel = (props) => <NavigationPanel {...props} />,\n ...props\n}: DocsLayoutProps) {\n const tabs = useMemo(() => {\n if (Array.isArray(sidebarTabs)) {\n return sidebarTabs;\n }\n if (typeof sidebarTabs === 'object') {\n return getSidebarTabs(tree, sidebarTabs);\n }\n if (sidebarTabs !== false) {\n return getSidebarTabs(tree);\n }\n return [];\n }, [tree, sidebarTabs]);\n const { menuItems } = useLinkItems(props);\n const iconLinks = menuItems.filter((item) => item.type === 'icon');\n\n function sidebar() {\n const { footer, banner, component, components, ...rest } = sidebarProps;\n if (component) return component;\n\n return (\n <SidebarContent {...rest}>\n <div className=\"flex flex-col gap-3 p-4 pb-2 empty:hidden\">{banner}</div>\n <SidebarViewport>\n {menuItems\n .filter((v) => v.type !== 'icon')\n .map((item, i, list) => (\n <SidebarLinkItem\n key={i}\n item={item}\n className={cn(i === list.length - 1 && 'mb-4')}\n />\n ))}\n <SidebarPageTree {...components} />\n </SidebarViewport>\n {footer}\n </SidebarContent>\n );\n }\n\n return (\n <TreeContextProvider tree={tree}>\n <Sidebar defaultOpenLevel={defaultOpenLevel} prefetch={prefetch}>\n <div\n id=\"nd-flux-layout\"\n {...containerProps}\n className={cn(\n 'flex flex-col items-center pb-24 overflow-x-clip',\n containerProps?.className,\n )}\n >\n {sidebarEnabled && sidebar()}\n {children}\n </div>\n {renderNavigationPanel({\n head: renderTitleNav(nav, {\n className: 'inline-flex items-center gap-2.5 text-sm font-semibold',\n }),\n tabDropdown: tabs.length > 0 && <SidebarTabsDropdown className=\"flex-1\" options={tabs} />,\n tool: (\n <>\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n </LanguageToggle>\n )}\n\n {searchToggle.enabled !== false &&\n (searchToggle.components?.sm ?? (\n <SearchToggle className=\"rounded-lg\" hideIfDisabled />\n ))}\n\n <NavigationSidebarTrigger />\n {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? (\n <ThemeToggle\n className=\"px-1 py-0 h-full ms-1 rounded-xl bg-fd-muted *:rounded-lg\"\n mode={themeSwitch.mode}\n />\n ))}\n </>\n ),\n link: iconLinks.map((item, i) => (\n <LinkItem\n key={i}\n item={item}\n className={cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }))}\n aria-label={item.label}\n >\n {item.icon}\n </LinkItem>\n )),\n })}\n </Sidebar>\n </TreeContextProvider>\n );\n}\n\nfunction NavigationSidebarTrigger() {\n const { open, setOpen } = useSidebar();\n return (\n <button\n className={cn(\n buttonVariants({\n variant: 'ghost',\n size: 'icon-sm',\n className: 'overflow-hidden',\n }),\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={open ? 'open' : 'closed'}\n transition={{ duration: 0.2 }}\n initial={{\n y: '100%',\n opacity: 0,\n }}\n animate={{\n y: 0,\n opacity: 1,\n }}\n exit={{\n y: '100%',\n opacity: 0,\n }}\n >\n {open ? <XIcon /> : <SidebarIcon />}\n </motion.span>\n </AnimatePresence>\n </button>\n );\n}\n\nexport interface NavigationPanelProps {\n head: ReactNode;\n tabDropdown: ReactNode;\n tool: ReactNode;\n link: ReactNode;\n}\n\nexport function NavigationPanel({\n head,\n tabDropdown,\n tool,\n link,\n className,\n children = (v) => v,\n ...props\n}: NavigationPanelProps &\n Omit<ComponentProps<typeof motion.div>, 'children'> & {\n /**\n * replace default children\n */\n children?: (defaultChildren: ReactNode) => ReactNode;\n }) {\n return (\n <motion.div\n className={cn(\n 'fixed left-1/2 w-[calc(100%-var(--removed-body-scroll-bar-size,0px))] translate-x-[calc(-50%-var(--removed-body-scroll-bar-size,0px)/2)] bottom-0 z-40 bg-fd-popover text-fd-popover-foreground border-t shadow-lg sm:bottom-6 sm:rounded-2xl sm:border sm:max-w-[380px]',\n className,\n )}\n {...props}\n >\n {children(\n <>\n <div className=\"flex flex-row items-center ps-2.5 p-1 gap-2 min-h-11\">\n {head}\n <div id=\"flux-layout-slot\" className=\"flex-1\" />\n </div>\n\n <div className=\"flex flex-row gap-1.5 overflow-x-auto overflow-y-hidden p-2 sm:p-1\">\n <div className=\"flex flex-row items-center gap-2 min-w-0 flex-1\">{tabDropdown}</div>\n\n <div className=\"flex flex-row items-center text-fd-muted-foreground border-x px-0.5 empty:hidden\">\n {link}\n </div>\n\n <div className=\"flex flex-row items-center text-fd-muted-foreground empty:hidden\">\n {tool}\n </div>\n </div>\n </>,\n )}\n </motion.div>\n );\n}\n\nexport function NavigationPanelOverlay({\n enabled = false,\n className,\n ...props\n}: ComponentProps<typeof motion.div> & { enabled?: boolean }) {\n return (\n <RemoveScroll enabled={enabled}>\n <motion.div\n className={cn(\n 'fixed inset-0 z-30 pr-(--removed-body-scroll-bar-size,0) backdrop-blur-md bg-fd-background/60',\n !enabled && 'pointer-events-none',\n className,\n )}\n initial=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n animate={enabled ? 'show' : 'hide'}\n exit=\"hide\"\n {...props}\n />\n </RemoveScroll>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmDA,SAAgB,WAAW,EACzB,MACA,MAAM,EAAE,EACR,SAAS,EACP,SAAS,iBAAiB,MAC1B,MAAM,aACN,kBACA,UACA,GAAG,iBACD,EAAE,EACN,eAAe,EAAE,EACjB,cAAc,EAAE,EAChB,OAAO,OACP,UACA,gBACA,yBAAyB,UAAU,oBAAC,mBAAgB,GAAI,QAAS,EACjE,GAAG,SACe;CAClB,MAAM,OAAO,cAAc;AACzB,MAAI,MAAM,QAAQ,YAAY,CAC5B,QAAO;AAET,MAAI,OAAO,gBAAgB,SACzB,QAAO,eAAe,MAAM,YAAY;AAE1C,MAAI,gBAAgB,MAClB,QAAO,eAAe,KAAK;AAE7B,SAAO,EAAE;IACR,CAAC,MAAM,YAAY,CAAC;CACvB,MAAM,EAAE,cAAc,aAAa,MAAM;CACzC,MAAM,YAAY,UAAU,QAAQ,SAAS,KAAK,SAAS,OAAO;CAElE,SAAS,UAAU;EACjB,MAAM,EAAE,QAAQ,QAAQ,WAAW,YAAY,GAAG,SAAS;AAC3D,MAAI,UAAW,QAAO;AAEtB,SACE,qBAAC;GAAe,GAAI;;IAClB,oBAAC;KAAI,WAAU;eAA6C;MAAa;IACzE,qBAAC,8BACE,UACE,QAAQ,MAAM,EAAE,SAAS,OAAO,CAChC,KAAK,MAAM,GAAG,SACb,oBAAC;KAEO;KACN,WAAW,GAAG,MAAM,KAAK,SAAS,KAAK,OAAO;OAFzC,EAGL,CACF,EACJ,oBAAC,mBAAgB,GAAI,aAAc,IACnB;IACjB;;IACc;;AAIrB,QACE,oBAAC;EAA0B;YACzB,qBAACA;GAA0B;GAA4B;cACrD,qBAAC;IACC,IAAG;IACH,GAAI;IACJ,WAAW,GACT,oDACA,gBAAgB,UACjB;eAEA,kBAAkB,SAAS,EAC3B;KACG,EACL,sBAAsB;IACrB,MAAM,eAAe,KAAK,EACxB,WAAW,0DACZ,CAAC;IACF,aAAa,KAAK,SAAS,KAAK,oBAAC;KAAoB,WAAU;KAAS,SAAS;MAAQ;IACzF,MACE;KACG,QACC,oBAAC,4BACC,oBAAC,aAAU,WAAU,aAAa,GACnB;KAGlB,aAAa,YAAY,UACvB,aAAa,YAAY,MACxB,oBAAC;MAAa,WAAU;MAAa;OAAiB;KAG1D,oBAAC,6BAA2B;KAC3B,YAAY,YAAY,UACtB,YAAY,aACX,oBAAC;MACC,WAAU;MACV,MAAM,YAAY;OAClB;QAEL;IAEL,MAAM,UAAU,KAAK,MAAM,MACzB,oBAAC;KAEO;KACN,WAAW,GAAG,eAAe;MAAE,MAAM;MAAW,OAAO;MAAS,CAAC,CAAC;KAClE,cAAY,KAAK;eAEhB,KAAK;OALD,EAMI,CACX;IACH,CAAC;IACM;GACU;;AAI1B,SAAS,2BAA2B;CAClC,MAAM,EAAE,MAAM,YAAY,YAAY;AACtC,QACE,oBAAC;EACC,WAAW,GACT,eAAe;GACb,SAAS;GACT,MAAM;GACN,WAAW;GACZ,CAAC,CACH;EACD,eAAe,SAAS,SAAS,CAAC,KAAK;YAEvC,oBAAC;GAAgB,MAAK;aACpB,oBAAC,OAAO;IAEN,YAAY,EAAE,UAAU,IAAK;IAC7B,SAAS;KACP,GAAG;KACH,SAAS;KACV;IACD,SAAS;KACP,GAAG;KACH,SAAS;KACV;IACD,MAAM;KACJ,GAAG;KACH,SAAS;KACV;cAEA,OAAO,oBAAC,UAAQ,GAAG,oBAAC,gBAAc;MAf9B,OAAO,SAAS,SAgBT;IACE;GACX;;AAWb,SAAgB,gBAAgB,EAC9B,MACA,aACA,MACA,MACA,WACA,YAAY,MAAM,GAClB,GAAG,SAOA;AACH,QACE,oBAAC,OAAO;EACN,WAAW,GACT,4QACA,UACD;EACD,GAAI;YAEH,SACC,8CACE,qBAAC;GAAI,WAAU;cACZ,MACD,oBAAC;IAAI,IAAG;IAAmB,WAAU;KAAW;IAC5C,EAEN,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eAAmD;MAAkB;IAEpF,oBAAC;KAAI,WAAU;eACZ;MACG;IAEN,oBAAC;KAAI,WAAU;eACZ;MACG;;IACF,IACL,CACJ;GACU;;AAIjB,SAAgB,uBAAuB,EACrC,UAAU,OACV,WACA,GAAG,SACyD;AAC5D,QACE,oBAAC;EAAsB;YACrB,oBAAC,OAAO;GACN,WAAW,GACT,iGACA,CAAC,WAAW,uBACZ,UACD;GACD,SAAQ;GACR,UAAU;IACR,MAAM,EACJ,SAAS,GACV;IACD,MAAM,EACJ,SAAS,GACV;IACF;GACD,SAAS,UAAU,SAAS;GAC5B,MAAK;GACL,GAAI;IACJ;GACW"}
1
+ {"version":3,"file":"index.js","names":["Sidebar"],"sources":["../../../src/layouts/flux/index.tsx"],"sourcesContent":["'use client';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport type { BaseLayoutProps } from '@/layouts/shared';\nimport { TreeContextProvider } from '@/contexts/tree';\nimport { getSidebarTabs, type GetSidebarTabsOptions } from '@/components/sidebar/tabs';\nimport type { SidebarPageTreeComponents } from '@/components/sidebar/page-tree';\nimport { type ComponentProps, HTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { SidebarViewport, useSidebar } from '@/components/sidebar/base';\nimport { SidebarTabsDropdown, type SidebarTabWithProps } from './tab-dropdown';\nimport { Sidebar, SidebarContent, SidebarLinkItem, SidebarPageTree } from './sidebar';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Languages, SidebarIcon, XIcon } from 'lucide-react';\nimport { renderTitleNav, useLinkItems } from '../shared';\nimport { LanguageToggle } from '../shared/language-toggle';\nimport { SearchToggle } from '../shared/search-toggle';\nimport { ThemeToggle } from '../shared/theme-toggle';\nimport { LinkItem } from '@/utils/link-item';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { RemoveScroll } from 'react-remove-scroll';\nimport { useSearchContext } from '@/contexts/search';\n\nexport interface DocsLayoutProps extends BaseLayoutProps {\n tree: PageTree.Root;\n\n sidebar?: SidebarOptions;\n\n /**\n * Props for the `div` container\n */\n containerProps?: HTMLAttributes<HTMLDivElement>;\n\n renderNavigationPanel?: (props: NavigationPanelProps) => ReactNode;\n}\n\ninterface SidebarOptions\n extends\n ComponentProps<'aside'>,\n Pick<ComponentProps<typeof Sidebar>, 'defaultOpenLevel' | 'prefetch'> {\n enabled?: boolean;\n component?: ReactNode;\n components?: Partial<SidebarPageTreeComponents>;\n\n /**\n * Root Toggle options\n */\n tabs?: SidebarTabWithProps[] | GetSidebarTabsOptions | false;\n\n banner?: ReactNode;\n footer?: ReactNode;\n}\n\nexport function DocsLayout({\n tree,\n nav = {},\n sidebar: {\n enabled: sidebarEnabled = true,\n tabs: sidebarTabs,\n defaultOpenLevel,\n prefetch,\n ...sidebarProps\n } = {},\n searchToggle = {},\n themeSwitch = {},\n i18n = false,\n children,\n containerProps,\n renderNavigationPanel = (props) => <NavigationPanel {...props} />,\n ...props\n}: DocsLayoutProps) {\n const tabs = useMemo(() => {\n if (Array.isArray(sidebarTabs)) {\n return sidebarTabs;\n }\n if (typeof sidebarTabs === 'object') {\n return getSidebarTabs(tree, sidebarTabs);\n }\n if (sidebarTabs !== false) {\n return getSidebarTabs(tree);\n }\n return [];\n }, [tree, sidebarTabs]);\n const { menuItems } = useLinkItems(props);\n const iconLinks = menuItems.filter((item) => item.type === 'icon');\n\n function sidebar() {\n const { footer, banner, component, components, ...rest } = sidebarProps;\n if (component) return component;\n\n return (\n <SidebarContent {...rest}>\n <div className=\"flex flex-col gap-3 p-4 pb-2 empty:hidden\">{banner}</div>\n <SidebarViewport>\n {menuItems\n .filter((v) => v.type !== 'icon')\n .map((item, i, list) => (\n <SidebarLinkItem\n key={i}\n item={item}\n className={cn(i === list.length - 1 && 'mb-4')}\n />\n ))}\n <SidebarPageTree {...components} />\n </SidebarViewport>\n {footer}\n </SidebarContent>\n );\n }\n\n return (\n <TreeContextProvider tree={tree}>\n <Sidebar defaultOpenLevel={defaultOpenLevel} prefetch={prefetch}>\n <div\n id=\"nd-flux-layout\"\n {...containerProps}\n className={cn(\n 'flex flex-col items-center pb-24 overflow-x-clip',\n containerProps?.className,\n )}\n >\n {sidebarEnabled && sidebar()}\n {children}\n </div>\n {renderNavigationPanel({\n head: renderTitleNav(nav, {\n className: 'inline-flex items-center gap-2.5 text-sm font-semibold',\n }),\n tabDropdown: tabs.length > 0 && <SidebarTabsDropdown className=\"flex-1\" options={tabs} />,\n tool: (\n <>\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n </LanguageToggle>\n )}\n\n {searchToggle.enabled !== false &&\n (searchToggle.components?.sm ?? (\n <SearchToggle className=\"rounded-lg\" hideIfDisabled />\n ))}\n\n <NavigationSidebarTrigger />\n {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? (\n <ThemeToggle\n className=\"px-1 py-0 h-full ms-1 rounded-xl bg-fd-muted *:rounded-lg\"\n mode={themeSwitch.mode}\n />\n ))}\n </>\n ),\n link: iconLinks.map((item, i) => (\n <LinkItem\n key={i}\n item={item}\n className={cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }))}\n aria-label={item.label}\n >\n {item.icon}\n </LinkItem>\n )),\n })}\n </Sidebar>\n </TreeContextProvider>\n );\n}\n\nfunction NavigationSidebarTrigger() {\n const { open, setOpen } = useSidebar();\n return (\n <button\n className={cn(\n buttonVariants({\n variant: 'ghost',\n size: 'icon-sm',\n className: 'overflow-hidden',\n }),\n )}\n onClick={() => setOpen((prev) => !prev)}\n >\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={open ? 'open' : 'closed'}\n transition={{ duration: 0.2 }}\n initial={{\n y: '100%',\n opacity: 0,\n }}\n animate={{\n y: 0,\n opacity: 1,\n }}\n exit={{\n y: '100%',\n opacity: 0,\n }}\n >\n {open ? <XIcon /> : <SidebarIcon />}\n </motion.span>\n </AnimatePresence>\n </button>\n );\n}\n\nexport interface NavigationPanelProps {\n head: ReactNode;\n tabDropdown: ReactNode;\n tool: ReactNode;\n link: ReactNode;\n}\n\nexport function NavigationPanel({\n head,\n tabDropdown,\n tool,\n link,\n children = (v) => v,\n ...props\n}: NavigationPanelProps &\n Omit<ComponentProps<typeof motion.div>, 'children'> & {\n /**\n * replace default children\n */\n children?: (defaultChildren: ReactNode) => ReactNode;\n }) {\n const { open } = useSearchContext();\n return (\n <motion.div\n {...props}\n className={cn(\n 'fixed left-1/2 w-[calc(100%-var(--removed-body-scroll-bar-size,0px))] translate-x-[calc(-50%-var(--removed-body-scroll-bar-size,0px)/2)] bottom-0 z-40 bg-fd-popover text-fd-popover-foreground border-t shadow-lg sm:bottom-6 sm:rounded-2xl sm:border sm:max-w-[380px]',\n props.className,\n )}\n animate={\n props.animate ?? {\n scale: open ? 0.9 : 1,\n translateY: open ? 20 : 0,\n opacity: open ? 0.8 : 1,\n }\n }\n >\n {children(\n <>\n <div className=\"flex flex-row items-center ps-2.5 p-1 gap-2 min-h-11\">\n {head}\n <div id=\"flux-layout-slot\" className=\"flex-1\" />\n </div>\n\n <div className=\"flex flex-row gap-1.5 overflow-x-auto overflow-y-hidden p-2 sm:p-1\">\n <div className=\"flex flex-row items-center gap-2 min-w-0 flex-1\">{tabDropdown}</div>\n\n <div className=\"flex flex-row items-center text-fd-muted-foreground border-x px-0.5 empty:hidden\">\n {link}\n </div>\n\n <div className=\"flex flex-row items-center text-fd-muted-foreground empty:hidden\">\n {tool}\n </div>\n </div>\n </>,\n )}\n </motion.div>\n );\n}\n\nexport function NavigationPanelOverlay({\n enabled = false,\n className,\n ...props\n}: ComponentProps<typeof motion.div> & { enabled?: boolean }) {\n return (\n <RemoveScroll enabled={enabled}>\n <motion.div\n className={cn(\n 'fixed inset-0 z-30 pr-(--removed-body-scroll-bar-size,0) backdrop-blur-md bg-fd-background/60',\n !enabled && 'pointer-events-none',\n className,\n )}\n initial=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n animate={enabled ? 'show' : 'hide'}\n exit=\"hide\"\n {...props}\n />\n </RemoveScroll>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.d.ts","names":[],"sources":["../../../src/layouts/flux/sidebar.tsx"],"mappings":";;;;;;;;;iBAoCgB,OAAA,CAAQ,KAAA,EAAO,cAAA,QAAsB,eAAA,IAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI1D,aAAA,CAAc,KAAA,EAAO,cAAA,QAAsB,eAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI9D,sBAAA,CAAuB,KAAA,EAAO,cAAA,QAAsB,wBAAA,IAA4B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIhF,eAAA,CAAgB,KAAA,EAAO,cAAA,QAAsB,iBAAA,IAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIlE,cAAA,CAAe,KAAA,EAAO,cAAA,QAAsB,gBAAA,IAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIhE,cAAA,CAAA;EACd,GAAA,EAAK,OAAA;EACL,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA0EV,gBAAA,CAAA;EAAmB,SAAA;EAAW,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,QAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiB9E,WAAA,CAAA;EACd,SAAA;EACA,KAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,aAAA,IAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiB1B,oBAAA,CAAA;EACd,SAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,sBAAA,IAA0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAuBnC,iBAAA,CAAA;EACd,SAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,mBAAA,IAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiBhC,oBAAA,CAAA;EACd,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,sBAAA,IAA0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAoCtC,eAAA,GAAe,UAAA,EAAA,OAAA,CAO1B,yBAAA,MAP0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cASf,eAAA;EAAe,IAAA;EAAA,GAAA;AAAA,GAAA,KAAA,CAAA,cAAA,CAAA,WAAA;gBAAA,YAAA"}
1
+ {"version":3,"file":"sidebar.d.ts","names":[],"sources":["../../../src/layouts/flux/sidebar.tsx"],"mappings":";;;;;;;;;iBAoCgB,OAAA,CAAQ,KAAA,EAAO,cAAA,QAAsB,eAAA,IAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI1D,aAAA,CAAc,KAAA,EAAO,cAAA,QAAsB,eAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI9D,sBAAA,CAAuB,KAAA,EAAO,cAAA,QAAsB,wBAAA,IAA4B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIhF,eAAA,CAAgB,KAAA,EAAO,cAAA,QAAsB,iBAAA,IAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIlE,cAAA,CAAe,KAAA,EAAO,cAAA,QAAsB,gBAAA,IAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAIhE,cAAA,CAAA;EACd,GAAA,EAAK,OAAA;EACL,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA6EV,gBAAA,CAAA;EAAmB,SAAA;EAAW,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,QAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiB9E,WAAA,CAAA;EACd,SAAA;EACA,KAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,aAAA,IAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiB1B,oBAAA,CAAA;EACd,SAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,sBAAA,IAA0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAuBnC,iBAAA,CAAA;EACd,SAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,mBAAA,IAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAiBhC,oBAAA,CAAA;EACd,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,sBAAA,IAA0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAoCtC,eAAA,GAAe,UAAA,EAAA,OAAA,CAO1B,yBAAA,MAP0B,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cASf,eAAA;EAAe,IAAA;EAAA,GAAA;AAAA,GAAA,KAAA,CAAA,cAAA,CAAA,WAAA;gBAAA,YAAA"}
@@ -5,7 +5,7 @@ import { mergeRefs } from "../../utils/merge-refs.js";
5
5
  import { SidebarCollapseTrigger as SidebarCollapseTrigger$1, SidebarFolder as SidebarFolder$1, SidebarFolderContent as SidebarFolderContent$1, SidebarFolderLink as SidebarFolderLink$1, SidebarFolderTrigger as SidebarFolderTrigger$1, SidebarItem as SidebarItem$1, SidebarProvider, SidebarSeparator as SidebarSeparator$1, SidebarTrigger as SidebarTrigger$1, SidebarViewport as SidebarViewport$1, useFolder, useFolderDepth, useSidebar } from "../../components/sidebar/base.js";
6
6
  import { createLinkItemRenderer } from "../../components/sidebar/link-item.js";
7
7
  import { createPageTreeRenderer } from "../../components/sidebar/page-tree.js";
8
- import { useEffect, useEffectEvent, useRef } from "react";
8
+ import { useEffect, useEffectEvent, useRef, useState } from "react";
9
9
  import { jsx } from "react/jsx-runtime";
10
10
  import { cva } from "class-variance-authority";
11
11
  import { motion } from "motion/react";
@@ -43,6 +43,7 @@ function SidebarTrigger(props) {
43
43
  }
44
44
  function SidebarContent({ ref: refProp, className, children, ...props }) {
45
45
  const ref = useRef(null);
46
+ const [blockScroll, setBlockScroll] = useState(false);
46
47
  const { open, setOpen } = useSidebar();
47
48
  const listener = useEffectEvent((e) => {
48
49
  if (open && e.key === "Escape") {
@@ -56,8 +57,9 @@ function SidebarContent({ ref: refProp, className, children, ...props }) {
56
57
  window.removeEventListener("keydown", listener);
57
58
  };
58
59
  }, []);
60
+ if (open && !blockScroll) setBlockScroll(true);
59
61
  return /* @__PURE__ */ jsx(RemoveScroll, {
60
- enabled: open,
62
+ enabled: blockScroll,
61
63
  children: /* @__PURE__ */ jsx(motion.div, {
62
64
  className: cn("fixed inset-0 py-10 z-30 backdrop-blur-md bg-fd-background/60", !open && "pointer-events-none"),
63
65
  initial: "hide",
@@ -70,8 +72,11 @@ function SidebarContent({ ref: refProp, className, children, ...props }) {
70
72
  onClick: () => {
71
73
  setOpen(false);
72
74
  },
75
+ onAnimationComplete: (definition) => {
76
+ if (definition === "hide") setBlockScroll(false);
77
+ },
73
78
  children: /* @__PURE__ */ jsx(motion.div, {
74
- className: "absolute overflow-y-auto pr-(--removed-body-scroll-bar-size,0) [scrollbar-width:none] py-16 inset-0 bottom-26 overscroll-contain mask-[linear-gradient(to_bottom,transparent,white_calc(var(--spacing)*14),white_calc(100%-var(--spacing)*14),transparent)] lg:text-sm",
79
+ className: "absolute top-0 min-h-0 inset-x-0 bottom-26 overflow-y-auto fd-scroll-container pr-(--removed-body-scroll-bar-size,0) py-16 mask-[linear-gradient(to_bottom,transparent,white_--spacing(14),white_calc(100%---spacing(14)),transparent)] lg:text-sm",
75
80
  variants: {
76
81
  show: {
77
82
  y: 0,
@@ -83,14 +88,13 @@ function SidebarContent({ ref: refProp, className, children, ...props }) {
83
88
  }
84
89
  },
85
90
  transition: {
86
- duration: .3,
91
+ duration: .4,
87
92
  ease: [
88
93
  .16,
89
94
  1,
90
95
  .3,
91
96
  1
92
- ],
93
- opacity: { duration: .1 }
97
+ ]
94
98
  },
95
99
  children: /* @__PURE__ */ jsx(motion.aside, {
96
100
  id: "nd-sidebar",
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.js","names":["Base.SidebarItem","Base.SidebarFolderTrigger","Base.SidebarFolderLink","Base.SidebarFolderContent","Base.SidebarProvider","Base.SidebarFolder","Base.SidebarCollapseTrigger","Base.SidebarViewport","Base.SidebarTrigger","Base.useSidebar","Base.useFolderDepth","Base.SidebarSeparator","Base.useFolder"],"sources":["../../../src/layouts/flux/sidebar.tsx"],"sourcesContent":["'use client';\nimport * as Base from '@/components/sidebar/base';\nimport { cn } from '@/utils/cn';\nimport { type ComponentProps, useEffect, useEffectEvent, useRef } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { createPageTreeRenderer } from '@/components/sidebar/page-tree';\nimport { createLinkItemRenderer } from '@/components/sidebar/link-item';\nimport { mergeRefs } from '@/utils/merge-refs';\nimport { motion } from 'motion/react';\nimport { RemoveScroll } from 'react-remove-scroll';\n\nconst MotionSidebarItem = motion.create(Base.SidebarItem);\nconst MotionSidebarFolderTrigger = motion.create(Base.SidebarFolderTrigger);\nconst MotionSidebarFolderLink = motion.create(Base.SidebarFolderLink);\nconst MotionSidebarFolderContent = motion.create(Base.SidebarFolderContent);\n\nconst itemVariants = cva(\n 'relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n link: 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors',\n button:\n 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none',\n },\n highlight: {\n true: \"data-[active=true]:before:content-[''] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5\",\n },\n },\n },\n);\n\nfunction getItemOffset(depth: number) {\n return `calc(${2 + 3 * depth} * var(--spacing))`;\n}\n\nexport function Sidebar(props: ComponentProps<typeof Base.SidebarProvider>) {\n return <Base.SidebarProvider {...props} />;\n}\n\nexport function SidebarFolder(props: ComponentProps<typeof Base.SidebarFolder>) {\n return <Base.SidebarFolder {...props} />;\n}\n\nexport function SidebarCollapseTrigger(props: ComponentProps<typeof Base.SidebarCollapseTrigger>) {\n return <Base.SidebarCollapseTrigger {...props} />;\n}\n\nexport function SidebarViewport(props: ComponentProps<typeof Base.SidebarViewport>) {\n return <Base.SidebarViewport {...props} />;\n}\n\nexport function SidebarTrigger(props: ComponentProps<typeof Base.SidebarTrigger>) {\n return <Base.SidebarTrigger {...props} />;\n}\n\nexport function SidebarContent({\n ref: refProp,\n className,\n children,\n ...props\n}: ComponentProps<'aside'>) {\n const ref = useRef<HTMLElement>(null);\n const { open, setOpen } = Base.useSidebar();\n\n const listener = useEffectEvent((e: KeyboardEvent) => {\n if (open && e.key === 'Escape') {\n setOpen(false);\n e.preventDefault();\n }\n });\n useEffect(() => {\n window.addEventListener('keydown', listener);\n return () => {\n window.removeEventListener('keydown', listener);\n };\n }, []);\n\n return (\n <RemoveScroll enabled={open}>\n <motion.div\n className={cn(\n 'fixed inset-0 py-10 z-30 backdrop-blur-md bg-fd-background/60',\n !open && 'pointer-events-none',\n )}\n initial=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n animate={open ? 'show' : 'hide'}\n exit=\"hide\"\n onClick={() => {\n setOpen(false);\n }}\n >\n <motion.div\n className=\"absolute overflow-y-auto pr-(--removed-body-scroll-bar-size,0) [scrollbar-width:none] py-16 inset-0 bottom-26 overscroll-contain mask-[linear-gradient(to_bottom,transparent,white_calc(var(--spacing)*14),white_calc(100%-var(--spacing)*14),transparent)] lg:text-sm\"\n variants={{\n show: {\n y: 0,\n opacity: 1,\n },\n hide: {\n y: '80%',\n opacity: 0,\n },\n }}\n transition={{\n duration: 0.3,\n ease: [0.16, 1, 0.3, 1],\n opacity: {\n duration: 0.1,\n },\n }}\n >\n <motion.aside\n id=\"nd-sidebar\"\n ref={mergeRefs(ref, refProp)}\n className={cn('mx-auto sm:max-w-[400px]', className)}\n onClick={(e) => e.stopPropagation()}\n {...(props as ComponentProps<typeof motion.aside>)}\n >\n {children}\n </motion.aside>\n </motion.div>\n </motion.div>\n </RemoveScroll>\n );\n}\n\nexport function SidebarSeparator({ className, style, children, ...props }: ComponentProps<'p'>) {\n const depth = Base.useFolderDepth();\n\n return (\n <Base.SidebarSeparator\n className={cn('[&_svg]:size-4 [&_svg]:shrink-0', className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...props}\n >\n {children}\n </Base.SidebarSeparator>\n );\n}\n\nexport function SidebarItem({\n className,\n style,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarItem>) {\n const depth = Base.useFolderDepth();\n\n return (\n <MotionSidebarItem\n className={cn(itemVariants({ variant: 'link', highlight: depth >= 1 }), className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...(props as object)}\n >\n {children}\n </MotionSidebarItem>\n );\n}\n\nexport function SidebarFolderTrigger({\n className,\n style,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderTrigger>) {\n const { depth, collapsible } = Base.useFolder()!;\n\n return (\n <MotionSidebarFolderTrigger\n className={(s) =>\n cn(\n itemVariants({ variant: collapsible ? 'button' : null }),\n 'w-full',\n typeof className === 'function' ? className(s) : className,\n )\n }\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...(props as ComponentProps<typeof MotionSidebarFolderTrigger>)}\n >\n {props.children}\n </MotionSidebarFolderTrigger>\n );\n}\n\nexport function SidebarFolderLink({\n className,\n style,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderLink>) {\n const depth = Base.useFolderDepth();\n\n return (\n <MotionSidebarFolderLink\n className={cn(itemVariants({ variant: 'link', highlight: depth > 1 }), 'w-full', className)}\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...(props as ComponentProps<typeof MotionSidebarFolderLink>)}\n >\n {props.children}\n </MotionSidebarFolderLink>\n );\n}\n\nexport function SidebarFolderContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderContent>) {\n const depth = Base.useFolderDepth();\n const { open } = Base.useFolder()!;\n\n return (\n <MotionSidebarFolderContent\n className={(s) =>\n cn(\n 'relative',\n depth === 1 &&\n \"before:content-[''] before:absolute before:w-px before:inset-y-1 before:bg-fd-border before:start-2.5\",\n\n typeof className === 'function' ? className(s) : className,\n )\n }\n {...(props as ComponentProps<typeof MotionSidebarFolderContent>)}\n >\n <motion.div\n initial=\"hide\"\n animate={open ? 'show' : 'hide'}\n exit=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n >\n {children}\n </motion.div>\n </MotionSidebarFolderContent>\n );\n}\n\nexport const SidebarPageTree = createPageTreeRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarSeparator,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n});\n\nexport const SidebarLinkItem = createLinkItemRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebar.js","names":["Base.SidebarItem","Base.SidebarFolderTrigger","Base.SidebarFolderLink","Base.SidebarFolderContent","Base.SidebarProvider","Base.SidebarFolder","Base.SidebarCollapseTrigger","Base.SidebarViewport","Base.SidebarTrigger","Base.useSidebar","Base.useFolderDepth","Base.SidebarSeparator","Base.useFolder"],"sources":["../../../src/layouts/flux/sidebar.tsx"],"sourcesContent":["'use client';\nimport * as Base from '@/components/sidebar/base';\nimport { cn } from '@/utils/cn';\nimport { type ComponentProps, useEffect, useEffectEvent, useRef, useState } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { createPageTreeRenderer } from '@/components/sidebar/page-tree';\nimport { createLinkItemRenderer } from '@/components/sidebar/link-item';\nimport { mergeRefs } from '@/utils/merge-refs';\nimport { motion } from 'motion/react';\nimport { RemoveScroll } from 'react-remove-scroll';\n\nconst MotionSidebarItem = motion.create(Base.SidebarItem);\nconst MotionSidebarFolderTrigger = motion.create(Base.SidebarFolderTrigger);\nconst MotionSidebarFolderLink = motion.create(Base.SidebarFolderLink);\nconst MotionSidebarFolderContent = motion.create(Base.SidebarFolderContent);\n\nconst itemVariants = cva(\n 'relative flex flex-row items-center gap-2 rounded-lg p-2 text-start text-fd-muted-foreground wrap-anywhere [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n link: 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none data-[active=true]:bg-fd-primary/10 data-[active=true]:text-fd-primary data-[active=true]:hover:transition-colors',\n button:\n 'transition-colors hover:bg-fd-accent/50 hover:text-fd-accent-foreground/80 hover:transition-none',\n },\n highlight: {\n true: \"data-[active=true]:before:content-[''] data-[active=true]:before:bg-fd-primary data-[active=true]:before:absolute data-[active=true]:before:w-px data-[active=true]:before:inset-y-2.5 data-[active=true]:before:start-2.5\",\n },\n },\n },\n);\n\nfunction getItemOffset(depth: number) {\n return `calc(${2 + 3 * depth} * var(--spacing))`;\n}\n\nexport function Sidebar(props: ComponentProps<typeof Base.SidebarProvider>) {\n return <Base.SidebarProvider {...props} />;\n}\n\nexport function SidebarFolder(props: ComponentProps<typeof Base.SidebarFolder>) {\n return <Base.SidebarFolder {...props} />;\n}\n\nexport function SidebarCollapseTrigger(props: ComponentProps<typeof Base.SidebarCollapseTrigger>) {\n return <Base.SidebarCollapseTrigger {...props} />;\n}\n\nexport function SidebarViewport(props: ComponentProps<typeof Base.SidebarViewport>) {\n return <Base.SidebarViewport {...props} />;\n}\n\nexport function SidebarTrigger(props: ComponentProps<typeof Base.SidebarTrigger>) {\n return <Base.SidebarTrigger {...props} />;\n}\n\nexport function SidebarContent({\n ref: refProp,\n className,\n children,\n ...props\n}: ComponentProps<'aside'>) {\n const ref = useRef<HTMLElement>(null);\n const [blockScroll, setBlockScroll] = useState(false);\n const { open, setOpen } = Base.useSidebar();\n\n const listener = useEffectEvent((e: KeyboardEvent) => {\n if (open && e.key === 'Escape') {\n setOpen(false);\n e.preventDefault();\n }\n });\n useEffect(() => {\n window.addEventListener('keydown', listener);\n return () => {\n window.removeEventListener('keydown', listener);\n };\n }, []);\n\n if (open && !blockScroll) setBlockScroll(true);\n\n return (\n <RemoveScroll enabled={blockScroll}>\n <motion.div\n className={cn(\n 'fixed inset-0 py-10 z-30 backdrop-blur-md bg-fd-background/60',\n !open && 'pointer-events-none',\n )}\n initial=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n animate={open ? 'show' : 'hide'}\n exit=\"hide\"\n onClick={() => {\n setOpen(false);\n }}\n onAnimationComplete={(definition) => {\n if (definition === 'hide') setBlockScroll(false);\n }}\n >\n <motion.div\n className=\"absolute top-0 min-h-0 inset-x-0 bottom-26 overflow-y-auto fd-scroll-container pr-(--removed-body-scroll-bar-size,0) py-16 mask-[linear-gradient(to_bottom,transparent,white_--spacing(14),white_calc(100%---spacing(14)),transparent)] lg:text-sm\"\n variants={{\n show: {\n y: 0,\n opacity: 1,\n },\n hide: {\n y: '80%',\n opacity: 0,\n },\n }}\n transition={{\n duration: 0.4,\n ease: [0.16, 1, 0.3, 1],\n }}\n >\n <motion.aside\n id=\"nd-sidebar\"\n ref={mergeRefs(ref, refProp)}\n className={cn('mx-auto sm:max-w-[400px]', className)}\n onClick={(e) => e.stopPropagation()}\n {...(props as ComponentProps<typeof motion.aside>)}\n >\n {children}\n </motion.aside>\n </motion.div>\n </motion.div>\n </RemoveScroll>\n );\n}\n\nexport function SidebarSeparator({ className, style, children, ...props }: ComponentProps<'p'>) {\n const depth = Base.useFolderDepth();\n\n return (\n <Base.SidebarSeparator\n className={cn('[&_svg]:size-4 [&_svg]:shrink-0', className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...props}\n >\n {children}\n </Base.SidebarSeparator>\n );\n}\n\nexport function SidebarItem({\n className,\n style,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarItem>) {\n const depth = Base.useFolderDepth();\n\n return (\n <MotionSidebarItem\n className={cn(itemVariants({ variant: 'link', highlight: depth >= 1 }), className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...(props as object)}\n >\n {children}\n </MotionSidebarItem>\n );\n}\n\nexport function SidebarFolderTrigger({\n className,\n style,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderTrigger>) {\n const { depth, collapsible } = Base.useFolder()!;\n\n return (\n <MotionSidebarFolderTrigger\n className={(s) =>\n cn(\n itemVariants({ variant: collapsible ? 'button' : null }),\n 'w-full',\n typeof className === 'function' ? className(s) : className,\n )\n }\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...(props as ComponentProps<typeof MotionSidebarFolderTrigger>)}\n >\n {props.children}\n </MotionSidebarFolderTrigger>\n );\n}\n\nexport function SidebarFolderLink({\n className,\n style,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderLink>) {\n const depth = Base.useFolderDepth();\n\n return (\n <MotionSidebarFolderLink\n className={cn(itemVariants({ variant: 'link', highlight: depth > 1 }), 'w-full', className)}\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...(props as ComponentProps<typeof MotionSidebarFolderLink>)}\n >\n {props.children}\n </MotionSidebarFolderLink>\n );\n}\n\nexport function SidebarFolderContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderContent>) {\n const depth = Base.useFolderDepth();\n const { open } = Base.useFolder()!;\n\n return (\n <MotionSidebarFolderContent\n className={(s) =>\n cn(\n 'relative',\n depth === 1 &&\n \"before:content-[''] before:absolute before:w-px before:inset-y-1 before:bg-fd-border before:start-2.5\",\n\n typeof className === 'function' ? className(s) : className,\n )\n }\n {...(props as ComponentProps<typeof MotionSidebarFolderContent>)}\n >\n <motion.div\n initial=\"hide\"\n animate={open ? 'show' : 'hide'}\n exit=\"hide\"\n variants={{\n show: {\n opacity: 1,\n },\n hide: {\n opacity: 0,\n },\n }}\n >\n {children}\n </motion.div>\n </MotionSidebarFolderContent>\n );\n}\n\nexport const SidebarPageTree = createPageTreeRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarSeparator,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n});\n\nexport const SidebarLinkItem = createLinkItemRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n});\n"],"mappings":"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"}
@@ -40,7 +40,7 @@ function SidebarTabsDropdown({ options, placeholder, className, ...props }) {
40
40
  children: [/* @__PURE__ */ jsx(AnimatePresence, {
41
41
  mode: "popLayout",
42
42
  children: /* @__PURE__ */ jsx(motion.span, {
43
- className: "flex w-full items-center text-nowrap gap-1.5",
43
+ className: "flex w-full min-w-0 overflow-hidden items-center text-nowrap gap-1.5",
44
44
  initial: {
45
45
  opacity: 0,
46
46
  y: "100%"
@@ -1 +1 @@
1
- {"version":3,"file":"tab-dropdown.js","names":[],"sources":["../../../src/layouts/flux/tab-dropdown.tsx"],"sourcesContent":["'use client';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport { type ComponentProps, type ReactNode, useMemo, useState } from 'react';\nimport Link from 'fumadocs-core/link';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { cn } from '@/utils/cn';\nimport { isActive, normalize } from '@/utils/urls';\nimport { useSidebar } from '@/components/sidebar/base';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport type { SidebarTab } from '@/components/sidebar/tabs';\nimport { AnimatePresence, motion } from 'motion/react';\n\nexport interface SidebarTabWithProps extends SidebarTab {\n props?: ComponentProps<'a'>;\n}\n\nexport function SidebarTabsDropdown({\n options,\n placeholder,\n className,\n ...props\n}: {\n placeholder?: ReactNode;\n options: SidebarTabWithProps[];\n} & ComponentProps<'button'>) {\n const [open, setOpen] = useState(false);\n const { closeOnRedirect } = useSidebar();\n const pathname = usePathname();\n const selectedIdx = useMemo(() => {\n return options.findLastIndex((item) => isTabActive(item, pathname));\n }, [options, pathname]);\n const selected = selectedIdx !== -1 ? options[selectedIdx] : undefined;\n\n const onClick = () => {\n closeOnRedirect.current = false;\n setOpen(false);\n };\n\n const item = selected ? (\n <>\n <div className=\"size-4.5 shrink-0 empty:hidden\">{selected.icon}</div>\n <p className=\"font-medium\">{selected.title}</p>\n </>\n ) : (\n placeholder\n );\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n {item && (\n <PopoverTrigger\n className={cn(\n 'flex items-center gap-2 rounded-full p-1.5 border shadow-sm text-sm text-start transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground data-open:bg-fd-accent data-open:text-fd-accent-foreground',\n className,\n )}\n {...props}\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.span\n key={selectedIdx}\n className=\"flex w-full items-center text-nowrap gap-1.5\"\n initial={{\n opacity: 0,\n y: '100%',\n }}\n animate={{\n opacity: 1,\n y: 0,\n }}\n exit={{\n opacity: 0,\n y: '-100%',\n }}\n >\n {item}\n </motion.span>\n </AnimatePresence>\n <ChevronsUpDown className=\"shrink-0 ms-auto size-4 text-fd-muted-foreground\" />\n </PopoverTrigger>\n )}\n <PopoverContent\n align=\"start\"\n className=\"flex flex-col gap-1 max-w-svw p-1 fd-scroll-container\"\n >\n {options.map((item, i) => {\n const isActive = i === selectedIdx;\n if (!isActive && item.unlisted) return;\n\n return (\n <Link\n key={item.url}\n href={item.url}\n onClick={onClick}\n {...item.props}\n className={cn(\n 'flex items-center gap-1.5 rounded-lg p-1.5 hover:bg-fd-accent hover:text-fd-accent-foreground',\n item.props?.className,\n )}\n >\n <div className=\"shrink-0 mb-auto size-4.5 empty:hidden\">{item.icon}</div>\n <div>\n <p className=\"text-sm font-medium leading-none\">{item.title}</p>\n <p className=\"text-[0.8125rem] text-fd-muted-foreground mt-1 empty:hidden\">\n {item.description}\n </p>\n </div>\n\n <Check\n className={cn(\n 'shrink-0 ms-auto size-3.5 text-fd-primary',\n !isActive && 'invisible',\n )}\n />\n </Link>\n );\n })}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function isTabActive(tab: SidebarTab, pathname: string) {\n if (tab.urls) return tab.urls.has(normalize(pathname));\n\n return isActive(tab.url, pathname, true);\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,oBAAoB,EAClC,SACA,aACA,WACA,GAAG,SAIyB;CAC5B,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,EAAE,oBAAoB,YAAY;CACxC,MAAM,WAAW,aAAa;CAC9B,MAAM,cAAc,cAAc;AAChC,SAAO,QAAQ,eAAe,SAAS,YAAY,MAAM,SAAS,CAAC;IAClE,CAAC,SAAS,SAAS,CAAC;CACvB,MAAM,WAAW,gBAAgB,KAAK,QAAQ,eAAe;CAE7D,MAAM,gBAAgB;AACpB,kBAAgB,UAAU;AAC1B,UAAQ,MAAM;;CAGhB,MAAM,OAAO,WACX,8CACE,oBAAC;EAAI,WAAU;YAAkC,SAAS;GAAW,EACrE,oBAAC;EAAE,WAAU;YAAe,SAAS;GAAU,IAC9C,GAEH;AAGF,QACE,qBAAC;EAAc;EAAM,cAAc;aAChC,QACC,qBAAC;GACC,WAAW,GACT,kNACA,UACD;GACD,GAAI;cAEJ,oBAAC;IAAgB,MAAK;cACpB,oBAAC,OAAO;KAEN,WAAU;KACV,SAAS;MACP,SAAS;MACT,GAAG;MACJ;KACD,SAAS;MACP,SAAS;MACT,GAAG;MACJ;KACD,MAAM;MACJ,SAAS;MACT,GAAG;MACJ;eAEA;OAfI,YAgBO;KACE,EAClB,oBAAC,kBAAe,WAAU,qDAAqD;IAChE,EAEnB,oBAAC;GACC,OAAM;GACN,WAAU;aAET,QAAQ,KAAK,MAAM,MAAM;IACxB,MAAM,WAAW,MAAM;AACvB,QAAI,CAAC,YAAY,KAAK,SAAU;AAEhC,WACE,qBAAC;KAEC,MAAM,KAAK;KACF;KACT,GAAI,KAAK;KACT,WAAW,GACT,iGACA,KAAK,OAAO,UACb;;MAED,oBAAC;OAAI,WAAU;iBAA0C,KAAK;QAAW;MACzE,qBAAC,oBACC,oBAAC;OAAE,WAAU;iBAAoC,KAAK;QAAU,EAChE,oBAAC;OAAE,WAAU;iBACV,KAAK;QACJ,IACA;MAEN,oBAAC,SACC,WAAW,GACT,6CACA,CAAC,YAAY,YACd,GACD;;OAtBG,KAAK,IAuBL;KAET;IACa;GACT;;AAId,SAAgB,YAAY,KAAiB,UAAkB;AAC7D,KAAI,IAAI,KAAM,QAAO,IAAI,KAAK,IAAI,UAAU,SAAS,CAAC;AAEtD,QAAO,SAAS,IAAI,KAAK,UAAU,KAAK"}
1
+ {"version":3,"file":"tab-dropdown.js","names":[],"sources":["../../../src/layouts/flux/tab-dropdown.tsx"],"sourcesContent":["'use client';\nimport { Check, ChevronsUpDown } from 'lucide-react';\nimport { type ComponentProps, type ReactNode, useMemo, useState } from 'react';\nimport Link from 'fumadocs-core/link';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { cn } from '@/utils/cn';\nimport { isActive, normalize } from '@/utils/urls';\nimport { useSidebar } from '@/components/sidebar/base';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport type { SidebarTab } from '@/components/sidebar/tabs';\nimport { AnimatePresence, motion } from 'motion/react';\n\nexport interface SidebarTabWithProps extends SidebarTab {\n props?: ComponentProps<'a'>;\n}\n\nexport function SidebarTabsDropdown({\n options,\n placeholder,\n className,\n ...props\n}: {\n placeholder?: ReactNode;\n options: SidebarTabWithProps[];\n} & ComponentProps<'button'>) {\n const [open, setOpen] = useState(false);\n const { closeOnRedirect } = useSidebar();\n const pathname = usePathname();\n const selectedIdx = useMemo(() => {\n return options.findLastIndex((item) => isTabActive(item, pathname));\n }, [options, pathname]);\n const selected = selectedIdx !== -1 ? options[selectedIdx] : undefined;\n\n const onClick = () => {\n closeOnRedirect.current = false;\n setOpen(false);\n };\n\n const item = selected ? (\n <>\n <div className=\"size-4.5 shrink-0 empty:hidden\">{selected.icon}</div>\n <p className=\"font-medium\">{selected.title}</p>\n </>\n ) : (\n placeholder\n );\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n {item && (\n <PopoverTrigger\n className={cn(\n 'flex items-center gap-2 rounded-full p-1.5 border shadow-sm text-sm text-start transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground data-open:bg-fd-accent data-open:text-fd-accent-foreground',\n className,\n )}\n {...props}\n >\n <AnimatePresence mode=\"popLayout\">\n <motion.span\n key={selectedIdx}\n className=\"flex w-full min-w-0 overflow-hidden items-center text-nowrap gap-1.5\"\n initial={{\n opacity: 0,\n y: '100%',\n }}\n animate={{\n opacity: 1,\n y: 0,\n }}\n exit={{\n opacity: 0,\n y: '-100%',\n }}\n >\n {item}\n </motion.span>\n </AnimatePresence>\n <ChevronsUpDown className=\"shrink-0 ms-auto size-4 text-fd-muted-foreground\" />\n </PopoverTrigger>\n )}\n <PopoverContent\n align=\"start\"\n className=\"flex flex-col gap-1 max-w-svw p-1 fd-scroll-container\"\n >\n {options.map((item, i) => {\n const isActive = i === selectedIdx;\n if (!isActive && item.unlisted) return;\n\n return (\n <Link\n key={item.url}\n href={item.url}\n onClick={onClick}\n {...item.props}\n className={cn(\n 'flex items-center gap-1.5 rounded-lg p-1.5 hover:bg-fd-accent hover:text-fd-accent-foreground',\n item.props?.className,\n )}\n >\n <div className=\"shrink-0 mb-auto size-4.5 empty:hidden\">{item.icon}</div>\n <div>\n <p className=\"text-sm font-medium leading-none\">{item.title}</p>\n <p className=\"text-[0.8125rem] text-fd-muted-foreground mt-1 empty:hidden\">\n {item.description}\n </p>\n </div>\n\n <Check\n className={cn(\n 'shrink-0 ms-auto size-3.5 text-fd-primary',\n !isActive && 'invisible',\n )}\n />\n </Link>\n );\n })}\n </PopoverContent>\n </Popover>\n );\n}\n\nexport function isTabActive(tab: SidebarTab, pathname: string) {\n if (tab.urls) return tab.urls.has(normalize(pathname));\n\n return isActive(tab.url, pathname, true);\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,oBAAoB,EAClC,SACA,aACA,WACA,GAAG,SAIyB;CAC5B,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,EAAE,oBAAoB,YAAY;CACxC,MAAM,WAAW,aAAa;CAC9B,MAAM,cAAc,cAAc;AAChC,SAAO,QAAQ,eAAe,SAAS,YAAY,MAAM,SAAS,CAAC;IAClE,CAAC,SAAS,SAAS,CAAC;CACvB,MAAM,WAAW,gBAAgB,KAAK,QAAQ,eAAe;CAE7D,MAAM,gBAAgB;AACpB,kBAAgB,UAAU;AAC1B,UAAQ,MAAM;;CAGhB,MAAM,OAAO,WACX,8CACE,oBAAC;EAAI,WAAU;YAAkC,SAAS;GAAW,EACrE,oBAAC;EAAE,WAAU;YAAe,SAAS;GAAU,IAC9C,GAEH;AAGF,QACE,qBAAC;EAAc;EAAM,cAAc;aAChC,QACC,qBAAC;GACC,WAAW,GACT,kNACA,UACD;GACD,GAAI;cAEJ,oBAAC;IAAgB,MAAK;cACpB,oBAAC,OAAO;KAEN,WAAU;KACV,SAAS;MACP,SAAS;MACT,GAAG;MACJ;KACD,SAAS;MACP,SAAS;MACT,GAAG;MACJ;KACD,MAAM;MACJ,SAAS;MACT,GAAG;MACJ;eAEA;OAfI,YAgBO;KACE,EAClB,oBAAC,kBAAe,WAAU,qDAAqD;IAChE,EAEnB,oBAAC;GACC,OAAM;GACN,WAAU;aAET,QAAQ,KAAK,MAAM,MAAM;IACxB,MAAM,WAAW,MAAM;AACvB,QAAI,CAAC,YAAY,KAAK,SAAU;AAEhC,WACE,qBAAC;KAEC,MAAM,KAAK;KACF;KACT,GAAI,KAAK;KACT,WAAW,GACT,iGACA,KAAK,OAAO,UACb;;MAED,oBAAC;OAAI,WAAU;iBAA0C,KAAK;QAAW;MACzE,qBAAC,oBACC,oBAAC;OAAE,WAAU;iBAAoC,KAAK;QAAU,EAChE,oBAAC;OAAE,WAAU;iBACV,KAAK;QACJ,IACA;MAEN,oBAAC,SACC,WAAW,GACT,6CACA,CAAC,YAAY,YACd,GACD;;OAtBG,KAAK,IAuBL;KAET;IACa;GACT;;AAId,SAAgB,YAAY,KAAiB,UAAkB;AAC7D,KAAI,IAAI,KAAM,QAAO,IAAI,KAAK,IAAI,UAAU,SAAS,CAAC;AAEtD,QAAO,SAAS,IAAI,KAAK,UAAU,KAAK"}
@@ -4,7 +4,7 @@ import * as class_variance_authority_types0 from "class-variance-authority/types
4
4
 
5
5
  //#region src/layouts/home/client.d.ts
6
6
  declare const navItemVariants: (props?: ({
7
- variant?: "button" | "main" | "icon" | null | undefined;
7
+ variant?: "icon" | "main" | "button" | null | undefined;
8
8
  } & class_variance_authority_types0.ClassProp) | undefined) => string;
9
9
  declare function Header({
10
10
  nav,
@@ -41,7 +41,7 @@ declare function NavbarLinkItem({
41
41
  ...props
42
42
  }: {
43
43
  item: LinkItemType;
44
- } & HTMLAttributes<HTMLElement>): string | number | bigint | boolean | react_jsx_runtime0.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
44
+ } & HTMLAttributes<HTMLElement>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime0.JSX.Element | null | undefined;
45
45
  //#endregion
46
46
  export { LayoutBody, LayoutContext, LayoutContextProvider, LayoutHeader, LayoutHeaderTabs, LayoutInfo, NavbarLinkItem };
47
47
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/layouts/notebook/client.tsx"],"mappings":";;;;;;;cAuBa,aAAA,EAAa,KAAA,CAAA,OAAA,EAAA,UAAA;;;UAOT,UAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,qBAAA,CAAA;EACd,kBAAA;EACA,OAAA;EACA,OAAA;EACA;AAAA,GACC,UAAA;EACD,kBAAA;EACA,QAAA,EAAU,SAAA;AAAA,IACX,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoBe,YAAA,CAAa,KAAA,EAAO,cAAA,aAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAW5C,UAAA,CAAA;EAAa,SAAA;EAAW,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqC1E,gBAAA,CAAA;EACd,OAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA;EACD,OAAA,EAAS,mBAAA;AAAA,IACV,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAgCe,cAAA,CAAA;EACd,IAAA;EACA,SAAA;EAAA,GACG;AAAA;EACA,IAAA,EAAM,YAAA;AAAA,IAAiB,cAAA,CAAe,WAAA,yCAAY,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/layouts/notebook/client.tsx"],"mappings":";;;;;;;cAuBa,aAAA,EAAa,KAAA,CAAA,OAAA,EAAA,UAAA;;;UAOT,UAAA;EACf,OAAA;EACA,OAAA;AAAA;AAAA,iBAGc,qBAAA,CAAA;EACd,kBAAA;EACA,OAAA;EACA,OAAA;EACA;AAAA,GACC,UAAA;EACD,kBAAA;EACA,QAAA,EAAU,SAAA;AAAA,IACX,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoBe,YAAA,CAAa,KAAA,EAAO,cAAA,aAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAW5C,UAAA,CAAA;EAAa,SAAA;EAAW,KAAA;EAAO,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqC1E,gBAAA,CAAA;EACd,OAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA;EACD,OAAA,EAAS,mBAAA;AAAA,IACV,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAgCe,cAAA,CAAA;EACd,IAAA;EACA,SAAA;EAAA,GACG;AAAA;EACA,IAAA,EAAM,YAAA;AAAA,IAAiB,cAAA,CAAe,WAAA,yCAAY,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA,wBAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -62,7 +62,7 @@ declare function resolveLinkItems({
62
62
  declare function renderTitleNav({
63
63
  title,
64
64
  url
65
- }: Partial<NavOptions>, props: ComponentProps<'a'>): string | number | bigint | boolean | react_jsx_runtime0.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
65
+ }: Partial<NavOptions>, props: ComponentProps<'a'>): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime0.JSX.Element | null | undefined;
66
66
  declare function useLinkItems({
67
67
  githubUrl,
68
68
  links
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/layouts/shared/index.tsx"],"mappings":";;;;;;;UAKiB,UAAA;EACf,OAAA;EACA,SAAA,EAAW,SAAA;EAEX,KAAA,GAAQ,SAAA,KAAc,KAAA,EAAO,cAAA,UAAwB,SAAA;EAJtC;;;;EAUf,GAAA;EAN6B;;;;;EAa7B,eAAA;EAEA,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,eAAA;EACf,WAAA;IACE,OAAA;IACA,SAAA,GAAY,SAAA;IACZ,IAAA;EAAA;EAGF,YAAA,GAAe,OAAA;IACb,OAAA;IACA,UAAA,EAAY,OAAA;MACV,EAAA,EAAI,SAAA;MACJ,EAAA,EAAI,SAAA;IAAA;EAAA;;;;;;EASR,IAAA,aAAiB,UAAA;EAAA;;;EAKjB,SAAA;EAEA,KAAA,GAAQ,YAAA;EAMY;;;EAFpB,GAAA,GAAM,OAAA,CAAQ,UAAA;EAEd,QAAA,GAAW,SAAA;AAAA;;;;iBAMG,gBAAA,CAAA;EACd,KAAA;EACA;AAAA,GACC,IAAA,CAAK,eAAA,2BAA0C,YAAA;AAAA,iBAoBlC,cAAA,CAAA;EACZ,KAAA;EAAO;AAAA,GAAa,OAAA,CAAQ,UAAA,GAC9B,KAAA,EAAO,cAAA,6CAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA;AAAA,iBAUZ,YAAA,CAAA;EAAe,SAAA;EAAW;AAAA,GAAS,IAAA,CAAK,eAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/layouts/shared/index.tsx"],"mappings":";;;;;;;UAKiB,UAAA;EACf,OAAA;EACA,SAAA,EAAW,SAAA;EAEX,KAAA,GAAQ,SAAA,KAAc,KAAA,EAAO,cAAA,UAAwB,SAAA;EAJtC;;;;EAUf,GAAA;EAN6B;;;;;EAa7B,eAAA;EAEA,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,eAAA;EACf,WAAA;IACE,OAAA;IACA,SAAA,GAAY,SAAA;IACZ,IAAA;EAAA;EAGF,YAAA,GAAe,OAAA;IACb,OAAA;IACA,UAAA,EAAY,OAAA;MACV,EAAA,EAAI,SAAA;MACJ,EAAA,EAAI,SAAA;IAAA;EAAA;;;;;;EASR,IAAA,aAAiB,UAAA;EAAA;;;EAKjB,SAAA;EAEA,KAAA,GAAQ,YAAA;EAMY;;;EAFpB,GAAA,GAAM,OAAA,CAAQ,UAAA;EAEd,QAAA,GAAW,SAAA;AAAA;;;;iBAMG,gBAAA,CAAA;EACd,KAAA;EACA;AAAA,GACC,IAAA,CAAK,eAAA,2BAA0C,YAAA;AAAA,iBAoBlC,cAAA,CAAA;EACZ,KAAA;EAAO;AAAA,GAAa,OAAA,CAAQ,UAAA,GAC9B,KAAA,EAAO,cAAA,6CAAmB,QAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,KAAA,CAAA,WAAA,GAAA,KAAA,CAAA,YAAA,mBAAA,KAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,SAAA,wBAAA,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAUZ,YAAA,CAAA;EAAe,SAAA;EAAW;AAAA,GAAS,IAAA,CAAK,eAAA"}
package/dist/style.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -281,6 +281,9 @@
281
281
  .inset-0 {
282
282
  inset: calc(var(--spacing) * 0);
283
283
  }
284
+ .inset-x-0 {
285
+ inset-inline: calc(var(--spacing) * 0);
286
+ }
284
287
  .inset-x-2 {
285
288
  inset-inline: calc(var(--spacing) * 2);
286
289
  }
@@ -290,6 +293,9 @@
290
293
  .inset-y-2 {
291
294
  inset-block: calc(var(--spacing) * 2);
292
295
  }
296
+ .start {
297
+ inset-inline-start: var(--spacing);
298
+ }
293
299
  .start-0 {
294
300
  inset-inline-start: calc(var(--spacing) * 0);
295
301
  }
@@ -330,7 +336,7 @@
330
336
  top: calc(var(--spacing) * 1.5);
331
337
  }
332
338
  .top-1\/2 {
333
- top: calc(1/2 * 100%);
339
+ top: calc(1 / 2 * 100%);
334
340
  }
335
341
  .top-2 {
336
342
  top: calc(var(--spacing) * 2);
@@ -357,7 +363,7 @@
357
363
  bottom: calc(var(--spacing) * 26);
358
364
  }
359
365
  .left-1\/2 {
360
- left: calc(1/2 * 100%);
366
+ left: calc(1 / 2 * 100%);
361
367
  }
362
368
  .z-2 {
363
369
  z-index: 2;
@@ -1038,7 +1044,7 @@
1038
1044
  width: calc(var(--spacing) * 1.5);
1039
1045
  }
1040
1046
  .w-1\/4 {
1041
- width: calc(1/4 * 100%);
1047
+ width: calc(1 / 4 * 100%);
1042
1048
  }
1043
1049
  .w-4 {
1044
1050
  width: calc(var(--spacing) * 4);
@@ -1132,7 +1138,7 @@
1132
1138
  translate: var(--tw-translate-x) var(--tw-translate-y);
1133
1139
  }
1134
1140
  .-translate-x-1\/2 {
1135
- --tw-translate-x: calc(calc(1/2 * 100%) * -1);
1141
+ --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
1136
1142
  translate: var(--tw-translate-x) var(--tw-translate-y);
1137
1143
  }
1138
1144
  .translate-x-2 {
@@ -1144,7 +1150,7 @@
1144
1150
  translate: var(--tw-translate-x) var(--tw-translate-y);
1145
1151
  }
1146
1152
  .-translate-y-1\/2 {
1147
- --tw-translate-y: calc(calc(1/2 * 100%) * -1);
1153
+ --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);
1148
1154
  translate: var(--tw-translate-x) var(--tw-translate-y);
1149
1155
  }
1150
1156
  .-translate-y-full {
@@ -1463,12 +1469,12 @@
1463
1469
  .bg-transparent {
1464
1470
  background-color: transparent;
1465
1471
  }
1472
+ .mask-\[linear-gradient\(to_bottom\,transparent\,white_--spacing\(14\)\,white_calc\(100\%---spacing\(14\)\)\,transparent\)\] {
1473
+ mask-image: linear-gradient(to bottom,transparent,white calc(var(--spacing) * 14),white calc(100% - calc(var(--spacing) * 14)),transparent);
1474
+ }
1466
1475
  .mask-\[linear-gradient\(to_bottom\,transparent\,white_16px\,white_calc\(100\%-16px\)\,transparent\)\] {
1467
1476
  mask-image: linear-gradient(to bottom,transparent,white 16px,white calc(100% - 16px),transparent);
1468
1477
  }
1469
- .mask-\[linear-gradient\(to_bottom\,transparent\,white_calc\(var\(--spacing\)\*14\)\,white_calc\(100\%-var\(--spacing\)\*14\)\,transparent\)\] {
1470
- mask-image: linear-gradient(to bottom,transparent,white calc(var(--spacing) * 14),white calc(100% - var(--spacing) * 14),transparent);
1471
- }
1472
1478
  .mask-\[linear-gradient\(to_bottom\,white\,white_30px\,transparent_80px\)\] {
1473
1479
  mask-image: linear-gradient(to bottom,white,white 30px,transparent 80px);
1474
1480
  }
@@ -2328,7 +2334,7 @@
2328
2334
  .data-ending-style\:data-\[activation-direction\=left\]\:translate-x-1\/2 {
2329
2335
  &[data-ending-style] {
2330
2336
  &[data-activation-direction="left"] {
2331
- --tw-translate-x: calc(1/2 * 100%);
2337
+ --tw-translate-x: calc(1 / 2 * 100%);
2332
2338
  translate: var(--tw-translate-x) var(--tw-translate-y);
2333
2339
  }
2334
2340
  }
@@ -2336,7 +2342,7 @@
2336
2342
  .data-starting-style\:data-\[activation-direction\=left\]\:-translate-x-1\/2 {
2337
2343
  &[data-starting-style] {
2338
2344
  &[data-activation-direction="left"] {
2339
- --tw-translate-x: calc(calc(1/2 * 100%) * -1);
2345
+ --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
2340
2346
  translate: var(--tw-translate-x) var(--tw-translate-y);
2341
2347
  }
2342
2348
  }
@@ -2344,7 +2350,7 @@
2344
2350
  .data-ending-style\:data-\[activation-direction\=right\]\:-translate-x-1\/2 {
2345
2351
  &[data-ending-style] {
2346
2352
  &[data-activation-direction="right"] {
2347
- --tw-translate-x: calc(calc(1/2 * 100%) * -1);
2353
+ --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);
2348
2354
  translate: var(--tw-translate-x) var(--tw-translate-y);
2349
2355
  }
2350
2356
  }
@@ -2352,7 +2358,7 @@
2352
2358
  .data-starting-style\:data-\[activation-direction\=right\]\:translate-x-1\/2 {
2353
2359
  &[data-starting-style] {
2354
2360
  &[data-activation-direction="right"] {
2355
- --tw-translate-x: calc(1/2 * 100%);
2361
+ --tw-translate-x: calc(1 / 2 * 100%);
2356
2362
  translate: var(--tw-translate-x) var(--tw-translate-y);
2357
2363
  }
2358
2364
  }
@@ -2874,23 +2880,6 @@
2874
2880
  &.has-focused:hover .line:not(.focused) {
2875
2881
  filter: blur(0);
2876
2882
  }
2877
- &[data-line-numbers] .twoslash-meta-line {
2878
- padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2879
- }
2880
- &[data-line-numbers] .line {
2881
- counter-increment: line;
2882
- padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2883
- }
2884
- &[data-line-numbers] .line::after {
2885
- position: absolute;
2886
- content: counter(line);
2887
- color: var(--fd-counter-color, hsl(0, 0%, 45.1%));
2888
- @supports (color: color-mix(in lab, red, red)) {
2889
- color: color-mix( in oklab, var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%, transparent );
2890
- }
2891
- top: calc(var(--spacing) * 0);
2892
- left: calc(var(--spacing) * 4);
2893
- }
2894
2883
  .diff::before {
2895
2884
  position: absolute;
2896
2885
  left: calc(var(--spacing) * 1.5);
@@ -2915,16 +2904,22 @@
2915
2904
  .highlighted {
2916
2905
  --fd-counter-color: var(--color-fd-primary);
2917
2906
  padding-left: calc(var(--padding-left) - 2px);
2907
+ background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
2908
+ @supports (color: color-mix(in lab, red, red)) {
2909
+ background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2910
+ }
2911
+ }
2912
+ .highlighted::after {
2913
+ position: absolute;
2914
+ content: '';
2915
+ inset-block: calc(var(--spacing) * 0);
2916
+ left: calc(var(--spacing) * 0);
2918
2917
  border-left-style: var(--tw-border-style);
2919
2918
  border-left-width: 2px;
2920
2919
  border-color: color-mix(in srgb, hsl(0, 0%, 9%) 50%, transparent);
2921
2920
  @supports (color: color-mix(in lab, red, red)) {
2922
2921
  border-color: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
2923
2922
  }
2924
- background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
2925
- @supports (color: color-mix(in lab, red, red)) {
2926
- background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2927
- }
2928
2923
  }
2929
2924
  .highlighted-word {
2930
2925
  padding: 1px;
@@ -2943,6 +2938,25 @@
2943
2938
  --tw-font-weight: var(--font-weight-medium);
2944
2939
  font-weight: var(--font-weight-medium);
2945
2940
  }
2941
+ &[data-line-numbers] .twoslash-meta-line {
2942
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2943
+ }
2944
+ &[data-line-numbers] .line {
2945
+ counter-increment: line;
2946
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2947
+ }
2948
+ &[data-line-numbers] .line::after {
2949
+ position: absolute;
2950
+ content: counter(line);
2951
+ color: var(--fd-counter-color, hsl(0, 0%, 45.1%));
2952
+ @supports (color: color-mix(in lab, red, red)) {
2953
+ color: color-mix( in oklab, var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%, transparent );
2954
+ }
2955
+ inset-block: calc(var(--spacing) * 0);
2956
+ left: calc(var(--spacing) * 0);
2957
+ width: calc(var(--spacing) * 7);
2958
+ text-align: right;
2959
+ }
2946
2960
  }
2947
2961
  .dark .shiki:not(.not-fumadocs-codeblock *) {
2948
2962
  code span {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fumadocs/base-ui",
3
- "version": "16.6.5",
3
+ "version": "16.6.7",
4
4
  "description": "The Base UI version of Fumadocs UI",
5
5
  "keywords": [
6
6
  "Docs",
@@ -100,29 +100,29 @@
100
100
  "dependencies": {
101
101
  "@base-ui/react": "^1.2.0",
102
102
  "class-variance-authority": "^0.7.1",
103
- "lucide-react": "^0.570.0",
104
- "motion": "^12.34.0",
103
+ "lucide-react": "^0.575.0",
104
+ "motion": "^12.34.3",
105
105
  "next-themes": "^0.4.6",
106
- "react-medium-image-zoom": "^5.4.0",
106
+ "react-medium-image-zoom": "^5.4.1",
107
107
  "react-remove-scroll": "^2.7.2",
108
108
  "rehype-raw": "^7.0.0",
109
109
  "scroll-into-view-if-needed": "^3.1.0",
110
- "tailwind-merge": "^3.4.1",
110
+ "tailwind-merge": "^3.5.0",
111
111
  "unist-util-visit": "^5.1.0",
112
112
  "@fumadocs/tailwind": "0.0.2"
113
113
  },
114
114
  "devDependencies": {
115
- "@tailwindcss/cli": "^4.1.18",
115
+ "@tailwindcss/cli": "^4.2.1",
116
116
  "@types/hast": "^3.0.4",
117
- "@types/node": "^25.2.3",
117
+ "@types/node": "^25.3.1",
118
118
  "@types/react": "^19.2.14",
119
119
  "@types/react-dom": "^19.2.3",
120
- "tailwindcss": "^4.1.18",
121
- "tsdown": "^0.20.3",
120
+ "tailwindcss": "^4.2.1",
121
+ "tsdown": "0.20.3",
122
122
  "unified": "^11.0.5",
123
123
  "@fumadocs/cli": "1.2.4",
124
124
  "eslint-config-custom": "0.0.0",
125
- "fumadocs-core": "16.6.5",
125
+ "fumadocs-core": "16.6.7",
126
126
  "tsconfig": "0.0.0"
127
127
  },
128
128
  "peerDependencies": {
@@ -132,7 +132,7 @@
132
132
  "react": "^19.2.0",
133
133
  "react-dom": "^19.2.0",
134
134
  "tailwindcss": "^4.0.0",
135
- "fumadocs-core": "16.6.5"
135
+ "fumadocs-core": "16.6.7"
136
136
  },
137
137
  "peerDependenciesMeta": {
138
138
  "next": {