@mozaic-ds/vue
Version:
Mozaic-Vue is the Vue.js implementation of ADEO Design system
128 lines (116 loc) • 3.63 kB
text/typescript
import type { Meta, StoryObj } from '@storybook/vue3-vite';
import { ref, watch } from 'vue';
import { action } from 'storybook/actions';
import MModal from './MModal.vue';
import MButton from '../button/MButton.vue';
import MLink from '../link/MLink.vue';
import InfoCircle32 from '@mozaic-ds/icons-vue/src/components/InfoCircle32/InfoCircle32.vue';
import ExternalLink24 from '@mozaic-ds/icons-vue/src/components/ExternalLink24/ExternalLink24.vue';
const meta: Meta<typeof MModal> = {
title: 'Overlay/Modal',
component: MModal,
parameters: {
layout: 'fullscreen',
docs: {
story: { height: '400px' },
description: {
component:
'A modal is a dialog window that appears on top of the main content, requiring user interaction before returning to the main interface. It is used to focus attention on a specific task, provide important information, or request confirmation for an action. Modals typically include a title, description, and primary/secondary actions and should be used for single, focused tasks to avoid disrupting the user experience.',
},
},
},
args: {
open: true,
title: 'Modal title',
description: `A modal is a dialog window allowing you to focus the user's attention on a specific task, a piece of information or a mandatory action. It must be used for single action only and must have a call to action button in the bottom.`,
footer: `
<MButton ghost>Cancel</MButton>
<MButton>Primary action</MButton>
`,
},
render: (args) => ({
components: { MModal, MButton, MLink, InfoCircle32, ExternalLink24 },
setup() {
const handleUpdate = action('update:open');
const openState = ref(args.open);
watch(
() => args.open,
(val) => {
openState.value = val;
},
);
const onUpdateOpen = (val: boolean) => {
openState.value = val;
handleUpdate(val);
args.open = val;
};
return { args, openState, onUpdateOpen };
},
template: `
<MModal
v-bind="args"
@update:open="onUpdateOpen"
v-model:open="openState"
>
<template v-if="${'icon' in args}" v-slot:icon>${args.icon}</template>
<template v-if="${'default' in args}" v-slot>${args.default}</template>
<template v-if="${'link' in args}" v-slot:link>${args.link}</template>
<template v-if="${'footer' in args}" v-slot:footer>${args.footer}</template>
</MModal>
`,
}),
};
export default meta;
type Story = StoryObj<typeof MModal>;
export const Default: Story = {};
export const Icon = {
args: {
icon: '<InfoCircle32/>',
},
};
export const ValidationOnly = {
args: {
footer: `
<MButton>Primary action</MButton>
`,
},
};
export const TwoOptions = {
args: {
footer: `
<MButton outlined>Secondary action</MButton>
<MButton>Primary action</MButton>
`,
},
};
export const Cancel = {
args: {
footer: `
<MButton ghost>Cancel</MButton>
<MButton outlined>Secondary action</MButton>
<MButton>Primary action</MButton>
`,
},
};
export const Link = {
args: {
link: `
<MLink class="mc-modal__link" href="#" size="m" icon-position="right">
Learn more
<template #icon><ExternalLink24 /></template>
</MLink>
`,
footer: `
<MButton ghost>Cancel</MButton>
<MButton>Primary action</MButton>
`,
},
};
export const Danger = {
args: {
footer: `
<MButton ghost>Cancel</MButton>
<MButton appearance="danger">Primary action</MButton>
`,
},
};