From bb3acb34f86dc69e19bef5912f64dac533fc88ce Mon Sep 17 00:00:00 2001 From: Fred Date: Thu, 22 Aug 2024 18:39:52 +0100 Subject: [PATCH 01/13] lecture 1 --- .../01-starting-project/package-lock.json | 1383 +++++++++++++++++ .../01-starting-project/src/App.jsx | 22 +- 2 files changed, 1397 insertions(+), 8 deletions(-) create mode 100644 code/03 React Essentials/01-starting-project/package-lock.json diff --git a/code/03 React Essentials/01-starting-project/package-lock.json b/code/03 React Essentials/01-starting-project/package-lock.json new file mode 100644 index 000000000..bfe0fb9d3 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/package-lock.json @@ -0,0 +1,1383 @@ +{ + "name": "react-essentials-start", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-essentials-start", + "version": "0.0.0", + "dependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.0.0", + "vite": "^4.3.9" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.4.tgz", + "integrity": "sha512-NFtZmZsyzDPJnk9Zg3BbTfKKc9UlHYzD0E//p2Z3B9nCwwtJW9T0gVbCz8+fBngnn4zf1Dr3IK8PHQQHq0lDQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.4", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001651", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", + "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 1da1677ed..49a1e965e 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,14 +1,20 @@ +function Header() { + return ( +
+ Stylized atom +

React Essentials

+

+ Fundamental React concepts you will need for almost any app you are + going to build! +

+
+ ); +} + function App() { return (
-
- Stylized atom -

React Essentials

-

- Fundamental React concepts you will need for almost any app you are - going to build! -

-
+

Time to get started!

From 456adfdd1228b6adede9a697fcf4f6a3e6ac9d2f Mon Sep 17 00:00:00 2001 From: Fred Date: Fri, 23 Aug 2024 19:16:13 +0100 Subject: [PATCH 02/13] test --- .../01-starting-project/src/App.jsx | 40 +++++++++++++++++++ .../01-starting-project/src/index.css | 4 ++ 2 files changed, 44 insertions(+) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 49a1e965e..32feb6750 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,3 +1,5 @@ +import React, { useState } from "react"; + function Header() { return (
@@ -11,13 +13,51 @@ function Header() { ); } +function MainGoal({ id }) { + return ( +

+ My main goal is to learn react, from the ground up and in depth!! +

+ ); +} + +function AskName() { + const [name, setName] = useState(""); + function handleClick() { + const inputName = prompt("What is your name ?"); + setName(inputName); + } + + return ( +
+ + {name &&

Hello there !{name}

} +
+ ); +} + +function Button({ onClick }) { + return ( + + ); +} + function App() { + function handleButtonClick() { + alert("You pressed the button!"); + } + return (

Time to get started!

+
+ +
); } diff --git a/code/03 React Essentials/01-starting-project/src/index.css b/code/03 React Essentials/01-starting-project/src/index.css index 7cb6a1438..94dc8768c 100644 --- a/code/03 React Essentials/01-starting-project/src/index.css +++ b/code/03 React Essentials/01-starting-project/src/index.css @@ -53,6 +53,10 @@ main { margin: auto; } +#maingoal { + text-align: center; +} + #core-concepts { padding: 2rem; border-radius: 6px; From 1531dedeaa6ad579106b795517e3ed277f7939e9 Mon Sep 17 00:00:00 2001 From: Fred Date: Sun, 25 Aug 2024 16:55:12 +0100 Subject: [PATCH 03/13] Training --- .../01-starting-project/src/App.jsx | 51 ++++--------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 32feb6750..cb4bf3df0 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,63 +1,32 @@ -import React, { useState } from "react"; +import reactImg from "./assets/react-core-concepts.png"; + +const reactDescription = ["Fundamental", "Crucial", "Core"]; + +function genRandomInt(max) { + return Math.floor(Math.random() * (max + 1)); +} function Header() { + const description = reactDescription[genRandomInt(2)]; return (
- Stylized atom + Stylized atom

React Essentials

- Fundamental React concepts you will need for almost any app you are + {description} React concepts you will need for almost any app you are going to build!

); } -function MainGoal({ id }) { - return ( -

- My main goal is to learn react, from the ground up and in depth!! -

- ); -} - -function AskName() { - const [name, setName] = useState(""); - function handleClick() { - const inputName = prompt("What is your name ?"); - setName(inputName); - } - - return ( -
- - {name &&

Hello there !{name}

} -
- ); -} - -function Button({ onClick }) { - return ( - - ); -} - function App() { - function handleButtonClick() { - alert("You pressed the button!"); - } - return (

Time to get started!

-
- -
); } From 687851db65cd29c2183635a559c35da70aaf57db Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 26 Aug 2024 14:55:14 +0100 Subject: [PATCH 04/13] React Practice --- .../01-starting-project/src/App.jsx | 25 ++++++++++++++- .../01-starting-project/src/data.js | 31 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 code/03 React Essentials/01-starting-project/src/data.js diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index cb4bf3df0..f16fd06de 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,4 +1,5 @@ import reactImg from "./assets/react-core-concepts.png"; +import { CORE_CONCEPTS } from "./data.js"; const reactDescription = ["Fundamental", "Crucial", "Core"]; @@ -20,12 +21,34 @@ function Header() { ); } +function CoreConcept(props) { + return ( +
  • + {props.title} +

    {props.title}

    +

    {props.description}

    +
  • + ); +} + function App() { return (
    -

    Time to get started!

    +
    +

    Time to get started!

    +
      + + + + +
    +
    ); diff --git a/code/03 React Essentials/01-starting-project/src/data.js b/code/03 React Essentials/01-starting-project/src/data.js new file mode 100644 index 000000000..36f63ef42 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/data.js @@ -0,0 +1,31 @@ +import componentsImg from "./assets/components.png"; +import propsImg from "./assets/config.png"; +import jsxImg from "./assets/jsx-ui.png"; +import stateImg from "./assets/state-mgmt.png"; + +export const CORE_CONCEPTS = [ + { + image: componentsImg, + title: "Components", + description: + "The core UI building block - compose the user interface by combining multiple components.", + }, + { + image: jsxImg, + title: "JSX", + description: + "Return (potentially dynamic) HTML(ish) code to define the actual markup that will be rendered.", + }, + { + image: propsImg, + title: "Props", + description: + "Make components configurable (and therefore reusable) by passing input data to them.", + }, + { + image: stateImg, + title: "State", + description: + "React-managed data which, when changed, causes the component to re-render & the UI to update.", + }, +]; From a5e61db8c7ce366c7844486c9a18930d78e67b3e Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 27 Aug 2024 12:30:47 +0100 Subject: [PATCH 05/13] practice --- .../01-starting-project/src/App.jsx | 33 ++----------------- .../src/components/CoreConcept.jsx | 9 +++++ .../src/components/Header/Header.css | 27 +++++++++++++++ .../src/components/Header/Header.jsx | 21 ++++++++++++ .../01-starting-project/src/index.css | 28 ---------------- 5 files changed, 59 insertions(+), 59 deletions(-) create mode 100644 code/03 React Essentials/01-starting-project/src/components/CoreConcept.jsx create mode 100644 code/03 React Essentials/01-starting-project/src/components/Header/Header.css create mode 100644 code/03 React Essentials/01-starting-project/src/components/Header/Header.jsx diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index f16fd06de..d65e2500b 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,35 +1,6 @@ -import reactImg from "./assets/react-core-concepts.png"; import { CORE_CONCEPTS } from "./data.js"; - -const reactDescription = ["Fundamental", "Crucial", "Core"]; - -function genRandomInt(max) { - return Math.floor(Math.random() * (max + 1)); -} - -function Header() { - const description = reactDescription[genRandomInt(2)]; - return ( -
    - Stylized atom -

    React Essentials

    -

    - {description} React concepts you will need for almost any app you are - going to build! -

    -
    - ); -} - -function CoreConcept(props) { - return ( -
  • - {props.title} -

    {props.title}

    -

    {props.description}

    -
  • - ); -} +import Header from "./components/Header/Header.jsx"; +import CoreConcept from "./components/CoreConcept.jsx"; function App() { return ( diff --git a/code/03 React Essentials/01-starting-project/src/components/CoreConcept.jsx b/code/03 React Essentials/01-starting-project/src/components/CoreConcept.jsx new file mode 100644 index 000000000..71b19ef9a --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/CoreConcept.jsx @@ -0,0 +1,9 @@ +export default function CoreConcept(props) { + return ( +
  • + {props.title} +

    {props.title}

    +

    {props.description}

    +
  • + ); +} diff --git a/code/03 React Essentials/01-starting-project/src/components/Header/Header.css b/code/03 React Essentials/01-starting-project/src/components/Header/Header.css new file mode 100644 index 000000000..552b94b7f --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/Header/Header.css @@ -0,0 +1,27 @@ +header { + text-align: center; + margin: 3rem 0; +} + +header img { + height: 5rem; + width: 10rem; + object-fit: cover; +} + +header h1 { + margin: 0; + font-family: "Roboto Condensed", sans-serif; + font-size: 5rem; + background: linear-gradient(40deg, #ea00ff, #ea00ff, #03d5ff, #03d5ff); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.5)); +} + +header p { + margin: 0; + font-size: 1.25rem; + color: #8964b0; + font-family: "Roboto Condensed", sans-serif; +} diff --git a/code/03 React Essentials/01-starting-project/src/components/Header/Header.jsx b/code/03 React Essentials/01-starting-project/src/components/Header/Header.jsx new file mode 100644 index 000000000..4233944a2 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/Header/Header.jsx @@ -0,0 +1,21 @@ +import reactImg from "../../assets/react-core-concepts.png"; +import "./Header.css"; +const reactDescription = ["Fundamental", "Crucial", "Core"]; + +function genRandomInt(max) { + return Math.floor(Math.random() * (max + 1)); +} + +export default function Header() { + const description = reactDescription[genRandomInt(2)]; + return ( +
    + Stylized atom +

    React Essentials

    +

    + {description} React concepts you will need for almost any app you are + going to build! +

    +
    + ); +} diff --git a/code/03 React Essentials/01-starting-project/src/index.css b/code/03 React Essentials/01-starting-project/src/index.css index 94dc8768c..0f7f5f397 100644 --- a/code/03 React Essentials/01-starting-project/src/index.css +++ b/code/03 React Essentials/01-starting-project/src/index.css @@ -19,34 +19,6 @@ html { min-height: 80rem; } -header { - text-align: center; - margin: 3rem 0; -} - -header img { - height: 5rem; - width: 10rem; - object-fit: cover; -} - -header h1 { - margin: 0; - font-family: "Roboto Condensed", sans-serif; - font-size: 5rem; - background: linear-gradient(40deg, #ea00ff, #ea00ff, #03d5ff, #03d5ff); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.5)); -} - -header p { - margin: 0; - font-size: 1.25rem; - color: #8964b0; - font-family: "Roboto Condensed", sans-serif; -} - main { width: 90%; max-width: 50rem; From f42515a22d85531e21ad40730eac07bf3cd2d0ad Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 27 Aug 2024 16:49:10 +0100 Subject: [PATCH 06/13] Training --- .../01-starting-project/src/App.jsx | 10 ++++++++++ .../01-starting-project/src/components/TabButton.jsx | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 code/03 React Essentials/01-starting-project/src/components/TabButton.jsx diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index d65e2500b..7aac73410 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,6 +1,7 @@ import { CORE_CONCEPTS } from "./data.js"; import Header from "./components/Header/Header.jsx"; import CoreConcept from "./components/CoreConcept.jsx"; +import TabButton from "./components/TabButton.jsx"; function App() { return ( @@ -20,6 +21,15 @@ function App() { +
    +

    Examples

    + + Component + JSX + Props + State + +
    ); diff --git a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx new file mode 100644 index 000000000..db5af2721 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx @@ -0,0 +1,7 @@ +export default function TabButton(props) { + return ( +
  • + +
  • + ); +} From 5f02d239f8f78b9491a436f3b88c294d107effbb Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 28 Aug 2024 18:24:27 +0100 Subject: [PATCH 07/13] practice --- .../src/components/TabButton.jsx | 7 +- vite-project/.gitignore | 24 +++++++ vite-project/README.md | 8 +++ vite-project/eslint.config.js | 38 +++++++++++ vite-project/index.html | 13 ++++ vite-project/package.json | 28 ++++++++ vite-project/public/vite.svg | 1 + vite-project/src/App.css | 42 ++++++++++++ vite-project/src/App.jsx | 35 ++++++++++ vite-project/src/assets/react.svg | 1 + vite-project/src/index.css | 68 +++++++++++++++++++ vite-project/src/main.jsx | 10 +++ vite-project/vite.config.js | 7 ++ 13 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 vite-project/.gitignore create mode 100644 vite-project/README.md create mode 100644 vite-project/eslint.config.js create mode 100644 vite-project/index.html create mode 100644 vite-project/package.json create mode 100644 vite-project/public/vite.svg create mode 100644 vite-project/src/App.css create mode 100644 vite-project/src/App.jsx create mode 100644 vite-project/src/assets/react.svg create mode 100644 vite-project/src/index.css create mode 100644 vite-project/src/main.jsx create mode 100644 vite-project/vite.config.js diff --git a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx index db5af2721..1fb9781ce 100644 --- a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx +++ b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx @@ -1,7 +1,10 @@ -export default function TabButton(props) { +export default function TabButton({ children }) { + function handleClick() { + console.log("Hello World!"); + } return (
  • - +
  • ); } diff --git a/vite-project/.gitignore b/vite-project/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/vite-project/.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/vite-project/README.md b/vite-project/README.md new file mode 100644 index 000000000..f768e33fc --- /dev/null +++ b/vite-project/README.md @@ -0,0 +1,8 @@ +# React + 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 diff --git a/vite-project/eslint.config.js b/vite-project/eslint.config.js new file mode 100644 index 000000000..238d2e4e6 --- /dev/null +++ b/vite-project/eslint.config.js @@ -0,0 +1,38 @@ +import js from '@eslint/js' +import globals from 'globals' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + settings: { react: { version: '18.3' } }, + plugins: { + react, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + ...reactHooks.configs.recommended.rules, + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/vite-project/index.html b/vite-project/index.html new file mode 100644 index 000000000..0c589eccd --- /dev/null +++ b/vite-project/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
    + + + diff --git a/vite-project/package.json b/vite-project/package.json new file mode 100644 index 000000000..483fb5624 --- /dev/null +++ b/vite-project/package.json @@ -0,0 +1,28 @@ +{ + "name": "vite-project", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "vite": "^5.4.1" + } +} diff --git a/vite-project/public/vite.svg b/vite-project/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/vite-project/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vite-project/src/App.css b/vite-project/src/App.css new file mode 100644 index 000000000..b9d355df2 --- /dev/null +++ b/vite-project/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/vite-project/src/App.jsx b/vite-project/src/App.jsx new file mode 100644 index 000000000..b8b8473a3 --- /dev/null +++ b/vite-project/src/App.jsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> +
    + + Vite logo + + + React logo + +
    +

    Vite + React

    +
    + +

    + Edit src/App.jsx and save to test HMR +

    +
    +

    + Click on the Vite and React logos to learn more +

    + + ) +} + +export default App diff --git a/vite-project/src/assets/react.svg b/vite-project/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/vite-project/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vite-project/src/index.css b/vite-project/src/index.css new file mode 100644 index 000000000..6119ad9a8 --- /dev/null +++ b/vite-project/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/vite-project/src/main.jsx b/vite-project/src/main.jsx new file mode 100644 index 000000000..89f91e54d --- /dev/null +++ b/vite-project/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/vite-project/vite.config.js b/vite-project/vite.config.js new file mode 100644 index 000000000..5a33944a9 --- /dev/null +++ b/vite-project/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 6ae5c273a0e08596c4f71104e2677002837fa011 Mon Sep 17 00:00:00 2001 From: Fred Date: Fri, 30 Aug 2024 17:04:59 +0100 Subject: [PATCH 08/13] training --- .../01-starting-project/src/App.jsx | 20 +++++++++++++++---- .../src/components/TabButton.jsx | 7 ++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 7aac73410..90d289b9f 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,9 +1,18 @@ +import { useState } from "react"; + import { CORE_CONCEPTS } from "./data.js"; import Header from "./components/Header/Header.jsx"; import CoreConcept from "./components/CoreConcept.jsx"; import TabButton from "./components/TabButton.jsx"; function App() { + const [selectedTopic, setSelectedTopic] = useState("Please click a button"); + + function handleSelect(selectedButton) { + setSelectedTopic(selectedButton); + console.log(selectedTopic); + } + return (
    @@ -24,11 +33,14 @@ function App() {

    Examples

    - Component - JSX - Props - State + handleSelect("component")}> + Component + + handleSelect("jsx")}>JSX + handleSelect("props")}>Props + handleSelect("state")}>State + {selectedTopic}
    diff --git a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx index 1fb9781ce..721150bd7 100644 --- a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx +++ b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx @@ -1,10 +1,7 @@ -export default function TabButton({ children }) { - function handleClick() { - console.log("Hello World!"); - } +export default function TabButton({ children, onSelect }) { return (
  • - +
  • ); } From 5024f1296d04b0f48de24a9ff0cf05ffae75a70d Mon Sep 17 00:00:00 2001 From: Fred Date: Sat, 31 Aug 2024 20:00:33 +0100 Subject: [PATCH 09/13] training --- .../01-starting-project/src/App.jsx | 13 +++-- .../01-starting-project/src/data.js | 51 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 90d289b9f..317156e34 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -4,9 +4,10 @@ import { CORE_CONCEPTS } from "./data.js"; import Header from "./components/Header/Header.jsx"; import CoreConcept from "./components/CoreConcept.jsx"; import TabButton from "./components/TabButton.jsx"; +import { EXAMPLES } from "./data.js"; function App() { - const [selectedTopic, setSelectedTopic] = useState("Please click a button"); + const [selectedTopic, setSelectedTopic] = useState("components"); function handleSelect(selectedButton) { setSelectedTopic(selectedButton); @@ -33,14 +34,20 @@ function App() {

    Examples

    - handleSelect("component")}> + handleSelect("components")}> Component handleSelect("jsx")}>JSX handleSelect("props")}>Props handleSelect("state")}>State - {selectedTopic} +
    +

    {EXAMPLES[selectedTopic].title}

    +

    {EXAMPLES[selectedTopic].description}

    +
    +              {EXAMPLES[selectedTopic].code}
    +            
    +
    diff --git a/code/03 React Essentials/01-starting-project/src/data.js b/code/03 React Essentials/01-starting-project/src/data.js index 36f63ef42..7f86c564d 100644 --- a/code/03 React Essentials/01-starting-project/src/data.js +++ b/code/03 React Essentials/01-starting-project/src/data.js @@ -29,3 +29,54 @@ export const CORE_CONCEPTS = [ "React-managed data which, when changed, causes the component to re-render & the UI to update.", }, ]; + +export const EXAMPLES = { + components: { + title: "Components", + description: + "Components are the building blocks of React applications. A component is a self-contained module (HTML + optional CSS + JS) that renders some output.", + code: ` +function Welcome() { + return

    Hello, World!

    ; +}`, + }, + jsx: { + title: "JSX", + description: + "JSX is a syntax extension to JavaScript. It is similar to a template language, but it has full power of JavaScript (e.g., it may output dynamic content).", + code: ` +
    +

    Welcome {userName}

    +

    Time to learn React!

    +
    `, + }, + props: { + title: "Props", + description: + "Components accept arbitrary inputs called props. They are like function arguments.", + code: ` +function Welcome(props) { + return

    Hello, {props.name}

    ; +}`, + }, + state: { + title: "State", + description: + "State allows React components to change their output over time in response to user actions, network responses, and anything else.", + code: ` +function Counter() { + const [isVisible, setIsVisible] = useState(false); + + function handleClick() { + setIsVisible(true); + } + + return ( +
    + + {isVisible &&

    Amazing details!

    } +
    + ); +}`, + }, +}; From d9abf641d462db329a38603adcfe9381a9cb93c6 Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 2 Sep 2024 18:11:11 +0100 Subject: [PATCH 10/13] training --- .../01-starting-project/src/App.jsx | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 317156e34..7a4afa26b 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -14,6 +14,20 @@ function App() { console.log(selectedTopic); } + let tabContent =

    Please select a topic!

    ; + + if (selectedTopic) { + tabContent = ( +
    +

    {EXAMPLES[selectedTopic].title}

    +

    {EXAMPLES[selectedTopic].description}

    +
    +          {EXAMPLES[selectedTopic].code}
    +        
    +
    + ); + } + return (
    @@ -41,14 +55,8 @@ function App() { handleSelect("props")}>Props handleSelect("state")}>State -
    -

    {EXAMPLES[selectedTopic].title}

    -

    {EXAMPLES[selectedTopic].description}

    -
    -              {EXAMPLES[selectedTopic].code}
    -            
    -
    + {tabContent}
    ); From c86a992ffa6f3cd6aa0cc1838cb326a2cfa9f615 Mon Sep 17 00:00:00 2001 From: Fred Date: Tue, 3 Sep 2024 18:26:51 +0100 Subject: [PATCH 11/13] training --- .../01-starting-project/src/App.jsx | 37 +++++++++++++------ .../src/components/TabButton.jsx | 6 ++- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 7a4afa26b..2b4c7e26b 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -35,25 +35,38 @@ function App() {

    Time to get started!

      - - - - + {CORE_CONCEPTS.map((conceptItem) => ( + + ))}

    Examples

    - handleSelect("components")}> + handleSelect("components")} + > Component - handleSelect("jsx")}>JSX - handleSelect("props")}>Props - handleSelect("state")}>State + handleSelect("jsx")} + > + JSX + + handleSelect("props")} + > + Props + + handleSelect("state")} + > + State +
    {tabContent} diff --git a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx index 721150bd7..bc75cf3fa 100644 --- a/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx +++ b/code/03 React Essentials/01-starting-project/src/components/TabButton.jsx @@ -1,7 +1,9 @@ -export default function TabButton({ children, onSelect }) { +export default function TabButton({ children, onSelect, isSelected }) { return (
  • - +
  • ); } From bef27a0c5c4c7e0072bddd7feba7a4551739929d Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 9 Sep 2024 17:45:20 +0100 Subject: [PATCH 12/13] training v2 --- .../01-starting-project/src/App.jsx | 60 ++----------------- .../src/components/CoreConcepts.jsx | 16 +++++ .../src/components/Examples.jsx | 40 +++++++++++++ 3 files changed, 62 insertions(+), 54 deletions(-) create mode 100644 code/03 React Essentials/01-starting-project/src/components/CoreConcepts.jsx create mode 100644 code/03 React Essentials/01-starting-project/src/components/Examples.jsx diff --git a/code/03 React Essentials/01-starting-project/src/App.jsx b/code/03 React Essentials/01-starting-project/src/App.jsx index 7a4afa26b..bfb4956d8 100644 --- a/code/03 React Essentials/01-starting-project/src/App.jsx +++ b/code/03 React Essentials/01-starting-project/src/App.jsx @@ -1,64 +1,16 @@ -import { useState } from "react"; - -import { CORE_CONCEPTS } from "./data.js"; import Header from "./components/Header/Header.jsx"; -import CoreConcept from "./components/CoreConcept.jsx"; -import TabButton from "./components/TabButton.jsx"; -import { EXAMPLES } from "./data.js"; +import CoreConcepts from "./components/CoreConcepts.jsx"; +import Examples from "./components/Examples.jsx"; function App() { - const [selectedTopic, setSelectedTopic] = useState("components"); - - function handleSelect(selectedButton) { - setSelectedTopic(selectedButton); - console.log(selectedTopic); - } - - let tabContent =

    Please select a topic!

    ; - - if (selectedTopic) { - tabContent = ( -
    -

    {EXAMPLES[selectedTopic].title}

    -

    {EXAMPLES[selectedTopic].description}

    -
    -          {EXAMPLES[selectedTopic].code}
    -        
    -
    - ); - } - return ( -
    + <>
    -
    -

    Time to get started!

    -
      - - - - -
    -
    -
    -

    Examples

    - - handleSelect("components")}> - Component - - handleSelect("jsx")}>JSX - handleSelect("props")}>Props - handleSelect("state")}>State - -
    - {tabContent} + +
    -
    + ); } diff --git a/code/03 React Essentials/01-starting-project/src/components/CoreConcepts.jsx b/code/03 React Essentials/01-starting-project/src/components/CoreConcepts.jsx new file mode 100644 index 000000000..f8ed358c5 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/CoreConcepts.jsx @@ -0,0 +1,16 @@ +import React from "react"; +import CoreConcept from "./CoreConcept"; +import { CORE_CONCEPTS } from "../data"; + +export default function CoreConcepts() { + return ( +
    +

    Time to get started!

    +
      + {CORE_CONCEPTS.map((conceptItem) => ( + + ))} +
    +
    + ); +} diff --git a/code/03 React Essentials/01-starting-project/src/components/Examples.jsx b/code/03 React Essentials/01-starting-project/src/components/Examples.jsx new file mode 100644 index 000000000..5c2e48fc9 --- /dev/null +++ b/code/03 React Essentials/01-starting-project/src/components/Examples.jsx @@ -0,0 +1,40 @@ +import { useState } from "react"; + +import { EXAMPLES } from "../data"; +import TabButton from "./TabButton"; + +export default function Examples() { + const [selectedTopic, setSelectedTopic] = useState("components"); + + function handleSelect(selectedButton) { + setSelectedTopic(selectedButton); + } + + let tabContent =

    Please select a topic!

    ; + + if (selectedTopic) { + tabContent = ( +
    +

    {EXAMPLES[selectedTopic].title}

    +

    {EXAMPLES[selectedTopic].description}

    +
    +          {EXAMPLES[selectedTopic].code}
    +        
    +
    + ); + } + return ( +
    +

    Examples

    + + handleSelect("components")}> + Component + + handleSelect("jsx")}>JSX + handleSelect("props")}>Props + handleSelect("state")}>State + + {tabContent} +
    + ); +} From f2895f2b8835b89b3f9f2bed9f729a5726426404 Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 9 Sep 2024 17:50:44 +0100 Subject: [PATCH 13/13] pushes --- code/01 Getting Started/edited-first-app/src/App.js | 10 +++++----- .../02-creating-using-first-component/src/index.jsx | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/01 Getting Started/edited-first-app/src/App.js b/code/01 Getting Started/edited-first-app/src/App.js index 065c1d7c2..4ab8e275c 100644 --- a/code/01 Getting Started/edited-first-app/src/App.js +++ b/code/01 Getting Started/edited-first-app/src/App.js @@ -6,25 +6,25 @@ const content = [ "React is extremely popular", "It makes building complex, interactive UIs a breeze", "It's powerful & flexible", - "It has a very active and versatile ecosystem" + "It has a very active and versatile ecosystem", ], [ "Components, JSX & Props", "State", "Hooks (e.g., useEffect())", - "Dynamic rendering" + "Dynamic rendering", ], [ "Official web page (react.dev)", "Next.js (Fullstack framework)", - "React Native (build native mobile apps with React)" + "React Native (build native mobile apps with React)", ], [ "Vanilla JavaScript requires imperative programming", "Imperative Programming: You define all the steps needed to achieve a result", "React on the other hand embraces declarative programming", - "With React, you define the goal and React figures out how to get there" - ] + "With React, you define the goal and React figures out how to get there", + ], ]; export default function App() { diff --git a/code/03 React Essentials/02-creating-using-first-component/src/index.jsx b/code/03 React Essentials/02-creating-using-first-component/src/index.jsx index cf43c720f..83ead2a0b 100644 --- a/code/03 React Essentials/02-creating-using-first-component/src/index.jsx +++ b/code/03 React Essentials/02-creating-using-first-component/src/index.jsx @@ -1,7 +1,9 @@ import ReactDOM from "react-dom/client"; +import React from "react"; import App from "./App.jsx"; import "./index.css"; const entryPoint = document.getElementById("root"); ReactDOM.createRoot(entryPoint).render(); +// ReactDOM.createRoot(entryPoint).render(React.createElement(App));