@sveltestrap/sveltestrap
Version:
Bootstrap components for Svelte
289 lines (211 loc) • 7.43 kB
text/mdx
import { Meta, Canvas, Controls, Story, Source } from '@storybook/blocks';
import * as OffcanvasStories from './Offcanvas.stories';
<Meta title="Components/Offcanvas" />
# Offcanvas <small class="bootstrap-docs">[Bootstrap Offcanvas](https://getbootstrap.com/docs/5.3/components/offcanvas/)</small>
The `<Offcanvas>` component is used to manage and present content in a compact and organized manner, enhancing both the usability and aesthetics of a user interface.
<Canvas>
<Story of={OffcanvasStories.Basic} />
</Canvas>
<div id="offcanvas-controls">
<Controls of={OffcanvasStories.Basic} />
</div>
## Backdrop
<p>You can disable the <code>Offcanvas</code> backdrop by setting the <code>backdrop</code> prop to <code>false</code>.</p>
<Canvas withSource="none">
<Story of={OffcanvasStories.Backdrop} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={toggle}>Open</Button>
<Offcanvas header="No Backdrop" {isOpen} {toggle} backdrop={false}>
Look ma, no backdrop.
</Offcanvas>
`} />
## Events
<code>Offcanvas</code> provides four events for managing state: <code>opening</code>, <code>open</code>, <code>closing</code>, and <code>close</code>.
<Canvas withSource="none">
<Story of={OffcanvasStories.Events} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={toggle}>Open</Button>
<code>Current state: {status}</code>
<Offcanvas
{isOpen}
{toggle}
placement="end"
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.
</Offcanvas>
`} />
## Placement
<Canvas withSource="none">
<Story of={OffcanvasStories.Placement} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
let status = 'Closed';
let endOpen = false;
let bottomOpen = false;
let topOpen = false;
const toggleEnd = () => (endOpen = !endOpen);
const toggleBottom = () => (bottomOpen = !bottomOpen);
const toggleTop = () => (topOpen = !topOpen);
const toggle = () => {
isOpen = !isOpen
};
</script>
<Button color="danger" on:click={toggle}>Start</Button>
<Button color="warning" on:click={() => (endOpen = !endOpen)}>End</Button>
<Button color="success" on:click={() => (topOpen = !topOpen)}>Top</Button>
<Button color="info" on:click={() => (bottomOpen = !bottomOpen)}>
Bottom
</Button>
<Offcanvas {isOpen} {toggle} header="Start" placement="start">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Offcanvas>
<Offcanvas isOpen={endOpen} toggle={toggleEnd} placement="end" header="Right">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Offcanvas>
<Offcanvas isOpen={topOpen} toggle={toggleTop} placement="top" header="Top">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Offcanvas>
<Offcanvas
isOpen={bottomOpen}
toggle={toggleBottom}
placement="bottom"
header="Bottom"
>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
</Offcanvas>
`} />
## Slots
- <code>default</code> This slot is used to render the content for <code>Offcanvas</code> body.
- <code>header</code> Use this slot to create a custom formatted header for the <code>Offcanvas</code>.
<Canvas withSource="none">
<Story of={OffcanvasStories.Slots} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={toggle}>Open</Button>
<Offcanvas scroll isOpen={isOpen} {toggle}>
<h1 slot="header">
<i>Hello <b>World!</b></i>
</h1>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
</Offcanvas>
`} />
## Manual
<Canvas withSource="none">
<Story of={OffcanvasStories.Manual} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={() => (isOpen = true)}>Open</Button>
<Offcanvas header="No toggle or esc" scroll {isOpen}>
<Button color="danger" on:click={() => (isOpen = false)}>Close Me</Button>
</Offcanvas>
`} />
## Scrolling
<Canvas withSource="none">
<Story of={OffcanvasStories.Scrolling} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={toggle}>Open Offcanvas</Button>
<Offcanvas
header="You can scroll the body"
scroll
{isOpen}
{toggle}
backdrop={false}
>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.</p>
// ... a bunch more content
</Offcanvas>
`} />
## Custom Width & Content
<Canvas withSource="none">
<Story of={OffcanvasStories.Custom} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
const toggle = () => {
isOpen = !isOpen;
};
</script>
<Button color="primary" on:click={() => (isOpen = true)}>Open</Button>
<Offcanvas isOpen={isOpen} body={false} style="width: 150px" class="bg-danger">
<div on:click={() => (isOpen = false)}>
<img src="https://picsum.photos/150/1200" alt="Meaningless content" />
</div>
</Offcanvas>
`} />
## Theming
<Canvas withSource="none">
<Story of={OffcanvasStories.Theming} />
</Canvas>
<Source dark language="html" code={`
<script lang="ts">
import { Button, Offcanvas } from '@sveltestrap/sveltestrap';
let isOpen = false;
let endOpen = false;
const toggle = () => (isOpen = !isOpen)
const toggleEnd = () => (endOpen = !endOpen);
</script>
<Button color="dark" on:click={toggle}>Dark Theme</Button>
<Button color="light" on:click={() => (endOpen = !endOpen)}>Light Theme</Button>
<Offcanvas theme="dark" {isOpen} {toggle} header="Dark Theme" placement="start">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua.
</Offcanvas>
<Offcanvas theme="light" isOpen={endOpen} toggle={toggleEnd} header="Light Theme" placement="end">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua.
</Offcanvas>
`} />