From caa9e0ab873ebd2838715a7f796dba4cfe900dec Mon Sep 17 00:00:00 2001 From: TZGyn Date: Sat, 9 Sep 2023 23:31:29 +0800 Subject: [PATCH] Init react app --- react-frontend/.eslintrc.cjs | 18 ++++++++ react-frontend/.gitignore | 24 ++++++++++ react-frontend/.prettierrc.yaml | 16 +++++++ react-frontend/README.md | 27 +++++++++++ react-frontend/bun.lockb | Bin 0 -> 87006 bytes react-frontend/index.html | 13 ++++++ react-frontend/package.json | 28 +++++++++++ react-frontend/public/vite.svg | 1 + react-frontend/src/App.css | 42 +++++++++++++++++ react-frontend/src/App.tsx | 35 ++++++++++++++ react-frontend/src/assets/react.svg | 1 + react-frontend/src/index.css | 69 ++++++++++++++++++++++++++++ react-frontend/src/main.tsx | 10 ++++ react-frontend/src/vite-env.d.ts | 1 + react-frontend/tsconfig.json | 25 ++++++++++ react-frontend/tsconfig.node.json | 10 ++++ react-frontend/vite.config.ts | 7 +++ 17 files changed, 327 insertions(+) create mode 100644 react-frontend/.eslintrc.cjs create mode 100644 react-frontend/.gitignore create mode 100644 react-frontend/.prettierrc.yaml create mode 100644 react-frontend/README.md create mode 100755 react-frontend/bun.lockb create mode 100644 react-frontend/index.html create mode 100644 react-frontend/package.json create mode 100644 react-frontend/public/vite.svg create mode 100644 react-frontend/src/App.css create mode 100644 react-frontend/src/App.tsx create mode 100644 react-frontend/src/assets/react.svg create mode 100644 react-frontend/src/index.css create mode 100644 react-frontend/src/main.tsx create mode 100644 react-frontend/src/vite-env.d.ts create mode 100644 react-frontend/tsconfig.json create mode 100644 react-frontend/tsconfig.node.json create mode 100644 react-frontend/vite.config.ts diff --git a/react-frontend/.eslintrc.cjs b/react-frontend/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/react-frontend/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/react-frontend/.gitignore b/react-frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/react-frontend/.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/react-frontend/.prettierrc.yaml b/react-frontend/.prettierrc.yaml new file mode 100644 index 0000000..1439e2e --- /dev/null +++ b/react-frontend/.prettierrc.yaml @@ -0,0 +1,16 @@ +--- +printWidth: 80 +tabWidth: 4 +useTabs: true +semi: false +singleQuote: true +quoteProps: consistent +jsxSingleQuote: true +trailingComma: es5 +bracketSpacing: true +bracketSameLine: true +arrowParens: always +htmlWhitespaceSensitivity: strict +vueIndentScriptAndStyle: false +singleAttributePerLine: true +plugins: [prettier-plugin-tailwindcss] diff --git a/react-frontend/README.md b/react-frontend/README.md new file mode 100644 index 0000000..1ebe379 --- /dev/null +++ b/react-frontend/README.md @@ -0,0 +1,27 @@ +# 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 + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/react-frontend/bun.lockb b/react-frontend/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..20904504e6adc052a286905e0040dfd823beb679 GIT binary patch literal 87006 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 + + + + + + Vite + React + TS + + +
+ + + diff --git a/react-frontend/package.json b/react-frontend/package.json new file mode 100644 index 0000000..c39e109 --- /dev/null +++ b/react-frontend/package.json @@ -0,0 +1,28 @@ +{ + "name": "react-frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react": "^4.0.3", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } +} diff --git a/react-frontend/public/vite.svg b/react-frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/react-frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/react-frontend/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/react-frontend/src/App.tsx b/react-frontend/src/App.tsx new file mode 100644 index 0000000..afe48ac --- /dev/null +++ b/react-frontend/src/App.tsx @@ -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 + React

+
+ +

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

+
+

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

+ + ) +} + +export default App diff --git a/react-frontend/src/assets/react.svg b/react-frontend/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/react-frontend/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/react-frontend/src/index.css b/react-frontend/src/index.css new file mode 100644 index 0000000..2c3fac6 --- /dev/null +++ b/react-frontend/src/index.css @@ -0,0 +1,69 @@ +: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; + -webkit-text-size-adjust: 100%; +} + +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/react-frontend/src/main.tsx b/react-frontend/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/react-frontend/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/react-frontend/src/vite-env.d.ts b/react-frontend/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/react-frontend/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/react-frontend/tsconfig.json b/react-frontend/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/react-frontend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/react-frontend/tsconfig.node.json b/react-frontend/tsconfig.node.json new file mode 100644 index 0000000..42872c5 --- /dev/null +++ b/react-frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/react-frontend/vite.config.ts b/react-frontend/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/react-frontend/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +})