// @vitest-environment jsdom import { cleanup, fireEvent, render, screen } from '@testing-library/react'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { Dialog, DialogBody, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../src/dialog'; afterEach(() => { cleanup(); }); describe('Dialog', () => { it('wires labelled dialogs consistently', () => { render(

Rename design

, ); expect(screen.getByRole('dialog', { name: 'Rename design' })).toBeTruthy(); }); it('closes on backdrop click when enabled', () => { const onClose = vi.fn(); const { container } = render(

Backdrop close

, ); fireEvent.click(container.querySelector('.modal-backdrop') as HTMLElement); expect(onClose).toHaveBeenCalledTimes(1); }); it('closes on Escape when enabled', () => { const onClose = vi.fn(); render(

Escape close

, ); fireEvent.keyDown(document, { key: 'Escape' }); expect(onClose).toHaveBeenCalledTimes(1); }); it('lets custom panels opt out of the shared modal chrome class', () => { const { container } = render(

Plugin details

, ); const panel = container.querySelector('.plugin-details-modal'); expect(panel).toBeTruthy(); expect(panel?.className).toBe('plugin-details-modal'); expect(panel?.classList.contains('modal')).toBe(false); }); it('keeps caller variant sizing overrides ahead of shared dialog defaults', () => { const variantStyles = document.createElement('style'); variantStyles.textContent = '.modal-rename { width: 420px; gap: 14px; }'; document.head.insertBefore(variantStyles, document.head.firstChild); try { const { container } = render(

Rename design

, ); const panel = container.querySelector('.modal-rename') as HTMLElement; const panelStyles = getComputedStyle(panel); expect(panelStyles.width).toBe('420px'); expect(panelStyles.gap).toBe('14px'); } finally { variantStyles.remove(); } }); it('supports sectioned layouts with shared header/body/footer primitives', () => { const { container } = render( Sketch text Add a note to the canvas. , ); expect(screen.getByRole('dialog', { name: 'Sketch text' })).toBeTruthy(); expect(container.querySelector('[class*="dialogSectioned"]')).toBeTruthy(); expect(container.querySelector('[class*="header"]')).toBeTruthy(); expect(container.querySelector('[class*="body"]')).toBeTruthy(); expect(container.querySelector('[class*="footer"]')).toBeTruthy(); }); });