diff --git a/src/renderer/components/modals/ModalLayer.tsx b/src/renderer/components/modals/ModalLayer.tsx
new file mode 100644
index 0000000..d967927
--- /dev/null
+++ b/src/renderer/components/modals/ModalLayer.tsx
@@ -0,0 +1,33 @@
+import { useAppStore } from '@/stores/app-store';
+import { AboutDialog } from './AboutDialog';
+import { ConfirmDialog } from './ConfirmDialog';
+import { ExportBatchDialog } from './ExportBatchDialog';
+import { ExportDocxDialog } from './ExportDocxDialog';
+import { ExportHtmlDialog } from './ExportHtmlDialog';
+import { ExportPdfDialog } from './ExportPdfDialog';
+import { SettingsSheet } from './SettingsSheet';
+import { WelcomeDialog } from './WelcomeDialog';
+
+export function ModalLayer() {
+ const modal = useAppStore((s) => s.modal);
+ switch (modal.kind) {
+ case null:
+ return null;
+ case 'export-pdf':
+ return ;
+ case 'export-docx':
+ return ;
+ case 'export-html':
+ return ;
+ case 'export-batch':
+ return ;
+ case 'settings':
+ return ;
+ case 'about':
+ return ;
+ case 'welcome':
+ return ;
+ case 'confirm':
+ return ;
+ }
+}
\ No newline at end of file
diff --git a/tests/component/modals/ModalLayer.test.tsx b/tests/component/modals/ModalLayer.test.tsx
new file mode 100644
index 0000000..a04ee64
--- /dev/null
+++ b/tests/component/modals/ModalLayer.test.tsx
@@ -0,0 +1,32 @@
+import { describe, it, expect, beforeEach } from 'vitest';
+import { render, screen } from '@testing-library/react';
+import { ModalLayer } from '@/components/modals/ModalLayer';
+import { useAppStore } from '@/stores/app-store';
+
+describe('ModalLayer', () => {
+ beforeEach(() => {
+ localStorage.clear();
+ useAppStore.setState({ modal: { kind: null } } as any);
+ });
+
+ it('renders nothing when modal is null', () => {
+ const { container } = render();
+ expect(container.firstChild).toBeNull();
+ });
+
+ it('renders AboutDialog when kind is "about"', () => {
+ useAppStore.getState().openModal('about');
+ render();
+ expect(screen.getByRole('dialog')).toBeInTheDocument();
+ });
+
+ it('switches from about to settings when modal kind changes', () => {
+ useAppStore.getState().openModal('about');
+ const { rerender } = render();
+ expect(screen.getByText(/about markdownconverter/i)).toBeInTheDocument();
+ useAppStore.getState().openModal('settings');
+ rerender();
+ expect(screen.queryByText(/about markdownconverter/i)).not.toBeInTheDocument();
+ expect(screen.getByText(/settings/i)).toBeInTheDocument();
+ });
+});
\ No newline at end of file