diff --git a/apps/storybook/src/stories/webkit/templates/DeleteDomainDialog.stories.js b/apps/storybook/src/stories/webkit/templates/DeleteDomainDialog.stories.js new file mode 100644 index 00000000..d1479035 --- /dev/null +++ b/apps/storybook/src/stories/webkit/templates/DeleteDomainDialog.stories.js @@ -0,0 +1,265 @@ +import Button from '@aziontech/webkit/button' +import Message from '@aziontech/webkit/feedback/message' +import InputText from '@aziontech/webkit/inputs/input-text' +import Link from '@aziontech/webkit/navigation/link' +import Dialog from '@aziontech/webkit/overlay/dialog' +import DialogClose from '@aziontech/webkit/overlay/dialog-close' +import DialogContent from '@aziontech/webkit/overlay/dialog-content' +import DialogOverlay from '@aziontech/webkit/overlay/dialog-overlay' +import DialogPortal from '@aziontech/webkit/overlay/dialog-portal' +import DialogTitle from '@aziontech/webkit/overlay/dialog-title' +import DialogTrigger from '@aziontech/webkit/overlay/dialog-trigger' +import PanelContent from '@aziontech/webkit/overlay/panel-content' +import PanelFooter from '@aziontech/webkit/overlay/panel-footer' +import PanelHeader from '@aziontech/webkit/overlay/panel-header' +import { computed, ref } from 'vue' + +const templateComponents = { + Dialog, + DialogTrigger, + DialogPortal, + DialogOverlay, + DialogContent, + DialogTitle, + DialogClose, + PanelHeader, + PanelContent, + PanelFooter, + Button, + Message, + InputText, + Link +} + +const deleteDomainTemplate = ` + + + +` + +const Template = (args) => ({ + components: templateComponents, + setup() { + const open = ref(args.defaultOpen ?? false) + const confirmationInput = ref('') + const confirmLabelId = 'template-delete-domain-dialog-confirm-label' + + const canDelete = computed( + () => confirmationInput.value.trim() === String(args.confirmationPhrase ?? '').trim() + ) + + const handleDelete = () => { + if (!canDelete.value) return + open.value = false + confirmationInput.value = '' + } + + return { + args, + open, + confirmationInput, + confirmLabelId, + canDelete, + handleDelete + } + }, + template: deleteDomainTemplate +}) + +/** @type {import('@storybook/vue3').Meta} */ +export default { + title: 'Webkit/Templates/DeleteDomainDialog', + tags: ['autodocs'], + parameters: { + layout: 'fullscreen', + backgrounds: { default: 'dark' }, + a11y: { + config: { + rules: [{ id: 'color-contrast', enabled: true }] + } + }, + docs: { + description: { + component: + 'Destructive confirmation dialog template. Composes Webkit Dialog with a warning Message, confirmation InputText, and Cancel / Delete actions. Delete stays disabled until the user types the exact confirmation phrase.' + } + } + }, + decorators: [ + () => ({ + template: '
' + }) + ], + argTypes: { + defaultOpen: { + control: 'boolean', + description: 'Initial open state when uncontrolled', + table: { defaultValue: { summary: false }, category: 'Dialog' } + }, + closeable: { + control: 'boolean', + description: 'When true, Escape and overlay click close the dialog', + table: { defaultValue: { summary: true }, category: 'Dialog' } + }, + size: { + control: 'select', + options: ['small', 'medium', 'large'], + description: 'Panel max-width preset', + table: { defaultValue: { summary: 'medium' }, category: 'Dialog' } + }, + triggerLabel: { + control: 'text', + description: 'Label on the trigger button that opens the dialog', + table: { category: 'Content' } + }, + title: { + control: 'text', + description: 'Dialog header title', + table: { category: 'Content' } + }, + warningTitle: { + control: 'text', + description: 'Warning message shown at the top of the body', + table: { category: 'Content' } + }, + descriptionBeforeLink: { + control: 'text', + description: 'Body copy before the Help Center link', + table: { category: 'Content' } + }, + descriptionAfterLink: { + control: 'text', + description: 'Body copy after the Help Center link', + table: { category: 'Content' } + }, + helpCenterLabel: { + control: 'text', + description: 'Help Center link label', + table: { category: 'Content' } + }, + helpCenterHref: { + control: 'text', + description: 'Help Center link URL', + table: { category: 'Content' } + }, + confirmationPhrase: { + control: 'text', + description: 'Exact text the user must type to enable Delete', + table: { category: 'Content' } + }, + confirmationPlaceholder: { + control: 'text', + description: 'Placeholder for the confirmation input', + table: { category: 'Content' } + }, + cancelLabel: { + control: 'text', + description: 'Cancel button label', + table: { category: 'Content' } + }, + deleteLabel: { + control: 'text', + description: 'Delete button label', + table: { category: 'Content' } + }, + 'onUpdate:open': { + action: 'update:open', + description: 'Emitted when open state changes', + table: { category: 'events' } + } + }, + args: { + defaultOpen: false, + closeable: true, + size: 'medium', + triggerLabel: 'Delete domain', + title: 'Delete Domain', + warningTitle: "Once confirmed, this action can't be reversed.", + descriptionBeforeLink: + 'The selected Domain will be deleted, along with all associated settings or instances. Check the ', + descriptionAfterLink: ' for more details.', + helpCenterLabel: 'Help Center', + helpCenterHref: '#', + confirmationPhrase: 'teste', + confirmationPlaceholder: '', + cancelLabel: 'Cancel', + deleteLabel: 'Delete' + } +} + +export const Default = { + render: Template +} + +export const Open = { + args: { + defaultOpen: true + }, + render: Template +} diff --git a/packages/webkit/src/components/overlay/panel/panel-content.vue b/packages/webkit/src/components/overlay/panel/panel-content.vue index 241ba4f8..3f9b9db8 100644 --- a/packages/webkit/src/components/overlay/panel/panel-content.vue +++ b/packages/webkit/src/components/overlay/panel/panel-content.vue @@ -26,7 +26,7 @@ const contentClasses = computed(() => cn( - 'p-[var(--spacing-xl)]', + 'p-[var(--spacing-lg)]', !drawerScrollHost ? 'min-h-0 flex-1 overflow-y-auto' : undefined, !drawerScrollHost ? (attrs.class as string | undefined) : undefined ) diff --git a/packages/webkit/src/components/overlay/panel/panel-footer.vue b/packages/webkit/src/components/overlay/panel/panel-footer.vue index 9783532f..b2a9bb00 100644 --- a/packages/webkit/src/components/overlay/panel/panel-footer.vue +++ b/packages/webkit/src/components/overlay/panel/panel-footer.vue @@ -19,7 +19,7 @@ const rootClasses = computed(() => cn( 'flex min-h-16 shrink-0 items-center gap-[var(--spacing-sm)]', - 'border-t border-[length:var(--border-width-default)] border-[var(--border-muted)] bg-[var(--bg-surface)]', + 'border-0 border-t border-t-[length:var(--border-width-default)] border-t-[var(--border-muted)] bg-[var(--bg-surface)]', 'px-[var(--spacing-lg)] py-[var(--spacing-md)]', attrs.class as string | undefined ) diff --git a/packages/webkit/src/components/overlay/panel/panel-header.vue b/packages/webkit/src/components/overlay/panel/panel-header.vue index ed945f90..a66e8b5e 100644 --- a/packages/webkit/src/components/overlay/panel/panel-header.vue +++ b/packages/webkit/src/components/overlay/panel/panel-header.vue @@ -19,7 +19,7 @@ const rootClasses = computed(() => cn( 'flex min-h-14 shrink-0 items-center justify-between gap-[var(--spacing-xs)]', - 'border-b border-[length:var(--border-width-default)] border-[var(--border-muted)] bg-[var(--bg-surface)]', + 'border-0 border-b border-b-[length:var(--border-width-default)] border-b-[var(--border-muted)] bg-[var(--bg-surface)]', 'pl-[var(--spacing-lg)] pr-[var(--spacing-md)] py-[var(--spacing-md)]', attrs.class as string | undefined )