@fumadocs/base-ui 16.6.10 → 16.6.11
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/dist/_virtual/_rolldown/runtime.js +6 -11
- package/dist/components/accordion.js +2 -4
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/banner.js +2 -4
- package/dist/components/banner.js.map +1 -1
- package/dist/components/callout.js +1 -2
- package/dist/components/callout.js.map +1 -1
- package/dist/components/card.js +1 -2
- package/dist/components/card.js.map +1 -1
- package/dist/components/codeblock.js +2 -4
- package/dist/components/codeblock.js.map +1 -1
- package/dist/components/codeblock.rsc.js +5 -6
- package/dist/components/codeblock.rsc.js.map +1 -1
- package/dist/components/dialog/search-algolia.js +2 -4
- package/dist/components/dialog/search-algolia.js.map +1 -1
- package/dist/components/dialog/search-default.js +2 -4
- package/dist/components/dialog/search-default.js.map +1 -1
- package/dist/components/dialog/search-orama.js +2 -4
- package/dist/components/dialog/search-orama.js.map +1 -1
- package/dist/components/dialog/search.js +2 -4
- package/dist/components/dialog/search.js.map +1 -1
- package/dist/components/dynamic-codeblock.core.js +2 -4
- package/dist/components/dynamic-codeblock.core.js.map +1 -1
- package/dist/components/dynamic-codeblock.js +2 -4
- package/dist/components/dynamic-codeblock.js.map +1 -1
- package/dist/components/files.js +2 -4
- package/dist/components/files.js.map +1 -1
- package/dist/components/github-info.js +1 -2
- package/dist/components/github-info.js.map +1 -1
- package/dist/components/heading.js +1 -2
- package/dist/components/heading.js.map +1 -1
- package/dist/components/image-zoom.js +3 -5
- package/dist/components/image-zoom.js.map +1 -1
- package/dist/components/inline-toc.js +2 -4
- package/dist/components/inline-toc.js.map +1 -1
- package/dist/components/sidebar/base.js +2 -4
- package/dist/components/sidebar/base.js.map +1 -1
- package/dist/components/sidebar/link-item.js +2 -4
- package/dist/components/sidebar/link-item.js.map +1 -1
- package/dist/components/sidebar/page-tree.js +1 -2
- package/dist/components/sidebar/page-tree.js.map +1 -1
- package/dist/components/sidebar/tabs/dropdown.js +2 -4
- package/dist/components/sidebar/tabs/dropdown.js.map +1 -1
- package/dist/components/sidebar/tabs/index.js +1 -2
- package/dist/components/sidebar/tabs/index.js.map +1 -1
- package/dist/components/steps.js +1 -2
- package/dist/components/steps.js.map +1 -1
- package/dist/components/tabs.js +2 -4
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/toc/clerk.js +2 -4
- package/dist/components/toc/clerk.js.map +1 -1
- package/dist/components/toc/default.js +2 -4
- package/dist/components/toc/default.js.map +1 -1
- package/dist/components/toc/index.js +2 -4
- package/dist/components/toc/index.js.map +1 -1
- package/dist/components/type-table.js +2 -4
- package/dist/components/type-table.js.map +1 -1
- package/dist/components/ui/accordion.js +2 -4
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/button.js +1 -2
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/collapsible.js +2 -4
- package/dist/components/ui/collapsible.js.map +1 -1
- package/dist/components/ui/navigation-menu.js +2 -4
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/popover.js +2 -4
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/scroll-area.js +1 -2
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/tabs.js +2 -4
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/contexts/i18n.js +2 -4
- package/dist/contexts/i18n.js.map +1 -1
- package/dist/contexts/search.js +2 -4
- package/dist/contexts/search.js.map +1 -1
- package/dist/contexts/tree.js +2 -4
- package/dist/contexts/tree.js.map +1 -1
- package/dist/i18n.js +1 -2
- package/dist/i18n.js.map +1 -1
- package/dist/layouts/docs/client.js +2 -4
- package/dist/layouts/docs/client.js.map +1 -1
- package/dist/layouts/docs/index.js +1 -2
- package/dist/layouts/docs/index.js.map +1 -1
- package/dist/layouts/docs/page/client.js +2 -4
- package/dist/layouts/docs/page/client.js.map +1 -1
- package/dist/layouts/docs/page/index.js +1 -2
- package/dist/layouts/docs/page/index.js.map +1 -1
- package/dist/layouts/docs/sidebar.js +2 -4
- package/dist/layouts/docs/sidebar.js.map +1 -1
- package/dist/layouts/flux/index.js +2 -4
- package/dist/layouts/flux/index.js.map +1 -1
- package/dist/layouts/flux/page/client.js +2 -4
- package/dist/layouts/flux/page/client.js.map +1 -1
- package/dist/layouts/flux/page/index.js +1 -2
- package/dist/layouts/flux/page/index.js.map +1 -1
- package/dist/layouts/flux/sidebar.js +2 -4
- package/dist/layouts/flux/sidebar.js.map +1 -1
- package/dist/layouts/flux/tab-dropdown.js +2 -4
- package/dist/layouts/flux/tab-dropdown.js.map +1 -1
- package/dist/layouts/home/client.d.ts +1 -1
- package/dist/layouts/home/client.js +3 -5
- package/dist/layouts/home/client.js.map +1 -1
- package/dist/layouts/home/index.js +1 -2
- package/dist/layouts/home/index.js.map +1 -1
- package/dist/layouts/home/navbar.js +2 -4
- package/dist/layouts/home/navbar.js.map +1 -1
- package/dist/layouts/home/not-found.js +1 -2
- package/dist/layouts/home/not-found.js.map +1 -1
- package/dist/layouts/notebook/client.d.ts +1 -1
- package/dist/layouts/notebook/client.d.ts.map +1 -1
- package/dist/layouts/notebook/client.js +2 -4
- package/dist/layouts/notebook/client.js.map +1 -1
- package/dist/layouts/notebook/index.js +1 -2
- package/dist/layouts/notebook/index.js.map +1 -1
- package/dist/layouts/notebook/page/client.js +2 -4
- package/dist/layouts/notebook/page/client.js.map +1 -1
- package/dist/layouts/notebook/page/index.js +1 -2
- package/dist/layouts/notebook/page/index.js.map +1 -1
- package/dist/layouts/notebook/sidebar.js +2 -4
- package/dist/layouts/notebook/sidebar.js.map +1 -1
- package/dist/layouts/shared/index.d.ts +1 -1
- package/dist/layouts/shared/index.d.ts.map +1 -1
- package/dist/layouts/shared/index.js +1 -2
- package/dist/layouts/shared/index.js.map +1 -1
- package/dist/layouts/shared/language-toggle.js +2 -4
- package/dist/layouts/shared/language-toggle.js.map +1 -1
- package/dist/layouts/shared/search-toggle.js +2 -4
- package/dist/layouts/shared/search-toggle.js.map +1 -1
- package/dist/layouts/shared/theme-toggle.js +2 -4
- package/dist/layouts/shared/theme-toggle.js.map +1 -1
- package/dist/mdx.js +1 -2
- package/dist/mdx.js.map +1 -1
- package/dist/mdx.server.js +1 -2
- package/dist/mdx.server.js.map +1 -1
- package/dist/og/takumi.js +1 -2
- package/dist/og/takumi.js.map +1 -1
- package/dist/og.js +1 -2
- package/dist/og.js.map +1 -1
- package/dist/page.js +2 -4
- package/dist/page.js.map +1 -1
- package/dist/provider/base.js +2 -4
- package/dist/provider/base.js.map +1 -1
- package/dist/provider/next.js +2 -4
- package/dist/provider/next.js.map +1 -1
- package/dist/provider/react-router.js +2 -4
- package/dist/provider/react-router.js.map +1 -1
- package/dist/provider/tanstack.js +2 -4
- package/dist/provider/tanstack.js.map +1 -1
- package/dist/provider/waku.js +2 -4
- package/dist/provider/waku.js.map +1 -1
- package/dist/tailwind/typography.js +1 -2
- package/dist/utils/cn.js +1 -2
- package/dist/utils/link-item.js +2 -4
- package/dist/utils/link-item.js.map +1 -1
- package/dist/utils/merge-refs.js +1 -1
- package/dist/utils/urls.js +1 -1
- package/dist/utils/use-copy-button.js +2 -4
- package/dist/utils/use-copy-button.js.map +1 -1
- package/dist/utils/use-footer-items.js +2 -4
- package/dist/utils/use-footer-items.js.map +1 -1
- package/dist/utils/use-is-scroll-top.js +2 -4
- package/dist/utils/use-is-scroll-top.js.map +1 -1
- package/package.json +5 -5
- package/dist/components/image-zoom-DGvp66QF.css +0 -80
- package/dist/components/image-zoom-DGvp66QF.css.map +0 -1
- package/dist/components/image-zoom2.js +0 -1
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { mergeRefs } from "../../utils/merge-refs.js";
|
|
4
3
|
import { createContext, use, useEffectEvent, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
5
4
|
import { jsx } from "react/jsx-runtime";
|
|
6
5
|
import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
|
|
7
|
-
|
|
8
6
|
//#region src/components/ui/tabs.tsx
|
|
9
7
|
const listeners = /* @__PURE__ */ new Map();
|
|
10
8
|
const TabsContext = createContext(null);
|
|
@@ -75,7 +73,7 @@ function TabsContent({ value, ...props }) {
|
|
|
75
73
|
children: props.children
|
|
76
74
|
});
|
|
77
75
|
}
|
|
78
|
-
|
|
79
76
|
//#endregion
|
|
80
77
|
export { Tabs, TabsContent, TabsList, TabsTrigger };
|
|
78
|
+
|
|
81
79
|
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":["Primitive"],"sources":["../../../src/components/ui/tabs.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n createContext,\n use,\n useEffectEvent,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs as Primitive } from '@base-ui/react/tabs';\nimport { mergeRefs } from '@/utils/merge-refs';\n\ntype ChangeListener = (v: string) => void;\nconst listeners = new Map<string, Set<ChangeListener>>();\n\nexport interface TabsProps extends ComponentProps<typeof Primitive.Root> {\n /**\n * Identifier for Sharing value of tabs\n */\n groupId?: string;\n\n /**\n * Enable persistent\n */\n persist?: boolean;\n\n /**\n * If true, updates the URL hash based on the tab's id\n */\n updateAnchor?: boolean;\n\n onValueChange?: (value: string) => void;\n}\n\nconst TabsContext = createContext<{\n valueToIdMap: Map<string, string>;\n} | null>(null);\n\nfunction useTabContext() {\n const ctx = use(TabsContext);\n if (!ctx) throw new Error('You must wrap your component in <Tabs>');\n return ctx;\n}\n\nexport const TabsList = Primitive.List;\n\nexport const TabsTrigger = Primitive.Tab;\n\nexport function Tabs({\n ref,\n groupId,\n persist = false,\n updateAnchor = false,\n defaultValue,\n value: _value,\n onValueChange: _onValueChange,\n ...props\n}: TabsProps) {\n const tabsRef = useRef<HTMLDivElement>(null);\n const valueToIdMap = useMemo(() => new Map<string, string>(), []);\n const [value, setValue] =\n _value === undefined\n ? // eslint-disable-next-line react-hooks/rules-of-hooks -- not supposed to change controlled/uncontrolled\n useState(defaultValue)\n : // eslint-disable-next-line react-hooks/rules-of-hooks -- not supposed to change controlled/uncontrolled\n [_value, useEffectEvent((v: string) => _onValueChange?.(v))];\n\n useLayoutEffect(() => {\n if (!groupId) return;\n let previous = sessionStorage.getItem(groupId);\n if (persist) previous ??= localStorage.getItem(groupId);\n if (previous) setValue(previous);\n\n const groupListeners = listeners.get(groupId) ?? new Set();\n groupListeners.add(setValue);\n listeners.set(groupId, groupListeners);\n return () => {\n groupListeners.delete(setValue);\n };\n }, [groupId, persist, setValue]);\n\n useLayoutEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash) return;\n\n for (const [value, id] of valueToIdMap.entries()) {\n if (id === hash) {\n setValue(value);\n tabsRef.current?.scrollIntoView();\n break;\n }\n }\n }, [setValue, valueToIdMap]);\n\n return (\n <Primitive.Root\n ref={mergeRefs(ref, tabsRef)}\n value={value}\n onValueChange={(v: string) => {\n if (updateAnchor) {\n const id = valueToIdMap.get(v);\n\n if (id) {\n window.history.replaceState(null, '', `#${id}`);\n }\n }\n\n if (groupId) {\n const groupListeners = listeners.get(groupId);\n if (groupListeners) {\n for (const listener of groupListeners) listener(v);\n }\n\n sessionStorage.setItem(groupId, v);\n if (persist) localStorage.setItem(groupId, v);\n } else {\n setValue(v);\n }\n }}\n {...props}\n >\n <TabsContext value={useMemo(() => ({ valueToIdMap }), [valueToIdMap])}>\n {props.children}\n </TabsContext>\n </Primitive.Root>\n );\n}\n\nexport function TabsContent({ value, ...props }: ComponentProps<typeof Primitive.Panel>) {\n const { valueToIdMap } = useTabContext();\n\n if (props.id) {\n valueToIdMap.set(value, props.id);\n }\n\n return (\n <Primitive.Panel value={value} {...props}>\n {props.children}\n </Primitive.Panel>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["Primitive"],"sources":["../../../src/components/ui/tabs.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n createContext,\n use,\n useEffectEvent,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs as Primitive } from '@base-ui/react/tabs';\nimport { mergeRefs } from '@/utils/merge-refs';\n\ntype ChangeListener = (v: string) => void;\nconst listeners = new Map<string, Set<ChangeListener>>();\n\nexport interface TabsProps extends ComponentProps<typeof Primitive.Root> {\n /**\n * Identifier for Sharing value of tabs\n */\n groupId?: string;\n\n /**\n * Enable persistent\n */\n persist?: boolean;\n\n /**\n * If true, updates the URL hash based on the tab's id\n */\n updateAnchor?: boolean;\n\n onValueChange?: (value: string) => void;\n}\n\nconst TabsContext = createContext<{\n valueToIdMap: Map<string, string>;\n} | null>(null);\n\nfunction useTabContext() {\n const ctx = use(TabsContext);\n if (!ctx) throw new Error('You must wrap your component in <Tabs>');\n return ctx;\n}\n\nexport const TabsList = Primitive.List;\n\nexport const TabsTrigger = Primitive.Tab;\n\nexport function Tabs({\n ref,\n groupId,\n persist = false,\n updateAnchor = false,\n defaultValue,\n value: _value,\n onValueChange: _onValueChange,\n ...props\n}: TabsProps) {\n const tabsRef = useRef<HTMLDivElement>(null);\n const valueToIdMap = useMemo(() => new Map<string, string>(), []);\n const [value, setValue] =\n _value === undefined\n ? // eslint-disable-next-line react-hooks/rules-of-hooks -- not supposed to change controlled/uncontrolled\n useState(defaultValue)\n : // eslint-disable-next-line react-hooks/rules-of-hooks -- not supposed to change controlled/uncontrolled\n [_value, useEffectEvent((v: string) => _onValueChange?.(v))];\n\n useLayoutEffect(() => {\n if (!groupId) return;\n let previous = sessionStorage.getItem(groupId);\n if (persist) previous ??= localStorage.getItem(groupId);\n if (previous) setValue(previous);\n\n const groupListeners = listeners.get(groupId) ?? new Set();\n groupListeners.add(setValue);\n listeners.set(groupId, groupListeners);\n return () => {\n groupListeners.delete(setValue);\n };\n }, [groupId, persist, setValue]);\n\n useLayoutEffect(() => {\n const hash = window.location.hash.slice(1);\n if (!hash) return;\n\n for (const [value, id] of valueToIdMap.entries()) {\n if (id === hash) {\n setValue(value);\n tabsRef.current?.scrollIntoView();\n break;\n }\n }\n }, [setValue, valueToIdMap]);\n\n return (\n <Primitive.Root\n ref={mergeRefs(ref, tabsRef)}\n value={value}\n onValueChange={(v: string) => {\n if (updateAnchor) {\n const id = valueToIdMap.get(v);\n\n if (id) {\n window.history.replaceState(null, '', `#${id}`);\n }\n }\n\n if (groupId) {\n const groupListeners = listeners.get(groupId);\n if (groupListeners) {\n for (const listener of groupListeners) listener(v);\n }\n\n sessionStorage.setItem(groupId, v);\n if (persist) localStorage.setItem(groupId, v);\n } else {\n setValue(v);\n }\n }}\n {...props}\n >\n <TabsContext value={useMemo(() => ({ valueToIdMap }), [valueToIdMap])}>\n {props.children}\n </TabsContext>\n </Primitive.Root>\n );\n}\n\nexport function TabsContent({ value, ...props }: ComponentProps<typeof Primitive.Panel>) {\n const { valueToIdMap } = useTabContext();\n\n if (props.id) {\n valueToIdMap.set(value, props.id);\n }\n\n return (\n <Primitive.Panel value={value} {...props}>\n {props.children}\n </Primitive.Panel>\n );\n}\n"],"mappings":";;;;;;AAgBA,MAAM,4BAAY,IAAI,KAAkC;AAqBxD,MAAM,cAAc,cAEV,KAAK;AAEf,SAAS,gBAAgB;CACvB,MAAM,MAAM,IAAI,YAAY;AAC5B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yCAAyC;AACnE,QAAO;;AAGT,MAAa,WAAWA,OAAU;AAElC,MAAa,cAAcA,OAAU;AAErC,SAAgB,KAAK,EACnB,KACA,SACA,UAAU,OACV,eAAe,OACf,cACA,OAAO,QACP,eAAe,gBACf,GAAG,SACS;CACZ,MAAM,UAAU,OAAuB,KAAK;CAC5C,MAAM,eAAe,8BAAc,IAAI,KAAqB,EAAE,EAAE,CAAC;CACjE,MAAM,CAAC,OAAO,YACZ,WAAW,KAAA,IAEP,SAAS,aAAa,GAEtB,CAAC,QAAQ,gBAAgB,MAAc,iBAAiB,EAAE,CAAC,CAAC;AAElE,uBAAsB;AACpB,MAAI,CAAC,QAAS;EACd,IAAI,WAAW,eAAe,QAAQ,QAAQ;AAC9C,MAAI,QAAS,cAAa,aAAa,QAAQ,QAAQ;AACvD,MAAI,SAAU,UAAS,SAAS;EAEhC,MAAM,iBAAiB,UAAU,IAAI,QAAQ,oBAAI,IAAI,KAAK;AAC1D,iBAAe,IAAI,SAAS;AAC5B,YAAU,IAAI,SAAS,eAAe;AACtC,eAAa;AACX,kBAAe,OAAO,SAAS;;IAEhC;EAAC;EAAS;EAAS;EAAS,CAAC;AAEhC,uBAAsB;EACpB,MAAM,OAAO,OAAO,SAAS,KAAK,MAAM,EAAE;AAC1C,MAAI,CAAC,KAAM;AAEX,OAAK,MAAM,CAAC,OAAO,OAAO,aAAa,SAAS,CAC9C,KAAI,OAAO,MAAM;AACf,YAAS,MAAM;AACf,WAAQ,SAAS,gBAAgB;AACjC;;IAGH,CAAC,UAAU,aAAa,CAAC;AAE5B,QACE,oBAACA,OAAU,MAAX;EACE,KAAK,UAAU,KAAK,QAAQ;EACrB;EACP,gBAAgB,MAAc;AAC5B,OAAI,cAAc;IAChB,MAAM,KAAK,aAAa,IAAI,EAAE;AAE9B,QAAI,GACF,QAAO,QAAQ,aAAa,MAAM,IAAI,IAAI,KAAK;;AAInD,OAAI,SAAS;IACX,MAAM,iBAAiB,UAAU,IAAI,QAAQ;AAC7C,QAAI,eACF,MAAK,MAAM,YAAY,eAAgB,UAAS,EAAE;AAGpD,mBAAe,QAAQ,SAAS,EAAE;AAClC,QAAI,QAAS,cAAa,QAAQ,SAAS,EAAE;SAE7C,UAAS,EAAE;;EAGf,GAAI;YAEJ,oBAAC,aAAD;GAAa,OAAO,eAAe,EAAE,cAAc,GAAG,CAAC,aAAa,CAAC;aAClE,MAAM;GACK,CAAA;EACC,CAAA;;AAIrB,SAAgB,YAAY,EAAE,OAAO,GAAG,SAAiD;CACvF,MAAM,EAAE,iBAAiB,eAAe;AAExC,KAAI,MAAM,GACR,cAAa,IAAI,OAAO,MAAM,GAAG;AAGnC,QACE,oBAACA,OAAU,OAAX;EAAwB;EAAO,GAAI;YAChC,MAAM;EACS,CAAA"}
|
package/dist/contexts/i18n.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { createContext, useContext, useMemo, useRef } from "react";
|
|
4
3
|
import { usePathname, useRouter } from "fumadocs-core/framework";
|
|
5
4
|
import { jsx } from "react/jsx-runtime";
|
|
6
|
-
|
|
7
5
|
//#region src/contexts/i18n.tsx
|
|
8
6
|
const defaultTranslations = {
|
|
9
7
|
search: "Search",
|
|
@@ -54,7 +52,7 @@ function I18nProvider({ locales = [], locale, onLocaleChange, children, translat
|
|
|
54
52
|
children
|
|
55
53
|
});
|
|
56
54
|
}
|
|
57
|
-
|
|
58
55
|
//#endregion
|
|
59
56
|
export { I18nLabel, I18nProvider, defaultTranslations, useI18n };
|
|
57
|
+
|
|
60
58
|
//# sourceMappingURL=i18n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../../src/contexts/i18n.tsx"],"sourcesContent":["'use client';\nimport { createContext, type ReactNode, useContext, useMemo, useRef } from 'react';\nimport { usePathname, useRouter } from 'fumadocs-core/framework';\n\nexport interface Translations {\n search: string;\n searchNoResult: string;\n\n toc: string;\n tocNoHeadings: string;\n\n lastUpdate: string;\n chooseLanguage: string;\n nextPage: string;\n previousPage: string;\n chooseTheme: string;\n editOnGithub: string;\n}\n\nexport interface LocaleItem {\n name: string;\n locale: string;\n}\n\ninterface I18nContextType {\n locale?: string;\n onChange?: (v: string) => void;\n text: Translations;\n locales?: LocaleItem[];\n}\n\nexport const defaultTranslations: Translations = {\n search: 'Search',\n searchNoResult: 'No results found',\n toc: 'On this page',\n tocNoHeadings: 'No Headings',\n lastUpdate: 'Last updated on',\n chooseLanguage: 'Choose a language',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n chooseTheme: 'Theme',\n editOnGithub: 'Edit on GitHub',\n};\n\nconst I18nContext = createContext<I18nContextType>({\n text: defaultTranslations,\n});\n\nexport function I18nLabel(props: { label: keyof Translations }): string {\n const { text } = useI18n();\n\n return text[props.label];\n}\n\nexport function useI18n(): I18nContextType {\n return useContext(I18nContext);\n}\n\nexport interface I18nProviderProps {\n /**\n * Current locale\n */\n locale: string;\n\n /**\n * Handle changes to the locale, redirect user when not specified.\n */\n onLocaleChange?: (v: string) => void;\n\n /**\n * Translations of current locale\n */\n translations?: Partial<Translations>;\n\n /**\n * Available languages\n */\n locales?: LocaleItem[];\n\n children?: ReactNode;\n}\n\nexport function I18nProvider({\n locales = [],\n locale,\n onLocaleChange,\n children,\n translations,\n}: I18nProviderProps) {\n const router = useRouter();\n const pathname = usePathname();\n const onChange = (value: string) => {\n if (onLocaleChange) {\n return onLocaleChange(value);\n }\n const segments = pathname.split('/').filter((v) => v.length > 0);\n\n // If locale prefix hidden\n if (segments[0] !== locale) {\n segments.unshift(value);\n } else {\n segments[0] = value;\n }\n\n router.push(`/${segments.join('/')}`);\n };\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n return (\n <I18nContext\n value={useMemo(\n () => ({\n locale,\n locales,\n text: {\n ...defaultTranslations,\n ...translations,\n },\n onChange: (v) => onChangeRef.current(v),\n }),\n [locale, locales, translations],\n )}\n >\n {children}\n </I18nContext>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"i18n.js","names":[],"sources":["../../src/contexts/i18n.tsx"],"sourcesContent":["'use client';\nimport { createContext, type ReactNode, useContext, useMemo, useRef } from 'react';\nimport { usePathname, useRouter } from 'fumadocs-core/framework';\n\nexport interface Translations {\n search: string;\n searchNoResult: string;\n\n toc: string;\n tocNoHeadings: string;\n\n lastUpdate: string;\n chooseLanguage: string;\n nextPage: string;\n previousPage: string;\n chooseTheme: string;\n editOnGithub: string;\n}\n\nexport interface LocaleItem {\n name: string;\n locale: string;\n}\n\ninterface I18nContextType {\n locale?: string;\n onChange?: (v: string) => void;\n text: Translations;\n locales?: LocaleItem[];\n}\n\nexport const defaultTranslations: Translations = {\n search: 'Search',\n searchNoResult: 'No results found',\n toc: 'On this page',\n tocNoHeadings: 'No Headings',\n lastUpdate: 'Last updated on',\n chooseLanguage: 'Choose a language',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n chooseTheme: 'Theme',\n editOnGithub: 'Edit on GitHub',\n};\n\nconst I18nContext = createContext<I18nContextType>({\n text: defaultTranslations,\n});\n\nexport function I18nLabel(props: { label: keyof Translations }): string {\n const { text } = useI18n();\n\n return text[props.label];\n}\n\nexport function useI18n(): I18nContextType {\n return useContext(I18nContext);\n}\n\nexport interface I18nProviderProps {\n /**\n * Current locale\n */\n locale: string;\n\n /**\n * Handle changes to the locale, redirect user when not specified.\n */\n onLocaleChange?: (v: string) => void;\n\n /**\n * Translations of current locale\n */\n translations?: Partial<Translations>;\n\n /**\n * Available languages\n */\n locales?: LocaleItem[];\n\n children?: ReactNode;\n}\n\nexport function I18nProvider({\n locales = [],\n locale,\n onLocaleChange,\n children,\n translations,\n}: I18nProviderProps) {\n const router = useRouter();\n const pathname = usePathname();\n const onChange = (value: string) => {\n if (onLocaleChange) {\n return onLocaleChange(value);\n }\n const segments = pathname.split('/').filter((v) => v.length > 0);\n\n // If locale prefix hidden\n if (segments[0] !== locale) {\n segments.unshift(value);\n } else {\n segments[0] = value;\n }\n\n router.push(`/${segments.join('/')}`);\n };\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n return (\n <I18nContext\n value={useMemo(\n () => ({\n locale,\n locales,\n text: {\n ...defaultTranslations,\n ...translations,\n },\n onChange: (v) => onChangeRef.current(v),\n }),\n [locale, locales, translations],\n )}\n >\n {children}\n </I18nContext>\n );\n}\n"],"mappings":";;;;;AA+BA,MAAa,sBAAoC;CAC/C,QAAQ;CACR,gBAAgB;CAChB,KAAK;CACL,eAAe;CACf,YAAY;CACZ,gBAAgB;CAChB,UAAU;CACV,cAAc;CACd,aAAa;CACb,cAAc;CACf;AAED,MAAM,cAAc,cAA+B,EACjD,MAAM,qBACP,CAAC;AAEF,SAAgB,UAAU,OAA8C;CACtE,MAAM,EAAE,SAAS,SAAS;AAE1B,QAAO,KAAK,MAAM;;AAGpB,SAAgB,UAA2B;AACzC,QAAO,WAAW,YAAY;;AA2BhC,SAAgB,aAAa,EAC3B,UAAU,EAAE,EACZ,QACA,gBACA,UACA,gBACoB;CACpB,MAAM,SAAS,WAAW;CAC1B,MAAM,WAAW,aAAa;CAC9B,MAAM,YAAY,UAAkB;AAClC,MAAI,eACF,QAAO,eAAe,MAAM;EAE9B,MAAM,WAAW,SAAS,MAAM,IAAI,CAAC,QAAQ,MAAM,EAAE,SAAS,EAAE;AAGhE,MAAI,SAAS,OAAO,OAClB,UAAS,QAAQ,MAAM;MAEvB,UAAS,KAAK;AAGhB,SAAO,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG;;CAEvC,MAAM,cAAc,OAAO,SAAS;AACpC,aAAY,UAAU;AAEtB,QACE,oBAAC,aAAD;EACE,OAAO,eACE;GACL;GACA;GACA,MAAM;IACJ,GAAG;IACH,GAAG;IACJ;GACD,WAAW,MAAM,YAAY,QAAQ,EAAE;GACxC,GACD;GAAC;GAAQ;GAAS;GAAa,CAChC;EAEA;EACW,CAAA"}
|
package/dist/contexts/search.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { Suspense, createContext, use, useEffect, useEffectEvent, useMemo, useState } from "react";
|
|
4
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
|
|
6
4
|
//#region src/contexts/search.tsx
|
|
7
5
|
const SearchContext = createContext({
|
|
8
6
|
enabled: false,
|
|
@@ -64,7 +62,7 @@ function SearchProvider({ SearchDialog, children, preload = true, options, hotKe
|
|
|
64
62
|
function SearchOnly({ children }) {
|
|
65
63
|
if (useSearchContext().enabled) return children;
|
|
66
64
|
}
|
|
67
|
-
|
|
68
65
|
//#endregion
|
|
69
66
|
export { SearchOnly, SearchProvider, useSearchContext };
|
|
67
|
+
|
|
70
68
|
//# sourceMappingURL=search.js.map
|
|
@@ -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 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":"
|
|
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,KAAA;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,eAAD,EAAiB,CAAA;CAC3B,EACD;CACE,KAAK;CACL,SAAS;CACV,CACF,EACD,SACsB;CACtB,MAAM,CAAC,QAAQ,aAAa,SAAS,UAAU,QAAQ,KAAA,EAAU;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,eAAD;EACE,OAAO,eACE;GACL,SAAS;GACT,MAAM,UAAU;GAChB;GACA,eAAe;GAChB,GACD,CAAC,QAAQ,OAAO,CACjB;YATH,CAWG,WAAW,KAAA,KACV,oBAAC,UAAD;GAAU,UAAU;aAClB,oBAAC,cAAD;IACE,MAAM;IACN,cAAc;IAEP;IACP,GAAI;IACJ,CAAA;GACO,CAAA,EAGZ,SACa;;;;;;AAOpB,SAAgB,WAAW,EAAE,YAAqC;AAGhE,KAFe,kBAAkB,CAEtB,QAAS,QAAO"}
|
package/dist/contexts/tree.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { createContext, use, useMemo, useRef } from "react";
|
|
4
3
|
import { usePathname } from "fumadocs-core/framework";
|
|
5
4
|
import { jsx } from "react/jsx-runtime";
|
|
6
5
|
import { searchPath } from "fumadocs-core/breadcrumb";
|
|
7
|
-
|
|
8
6
|
//#region src/contexts/tree.tsx
|
|
9
7
|
const TreeContext = createContext(null);
|
|
10
8
|
const PathContext = createContext([]);
|
|
@@ -36,7 +34,7 @@ function useTreeContext() {
|
|
|
36
34
|
if (!ctx) throw new Error("You must wrap this component under <DocsLayout />");
|
|
37
35
|
return ctx;
|
|
38
36
|
}
|
|
39
|
-
|
|
40
37
|
//#endregion
|
|
41
38
|
export { TreeContextProvider, useTreeContext, useTreePath };
|
|
39
|
+
|
|
42
40
|
//# sourceMappingURL=tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../src/contexts/tree.tsx"],"sourcesContent":["'use client';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { type ReactNode, useMemo, useRef, createContext, use } from 'react';\nimport { searchPath } from 'fumadocs-core/breadcrumb';\n\ntype MakeRequired<O, K extends keyof O> = Omit<O, K> & Pick<Required<O>, K>;\n\ninterface TreeContextType {\n root: MakeRequired<PageTree.Root | PageTree.Folder, '$id'>;\n full: PageTree.Root;\n}\n\nconst TreeContext = createContext<TreeContextType | null>(null);\nconst PathContext = createContext<PageTree.Node[]>([]);\n\nexport function TreeContextProvider({\n tree: rawTree,\n children,\n}: {\n tree: PageTree.Root;\n children: ReactNode;\n}) {\n const nextIdRef = useRef(0);\n const pathname = usePathname();\n\n // I found that object-typed props passed from a RSC will be re-constructed, hence breaking all hooks' dependencies\n // using the id here to make sure this never happens\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const tree = useMemo(() => rawTree, [rawTree.$id ?? rawTree]);\n const path = useMemo(() => {\n return (\n searchPath(tree.children, pathname) ??\n (tree.fallback ? searchPath(tree.fallback.children, pathname) : null) ??\n []\n );\n }, [tree, pathname]);\n\n const root = path.findLast((item) => item.type === 'folder' && item.root) ?? tree;\n root.$id ??= String(nextIdRef.current++);\n\n return (\n <TreeContext value={useMemo(() => ({ root, full: tree }) as TreeContextType, [root, tree])}>\n <PathContext value={path}>{children}</PathContext>\n </TreeContext>\n );\n}\n\nexport function useTreePath(): PageTree.Node[] {\n return use(PathContext);\n}\n\nexport function useTreeContext(): TreeContextType {\n const ctx = use(TreeContext);\n\n if (!ctx) throw new Error('You must wrap this component under <DocsLayout />');\n return ctx;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree.js","names":[],"sources":["../../src/contexts/tree.tsx"],"sourcesContent":["'use client';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { type ReactNode, useMemo, useRef, createContext, use } from 'react';\nimport { searchPath } from 'fumadocs-core/breadcrumb';\n\ntype MakeRequired<O, K extends keyof O> = Omit<O, K> & Pick<Required<O>, K>;\n\ninterface TreeContextType {\n root: MakeRequired<PageTree.Root | PageTree.Folder, '$id'>;\n full: PageTree.Root;\n}\n\nconst TreeContext = createContext<TreeContextType | null>(null);\nconst PathContext = createContext<PageTree.Node[]>([]);\n\nexport function TreeContextProvider({\n tree: rawTree,\n children,\n}: {\n tree: PageTree.Root;\n children: ReactNode;\n}) {\n const nextIdRef = useRef(0);\n const pathname = usePathname();\n\n // I found that object-typed props passed from a RSC will be re-constructed, hence breaking all hooks' dependencies\n // using the id here to make sure this never happens\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const tree = useMemo(() => rawTree, [rawTree.$id ?? rawTree]);\n const path = useMemo(() => {\n return (\n searchPath(tree.children, pathname) ??\n (tree.fallback ? searchPath(tree.fallback.children, pathname) : null) ??\n []\n );\n }, [tree, pathname]);\n\n const root = path.findLast((item) => item.type === 'folder' && item.root) ?? tree;\n root.$id ??= String(nextIdRef.current++);\n\n return (\n <TreeContext value={useMemo(() => ({ root, full: tree }) as TreeContextType, [root, tree])}>\n <PathContext value={path}>{children}</PathContext>\n </TreeContext>\n );\n}\n\nexport function useTreePath(): PageTree.Node[] {\n return use(PathContext);\n}\n\nexport function useTreeContext(): TreeContextType {\n const ctx = use(TreeContext);\n\n if (!ctx) throw new Error('You must wrap this component under <DocsLayout />');\n return ctx;\n}\n"],"mappings":";;;;;;AAaA,MAAM,cAAc,cAAsC,KAAK;AAC/D,MAAM,cAAc,cAA+B,EAAE,CAAC;AAEtD,SAAgB,oBAAoB,EAClC,MAAM,SACN,YAIC;CACD,MAAM,YAAY,OAAO,EAAE;CAC3B,MAAM,WAAW,aAAa;CAK9B,MAAM,OAAO,cAAc,SAAS,CAAC,QAAQ,OAAO,QAAQ,CAAC;CAC7D,MAAM,OAAO,cAAc;AACzB,SACE,WAAW,KAAK,UAAU,SAAS,KAClC,KAAK,WAAW,WAAW,KAAK,SAAS,UAAU,SAAS,GAAG,SAChE,EAAE;IAEH,CAAC,MAAM,SAAS,CAAC;CAEpB,MAAM,OAAO,KAAK,UAAU,SAAS,KAAK,SAAS,YAAY,KAAK,KAAK,IAAI;AAC7E,MAAK,QAAQ,OAAO,UAAU,UAAU;AAExC,QACE,oBAAC,aAAD;EAAa,OAAO,eAAe;GAAE;GAAM,MAAM;GAAM,GAAsB,CAAC,MAAM,KAAK,CAAC;YACxF,oBAAC,aAAD;GAAa,OAAO;GAAO;GAAuB,CAAA;EACtC,CAAA;;AAIlB,SAAgB,cAA+B;AAC7C,QAAO,IAAI,YAAY;;AAGzB,SAAgB,iBAAkC;CAChD,MAAM,MAAM,IAAI,YAAY;AAE5B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,QAAO"}
|
package/dist/i18n.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defaultTranslations } from "./contexts/i18n.js";
|
|
2
|
-
|
|
3
2
|
//#region src/i18n.tsx
|
|
4
3
|
function defineI18nUI(config, options) {
|
|
5
4
|
const { translations } = options;
|
|
@@ -14,7 +13,7 @@ function defineI18nUI(config, options) {
|
|
|
14
13
|
};
|
|
15
14
|
} };
|
|
16
15
|
}
|
|
17
|
-
|
|
18
16
|
//#endregion
|
|
19
17
|
export { defaultTranslations, defineI18nUI };
|
|
18
|
+
|
|
20
19
|
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../src/i18n.tsx"],"sourcesContent":["import type { I18nProviderProps, Translations } from '@/contexts/i18n';\nimport type { I18nConfig } from 'fumadocs-core/i18n';\n\nexport type { I18nProviderProps, Translations };\nexport { defaultTranslations } from './contexts/i18n';\n\nexport function defineI18nUI<Languages extends string>(\n config: I18nConfig<Languages>,\n options: {\n translations: {\n [K in Languages]?: Partial<Translations> & { displayName?: string };\n };\n },\n) {\n const { translations } = options;\n\n return {\n provider(locale: string = config.defaultLanguage): I18nProviderProps {\n return {\n locale,\n translations: translations[locale as Languages],\n locales: config.languages.map((locale) => ({\n locale,\n name: translations[locale]?.displayName ?? locale,\n })),\n };\n },\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"i18n.js","names":[],"sources":["../src/i18n.tsx"],"sourcesContent":["import type { I18nProviderProps, Translations } from '@/contexts/i18n';\nimport type { I18nConfig } from 'fumadocs-core/i18n';\n\nexport type { I18nProviderProps, Translations };\nexport { defaultTranslations } from './contexts/i18n';\n\nexport function defineI18nUI<Languages extends string>(\n config: I18nConfig<Languages>,\n options: {\n translations: {\n [K in Languages]?: Partial<Translations> & { displayName?: string };\n };\n },\n) {\n const { translations } = options;\n\n return {\n provider(locale: string = config.defaultLanguage): I18nProviderProps {\n return {\n locale,\n translations: translations[locale as Languages],\n locales: config.languages.map((locale) => ({\n locale,\n name: translations[locale]?.displayName ?? locale,\n })),\n };\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,aACd,QACA,SAKA;CACA,MAAM,EAAE,iBAAiB;AAEzB,QAAO,EACL,SAAS,SAAiB,OAAO,iBAAoC;AACnE,SAAO;GACL;GACA,cAAc,aAAa;GAC3B,SAAS,OAAO,UAAU,KAAK,YAAY;IACzC;IACA,MAAM,aAAa,SAAS,eAAe;IAC5C,EAAE;GACJ;IAEJ"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { cn } from "../../utils/cn.js";
|
|
4
3
|
import { useSidebar } from "../../components/sidebar/base.js";
|
|
5
4
|
import { isTabActive } from "../../components/sidebar/tabs/dropdown.js";
|
|
@@ -8,7 +7,6 @@ import { createContext, use, useMemo } from "react";
|
|
|
8
7
|
import { usePathname } from "fumadocs-core/framework";
|
|
9
8
|
import { jsx } from "react/jsx-runtime";
|
|
10
9
|
import Link from "fumadocs-core/link";
|
|
11
|
-
|
|
12
10
|
//#region src/layouts/docs/client.tsx
|
|
13
11
|
const LayoutContext = createContext(null);
|
|
14
12
|
function LayoutContextProvider({ navTransparentMode = "none", children }) {
|
|
@@ -62,7 +60,7 @@ function LayoutTabs({ options, ...props }) {
|
|
|
62
60
|
}, i))
|
|
63
61
|
});
|
|
64
62
|
}
|
|
65
|
-
|
|
66
63
|
//#endregion
|
|
67
64
|
export { LayoutBody, LayoutContext, LayoutContextProvider, LayoutHeader, LayoutTabs };
|
|
65
|
+
|
|
68
66
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../src/layouts/docs/client.tsx"],"sourcesContent":["'use client';\n\nimport { type ComponentProps, createContext, type ReactNode, use, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { useSidebar } from '@/components/sidebar/base';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { isTabActive } from '@/components/sidebar/tabs/dropdown';\nimport Link from 'fumadocs-core/link';\nimport type { SidebarTab } from '@/components/sidebar/tabs';\nimport { useIsScrollTop } from '@/utils/use-is-scroll-top';\n\nexport const LayoutContext = createContext<{\n isNavTransparent: boolean;\n} | null>(null);\n\nexport function LayoutContextProvider({\n navTransparentMode = 'none',\n children,\n}: {\n navTransparentMode?: 'always' | 'top' | 'none';\n children: ReactNode;\n}) {\n const isTop = useIsScrollTop({ enabled: navTransparentMode === 'top' }) ?? true;\n const isNavTransparent = navTransparentMode === 'top' ? isTop : navTransparentMode === 'always';\n\n return (\n <LayoutContext\n value={useMemo(\n () => ({\n isNavTransparent,\n }),\n [isNavTransparent],\n )}\n >\n {children}\n </LayoutContext>\n );\n}\n\nexport function LayoutHeader(props: ComponentProps<'header'>) {\n const { isNavTransparent } = use(LayoutContext)!;\n\n return (\n <header data-transparent={isNavTransparent} {...props}>\n {props.children}\n </header>\n );\n}\n\nexport function LayoutBody({ className, style, children, ...props }: ComponentProps<'div'>) {\n const { collapsed } = useSidebar();\n\n return (\n <div\n id=\"nd-docs-layout\"\n className={cn(\n 'grid transition-[grid-template-columns] overflow-x-clip min-h-(--fd-docs-height) [--fd-docs-height:100dvh] [--fd-header-height:0px] [--fd-toc-popover-height:0px] [--fd-sidebar-width:0px] [--fd-toc-width:0px]',\n className,\n )}\n data-sidebar-collapsed={collapsed}\n style={\n {\n gridTemplate: `\"sidebar sidebar header toc toc\"\n \"sidebar sidebar toc-popover toc toc\"\n \"sidebar sidebar main toc toc\" 1fr / minmax(min-content, 1fr) var(--fd-sidebar-col) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) var(--fd-toc-width) minmax(min-content, 1fr)`,\n '--fd-docs-row-1': 'var(--fd-banner-height, 0px)',\n '--fd-docs-row-2': 'calc(var(--fd-docs-row-1) + var(--fd-header-height))',\n '--fd-docs-row-3': 'calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))',\n '--fd-sidebar-col': collapsed ? '0px' : 'var(--fd-sidebar-width)',\n ...style,\n } as object\n }\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function LayoutTabs({\n options,\n ...props\n}: ComponentProps<'div'> & {\n options: SidebarTab[];\n}) {\n const pathname = usePathname();\n const selected = useMemo(() => {\n return options.findLast((option) => isTabActive(option, pathname));\n }, [options, pathname]);\n\n return (\n <div\n {...props}\n className={cn(\n 'flex flex-row items-end gap-6 overflow-auto [grid-area:main]',\n props.className,\n )}\n >\n {options.map((option, i) => (\n <Link\n key={i}\n href={option.url}\n className={cn(\n 'inline-flex border-b-2 border-transparent transition-colors items-center pb-1.5 font-medium gap-2 text-fd-muted-foreground text-sm text-nowrap hover:text-fd-accent-foreground',\n option.unlisted && selected !== option && 'hidden',\n selected === option && 'border-fd-primary text-fd-primary',\n )}\n >\n {option.title}\n </Link>\n ))}\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../src/layouts/docs/client.tsx"],"sourcesContent":["'use client';\n\nimport { type ComponentProps, createContext, type ReactNode, use, useMemo } from 'react';\nimport { cn } from '@/utils/cn';\nimport { useSidebar } from '@/components/sidebar/base';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { isTabActive } from '@/components/sidebar/tabs/dropdown';\nimport Link from 'fumadocs-core/link';\nimport type { SidebarTab } from '@/components/sidebar/tabs';\nimport { useIsScrollTop } from '@/utils/use-is-scroll-top';\n\nexport const LayoutContext = createContext<{\n isNavTransparent: boolean;\n} | null>(null);\n\nexport function LayoutContextProvider({\n navTransparentMode = 'none',\n children,\n}: {\n navTransparentMode?: 'always' | 'top' | 'none';\n children: ReactNode;\n}) {\n const isTop = useIsScrollTop({ enabled: navTransparentMode === 'top' }) ?? true;\n const isNavTransparent = navTransparentMode === 'top' ? isTop : navTransparentMode === 'always';\n\n return (\n <LayoutContext\n value={useMemo(\n () => ({\n isNavTransparent,\n }),\n [isNavTransparent],\n )}\n >\n {children}\n </LayoutContext>\n );\n}\n\nexport function LayoutHeader(props: ComponentProps<'header'>) {\n const { isNavTransparent } = use(LayoutContext)!;\n\n return (\n <header data-transparent={isNavTransparent} {...props}>\n {props.children}\n </header>\n );\n}\n\nexport function LayoutBody({ className, style, children, ...props }: ComponentProps<'div'>) {\n const { collapsed } = useSidebar();\n\n return (\n <div\n id=\"nd-docs-layout\"\n className={cn(\n 'grid transition-[grid-template-columns] overflow-x-clip min-h-(--fd-docs-height) [--fd-docs-height:100dvh] [--fd-header-height:0px] [--fd-toc-popover-height:0px] [--fd-sidebar-width:0px] [--fd-toc-width:0px]',\n className,\n )}\n data-sidebar-collapsed={collapsed}\n style={\n {\n gridTemplate: `\"sidebar sidebar header toc toc\"\n \"sidebar sidebar toc-popover toc toc\"\n \"sidebar sidebar main toc toc\" 1fr / minmax(min-content, 1fr) var(--fd-sidebar-col) minmax(0, calc(var(--fd-layout-width,97rem) - var(--fd-sidebar-width) - var(--fd-toc-width))) var(--fd-toc-width) minmax(min-content, 1fr)`,\n '--fd-docs-row-1': 'var(--fd-banner-height, 0px)',\n '--fd-docs-row-2': 'calc(var(--fd-docs-row-1) + var(--fd-header-height))',\n '--fd-docs-row-3': 'calc(var(--fd-docs-row-2) + var(--fd-toc-popover-height))',\n '--fd-sidebar-col': collapsed ? '0px' : 'var(--fd-sidebar-width)',\n ...style,\n } as object\n }\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport function LayoutTabs({\n options,\n ...props\n}: ComponentProps<'div'> & {\n options: SidebarTab[];\n}) {\n const pathname = usePathname();\n const selected = useMemo(() => {\n return options.findLast((option) => isTabActive(option, pathname));\n }, [options, pathname]);\n\n return (\n <div\n {...props}\n className={cn(\n 'flex flex-row items-end gap-6 overflow-auto [grid-area:main]',\n props.className,\n )}\n >\n {options.map((option, i) => (\n <Link\n key={i}\n href={option.url}\n className={cn(\n 'inline-flex border-b-2 border-transparent transition-colors items-center pb-1.5 font-medium gap-2 text-fd-muted-foreground text-sm text-nowrap hover:text-fd-accent-foreground',\n option.unlisted && selected !== option && 'hidden',\n selected === option && 'border-fd-primary text-fd-primary',\n )}\n >\n {option.title}\n </Link>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAa,gBAAgB,cAEnB,KAAK;AAEf,SAAgB,sBAAsB,EACpC,qBAAqB,QACrB,YAIC;CACD,MAAM,QAAQ,eAAe,EAAE,SAAS,uBAAuB,OAAO,CAAC,IAAI;CAC3E,MAAM,mBAAmB,uBAAuB,QAAQ,QAAQ,uBAAuB;AAEvF,QACE,oBAAC,eAAD;EACE,OAAO,eACE,EACL,kBACD,GACD,CAAC,iBAAiB,CACnB;EAEA;EACa,CAAA;;AAIpB,SAAgB,aAAa,OAAiC;CAC5D,MAAM,EAAE,qBAAqB,IAAI,cAAc;AAE/C,QACE,oBAAC,UAAD;EAAQ,oBAAkB;EAAkB,GAAI;YAC7C,MAAM;EACA,CAAA;;AAIb,SAAgB,WAAW,EAAE,WAAW,OAAO,UAAU,GAAG,SAAgC;CAC1F,MAAM,EAAE,cAAc,YAAY;AAElC,QACE,oBAAC,OAAD;EACE,IAAG;EACH,WAAW,GACT,mNACA,UACD;EACD,0BAAwB;EACxB,OACE;GACE,cAAc;;;GAGd,mBAAmB;GACnB,mBAAmB;GACnB,mBAAmB;GACnB,oBAAoB,YAAY,QAAQ;GACxC,GAAG;GACJ;EAEH,GAAI;EAEH;EACG,CAAA;;AAIV,SAAgB,WAAW,EACzB,SACA,GAAG,SAGF;CACD,MAAM,WAAW,aAAa;CAC9B,MAAM,WAAW,cAAc;AAC7B,SAAO,QAAQ,UAAU,WAAW,YAAY,QAAQ,SAAS,CAAC;IACjE,CAAC,SAAS,SAAS,CAAC;AAEvB,QACE,oBAAC,OAAD;EACE,GAAI;EACJ,WAAW,GACT,gEACA,MAAM,UACP;YAEA,QAAQ,KAAK,QAAQ,MACpB,oBAAC,MAAD;GAEE,MAAM,OAAO;GACb,WAAW,GACT,kLACA,OAAO,YAAY,aAAa,UAAU,UAC1C,aAAa,UAAU,oCACxB;aAEA,OAAO;GACH,EATA,EASA,CACP;EACE,CAAA"}
|
|
@@ -13,7 +13,6 @@ import { getSidebarTabs } from "../../components/sidebar/tabs/index.js";
|
|
|
13
13
|
import { useMemo } from "react";
|
|
14
14
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
15
15
|
import { Languages, Sidebar } from "lucide-react";
|
|
16
|
-
|
|
17
16
|
//#region src/layouts/docs/index.tsx
|
|
18
17
|
function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled = true, defaultOpenLevel, prefetch, ...sidebarProps } = {}, searchToggle = {}, themeSwitch = {}, tabMode = "auto", i18n = false, children, tree, ...props }) {
|
|
19
18
|
const tabs = useMemo(() => {
|
|
@@ -172,7 +171,7 @@ function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: si
|
|
|
172
171
|
})
|
|
173
172
|
});
|
|
174
173
|
}
|
|
175
|
-
|
|
176
174
|
//#endregion
|
|
177
175
|
export { DocsLayout };
|
|
176
|
+
|
|
178
177
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SidebarIcon","Sidebar"],"sources":["../../../src/layouts/docs/index.tsx"],"sourcesContent":["import type * as PageTree from 'fumadocs-core/page-tree';\nimport { type ComponentProps, type HTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { Languages, Sidebar as SidebarIcon } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\nimport {\n Sidebar,\n SidebarCollapseTrigger,\n SidebarContent,\n SidebarDrawer,\n SidebarLinkItem,\n SidebarPageTree,\n SidebarTrigger,\n SidebarViewport,\n} from './sidebar';\nimport { type BaseLayoutProps, renderTitleNav, useLinkItems } from '@/layouts/shared';\nimport { LinkItem } from '@/utils/link-item';\nimport { LanguageToggle, LanguageToggleText } from '@/layouts/shared/language-toggle';\nimport { LayoutBody, LayoutContextProvider, LayoutHeader, LayoutTabs } from './client';\nimport { TreeContextProvider } from '@/contexts/tree';\nimport { ThemeToggle } from '../shared/theme-toggle';\nimport { LargeSearchToggle, SearchToggle } from '@/layouts/shared/search-toggle';\nimport { getSidebarTabs, type GetSidebarTabsOptions } from '@/components/sidebar/tabs';\nimport type { SidebarPageTreeComponents } from '@/components/sidebar/page-tree';\nimport { SidebarTabsDropdown, type SidebarTabWithProps } from '@/components/sidebar/tabs/dropdown';\n\nexport interface DocsLayoutProps extends BaseLayoutProps {\n tree: PageTree.Root;\n\n sidebar?: SidebarOptions;\n\n tabMode?: 'top' | 'auto';\n\n /**\n * Props for the `div` container\n */\n containerProps?: HTMLAttributes<HTMLDivElement>;\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 /**\n * Support collapsing the sidebar on desktop mode\n *\n * @defaultValue true\n */\n collapsible?: boolean;\n}\n\nexport function DocsLayout({\n nav: { transparentMode, ...nav } = {},\n sidebar: {\n tabs: sidebarTabs,\n enabled: sidebarEnabled = true,\n defaultOpenLevel,\n prefetch,\n ...sidebarProps\n } = {},\n searchToggle = {},\n themeSwitch = {},\n tabMode = 'auto',\n i18n = false,\n children,\n tree,\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\n function sidebar() {\n const { footer, banner, collapsible = true, component, components, ...rest } = sidebarProps;\n if (component) return component;\n\n const iconLinks = menuItems.filter((item) => item.type === 'icon');\n const viewport = (\n <SidebarViewport>\n {menuItems\n .filter((v) => v.type !== 'icon')\n .map((item, i, list) => (\n <SidebarLinkItem key={i} item={item} className={cn(i === list.length - 1 && 'mb-4')} />\n ))}\n <SidebarPageTree {...components} />\n </SidebarViewport>\n );\n\n return (\n <>\n <SidebarContent {...rest}>\n <div className=\"flex flex-col gap-3 p-4 pb-2\">\n <div className=\"flex\">\n {renderTitleNav(nav, {\n className: 'inline-flex text-[0.9375rem] items-center gap-2.5 font-medium me-auto',\n })}\n {nav.children}\n {collapsible && (\n <SidebarCollapseTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'mb-auto text-fd-muted-foreground',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarCollapseTrigger>\n )}\n </div>\n {searchToggle.enabled !== false &&\n (searchToggle.components?.lg ?? <LargeSearchToggle hideIfDisabled />)}\n {tabs.length > 0 && tabMode === 'auto' && <SidebarTabsDropdown options={tabs} />}\n {banner}\n </div>\n {viewport}\n {(i18n || iconLinks.length > 0 || themeSwitch?.enabled !== false || footer) && (\n <div className=\"flex flex-col border-t p-4 pt-2 empty:hidden\">\n <div className=\"flex text-fd-muted-foreground items-center empty:hidden\">\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n </LanguageToggle>\n )}\n {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 {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? (\n <ThemeToggle className=\"ms-auto p-0\" mode={themeSwitch.mode} />\n ))}\n </div>\n {footer}\n </div>\n )}\n </SidebarContent>\n <SidebarDrawer>\n <div className=\"flex flex-col gap-3 p-4 pb-2\">\n <div className=\"flex text-fd-muted-foreground items-center gap-1.5\">\n <div className=\"flex flex-1\">\n {iconLinks.map((item, i) => (\n <LinkItem\n key={i}\n item={item}\n className={cn(\n buttonVariants({\n size: 'icon-sm',\n color: 'ghost',\n className: 'p-2',\n }),\n )}\n aria-label={item.label}\n >\n {item.icon}\n </LinkItem>\n ))}\n </div>\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n <LanguageToggleText />\n </LanguageToggle>\n )}\n {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? <ThemeToggle className=\"p-0\" mode={themeSwitch.mode} />)}\n <SidebarTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'p-2',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarTrigger>\n </div>\n {tabs.length > 0 && <SidebarTabsDropdown options={tabs} />}\n {banner}\n </div>\n {viewport}\n <div className=\"flex flex-col border-t p-4 pt-2 empty:hidden\">{footer}</div>\n </SidebarDrawer>\n </>\n );\n }\n\n return (\n <TreeContextProvider tree={tree}>\n <LayoutContextProvider navTransparentMode={transparentMode}>\n <Sidebar defaultOpenLevel={defaultOpenLevel} prefetch={prefetch}>\n <LayoutBody {...props.containerProps}>\n {nav.enabled !== false &&\n (nav.component ?? (\n <LayoutHeader\n id=\"nd-subnav\"\n className=\"[grid-area:header] sticky top-(--fd-docs-row-1) z-30 flex items-center ps-4 pe-2.5 border-b transition-colors backdrop-blur-sm h-(--fd-header-height) md:hidden max-md:layout:[--fd-header-height:--spacing(14)] data-[transparent=false]:bg-fd-background/80\"\n >\n {renderTitleNav(nav, {\n className: 'inline-flex items-center gap-2.5 font-semibold',\n })}\n <div className=\"flex-1\">{nav.children}</div>\n {searchToggle.enabled !== false &&\n (searchToggle.components?.sm ?? (\n <SearchToggle className=\"p-2\" hideIfDisabled />\n ))}\n {sidebarEnabled && (\n <SidebarTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'p-2',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarTrigger>\n )}\n </LayoutHeader>\n ))}\n {sidebarEnabled && sidebar()}\n {tabMode === 'top' && tabs.length > 0 && (\n <LayoutTabs\n options={tabs}\n className=\"z-10 bg-fd-background border-b px-6 pt-3 xl:px-8 max-md:hidden\"\n />\n )}\n {children}\n </LayoutBody>\n </Sidebar>\n </LayoutContextProvider>\n </TreeContextProvider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["SidebarIcon","Sidebar"],"sources":["../../../src/layouts/docs/index.tsx"],"sourcesContent":["import type * as PageTree from 'fumadocs-core/page-tree';\nimport { type ComponentProps, type HTMLAttributes, type ReactNode, useMemo } from 'react';\nimport { Languages, Sidebar as SidebarIcon } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\nimport {\n Sidebar,\n SidebarCollapseTrigger,\n SidebarContent,\n SidebarDrawer,\n SidebarLinkItem,\n SidebarPageTree,\n SidebarTrigger,\n SidebarViewport,\n} from './sidebar';\nimport { type BaseLayoutProps, renderTitleNav, useLinkItems } from '@/layouts/shared';\nimport { LinkItem } from '@/utils/link-item';\nimport { LanguageToggle, LanguageToggleText } from '@/layouts/shared/language-toggle';\nimport { LayoutBody, LayoutContextProvider, LayoutHeader, LayoutTabs } from './client';\nimport { TreeContextProvider } from '@/contexts/tree';\nimport { ThemeToggle } from '../shared/theme-toggle';\nimport { LargeSearchToggle, SearchToggle } from '@/layouts/shared/search-toggle';\nimport { getSidebarTabs, type GetSidebarTabsOptions } from '@/components/sidebar/tabs';\nimport type { SidebarPageTreeComponents } from '@/components/sidebar/page-tree';\nimport { SidebarTabsDropdown, type SidebarTabWithProps } from '@/components/sidebar/tabs/dropdown';\n\nexport interface DocsLayoutProps extends BaseLayoutProps {\n tree: PageTree.Root;\n\n sidebar?: SidebarOptions;\n\n tabMode?: 'top' | 'auto';\n\n /**\n * Props for the `div` container\n */\n containerProps?: HTMLAttributes<HTMLDivElement>;\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 /**\n * Support collapsing the sidebar on desktop mode\n *\n * @defaultValue true\n */\n collapsible?: boolean;\n}\n\nexport function DocsLayout({\n nav: { transparentMode, ...nav } = {},\n sidebar: {\n tabs: sidebarTabs,\n enabled: sidebarEnabled = true,\n defaultOpenLevel,\n prefetch,\n ...sidebarProps\n } = {},\n searchToggle = {},\n themeSwitch = {},\n tabMode = 'auto',\n i18n = false,\n children,\n tree,\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\n function sidebar() {\n const { footer, banner, collapsible = true, component, components, ...rest } = sidebarProps;\n if (component) return component;\n\n const iconLinks = menuItems.filter((item) => item.type === 'icon');\n const viewport = (\n <SidebarViewport>\n {menuItems\n .filter((v) => v.type !== 'icon')\n .map((item, i, list) => (\n <SidebarLinkItem key={i} item={item} className={cn(i === list.length - 1 && 'mb-4')} />\n ))}\n <SidebarPageTree {...components} />\n </SidebarViewport>\n );\n\n return (\n <>\n <SidebarContent {...rest}>\n <div className=\"flex flex-col gap-3 p-4 pb-2\">\n <div className=\"flex\">\n {renderTitleNav(nav, {\n className: 'inline-flex text-[0.9375rem] items-center gap-2.5 font-medium me-auto',\n })}\n {nav.children}\n {collapsible && (\n <SidebarCollapseTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'mb-auto text-fd-muted-foreground',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarCollapseTrigger>\n )}\n </div>\n {searchToggle.enabled !== false &&\n (searchToggle.components?.lg ?? <LargeSearchToggle hideIfDisabled />)}\n {tabs.length > 0 && tabMode === 'auto' && <SidebarTabsDropdown options={tabs} />}\n {banner}\n </div>\n {viewport}\n {(i18n || iconLinks.length > 0 || themeSwitch?.enabled !== false || footer) && (\n <div className=\"flex flex-col border-t p-4 pt-2 empty:hidden\">\n <div className=\"flex text-fd-muted-foreground items-center empty:hidden\">\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n </LanguageToggle>\n )}\n {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 {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? (\n <ThemeToggle className=\"ms-auto p-0\" mode={themeSwitch.mode} />\n ))}\n </div>\n {footer}\n </div>\n )}\n </SidebarContent>\n <SidebarDrawer>\n <div className=\"flex flex-col gap-3 p-4 pb-2\">\n <div className=\"flex text-fd-muted-foreground items-center gap-1.5\">\n <div className=\"flex flex-1\">\n {iconLinks.map((item, i) => (\n <LinkItem\n key={i}\n item={item}\n className={cn(\n buttonVariants({\n size: 'icon-sm',\n color: 'ghost',\n className: 'p-2',\n }),\n )}\n aria-label={item.label}\n >\n {item.icon}\n </LinkItem>\n ))}\n </div>\n {i18n && (\n <LanguageToggle>\n <Languages className=\"size-4.5\" />\n <LanguageToggleText />\n </LanguageToggle>\n )}\n {themeSwitch.enabled !== false &&\n (themeSwitch.component ?? <ThemeToggle className=\"p-0\" mode={themeSwitch.mode} />)}\n <SidebarTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'p-2',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarTrigger>\n </div>\n {tabs.length > 0 && <SidebarTabsDropdown options={tabs} />}\n {banner}\n </div>\n {viewport}\n <div className=\"flex flex-col border-t p-4 pt-2 empty:hidden\">{footer}</div>\n </SidebarDrawer>\n </>\n );\n }\n\n return (\n <TreeContextProvider tree={tree}>\n <LayoutContextProvider navTransparentMode={transparentMode}>\n <Sidebar defaultOpenLevel={defaultOpenLevel} prefetch={prefetch}>\n <LayoutBody {...props.containerProps}>\n {nav.enabled !== false &&\n (nav.component ?? (\n <LayoutHeader\n id=\"nd-subnav\"\n className=\"[grid-area:header] sticky top-(--fd-docs-row-1) z-30 flex items-center ps-4 pe-2.5 border-b transition-colors backdrop-blur-sm h-(--fd-header-height) md:hidden max-md:layout:[--fd-header-height:--spacing(14)] data-[transparent=false]:bg-fd-background/80\"\n >\n {renderTitleNav(nav, {\n className: 'inline-flex items-center gap-2.5 font-semibold',\n })}\n <div className=\"flex-1\">{nav.children}</div>\n {searchToggle.enabled !== false &&\n (searchToggle.components?.sm ?? (\n <SearchToggle className=\"p-2\" hideIfDisabled />\n ))}\n {sidebarEnabled && (\n <SidebarTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'p-2',\n }),\n )}\n >\n <SidebarIcon />\n </SidebarTrigger>\n )}\n </LayoutHeader>\n ))}\n {sidebarEnabled && sidebar()}\n {tabMode === 'top' && tabs.length > 0 && (\n <LayoutTabs\n options={tabs}\n className=\"z-10 bg-fd-background border-b px-6 pt-3 xl:px-8 max-md:hidden\"\n />\n )}\n {children}\n </LayoutBody>\n </Sidebar>\n </LayoutContextProvider>\n </TreeContextProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA+DA,SAAgB,WAAW,EACzB,KAAK,EAAE,iBAAiB,GAAG,QAAQ,EAAE,EACrC,SAAS,EACP,MAAM,aACN,SAAS,iBAAiB,MAC1B,kBACA,UACA,GAAG,iBACD,EAAE,EACN,eAAe,EAAE,EACjB,cAAc,EAAE,EAChB,UAAU,QACV,OAAO,OACP,UACA,MACA,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;CAEzC,SAAS,UAAU;EACjB,MAAM,EAAE,QAAQ,QAAQ,cAAc,MAAM,WAAW,YAAY,GAAG,SAAS;AAC/E,MAAI,UAAW,QAAO;EAEtB,MAAM,YAAY,UAAU,QAAQ,SAAS,KAAK,SAAS,OAAO;EAClE,MAAM,WACJ,qBAAC,iBAAD,EAAA,UAAA,CACG,UACE,QAAQ,MAAM,EAAE,SAAS,OAAO,CAChC,KAAK,MAAM,GAAG,SACb,oBAAC,iBAAD;GAA+B;GAAM,WAAW,GAAG,MAAM,KAAK,SAAS,KAAK,OAAO;GAAI,EAAjE,EAAiE,CACvF,EACJ,oBAAC,iBAAD,EAAiB,GAAI,YAAc,CAAA,CACnB,EAAA,CAAA;AAGpB,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,qBAAC,gBAAD;GAAgB,GAAI;aAApB;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,qBAAC,OAAD;OAAK,WAAU;iBAAf;QACG,eAAe,KAAK,EACnB,WAAW,yEACZ,CAAC;QACD,IAAI;QACJ,eACC,oBAAC,wBAAD;SACE,WAAW,GACT,eAAe;UACb,OAAO;UACP,MAAM;UACN,WAAW;UACZ,CAAC,CACH;mBAED,oBAACA,SAAD,EAAe,CAAA;SACQ,CAAA;QAEvB;;MACL,aAAa,YAAY,UACvB,aAAa,YAAY,MAAM,oBAAC,mBAAD,EAAmB,gBAAA,MAAiB,CAAA;MACrE,KAAK,SAAS,KAAK,YAAY,UAAU,oBAAC,qBAAD,EAAqB,SAAS,MAAQ,CAAA;MAC/E;MACG;;IACL;KACC,QAAQ,UAAU,SAAS,KAAK,aAAa,YAAY,SAAS,WAClE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,QACC,oBAAC,gBAAD,EAAA,UACE,oBAAC,WAAD,EAAW,WAAU,YAAa,CAAA,EACnB,CAAA;OAElB,UAAU,KAAK,MAAM,MACpB,oBAAC,UAAD;QAEQ;QACN,WAAW,GAAG,eAAe;SAAE,MAAM;SAAW,OAAO;SAAS,CAAC,CAAC;QAClE,cAAY,KAAK;kBAEhB,KAAK;QACG,EANJ,EAMI,CACX;OACD,YAAY,YAAY,UACtB,YAAY,aACX,oBAAC,aAAD;QAAa,WAAU;QAAc,MAAM,YAAY;QAAQ,CAAA;OAE/D;SACL,OACG;;IAEO;MACjB,qBAAC,eAAD,EAAA,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,oBAAC,OAAD;QAAK,WAAU;kBACZ,UAAU,KAAK,MAAM,MACpB,oBAAC,UAAD;SAEQ;SACN,WAAW,GACT,eAAe;UACb,MAAM;UACN,OAAO;UACP,WAAW;UACZ,CAAC,CACH;SACD,cAAY,KAAK;mBAEhB,KAAK;SACG,EAZJ,EAYI,CACX;QACE,CAAA;OACL,QACC,qBAAC,gBAAD,EAAA,UAAA,CACE,oBAAC,WAAD,EAAW,WAAU,YAAa,CAAA,EAClC,oBAAC,oBAAD,EAAsB,CAAA,CACP,EAAA,CAAA;OAElB,YAAY,YAAY,UACtB,YAAY,aAAa,oBAAC,aAAD;QAAa,WAAU;QAAM,MAAM,YAAY;QAAQ,CAAA;OACnF,oBAAC,gBAAD;QACE,WAAW,GACT,eAAe;SACb,OAAO;SACP,MAAM;SACN,WAAW;SACZ,CAAC,CACH;kBAED,oBAACA,SAAD,EAAe,CAAA;QACA,CAAA;OACb;;KACL,KAAK,SAAS,KAAK,oBAAC,qBAAD,EAAqB,SAAS,MAAQ,CAAA;KACzD;KACG;;GACL;GACD,oBAAC,OAAD;IAAK,WAAU;cAAgD;IAAa,CAAA;GAC9D,EAAA,CAAA,CACf,EAAA,CAAA;;AAIP,QACE,oBAAC,qBAAD;EAA2B;YACzB,oBAAC,uBAAD;GAAuB,oBAAoB;aACzC,oBAACC,WAAD;IAA2B;IAA4B;cACrD,qBAAC,YAAD;KAAY,GAAI,MAAM;eAAtB;MACG,IAAI,YAAY,UACd,IAAI,aACH,qBAAC,cAAD;OACE,IAAG;OACH,WAAU;iBAFZ;QAIG,eAAe,KAAK,EACnB,WAAW,kDACZ,CAAC;QACF,oBAAC,OAAD;SAAK,WAAU;mBAAU,IAAI;SAAe,CAAA;QAC3C,aAAa,YAAY,UACvB,aAAa,YAAY,MACxB,oBAAC,cAAD;SAAc,WAAU;SAAM,gBAAA;SAAiB,CAAA;QAElD,kBACC,oBAAC,gBAAD;SACE,WAAW,GACT,eAAe;UACb,OAAO;UACP,MAAM;UACN,WAAW;UACZ,CAAC,CACH;mBAED,oBAACD,SAAD,EAAe,CAAA;SACA,CAAA;QAEN;;MAElB,kBAAkB,SAAS;MAC3B,YAAY,SAAS,KAAK,SAAS,KAClC,oBAAC,YAAD;OACE,SAAS;OACT,WAAU;OACV,CAAA;MAEH;MACU;;IACL,CAAA;GACY,CAAA;EACJ,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { useI18n } from "../../../contexts/i18n.js";
|
|
4
3
|
import { cn } from "../../../utils/cn.js";
|
|
5
4
|
import { useTreeContext, useTreePath } from "../../../contexts/tree.js";
|
|
@@ -15,7 +14,6 @@ import Link from "fumadocs-core/link";
|
|
|
15
14
|
import { ChevronDown, ChevronLeft, ChevronRight } from "lucide-react";
|
|
16
15
|
import { getBreadcrumbItemsFromPath } from "fumadocs-core/breadcrumb";
|
|
17
16
|
import { useActiveAnchor } from "fumadocs-core/toc";
|
|
18
|
-
|
|
19
17
|
//#region src/layouts/docs/page/client.tsx
|
|
20
18
|
const TocPopoverContext = createContext(null);
|
|
21
19
|
function PageTOCPopover({ className, children, ...rest }) {
|
|
@@ -221,7 +219,7 @@ function PageBreadcrumb({ includeRoot, includeSeparator, includePage, ...props }
|
|
|
221
219
|
})
|
|
222
220
|
});
|
|
223
221
|
}
|
|
224
|
-
|
|
225
222
|
//#endregion
|
|
226
223
|
export { PageBreadcrumb, PageFooter, PageLastUpdate, PageTOCPopover, PageTOCPopoverContent, PageTOCPopoverTrigger };
|
|
224
|
+
|
|
227
225
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../../src/layouts/docs/page/client.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n use,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport Link from 'fumadocs-core/link';\nimport { cn } from '@/utils/cn';\nimport { useI18n } from '@/contexts/i18n';\nimport { useTreeContext, useTreePath } from '@/contexts/tree';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { type BreadcrumbOptions, getBreadcrumbItemsFromPath } from 'fumadocs-core/breadcrumb';\nimport { isActive } from '@/utils/urls';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport { useTOCItems } from '@/components/toc';\nimport { useActiveAnchor } from 'fumadocs-core/toc';\nimport { LayoutContext } from '../client';\nimport { useFooterItems } from '@/utils/use-footer-items';\n\nconst TocPopoverContext = createContext<{\n open: boolean;\n setOpen: (open: boolean) => void;\n} | null>(null);\n\nexport function PageTOCPopover({ className, children, ...rest }: ComponentProps<'div'>) {\n const ref = useRef<HTMLElement>(null);\n const [open, setOpen] = useState(false);\n const { isNavTransparent } = use(LayoutContext)!;\n\n const onClick = useEffectEvent((e: Event) => {\n if (!open) return;\n\n if (ref.current && !ref.current.contains(e.target as HTMLElement)) setOpen(false);\n });\n\n useEffect(() => {\n window.addEventListener('click', onClick);\n\n return () => {\n window.removeEventListener('click', onClick);\n };\n }, []);\n\n return (\n <TocPopoverContext\n value={useMemo(\n () => ({\n open,\n setOpen,\n }),\n [setOpen, open],\n )}\n >\n <Collapsible\n open={open}\n onOpenChange={setOpen}\n data-toc-popover=\"\"\n className={cn(\n 'sticky top-(--fd-docs-row-2) z-10 [grid-area:toc-popover] h-(--fd-toc-popover-height) xl:hidden max-xl:layout:[--fd-toc-popover-height:--spacing(10)]',\n className,\n )}\n {...rest}\n >\n <header\n ref={ref}\n className={cn(\n 'border-b backdrop-blur-sm transition-colors',\n (!isNavTransparent || open) && 'bg-fd-background/80',\n open && 'shadow-lg',\n )}\n >\n {children}\n </header>\n </Collapsible>\n </TocPopoverContext>\n );\n}\n\nexport function PageTOCPopoverTrigger({ className, ...props }: ComponentProps<'button'>) {\n const { text } = useI18n();\n const { open } = use(TocPopoverContext)!;\n const items = useTOCItems();\n const active = useActiveAnchor();\n const selected = useMemo(\n () => items.findIndex((item) => active === item.url.slice(1)),\n [items, active],\n );\n const path = useTreePath().at(-1);\n const showItem = selected !== -1 && !open;\n\n return (\n <CollapsibleTrigger\n className={cn(\n 'flex w-full h-10 items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:size-4 md:px-6',\n className,\n )}\n data-toc-popover-trigger=\"\"\n {...props}\n >\n <ProgressCircle\n value={(selected + 1) / Math.max(1, items.length)}\n max={1}\n className={cn('shrink-0', open && 'text-fd-primary')}\n />\n <span className=\"grid flex-1 *:my-auto *:row-start-1 *:col-start-1\">\n <span\n className={cn(\n 'truncate transition-all',\n open && 'text-fd-foreground',\n showItem && 'opacity-0 -translate-y-full pointer-events-none',\n )}\n >\n {path?.name ?? text.toc}\n </span>\n <span\n className={cn(\n 'truncate transition-all',\n !showItem && 'opacity-0 translate-y-full pointer-events-none',\n )}\n >\n {items[selected]?.title}\n </span>\n </span>\n <ChevronDown className={cn('shrink-0 transition-transform mx-0.5', open && 'rotate-180')} />\n </CollapsibleTrigger>\n );\n}\n\ninterface ProgressCircleProps extends Omit<React.ComponentProps<'svg'>, 'strokeWidth'> {\n value: number;\n strokeWidth?: number;\n size?: number;\n min?: number;\n max?: number;\n}\n\nfunction clamp(input: number, min: number, max: number): number {\n if (input < min) return min;\n if (input > max) return max;\n return input;\n}\n\nfunction ProgressCircle({\n value,\n strokeWidth = 2,\n size = 24,\n min = 0,\n max = 100,\n ...restSvgProps\n}: ProgressCircleProps) {\n const normalizedValue = clamp(value, min, max);\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const progress = (normalizedValue / max) * circumference;\n const circleProps = {\n cx: size / 2,\n cy: size / 2,\n r: radius,\n fill: 'none',\n strokeWidth,\n };\n\n return (\n <svg\n role=\"progressbar\"\n viewBox={`0 0 ${size} ${size}`}\n aria-valuenow={normalizedValue}\n aria-valuemin={min}\n aria-valuemax={max}\n {...restSvgProps}\n >\n <circle {...circleProps} className=\"stroke-current/25\" />\n <circle\n {...circleProps}\n stroke=\"currentColor\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference - progress}\n strokeLinecap=\"round\"\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n className=\"transition-all\"\n />\n </svg>\n );\n}\n\nexport function PageTOCPopoverContent(props: ComponentProps<'div'>) {\n return (\n <CollapsibleContent\n data-toc-popover-content=\"\"\n {...props}\n className={cn('flex flex-col px-4 max-h-[50vh] md:px-6', props.className)}\n >\n <div>{props.children}</div>\n </CollapsibleContent>\n );\n}\n\nexport function PageLastUpdate({\n date: value,\n ...props\n}: Omit<ComponentProps<'p'>, 'children'> & { date: Date }) {\n const { text } = useI18n();\n const [date, setDate] = useState('');\n\n useEffect(() => {\n // to the timezone of client\n setDate(value.toLocaleDateString());\n }, [value]);\n\n return (\n <p {...props} className={cn('text-sm text-fd-muted-foreground', props.className)}>\n {text.lastUpdate} {date}\n </p>\n );\n}\n\ntype Item = Pick<PageTree.Item, 'name' | 'description' | 'url'>;\nexport interface FooterProps extends ComponentProps<'div'> {\n /**\n * Items including information for the next and previous page\n */\n items?: {\n previous?: Item;\n next?: Item;\n };\n}\n\nexport function PageFooter({ items, children, className, ...props }: FooterProps) {\n const footerList = useFooterItems();\n const pathname = usePathname();\n\n const { previous, next } = useMemo(() => {\n if (items) return items;\n\n const idx = footerList.findIndex((item) => isActive(item.url, pathname));\n\n if (idx === -1) return {};\n return {\n previous: footerList[idx - 1],\n next: footerList[idx + 1],\n };\n }, [footerList, items, pathname]);\n\n return (\n <>\n <div\n className={cn(\n '@container grid gap-4',\n previous && next ? 'grid-cols-2' : 'grid-cols-1',\n className,\n )}\n {...props}\n >\n {previous && <FooterItem item={previous} index={0} />}\n {next && <FooterItem item={next} index={1} />}\n </div>\n {children}\n </>\n );\n}\n\nfunction FooterItem({ item, index }: { item: Item; index: 0 | 1 }) {\n const { text } = useI18n();\n const Icon = index === 0 ? ChevronLeft : ChevronRight;\n\n return (\n <Link\n href={item.url}\n className={cn(\n 'flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground @max-lg:col-span-full',\n index === 1 && 'text-end',\n )}\n >\n <div\n className={cn(\n 'inline-flex items-center gap-1.5 font-medium',\n index === 1 && 'flex-row-reverse',\n )}\n >\n <Icon className=\"-mx-1 size-4 shrink-0 rtl:rotate-180\" />\n <p>{item.name}</p>\n </div>\n <p className=\"text-fd-muted-foreground truncate\">\n {item.description ?? (index === 0 ? text.previousPage : text.nextPage)}\n </p>\n </Link>\n );\n}\n\nexport type BreadcrumbProps = BreadcrumbOptions & ComponentProps<'div'>;\n\nexport function PageBreadcrumb({\n includeRoot,\n includeSeparator,\n includePage,\n ...props\n}: BreadcrumbProps) {\n const path = useTreePath();\n const { root } = useTreeContext();\n const items = useMemo(() => {\n return getBreadcrumbItemsFromPath(root, path, {\n includePage,\n includeSeparator,\n includeRoot,\n });\n }, [includePage, includeRoot, includeSeparator, path, root]);\n\n if (items.length === 0) return null;\n\n return (\n <div\n {...props}\n className={cn('flex items-center gap-1.5 text-sm text-fd-muted-foreground', props.className)}\n >\n {items.map((item, i) => {\n const className = cn('truncate', i === items.length - 1 && 'text-fd-primary font-medium');\n\n return (\n <Fragment key={i}>\n {i !== 0 && <ChevronRight className=\"size-3.5 shrink-0\" />}\n {item.url ? (\n <Link\n href={item.url}\n className={cn(className, 'transition-opacity hover:opacity-80')}\n >\n {item.name}\n </Link>\n ) : (\n <span className={className}>{item.name}</span>\n )}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../../src/layouts/docs/page/client.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n use,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport Link from 'fumadocs-core/link';\nimport { cn } from '@/utils/cn';\nimport { useI18n } from '@/contexts/i18n';\nimport { useTreeContext, useTreePath } from '@/contexts/tree';\nimport type * as PageTree from 'fumadocs-core/page-tree';\nimport { usePathname } from 'fumadocs-core/framework';\nimport { type BreadcrumbOptions, getBreadcrumbItemsFromPath } from 'fumadocs-core/breadcrumb';\nimport { isActive } from '@/utils/urls';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible';\nimport { useTOCItems } from '@/components/toc';\nimport { useActiveAnchor } from 'fumadocs-core/toc';\nimport { LayoutContext } from '../client';\nimport { useFooterItems } from '@/utils/use-footer-items';\n\nconst TocPopoverContext = createContext<{\n open: boolean;\n setOpen: (open: boolean) => void;\n} | null>(null);\n\nexport function PageTOCPopover({ className, children, ...rest }: ComponentProps<'div'>) {\n const ref = useRef<HTMLElement>(null);\n const [open, setOpen] = useState(false);\n const { isNavTransparent } = use(LayoutContext)!;\n\n const onClick = useEffectEvent((e: Event) => {\n if (!open) return;\n\n if (ref.current && !ref.current.contains(e.target as HTMLElement)) setOpen(false);\n });\n\n useEffect(() => {\n window.addEventListener('click', onClick);\n\n return () => {\n window.removeEventListener('click', onClick);\n };\n }, []);\n\n return (\n <TocPopoverContext\n value={useMemo(\n () => ({\n open,\n setOpen,\n }),\n [setOpen, open],\n )}\n >\n <Collapsible\n open={open}\n onOpenChange={setOpen}\n data-toc-popover=\"\"\n className={cn(\n 'sticky top-(--fd-docs-row-2) z-10 [grid-area:toc-popover] h-(--fd-toc-popover-height) xl:hidden max-xl:layout:[--fd-toc-popover-height:--spacing(10)]',\n className,\n )}\n {...rest}\n >\n <header\n ref={ref}\n className={cn(\n 'border-b backdrop-blur-sm transition-colors',\n (!isNavTransparent || open) && 'bg-fd-background/80',\n open && 'shadow-lg',\n )}\n >\n {children}\n </header>\n </Collapsible>\n </TocPopoverContext>\n );\n}\n\nexport function PageTOCPopoverTrigger({ className, ...props }: ComponentProps<'button'>) {\n const { text } = useI18n();\n const { open } = use(TocPopoverContext)!;\n const items = useTOCItems();\n const active = useActiveAnchor();\n const selected = useMemo(\n () => items.findIndex((item) => active === item.url.slice(1)),\n [items, active],\n );\n const path = useTreePath().at(-1);\n const showItem = selected !== -1 && !open;\n\n return (\n <CollapsibleTrigger\n className={cn(\n 'flex w-full h-10 items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:size-4 md:px-6',\n className,\n )}\n data-toc-popover-trigger=\"\"\n {...props}\n >\n <ProgressCircle\n value={(selected + 1) / Math.max(1, items.length)}\n max={1}\n className={cn('shrink-0', open && 'text-fd-primary')}\n />\n <span className=\"grid flex-1 *:my-auto *:row-start-1 *:col-start-1\">\n <span\n className={cn(\n 'truncate transition-all',\n open && 'text-fd-foreground',\n showItem && 'opacity-0 -translate-y-full pointer-events-none',\n )}\n >\n {path?.name ?? text.toc}\n </span>\n <span\n className={cn(\n 'truncate transition-all',\n !showItem && 'opacity-0 translate-y-full pointer-events-none',\n )}\n >\n {items[selected]?.title}\n </span>\n </span>\n <ChevronDown className={cn('shrink-0 transition-transform mx-0.5', open && 'rotate-180')} />\n </CollapsibleTrigger>\n );\n}\n\ninterface ProgressCircleProps extends Omit<React.ComponentProps<'svg'>, 'strokeWidth'> {\n value: number;\n strokeWidth?: number;\n size?: number;\n min?: number;\n max?: number;\n}\n\nfunction clamp(input: number, min: number, max: number): number {\n if (input < min) return min;\n if (input > max) return max;\n return input;\n}\n\nfunction ProgressCircle({\n value,\n strokeWidth = 2,\n size = 24,\n min = 0,\n max = 100,\n ...restSvgProps\n}: ProgressCircleProps) {\n const normalizedValue = clamp(value, min, max);\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const progress = (normalizedValue / max) * circumference;\n const circleProps = {\n cx: size / 2,\n cy: size / 2,\n r: radius,\n fill: 'none',\n strokeWidth,\n };\n\n return (\n <svg\n role=\"progressbar\"\n viewBox={`0 0 ${size} ${size}`}\n aria-valuenow={normalizedValue}\n aria-valuemin={min}\n aria-valuemax={max}\n {...restSvgProps}\n >\n <circle {...circleProps} className=\"stroke-current/25\" />\n <circle\n {...circleProps}\n stroke=\"currentColor\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference - progress}\n strokeLinecap=\"round\"\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n className=\"transition-all\"\n />\n </svg>\n );\n}\n\nexport function PageTOCPopoverContent(props: ComponentProps<'div'>) {\n return (\n <CollapsibleContent\n data-toc-popover-content=\"\"\n {...props}\n className={cn('flex flex-col px-4 max-h-[50vh] md:px-6', props.className)}\n >\n <div>{props.children}</div>\n </CollapsibleContent>\n );\n}\n\nexport function PageLastUpdate({\n date: value,\n ...props\n}: Omit<ComponentProps<'p'>, 'children'> & { date: Date }) {\n const { text } = useI18n();\n const [date, setDate] = useState('');\n\n useEffect(() => {\n // to the timezone of client\n setDate(value.toLocaleDateString());\n }, [value]);\n\n return (\n <p {...props} className={cn('text-sm text-fd-muted-foreground', props.className)}>\n {text.lastUpdate} {date}\n </p>\n );\n}\n\ntype Item = Pick<PageTree.Item, 'name' | 'description' | 'url'>;\nexport interface FooterProps extends ComponentProps<'div'> {\n /**\n * Items including information for the next and previous page\n */\n items?: {\n previous?: Item;\n next?: Item;\n };\n}\n\nexport function PageFooter({ items, children, className, ...props }: FooterProps) {\n const footerList = useFooterItems();\n const pathname = usePathname();\n\n const { previous, next } = useMemo(() => {\n if (items) return items;\n\n const idx = footerList.findIndex((item) => isActive(item.url, pathname));\n\n if (idx === -1) return {};\n return {\n previous: footerList[idx - 1],\n next: footerList[idx + 1],\n };\n }, [footerList, items, pathname]);\n\n return (\n <>\n <div\n className={cn(\n '@container grid gap-4',\n previous && next ? 'grid-cols-2' : 'grid-cols-1',\n className,\n )}\n {...props}\n >\n {previous && <FooterItem item={previous} index={0} />}\n {next && <FooterItem item={next} index={1} />}\n </div>\n {children}\n </>\n );\n}\n\nfunction FooterItem({ item, index }: { item: Item; index: 0 | 1 }) {\n const { text } = useI18n();\n const Icon = index === 0 ? ChevronLeft : ChevronRight;\n\n return (\n <Link\n href={item.url}\n className={cn(\n 'flex flex-col gap-2 rounded-lg border p-4 text-sm transition-colors hover:bg-fd-accent/80 hover:text-fd-accent-foreground @max-lg:col-span-full',\n index === 1 && 'text-end',\n )}\n >\n <div\n className={cn(\n 'inline-flex items-center gap-1.5 font-medium',\n index === 1 && 'flex-row-reverse',\n )}\n >\n <Icon className=\"-mx-1 size-4 shrink-0 rtl:rotate-180\" />\n <p>{item.name}</p>\n </div>\n <p className=\"text-fd-muted-foreground truncate\">\n {item.description ?? (index === 0 ? text.previousPage : text.nextPage)}\n </p>\n </Link>\n );\n}\n\nexport type BreadcrumbProps = BreadcrumbOptions & ComponentProps<'div'>;\n\nexport function PageBreadcrumb({\n includeRoot,\n includeSeparator,\n includePage,\n ...props\n}: BreadcrumbProps) {\n const path = useTreePath();\n const { root } = useTreeContext();\n const items = useMemo(() => {\n return getBreadcrumbItemsFromPath(root, path, {\n includePage,\n includeSeparator,\n includeRoot,\n });\n }, [includePage, includeRoot, includeSeparator, path, root]);\n\n if (items.length === 0) return null;\n\n return (\n <div\n {...props}\n className={cn('flex items-center gap-1.5 text-sm text-fd-muted-foreground', props.className)}\n >\n {items.map((item, i) => {\n const className = cn('truncate', i === items.length - 1 && 'text-fd-primary font-medium');\n\n return (\n <Fragment key={i}>\n {i !== 0 && <ChevronRight className=\"size-3.5 shrink-0\" />}\n {item.url ? (\n <Link\n href={item.url}\n className={cn(className, 'transition-opacity hover:opacity-80')}\n >\n {item.name}\n </Link>\n ) : (\n <span className={className}>{item.name}</span>\n )}\n </Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,6 @@ import { TOCItems } from "../../../components/toc/default.js";
|
|
|
8
8
|
import { TOCItems as TOCItems$1 } from "../../../components/toc/clerk.js";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import { Edit, Text } from "lucide-react";
|
|
11
|
-
|
|
12
11
|
//#region src/layouts/docs/page/index.tsx
|
|
13
12
|
var page_exports = /* @__PURE__ */ __exportAll({
|
|
14
13
|
DocsBody: () => DocsBody,
|
|
@@ -98,7 +97,7 @@ function DocsTitle({ children, className, ...props }) {
|
|
|
98
97
|
children
|
|
99
98
|
});
|
|
100
99
|
}
|
|
101
|
-
|
|
102
100
|
//#endregion
|
|
103
101
|
export { DocsBody, DocsDescription, DocsPage, DocsTitle, EditOnGitHub, PageBreadcrumb, PageLastUpdate, page_exports };
|
|
102
|
+
|
|
104
103
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["TocClerk.TOCItems","TocDefault.TOCItems"],"sources":["../../../../src/layouts/docs/page/index.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Edit, Text } from 'lucide-react';\nimport { I18nLabel } from '@/contexts/i18n';\nimport {\n type BreadcrumbProps,\n type FooterProps,\n PageBreadcrumb,\n PageFooter,\n PageTOCPopover,\n PageTOCPopoverContent,\n PageTOCPopoverTrigger,\n} from './client';\nimport type { AnchorProviderProps, TOCItemType } from 'fumadocs-core/toc';\nimport * as TocDefault from '@/components/toc/default';\nimport * as TocClerk from '@/components/toc/clerk';\nimport { TOCProvider, TOCScrollArea } from '@/components/toc';\n\ninterface BreadcrumbOptions extends BreadcrumbProps {\n enabled: boolean;\n component: ReactNode;\n}\n\ninterface FooterOptions extends FooterProps {\n enabled: boolean;\n component: ReactNode;\n}\n\nexport interface DocsPageProps {\n toc?: TOCItemType[];\n tableOfContent?: Partial<TableOfContentOptions>;\n tableOfContentPopover?: Partial<TableOfContentPopoverOptions>;\n\n /**\n * Extend the page to fill all available space\n *\n * @defaultValue false\n */\n full?: boolean;\n\n /**\n * Replace or disable breadcrumb\n */\n breadcrumb?: Partial<BreadcrumbOptions>;\n\n /**\n * Footer navigation, located under the page body.\n *\n * You can specify `footer.children` to add extra components under the footer.\n */\n footer?: Partial<FooterOptions>;\n\n children?: ReactNode;\n\n /**\n * Apply class names to the `#nd-page` container.\n */\n className?: string;\n}\n\ntype TableOfContentOptions = Pick<AnchorProviderProps, 'single'> & {\n /**\n * Custom content in TOC container, before the main TOC\n */\n header?: ReactNode;\n\n /**\n * Custom content in TOC container, after the main TOC\n */\n footer?: ReactNode;\n\n enabled: boolean;\n component: ReactNode;\n\n /**\n * @defaultValue 'normal'\n */\n style?: 'normal' | 'clerk';\n};\n\ntype TableOfContentPopoverOptions = Omit<TableOfContentOptions, 'single'>;\n\nexport function DocsPage({\n breadcrumb: { enabled: breadcrumbEnabled = true, component: breadcrumb, ...breadcrumbProps } = {},\n footer: { enabled: footerEnabled, component: footerReplace, ...footerProps } = {},\n full = false,\n tableOfContentPopover: {\n enabled: tocPopoverEnabled,\n component: tocPopover,\n ...tocPopoverOptions\n } = {},\n tableOfContent: { enabled: tocEnabled, component: tocReplace, ...tocOptions } = {},\n toc = [],\n children,\n className,\n}: DocsPageProps) {\n // disable TOC on full mode, you can still enable it with `enabled` option.\n tocEnabled ??=\n !full && (toc.length > 0 || tocOptions.footer !== undefined || tocOptions.header !== undefined);\n\n tocPopoverEnabled ??=\n toc.length > 0 ||\n tocPopoverOptions.header !== undefined ||\n tocPopoverOptions.footer !== undefined;\n\n let wrapper = (children: ReactNode) => children;\n\n if (tocEnabled || tocPopoverEnabled) {\n wrapper = (children) => (\n <TOCProvider single={tocOptions.single} toc={toc}>\n {children}\n </TOCProvider>\n );\n }\n\n return wrapper(\n <>\n {tocPopoverEnabled &&\n (tocPopover ?? (\n <PageTOCPopover>\n <PageTOCPopoverTrigger />\n <PageTOCPopoverContent>\n {tocPopoverOptions.header}\n <TOCScrollArea>\n {tocPopoverOptions.style === 'clerk' ? (\n <TocClerk.TOCItems />\n ) : (\n <TocDefault.TOCItems />\n )}\n </TOCScrollArea>\n {tocPopoverOptions.footer}\n </PageTOCPopoverContent>\n </PageTOCPopover>\n ))}\n <article\n id=\"nd-page\"\n data-full={full}\n className={cn(\n 'flex flex-col w-full max-w-[900px] mx-auto [grid-area:main] px-4 py-6 gap-4 md:px-6 md:pt-8 xl:px-8 xl:pt-14',\n full ? 'max-w-[1168px]' : 'xl:layout:[--fd-toc-width:268px]',\n className,\n )}\n >\n {breadcrumbEnabled && (breadcrumb ?? <PageBreadcrumb {...breadcrumbProps} />)}\n {children}\n {footerEnabled !== false && (footerReplace ?? <PageFooter {...footerProps} />)}\n </article>\n {tocEnabled &&\n (tocReplace ?? (\n <div\n id=\"nd-toc\"\n className=\"sticky top-(--fd-docs-row-1) h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] flex flex-col [grid-area:toc] w-(--fd-toc-width) pt-12 pe-4 pb-2 max-xl:hidden\"\n >\n {tocOptions.header}\n <h3\n id=\"toc-title\"\n className=\"inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground\"\n >\n <Text className=\"size-4\" />\n <I18nLabel label=\"toc\" />\n </h3>\n <TOCScrollArea>\n {tocOptions.style === 'clerk' ? <TocClerk.TOCItems /> : <TocDefault.TOCItems />}\n </TOCScrollArea>\n {tocOptions.footer}\n </div>\n ))}\n </>,\n );\n}\n\nexport function EditOnGitHub(props: ComponentProps<'a'>) {\n return (\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n {...props}\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'gap-1.5 not-prose',\n }),\n props.className,\n )}\n >\n {props.children ?? (\n <>\n <Edit className=\"size-3.5\" />\n <I18nLabel label=\"editOnGithub\" />\n </>\n )}\n </a>\n );\n}\n\n/**\n * Add typography styles\n */\nexport function DocsBody({ children, className, ...props }: ComponentProps<'div'>) {\n return (\n <div {...props} className={cn('prose flex-1', className)}>\n {children}\n </div>\n );\n}\n\nexport function DocsDescription({ children, className, ...props }: ComponentProps<'p'>) {\n // Don't render if no description provided\n if (children === undefined) return null;\n\n return (\n <p {...props} className={cn('mb-8 text-lg text-fd-muted-foreground', className)}>\n {children}\n </p>\n );\n}\n\nexport function DocsTitle({ children, className, ...props }: ComponentProps<'h1'>) {\n return (\n <h1 {...props} className={cn('text-[1.75em] font-semibold', className)}>\n {children}\n </h1>\n );\n}\n\nexport { PageLastUpdate, PageBreadcrumb } from './client';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["TocClerk.TOCItems","TocDefault.TOCItems"],"sources":["../../../../src/layouts/docs/page/index.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from '@/components/ui/button';\nimport { Edit, Text } from 'lucide-react';\nimport { I18nLabel } from '@/contexts/i18n';\nimport {\n type BreadcrumbProps,\n type FooterProps,\n PageBreadcrumb,\n PageFooter,\n PageTOCPopover,\n PageTOCPopoverContent,\n PageTOCPopoverTrigger,\n} from './client';\nimport type { AnchorProviderProps, TOCItemType } from 'fumadocs-core/toc';\nimport * as TocDefault from '@/components/toc/default';\nimport * as TocClerk from '@/components/toc/clerk';\nimport { TOCProvider, TOCScrollArea } from '@/components/toc';\n\ninterface BreadcrumbOptions extends BreadcrumbProps {\n enabled: boolean;\n component: ReactNode;\n}\n\ninterface FooterOptions extends FooterProps {\n enabled: boolean;\n component: ReactNode;\n}\n\nexport interface DocsPageProps {\n toc?: TOCItemType[];\n tableOfContent?: Partial<TableOfContentOptions>;\n tableOfContentPopover?: Partial<TableOfContentPopoverOptions>;\n\n /**\n * Extend the page to fill all available space\n *\n * @defaultValue false\n */\n full?: boolean;\n\n /**\n * Replace or disable breadcrumb\n */\n breadcrumb?: Partial<BreadcrumbOptions>;\n\n /**\n * Footer navigation, located under the page body.\n *\n * You can specify `footer.children` to add extra components under the footer.\n */\n footer?: Partial<FooterOptions>;\n\n children?: ReactNode;\n\n /**\n * Apply class names to the `#nd-page` container.\n */\n className?: string;\n}\n\ntype TableOfContentOptions = Pick<AnchorProviderProps, 'single'> & {\n /**\n * Custom content in TOC container, before the main TOC\n */\n header?: ReactNode;\n\n /**\n * Custom content in TOC container, after the main TOC\n */\n footer?: ReactNode;\n\n enabled: boolean;\n component: ReactNode;\n\n /**\n * @defaultValue 'normal'\n */\n style?: 'normal' | 'clerk';\n};\n\ntype TableOfContentPopoverOptions = Omit<TableOfContentOptions, 'single'>;\n\nexport function DocsPage({\n breadcrumb: { enabled: breadcrumbEnabled = true, component: breadcrumb, ...breadcrumbProps } = {},\n footer: { enabled: footerEnabled, component: footerReplace, ...footerProps } = {},\n full = false,\n tableOfContentPopover: {\n enabled: tocPopoverEnabled,\n component: tocPopover,\n ...tocPopoverOptions\n } = {},\n tableOfContent: { enabled: tocEnabled, component: tocReplace, ...tocOptions } = {},\n toc = [],\n children,\n className,\n}: DocsPageProps) {\n // disable TOC on full mode, you can still enable it with `enabled` option.\n tocEnabled ??=\n !full && (toc.length > 0 || tocOptions.footer !== undefined || tocOptions.header !== undefined);\n\n tocPopoverEnabled ??=\n toc.length > 0 ||\n tocPopoverOptions.header !== undefined ||\n tocPopoverOptions.footer !== undefined;\n\n let wrapper = (children: ReactNode) => children;\n\n if (tocEnabled || tocPopoverEnabled) {\n wrapper = (children) => (\n <TOCProvider single={tocOptions.single} toc={toc}>\n {children}\n </TOCProvider>\n );\n }\n\n return wrapper(\n <>\n {tocPopoverEnabled &&\n (tocPopover ?? (\n <PageTOCPopover>\n <PageTOCPopoverTrigger />\n <PageTOCPopoverContent>\n {tocPopoverOptions.header}\n <TOCScrollArea>\n {tocPopoverOptions.style === 'clerk' ? (\n <TocClerk.TOCItems />\n ) : (\n <TocDefault.TOCItems />\n )}\n </TOCScrollArea>\n {tocPopoverOptions.footer}\n </PageTOCPopoverContent>\n </PageTOCPopover>\n ))}\n <article\n id=\"nd-page\"\n data-full={full}\n className={cn(\n 'flex flex-col w-full max-w-[900px] mx-auto [grid-area:main] px-4 py-6 gap-4 md:px-6 md:pt-8 xl:px-8 xl:pt-14',\n full ? 'max-w-[1168px]' : 'xl:layout:[--fd-toc-width:268px]',\n className,\n )}\n >\n {breadcrumbEnabled && (breadcrumb ?? <PageBreadcrumb {...breadcrumbProps} />)}\n {children}\n {footerEnabled !== false && (footerReplace ?? <PageFooter {...footerProps} />)}\n </article>\n {tocEnabled &&\n (tocReplace ?? (\n <div\n id=\"nd-toc\"\n className=\"sticky top-(--fd-docs-row-1) h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] flex flex-col [grid-area:toc] w-(--fd-toc-width) pt-12 pe-4 pb-2 max-xl:hidden\"\n >\n {tocOptions.header}\n <h3\n id=\"toc-title\"\n className=\"inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground\"\n >\n <Text className=\"size-4\" />\n <I18nLabel label=\"toc\" />\n </h3>\n <TOCScrollArea>\n {tocOptions.style === 'clerk' ? <TocClerk.TOCItems /> : <TocDefault.TOCItems />}\n </TOCScrollArea>\n {tocOptions.footer}\n </div>\n ))}\n </>,\n );\n}\n\nexport function EditOnGitHub(props: ComponentProps<'a'>) {\n return (\n <a\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n {...props}\n className={cn(\n buttonVariants({\n color: 'secondary',\n size: 'sm',\n className: 'gap-1.5 not-prose',\n }),\n props.className,\n )}\n >\n {props.children ?? (\n <>\n <Edit className=\"size-3.5\" />\n <I18nLabel label=\"editOnGithub\" />\n </>\n )}\n </a>\n );\n}\n\n/**\n * Add typography styles\n */\nexport function DocsBody({ children, className, ...props }: ComponentProps<'div'>) {\n return (\n <div {...props} className={cn('prose flex-1', className)}>\n {children}\n </div>\n );\n}\n\nexport function DocsDescription({ children, className, ...props }: ComponentProps<'p'>) {\n // Don't render if no description provided\n if (children === undefined) return null;\n\n return (\n <p {...props} className={cn('mb-8 text-lg text-fd-muted-foreground', className)}>\n {children}\n </p>\n );\n}\n\nexport function DocsTitle({ children, className, ...props }: ComponentProps<'h1'>) {\n return (\n <h1 {...props} className={cn('text-[1.75em] font-semibold', className)}>\n {children}\n </h1>\n );\n}\n\nexport { PageLastUpdate, PageBreadcrumb } from './client';\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use client";
|
|
3
2
|
import { cn } from "../../utils/cn.js";
|
|
4
3
|
import { buttonVariants } from "../../components/ui/button.js";
|
|
5
4
|
import { mergeRefs } from "../../utils/merge-refs.js";
|
|
@@ -11,7 +10,6 @@ import { useRef } from "react";
|
|
|
11
10
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
12
11
|
import { Sidebar as Sidebar$1 } from "lucide-react";
|
|
13
12
|
import { cva } from "class-variance-authority";
|
|
14
|
-
|
|
15
13
|
//#region src/layouts/docs/sidebar.tsx
|
|
16
14
|
const itemVariants = cva("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", { variants: {
|
|
17
15
|
variant: {
|
|
@@ -156,7 +154,7 @@ const SidebarLinkItem = createLinkItemRenderer({
|
|
|
156
154
|
SidebarFolderTrigger,
|
|
157
155
|
SidebarItem
|
|
158
156
|
});
|
|
159
|
-
|
|
160
157
|
//#endregion
|
|
161
158
|
export { Sidebar, SidebarCollapseTrigger, SidebarContent, SidebarDrawer, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarLinkItem, SidebarPageTree, SidebarSeparator, SidebarTrigger, SidebarViewport };
|
|
159
|
+
|
|
162
160
|
//# sourceMappingURL=sidebar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.js","names":["Base.SidebarProvider","Base.SidebarFolder","Base.SidebarCollapseTrigger","Base.SidebarViewport","Base.SidebarTrigger","Base.SidebarContent","SidebarIcon","Base.SidebarDrawerOverlay","Base.SidebarDrawerContent","Base.useFolderDepth","Base.SidebarSeparator","Base.SidebarItem","Base.useFolder","Base.SidebarFolderTrigger","Base.SidebarFolderLink","Base.SidebarFolderContent"],"sources":["../../../src/layouts/docs/sidebar.tsx"],"sourcesContent":["'use client';\nimport * as Base from '@/components/sidebar/base';\nimport { cn } from '@/utils/cn';\nimport { type ComponentProps, useRef } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { createPageTreeRenderer } from '@/components/sidebar/page-tree';\nimport { createLinkItemRenderer } from '@/components/sidebar/link-item';\nimport { buttonVariants } from '@/components/ui/button';\nimport { SearchToggle } from '@/layouts/shared/search-toggle';\nimport { Sidebar as SidebarIcon } from 'lucide-react';\nimport { mergeRefs } from '@/utils/merge-refs';\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\n return (\n <Base.SidebarContent>\n {({ collapsed, hovered, ref: asideRef, ...rest }) => (\n <>\n <div\n data-sidebar-placeholder=\"\"\n className=\"sticky top-(--fd-docs-row-1) z-20 [grid-area:sidebar] pointer-events-none *:pointer-events-auto h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] md:layout:[--fd-sidebar-width:268px] max-md:hidden\"\n >\n {collapsed && <div className=\"absolute start-0 inset-y-0 w-4\" {...rest} />}\n <aside\n id=\"nd-sidebar\"\n ref={mergeRefs(ref, refProp, asideRef)}\n data-collapsed={collapsed}\n data-hovered={collapsed && hovered}\n className={cn(\n 'absolute flex flex-col w-full start-0 inset-y-0 items-end bg-fd-card text-sm border-e duration-250 *:w-(--fd-sidebar-width)',\n collapsed && [\n 'inset-y-2 rounded-xl transition-transform border w-(--fd-sidebar-width)',\n hovered\n ? 'shadow-lg translate-x-2 rtl:-translate-x-2'\n : '-translate-x-(--fd-sidebar-width) rtl:translate-x-full',\n ],\n ref.current &&\n (ref.current.getAttribute('data-collapsed') === 'true') !== collapsed &&\n 'transition-[width,inset-block,translate,background-color]',\n className,\n )}\n {...props}\n {...rest}\n >\n {children}\n </aside>\n </div>\n <div\n data-sidebar-panel=\"\"\n className={cn(\n 'fixed flex top-[calc(--spacing(4)+var(--fd-docs-row-3))] start-4 shadow-lg transition-opacity rounded-xl p-0.5 border bg-fd-muted text-fd-muted-foreground z-10',\n (!collapsed || hovered) && 'pointer-events-none opacity-0',\n )}\n >\n <Base.SidebarCollapseTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'rounded-lg',\n }),\n )}\n >\n <SidebarIcon />\n </Base.SidebarCollapseTrigger>\n <SearchToggle className=\"rounded-lg\" hideIfDisabled />\n </div>\n </>\n )}\n </Base.SidebarContent>\n );\n}\n\nexport function SidebarDrawer({\n children,\n className,\n ...props\n}: ComponentProps<typeof Base.SidebarDrawerContent>) {\n return (\n <>\n <Base.SidebarDrawerOverlay className=\"fixed z-40 inset-0 backdrop-blur-xs data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out\" />\n <Base.SidebarDrawerContent\n className={cn(\n 'fixed text-[0.9375rem] flex flex-col shadow-lg border-s end-0 inset-y-0 w-[85%] max-w-[380px] z-40 bg-fd-background data-[state=open]:animate-fd-sidebar-in data-[state=closed]:animate-fd-sidebar-out',\n className,\n )}\n {...props}\n >\n {children}\n </Base.SidebarDrawerContent>\n </>\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 <Base.SidebarItem\n className={cn(itemVariants({ variant: 'link', highlight: depth >= 1 }), className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...props}\n >\n {children}\n </Base.SidebarItem>\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 <Base.SidebarFolderTrigger\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}\n >\n {props.children}\n </Base.SidebarFolderTrigger>\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 <Base.SidebarFolderLink\n className={cn(itemVariants({ variant: 'link', highlight: depth > 1 }), 'w-full', className)}\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...props}\n >\n {props.children}\n </Base.SidebarFolderLink>\n );\n}\n\nexport function SidebarFolderContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderContent>) {\n const depth = Base.useFolderDepth();\n\n return (\n <Base.SidebarFolderContent\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 typeof className === 'function' ? className(s) : className,\n )\n }\n {...props}\n >\n {children}\n </Base.SidebarFolderContent>\n );\n}\n\nexport const SidebarPageTree = createPageTreeRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n SidebarSeparator,\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.SidebarProvider","Base.SidebarFolder","Base.SidebarCollapseTrigger","Base.SidebarViewport","Base.SidebarTrigger","Base.SidebarContent","SidebarIcon","Base.SidebarDrawerOverlay","Base.SidebarDrawerContent","Base.useFolderDepth","Base.SidebarSeparator","Base.SidebarItem","Base.useFolder","Base.SidebarFolderTrigger","Base.SidebarFolderLink","Base.SidebarFolderContent"],"sources":["../../../src/layouts/docs/sidebar.tsx"],"sourcesContent":["'use client';\nimport * as Base from '@/components/sidebar/base';\nimport { cn } from '@/utils/cn';\nimport { type ComponentProps, useRef } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { createPageTreeRenderer } from '@/components/sidebar/page-tree';\nimport { createLinkItemRenderer } from '@/components/sidebar/link-item';\nimport { buttonVariants } from '@/components/ui/button';\nimport { SearchToggle } from '@/layouts/shared/search-toggle';\nimport { Sidebar as SidebarIcon } from 'lucide-react';\nimport { mergeRefs } from '@/utils/merge-refs';\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\n return (\n <Base.SidebarContent>\n {({ collapsed, hovered, ref: asideRef, ...rest }) => (\n <>\n <div\n data-sidebar-placeholder=\"\"\n className=\"sticky top-(--fd-docs-row-1) z-20 [grid-area:sidebar] pointer-events-none *:pointer-events-auto h-[calc(var(--fd-docs-height)-var(--fd-docs-row-1))] md:layout:[--fd-sidebar-width:268px] max-md:hidden\"\n >\n {collapsed && <div className=\"absolute start-0 inset-y-0 w-4\" {...rest} />}\n <aside\n id=\"nd-sidebar\"\n ref={mergeRefs(ref, refProp, asideRef)}\n data-collapsed={collapsed}\n data-hovered={collapsed && hovered}\n className={cn(\n 'absolute flex flex-col w-full start-0 inset-y-0 items-end bg-fd-card text-sm border-e duration-250 *:w-(--fd-sidebar-width)',\n collapsed && [\n 'inset-y-2 rounded-xl transition-transform border w-(--fd-sidebar-width)',\n hovered\n ? 'shadow-lg translate-x-2 rtl:-translate-x-2'\n : '-translate-x-(--fd-sidebar-width) rtl:translate-x-full',\n ],\n ref.current &&\n (ref.current.getAttribute('data-collapsed') === 'true') !== collapsed &&\n 'transition-[width,inset-block,translate,background-color]',\n className,\n )}\n {...props}\n {...rest}\n >\n {children}\n </aside>\n </div>\n <div\n data-sidebar-panel=\"\"\n className={cn(\n 'fixed flex top-[calc(--spacing(4)+var(--fd-docs-row-3))] start-4 shadow-lg transition-opacity rounded-xl p-0.5 border bg-fd-muted text-fd-muted-foreground z-10',\n (!collapsed || hovered) && 'pointer-events-none opacity-0',\n )}\n >\n <Base.SidebarCollapseTrigger\n className={cn(\n buttonVariants({\n color: 'ghost',\n size: 'icon-sm',\n className: 'rounded-lg',\n }),\n )}\n >\n <SidebarIcon />\n </Base.SidebarCollapseTrigger>\n <SearchToggle className=\"rounded-lg\" hideIfDisabled />\n </div>\n </>\n )}\n </Base.SidebarContent>\n );\n}\n\nexport function SidebarDrawer({\n children,\n className,\n ...props\n}: ComponentProps<typeof Base.SidebarDrawerContent>) {\n return (\n <>\n <Base.SidebarDrawerOverlay className=\"fixed z-40 inset-0 backdrop-blur-xs data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out\" />\n <Base.SidebarDrawerContent\n className={cn(\n 'fixed text-[0.9375rem] flex flex-col shadow-lg border-s end-0 inset-y-0 w-[85%] max-w-[380px] z-40 bg-fd-background data-[state=open]:animate-fd-sidebar-in data-[state=closed]:animate-fd-sidebar-out',\n className,\n )}\n {...props}\n >\n {children}\n </Base.SidebarDrawerContent>\n </>\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 <Base.SidebarItem\n className={cn(itemVariants({ variant: 'link', highlight: depth >= 1 }), className)}\n style={{\n paddingInlineStart: getItemOffset(depth),\n ...style,\n }}\n {...props}\n >\n {children}\n </Base.SidebarItem>\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 <Base.SidebarFolderTrigger\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}\n >\n {props.children}\n </Base.SidebarFolderTrigger>\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 <Base.SidebarFolderLink\n className={cn(itemVariants({ variant: 'link', highlight: depth > 1 }), 'w-full', className)}\n style={{\n paddingInlineStart: getItemOffset(depth - 1),\n ...style,\n }}\n {...props}\n >\n {props.children}\n </Base.SidebarFolderLink>\n );\n}\n\nexport function SidebarFolderContent({\n className,\n children,\n ...props\n}: ComponentProps<typeof Base.SidebarFolderContent>) {\n const depth = Base.useFolderDepth();\n\n return (\n <Base.SidebarFolderContent\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 typeof className === 'function' ? className(s) : className,\n )\n }\n {...props}\n >\n {children}\n </Base.SidebarFolderContent>\n );\n}\n\nexport const SidebarPageTree = createPageTreeRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n SidebarSeparator,\n});\n\nexport const SidebarLinkItem = createLinkItemRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n});\n"],"mappings":"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"}
|