fumadocs-ui
Version:
The Radix UI version of Fumadocs UI
85 lines (84 loc) • 2.63 kB
JavaScript
"use client";
import { useI18n } from "../../contexts/i18n.js";
import { LanguageSelect, LanguageSelectText } from "./slots/language-select.js";
import { FullSearchTrigger, SearchTrigger } from "./slots/search-trigger.js";
import { ThemeSwitch } from "./slots/theme-switch.js";
import { isLinkItemActive } from "./index.js";
import Link from "fumadocs-core/link";
import { usePathname } from "fumadocs-core/framework";
import { jsx } from "react/jsx-runtime";
//#region src/layouts/shared/client.tsx
function LinkItem({ ref, item, ...props }) {
const active = isLinkItemActive(item, usePathname());
return /* @__PURE__ */ jsx(Link, {
ref,
href: item.url,
external: item.external,
...props,
"data-active": active,
children: props.children
});
}
function baseSlots({ useProps }) {
function InlineThemeSwitch(props) {
const { themeSwitch } = useProps();
if (themeSwitch.component) return themeSwitch.component;
return /* @__PURE__ */ jsx(ThemeSwitch, {
...props,
...themeSwitch
});
}
function InlineSearchTrigger(props) {
const { searchToggle } = useProps();
if (searchToggle.components?.sm) return searchToggle.components.sm;
return /* @__PURE__ */ jsx(SearchTrigger, {
...props,
...searchToggle.sm
});
}
function InlineSearchTriggerFull(props) {
const { searchToggle } = useProps();
if (searchToggle.components?.lg) return searchToggle.components.lg;
return /* @__PURE__ */ jsx(FullSearchTrigger, {
...props,
...searchToggle.full
});
}
function InlineNavTitle({ href: defaultUrl = "/", ...props }) {
const { url = defaultUrl, title } = useProps().nav ?? {};
if (typeof title === "function") return title({
href: url,
...props
});
return /* @__PURE__ */ jsx(Link, {
href: url,
...props,
children: title
});
}
return { useProvider(options) {
const { locales = [] } = useI18n();
const { nav, slots = {}, i18n = locales.length > 1, searchToggle: { enabled: searchToggleEnabled = true, ...searchToggle } = {}, themeSwitch: { enabled: themeSwitchEnabled = true, ...themeSwitch } = {} } = options;
return {
baseSlots: {
navTitle: slots.navTitle ?? InlineNavTitle,
themeSwitch: themeSwitchEnabled && (slots.themeSwitch ?? InlineThemeSwitch),
languageSelect: i18n ? slots.languageSelect ?? {
root: LanguageSelect,
text: LanguageSelectText
} : false,
searchTrigger: searchToggleEnabled && (slots.searchTrigger ?? {
sm: InlineSearchTrigger,
full: InlineSearchTriggerFull
})
},
baseProps: {
nav,
searchToggle,
themeSwitch
}
};
} };
}
//#endregion
export { LinkItem, baseSlots };