diff --git a/packages/react-core/src/components/Modal/examples/Modal.md b/packages/react-core/src/components/Modal/examples/Modal.md
index e4e167d8fbd..5b293073272 100644
--- a/packages/react-core/src/components/Modal/examples/Modal.md
+++ b/packages/react-core/src/components/Modal/examples/Modal.md
@@ -15,864 +15,82 @@ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
### Basic
-```js
-import React from 'react';
-import { Modal, Button } from '@patternfly/react-core';
-
-class SimpleModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalBasic.tsx"
```
### With description
-```js
-import React from 'react';
-import { Modal, Button } from '@patternfly/react-core';
-
-class SimpleModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalWithDescription.tsx"
```
### Top aligned
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button } from '@patternfly/react-core';
-
-class TopModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalTopAligned.tsx"
```
### Small
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button } from '@patternfly/react-core';
-
-class SmallModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalSmall.tsx"
```
### Medium
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button } from '@patternfly/react-core';
-
-class MediumModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalMedium.tsx"
```
### Large
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button } from '@patternfly/react-core';
-
-class LargeModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalLarge.tsx"
```
-### Width
-
-```js
-import React from 'react';
-import { Modal, Button } from '@patternfly/react-core';
-
-class WidthModal extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
- Confirm
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+### Custom width
+
+```ts file="./ModalCustomWidth.tsx"
```
### Custom header and footer
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button, Title, TitleSizes } from '@patternfly/react-core';
-import WarningTriangleIcon from '@patternfly/react-icons/dist/esm/icons/warning-triangle-icon';
-
-class CustomHeaderFooter extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- const header = (
-
-
- With custom modal header/footer
-
-
Allows for custom content in the header and/or footer by passing components.
-
- );
-
- const footer = (
-
-
- Custom modal footer.
-
- );
-
- return (
-
-
-
-
- When static text describing the modal is available, it can be wrapped with an ID referring to the modal's
- aria-describedby value.
-
-
-
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
- aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
- occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- );
- }
-}
+```ts file="./ModalCustomHeaderFooter.tsx"
```
-### No header
-
-```js
-import React from 'react';
-import { Modal, ModalVariant, Button } from '@patternfly/react-core';
-
-class NoHeader extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
- const footer = Modal Footer;
-
- return (
-
-
-
-
- When static text describing the modal is available, it can be wrapped with an ID referring to the modal's
- aria-describedby value.
-
-
-
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
- aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
- occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- );
- }
-}
-```
+### No header or footer
-### Custom Icon
+```ts file="./ModalNoHeaderFooter.tsx"
+```
-```js
-import React from 'react';
-import { Modal, Button } from '@patternfly/react-core';
-import BullhornIcon from '@patternfly/react-icons/dist/esm/icons/bullhorn-icon';
+### Title icon
-class NoHeader extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
-
- When static text describing the modal is available, it can be wrapped with an ID referring to the modal's
- aria-describedby value.
-
-
-
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
- aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
- occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- );
- }
-}
+```ts file="./ModalTitleIcon.tsx"
```
-### Warning Alert
-
-```js
-import React from 'react';
-import { Modal, Button } from '@patternfly/react-core';
-
-class NoHeader extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- return (
-
-
-
-
- When static text describing the modal is available, it can be wrapped with an ID referring to the modal's
- aria-describedby value.
-
-
-
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
- aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
- occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
-
- );
- }
-}
+### Custom title icon
+
+```ts file="./ModalCustomTitleIcon.tsx"
```
### With wizard
-```js
-import React from 'react';
-import { Modal, Button, Wizard } from '@patternfly/react-core';
-
-class WithWizard extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- isModalOpen: false
- };
- this.handleModalToggle = () => {
- this.setState(({ isModalOpen }) => ({
- isModalOpen: !isModalOpen
- }));
- };
- }
-
- render() {
- const { isModalOpen } = this.state;
-
- const steps = [
- { name: 'Step 1', component:
- Set the dropdown menuAppendTo prop to parent in order to allow the dropdown menu
- break out of the modal container. You'll also want to handle closing of the modal yourself, by listening to
- the onEscapePress callback on the Modal component, so you can close the Dropdown first if
- it's open.
-
-
-
- Dropdown with a menu that can break out
-
- }
- isOpen={isDropdownOpen}
- dropdownItems={dropdownItems}
- menuAppendTo="parent"
- />
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id feugiat augue, nec fringilla
- turpis.
-
- }
- footerContent="Popover Footer"
- >
-
-
- }
- isOpen={isModalOpen}
- onClose={this.handleModalToggle}
- actions={[
- ,
-
- ]}
- >
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
- pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
- est laborum.
-
-
- );
- }
-}
+```ts file="./ModalWithHelp.tsx"
```
### With form
```ts file="ModalWithForm.tsx"
-
```
### With overflowing content
-If the content that you're passing to the modal is likely to overflow the modal content area, pass tabIndex={0} to the modal to enable keyboard accessible scrolling.
+If the content that you're passing to the modal is likely to overflow the modal content area, pass `tabIndex={0}` to the modal to enable keyboard accessible scrolling.
```ts file="ModalWithOverflowingContent.tsx"
```
diff --git a/packages/react-core/src/components/Modal/examples/ModalBasic.tsx b/packages/react-core/src/components/Modal/examples/ModalBasic.tsx
new file mode 100644
index 00000000000..3f584aff168
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalBasic.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+
+export const ModalBasic: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalCustomHeaderFooter.tsx b/packages/react-core/src/components/Modal/examples/ModalCustomHeaderFooter.tsx
new file mode 100644
index 00000000000..d222df5d3c6
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalCustomHeaderFooter.tsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import { Modal, ModalVariant, Button, Title, TitleSizes } from '@patternfly/react-core';
+import WarningTriangleIcon from '@patternfly/react-icons/dist/esm/icons/warning-triangle-icon';
+
+export const ModalCustomHeaderFooter: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ const header = (
+
+
+ Custom header/footer modal
+
+
Allows for custom content in the header and/or footer by passing components.
+
+ );
+
+ const footer = (
+
+
+ Custom modal footer.
+
+ );
+
+ return (
+
+
+
+
+ When static text describing the modal is available outside of the modal header, it can be given an ID that is
+ then passed in as the modal's aria-describedby value.
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalCustomTitleIcon.tsx b/packages/react-core/src/components/Modal/examples/ModalCustomTitleIcon.tsx
new file mode 100644
index 00000000000..1d1784da2d7
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalCustomTitleIcon.tsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+import BullhornIcon from '@patternfly/react-icons/dist/esm/icons/bullhorn-icon';
+
+export const ModalCustomTitleIcon: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+
+ When static text describing the modal is available outside of the modal header, it can be given an ID that is
+ then passed in as the modal's aria-describedby value.
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalCustomWidth.tsx b/packages/react-core/src/components/Modal/examples/ModalCustomWidth.tsx
new file mode 100644
index 00000000000..1b554587039
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalCustomWidth.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+
+export const ModalCustomWidth: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalLarge.tsx b/packages/react-core/src/components/Modal/examples/ModalLarge.tsx
new file mode 100644
index 00000000000..624642c829a
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalLarge.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, ModalVariant, Button } from '@patternfly/react-core';
+
+export const ModalLarge: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalMedium.tsx b/packages/react-core/src/components/Modal/examples/ModalMedium.tsx
new file mode 100644
index 00000000000..b2a96d61fcb
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalMedium.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, ModalVariant, Button } from '@patternfly/react-core';
+
+export const ModalMedium: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalNoHeaderFooter.tsx b/packages/react-core/src/components/Modal/examples/ModalNoHeaderFooter.tsx
new file mode 100644
index 00000000000..f82b2df4e35
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalNoHeaderFooter.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import { Modal, ModalVariant, Button } from '@patternfly/react-core';
+
+export const ModalNoHeaderFooter: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+
+ When static text describing the modal is available outside of the modal header, it can be given an ID that is
+ then passed in as the modal's aria-describedby value.
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalSmall.tsx b/packages/react-core/src/components/Modal/examples/ModalSmall.tsx
new file mode 100644
index 00000000000..0005e0ea141
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalSmall.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, ModalVariant, Button } from '@patternfly/react-core';
+
+export const ModalSmall: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalTitleIcon.tsx b/packages/react-core/src/components/Modal/examples/ModalTitleIcon.tsx
new file mode 100644
index 00000000000..43026d48c0e
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalTitleIcon.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+
+export const ModalTitleIcon: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+
+ When static text describing the modal is available outside of the modal header, it can be given an ID that is
+ then passed in as the modal's aria-describedby value.
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalTopAligned.tsx b/packages/react-core/src/components/Modal/examples/ModalTopAligned.tsx
new file mode 100644
index 00000000000..1ff515a137b
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalTopAligned.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+
+export const ModalTopAligned: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalWithDescription.tsx b/packages/react-core/src/components/Modal/examples/ModalWithDescription.tsx
new file mode 100644
index 00000000000..fb40d7e53c9
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalWithDescription.tsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import { Modal, Button } from '@patternfly/react-core';
+
+export const ModalWithDescription: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ };
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ >
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
+ magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
+ consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
+ laborum.
+
+
+ );
+};
diff --git a/packages/react-core/src/components/Modal/examples/ModalWithDropdown.tsx b/packages/react-core/src/components/Modal/examples/ModalWithDropdown.tsx
new file mode 100644
index 00000000000..614377231c5
--- /dev/null
+++ b/packages/react-core/src/components/Modal/examples/ModalWithDropdown.tsx
@@ -0,0 +1,97 @@
+import React from 'react';
+import { Modal, ModalVariant, Button, Dropdown, DropdownToggle, DropdownItem } from '@patternfly/react-core';
+import CaretDownIcon from '@patternfly/react-icons/dist/esm/icons/caret-down-icon';
+
+export const ModalWithDropdown: React.FunctionComponent = () => {
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
+
+ const handleModalToggle = () => {
+ setIsModalOpen(!isModalOpen);
+ setIsDropdownOpen(false);
+ };
+
+ const handleDropdownToggle = (isDropdownOpen: boolean) => {
+ setIsDropdownOpen(isDropdownOpen);
+ };
+
+ const onSelect = () => {
+ setIsDropdownOpen(!isDropdownOpen);
+ onFocus();
+ };
+
+ const onFocus = () => {
+ const element = document.getElementById('modal-dropdown-toggle');
+ (element as HTMLElement).focus();
+ };
+
+ const onEscapePress = () => {
+ if (isDropdownOpen) {
+ setIsDropdownOpen(!isDropdownOpen);
+ onFocus();
+ } else {
+ handleModalToggle();
+ }
+ };
+
+ const dropdownItems = [
+ Link,
+
+ Action
+ ,
+
+ Disabled Link
+ ,
+
+ Disabled Action
+
+ ];
+
+ return (
+
+
+
+ Confirm
+ ,
+
+ ]}
+ onEscapePress={onEscapePress}
+ >
+
+ Set the dropdown menuAppendTo prop to parent in order to allow the dropdown menu
+ break out of the modal container. You'll also want to handle closing of the modal yourself, by listening to
+ the onEscapePress callback on the Modal component, so you can close the Dropdown first if
+ it's open without closing the entire modal.
+
+
+
+
+ Dropdown with a menu that can break out
+
+ }
+ isOpen={isDropdownOpen}
+ dropdownItems={dropdownItems}
+ menuAppendTo="parent"
+ />
+