@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.
- package/css/generated/docs.css +1 -0
- package/css/generated/flux.css +11 -3
- package/css/generated/notebook.css +1 -0
- package/css/generated/shared.css +3 -0
- package/css/lib/shiki.css +26 -21
- package/dist/contexts/search.d.ts +1 -0
- package/dist/contexts/search.d.ts.map +1 -1
- package/dist/contexts/search.js +3 -1
- package/dist/contexts/search.js.map +1 -1
- package/dist/layouts/flux/index.d.ts +0 -1
- package/dist/layouts/flux/index.d.ts.map +1 -1
- package/dist/layouts/flux/index.js +9 -2
- package/dist/layouts/flux/index.js.map +1 -1
- package/dist/layouts/flux/sidebar.d.ts.map +1 -1
- package/dist/layouts/flux/sidebar.js +10 -6
- package/dist/layouts/flux/sidebar.js.map +1 -1
- package/dist/layouts/flux/tab-dropdown.js +1 -1
- package/dist/layouts/flux/tab-dropdown.js.map +1 -1
- package/dist/layouts/home/client.d.ts +1 -1
- package/dist/layouts/notebook/client.d.ts +1 -1
- package/dist/layouts/notebook/client.d.ts.map +1 -1
- package/dist/layouts/shared/index.d.ts +1 -1
- package/dist/layouts/shared/index.d.ts.map +1 -1
- package/dist/style.css +48 -34
- package/package.json +11 -11
package/css/generated/docs.css
CHANGED
package/css/generated/flux.css
CHANGED
|
@@ -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,
|
|
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");
|
package/css/generated/shared.css
CHANGED
|
@@ -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
|
-
|
|
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 *) {
|
|
@@ -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,
|
|
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"}
|
package/dist/contexts/search.js
CHANGED
|
@@ -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":";;;;;;
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/layouts/flux/index.tsx"],"mappings":";;;;;;;;;;;
|
|
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,
|
|
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":"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"}
|
|
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,
|
|
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:
|
|
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)
|
|
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: .
|
|
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?: "
|
|
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 |
|
|
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,
|
|
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 |
|
|
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,
|
|
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
|
|
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.
|
|
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.
|
|
104
|
-
"motion": "^12.34.
|
|
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.
|
|
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.
|
|
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
|
|
115
|
+
"@tailwindcss/cli": "^4.2.1",
|
|
116
116
|
"@types/hast": "^3.0.4",
|
|
117
|
-
"@types/node": "^25.
|
|
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
|
|
121
|
-
"tsdown": "
|
|
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.
|
|
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.
|
|
135
|
+
"fumadocs-core": "16.6.7"
|
|
136
136
|
},
|
|
137
137
|
"peerDependenciesMeta": {
|
|
138
138
|
"next": {
|