UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

329 lines (313 loc) 11.3 kB
--- version: 11.0.0 generatedAt: 2026-04-21T13:57:51.573Z checksum: 090b7d977ba4be5e2c4c04d199a30a4048416c59f443a56985df2f80629d9c40 --- ```json { "props": { "onOpen": { "doc": "This event gets triggered once the modal shows up. Returns the modal id: `{ id }`.", "type": "function", "status": "optional" }, "onClose": { "doc": "This event gets triggered once the modal gets closed. Returns the modal id: `{ id, event, triggeredBy }`.", "type": "function", "status": "optional" }, "onClosePrevent": { "doc": "This event gets triggered once the user tries to close the modal, but `preventClose` is set to `true`. Returns a callback `close` you can call to trigger the close mechanism. More details below. Returns the modal id: `{ id, event, close: Method, triggeredBy }`.", "type": "function", "status": "optional" } } } ``` ## Properties ```json { "props": { "id": { "doc": "The id used internal for the trigger button and Modal component.", "type": "string", "status": "optional" }, "contentId": { "doc": "Defines a unique identifier to a modal. Use it in case you have to refer in some way to the modal content.", "type": "string", "status": "optional" }, "labelledBy": { "doc": "The ID of the trigger component, describing the modal content. Defaults to the internal `trigger`, so make sure you define the `title` in `triggerAttributes`.", "type": "string", "status": "optional" }, "children": { "doc": "The content which will appear when triggering open the modal. If a function is given, you get a close method `() => ({ close })` in the arguments.", "type": ["React.ReactNode", "function"], "status": "optional" }, "fullscreen": { "doc": "If set to `true` then the modal content will be shown as fullscreen, without showing the original content behind. Can be set to `false` to omit the auto fullscreen. Defaults to `auto`.", "type": ["boolean", "string"], "status": "optional" }, "open": { "doc": "Use this property to control the open/close state by setting `true` / `false`.", "type": "boolean", "status": "optional" }, "openDelay": { "doc": "Forces the modal to delay the opening. The delay is given in `ms`.", "type": ["number", "string"], "status": "optional" }, "disabled": { "doc": "Will disable the trigger button.", "type": "boolean", "status": "optional" }, "noAnimation": { "doc": "If set to `true`, no open/close animation will be shown. Defaults to `false`.", "type": "boolean", "status": "optional" }, "noAnimationOnMobile": { "doc": "Same as `noAnimation`, but gets triggered only if the viewport width is less than `40em`. Defaults to `false`.", "type": "boolean", "status": "optional" }, "animationDuration": { "doc": "Duration of animation open/close in ms. Defaults to `300ms`.", "type": ["number", "string"], "status": "optional" }, "preventClose": { "doc": "If set to `true` (boolean or string), then the user can't close the modal.", "type": "boolean", "status": "optional" }, "preventOverlayClose": { "doc": "Disable clicking the background overlay to close the modal. PS! Pressing `esc` key will still close the modal.", "type": "boolean", "status": "optional" }, "openModal": { "doc": "Set a function to call the callback function, once the modal should open: `openModal={(open) => open()}`.", "type": "function", "status": "optional" }, "closeModal": { "doc": "Set a function to call the callback function, once the modal should close: `closeModal={(close) => close()}`.", "type": "function", "status": "optional" }, "focusSelector": { "doc": "The Modal handles the first focus – automatically. However, you can define a custom focus selector the will be used instead `focusSelector=\".css-selector\"`.", "type": "string", "status": "optional" }, "overlayClass": { "doc": "Give the page overlay a custom class name (maps to `dnb-modal__overlay`).", "type": "string", "status": "optional" }, "contentClass": { "doc": "Give the content wrapper a custom class name (maps to `dnb-modal__content`).", "type": "string", "status": "optional" }, "omitTriggerButton": { "doc": "Omits default showing trigger button.", "type": "boolean", "status": "optional" }, "trigger": { "doc": "Provide a custom trigger component. Like `trigger={<Anchor href=\"/\" />}`. It will set the focus on it when the modal gets closed.", "type": ["React.ReactNode", "function"], "status": "optional" }, "triggerAttributes": { "doc": "Send along with custom HTML attributes or properties to the trigger button.", "type": "Various", "status": "optional" }, "dialogTitle": { "doc": "The aria label of the dialog when no labelledBy and no title is given. Defaults to `Vindu`.", "type": "string", "status": "optional" }, "directDomReturn": { "doc": "If true, the modal will not open in a new DOM but directly in current DOM. Defaults to `false`. Be aware of the side effects of setting this property to `true`.", "type": "boolean", "status": "optional" }, "bypassInvalidationSelectors": { "doc": "Define an array with HTML class selectors (`['.element-selector']`) which should not get invalidated when the modal opens/closes. Use this in order to let some parts of your site still be accessible by screen readers.", "type": "Array<string>", "status": "optional" }, "scrollRef": { "doc": "To get the scroll Element, pass in your own React ref.", "type": "React.RefObject", "status": "optional" }, "contentRef": { "doc": "To get the inner content Element, pass in your own React ref.", "type": "React.RefObject", "status": "optional" }, "[Space](/uilib/layout/space/properties)": { "doc": "Spacing properties like `top` or `bottom` are supported.", "type": ["string", "object"], "status": "optional" }, "spacing": { "doc": "If set to `false` then the modal content will be shown without any spacing. Defaults to `true`.", "type": "boolean", "status": "optional" }, "title": { "doc": "The modal/drawer title. Displays on the very top of the content.", "type": "React.ReactNode", "status": "optional" }, "modalContent": { "doc": "The content which will appear when triggering the modal/drawer. Alternative to `children`.", "type": ["React.ReactNode", "function"], "status": "optional" }, "barContent": { "doc": "The content which will appear in the bar, above the header, and side-by-side the close button.", "type": ["React.ReactNode", "function"], "status": "optional" }, "headerContent": { "doc": "The content which will appear in the header of the modal/drawer.", "type": ["React.ReactNode", "function"], "status": "optional" }, "minWidth": { "doc": "The minimum Modal content width, defined by a CSS width value like `50vw` (50% of the viewport). Be careful on using fixed `minWidth` so you don't break responsiveness. Defaults to `30rem`.", "type": ["string", "number"], "status": "optional" }, "maxWidth": { "doc": "The maximum Modal content width, defined by a CSS width value like `20rem`. Defaults to `60rem`.", "type": ["string", "number"], "status": "optional" }, "alignContent": { "doc": "Define the inner horizontal alignment of the content. Can be set to `left`, `center`, `right` and `centered`. If `centered`, then the content will also be centered vertically. Defaults to `left`.", "type": ["\"left\"", "\"center\"", "\"centered\"", "\"right\""], "status": "optional" }, "containerPlacement": { "doc": "For `drawer` mode only. Defines the placement on what side the Drawer should be opened. Defaults to `right`.", "type": ["\"left\"", "\"right\"", "\"top\"", "\"bottom\""], "status": "optional" }, "verticalAlignment": { "doc": "Define the vertical alignment of the container. Defaults to `center`.", "type": ["\"top\"", "\"center\""], "status": "optional" }, "closeTitle": { "doc": "The title of the close button. Defaults to _Lukk_.", "type": "string", "status": "optional" }, "hideCloseButton": { "doc": "If `true`, the close button will not be shown.", "type": "boolean", "status": "optional" } } } ``` ## Trigger Properties Properties targeting the trigger component (Button), but they will be set the same way as all the other properties: ```tsx render( <Modal triggerAttributes={{ icon: 'bell', }} right="small" > ... content ... </Modal> ) ``` ## Modal Translations ```json { "locales": ["da-DK", "en-GB", "nb-NO", "sv-SE"], "entries": { "Modal.closeTitle": { "nb-NO": "Lukk", "en-GB": "Close", "sv-SE": "Stäng", "da-DK": "Luk" }, "Modal.dialogTitle": { "nb-NO": "Separat Vindu", "en-GB": "Dialog Window", "sv-SE": "Separat fönster", "da-DK": "Separat vindue" } } } ``` ## Events ```json { "props": { "onOpen": { "doc": "This event gets triggered once the modal shows up. Returns the modal id: `{ id }`.", "type": "function", "status": "optional" }, "onClose": { "doc": "This event gets triggered once the modal gets closed. Returns the modal id: `{ id, event, triggeredBy }`.", "type": "function", "status": "optional" }, "onClosePrevent": { "doc": "This event gets triggered once the user tries to close the modal, but `preventClose` is set to `true`. Returns a callback `close` you can call to trigger the close mechanism. More details below. Returns the modal id: `{ id, event, close: Method, triggeredBy }`.", "type": "function", "status": "optional" } } } ``` ## `triggeredBy` The `triggeredBy` property is given when the `onClose` or the `onClosePrevent` event is triggered. It can contain one of the following values: - `button`: The close button that triggered the event. - `handler`: The `close` handler given by the function (as the content/children). - `keyboard`: The escape key that triggered the event. - `overlay`: The overlay element that triggered the event. - `unmount`: The unmount event that triggered the `open` property change. ### Selective onClosePrevent ```tsx render( <Modal preventClose={true} onClosePrevent={({ triggeredBy, close /* id, event */ }) => { switch (triggeredBy) { case 'keyboard': case 'button': close() break case 'overlay': { const timeout = setTimeout(close, 1e3) return () => clearTimeout(timeout) // clear timeout on unmount } } }} > ... </Modal> ) ```