@sveltestrap/sveltestrap
Version:
Bootstrap components for Svelte
395 lines (345 loc) • 10.4 kB
text/mdx
import { Meta, Canvas, Controls, Source, Story } from '@storybook/blocks';
import * as ModalStories from './Modal.stories';
<Meta title="Components/Modal" />
# Modal <small class="bootstrap-docs">[Bootstrap Modal](https://getbootstrap.com/docs/5.3/components/modal/)</small>
The `<Modal>` component is a user interface element that adds dialogs for lightboxes, user notifications, or completely custom content.
<Canvas>
<Story of={ModalStories.Basic} />
</Canvas>
<Controls of={ModalStories.Basic} />
## Shorthand
<Canvas withSource="none">
<Story of={ModalStories.Shorthand} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Modal } from '@sveltestrap/sveltestrap';
let open = false;
const toggle = () => (open = !open);
</script>
<div>
<Button color="danger" on:click={toggle}>Open Modal</Button>
<Modal body header="Modal title" isOpen={open} {toggle}>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Modal>
</div>
`} />
## Sizes
<Canvas withSource="none">
<Story of={ModalStories.Sizes} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
let size: any;
const toggle = () => {
size = undefined;
open = !open;
};
const toggleLg = () => {
size = 'lg';
open = !open;
};
const toggleSm = () => {
size = 'sm';
open = !open;
};
const toggleXl = () => {
size = 'xl';
open = !open;
};
</script>
<div>
<ButtonGroup>
<Button color="success" on:click={toggleSm}>Open Small Modal</Button>
<Button color="warning" on:click={toggle}>Open Default Modal</Button>
<Button color="danger" on:click={toggleLg}>Open Large Modal</Button>
<Button color="dark" on:click={toggleXl}>Open Extra Large Modal</Button>
</ButtonGroup>
<Modal isOpen={open} {toggle} {size}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
`} />
## Fullscreen
<Canvas withSource="none">
<Story of={ModalStories.Fullscreen} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
let fullscreen: any;
const toggle = () => {
fullscreen = undefined;
open = !open;
};
const toggleAlways = () => {
fullscreen = true;
open = !open;
};
</script>
<Button color="primary" on:click={toggleAlways}>
Open Always Modal
</Button>
<Modal isOpen={open} {toggle} {fullscreen}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
`} />
## Scrolling
<Canvas withSource="none">
<Story of={ModalStories.Scrolling} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
let openScrollable = false;
const toggle = () => (open = !open);
const toggleScrollable = () => (openScrollable = !openScrollable);
</script>
<div>
<Button color="primary" on:click={toggle}>Default scrolling</Button>
<Button color="success" on:click={toggleScrollable}
>Scrollable modal body</Button
>
<Modal isOpen={open} {toggle}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
<p style="min-height: 1000px;">
This is some placeholder content to show the scrolling behavior for
modals. Instead of repeating the text the modal, we use an inline style
set a minimum height, thereby extending the length of the overall modal
and demonstrating the overflow scrolling. When content becomes longer
than the height of the viewport, scrolling will move the modal as
needed.
</p>
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
<Modal isOpen={openScrollable} toggle={toggleScrollable} scrollable>
<ModalHeader toggle={toggleScrollable}>Modal title</ModalHeader>
<ModalBody>
<p style="min-height: 1000px;">
This is some placeholder content to show the scrolling behavior for
modals. Instead of repeating the text the modal, we use an inline style
set a minimum height, thereby extending the length of the overall modal
and demonstrating the overflow scrolling. When content becomes longer
than the height of the viewport, scrolling will move the modal as
needed.
</p>
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggleScrollable}>Do Something</Button>
<Button color="secondary" on:click={toggleScrollable}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
`} />
## Backdrop
<Canvas withSource="none">
<Story of={ModalStories.Backdrop} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
const toggle = () => (open = !open);
</script>
<div>
<Button color="danger" on:click={toggle}>Modal with no Backdrop</Button>
<Modal isOpen={open} backdrop={false} {toggle}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
`} />
## Static Backdrop
<Canvas withSource="none">
<Story of={ModalStories.StaticBackdrop} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
const toggle = () => (open = !open);
</script>
<div>
<Button color="danger" on:click={toggle}>Modal with Static Backdrop</Button>
<Modal isOpen={open} backdrop="static" {toggle}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
Clicking outside modal or hitting Escape does not dismiss.
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
`} />
## Fade
<Canvas withSource="none">
<Story of={ModalStories.Fade} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import {
Button,
ButtonGroup,
Modal,
ModalBody,
ModalFooter,
ModalHeader
} from '@sveltestrap/sveltestrap';
let open = false;
const toggle = () => (open = !open);
</script>
<div>
<Button color="danger" on:click={toggle}>Modal with no Fade</Button>
<Modal isOpen={open} fade={false} {toggle}>
<ModalHeader {toggle}>Modal title</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</ModalBody>
<ModalFooter>
<Button color="primary" on:click={toggle}>Do Something</Button>
<Button color="secondary" on:click={toggle}>Cancel</Button>
</ModalFooter>
</Modal>
</div>
`} />
## Events
<Canvas withSource="none">
<Story of={ModalStories.Events} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Modal } from '@sveltestrap/sveltestrap';
let open = false;
let status = 'Closed';
const toggle = () => (open = !open);
</script>
<div>
<h5>Current state: {status}</h5>
<Button color="danger" on:click={toggle}>Open Modal</Button>
<Modal
body
header="Modal title"
isOpen={open}
{toggle}
on:opening={() => (status = 'Opening...')}
on:open={() => (status = 'Opened')}
on:closing={() => (status = 'Closing...')}
on:close={() => (status = 'Closed')}
>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Modal>
</div>
`} />
## Static
<Canvas withSource="none">
<Story of={ModalStories.Static} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Modal, ModalBody, ModalHeader } from '@sveltestrap/sveltestrap';
</script>
<div>
<Modal static isOpen>
<ModalHeader>Static Modal</ModalHeader>
<ModalBody>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
magna aliqua.
</ModalBody>
</Modal>
</div>
`} />
## External Content
<Canvas withSource="none">
<Story of={ModalStories.ExternalContent} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Icon, Modal } from '@sveltestrap/sveltestrap';
let open = false;
const toggle = () => (open = !open);
</script>
<div>
<Button color="danger" on:click={toggle}>Open Modal</Button>
<Modal isOpen={open} {toggle} body>
<div slot="external" class="text-end">
<Button color="link" class="text-white" size="lg" on:click={toggle}>
<Icon name="x" class="h1" />
</Button>
</div>
<h4>You can add content outside the Modal.</h4>
<p>Click the X on right to close.</p>
</Modal>
</div>
`} />