shadcn-unocss-docs-nuxt
Version:
Effortless and beautiful docs template built with Nuxt Content + shadcn-vue + unocss.
150 lines (144 loc) • 4.71 kB
text/typescript
import { defu } from 'defu'
const defaultConfig: DefaultConfig = {
site: {
name: 'shadcn-docs',
description: 'Beautifully designed Nuxt Content template built with shadcn-vue. Customizable. Compatible. Open Source.',
ogImage: '/hero.png',
},
theme: {
customizable: true,
color: 'zinc',
radius: 0.5,
},
header: {
showLoadingIndicator: true,
title: 'shadcn-docs',
showTitle: true,
logo: {
light: '/logo.svg',
dark: '/logo-dark.svg',
},
showTitleInMobile: false,
border: false,
darkModeToggle: true,
nav: [],
links: [],
},
aside: {
useLevel: true,
collapse: false,
},
main: {
breadCrumb: true,
showTitle: true,
codeCopyToast: true,
codeCopyToastText: 'Copied to clipboard!',
fieldRequiredText: 'required',
padded: true,
codeIcon: {
'package.json': 'vscode-icons:file-type-node',
'tsconfig.json': 'vscode-icons:file-type-tsconfig',
'.npmrc': 'vscode-icons:file-type-npm',
'.editorconfig': 'vscode-icons:file-type-editorconfig',
'.eslintrc': 'vscode-icons:file-type-eslint',
'.eslintrc.cjs': 'vscode-icons:file-type-eslint',
'.eslintignore': 'vscode-icons:file-type-eslint',
'eslint.config.js': 'vscode-icons:file-type-eslint',
'eslint.config.mjs': 'vscode-icons:file-type-eslint',
'eslint.config.cjs': 'vscode-icons:file-type-eslint',
'.gitignore': 'vscode-icons:file-type-git',
'yarn.lock': 'vscode-icons:file-type-yarn',
'.env': 'vscode-icons:file-type-dotenv',
'.env.example': 'vscode-icons:file-type-dotenv',
'.vscode/settings.json': 'vscode-icons:file-type-vscode',
'nuxt': 'vscode-icons:file-type-nuxt',
'.nuxtrc': 'vscode-icons:file-type-nuxt',
'.nuxtignore': 'vscode-icons:file-type-nuxt',
'nuxt.config.js': 'vscode-icons:file-type-nuxt',
'nuxt.config.ts': 'vscode-icons:file-type-nuxt',
'nuxt.schema.ts': 'vscode-icons:file-type-nuxt',
'tailwind.config.js': 'vscode-icons:file-type-tailwind',
'tailwind.config.ts': 'vscode-icons:file-type-tailwind',
'vue': 'vscode-icons:file-type-vue',
'ts': 'vscode-icons:file-type-typescript',
'tsx': 'vscode-icons:file-type-typescript',
'mjs': 'vscode-icons:file-type-js',
'cjs': 'vscode-icons:file-type-js',
'js': 'vscode-icons:file-type-js',
'jsx': 'vscode-icons:file-type-js',
'md': 'vscode-icons:file-type-markdown',
'mdc': 'vscode-icons:file-type-markdown',
'py': 'vscode-icons:file-type-python',
'npm': 'vscode-icons:file-type-npm',
'pnpm': 'vscode-icons:file-type-pnpm',
'npx': 'vscode-icons:file-type-npm',
'yarn': 'vscode-icons:file-type-yarn',
'bun': 'vscode-icons:file-type-bun',
'yml': 'vscode-icons:file-type-yaml',
'json': 'vscode-icons:file-type-json',
'terminal': 'lucide:terminal',
},
},
footer: {
credits: '',
links: [],
},
toc: {
enable: true,
enableInMobile: false,
title: 'On This Page',
links: [],
},
search: {
enable: true,
inAside: false,
style: 'input',
placeholder: 'Search...',
placeholderDetailed: 'Search documentation...',
},
}
export function useConfig() {
const appConfig = computed(() => useAppConfig()?.shadcnDocs || {})
const { navKeyFromPath } = useContentHelpers()
const { navigation, page } = useContent()
const route = useRoute()
return computed(
() => {
const processedConfig = defu(appConfig.value, defaultConfig)
const header = processedConfig.header
const main = processedConfig.main
const aside = processedConfig.aside
const footer = processedConfig.footer
const toc = processedConfig.toc
return {
...appConfig.value,
...processedConfig,
header: {
...header,
...navKeyFromPath(route.path, 'header', navigation.value || []),
...page.value?.header,
} as typeof header,
main: {
...main,
...navKeyFromPath(route.path, 'main', navigation.value || []),
...page.value?.main,
} as typeof main,
aside: {
...aside,
...navKeyFromPath(route.path, 'aside', navigation.value || []),
...page.value?.aside,
} as typeof aside,
toc: {
...toc,
...navKeyFromPath(route.path, 'toc', navigation.value || []),
...page.value?.toc,
} as typeof toc,
footer: {
...footer,
...navKeyFromPath(route.path, 'footer', navigation.value || []),
...page.value?.footer,
} as typeof footer,
}
},
)
}