v11
This is the migration guide for @dnb/eufemia v11. It covers all breaking changes, removals, and required code updates.
Start here → Follow the Step-by-step migration procedure for a structured, phase-by-phase migration workflow covering all 8 phases. The reference sections below provide details for each step.
How to use this guide: Start with the Step-by-step migration procedure for the ordered workflow. Reference the per-component sections to find individual property renames for a specific component. Check Silent failures TypeScript won't catch after applying changes.
Using AI to migrate? Set up the Eufemia MCP server to give your AI agent access to the full v11 API documentation alongside this migration guide.
Most changes fall into these categories:
- snake_case → camelCase renames — The majority of changes are mechanical property, event, and translation key renames. These can be automated.
- React 19 alignment —
innerRef→ref,Context.Provider→Context, and related updates. - Behavioral changes and removals — API redesigns, removed features, and changed defaults. These require manual review.
Summary of changes
- React 19 required — v11 requires React and React DOM v19.
- IE and Edge (EdgeHTML) no longer supported — All IE- and legacy-Edge-specific CSS rules have been removed from the CSS reset and component styles. Only modern evergreen browsers (Chrome, Firefox, Safari, Chromium-based Edge) are supported.
- All snake_case (
on_click) events and properties have been converted to camelCase (onClick). The reason for previously using snake_case was to support Web Components – but the support was discontinued in v10. labelDirectiondefault changed tovertical— Labels render above the input by default. If you relied on horizontal labels, setlabelDirection="horizontal"explicitly. See labelDirection.- FormRow and FormSet removed — Replace with Flex layout components. See Removal of FormRow and FormSet.
- InputMasked engine replaced — Switched from text-mask to Maskito. Custom masks using
createNumberMaskoremailMaskmust be updated. See InputMasked. - Logo API redesigned — The
brand/variantprops are replaced with ansvgprop import pattern. See Logo. - StepIndicator redesigned — The sidebar mode has been removed. See StepIndicator.
- Ajv no longer auto-instantiated — Ajv is still a dependency, but is no longer automatically instantiated. If you use JSON Schema validation, you must explicitly create and provide an Ajv instance. See Ajv no longer auto-instantiated.
- Dropdown
actionMenu/moreMenuremoved — TheactionMenuandmoreMenuprops on Dropdown have been removed. Use the new Menu component instead. - NumberFormat split into variants — The generic
<NumberFormat />component andformat()utility have been removed. Use variant sub-components like<NumberFormat.Number />,<NumberFormat.Currency />, etc. See NumberFormat. date-fnsupgraded from v2 to v4 — If you importdate-fnsfunctions directly (e.g. for DatePicker'slocaleprop), update your imports to use named exports. See DatePicker.- Replaced deprecated
<Context.Provider>with direct<Context>rendering across all internal context providers (React 19). - Several exported TypeScript
interfacedeclarations have been converted totype. This prevents declaration merging but has no impact on standard usage. - All React context value types have been renamed to use a consistent
...ContextValuesuffix (e.g.AccordionContextProps→AccordionContextValue). See TypeScript for the full list. - Event handler and render function prop types have been replaced with properly typed signatures (e.g.
(...args: any[]) => any→(event: AccordionChangeEvent) => void). See Typed event handlers for the full list.
New in v11
These components are new in v11:
- Menu — A context menu component that replaces Dropdown's
actionMenuandmoreMenuprops. SupportsMenu.Button,Menu.List,Menu.Action,Menu.Accordion,Menu.Header, andMenu.Dividersub-components. - List — A layout component for displaying structured lists with support for icons, titles, content, and accordion behavior.
v10 support timeline
After the v11 release, v10 will continue to receive critical bug fixes and security patches for 6 months. During this period:
- Critical bugs and security vulnerabilities will be patched in v10.
- New features will only be added to v11.
- Non-critical bug fixes will only target v11.
After the 6-month window, v10 will no longer receive updates. We recommend starting your migration early to avoid last-minute pressure.
Install
To upgrade to @dnb/eufemia v11 with NPM, use:
$ npm i @dnb/eufemia@11# or$ yarn add @dnb/eufemia@11# or$ pnpm add @dnb/eufemia@11
Migration
v11 of @dnb/eufemia contains breaking changes.
Important: Upgrading to v11 requires React and React DOM v19 (React 19 Upgrade Guide).
Automated migration: snake_case to camelCase
The largest category of changes in v11 is the rename of all snake_case properties, events, and translation keys to camelCase. This affects every component and can be automated.
The pattern:
- Properties:
selected_key→selectedKey,label_direction→labelDirection - Events:
on_change→onChange,on_click→onClick - Translations:
Autocomplete.no_options→Autocomplete.noOptions
You can use your editor's find-and-replace to handle most of these. Since each snake_case property maps to a specific camelCase name, we recommend using the per-component lists below rather than a generic regex.
Note: Some renames are not just snake_case conversions — they also change the name itself (e.g.
triangle_position→arrowPosition,opened→open,on_show→onOpen). These are listed individually per component below and require manual attention.
The rest of this section covers changes that cannot be automated with a simple find-and-replace and need manual review.
Migration effort levels
To help plan your migration, changes are grouped by effort:
Automated (find-and-replace):
- All snake_case → camelCase property, event, and translation key renames
innerRef→ref<Context.Provider>→<Context>
Semi-automated (value renames — find-and-replace with care):
- Status value
'info'→'information'(applies tostate,statusState,variant,confirmType) - Status value
'warn'→'warning'(applies tostatusState) opened→openon Autocomplete, Dropdown, DrawerList, DatePicker, Tooltip, Field.Dateon_show→onOpenandon_hide→onCloseon Autocomplete, Dropdown, DrawerList, DatePickerprerender→keepInDOMon Tabs, AccordionstyleType/style_type→backgroundColoron Breadcrumb, Dialog.Body, Drawer.Body
Manual review required:
- InputMasked masking engine replacement (text-mask → Maskito)
- StepIndicator redesign (sidebar variant removed)
- DatePicker behavioral changes (segment elements, format strings, focus events)
- Logo API redesign (
brand/variant→svgprop) - Ajv no longer auto-instantiated
- FormRow and FormSet removal
- Card visual changes (outline, border-radius, default innerSpace)
- Button
variant="signal"removal
Semantic renames (not just casing)
These renames change the property or event name itself, not just the casing. They affect multiple components and require targeted find-and-replace:
| Old | New | Affected components |
|---|---|---|
innerRef | ref | 20+ components (see innerRef → ref) |
opened | open | Autocomplete, Dropdown, DrawerList, DatePicker, Tooltip, Field.Date |
on_show / on_hide | onOpen / onClose | Autocomplete, Dropdown, DrawerList, DatePicker |
on_show_focus / on_hide_focus | onOpenFocus / onCloseFocus | Dropdown |
triangle_position | arrowPosition | Autocomplete, Dropdown, DrawerList |
styleType / style_type | backgroundColor | Breadcrumb, Dialog.Body, Drawer.Body |
spacing | innerSpace (object form) | Section, Dialog.Body, Drawer.Body |
input_class / textarea_class | inputClassName / textareaClassName | Input, InputMasked, Textarea |
prerender | keepInDOM | Tabs, Accordion |
as | element | H (heading element) |
size | span | Flex.Item, Card |
align_autocomplete / align_dropdown | align | Autocomplete, Dropdown |
input_icon | icon | Autocomplete |
clear | showClearButton | Input, InputMasked |
visible | show | ProgressIndicator |
show_label | showDefaultLabel | ProgressIndicator |
active / forceOpen | open | Tooltip |
position | placement | Tooltip |
accordion | mode="accordion" | Table |
onClosed / onOpened | onClose / onOpen | Table |
isCollapsed | collapsed | Breadcrumb |
expandBehaviour | expandBehavior | Accordion |
class | className | ProgressIndicator, Button, Tabs, PaymentCard |
contentSpacing / tabsSpacing | contentInnerSpace / tabsInnerSpace | Tabs |
darkMode | colorScheme | Theme |
Import path changes
All import paths that changed or were removed in v11. Update these before changing component APIs — your app won't compile until these are fixed.
| Old import | New import | Notes |
|---|---|---|
@dnb/eufemia/components/input/InputPassword | import { Field } from '@dnb/eufemia/extensions/forms' then use <Field.Password> | Component moved to Eufemia Forms |
@dnb/eufemia/fragments/drawer-list/DrawerList (ItemContent) | @dnb/eufemia/fragments/drawer-list/DrawerListItem (ItemContent) | Named export moved |
@dnb/eufemia/components/form-row/FormRowHelpers (includeValidProps) | @dnb/eufemia/shared/helpers/filterValidProps (pickFormElementProps) | Function moved and renamed |
@dnb/eufemia/components/form-row/FormRowHelpers (prepareFormRowContext) | @dnb/eufemia/shared/helpers/filterValidProps (prepareFormElementContext) | Function moved and renamed |
@dnb/eufemia/components/input-masked/InputMaskedHooks | @dnb/eufemia/components/input-masked/hooks | Path changed |
@dnb/eufemia/components/input-masked/addons/createNumberMask | Removed — use built-in numberMask prop | Addon deleted |
@dnb/eufemia/components/input-masked/addons/emailMask | Removed — use mask prop directly | Addon deleted |
@dnb/eufemia/components/input (inputPropTypes) | Removed | PropTypes no longer provided |
@dnb/eufemia/components/button (buttonVariantPropType) | Removed | PropTypes no longer provided |
style/themes/theme-ui/ | style/themes/ui/ | Path shortened |
style/themes/theme-sbanken/ | style/themes/sbanken/ | Path shortened |
style/themes/theme-eiendom/ | style/themes/eiendom/ | Path shortened |
style/themes/theme-carnegie/ | style/themes/carnegie/ | Path shortened |
@dnb/eufemia/components/space/types (SectionSpacing) | @dnb/eufemia/components/space/types (InnerSpaceType) | Type renamed |
export type { Props } from any Field/Value/Form module | Use component-prefixed name (e.g. FieldStringProps) | See Props Type Exports |
@dnb/eufemia/extensions/payment-card/utils/Types | @dnb/eufemia/extensions/payment-card/utils/types | Filename lowercased for consistency |
Common migration mistakes
These changes look simple but are easy to get wrong. Pay special attention to these:
spacing → innerSpace requires an object, not a string
The spacing prop accepted a string like "large". The replacement innerSpace requires an object with a block key to match the same vertical-only padding behavior. Using innerSpace="large" (plain string) applies padding on all four sides, which will break your layout.
Wrong:
<Section innerSpace="large">Content</Section>
Correct:
<Section innerSpace={{ block: 'large' }}>Content</Section>
This applies to Section, Dialog.Body, and Drawer.Body.
on_show / on_hide → onOpen / onClose is NOT just a casing change
The event names changed semantically. A naive snake_case→camelCase conversion would produce onShow / onHide, which are wrong.
| Old | Wrong (naive conversion) | Correct |
|---|---|---|
on_show | onShow | onOpen |
on_hide | onHide | onClose |
on_show_focus | onShowFocus | onOpenFocus |
on_hide_focus | onHideFocus | onCloseFocus |
Affected components: Autocomplete, Dropdown, DrawerList, DatePicker. The _focus variants only apply to Dropdown.
Note: GlobalStatus still uses onShow / onHide — those are correct for that component and did not change semantically.
Component-specific props — don't apply globally
These renames only apply to specific components. Do not find-and-replace them across the entire codebase:
| Rename | Only applies to | Do NOT apply to |
|---|---|---|
clear → showClearButton | Input, InputMasked | — |
isCollapsed → collapsed | Breadcrumb | — |
input_icon → icon | Autocomplete | Other components that already have icon |
visible → show | ProgressIndicator | Other components with visible prop |
position → placement | Tooltip | Other components with position prop |
children → label | Checkbox, ProgressIndicator | — |
as → element | H (heading element) | — |
accordion → mode="accordion" | Table | Accordion component itself |
size → span | Flex.Item, Card | Other components where size is still valid |
FormRow / FormSet references in context providers
When replacing FormRow, be careful not to just rename the JSX tag. The context provider pattern also changed:
| Old | New |
|---|---|
FormRow= (in Provider config) | formElement= |
FormRow: (in context objects) | formElement: |
Cross-component prop patterns
These snake_case props appear on many components and follow the same rename pattern everywhere. Apply these as global find-and-replace within Eufemia component JSX:
| Old prop | New prop | Components that use it |
|---|---|---|
status_state | statusState | Autocomplete, Checkbox, DatePicker, Dropdown, Input, InputMasked, Radio, Radio.Group, Slider, StepIndicator, Switch, Textarea, ToggleButton, ToggleButton.Group |
status_props | statusProps | Autocomplete, Checkbox, DatePicker, Dropdown, Input, InputMasked, Radio, Radio.Group, Switch, Textarea, ToggleButton, ToggleButton.Group |
status_no_animation | statusNoAnimation | Autocomplete, Checkbox, DatePicker, Dropdown, Input, InputMasked, Radio, Radio.Group, Switch, Textarea, ToggleButton, ToggleButton.Group |
label_direction | labelDirection | Autocomplete, DatePicker, Dropdown, FormLabel, Input, InputMasked, ProgressIndicator, Radio.Group, Slider, Textarea, ToggleButton, ToggleButton.Group |
label_sr_only | labelSrOnly | Autocomplete, Checkbox, DatePicker, Dropdown, Input, InputMasked, Radio.Group, Switch, Textarea, ToggleButton.Group |
label_position | labelPosition | Checkbox, Radio, Switch |
icon_size | iconSize | Autocomplete, Button, GlobalStatus, ProgressIndicator, ToggleButton |
icon_position | iconPosition | Autocomplete, Button, Dropdown, ToggleButton |
no_animation | noAnimation | Autocomplete, DatePicker, Dropdown, DrawerList, FormStatus, GlobalStatus, Modal/Dialog/Drawer, Skeleton, StepIndicator |
on_change | onChange | Nearly all interactive components |
on_focus | onFocus | Autocomplete, Input, Textarea |
on_blur | onBlur | Autocomplete, Input, Textarea |
on_click | onClick | Button, StepIndicator, Tabs, Table.ClickableHead |
inner_ref | ref | All components that accepted innerRef (see innerRef → ref for the full list) |
Status value renames — apply to all components that accept statusState or state:
| Old value | New value |
|---|---|
'warn' | 'warning' |
'info' | 'information' |
CSS class renames — apply wherever these CSS classes are referenced:
| Old CSS class | New CSS class |
|---|---|
dnb-autocomplete--opened | dnb-autocomplete--open |
dnb-dropdown--opened | dnb-dropdown--open |
dnb-drawer-list--opened | dnb-drawer-list--open |
dnb-date-picker--opened | dnb-date-picker--open |
dnb-progress-indicator--visible | dnb-progress-indicator--show |
dnb-anchor--contrast | dnb-anchor--surface-dark |
dnb-number-format--selectall | dnb-number-format--select-all |
dnb-autocomplete__suffixValue | dnb-autocomplete__suffix-value |
dnb-height-animation__compensateForGap | dnb-height-animation__compensate-for-gap |
Step-by-step migration procedure
Follow these steps in order. Steps in Phase 1 are safe to apply as global find-and-replace across your entire codebase. Steps in later phases require scoping or manual review.
Phase 1: Global find-and-replace (safe across entire codebase)
These renames only exist as Eufemia prop/event names and won't collide with other libraries:
- Replace all snake_case props and events with their camelCase equivalents. Use the per-component lists in the Components section below. The most common ones:
on_change→onChange,on_click→onClick,status_state→statusState,label_direction→labelDirection,label_sr_only→labelSrOnly,no_animation→noAnimation,icon_size→iconSize,icon_position→iconPosition. - Replace
innerRefwithrefon all Eufemia components. - Replace
<Context.Provider>with<Context>when using Eufemia contexts directly. - Replace the status value
'info'with'information'(applies tostate,statusState,variant,confirmType). - Replace the status value
'warn'with'warning'(applies tostatusState). - Replace
input_class(orinputClass) withinputClassNameon Input and InputMasked. - Replace
textarea_class(ortextareaClass) withtextareaClassNameon Textarea.
Phase 2: Targeted find-and-replace (scope to specific components)
These renames use generic names that exist in non-Eufemia code. Scope your find-and-replace to JSX using the affected component:
- Replace
openedwithopen— only on Autocomplete, Dropdown, DrawerList, DatePicker, Tooltip, Field.Date. - Replace
on_showwithonOpenandon_hidewithonClose— only on Autocomplete, Dropdown, DrawerList, DatePicker. (Not just a casing change — the name changed semantically. GlobalStatus still usesonShow/onHide.) - Replace
triangle_positionwitharrowPosition— only on Autocomplete, Dropdown, DrawerList. - Replace
clearwithshowClearButton— only on Input, InputMasked. - Replace
isCollapsedwithcollapsed— only on Breadcrumb. - Replace
visiblewithshow— only on ProgressIndicator. - Replace
positionwithplacement— only on Tooltip. - Replace
childrenwithlabel— only on Checkbox, ProgressIndicator. - Replace
activeorforceOpenwithopen— only on Tooltip. - Replace
aswithelement— only on H (heading element). - Replace
sizewithspan— only on Flex.Item, Card. - Replace
input_iconwithicon— only on Autocomplete. - Replace
accordionwithmode="accordion"— only on Table. - Replace
prerenderwithkeepInDOM— only on Tabs, Accordion. - Replace
styleType(orstyle_type) withbackgroundColor— only on Breadcrumb, Dialog.Body, Drawer.Body. - Replace
contentSpacingwithcontentInnerSpaceandtabsSpacingwithtabsInnerSpace— only on Tabs.
Phase 3: Structural and visual changes (require code modification or review)
- Visual review: The
labelDirectiondefault has changed tovertical. If your layouts relied on horizontal labels, addlabelDirection="horizontal"explicitly. See labelDirection default changed to vertical. - Visual review: Card outline, border-radius, and default
innerSpacehave changed. Review your Card layouts. See Card. - Replace
spacingwithinnerSpace={{ block: 'value' }}on Section, Dialog.Body, Drawer.Body. Do NOT useinnerSpace="large"— it must be an object. See Section. - Replace
Theme.ProviderwithTheme.ContextanddarkBackgroundwithsurface="dark". See Theme.Provider → Theme.Context. - Replace
<FormRow>with<Flex.Horizontal align="baseline">and<FormRow vertical>with<Flex.Vertical>. ReplaceFormRow=withformElement=in Provider config. See Removal of FormRow and FormSet. - Replace
openState="opened"withopen={true}andopenState="closed"withopen={false}on Modal/Dialog/Drawer. - Update
dateFormatandreturnFormatstrings:YYYY→yyyy,DD→ddon DatePicker. - Replace
Stat.AmountwithStat.Number,Stat.Info variant="default"withvariant="plain". - Replace Logo
brand/variantprops withsvgprop import pattern. See Logo.
Phase 4: Import path and module changes
- Update all changed import paths. See Import path changes.
- If using Ajv with JSON Schema validation, add
ajvInstance={makeAjvInstance()}toForm.Handler. See Ajv no longer auto-instantiated. - Replace
InputPasswordimport withField.Passwordfrom Eufemia Forms. See InputPassword moved to Field.Password. - Replace
StepsLayoutwithWizard.Container,StepsLayout.StepwithWizard.Step, etc.
Phase 5: SCSS changes
- If you import Eufemia SCSS source files with
@import, replace with@useand namespace your calls. See SCSS: @import → @use. - Rename all SCSS mixin references to camelCase. See SCSS mixin renames.
- Remove
extendFocusRingandcomponentResetSCSS mixin calls — they have been deleted.
Phase 6: TypeScript type updates
- Update any imported context value types (
AccordionContextProps→AccordionContextValue, etc.). See TypeScript. - Update any Props type imports (
Props→ component-prefixed name). See Props Type Exports. - Update event handler types to match new typed signatures. See Typed event handlers.
Phase 7: Eufemia Forms behavioral changes
- Replace
validatorwithonChangeValidatoron all Field components. - Replace
continuousValidationwithvalidateContinuouslyon all Field components. - Update
errorMessagesobject keys:required→Field.errorRequired,pattern→Field.errorPattern, etc. See Error handling. - Replace
Form.useErrorwithForm.useValidation,Form.useLocalewithForm.useTranslation. - Replace
Form.Visibilityprops:withValue→hasValue,pathValue/whenValue→visibleWhen. - Replace
Form.FieldPropswithField.Provider. - Replace
<Card stack>with<Form.Card>and<Card>(inside forms) with<Form.Card>. - Replace
Iterate.ArrayPushButtonwithIterate.PushButtonandIterate.ArrayRemoveElementButtonwithIterate.RemoveButton. - Replace
requireCommitwithpreventUncommittedChangesonIterate.PushContainer. - Replace
activewithincludeandactiveWhenwithincludeWhenonWizard.Step. - Replace Form.Iterate label variable
{itemNr}with{itemNo}. - Review all remaining changes in the Eufemia Forms section.
Phase 8: Verify
- Run
npx tsc --noEmitto catch remaining type errors. - Run your tests. Update any test selectors that query DatePicker/Expiry
inputelements (nowrole="spinbutton"sections). - Search for remaining snake_case patterns using the grep command in Verifying your migration.
Find-and-replace safety guide
Safe for global find-and-replace — these prop names are Eufemia-specific and won't collide with other code:
on_change, on_click, on_focus, on_blur, on_submit, on_key_down, on_type, on_select, on_clear, on_open, on_close, on_cancel, on_reset, on_complete, on_resize, on_end, on_load, on_startup, on_adjust, on_days_render, on_submit_focus, on_submit_blur, status_state, status_props, status_no_animation, label_direction, label_sr_only, label_position, icon_size, icon_position, no_animation, inner_ref, selected_key, default_value, prevent_selection, prevent_close, keep_open, independent_width, fixed_position, enable_body_lock, skip_portal, cache_hash, no_scroll_animation, min_height, max_height, input_element, submit_element, submit_button_title, submit_button_icon, submit_button_variant, clear_button_title, keep_placeholder, input_attributes, inner_element.
Note:
on_state_updateis not in this list because it has been removed, not renamed. If you usedon_state_update, replace it withonChangeinstead.
Must be scoped to specific components — these names exist outside Eufemia or overlap across components with different meanings:
| Rename | Scope to | Risk if applied globally |
|---|---|---|
opened → open | Autocomplete, Dropdown, DrawerList, DatePicker, Tooltip, Field.Date | Collides with HTML open attribute on <details> |
clear → showClearButton | Input, InputMasked | Collides with generic clear functions |
visible → show | ProgressIndicator | Collides with generic visible props |
position → placement | Tooltip | Collides with CSS position prop/style |
children → label | Checkbox, ProgressIndicator | children is a React universal prop |
as → element | H (heading element) | as is used by styled-components and other libs |
size → span | Flex.Item, Card | size is used by many non-Eufemia components |
active → open | Tooltip | active is a common generic prop |
accordion → mode="accordion" | Table | Prop-to-prop+value change, not a simple rename |
input_icon → icon | Autocomplete | Other components already have different icon props |
spacing → innerSpace | Section, Dialog.Body, Drawer.Body | Requires object form { block: '...' }, not string |
on_show → onOpen | Autocomplete, Dropdown, DrawerList, DatePicker | Semantic change; GlobalStatus keeps onShow |
on_hide → onClose | Autocomplete, Dropdown, DrawerList, DatePicker | Semantic change; GlobalStatus keeps onHide |
Verifying your migration
After applying changes, use these commands to validate:
TypeScript check — catches missed renames, wrong prop types, and removed APIs:
npx tsc --noEmit
Search for remaining snake_case — catches props you missed:
grep -rn 'on_\|status_\|label_\|icon_\|_class\b\|inner_ref\|_state\|_position\|_button\|_text\|_sr_' \--include='*.tsx' --include='*.ts' src/
Note: This grep only catches snake_case patterns. Semantic renames like
opened→open,prerender→keepInDOM,clear→showClearButton, andexpandBehaviour→expandBehaviorrequire manual review using the Semantic renames table.
Common TypeScript errors and what they mean:
| Error | Cause | Fix |
|---|---|---|
Property 'on_change' does not exist | Missed snake_case → camelCase rename | Replace with onChange |
Property 'innerRef' does not exist | Missed innerRef → ref | Replace with ref |
Type '"info"' is not assignable | Missed status value rename | Replace 'info' with 'information' |
Type '"warn"' is not assignable | Missed status value rename | Replace 'warn' with 'warning' |
Module not found: '@dnb/eufemia/components/input/InputPassword' | Import path moved | Use Field.Password from @dnb/eufemia/extensions/forms |
Property 'spacing' does not exist | Removed prop | Replace with innerSpace={{ block: 'value' }} |
Property 'brand' does not exist on Logo | Logo API redesigned | Import SVG component and use svg prop |
Type '"signal"' is not assignable on Button | Variant removed | Use variant="primary" or variant="secondary" |
Cannot find name 'FormRow' | Component removed | Replace with Flex.Horizontal or Flex.Vertical |
Property 'opened' does not exist | Prop renamed | Replace with open |
Silent failures TypeScript won't catch
TypeScript catches most v10 → v11 errors, but these three categories compile without errors and fail silently at runtime. You must search for them manually after migration.
1. Data object property renames
Dropdown, Autocomplete, DrawerList, and Field.Selection accept data arrays with objects. The DrawerListDataArrayObject type allows arbitrary keys ([key: string]: any), so TypeScript will not flag old snake_case property names. The component simply won't find the values it expects.
Compiles but broken:
<Dropdowndata={[{ selected_key: 'no', content: 'Norway' }, // silent failure{ selected_key: 'se', content: 'Sweden' }, // silent failure]}/>
Correct:
<Dropdowndata={[{ selectedKey: 'no', content: 'Norway' },{ selectedKey: 'se', content: 'Sweden' },]}/>
Search for old data property names:
grep -rn 'selected_key\|selected_value\|suffix_value\|search_content\|class_name' \--include='*.tsx' --include='*.ts' src/
2. Event callback return object renames
Several components renamed properties on the objects passed to event callbacks. If you destructure the old property names, the values will be undefined at runtime with no TypeScript error (because callback parameter types are often inferred loosely).
DatePicker onChange return object:
| Old property | New property |
|---|---|
days_between | daysBetween |
is_valid | isValid |
is_valid_start_date | isValidStartDate |
is_valid_end_date | isValidEndDate |
Field.Date onType return object:
| Old property | New property |
|---|---|
start_date | startDate |
end_date | endDate |
is_valid | isValid |
Search for old callback property access:
grep -rn 'days_between\|is_valid\|is_valid_start_date\|is_valid_end_date\|start_date\|end_date' \--include='*.tsx' --include='*.ts' src/
3. CSS class selectors in strings and tests
CSS class names used in querySelector, test assertions, or CSS/SCSS files are plain strings that TypeScript cannot validate.
Search for all renamed CSS classes:
grep -rn 'dnb-autocomplete--opened\|dnb-dropdown--opened\|dnb-drawer-list--opened\|dnb-date-picker--opened\|dnb-progress-indicator--visible\|dnb-anchor--contrast\|dnb-number-format--selectall\|dnb-section--spacing' \--include='*.tsx' --include='*.ts' --include='*.scss' --include='*.css' src/
Also check DatePicker/Expiry test selectors — the visible date segments changed from native input elements to role="spinbutton" sections:
// Before (v10) — queried native input elementsdocument.querySelector('.dnb-date-picker input')// After (v11) — use role-based selectorsdocument.querySelector('[role="spinbutton"]')// ordocument.querySelector('.dnb-segmented-field__section')
4. Theme darkMode prop silently ignored
The darkMode prop on Theme was replaced with colorScheme. Passing darkMode compiles without error but is silently ignored. The CSS class also changed from eufemia-theme__dark-mode to eufemia-theme__color-scheme--dark.
Search for old usage:
grep -rn 'darkMode\|eufemia-theme__dark-mode' \--include='*.tsx' --include='*.ts' --include='*.scss' --include='*.css' src/
5. Provider locales prop silently ignored
The locales prop on Provider and Context was removed in favor of translations. Passing locales compiles without error but is silently ignored, meaning your custom translations will not be applied.
Search for old usage:
grep -rn 'locales=' --include='*.tsx' --include='*.ts' src/
Complete migration example
This example shows a realistic v10 component migrated to v11, combining multiple change categories:
Before (v10):
import {Input,Dropdown,DatePicker,Section,Button,FormRow,} from '@dnb/eufemia'import { Provider } from '@dnb/eufemia/shared'function MyForm({ formRef }) {return (<Provider FormRow={{ label_direction: 'vertical' }}><Section spacing="large" style_type="white"><FormRow><Inputlabel="Name"on_change={({ value }) => console.log(value)}status="Error message"status_state="error"innerRef={formRef}/><Dropdownlabel="Country"selected_key="no"on_change={({ data }) => console.log(data)}opened={false}on_show={() => console.log('opened')}on_hide={() => console.log('closed')}triangle_position="left"data={[{ selected_key: 'no', content: 'Norway' },{ selected_key: 'se', content: 'Sweden' },]}/><DatePickerlabel="Start date"date_format="YYYY/MM/DD"return_format="YYYY-MM-DD"on_change={({ date }) => console.log(date)}on_show={() => console.log('shown')}on_hide={() => console.log('hidden')}/></FormRow><Button variant="signal" on_click={() => console.log('submit')}>Submit</Button></Section></Provider>)}
After (v11):
import {Input,Dropdown,Flex,DatePicker,Section,Button,} from '@dnb/eufemia'import { Provider } from '@dnb/eufemia/shared'function MyForm({ formRef }) {return (<Provider formElement={{ labelDirection: 'vertical' }}><Section innerSpace={{ block: 'large' }} backgroundColor="white"><Flex.Horizontal align="baseline"><Inputlabel="Name"onChange={({ value }) => console.log(value)}status="Error message"statusState="error"ref={formRef}/><Dropdownlabel="Country"selectedKey="no"onChange={({ data }) => console.log(data)}open={false}onOpen={() => console.log('opened')}onClose={() => console.log('closed')}arrowPosition="left"data={[{ selectedKey: 'no', content: 'Norway' },{ selectedKey: 'se', content: 'Sweden' },]}/><DatePickerlabel="Start date"dateFormat="yyyy/MM/dd"returnFormat="yyyy-MM-dd"onChange={({ date }) => console.log(date)}onOpen={() => console.log('shown')}onClose={() => console.log('hidden')}/></Flex.Horizontal><Button variant="primary" onClick={() => console.log('submit')}>Submit</Button></Section></Provider>)}
What changed (13 categories in one component):
FormRow→Flex.Horizontal align="baseline"(removed component)FormRow={{ label_direction: 'vertical' }}→formElement={{ labelDirection: 'vertical' }}(Provider config)spacing="large"→innerSpace={{ block: 'large' }}(structural change — object required)style_type="white"→backgroundColor="white"(semantic rename)on_change/on_click→onChange/onClick(snake_case → camelCase)status_state→statusState(snake_case → camelCase)innerRef→ref(React 19)selected_key→selectedKey(snake_case → camelCase, in both props and data objects)opened→open(semantic rename)on_show/on_hide→onOpen/onClose(semantic rename — NOTonShow/onHide)triangle_position→arrowPosition(semantic rename)date_format="YYYY/MM/DD"→dateFormat="yyyy/MM/dd"(casing + format string change)variant="signal"→variant="primary"(removed variant)
innerRef → ref
React 19 passes ref as a regular prop, making forwardRef and custom innerRef patterns unnecessary. All Eufemia components that previously accepted an innerRef prop now accept ref directly.
Before:
<Input innerRef={myRef} /><Button innerRef={myRef} /><Element innerRef={myRef} />
After:
<Input ref={myRef} /><Button ref={myRef} /><Element ref={myRef} />
Affected components: Anchor, Button, Checkbox, Dropdown, Element, FormLabel, HeightAnimation, Input, InputMasked, PortalRoot, Radio, ScrollView, Section, Space, Switch, Textarea, Typography, Flex.Item, Flex.Container, Field.String, Field.Number, Field.Password, Field.PhoneNumber, Form.Element, and all Element wrappers (Div, Span, Code, etc.).
Context.Provider → Context
React 19 deprecates <Context.Provider>. You can now render <Context> directly as a provider. All internal Eufemia context providers have been updated to use this pattern.
If you use any Eufemia context objects directly (e.g. Wizard.Provider), update your code:
Before:
<SomeContext.Provider value={value}>{children}</SomeContext.Provider>
After:
<SomeContext value={value}>{children}</SomeContext>
Theme.Provider → Theme.Context
Theme.Provider has been renamed to Theme.Context to align with React 19's context-as-provider pattern. The darkBackground prop has been removed in favor of surface="dark":
Before:
<Theme.Provider darkBackground><Button>Primary</Button></Theme.Provider>
After:
<Theme.Context surface="dark"><Button>Primary</Button></Theme.Context>
Theme.Provider has been removed.
Theme propMapping removed
The propMapping prop has been removed from the Theme component. If you relied on it, use CSS custom properties directly on your theme wrapper instead.
Theme darkMode → colorScheme
The darkMode prop on the Theme component has been replaced with colorScheme, which accepts 'auto', 'light', or 'dark'. The CSS class eufemia-theme__dark-mode has been renamed to eufemia-theme__color-scheme--dark (or --light).
Before:
<Theme darkMode><MyApp /></Theme>
After:
<Theme colorScheme="dark"><MyApp /></Theme>
Note: This is a silent failure — passing
darkModewill not cause a TypeScript error but the prop will be ignored.
Components
Each component section below lists its changes. Behavioral changes and removals are called out separately where applicable. The bulk of per-component changes are snake_case → camelCase renames covered by the automated migration section above.
Reading the per-component lists: Entries like
on_change→onChangeare JSX prop renames (apply in your component markup). Entries prefixed with the component name and a dot, likeAutocomplete.no_options→Autocomplete.noOptions, are translation key renames — these appear in locale/Provider configuration objects, not as JSX attributes. Do not add them as JSX props.
labelDirection default changed to vertical
The labelDirection prop now defaults to vertical instead of horizontal on all basis form components. This means labels are rendered above the input by default. If you relied on the horizontal default, explicitly set labelDirection="horizontal".
Affected components: Input, InputMasked, Textarea, Autocomplete, Dropdown, DatePicker, Slider, ProgressIndicator, ToggleButton, ToggleButton.Group, Radio.Group, FormLabel.
If you used <Provider formElement={{ labelDirection: 'vertical' }}> or labelDirection="vertical" to achieve vertical labels, you can now remove them.
Section
- All deprecated
style_typevariants and their legacydnb-section--...theme classes were removed. Use thevariantorbackgroundColorproperty instead:
mint-green-12mint-greensea-greenemerald-greenlavenderblack-3sand-yellowpistachiofire-redfire-red-8
- Remove
spacing. UseinnerSpaceinstead. Thespacingprop only applied vertical (top/bottom) padding, so use theblockshorthand to match the old behavior:
spacing->innerSpace={{ block: 'large' }}spacing="x-small"->innerSpace={{ block: 'x-small' }}spacing="small"->innerSpace={{ block: 'small' }}spacing="medium"->innerSpace={{ block: 'medium' }}spacing="large"->innerSpace={{ block: 'large' }}spacing="x-large"->innerSpace={{ block: 'x-large' }}spacing="xx-large"->innerSpace={{ block: 'xx-large' }}
You can also use top and bottom individually if you need different values, e.g. innerSpace={{ top: 'small', bottom: 'large' }}. Note that innerSpace="large" (a plain string) applies padding on all four sides, not just top/bottom.
-
Replace
variant's valueinfowithinformation. -
Replace
inner_refwithref.
Types
- The exported
SectionSpacingtype has been removed. If you imported it (e.g. for Breadcrumb or custom components), use theInnerSpaceTypefrom@dnb/eufemia/components/space/typesinstead.
Styling
- Remove CSS classes
dnb-section--spacing,dnb-section--spacing-small, etc, as they are not supported anymore.
HelpButton
Translations
- Replace
HelpButton.aria_rolewithHelpButton.ariaRole.
Autocomplete
Removals and behavioral changes:
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - Replace
input_iconwithicon. TheinputIconprop has been removed — use theiconprop instead (defaults to'loupe'). - Replace
openedwithopen. - Replace
align_autocompletewithalign. - Replace
on_showwithonOpenandon_hidewithonClose(not just a casing change — the event names changed).
Properties
The following properties have been renamed from snake_case to camelCase:
- Replace
selected_keywithselectedKey. - Replace
default_valuewithdefaultValue. - Replace
prevent_selectionwithpreventSelection. - Replace
prevent_closewithpreventClose. - Replace
keep_openwithkeepOpen. - Replace
independent_widthwithindependentWidth. - Replace
fixed_positionwithfixedPosition. - Replace
enable_body_lockwithenableBodyLock. - Replace
align_drawerwithalignDrawer. - Replace
list_classwithlistClass. - Replace
portal_classwithportalClass. - Replace
no_scroll_animationwithnoScrollAnimation. - Replace
skip_portalwithskipPortal. - Replace
min_heightwithminHeight. - Replace
max_heightwithmaxHeight. - Replace
observer_elementwithobserverElement. - Replace
cache_hashwithcacheHash. - Replace
wrapper_elementwithwrapperElement. - Replace
options_renderwithoptionsRender. - Replace
triangle_positionwitharrowPosition. - Replace
skip_keysearchwithskipKeysearch. - Replace
page_offsetwithpageOffset. - Replace
ignore_eventswithignoreEvents. - Replace
no_animationwithnoAnimation. - Replace
label_directionwithlabelDirection. - Replace
no_optionswithnoOptions. - Replace
show_allwithshowAll. - Replace
aria_live_optionswithariaLiveOptions. - Replace
indicator_labelwithindicatorLabel. - Replace
show_options_srwithshowOptionsSr. - Replace
selected_srwithselectedSr. - Replace
submit_button_titlewithsubmitButtonTitle. - Replace
submit_button_iconwithsubmitButtonIcon. - Replace
input_refwithinputRef. - Replace
icon_sizewithiconSize. - Replace
icon_positionwithiconPosition. - Replace
label_sr_onlywithlabelSrOnly. - Replace
keep_valuewithkeepValue. - Replace
keep_selectionwithkeepSelection. - Replace
keep_value_and_selectionwithkeepValueAndSelection. - Replace
show_clear_buttonwithshowClearButton. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
disable_filterwithdisableFilter. - Replace
disable_reorderwithdisableReorder. - Replace
disable_highlightingwithdisableHighlighting. - Replace
show_submit_buttonwithshowSubmitButton. - Replace
submit_elementwithsubmitElement. - Replace
input_elementwithinputElement. - Replace
search_in_word_indexwithsearchInWordIndex. - Replace
search_numberswithsearchNumbers. - Replace
input_valuewithinputValue. - Replace
open_on_focuswithopenOnFocus. - Replace
drawer_classwithdrawerClass. - Replace
prevent_focuswithpreventFocus. - Removed:
action_menu/actionMenu. Use the new Menu component instead. - Replace
is_popupwithisPopup. - Replace
selectallwithselectAll.
Events
- Replace
on_typewithonType. - Replace
on_focuswithonFocus. - Replace
on_blurwithonBlur. - Replace
on_changewithonChange. - Replace
on_selectwithonSelect. - Replace
on_showwithonOpen. - Replace
on_hidewithonClose.
Translations
- Replace
Autocomplete.no_optionswithAutocomplete.noOptions. - Replace
Autocomplete.show_allwithAutocomplete.showAll. - Replace
Autocomplete.aria_live_optionswithAutocomplete.ariaLiveOptions. - Replace
Autocomplete.indicator_labelwithAutocomplete.indicatorLabel. - Replace
Autocomplete.show_options_srwithAutocomplete.showOptionsSr. - Replace
Autocomplete.selected_srwithAutocomplete.selectedSr. - Replace
Autocomplete.submit_button_titlewithAutocomplete.submitButtonTitle.
Styling
- Replace CSS class
dnb-autocomplete--openedwithdnb-autocomplete--open. - Replace CSS class
dnb-autocomplete__suffixValuewithdnb-autocomplete__suffix-value(BEM kebab-case fix).
TypeScript types
- Replace
AutocompleteClearEventwithAutocompleteOnClearParams. - Replace
AutocompleteTypeEventwithAutocompleteOnTypeParams. - Replace
AutocompleteFocusEventwithAutocompleteOnFocusParams. - Replace
AutocompleteBlurEventwithAutocompleteOnBlurParams. - Replace
AutocompleteChangeEventwithAutocompleteOnChangeParams. - Replace
AutocompleteSelectEventwithAutocompleteOnSelectParams.
DrawerListDataArrayObject
Data object property renames: selected_value → selectedValue, suffix_value → suffixValue, search_content → searchContent, class_name → className. See DrawerList for details.
Dropdown
Removals and behavioral changes:
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - The
actionMenuprop has been removed. Use the new Menu component instead. - The
moreMenuprop has been removed. Use the new Menu component instead. - Replace
openedwithopen. - Replace
align_dropdownwithalign. - Replace
on_showwithonOpenandon_hidewithonClose(not just a casing change — the event names changed).
Properties
The following properties have been renamed from snake_case to camelCase:
- Replace
selected_keywithselectedKey. - Replace
default_valuewithdefaultValue. - Replace
prevent_selectionwithpreventSelection. - Replace
prevent_closewithpreventClose. - Replace
keep_openwithkeepOpen. - Replace
independent_widthwithindependentWidth. - Replace
fixed_positionwithfixedPosition. - Replace
enable_body_lockwithenableBodyLock. - Replace
align_drawerwithalignDrawer. - Replace
list_classwithlistClass. - Replace
portal_classwithportalClass. - Replace
no_scroll_animationwithnoScrollAnimation. - Replace
skip_portalwithskipPortal. - Replace
min_heightwithminHeight. - Replace
max_heightwithmaxHeight. - Replace
observer_elementwithobserverElement. - Replace
cache_hashwithcacheHash. - Replace
wrapper_elementwithwrapperElement. - Replace
options_renderwithoptionsRender. - Replace
triangle_positionwitharrowPosition. - Replace
skip_keysearchwithskipKeysearch. - Replace
page_offsetwithpageOffset. - Replace
ignore_eventswithignoreEvents. - Replace
no_animationwithnoAnimation. - Replace
label_directionwithlabelDirection. - Replace
icon_sizewithiconSize. - Replace
icon_positionwithiconPosition. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Removed:
more_menu/moreMenu. Use the new Menu component instead. - Replace
trigger_elementwithtriggerElement. - Replace
open_on_focuswithopenOnFocus. - Removed:
action_menu/actionMenu. Use the new Menu component instead. - Replace
is_popupwithisPopup. - Replace
prevent_focuswithpreventFocus.
Events
- Replace
on_changewithonChange. - Replace
on_selectwithonSelect. - Replace
on_showwithonOpen. - Replace
on_hidewithonClose. - Replace
on_show_focuswithonOpenFocus. - Replace
on_hide_focuswithonCloseFocus.
Styling
- Replace CSS class
dnb-dropdown--openedwithdnb-dropdown--open.
DrawerListDataArrayObject
Data object property renames: selected_value → selectedValue, suffix_value → suffixValue, search_content → searchContent, class_name → className. See DrawerList for details.
DrawerList
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - Replace type
DrawerListDataObjectUnionwithDrawerListDataArrayItem. - Replace type
DrawerListDataObjectwithDrawerListDataArrayObject. - Replace
import { ItemContent } from '@dnb/eufemia/fragments/drawer-list/DrawerList'withimport { ItemContent } from '@dnb/eufemia/fragments/drawer-list/DrawerListItem'. - Replace
selected_keywithselectedKey. - Replace
default_valuewithdefaultValue. - Replace
prevent_selectionwithpreventSelection. - Replace
prevent_closewithpreventClose. - Replace
keep_openwithkeepOpen. - Replace
independent_widthwithindependentWidth. - Replace
fixed_positionwithfixedPosition. - Replace
enable_body_lockwithenableBodyLock. - Replace
align_drawerwithalignDrawer. - Replace
list_classwithlistClass. - Replace
portal_classwithportalClass. - Replace
no_scroll_animationwithnoScrollAnimation. - Replace
skip_portalwithskipPortal. - Replace
min_heightwithminHeight. - Replace
max_heightwithmaxHeight. - Replace
observer_elementwithobserverElement. - Replace
cache_hashwithcacheHash. - Replace
wrapper_elementwithwrapperElement. - Replace
options_renderwithoptionsRender. - Replace
triangle_positionwitharrowPosition. - Replace
skip_keysearchwithskipKeysearch. - Replace
page_offsetwithpageOffset. - Replace
ignore_eventswithignoreEvents. - Replace
no_animationwithnoAnimation. - Replace
label_directionwithlabelDirection. - Removed:
action_menu/actionMenu. Use the new Menu component instead. - Replace
is_popupwithisPopup. - Replace
prevent_focuswithpreventFocus. - Replace
openedwithopen. - Remove
prepared_data.
Events
- Replace
on_showwithonOpen. - Replace
on_hidewithonClose. - Replace
handle_dismiss_focuswithhandleDismissFocus. - Replace
on_changewithonChange. - Replace
on_pre_changewithonPreChange. - Replace
on_resizewithonResize. - Replace
on_selectwithonSelect.
Styling
- Replace CSS class
dnb-drawer-list--openedwithdnb-drawer-list--open.
DrawerListDataArrayObject
- Replace
selected_valuewithselectedValue. - Replace
suffix_valuewithsuffixValue. - Replace
search_contentwithsearchContent. - Replace
class_namewithclassName.
Anchor
- When using icons in an Anchor (text link), use the
iconproperty instead of inlining it.
Properties
- Find and remove
scrollToHashHandler. Smooth hash scrolling is now supported by all major browsers. - Replace
inner_refwithref.
Styling
- Replace CSS class
dnb-anchor--contrastwithdnb-anchor--surface-dark.
Input
Removals:
- The
inputPropTypesexport has been removed as part of the PropTypes removal. If you were importing it viaimport { inputPropTypes } from '@dnb/eufemia/components/input', remove the import — runtime prop validation is no longer provided. - The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - Replace
clearwithshowClearButton. - Replace
input_classwithinputClassName(note the name change, not just casing).
Properties
The following properties have been renamed from snake_case to camelCase:
- Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
input_statewithinputState. - Replace
submit_button_titlewithsubmitButtonTitle. - Replace
clear_button_titlewithclearButtonTitle. - Replace
keep_placeholderwithkeepPlaceholder. - Replace
input_attributeswithinputAttributes. - Replace
input_elementwithinputElement. - Replace
icon_sizewithiconSize. - Replace
icon_positionwithiconPosition. - Replace
inner_refwithref. - Replace
inner_elementwithinnerElement. - Replace
submit_elementwithsubmitElement. - Replace
submit_button_variantwithsubmitButtonVariant. - Replace
submit_button_iconwithsubmitButtonIcon. - Replace
submit_button_statuswithsubmitButtonStatus. - Replace
selectallwithselectAll.
Events
- Replace
on_changewithonChange. - Replace
on_focuswithonFocus. - Replace
on_key_downwithonKeyDown. - Replace
on_blurwithonBlur. - Replace
on_submitwithonSubmit. - Replace
on_submit_focuswithonSubmitFocus. - Replace
on_submit_blurwithonSubmitBlur. - Replace
on_clearwithonClear.
Translations
- Replace
Input.submit_button_titlewithInput.submitButtonTitle. - Replace
Input.clear_button_titlewithInput.clearButtonTitle.
SubmitButton
- Replace
icon_sizewithiconSize. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps.
InputMasked
Major change: The masking engine has been replaced. Read this section carefully.
In v11, the InputMasked component has been rewritten to use Maskito instead of the unmaintained text-mask library. This brings better input handling, improved mobile keyboard support, and more reliable cursor/caret behavior. The public API (mask, numberMask, currencyMask, asNumber, asCurrency, asPercent, etc.) remains the same — the masking engine underneath has changed.
New props added:
allowOverflow– allow typing beyond the defined mask length.overwriteMode– control how overwriting characters is handled (shiftorreplace).
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - Replace
clearwithshowClearButton. - Replace
label_directionwithlabelDirection. - Replace
number_maskwithnumberMask. - Replace
currency_maskwithcurrencyMask. - Replace
mask_optionswithmaskOptions. - Replace
number_formatwithnumberFormat. - Replace
as_currencywithasCurrency. - Replace
as_numberwithasNumber. - Replace
as_percentwithasPercent. - Replace
show_maskwithshowMask. - Replace
inner_refwithref. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
input_statewithinputState. - Replace
submit_button_titlewithsubmitButtonTitle. - Replace
clear_button_titlewithclearButtonTitle. - Replace
keep_placeholderwithkeepPlaceholder. - Replace
input_classwithinputClassName. - Replace
input_attributeswithinputAttributes. - Replace
input_elementwithinputElement. - Replace
icon_sizewithiconSize. - Replace
icon_positionwithiconPosition. - Replace
inner_elementwithinnerElement. - Replace
submit_elementwithsubmitElement. - Replace
submit_button_variantwithsubmitButtonVariant. - Replace
submit_button_iconwithsubmitButtonIcon. - Replace
submit_button_statuswithsubmitButtonStatus. - Replace
selectallwithselectAll.
Events
- Replace
on_changewithonChange. - Replace
on_submitwithonSubmit. - Replace
on_focuswithonFocus. - Replace
on_blurwithonBlur. - Replace
on_submit_focuswithonSubmitFocus. - Replace
on_submit_blurwithonSubmitBlur.
Deprecations and removals
-
MultiInputMaskhas been removed as a public component. If you were importing it directly, useInputMaskedinstead. -
show_guidehas been removed. If you need to communicate an expected format, pass an example using the regularplaceholderprop (e.g.placeholder="00 00 00") or provide helper text next to the field. -
keep_char_positionshas been removed. -
placeholder_charhas been removed. -
pipehas been removed. -
MaskFunction(function-based masks) has been removed. Maskito only supports array masks (Array<string | RegExp>) and RegExp masks. Convert any custom mask functions to array-based masks.Before:
// Function-based mask (no longer supported)<InputMasked mask={(value) => value.split('').map(() => /\d/)} />// Object-wrapped mask (no longer supported)<InputMasked mask={{ mask: [/\d/, /\d/, '/', /\d/, /\d/] }} />After:
// Array mask (use directly)<InputMasked mask={[/\d/, /\d/, '/', /\d/, /\d/]} /> -
The
{ mask: ... }object form for masks has been removed. Use array masks directly instead of wrapping them in an object. -
The addon helpers
createNumberMaskandemailMaskhave been removed. The following imports no longer work and should be deleted or replaced:import createNumberMask from '@dnb/eufemia/components/input-masked/addons/createNumberMask'import emailMask from '@dnb/eufemia/components/input-masked/addons/emailMask' -
The backward-compatibility re-export file
InputMaskedHookshas been removed. If you imported hooks from@dnb/eufemia/components/input-masked/InputMaskedHooks, import from@dnb/eufemia/components/input-masked/hooksinstead.
FormLabel
Properties
- Replace
for_idwithforId. - Replace
sr_onlywithsrOnly.
Radio
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - The deprecated
attributesprop has been removed. Use spread props instead. - Replace
label_sr_onlywithlabelSrOnly. - Replace
label_positionwithlabelPosition. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation.
Events
- Replace
on_changewithonChange.
Radio.Group
Properties
- The deprecated
attributesprop has been removed. Use spread props instead. - Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
label_positionwithlabelPosition. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
layout_directionwithlayoutDirection.
Events
- Replace
on_changewithonChange.
Textarea
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - The deprecated
textareaAttributesprop has been removed. Use spread props instead. - Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
textarea_statewithtextareaState. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
autoresize_max_rowswithautoResizeMaxRows. - Replace
autoresizewithautoResize. - Replace
textarea_classwithtextareaClassName. - Replace
textarea_attributeswithtextareaAttributes. - Replace
inner_refwithref. - Replace
textarea_elementwithtextareaElement.
Events
- Replace
on_changewithonChange. - Replace
on_focuswithonFocus. - Replace
on_blurwithonBlur. - Replace
on_key_downwithonKeyDown.
Accordion
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - The deprecated
attributesprop has been removed. Use spread props instead. - Replace
expandBehaviourwithexpandBehavior. - Replace
expanded_ssrwithexpandedSsr. - Replace
heading_levelwithheadingLevel. - Replace
icon_sizewithiconSize. - Replace
single_containerwithsingleContainer. - Replace
left_componentwithleftComponent. - Replace
flush_remembered_statewithflushRememberedState. - Replace
icon_positionwithiconPosition. - Replace
prevent_rerender_conditionalwithpreventRerenderConditional. - Replace
remember_statewithrememberState. - Replace
prevent_rerenderwithpreventRerender. - Replace
no_animationwithnoAnimation. - Replace
prerenderwithkeepInDOM.
Events
- Replace
on_changewithonChange.
Accordion.Group
Properties
- Replace
allow_close_allwithallowCloseAll. - Replace
expanded_idwithexpandedId.
Accordion.Provider
Properties
- Replace
expanded_idwithexpandedId.
Tag
Events
- Replace
onDeletewithonClick, and addvariant="removable".
Upload
Properties
- Replace
variant="normal"withvariant="default". - Replace
fileListAriaLabelwithlistAriaLabel.
Stat
Removals
Stat.Amounthas been removed. UseStat.Numberinstead.Stat.Infono longer acceptsvariant="default". Usevariant="plain"instead.Stat.Labelno longer acceptsvariant="default". Usevariant="plain"instead.
Before:
<Stat.Amount value={1000} /><Stat.Info variant="default">Info text</Stat.Info>
After:
<Stat.Number value={1000} /><Stat.Info variant="plain">Info text</Stat.Info>
P
- Replace class
.dnb-p--mediumwith.dnb-t__weight--medium. - Replace class
.dnb-p--boldwith.dnb-t__weight--bold. - Replace class
.dnb-p__size--xx-largewith.dnb-t__size--xx-largeand.dnb-t__line-height--xx-large. - Replace class
.dnb-p__size--x-largewith.dnb-t__size--x-largeand.dnb-t__line-height--x-large. - Replace class
.dnb-p__size--largewith.dnb-t__size--largeand.dnb-t__line-height--large. - Replace class
.dnb-p__size--basiswith.dnb-t__size--basisand.dnb-t__line-height--basis. - Replace class
.dnb-p__size--mediumwith.dnb-t__size--mediumand.dnb-t__line-height--medium. - Replace class
.dnb-p--smallor.dnb-p__size--smallwith.dnb-t__size--smalland.dnb-t__line-height--small. - Replace class
.dnb-p--x-smallor.dnb-p__size--x-smallwith.dnb-t__size--x-smalland.dnb-t__line-height--x-small.
Properties
- Replace
medium={true}withweight='medium'. - Replace
bold={true}withweight='bold'. - Replace
modifier— common mappings:modifier="medium"→weight="medium"modifier="small"→size="small"modifier="x-small"→size="x-small"
Definition lists
Properties
- Replace
directionin<Dl>withlayout.
Breadcrumb
Properties
- Replace
isCollapsedwithcollapsed. - Replace
styleType(orstyle_type) withbackgroundColor. - The
spacingprop type has changed fromSectionSpacingtoSpaceTypeAll | SpaceTypeMedia. All previously valid string values still work, but if you importedSectionSpacingto type your Breadcrumb spacing, update to use the new types.
BreadcrumbItem
- Removed passing down properties to the internal
span.
We don't think this has been used for anything other than passing down data-testids for testing. We believe the potential side effects of passing down properties to this span are greater than the advantages it gives for those who want to test this span using data-testid as their way of selecting the span.
We recommend other testing methods to select and test the inner parts of Eufemia components. You could use, e.g., screen.queryByRole or document.querySelector.
For more context, see this PR.
ProgressIndicator
Properties
- Replace
visiblewithshow. - Replace
no_animationwithnoAnimation. - Replace
indicator_labelwithindicatorLabel. - Replace
label_directionwithlabelDirection. - Replace
show_labelwithshowDefaultLabel. - Replace
classwithclassName. - Replace
childrenwithlabel.
Events
- Replace
on_completewithonComplete.
Styling
- Replace CSS class
dnb-progress-indicator--visiblewithdnb-progress-indicator--show.
Translations
- Replace translation
ProgressIndicator.indicator_labelwithProgressIndicator.indicatorLabel.
PaymentCard
Properties
- Replace
product_codewithproductCode. - Replace
card_numberwithcardNumber. - Replace
card_statuswithcardStatus. - Replace
raw_datawithrawData. - The
classprop has been removed. UseclassNameinstead.
cardStatus property
- Replace value
not_activewithnotActive. - Replace value
order_in_processwithorderInProcess. - Replace value
new_orderwithnewOrder.
Translations
- Remove translation
PaymentCard.text_card_numberas it's not supported anymore. - Replace
PaymentCard.text_blockedwithPaymentCard.textBlocked. - Replace
PaymentCard.text_expiredwithPaymentCard.textExpired. - Replace
PaymentCard.text_not_activewithPaymentCard.textNotActive. - Replace
PaymentCard.text_new_orderwithPaymentCard.textNewOrder. - Replace
PaymentCard.text_order_in_processwithPaymentCard.textOrderInProcess. - Replace
PaymentCard.text_replacedwithPaymentCard.textReplaced. - Replace
PaymentCard.text_renewedwithPaymentCard.textRenewed. - Replace
PaymentCard.text_newwithPaymentCard.textNew. - Replace
PaymentCard.text_unknownwithPaymentCard.textUnknown.
Removed daggy (tagged sum) types
The PaymentCard types (DNB, Visa, Mastercard, CardType, BankAxept, Saga, PB, ProductType, BankAxeptType) have been refactored from daggy tagged sums to plain TypeScript discriminated unions. The constructor API (DNB.Colored('...'), Mastercard.Default, etc.) is unchanged, but how you consume them has changed:
-
.cata()removed — Replace.cata({ Variant: () => ... })with aswitchon the.tagproperty:- cardType.cata({- Visa: () => renderVisa(),- Mastercard: () => renderMastercard(),- None: () => null,- })+ switch (cardType.tag) {+ case 'Visa': return renderVisa()+ case 'Mastercard': return renderMastercard()+ case 'None': return null+ } -
@@tagreplaced withtag— If you accessed the'@@tag'property, use.taginstead. -
.is()removed — Use.tagcomparison instead:val.tag === 'Visa'. -
.toString()removed — Use.tagfor the variant name. -
Reference equality changed — Unit variants are now plain objects, so
===comparison no longer works. Use.tagcomparison instead:- data.bankAxept === BankAxeptType.BankAxept+ data.bankAxept.tag === 'BankAxept'
Divider (Horizontal Rule)
Properties
- Remove the
lightandmediumprops — they are no longer supported. The Divider now renders with a single default style. If you need to customize the line appearance, use CSS custom properties or a wrapper with custom styling. - Replace
fullscreenwithbreakout.
Flex.Item
Properties
- Replace
sizewithspan. The property sets how many columns an item should span in the flex layout.
Card
Properties
- Remove
spacingproperty. - Replace
sizewithspan(inherited from Flex.Item). - The default
innerSpaceis nowsmall(16px) on all sides.
Styling
- The default outline has changed to
1pxwith color#ebebeb. - The corner radius has changed to
24px.
Checkbox
Properties
- The deprecated
attributesprop has been removed. Use spread props instead. - Replace
label_positionwithlabelPosition. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
childrenwithlabel.
Events
- Replace
on_changewithonChange.
TypeScript types
- Replace
OnChangeParamswithCheckboxOnChangeParams. - Replace
OnClickParamswithCheckboxOnClickParams.
Switch
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - Replace
label_positionwithlabelPosition. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation.
Events
- Replace
on_changewithonChange. - Replace
on_change_endwithonChangeEnd.
Logo
Major change: The Logo component API has been redesigned. Instead of
brandandvariantprops, import the specific SVG component directly.
Properties
- Remove
brandprop. Import and use the desired SVG component directly (e.g.,DnbDefault,SbankenDefault,SbankenCompact,SbankenHorizontal,CarnegieDefault,EiendomDefault). - Remove
variantprop. Instead, import the specific variant directly (e.g.,SbankenCompactinstead ofbrand="sbanken" variant="compact"). - Remove
size. Replace it withheightif it contains a numeric value, and withinheritSizewheresize='inherit'. - Remove the following properties:
altandratio. Alt text is now built into each SVG component (e.g.DnbDefault.altis'DNB Logo'). The Logo component readssvg.altautomatically. To customize the alt text, passaria-labelto the Logo component. - Replace
inherit_colorwithinheritColor. - Change
widthfrom number to string. - Change
heightfrom number to string.
Migration Example:
Before (v10):
import { Logo } from '@dnb/eufemia'render(<Logo brand="sbanken" variant="compact" />)
After (v11):
import { Logo, SbankenCompact } from '@dnb/eufemia/components/Logo'render(<Logo svg={SbankenCompact} />)
Icon
Properties
- Replace
inherit_colorwithinheritColor.
Button
Removals:
- The
variant="signal"has been removed. Usevariant="primary"orvariant="secondary"instead. - The
buttonVariantPropTypeexport has been removed as part of the PropTypes removal. If you were importing it viaimport { buttonVariantPropType } from '@dnb/eufemia/components/button', remove the import — runtime prop validation is no longer provided.
Properties
- Replace
icon_positionwithiconPosition. - Replace
icon_sizewithiconSize. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
custom_contentwithcustomContent. - The
classprop has been removed. UseclassNameinstead. - Replace
inner_refwithref.
Events
- Replace
on_clickwithonClick.
Modal, Dialog and Drawer
Removals and behavioral changes:
- Removed:
rootIdproperty has been removed. Modal root elements no longer support custom IDs. - Replace
openStatewithopen. ReplaceopenState="opened"withopen={true}andopenState="closed"withopen={false}. - If you rely on opening and closing a modal by mounting and unmounting the component (legacy behavior), you should change to using the
openproperty instead.
Properties
The following properties have been renamed from snake_case to camelCase:
- Replace
classwithclassName. - Replace
focus_selectorwithfocusSelector. - Replace
labelled_bywithlabelledBy. - Replace
open_delaywithopenDelay. - Replace
content_idwithcontentId. - Replace
dialog_titlewithdialogTitle. - Replace
close_titlewithcloseTitle. - Replace
hide_close_buttonwithhideCloseButton. - Replace
close_button_attributeswithcloseButtonAttributes. - Replace
prevent_closewithpreventClose. - Replace
prevent_core_stylewithpreventCoreStyle. - Replace
animation_durationwithanimationDuration. - Replace
no_animationwithnoAnimation. - Replace
no_animation_on_mobilewithnoAnimationOnMobile. - Replace
min_widthwithminWidth. - Replace
max_widthwithmaxWidth. - Replace
align_contentwithalignContent. - Replace
container_placementwithcontainerPlacement. - Replace
vertical_alignmentwithverticalAlignment. - Replace
open_statewithopenState. - Replace
direct_dom_returnwithdirectDomReturn. - Replace
omit_trigger_buttonwithomitTriggerButton. - Replace
open_modalwithopenModal. - Replace
close_modalwithcloseModal. - Replace
trigger_attributeswithtriggerAttributes. - Replace
overlay_classwithoverlayClass. - Replace
content_classwithcontentClass. - Replace
modal_contentwithmodalContent. - Replace
header_contentwithheaderContent. - Replace
bar_contentwithbarContent. - Replace
dialog_rolewithdialogRole. - Replace
bypass_invalidation_selectorswithbypassInvalidationSelectors. - Replace
content_refwithcontentRef. - Replace
scroll_refwithscrollRef. - Replace
prevent_overlay_closewithpreventOverlayClose. - Replace
confirmType's valueinfowithinformationon Dialog.
Events
- Replace
on_openwithonOpen. - Replace
on_closewithonClose. - Replace
on_close_preventwithonClosePrevent.
TypeScript types
- Replace
ModalPropTypeswithModalAllProps.
Translations
- Replace
Modal.dialog_titlewithModal.dialogTitle. - Replace
Modal.close_titlewithModal.closeTitle.
Modal.Header, Dialog.Header and Drawer.Header
Properties
- Replace
title_classwithtitleClass.
ModalHeaderBar, Dialog.Navigation and Drawer.Navigation
Properties
- Replace
shadow_classwithshadowClass.
Dialog.Body and Drawer.Body
Properties
- Replace
styleType(orstyle_type) withbackgroundColor. - Replace
spacingwithinnerSpace. Useblockto match the old vertical-only padding:spacing->innerSpace={{ block: 'large' }}spacing="x-small"->innerSpace={{ block: 'x-small' }}spacing="small"->innerSpace={{ block: 'small' }}spacing="medium"->innerSpace={{ block: 'medium' }}spacing="large"->innerSpace={{ block: 'large' }}spacing="x-large"->innerSpace={{ block: 'x-large' }}spacing="xx-large"->innerSpace={{ block: 'xx-large' }}
Heading
Properties
- Replace
debug_counterwithdebugCounter. - Replace
skip_correctionwithskipCorrection.
H (heading elements)
Properties
- Replace
aswithelement.
Before:
<H as="h2" size="medium">Heading</H>
After:
<H element="h2" size="medium">Heading</H>
Table
Properties
- Replace
accordionwithmode="accordion". - Replace
accordionChevronPlacement="start"withaccordionChevronPlacement="left"(or remove it, since"left"is the default). - Replace
accordionChevronPlacement="end"withaccordionChevronPlacement="right".
Events
- Replace
onClosedwithonClose. - Replace
onOpenedwithonOpen.
TableClickableHead
Events
- Replace
on_clickwithonClick.
FormStatus
Properties
- Replace
no_animationwithnoAnimation. - Replace
icon_sizewithiconSize. - Replace
text_idwithtextId. - Replace
width_selectorwithwidthSelector. - Replace
width_elementwithwidthElement. - Replace
state's valueinfowithinformation. - Replace
state's valuewarnwithwarning. - Replace
variant's valueflatwithplain.
TypeScript types
- The
FormStatusStatetype no longer includes| string | boolean. It now only accepts the literal values'error','warning','information','success', and'marketing'. If you were passing arbitrary strings or booleans asstateorstatusState, update them to one of the valid literals.
Skeleton
Properties
- Replace
no_animationwithnoAnimation. - Replace
aria_busywithariaBusy. - Replace
aria_readywithariaReady.
Translations
- Replace translation
Skeleton.aria_busywithSkeleton.ariaBusy. - Replace translation
Skeleton.aria_readywithSkeleton.ariaReady.
Tabs
Properties
- Replace
selected_keywithselectedKey. - Replace
content_stylewithcontentStyle. - Replace
content_spacingorcontentSpacingwithcontentInnerSpace. ThecontentSpacingprop has been removed – usecontentInnerSpaceinstead, which passesinnerSpaceto the content Section. - Replace
tab_elementwithtabElement. - Replace
tabs_stylewithtabsStyle. - Replace
tabs_spacingortabsSpacingwithtabsInnerSpace. ThetabsSpacingprop has been removed – usetabsInnerSpaceinstead. - Replace
nav_button_edgewithnavButtonEdge. - Replace
prevent_rerenderwithpreventRerender. - Replace
focus_keywithfocusKey. - Replace
no_borderwithnoBorder. - Replace
prerenderwithkeepInDOM. - The
classprop has been removed. UseclassNameinstead.
Events
- Replace
on_changewithonChange. - Replace
on_clickwithonClick. - Replace
on_mouse_enterwithonMouseEnter. - Replace
on_focuswithonFocus.
Styling
- The CSS classes
dnb-section--spacing-*are no longer applied to the Tabs content wrapper or tab list. If you have custom CSS targeting these classes within Tabs, update to target the inline styles or usecontentInnerSpace/tabsInnerSpaceprops instead.
Pagination
Properties
- Replace
place_maker_before_contentwithplaceMarkerBeforeContent. - Replace
startup_pagewithstartupPage. - Replace
current_pagewithcurrentPage. - Replace
page_countwithpageCount. - Replace
startup_countwithstartupCount. - Replace
parallel_load_countwithparallelLoadCount. - Replace
min_wait_timewithminWaitTime. - Replace
use_load_buttonwithuseLoadButton. - Replace
hide_progress_indicatorwithhideProgressIndicator. - Replace
set_content_handlerwithsetContentHandler. - Replace
reset_content_handlerwithresetContentHandler. - Replace
reset_pagination_handlerwithresetPaginationHandler. - Replace
end_infinity_handlerwithendInfinityHandler. - Replace
page_elementwithpageElement. - Replace
fallback_elementwithfallbackElement. - Replace
marker_elementwithmarkerElement. - Replace
indicator_elementwithindicatorElement. - Replace
button_titlewithbuttonTitle. - Replace
prev_titlewithprevTitle. - Replace
next_titlewithnextTitle. - Replace
more_pageswithmorePages. - Replace
is_loading_textwithisLoadingText. - Replace
load_button_textwithloadButton.text. Note:loadButtonis now an object prop (not a flat string). Migrate as follows:
// Before:<Pagination load_button_text="Load more" />// After:<Pagination loadButton={{ text: "Load more" }} />
Events
- Replace
on_changewithonChange. - Replace
on_startupwithonStartup. - Replace
on_loadwithonLoad. - Replace
on_endwithonEnd.
Translations
- Replace
Pagination.button_titlewithPagination.buttonTitle. - Replace
Pagination.prev_titlewithPagination.prevTitle. - Replace
Pagination.next_titlewithPagination.nextTitle. - Replace
Pagination.more_pageswithPagination.morePages. - Replace
Pagination.is_loading_textwithPagination.isLoadingText. - Replace
Pagination.load_button_textwithPagination.loadButtonText.
InfinityLoadButton & InfinityLoadButtonProps
- Replace
on_clickwithonClick.
Slider
Properties
- Replace
statusState's valueinfowithinformation.
The following properties have been renamed from snake_case to camelCase:
- Replace
thumb_titlewiththumbTitle. - Replace
add_titlewithaddTitle. - Replace
subtract_titlewithsubtractTitle. - Replace
number_formatwithnumberFormat. - Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
status_statewithstatusState. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation.
Events
- Replace
on_changewithonChange.
Translations
- Replace
Slider.add_titlewithSlider.addTitle. - Replace
Slider.subtract_titlewithSlider.subtractTitle.
TypeScript types
- Replace
OnChangeEventPropswithSliderOnChangeParams. - Replace
ThumbStateEnumswithSliderThumbState.
Timeline
Translations
- Replace
TimelineItem.alt_label_completedwithTimelineItem.altLabelCompleted. - Replace
TimelineItem.alt_label_currentwithTimelineItem.altLabelCurrent. - Replace
TimelineItem.alt_label_upcomingwithTimelineItem.altLabelUpcoming.
DatePicker
Removals and behavioral changes:
-
The
onBlurandonFocusevents fire now only once per user interaction, not on every internal input blur. -
The visible date segments are no longer native
inputelements. They are now exposed as section elements withrole="spinbutton". If you have Jest or DOM tests that queryinputor assert old input-specific ARIA attributes, update them to target the visible date picker field/segments instead. -
Find
partialDate,partialStartDateandpartialEndDateand remove it. -
Find
correctInvalidDate/correct_invalid_dateand remove it. Use Field.Date from Eufemia Forms instead when usingminDateandmaxDate, as it has built-in validation. Automatically correcting user input leads to confusion — inform users about the error and let them correct it themselves. -
Replace
on_showwithonOpenandon_hidewithonClose(not just a casing change — the event names changed). -
Replace
openedwithopen. -
dateFormatandreturnFormatno longer support the formatYYYY-MM-DD. Useyyyy-MM-ddinstead.Before:
<DatePicker dateFormat="YYYY/MM/DD" returnFormat="YYYY-MM-DD" />After:
<DatePicker dateFormat="yyyy/MM/dd" returnFormat="yyyy-MM-dd" /> -
The internal
date-fnsdependency has been upgraded from v2 to v4. This does not affect the DatePicker API itself, but if you importdate-fnsdirectly in your project (e.g. to pass alocaleto DatePicker), you need to update your imports from default exports to named exports:Before (date-fns v2):
import nbLocale from 'date-fns/locale/nb'import enLocale from 'date-fns/locale/en-GB';<DatePicker locale={nbLocale} />After (date-fns v4):
import { nb } from 'date-fns/locale/nb'import { enGB } from 'date-fns/locale/en-GB';<DatePicker locale={nb} />
Properties
In addition to the behavioral changes above, the following properties have been renamed from snake_case to camelCase:
- Replace
start_datewithstartDate. - Replace
end_datewithendDate. - Replace
start_monthwithstartMonth. - Replace
end_monthwithendMonth. - Replace
min_datewithminDate. - Replace
max_datewithmaxDate. - Replace
mask_orderwithmaskOrder. - Replace
mask_placeholderwithmaskPlaceholder. - Replace
date_formatwithdateFormat. - Replace
return_formatwithreturnFormat. - Replace
hide_navigationwithhideNavigation. - Replace
hide_dayswithhideDays. - Replace
only_monthwithonlyMonth. - Replace
hide_last_weekwithhideLastWeek. - Replace
disable_autofocuswithdisableAutofocus. - Replace
enable_keyboard_navwithenableKeyboardNav. - Replace
show_inputwithshowInput. - Replace
show_submit_buttonwithshowSubmitButton. - Replace
show_cancel_buttonwithshowCancelButton. - Replace
show_reset_buttonwithshowResetButton. - Replace
submit_button_textwithsubmitButtonText. - Replace
cancel_button_textwithcancelButtonText. - Replace
reset_button_textwithresetButtonText. - Replace
reset_datewithresetDate. - Replace
first_daywithfirstDay. - Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
input_elementwithinputElement. - Replace
addon_elementwithaddonElement. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
prevent_closewithpreventClose. - Replace
no_animationwithnoAnimation. - Replace
align_pickerwithalignPicker. - Replace
skip_portalwithskipPortal. - Replace the
shortcutspropertyclose_on_selectwithcloseOnSelect.
Events
- Replace
on_days_renderwithonDaysRender. - Replace
on_changewithonChange. - Replace
on_typewithonType. - Replace
on_showwithonOpen. - Replace
on_hidewithonClose. - Replace
on_submitwithonSubmit. - Replace
on_cancelwithonCancel. - Replace
on_resetwithonReset.
Event return object
The following properties on the event callback return object have been renamed:
- Replace
days_betweenwithdaysBetween. - Replace
is_validwithisValid. - Replace
is_valid_start_datewithisValidStartDate. - Replace
is_valid_end_datewithisValidEndDate.
Styling
- Replace CSS class
dnb-date-picker--openedwithdnb-date-picker--open.
NumberFormat
Split into variants (no more <NumberFormat />)
Major change:
NumberFormatis now exposed as a namespace of variant sub-components. This enables code splitting and tree shaking: apps only pay for the variants they actually use. There is no backwards compatibility – the generic<NumberFormat />component has been removed.
Replace each usage with the matching variant:
| Before | After |
|---|---|
<NumberFormat value={1234} /> | <NumberFormat.Number value={1234} /> |
<NumberFormat>1234</NumberFormat> | <NumberFormat.Number>1234</NumberFormat.Number> |
<NumberFormat currency value={1234} /> | <NumberFormat.Currency value={1234} /> |
<NumberFormat currency="USD" value={1234} /> | <NumberFormat.Currency currency="USD" value={1234} /> |
<NumberFormat percent value={12.34} /> | <NumberFormat.Percent value={12.34} /> |
<NumberFormat compact value={12345} /> | <NumberFormat.Number compact value={12345} /> |
<NumberFormat compact="long" value={12345} /> | <NumberFormat.Number compact="long" value={12345} /> |
<NumberFormat phone value="99999999" /> | <NumberFormat.PhoneNumber value="99999999" /> |
<NumberFormat ban value="20001234567" /> | <NumberFormat.BankAccountNumber value="20001234567" /> |
<NumberFormat nin value="18089212345" /> | <NumberFormat.NationalIdentityNumber value="18089212345" /> |
<NumberFormat org value="123456789" /> | <NumberFormat.OrganizationNumber value="123456789" /> |
Notes:
- The
currency,percent,phone,ban,ninandorgboolean props have been removed from the shared props surface. They are now implied by the chosen variant. NumberFormat.Currencydefaultscurrencytotrue(i.e.NOK). Pass a string likecurrency="USD"to override.compactis still supported onNumberFormat.NumberandNumberFormat.Currency. Passcompact(short),compact="long"orcompact="short"to pick the style.NumberFormat.PhoneNumberstill supportslink="tel" | "sms"for clickable links.- The
Providercontext keyNumberFormat(e.g.<Provider NumberFormat={{ currency: true, decimals: 0 }}>) and theNumberFormatPropsTypeScript type are still available for shared configuration.
Utility formatter API (format removed)
Major change: The generic
format(value, options)utility is gone. Import the variant formatter you need directly.
| Before | After |
|---|---|
format(value, { phone: true }) | formatPhoneNumber(value) |
format(value, { ban: true }) | formatBankAccountNumber(value) |
format(value, { nin: true }) | formatNationalIdentityNumber(value) |
format(value, { org: true }) | formatOrganizationNumber(value) |
format(value, { percent: true }) | formatPercent(value) |
format(value, { currency: true }) | formatCurrency(value) |
format(value, { currency: 'USD' }) | formatCurrency(value, { currency: 'USD' }) |
format(value) | formatNumber(value) |
// Beforeimport { format } from '@dnb/eufemia/components/NumberFormat'format(value, { phone: true })// Afterimport { formatPhoneNumber } from '@dnb/eufemia/components/NumberFormat'formatPhoneNumber(value)
All variant formatters are re-exported from @dnb/eufemia/components/NumberFormat: formatNumber, formatCurrency, formatPercent, formatPhoneNumber, formatBankAccountNumber, formatNationalIdentityNumber, formatOrganizationNumber.
NumberFormatOptionParams no longer accepts the phone, ban, nin, org or percent booleans; they were only used by the removed dispatcher.
useNumberFormat(value, formatter, options?)
Major change:
useNumberFormatnow takes the formatter explicitly instead of the variant flag.
// Beforeconst result = useNumberFormat(value, { currency: true, decimals: 2 })// Afterimport {useNumberFormat,formatCurrency,} from '@dnb/eufemia/components/NumberFormat'const result = useNumberFormat(value, formatCurrency, { decimals: 2 })
useNumberFormatWithParts(value, formatter, options?)
Major change:
useNumberFormatWithPartsnow mirrorsuseNumberFormatand takes the formatter explicitly instead of picking one frompercent/currencyoptions. The internalforceCurrencyAfterAmountoption has been removed; passcurrencyPosition: 'after'directly on the formatter options if you need it.
// Beforeconst formatted = useNumberFormatWithParts(value, {currency: true,decimals: 2,})// Afterimport {useNumberFormatWithParts,formatCurrency,} from '@dnb/eufemia/components/NumberFormat'const formatted = useNumberFormatWithParts(value, formatCurrency, {decimals: 2,})
| Before | After |
|---|---|
useNumberFormatWithParts(value) | useNumberFormatWithParts(value, formatNumber) |
useNumberFormatWithParts(value, { currency: true }) | useNumberFormatWithParts(value, formatCurrency) |
useNumberFormatWithParts(value, { percent: true }) | useNumberFormatWithParts(value, formatPercent) |
useNumberFormatWithParts(value, { forceCurrencyAfterAmount: true }) | useNumberFormatWithParts(value, formatCurrency, { currencyPosition: 'after' }) |
The returned parts shape is unchanged. parts are now derived from the formatter's display string, so any formatter returning a NumberFormatReturnValue (including custom ones) can be passed in.
Behavioral changes
- Phone formatting no longer treats bare numbers starting with
47as having a Norwegian country code. Use E.164 format with an explicit+prefix (e.g.+4712345678) or the00prefix (e.g.004712345678) to indicate a country code. For example,4712345678now formats as47 12 34 56 78instead of+47 12 34 56 78. - Phone formatting now auto-detects country codes for all countries from spaceless E.164 numbers (e.g.
+35812345678→+358 23 45 67 89). Previously, only Norwegian (+47) spaceless numbers were detected. - Phone formatting now also accepts space-separated values (e.g.
+47 12345678) and values with dashes. Unrecognized values (no digits) are returned as-is.
Properties (per variant)
- Replace
omit_roundingwithrounding="omit". - Replace
currency_displaywithcurrencyDisplay. - Replace
currency_positionwithcurrencyPosition. - Replace
always_selectallwithalwaysSelectAll. - Replace
selectallwithselectAll. - Replace
copy_selectionwithcopySelection. - Replace
clean_copy_valuewithcleanCopyValue.
Translations
- Replace
NumberFormat.clipboard_copywithNumberFormat.clipboardCopy. - Replace
NumberFormat.not_availablewithNumberFormat.notAvailable.
Styling
- Replace CSS class
dnb-number-format--selectallwithdnb-number-format--select-all.
TypeScript types
- Replace
formatReturnValuewithNumberFormatReturnValue. - Replace
formatValuewithNumberFormatValue. - Replace
formatOptionParamswithNumberFormatOptionParams. - Replace
formatReturnTypewithNumberFormatReturnType. - Replace
formatTypeswithNumberFormatType. - Replace
formatCurrencyPositionwithNumberFormatCurrencyPosition. - The
valueproperty inNumberFormatReturnValuechanged fromnumbertoNumberFormatValue(string | number). If your code assumesvalueis always anumber, add an explicit conversion withNumber(result.value).
StepIndicator
Major change: This component has been redesigned. The sidebar variant has been removed entirely.
Removals
- Major redesign of component. There is now only one variant (instead of two).
- Remove
StepIndicatorRenderCallbacktype. Not needed anymore.
Properties
- Remove
on_item_render. No longer has any other function than each step'stitleproperty. - Remove step item
on_render. No longer has any other function than thetitleproperty. - Remove
sidebarId. No longer has any sidebar. If an id is needed, use theidproperty. - Remove
step_title_extended. OnlystepTitleis needed. - Replace
is_currentwithisCurrent. - Replace
status_statewithstatusState. - Replace
statusState's valueinfowithinformation. - Replace
statusState's valuewarnwithwarning. - Replace
current_stepwithcurrentStep. - Replace
overview_titlewithoverviewTitle. - Replace
step_titlewithstepTitle. - Replace
hide_numberswithhideNumbers. - Replace
no_animationwithnoAnimation.
Translations
- Replace
StepIndicator.overview_titlewithStepIndicator.overviewTitle. - Replace
StepIndicator.step_titlewithStepIndicator.stepTitle.
Events
- Replace
on_changewithonChange. - Replace
on_clickwithonClick. - Replace
data.on_clickwithdata.onClickfor StepIndicatorItem.
StepItemWrapperProps
- Removed
numberas one can only change the render of content inside the button. - Removed
statusas one can only change the render of content inside the button. - Removed
hideNumbersas can only hide numbers in main component.
StepIndicator.Sidebar
- Component removed entirely after redesign. The variant that used this component no longer exists.
GlobalError
Properties
- Replace
statuswithstatusCode. - Replace
codewitherrorMessageCode.
Translations
- Replace translation
GlobalError.codewithGlobalError.errorMessageCode.
ToggleButton
Properties
- The deprecated
onStateUpdateprop has been removed. UseonChangeinstead. - The deprecated
attributesprop has been removed from ToggleButton and ToggleButtonGroup. Use spread props instead. - Replace
icon_positionwithiconPosition. - Replace
icon_sizewithiconSize. - Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
left_componentwithleftComponent.
Events
- Replace
on_changewithonChange.
ToggleButton.Group
Properties
- Replace
status_statewithstatusState. - Replace
statusState's valuewarnwithwarning. - Replace
status_propswithstatusProps. - Replace
status_no_animationwithstatusNoAnimation. - Replace
label_directionwithlabelDirection. - Replace
label_sr_onlywithlabelSrOnly. - Replace
left_componentwithleftComponent. - Replace
layout_directionwithlayoutDirection.
Events
- Replace
on_changewithonChange.
Tooltip
Properties
- Replace
positionwithplacementto match the Popover API. - Replace
activewithopen. - Remove
forceOpenand useopeninstead. Theopenprop is now dynamically controlled — whenopenis a boolean it controls visibility, and when not provided (undefined) the Tooltip reverts to hover/focus behavior. - Replace
size="basis"withsize="default".
GlobalStatus
Properties
- Replace
icon_sizewithiconSize. - Replace
no_animationwithnoAnimation. - Replace
hide_close_buttonwithhideCloseButton. - Replace
close_textwithcloseText. - Replace
default_titlewithdefaultTitle. - Replace
status_anchor_textwithstatusAnchorText. - Replace
omit_set_focuswithomitSetFocus. - Replace
omit_set_focus_on_updatewithomitSetFocusOnUpdate. - Replace
status_idwithstatusId. - Replace
status_anchor_urlwithstatusAnchorUrl. - Replace
status_anchor_labelwithstatusAnchorLabel. - Replace
buffer_delaywithbufferDelay. - Replace
state's valueinfowithinformation. - Replace
autoclosewithautoClose. - Replace
autoscrollwithautoScroll.
Events
- Replace
on_adjustwithonAdjust. - Replace
on_openwithonOpen. - Replace
on_showwithonShow. - Replace
on_hidewithonHide. - Replace
on_closewithonClose. Thestatus_idcallback parameter has been renamed tostatusId.
Translations
- Replace translation
GlobalStatus.close_textwithGlobalStatus.closeText. - Replace translation
GlobalStatus.default_titlewithGlobalStatus.defaultTitle. - Replace translation
GlobalStatus.status_anchor_textwithGlobalStatus.statusAnchorText.
GlobalStatusController
- Replace
remove_on_unmountwithremoveOnUnmount.
GlobalStatus.create
Properties
- Replace
status_idwithstatusId.
Events
- Replace
on_showwithonShow. - Replace
on_hidewithonHide. - Replace
on_closewithonClose.
GlobalStatus.Remove
Properties
- Replace
status_idwithstatusId. - Replace
buffer_delaywithbufferDelay.
Events
- Replace
on_showwithonShow. - Replace
on_hidewithonHide. - Replace
on_closewithonClose.
GlobalStatus.Add
Properties
- Replace
status_idwithstatusId.
Events
- Replace
on_showwithonShow. - Replace
on_hidewithonHide. - Replace
on_closewithonClose.
GlobalStatus.Update
Properties
- Replace
status_idwithstatusId.
Events
- Replace
on_showwithonShow. - Replace
on_hidewithonHide. - Replace
on_closewithonClose.
CopyOnClick
Translations
- Replace
CopyOnClick.clipboard_copywithCopyOnClick.clipboardCopy.
Layout
Space
Properties
- Replace
no_collapsewithnoCollapse.
Flex
Properties
- Replace
spacingwithgapon all Flex components. rowGapno longer accepts valuetrue. Remove the property to get the same behavior.
Removal of FormRow and FormSet
For more information on how to replace these, see FormSet/FormRow deprecation.
- Replace
<FormRow>with<Flex.Horizontal align="baseline">. - Replace
<FormRow vertical>with<Flex.Vertical>. - Replace
<FormRow centered>with<Flex.Horizontal align="center">. - Replace
FormRow=withformElement=. - Replace
FormRow:withformElement:. - Replace
import { includeValidProps } from '@dnb/eufemia/components/form-row/FormRowHelpers'withimport { pickFormElementProps } from '@dnb/eufemia/shared/helpers/filterValidProps'. - Replace
import { prepareFormRowContext } from '@dnb/eufemia/components/form-row/FormRowHelpers'withimport { prepareFormElementContext } from '@dnb/eufemia/shared/helpers/filterValidProps'.
If you migrate a FormSet that relied on a native browser submit, such as method="post" with an action, you can use preventDefaultOnSubmit={false} on Form.Handler to keep the native submit behavior.
Helpers
Provider/Context
- The
localesprop onProviderandContexthas been removed. Usetranslationsinstead. Passinglocaleswill be silently ignored.
Before:
<Provider locales={myLocales}>...</Provider>
After:
<Provider translations={myTranslations}>...</Provider>
Component helpers
Properties
- Remove
extendGracefully, it no longer exists.
Removed helper functions
The following functions have been removed from @dnb/eufemia/shared/component-helper:
isTrue– Checked if a value was truthy by comparingString(value) === 'true' || String(value) === '1'. Replace with direct boolean checks (e.g.value === trueor simplyvalue).toCamelCase– Converted snake_case strings to camelCase.toSnakeCase– Converted PascalCase strings to snake_case.matchAll– Polyfill forString.matchAll(). Use the nativeString.matchAll()instead.combineDetails– Unused aria-details combiner helper. UsecombineDescribedByorcombineLabelledByinstead.keycode– Key-to-keycode converter. UseKeyboardEvent.keyinstead.EventEmitter– Internal event emitter utility. No replacement needed.ErrorHandler– Broken error handler utility. No replacement needed.
The following functions have been removed from @dnb/eufemia/shared/helpers:
insertElementBeforeSelection– Unused helper for inserting DOM elements before a text selection.convertStatusToStateOnly– Trivial helper. ReplaceconvertStatusToStateOnly(status, state)withstatus ? state : null.isEdge/IS_EDGE– Edge is now Chromium-based, making these detections obsolete.
Removed HOCs and conversion utilities
The following Higher-Order Components (HOCs), conversion functions, and types have been removed:
withCamelCaseProps– HOC that converted snake_case props to camelCase.withSnakeCaseProps– HOC that converted camelCase props to snake_case.classWithSnakeCaseProps– Class-based HOC that converted camelCase props to snake_case.convertCamelCasePropsToSnakeCase– Converted camelCase props to snake_case.convertSnakeCaseProps– Converted snake_case props to camelCase.
The following TypeScript types have also been removed:
ToCamelCase,ToCamelCasePartial,ToCamelCaseFlat,ToCamelCasePartialFlat,IncludeCamelCaseToSnakeCase,ToSnakeCasePartial,IncludeSnakeCaseAssertNoMissing,KeysWithUnderscore
These were previously used to support dual snake_case/camelCase prop naming. Since v11 uses camelCase exclusively, they are no longer needed.
Renamed helper functions
extendPropsWithContextInClassComponenthas been renamed toextendExistingPropsWithContext.
Updated SCSS mixin: isFirefox (formerly IS_FF)
The IS_FF SCSS mixin has been renamed to isFirefox (see SCSS mixin renames). Its implementation now uses @supports (-moz-appearance: none) instead of the deprecated @-moz-document url-prefix() hack. The behavior is unchanged.
Removed SCSS mixins
The following SCSS mixins have been removed:
extendFocusRing(style/core/utilities.scss) — added an outer ring on top offocusRing. Replace with a custombox-shadowif needed.componentReset(style/core/scopes.scss) — applied core CSS reset rules to a single component. Use the global Eufemia CSS reset instead.
CSS reset: IE and Edge (EdgeHTML) support removed
All IE- and legacy-Edge-specific CSS rules have been removed from reset.scss and component styles. This includes vendor-prefixed properties like -ms-overflow-style, -ms-high-contrast, and legacy Edge (EdgeHTML) hacks. Only modern evergreen browsers are supported. If you still need to support these browsers, you must add your own fallback styles.
Eufemia Forms
This section covers changes specific to
@dnb/eufemia/extensions/forms. Many of these are behavioral changes and removals that require manual review.
General
Form.Cardno longer enablesoutsetby default.Form.ButtonRowno longer has automatic horizontal alignment styles when placed next to aCard. If you relied on this spacing, add explicit spacing (e.g. vialeftorSpace).Card.Provider/Form.Card.Providerhas been removed (includingdisableCardBreakout).- Replace
Form.useErrorMessagewith your error messages as an object in theerrorMessagesproperty (e.g., with auseMemohook). - Replace
Form.useErrorwithForm.useValidation. - Replace
Form.useLocalewithForm.useTranslation. - Replace
internal.errorwitherror. - Replace Form.Iterate label variable
{itemNr}with{itemNo}. - Replace
Form.FieldPropswithField.Provider. - Replace
<Card stack>...</Card>with<Form.Card>...</Form.Card>. - Replace
<Card>...</Card>with<Form.Card>...</Form.Card>. - Removed automatic horizontal card-content alignment for
Form.MainHeadingandForm.SubHeadingwhen placed above a card. - Replace
StepsLayoutwithWizard.Container. - Replace
StepsLayout.StepwithWizard.Step. - Replace
StepsLayout.NextButtonwithWizard.Buttons. - Replace
StepsLayout.PreviousButtonwithWizard.Buttons. - Replace
StepsLayout.ButtonswithWizard.Buttons. - Replace
StepsLayout.useStepwithWizard.useStep. - Replace
Iterate.ArrayPushButtonwithIterate.PushButton. - Replace
Iterate.ArrayRemoveElementButtonwithIterate.RemoveButton.
Docs: Eufemia Forms
Ajv no longer auto-instantiated
Breaking Change: Ajv is no longer automatically instantiated in Eufemia Forms v11. The ajv package is still included as a dependency, but Eufemia Forms no longer creates an Ajv instance for you. You must explicitly create one using makeAjvInstance() and pass it to Form.Handler. This enables tree-shaking of Ajv for applications that don't use JSON Schema validation.
Migration Required: If you use JSON Schema validation with Ajv, you must:
Update your imports and usage:
Before (v10):
import { Form, Field, JSONSchema } from '@dnb/eufemia/extensions/forms'const schema: JSONSchema = {type: 'object',properties: {myField: { type: 'string', minLength: 3 },},required: ['myField'],}function MyApp() {return (<Form.Handler schema={schema}><Field.String path="/myField" label="Label" /></Form.Handler>)}
After (v11):
import {Form,Field,JSONSchema,makeAjvInstance,} from '@dnb/eufemia/extensions/forms'const ajvInstance = makeAjvInstance()const schema: JSONSchema = {type: 'object',properties: {myField: { type: 'string', minLength: 3 },},required: ['myField'],}function MyApp() {return (<Form.Handler schema={schema} ajvInstance={ajvInstance}><Field.String path="/myField" label="Label" /></Form.Handler>)}
Alternative: Consider using Zod schemas instead, which provide better TypeScript integration and are included by default:
import { Form, Field, z } from '@dnb/eufemia/extensions/forms'const schema = z.object({myField: z.string().min(3),})function MyApp() {return (<Form.Handler schema={schema}><Field.String path="/myField" label="Label" /></Form.Handler>)}
InputPassword moved to Field.Password
The InputPassword component has been moved to Field.Password, and is now a part of Eufemia Forms. Change your import statement from import InputPassword from '@dnb/eufemia/components/input/InputPassword' to import { Field } from '@dnb/eufemia/extensions/forms'.
Docs: Input, All Fields
Error handling
FormError
validationRule
// Fromnew FormError('Invalid value', {validationRule: 'pattern',})// Tonew FormError('Field.errorPattern')
- Remove the
validationRuleparameter in favor of a translation key, like so:new FormError('Field.errorRequired').
errorMessages object
// Fromconst errorMessages = {pattern: 'Show this when "pattern" fails!',}// Toconst errorMessages = {'Field.errorPattern': 'Show this when "pattern" fails!',}
- Replace
requiredwithField.errorRequired. - Replace
patternwithField.errorPattern. - Replace
minLengthwithStringField.errorMinLength. - Replace
maxLengthwithStringField.errorMaxLength. - Replace
minimumwithNumberField.errorMinimum. - Replace
maximumwithNumberField.errorMaximum. - Replace
exclusiveMinimumwithNumberField.errorExclusiveMinimum. - Replace
exclusiveMaximumwithNumberField.errorExclusiveMaximum. - Replace
multipleOfwithNumberField.errorMultipleOf.
useErrorMessage
- Removed. Provide your error messages as an object in the
errorMessagesproperty (e.g., with auseMemohook).
See also: Form error messages, useValidation
Form.Visibility
- Replace
continuousValidationwithvalidateContinuously. - Replace
withValuewithhasValue. - Replace
pathValuewith usingvisibleWhen. - Replace
whenValuewith usingvisibleWhen.
Every Field.* component
Properties
- Replace
continuousValidationwithvalidateContinuously. - Replace
validatorwithonChangeValidator. - Replace
focusWhenOpenwithfocusOnOpen.
Docs: All Fields
Field.Date
Properties
- Replace
openedwithopen.
onType event
- Replace
start_datewithstartDate. - Replace
end_datewithendDate. - Replace
is_validwithisValid.
Styling
- Replace CSS class
dnb-date-picker--openedwithdnb-date-picker--open.
Field.Expiry
Properties
- The visible expiry segments are no longer native
inputelements. They are now exposed as section elements withrole="spinbutton". If you have Jest or DOM tests that queryinputor assert old input-specific ARIA attributes, update them to target the visible expiry field/segments instead.
Field.PhoneNumber
E.164 value format (breaking)
The component now emits values in E.164 format: "+4712345678" instead of "+47 12345678". This applies to onChange, transformOut, the data context, and pattern/schema validation.
Migration: If you relied on the space between the country code and the phone number, update your code to handle E.164 format. The additionalArgs second argument of onChange still provides countryCode and phoneNumber separately. Spaced values (e.g. "+47 12345678") are not accepted as input to Field.PhoneNumber — use E.164 format without spaces. However, Value.PhoneNumber and NumberFormat do accept and format spaced values.
If you used a pattern or schema that matched the space-separated format (e.g. ^\+47 [49]+), remove the space from your pattern (e.g. ^\+47[49]+).
Auto-detection of country codes
The component now auto-detects country codes from E.164 values like "+4712345678" and 00-prefixed values like "004712345678". No transformIn is needed for standard formats.
detectCountryCode utility
A new detectCountryCode utility is available for detecting E.164 country codes from phone number strings.
import detectCountryCode from '@dnb/eufemia/shared/detectCountryCode'
Translations
- Replace
PhoneNumber.labeltranslation string withPhoneNumber.numberLabel.
Field.PostalCodeAndCity
Properties
- Replace
countrywithcountryCode.
Field.Selection
Properties
- The
radio-listvariant has been removed. Use a composition pattern with List to build custom radio layouts (example).
autocompleteProps property
See docs about changed Autocomplete properties
dropdownProps property
See docs about changed Dropdown properties
data property
- Replace
selected_valuewithselectedValue. - Replace
suffix_valuewithsuffixValue. - Replace
search_contentwithsearchContent. - Replace
class_namewithclassName.
Field.Password
Properties
- Replace property
show_passwordwith translationPassword.ariaLabelShow. - Replace property
hide_passwordwith translationPassword.ariaLabelHide.
Events
- Replace
on_show_passwordwithonShowPassword. - Replace
on_hide_passwordwithonHidePassword.
Iterate.PushContainer
Properties
- Replace
requireCommitwithpreventUncommittedChanges.
Wizard.Container
Properties
- Remove
variant. No longer has any variants. - Remove
scrollTopOnStepChange, as it's now enabled by default. You can disable it withomitScrollManagement. - Remove
sidebarId. No longer has any sidebar. If an id is needed, use theidproperty.
Wizard.Provider
The Wizard.Provider export has changed. It now points to the WizardContext object itself instead of WizardContext.Provider, aligning with the React 19 deprecation of <Context.Provider>.
The JSX usage (<Wizard.Provider value={...}>) remains the same — no changes needed in your templates. However, if you reference Wizard.Provider programmatically (e.g., identity checks against WizardContext.Provider), be aware that it is now the context object itself.
Wizard.Step
Properties
- Replace
activewithinclude. - Replace
activeWhenwithincludeWhen.
DataContext.Provider
Properties
- Replace
filterSubmitDataby using thefilterDatafunction in the second event parameter of theonSubmitoronChangeevents.
SCSS mixin renames
All SCSS mixins have been renamed to follow the camelCase naming convention. If you @use Eufemia's SCSS source files directly and reference these mixins, update your @include calls:
Utilities (style/core/utilities.scss)
- Replace
focus-visiblewithfocusVisible. - Replace
IS_FFwithisFirefox. - Replace
IS_CHROMEwithisChrome. - Replace
IS_SAFARI_MOBILEwithisSafariMobile. - Replace
IS_SAFARI_DESKTOPwithisSafariDesktop.
Typography (elements/typography/style/typography-mixins.scss)
- Replace
headingSize_xx-largewithheadingSizeXxLarge. - Replace
headingSize_x-largewithheadingSizeXLarge. - Replace
headingSize_largewithheadingSizeLarge. - Replace
headingSize_mediumwithheadingSizeMedium. - Replace
headingSize_basiswithheadingSizeBasis. - Replace
headingSize_smallwithheadingSizeSmall. - Replace
headingSize_x-smallwithheadingSizeXSmall. - Replace
typography_leadwithtypographyLead. - Replace
headingSpacing_xx-largewithheadingSpacingXxLarge. - Replace
headingSpacing_x-largewithheadingSpacingXLarge. - Replace
headingSpacing_largewithheadingSpacingLarge.
DrawerList (fragments/drawer-list/style/dnb-drawer-list.scss)
- Replace
closDrawerListwithcloseDrawerList(typo fix).
SCSS: @import → @use
Eufemia's internal SCSS has been migrated from the deprecated @import to the Sass module system (@use / @forward). This does not change the compiled CSS output, but affects consumers who import Eufemia's SCSS source files directly.
If you import Eufemia's SCSS utilities (e.g. for mixins or breakpoints), update your imports:
Before:
@import '@dnb/eufemia/style/core/utilities.scss';@include allBelow(small) {// ...}div {max-width: map-get($breakpoints, medium);}
After:
@use '@dnb/eufemia/style/core/utilities.scss' as utilities;@include utilities.allBelow(small) {// ...}div {max-width: map-get(utilities.$breakpoints, medium);}
Using @import with Eufemia's SCSS source files still works, but will trigger Sass deprecation warnings. We recommend migrating to @use.
If you previously had silenceDeprecations: ['import'] in your Sass config to suppress warnings from Eufemia, you can now remove it — Eufemia's own files no longer use @import.
TypeScript
Several exported TypeScript interface declarations have been converted to type aliases for consistency. This is only a breaking change if you relied on declaration merging to augment these interfaces. Standard usage of these types (e.g. importing and using them for props) is unaffected.
Affected types include:
AvatarGroupPropsDataValueReadProps,DataValueWriteProps,UseFieldProps,ValueProps(from@dnb/eufemia/extensions/forms)PaymentCardRawData,CardDesign,PaymentCardProps(from@dnb/eufemia/extensions/payment-card)SharedStateReturn(from@dnb/eufemia/shared)
Context type renames
All React context value types have been renamed to use a consistent ...ContextValue suffix. If you import any of these types directly, update your imports:
| Before | After |
|---|---|
AccordionContextProps | AccordionContextValue |
TooltipContextProps | TooltipContextValue |
HeadingContextProps | HeadingContextValue |
DrawerListContextProps | DrawerListContextValue |
UploadContextProps | UploadContextValue |
DatePickerContextValues | DatePickerContextValue |
CardContextState | CardContextValue |
SliderContextTypes | SliderContextValue |
SkeletonContextProps | SkeletonContextValue |
The ListContext type (which previously collided with the ListContext variable) has been renamed to ListContextValue.
Stuttering type name renames
Several exported types had redundant/repeated words in their names. These have been cleaned up:
| Before | After |
|---|---|
InputInputElement | InputElement |
TextareaTextareaElement | TextareaElement |
PaginationIndicatorIndicatorElement | PaginationIndicatorElement |
SpaceTypesType | SpaceSize |
SpaceTypesPositiveValuesType | SpacePositiveSize |
SpaceTypesPositiveRemValuesType | SpacePositiveRemValue |
Plural to singular type suffix
Types using a plural Types suffix have been renamed to use singular form for consistency:
| Before | After |
|---|---|
SectionStyleTypes | SectionStyle |
FormStatusIconTypes | FormStatusIcon |
HeightAnimationOnStartTypes | HeightAnimationOnStart |
HeightAnimationOnEndTypes | HeightAnimationOnEnd |
SpaceStringTypes | SpaceStringValue |
FilterPropsValidationTypes | FilterPropsValidation |
DataAttributeTypes | DataAttributes |
StateTypes | FieldState |
FormatTypes | FormatType |
UploadAcceptedFileTypes | UploadAcceptedFiles |
Non-prefixed type renames
Several exported types lacked a component namespace prefix, risking name collisions. They have been prefixed:
| Before | After |
|---|---|
End | FlexEnd |
Start | FlexStart |
Spans | FlexSpans |
Span (flex) | FlexSpan |
AllProps (Iterate/EditContainer) | IterateEditContainerAllProps |
AllProps (Iterate/ViewContainer) | IterateViewContainerAllProps |
AllProps (Iterate/PushContainer) | IteratePushContainerAllProps |
AllProps (Form/Section/EditContainer) | FormSectionEditContainerAllProps |
AllProps (Form/Section/ViewContainer) | FormSectionViewContainerAllProps |
GroupProps | AccordionGroupProps |
StoreDataReturn | AccordionStoreDataReturn |
StoreOptions | AccordionStoreOptions |
TextColor | SectionTextColor |
OutlineColor | SectionOutlineColor |
BackgroundColor | SectionBackgroundColor |
DropShadow | SectionDropShadow |
RoundedCorner | SectionRoundedCorner |
TriggeredBy | ModalTriggeredBy |
CloseHandler | ModalCloseHandler |
CloseHandlerParams | ModalCloseHandlerParams |
TriggerAttributes (modal) | ModalTriggerAttributes |
TriggerAttributes (popover) | PopoverTriggerAttributes |
ValueTypes | SliderValue |
NumberFormatTypes | SliderNumberFormat |
ThumbState | SliderThumbState |
DummyProps | TabsDummyProps |
ContentWrapperProps | TabsContentWrapperProps |
ContentWrapperSelectedKey | TabsContentWrapperSelectedKey |
ContentWrapperChildren | TabsContentWrapperChildren |
CustomContentProps | TabsCustomContentProps |
CustomContentTitle | TabsCustomContentTitle |
CustomContentChildren | TabsCustomContentChildren |
AutoSizeProps | SkeletonAutoSizeProps |
ElementsHiddenProps | AvatarElementsHiddenProps |
LoadButtonProps | PaginationLoadButtonProps |
InfinityScrollerProps | PaginationInfinityScrollerProps |
InfinityLoadButtonProps | PaginationInfinityLoadButtonProps |
CreatePaginationReturn | PaginationCreateReturn |
DateType | DatePickerDateType |
CalendarDay | DatePickerCalendarDay |
CalendarNavigationEvent | DatePickerCalendarNavigationEvent |
CalendarView | DatePickerCalendarView |
ReturnObject | DatePickerReturnObject |
InvalidDates | DatePickerInvalidDates |
PartialDates | DatePickerPartialDates |
SubmittedDates | DatePickerSubmittedDates |
FormatType | NumberFormatType |
FormatCurrencyPosition | NumberFormatCurrencyPosition |
FormatReturnValue | NumberFormatReturnValue |
FormatValue | NumberFormatValue |
FormatReturnType | NumberFormatReturnType |
FormatOptionParams | NumberFormatOptionParams |
FormatDateOptions | DateFormatOptions |
RelativeTimeUnit | DateFormatRelativeTimeUnit |
StickyTableHeaderProps | TableStickyHeaderProps |
SortState | TableSortState |
SortEventHandler | TableSortEventHandler |
SortHandler | TableSortHandler |
SubmitButtonProps | InputSubmitButtonProps |
CustomSize | ProgressIndicatorCustomSize |
TimeLineItemStates | TimelineItemState |
Columns (grid/Item) | GridItemColumns |
Span (grid/Item) | GridItemSpan |
Media (grid/Item) | GridItemMedia |
Columns (grid/Container) | GridContainerColumns |
Media (grid/Container) | GridContainerMedia |
Typed event handlers
All untyped event handler and render function prop types ((...args: any[]) => any) have been replaced with properly typed signatures. This is only a breaking change if your existing callback types are incompatible with the new, stricter signatures.
New event types have been introduced for the affected components. You can import them directly:
import type { AccordionChangeEvent } from '@dnb/eufemia/components/Accordion'import type {TabsEvent,TabsRenderComponents,} from '@dnb/eufemia/components/Tabs'import type {ToggleButtonChangeEvent,ToggleButtonGroupChangeEvent,} from '@dnb/eufemia/components/ToggleButton'import type {DrawerListEvent,DrawerListChangeEvent,DrawerListSelectEvent,DrawerListResizeEvent,} from '@dnb/eufemia/fragments/DrawerList'
Affected components and props:
Accordion
| Prop | Before | After |
|---|---|---|
onChange | (...args: any[]) => any | (event: AccordionChangeEvent) => void |
onInit (AccordionGroup) | (...args: any[]) => any | (accordion: AccordionInstance) => void |
Tabs
| Prop | Before | After |
|---|---|---|
onChange | (...args: any[]) => any | (event: TabsEvent) => void |
onClick | (...args: any[]) => any | (event: TabsEvent) => void | boolean |
onMouseEnter | (...args: any[]) => any | (event: TabsEvent) => void |
onFocus | (...args: any[]) => any | (event: TabsEvent) => void |
render | (...args: any[]) => any | (components: TabsRenderComponents) => React.ReactNode |
ToggleButton
| Prop | Before | After |
|---|---|---|
onChange | (...args: any[]) => any | (event: ToggleButtonChangeEvent) => void |
ToggleButton.Group
| Prop | Before | After |
|---|---|---|
onChange | (...args: any[]) => any | (event: ToggleButtonGroupChangeEvent) => void |
DrawerList
| Prop | Before | After |
|---|---|---|
onOpen | (...args: any[]) => any | (event: DrawerListEvent) => void |
onClose | (...args: any[]) => any | (event: DrawerListEvent) => void |
onChange | (...args: any[]) => any | (event: DrawerListChangeEvent) => void |
onPreChange | (...args: any[]) => any | (event: DrawerListChangeEvent) => boolean | void |
onResize | (...args: any[]) => any | (event: DrawerListResizeEvent) => void |
onSelect | (...args: any[]) => any | (event: DrawerListSelectEvent) => void |
ProgressIndicator
| Prop | Before | After |
|---|---|---|
onComplete | (...args: any[]) => any | () => void |
Render function / children types
Several component types that accepted (...args: any[]) => any for render functions, children, or display elements have been narrowed to () => React.ReactNode. This affects types such as AccordionHeaderTitle, AccordionHeaderDescription, NumberFormatPrefix, NumberFormatSuffix, NumberFormatTooltip, SkeletonFigure, SkeletonChildren, ToggleButtonSuffix, ToggleButtonChildren, ToggleButtonGroupSuffix, ToggleButtonGroupChildren, PaymentCardChildren, TextareaChildren, and PaginationIndicatorElement.
Theming
Z-index CSS custom properties
All hardcoded z-index values across Eufemia components have been replaced with centralized CSS custom properties. If you have custom CSS that sets z-index to interact with Eufemia component layering, use these tokens instead of hardcoded values:
| CSS custom property | Value | Used for |
|---|---|---|
--z-index-section | 1 | Content sections |
--z-index-dropdown | 100 | Inline dropdowns, drawer lists |
--z-index-popover | 1000 | Popovers, floating elements |
--z-index-tooltip | 1100 | Tooltips (always above popovers) |
--z-index-modal | 3000 | Dialogs, drawers, full-screen overlays |
You can override these on :root or any wrapper element to adjust Eufemia's layering within your application:
:root {--z-index-modal: 5000; /* raise modals above a third-party widget */}
- Replace import from path
style/themes/theme-ui/withstyle/themes/ui/. - Replace import from path
style/themes/theme-sbanken/withstyle/themes/sbanken/. - Replace import from path
style/themes/theme-eiendom/withstyle/themes/eiendom/. - Replace import from path
style/themes/theme-carnegie/withstyle/themes/carnegie/. - The ui-theme-tags CSS package has been removed. This package applied Eufemia styles to plain HTML tags (e.g.
<h1>,<ul>) inside.dnb-core-style. Use class-based element selectors (e.g.dnb-h--xx-large) instead. - The ui-theme-fonts CSS package has been removed. Font faces and properties are already included in ui-theme-basis, so a separate import is no longer needed.
Props Type Exports
All export type Props declarations have been renamed to use a component-prefixed name to avoid ambiguity when re-exported through barrel files.
If you import Props types from component modules, update your imports to use the new names:
| Module path | Before | After |
|---|---|---|
components/card | Props | CardProps |
components/flex/Horizontal | Props | HorizontalProps |
components/flex/Stack | Props | StackProps |
components/flex/Vertical | Props | VerticalProps |
extensions/forms/Field/String | Props | FieldStringProps |
extensions/forms/Field/Number | Props | FieldNumberProps |
extensions/forms/Field/Boolean | Props | FieldBooleanProps |
extensions/forms/Field/Selection | Props | FieldSelectionProps |
extensions/forms/Field/Toggle | Props | FieldToggleProps |
extensions/forms/Value/String | Props | ValueStringProps |
extensions/forms/Value/Number | Props | ValueNumberProps |
extensions/forms/Form/Handler | Props | FormHandlerProps |
extensions/forms/Iterate/Array | Props | IterateArrayProps |
extensions/forms/Wizard/Step | Props | WizardStepProps |
extensions/forms/FieldBlock | Props | FieldBlockProps |
extensions/forms/ValueBlock | Props | ValueBlockProps |
extensions/forms/DataContext/Provider | Props | DataContextProviderProps |
The table above shows the most commonly used types. The same pattern applies to all Field, Value, Form, Iterate, and Wizard sub-components (91 types total).
For example, update:
-import type { Props as StringFieldProps } from '@dnb/eufemia/extensions/forms/Field/String'+import type { FieldStringProps } from '@dnb/eufemia/extensions/forms/Field/String'
An ESLint rule (naming-conventions/no-bare-props-export) is now enforced to prevent re-introducing bare Props exports.
createSpacingClasses replaced with applySpacing
The internal spacing helper createSpacingClasses has been removed and replaced by applySpacing that returns both the spacing CSS classes and any CSS custom properties in one call:
applySpacing(props, target)– merges spacing into an existing props object (append toclassName, merge intostyle). Recommended for most component root elements.
It is re-exported from @dnb/eufemia/components/space/SpacingUtils.
Migrate usages as shown below.
Before (v10):
import { createSpacingClasses } from '@dnb/eufemia/components/space/SpacingUtils'const mainParams = {className: clsx('dnb-my-component',createSpacingClasses(props),className),}
After (v11):
import { applySpacing } from '@dnb/eufemia/components/space/SpacingUtils'const mainParams = applySpacing(props, {className: clsx('dnb-my-component', className),})
The output CSS classes (dnb-space__top--large, etc.) are unchanged, so no styling needs to be updated.
April 21, 2026