Compare commits

...

2 Commits

Author SHA1 Message Date
e560248
0804eba920 add Modal example 2025-04-08 09:58:49 +02:00
e560248
6d7060aceb add react-scan & VS Code Settings 2025-04-08 09:40:48 +02:00
7 changed files with 856 additions and 84 deletions

33
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,33 @@
{
"editor.codeActionsOnSave": {
"source.addMissingImports": "always",
"source.fixAll": "always"
},
"editor.formatOnSave": true,
"editor.detectIndentation": false,
"editor.tabSize": 2,
"files.eol": "\n",
"search.exclude": {
"**/.next": true,
"**/node_modules": true,
"**/package-lock.json": true
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json][jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}

View File

@@ -7,6 +7,7 @@
<title>React Advanced Cours</title>
</head>
<body>
<div id="modal"></div>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite",
"scan": "vite & npx react-scan@latest localhost:5173",
"build": "tsc -b && vite build",
"lint": "eslint .",
"preview": "vite preview",
@@ -17,7 +18,8 @@
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.5.0"
"react-router-dom": "^7.5.0",
"react-scan": "^0.3.3"
},
"devDependencies": {
"@eslint/js": "^9.21.0",
@@ -37,4 +39,4 @@
"vite": "^6.2.0",
"vitest": "^3.1.1"
}
}
}

View File

@@ -0,0 +1,18 @@
.modal {
position: fixed;
background-color: rgba(0, 0, 0, 0.5);
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.modal .modal-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: red;
padding: 20px;
border-radius: 5px;
}

View File

@@ -0,0 +1,18 @@
import'./Modal.css';
interface ModalProps {
open?: boolean;
onClose?: () => void;
}
export default function Modal({ open= true, onClose }: ModalProps): React.ReactElement {
console.log("Modal rendered");
return (
<div style={{ display: open ? "block" : "none" }} className='modal' onClick={() => onClose && onClose()}>
<div className='modal-content'>
<h2>Modal</h2>
<p>This is a modal component.</p>
</div>
</div>
);
}

View File

@@ -1,15 +1,19 @@
import { createPortal } from "react-dom";
import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
import EffectExercises from "../common/components/exercises/EffectExercises";
import Modal from "../common/components/Modal";
import { useState } from "react";
export default function ComponentWrapperPage() {
const [modalOpen, setModalOpen] = useState(false);
return (
<div style={{ display: 'flex', flexDirection: 'column', gap: '3rem' }}>
<ComponentWrapper title='Komponenten Wrapper Test'>
<h1>Hallo</h1>
</ComponentWrapper>
<ComponentWrapper title='Komponenten Wrapper Test2'>
<EffectExercises />
</ComponentWrapper>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '3rem' }}>
<ComponentWrapper title='Komponenten Wrapper Test'>
<h1>Hallo</h1>
</ComponentWrapper>
<ComponentWrapper title='Modal Test'>
<button onClick={() => setModalOpen(!modalOpen)}>Toggle Modal</button>
{modalOpen && createPortal(<Modal onClose={() => setModalOpen(false)}/>,document.getElementById("modal") as HTMLElement)}
</ComponentWrapper>
</div>
);
}