| name | n-config-provider |
| description | Global configuration provider for theme, locale, and component options. Invoke when user needs to set up global theme, internationalization, or configure default component behaviors in Naive UI. |
| metadata | {"author":"jiaiyan","version":"1.0.0"} |
Naive UI Config Provider Component
Config Provider is the root configuration component used to set global theme, language, namespace, and component-level defaults.
When to Use
Use this component when:
- Theme setup: Configure light/dark theme for the entire application
- Internationalization: Set locale and date locale for all components
- Component defaults: Configure default sizes and options for components
- Namespace isolation: Add class names to detached DOM elements
- SSR optimization: Disable inline theme for server-side rendering
When to Invoke
Invoke this skill when:
- User needs to implement dark/light theme switching
- User wants to configure global language settings
- User needs to set default sizes for multiple components
- User wants to customize theme variables
- User asks about namespace for detached components
- User needs to configure breakpoints for responsive design
Features
- Theme Management: Light/dark theme with inheritance support
- Theme Overrides: Customize theme CSS variables
- Locale Support: Internationalization for all components
- Date Locale: Date formatting localization
- Component Options: Global component size and behavior configuration
- Namespace: Class name for detached DOM elements
- Breakpoints: Custom responsive breakpoints
- Class Prefix: Custom CSS class prefix
- Abstract Mode: No wrapper DOM option
- SSR Support: Disable inline theme for server-side rendering
API Reference
ConfigProvider Props
| Name | Type | Default | Description |
|---|
| abstract | boolean | false | If n-config-provider has no wrapper DOM. |
| breakpoints | { [k: string]: number } | { xs: <640, s: ≥640, m: ≥1024, l: ≥1280, xl: ≥1536, xxl: ≥1920 } | Responsive breakpoints for n-grid. Not responsive after mount. |
| cls-prefix | string | undefined | Class prefix for all inner components. Not reactive. |
| component-options | GlobalComponentConfig | undefined | Global component options for sizes and behaviors. |
| date-locale | DateLocale | null | undefined | Date locale object. null uses default dateEnUS. undefined inherits from parent. |
| inline-theme-disabled | boolean | false | Disable inline theme CSS variables. Useful for SSR. Not responsive. |
| katex | object | undefined | Katex object for n-equation component. |
| locale | Locale | null | undefined | Locale object. null uses default enUS. undefined inherits from parent. |
| namespace | string | undefined | Class name for detached parts of components. |
| preflight-style-disabled | boolean | false | Disable preflight style. Use n-global-style for reactive global styles. |
| style-mount-target | ParentNode | undefined | Mounting target for style elements. Not reactive. |
| tag | string | 'div' | The HTML tag to render as. |
| theme | Theme | null | undefined | Theme object. null uses light theme. undefined inherits from parent. |
| theme-overrides | ThemeOverrides | null | undefined | Theme variable overrides. null clears overrides. undefined inherits from parent. |
GlobalComponentConfig Type
interface GlobalComponentConfig {
AutoComplete?: { size?: AutoCompleteSize };
Button?: { size?: ButtonSize };
Card?: { size?: CardSize };
Cascader?: { size?: CascaderSize; renderEmpty?: () => VNodeChild };
Checkbox?: { size?: CheckboxSize };
ColorPicker?: { size?: ColorPickerSize };
DataTable?: {
size?: DataTableSize;
renderFilter?: DataTableRenderFilter;
renderSorter?: DataTableRenderSorter;
renderEmpty?: () => VNodeChild;
};
DatePicker?: { size?: DatePickerSize; timePickerSize?: TimePickerSize };
Descriptions?: { size?: DescriptionsSize };
Dialog?: { iconPlacement?: IconPlacement };
Dropdown?: { size?: DropdownSize };
DynamicInput?: { buttonSize?: ButtonSize };
DynamicTags?: { size?: DynamicTagsSize };
Empty?: Pick<EmptyProps, 'description' | 'renderIcon'>;
Form?: { size?: FormSize };
Input?: { size?: InputSize };
InputNumber?: { size?: InputNumberSize };
InputOtp?: { size?: InputOtpSize };
Mention?: { size?: MentionSize };
Pagination?: {
size?: PaginationSize;
inputSize?: InputSize;
selectSize?: SelectSize;
};
Popselect?: { size?: PopselectSize };
Radio?: { size?: RadioSize };
Rate?: { size?: RateSize };
Result?: { size?: ResultSize };
Select?: { size?: SelectSize; renderEmpty?: () => VNodeChild };
Skeleton?: { size?: SkeletonSize };
Space?: { size?: SpaceSize };
Switch?: { size?: SwitchSize };
Table?: { size?: TableSize };
Tabs?: { size?: TabsSize };
Tag?: { size?: TagSize };
TimePicker?: { size?: TimePickerSize };
Transfer?: { size?: TransferSize; renderEmpty?: () => VNodeChild };
Tree?: { renderEmpty?: () => VNodeChild };
TreeSelect?: { size?: TreeSelectSize; renderEmpty?: () => VNodeChild };
}
Basic Usage
Theme Switching
<template>
<n-config-provider :theme="theme">
<n-card>
<n-space>
<n-button @click="theme = darkTheme">Dark</n-button>
<n-button @click="theme = null">Light</n-button>
</n-space>
</n-card>
</n-config-provider>
</template>
<script setup>
import { ref } from 'vue';
import { darkTheme } from 'naive-ui';
const theme = ref(null);
</script>
Locale Configuration
<template>
<n-space vertical>
<n-space>
<n-button @click="setEnglish">en-US</n-button>
<n-button @click="setChinese">zh-CN</n-button>
</n-space>
<n-config-provider :locale="locale" :date-locale="dateLocale">
<n-date-picker />
</n-config-provider>
</n-space>
</template>
<script setup>
import { ref } from 'vue';
import { zhCN, dateZhCN } from 'naive-ui';
const locale = ref(null);
const dateLocale = ref(null);
const setEnglish = () => {
locale.value = null;
dateLocale.value = null;
};
const setChinese = () => {
locale.value = zhCN;
dateLocale.value = dateZhCN;
};
</script>
Use OS Theme
<template>
<n-config-provider :theme="theme">
<n-card> Your current system theme is {{ osTheme }}. </n-card>
</n-config-provider>
</template>
<script setup>
import { computed } from 'vue';
import { useOsTheme, darkTheme } from 'naive-ui';
const osTheme = useOsTheme();
const theme = computed(() => (osTheme.value === 'dark' ? darkTheme : null));
</script>
Abstract Mode (No Wrapper DOM)
<template>
<n-config-provider abstract>
<n-card>
<n-tag>No Wrapper DOM</n-tag>
</n-card>
</n-config-provider>
</template>
Namespace for Detached Components
<template>
<n-config-provider :namespace="ns">
<n-tooltip placement="bottom" trigger="click">
<template #trigger>
<n-button>Activate Component with Detached Content</n-button>
</template>
Tooltip content
</n-tooltip>
</n-config-provider>
</template>
<script setup>
const ns = 'my-namespace';
</script>
Common Patterns
Global Component Size Configuration
<template>
<n-config-provider :component-options="componentOptions">
<n-space vertical>
<n-button>Button</n-button>
<n-tag closable>Tag</n-tag>
<n-card title="Card">Card Content</n-card>
<n-pagination :page-count="20" />
</n-space>
</n-config-provider>
</template>
<script setup>
import { ref } from 'vue';
const size = ref('medium');
const componentOptions = computed(() => ({
Button: { size: size.value },
Tag: { size: size.value },
Card: { size: size.value },
Pagination: { size: size.value },
}));
</script>
Nested Config Providers with Inheritance
<template>
<n-config-provider :theme="darkTheme">
<n-card title="Dark Theme">
<n-config-provider :theme-overrides="customOverrides">
<n-card title="Custom Overrides">
<n-button type="primary">Custom Primary</n-button>
</n-card>
</n-config-provider>
</n-card>
</n-config-provider>
</template>
<script setup>
import { darkTheme } from 'naive-ui';
const customOverrides = {
common: {
primaryColor: '#FF6B6B',
},
};
</script>
SSR-Friendly Configuration
<template>
<n-config-provider inline-theme-disabled :theme="theme">
<n-button>No inline CSS variable on the button</n-button>
</n-config-provider>
</template>
Custom Breakpoints
<template>
<n-config-provider :breakpoints="customBreakpoints">
<n-grid :cols="24">
<n-gi :span="12">Half</n-gi>
<n-gi :span="12">Half</n-gi>
</n-grid>
</n-config-provider>
</template>
<script setup>
const customBreakpoints = {
xs: 0,
sm: 640,
md: 768,
lg: 1024,
xl: 1280,
xxl: 1536,
};
</script>
Complete Application Setup
<template>
<n-config-provider
:theme="theme"
:theme-overrides="themeOverrides"
:locale="locale"
:date-locale="dateLocale"
:component-options="componentOptions"
>
<n-global-style />
<n-message-provider>
<n-dialog-provider>
<n-notification-provider>
<router-view />
</n-notification-provider>
</n-dialog-provider>
</n-message-provider>
</n-config-provider>
</template>
<script setup>
import { ref } from 'vue';
import { darkTheme, zhCN, dateZhCN } from 'naive-ui';
const theme = ref(null);
const locale = ref(zhCN);
const dateLocale = ref(dateZhCN);
const themeOverrides = {
common: {
primaryColor: '#18A058',
},
};
const componentOptions = {
Button: { size: 'medium' },
Input: { size: 'medium' },
Select: { size: 'medium' },
};
</script>
Best Practices
-
Place at root level: Wrap your entire application with n-config-provider
<n-config-provider :theme="theme">
<App />
</n-config-provider>
-
Use n-global-style together: Sync global styles to document.body
<n-config-provider :theme="theme">
<n-global-style />
<App />
</n-config-provider>
-
Inheritance behavior: Use undefined to inherit, null to reset to default
undefined: inherits from parent config provider
null: uses the default value
- specific value: overrides the configuration
-
SSR optimization: Enable inline-theme-disabled for server-side rendering
<n-config-provider inline-theme-disabled>
<App />
</n-config-provider>
-
Abstract mode: Use abstract when you don't need wrapper DOM
<n-config-provider abstract>
<App />
</n-config-provider>
-
Theme switching: Use useOsTheme() to follow system preferences
import { useOsTheme, darkTheme } from 'naive-ui';
const osTheme = useOsTheme();
const theme = computed(() => (osTheme.value === 'dark' ? darkTheme : null));
-
Component options: Configure default sizes for consistency
const componentOptions = {
Button: { size: 'small' },
Input: { size: 'small' },
};
-
Namespace for isolation: Use namespace when multiple Naive UI instances exist
<n-config-provider namespace="app-a">
<App />
</n-config-provider>