UNPKG

@sveltestrap/sveltestrap

Version:

Bootstrap components for Svelte

289 lines (211 loc) 7.43 kB
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> `} />