Compare commits
2 Commits
9ad33b98e7
...
0804eba920
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0804eba920 | ||
|
|
6d7060aceb |
33
.vscode/settings.json
vendored
Normal file
33
.vscode/settings.json
vendored
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
<title>React Advanced Cours</title>
|
<title>React Advanced Cours</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div id="modal"></div>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
842
react-advanced-tag1/package-lock.json
generated
842
react-advanced-tag1/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
"scan": "vite & npx react-scan@latest localhost:5173",
|
||||||
"build": "tsc -b && vite build",
|
"build": "tsc -b && vite build",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
@@ -17,7 +18,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-dom": "^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": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.21.0",
|
"@eslint/js": "^9.21.0",
|
||||||
@@ -37,4 +39,4 @@
|
|||||||
"vite": "^6.2.0",
|
"vite": "^6.2.0",
|
||||||
"vitest": "^3.1.1"
|
"vitest": "^3.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
18
react-advanced-tag1/src/common/components/Modal.css
Normal file
18
react-advanced-tag1/src/common/components/Modal.css
Normal 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;
|
||||||
|
}
|
||||||
18
react-advanced-tag1/src/common/components/Modal.tsx
Normal file
18
react-advanced-tag1/src/common/components/Modal.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,15 +1,19 @@
|
|||||||
|
import { createPortal } from "react-dom";
|
||||||
import ComponentWrapper from "../common/components/ComponentWrapper/ComponentWrapper";
|
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() {
|
export default function ComponentWrapperPage() {
|
||||||
|
const [modalOpen, setModalOpen] = useState(false);
|
||||||
return (
|
return (
|
||||||
<div style={{ display: 'flex', flexDirection: 'column', gap: '3rem' }}>
|
<div style={{ display: 'flex', flexDirection: 'column', gap: '3rem' }}>
|
||||||
<ComponentWrapper title='Komponenten Wrapper Test'>
|
<ComponentWrapper title='Komponenten Wrapper Test'>
|
||||||
<h1>Hallo</h1>
|
<h1>Hallo</h1>
|
||||||
</ComponentWrapper>
|
</ComponentWrapper>
|
||||||
<ComponentWrapper title='Komponenten Wrapper Test2'>
|
<ComponentWrapper title='Modal Test'>
|
||||||
<EffectExercises />
|
<button onClick={() => setModalOpen(!modalOpen)}>Toggle Modal</button>
|
||||||
</ComponentWrapper>
|
{modalOpen && createPortal(<Modal onClose={() => setModalOpen(false)}/>,document.getElementById("modal") as HTMLElement)}
|
||||||
</div>
|
</ComponentWrapper>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user