Skip to content

ConfigProvider

Context provider for global configuration. Enables consistent component sizing, localization, RTL support, and portal container management across your application.

import { ConfigProvider, useConfig } from 'asterui'

Wrap your app with ConfigProvider to set global defaults:

main.tsx
import { ConfigProvider } from 'asterui'
createRoot(document.getElementById('root')!).render(
<ConfigProvider componentSize="sm">
<App />
</ConfigProvider>
)

Set a global size for all components. Individual components can still override this:

function App() {
const [size, setSize] = useState<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md')
return (
<ConfigProvider componentSize={size}>
<div className="space-y-4">
<select value={size} onChange={(e) => setSize(e.target.value)}>
<option value="xs">Extra Small</option>
<option value="sm">Small</option>
<option value="md">Medium</option>
<option value="lg">Large</option>
<option value="xl">Extra Large</option>
</select>
{/* All these components will use the global size */}
<Button>Button</Button>
<Input placeholder="Input" />
<Pagination total={100} />
</div>
</ConfigProvider>
)
}

Customize locale strings for internationalization:

import { ConfigProvider } from 'asterui'
import { zhCN } from 'asterui/locale'
// Use a built-in locale
<ConfigProvider locale={zhCN}>
<App />
</ConfigProvider>
// Or provide custom strings
<ConfigProvider locale={{ Empty: { description: 'Keine Daten' } }}>
<Empty />
</ConfigProvider>

Enable right-to-left layout for languages like Arabic and Hebrew:

<ConfigProvider direction="rtl">
<div dir="rtl">
<Button>First</Button>
<Button>Second</Button>
<Button>Third</Button>
</div>
</ConfigProvider>

Nested ConfigProvider components inherit and override parent settings:

<ConfigProvider componentSize="lg">
<Button>Large Button</Button>
<ConfigProvider componentSize="sm">
{/* This section uses small size */}
<Button>Small Button</Button>
</ConfigProvider>
</ConfigProvider>

Specify where modals, dropdowns, and other portals render:

<ConfigProvider getPopupContainer={() => document.getElementById('modal-root')!}>
<Modal open={isOpen}>
{/* Renders inside #modal-root instead of document.body */}
</Modal>
</ConfigProvider>

Disable all interactive components at once, useful during form submission or loading:

function App() {
const [submitting, setSubmitting] = useState(false)
return (
<ConfigProvider componentDisabled={submitting}>
<Input placeholder="Username" />
<Input placeholder="Password" type="password" />
<Button onClick={handleSubmit}>
{submitting ? 'Submitting...' : 'Submit'}
</Button>
</ConfigProvider>
)
}

Provide a custom renderer for empty states across components:

<ConfigProvider
renderEmpty={(componentName) => (
<div className="text-center py-8">
<Icon name="inbox" className="text-4xl text-base-content/30" />
<p className="mt-2 text-base-content/50">
{componentName === 'Table' ? 'No records found' : 'Nothing here'}
</p>
</div>
)}
>
<Table dataSource={[]} columns={columns} />
<Select options={[]} />
</ConfigProvider>

Use both providers together for full customization:

import { ConfigProvider, ThemeProvider } from 'asterui'
import { zhCN } from 'asterui/locale'
<ThemeProvider theme="dark">
<ConfigProvider locale={zhCN} componentSize="sm">
<App />
</ConfigProvider>
</ThemeProvider>
PropertyTypeDefaultDescription
localeLocaleenUSLocale configuration object.
componentSize'xs' | 'sm' | 'md' | 'lg' | 'xl''md'Default size for all components.
direction'ltr' | 'rtl''ltr'Layout direction.
prefixClsstring-Prefix for CSS classes.
getPopupContainer(triggerNode?: HTMLElement) => HTMLElement-Default container for portals.
componentDisabledboolean-Globally disable all interactive components.
renderEmpty(componentName: string) => ReactNode-Custom empty state renderer.
childrenReact.ReactNode-Child components.
PropertyTypeDescription
localeLocaleCurrent locale configuration.
componentSizestringCurrent global component size.
direction'ltr' | 'rtl'Current layout direction.
getPopupContainerfunctionCurrent portal container function.
componentDisabledbooleanCurrent global disabled state.
renderEmptyfunctionCurrent empty state renderer.
import { useConfig } from 'asterui'
function MyComponent() {
const { locale, componentSize, direction } = useConfig()
// Use configuration values...
}

Access just the current locale:

import { useLocale } from 'asterui'
function MyComponent() {
const locale = useLocale()
// Use locale strings...
}

Import locales from asterui/locale:

import { zhCN, jaJP, koKR, deDE, frFR, esES, ptBR, enGB, enCA } from 'asterui/locale'
LocaleLanguage
enUSEnglish (US) - default
enGBEnglish (UK)
enCAEnglish (Canada)
zhCNChinese (Simplified)
jaJPJapanese
koKRKorean
deDEGerman
frFRFrench
esESSpanish
ptBRPortuguese (Brazil)
  • Use direction="rtl" for right-to-left languages like Arabic and Hebrew
  • Locale settings affect screen reader text in components like Empty, Pagination, etc.
  • Nested providers allow different regions of your app to have different configurations