From cc0d960bdf5255e666ab5e5b1d64f857fcd774ec Mon Sep 17 00:00:00 2001 From: GarandPLG Date: Wed, 16 Oct 2024 21:33:12 +0200 Subject: [PATCH] first commit --- .gitignore | 24 +++++++++++++++++ .prettierrc.json | 14 ++++++++++ README.md | 50 ++++++++++++++++++++++++++++++++++ bun.lockb | Bin 0 -> 81940 bytes eslint.config.js | 28 ++++++++++++++++++++ package.json | 34 ++++++++++++++++++++++++ src/App.tsx | 56 +++++++++++++++++++++++++++++++++++++++ src/components/Disk.tsx | 35 ++++++++++++++++++++++++ src/components/Tower.tsx | 25 +++++++++++++++++ src/index.html | 13 +++++++++ src/main.tsx | 10 +++++++ src/public/vite.svg | 1 + src/scss/styles.scss | 21 +++++++++++++++ src/types.ts | 18 +++++++++++++ src/vite-env.d.ts | 1 + tsconfig.app.json | 24 +++++++++++++++++ tsconfig.json | 7 +++++ tsconfig.node.json | 22 +++++++++++++++ vite.config.ts | 9 +++++++ 19 files changed, 392 insertions(+) create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 eslint.config.js create mode 100644 package.json create mode 100644 src/App.tsx create mode 100644 src/components/Disk.tsx create mode 100644 src/components/Tower.tsx create mode 100644 src/index.html create mode 100644 src/main.tsx create mode 100644 src/public/vite.svg create mode 100644 src/scss/styles.scss create mode 100644 src/types.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..f311aa4 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": true, + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none", + "useTabs": true, + "arrowParens": "avoid", + "bracketSpacing": true, + "proseWrap": "always", + "htmlWhitespaceSensitivity": "strict", + "endOfLine": "lf" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..3e70ce980766399354ad675d53fe881d091584d5 GIT binary patch literal 81940 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 { + const [towers, setTowers] = useState([ + [ + { size: 5, id: 5 }, + { size: 4, id: 4 }, + { size: 3, id: 3 }, + { size: 2, id: 2 }, + { size: 1, id: 1 } + ], + [], + [] + ]); + + const moveDisk = (fromTower: number, toTower: number, diskId: number) => { + setTowers(prevTowers => { + const newTowers = [...prevTowers]; + const diskIndex = newTowers[fromTower].findIndex(disk => disk.id === diskId); + const diskToMove = newTowers[fromTower][diskIndex]; + + if (diskIndex !== 0) return prevTowers; + + const targetTower = newTowers[toTower]; + + if (targetTower.length > 0 && targetTower[0].size < diskToMove.size) return prevTowers; + + newTowers[fromTower] = newTowers[fromTower].filter(disk => disk.id !== diskId); + newTowers[toTower] = [diskToMove, ...newTowers[toTower]]; + + return newTowers; + }); + }; + + return ( +

+

Wieża Hanoi

+
+ {towers.map((tower, index) => ( +
+ i !== index)} + /> +
+ ))} +
+
+ ); +}; + +export default App; diff --git a/src/components/Disk.tsx b/src/components/Disk.tsx new file mode 100644 index 0000000..0a3078f --- /dev/null +++ b/src/components/Disk.tsx @@ -0,0 +1,35 @@ +// components/Disk.tsx +import { FC } from 'react'; +import { DiskProps } from '../types'; + +const DiskComponent: FC = ({ disk, fromTower, otherTowers, onMove }) => { + const width = 50 + disk.size * 30; + + return ( +
+ {disk.size} +
+ {otherTowers.map(toTower => ( + + ))} +
+
+ ); +}; + +export default DiskComponent; diff --git a/src/components/Tower.tsx b/src/components/Tower.tsx new file mode 100644 index 0000000..45b1888 --- /dev/null +++ b/src/components/Tower.tsx @@ -0,0 +1,25 @@ +// components/Tower.tsx +import { FC } from 'react'; +import { TowerProps } from '../types'; +import DiskComponent from './Disk'; + +const Tower: FC = ({ disks, towerIndex, onMove, otherTowers }) => { + return ( +
+

Wieża {towerIndex + 1}

+
+ {disks.map(disk => ( + + ))} +
+
+ ); +}; + +export default Tower; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..02e54ba --- /dev/null +++ b/src/index.html @@ -0,0 +1,13 @@ + + + + + + + Wierza Hanoi - Kacper Pluciński + + +
+ + + diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..70bd065 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; +import './scss/styles.scss'; + +createRoot(document.getElementById('root')!).render( + + + +); diff --git a/src/public/vite.svg b/src/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/scss/styles.scss b/src/scss/styles.scss new file mode 100644 index 0000000..7db883d --- /dev/null +++ b/src/scss/styles.scss @@ -0,0 +1,21 @@ +@import 'bootstrap/scss/bootstrap'; + +.tower { + display: flex; + flex-direction: column-reverse; + align-items: center; + border: 1px solid #ddd; + padding: 20px; + min-height: 300px; + background-color: #f8f9fa; +} + +.disk { + display: flex; + justify-content: center; + align-items: center; + margin: 5px 0; + border-radius: 5px; + color: white; + font-weight: bold; +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..1c17514 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,18 @@ +export interface Disk { + size: number; + id: number; +} + +export interface DiskProps { + disk: Disk; + fromTower: number; + otherTowers: number[]; + onMove: (from: number, to: number, diskId: number) => void; +} + +export interface TowerProps { + disks: Disk[]; + towerIndex: number; + onMove: (from: number, to: number, diskId: number) => void; + otherTowers: number[]; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..f0a2350 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..0d3d714 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..68a7fa1 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,9 @@ +import path from 'path'; +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + root: 'src' +});