1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-22 01:47:00 +01:00
metamask-extension/ui/components/component-library/modal-content
George Marshall c25d9c968e
Update account list to use all available screen space (#20745)
* Updating ModalContent styles and padding to allow for dynamic resizing of content that allows scrolling within the modal. This commit also updates the AccountListMenu so the account list can resize dynamically to take up all screen space available

* Updating the scroll bar styles from default for the ModalContent component so the scrollbar is thinner and more sleek
2023-09-06 16:52:41 -07:00
..
__snapshots__ Update account list to use all available screen space (#20745) 2023-09-06 16:52:41 -07:00
index.ts Adding ModalContent component (#18175) 2023-03-22 17:17:19 -07:00
modal-content.scss Update account list to use all available screen space (#20745) 2023-09-06 16:52:41 -07:00
modal-content.stories.tsx Feat/18890/button ts update (#20492) 2023-08-28 14:42:00 -07:00
modal-content.test.tsx Update account list to use all available screen space (#20745) 2023-09-06 16:52:41 -07:00
modal-content.tsx Update account list to use all available screen space (#20745) 2023-09-06 16:52:41 -07:00
modal-content.types.ts Replacing deprecated components and code for import tokens (#19559) 2023-07-26 08:48:31 -07:00
README.mdx Feat/18890/button ts update (#20492) 2023-08-28 14:42:00 -07:00

import { Story, Canvas, ArgsTable } from '@storybook/addon-docs';

import { ModalContent } from './modal-content';

# ModalContent

`ModalContent` is the container for the modal dialog's content. It uses context supplied by the `Modal` component and cannot be used without it.

<Canvas>
  <Story id="components-componentlibrary-modalcontent--default-story" />
</Canvas>

## Props

<ArgsTable of={ModalContent} />

### Children

Use the `children` prop to render the content of `ModalContent`. The `ModalContent` should generally be used with the `ModalHeader` component.

<Canvas>
  <Story id="components-componentlibrary-modalcontent--children" />
</Canvas>

```jsx
import React, { useState } from 'react';
import { Modal, ModalContent, ModalHeader, Text, Button, ButtonVariant } from '../../component-library';

const [show, setShow] = useState(false);
const handleOnClick = () => {
  setShow(!show);
};

<Button variant={ButtonVariant.Primary} onClick={handleOnClick}>
  Open
</Button>
<Modal isOpen={show} onClose={handleOnClick}>
  <ModalContent {...args}>
    <ModalHeader marginBottom={4}>Modal Header</ModalHeader>
    <Text marginBottom={4}>Modal Content</Text>
    <Button variant={ButtonVariant.Primary} onClick={handleOnClick}>
      Close
    </Button>
    <LoremIpsum />
    <LoremIpsum />
    <LoremIpsum />
    <LoremIpsum />
    <LoremIpsum />
  </ModalContent>
</Modal>
```

### Size

Currently the `ModalContent` supports a single size, this decision was made after we ran an audit on all modal sizes in the extension codebase and found that all modals could be made to fit the `ModalContentSize.Sm`(360px) size.

If you do require a larger modal size you can use the `modalDialogProps` to add a className to override the default size.

<Canvas>
  <Story id="components-componentlibrary-modalcontent--size" />
</Canvas>

```jsx
import { DISPLAY } from '../../../helpers/constants/design-system';

import Box from '../../ui/box';

import { Modal, ModalContent, Text, Button, ButtonVariant } from '../../component-library';

enum ModalContentSizeStoryOption {
  Sm = 'sm',
  ClassName = 'className',
}

const [show, setShow] = useState({
  sm: false,
  className: false,
});
const handleOnClick = (size: ModalContentSizeStoryOption) => {
  setShow({ ...show, [size]: !show[size] });
};

<Box display={DISPLAY.FLEX} gap={4}>
  <Button
    variant={ButtonVariant.Secondary}
    onClick={() => handleOnClick(ModalContentSizeStoryOption.Sm)}
  >
    Show sm size
  </Button>
  <Button
    variant={ButtonVariant.Secondary}
    onClick={() => handleOnClick(ModalContentSizeStoryOption.ClassName)}
  >
    Show className
  </Button>
</Box>

<Modal
  isOpen={show.sm}
  onClose={() => handleOnClick(ModalContentSizeStoryOption.Sm)}
>
  <ModalContent {...args}>
    <Text marginBottom={4}>
      ModalContentSize.Sm default and only size 360px max-width
    </Text>
    <Button onClick={() => setShow({ ...show, sm: false })}>Close</Button>
  </ModalContent>
</Modal>

<Modal
  isOpen={show.className}
  onClose={() => handleOnClick(ModalContentSizeStoryOption.ClassName)}
>
  <ModalContent
    {...args}
    modalDialogProps={{
      style: { maxWidth: 800 },
    }}
  >
    <Text marginBottom={4}>
      Using modalDialogProps and adding a className setting a max width
      (max-width: 800px)
    </Text>
    <Button onClick={() => setShow({ ...show, className: false })}>
      Close
    </Button>
  </ModalContent>
</Modal>
```