create modal component
This commit is contained in:
parent
0f95f330ef
commit
4427a37e3e
6 changed files with 84 additions and 0 deletions
33
src/lib/components/Actions/Modal/Modal.stories.svelte
Normal file
33
src/lib/components/Actions/Modal/Modal.stories.svelte
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<script module lang="ts">
|
||||
import { defineMeta } from '@storybook/addon-svelte-csf';
|
||||
import type { ComponentProps } from 'svelte';
|
||||
import Modal from './Modal.svelte';
|
||||
import ModalBody from './ModalBody.svelte';
|
||||
import ModalActions from './ModalActions.svelte';
|
||||
import Button from '../Button.svelte';
|
||||
|
||||
const { Story } = defineMeta({
|
||||
title: 'Actions/Modal',
|
||||
component: Modal,
|
||||
argTypes: {
|
||||
open: {
|
||||
control: 'boolean',
|
||||
defaultValue: false,
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
{#snippet template({ children: _, ...props }: Partial<ComponentProps<typeof Modal>>)}
|
||||
<Modal {...props}>
|
||||
<ModalBody>
|
||||
<h3 class="text-lg font-bold">Hello!</h3>
|
||||
<p class="py-4">Press ESC key or click the button below to close</p>
|
||||
<ModalActions>
|
||||
<Button>Close</Button>
|
||||
</ModalActions>
|
||||
</ModalBody>
|
||||
</Modal>
|
||||
{/snippet}
|
||||
|
||||
<Story name="Default" children={template} />
|
||||
21
src/lib/components/Actions/Modal/Modal.svelte
Normal file
21
src/lib/components/Actions/Modal/Modal.svelte
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<script lang="ts">
|
||||
import clsx from 'clsx';
|
||||
import type { SvelteHTMLElements } from 'svelte/elements';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
type Props = SvelteHTMLElements['dialog'] & {
|
||||
backdrop?: boolean;
|
||||
dialog?: HTMLDialogElement;
|
||||
};
|
||||
|
||||
let { backdrop, dialog = $bindable(), children, class: className, ...props }: Props = $props();
|
||||
</script>
|
||||
|
||||
<dialog {...props} class={twMerge('modal', clsx(className))} bind:this={dialog}>
|
||||
{@render children?.()}
|
||||
{#if backdrop}
|
||||
<form method="dialog" class="modal-backdrop">
|
||||
<button>close</button>
|
||||
</form>
|
||||
{/if}
|
||||
</dialog>
|
||||
13
src/lib/components/Actions/Modal/ModalActions.svelte
Normal file
13
src/lib/components/Actions/Modal/ModalActions.svelte
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<script lang="ts">
|
||||
import clsx from 'clsx';
|
||||
import type { SvelteHTMLElements } from 'svelte/elements';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
type Props = SvelteHTMLElements['div'];
|
||||
|
||||
let { children, class: className, ...props }: Props = $props();
|
||||
</script>
|
||||
|
||||
<div {...props} class={twMerge('modal-action', clsx(className))}>
|
||||
{@render children?.()}
|
||||
</div>
|
||||
13
src/lib/components/Actions/Modal/ModalBody.svelte
Normal file
13
src/lib/components/Actions/Modal/ModalBody.svelte
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<script lang="ts">
|
||||
import clsx from 'clsx';
|
||||
import type { SvelteHTMLElements } from 'svelte/elements';
|
||||
import { twMerge } from 'tailwind-merge';
|
||||
|
||||
type Props = SvelteHTMLElements['div'];
|
||||
|
||||
let { children, class: className, ...props }: Props = $props();
|
||||
</script>
|
||||
|
||||
<div {...props} class={twMerge('modal-box', clsx(className))}>
|
||||
{@render children?.()}
|
||||
</div>
|
||||
3
src/lib/components/Actions/Modal/index.ts
Normal file
3
src/lib/components/Actions/Modal/index.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
export { default as Modal } from './Modal.svelte';
|
||||
export { default as ModalActions } from './ModalActions.svelte';
|
||||
export { default as ModalBody } from './ModalBody.svelte';
|
||||
|
|
@ -1 +1,2 @@
|
|||
export { default as Button } from './Button.svelte';
|
||||
export * from './Modal/';
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue