From 53f910db4aa85aaf0d637747ecb25b705ea00671 Mon Sep 17 00:00:00 2001 From: Svetoslav Dimitrov Date: Tue, 22 Oct 2024 14:45:45 +0300 Subject: [PATCH 01/41] feat(ecommerce): initial commit for the vite ecommerce app --- examples/ecommerce-jewellery-store/.gitignore | 24 +++++++ examples/ecommerce-jewellery-store/README.md | 50 ++++++++++++++ .../eslint.config.js | 28 ++++++++ examples/ecommerce-jewellery-store/index.html | 13 ++++ .../ecommerce-jewellery-store/package.json | 29 ++++++++ .../ecommerce-jewellery-store/public/vite.svg | 1 + .../ecommerce-jewellery-store/src/App.css | 42 ++++++++++++ .../ecommerce-jewellery-store/src/App.tsx | 35 ++++++++++ .../src/assets/react.svg | 1 + .../ecommerce-jewellery-store/src/index.css | 68 +++++++++++++++++++ .../ecommerce-jewellery-store/src/main.tsx | 10 +++ .../src/vite-env.d.ts | 1 + .../tsconfig.app.json | 24 +++++++ .../ecommerce-jewellery-store/tsconfig.json | 7 ++ .../tsconfig.node.json | 22 ++++++ .../ecommerce-jewellery-store/vite.config.ts | 7 ++ 16 files changed, 362 insertions(+) create mode 100644 examples/ecommerce-jewellery-store/.gitignore create mode 100644 examples/ecommerce-jewellery-store/README.md create mode 100644 examples/ecommerce-jewellery-store/eslint.config.js create mode 100644 examples/ecommerce-jewellery-store/index.html create mode 100644 examples/ecommerce-jewellery-store/package.json create mode 100644 examples/ecommerce-jewellery-store/public/vite.svg create mode 100644 examples/ecommerce-jewellery-store/src/App.css create mode 100644 examples/ecommerce-jewellery-store/src/App.tsx create mode 100644 examples/ecommerce-jewellery-store/src/assets/react.svg create mode 100644 examples/ecommerce-jewellery-store/src/index.css create mode 100644 examples/ecommerce-jewellery-store/src/main.tsx create mode 100644 examples/ecommerce-jewellery-store/src/vite-env.d.ts create mode 100644 examples/ecommerce-jewellery-store/tsconfig.app.json create mode 100644 examples/ecommerce-jewellery-store/tsconfig.json create mode 100644 examples/ecommerce-jewellery-store/tsconfig.node.json create mode 100644 examples/ecommerce-jewellery-store/vite.config.ts diff --git a/examples/ecommerce-jewellery-store/.gitignore b/examples/ecommerce-jewellery-store/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/examples/ecommerce-jewellery-store/.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/examples/ecommerce-jewellery-store/README.md b/examples/ecommerce-jewellery-store/README.md new file mode 100644 index 00000000..74872fd4 --- /dev/null +++ b/examples/ecommerce-jewellery-store/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/examples/ecommerce-jewellery-store/eslint.config.js b/examples/ecommerce-jewellery-store/eslint.config.js new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/examples/ecommerce-jewellery-store/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/examples/ecommerce-jewellery-store/index.html b/examples/ecommerce-jewellery-store/index.html new file mode 100644 index 00000000..e4b78eae --- /dev/null +++ b/examples/ecommerce-jewellery-store/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/examples/ecommerce-jewellery-store/package.json b/examples/ecommerce-jewellery-store/package.json new file mode 100644 index 00000000..ff50aebf --- /dev/null +++ b/examples/ecommerce-jewellery-store/package.json @@ -0,0 +1,29 @@ +{ + "name": "ecommerce-jewellery-store", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@eslint/js": "^9.11.1", + "@types/react": "^18.3.10", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.2", + "eslint": "^9.11.1", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.12", + "globals": "^15.9.0", + "typescript": "^5.5.3", + "typescript-eslint": "^8.7.0", + "vite": "^5.4.8" + } +} diff --git a/examples/ecommerce-jewellery-store/public/vite.svg b/examples/ecommerce-jewellery-store/public/vite.svg new file mode 100644 index 00000000..e7b8dfb1 --- /dev/null +++ b/examples/ecommerce-jewellery-store/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/ecommerce-jewellery-store/src/App.css b/examples/ecommerce-jewellery-store/src/App.css new file mode 100644 index 00000000..b9d355df --- /dev/null +++ b/examples/ecommerce-jewellery-store/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/examples/ecommerce-jewellery-store/src/App.tsx b/examples/ecommerce-jewellery-store/src/App.tsx new file mode 100644 index 00000000..afe48ac7 --- /dev/null +++ b/examples/ecommerce-jewellery-store/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 logo + + + React logo + +
+

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/examples/ecommerce-jewellery-store/src/assets/react.svg b/examples/ecommerce-jewellery-store/src/assets/react.svg new file mode 100644 index 00000000..6c87de9b --- /dev/null +++ b/examples/ecommerce-jewellery-store/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/ecommerce-jewellery-store/src/index.css b/examples/ecommerce-jewellery-store/src/index.css new file mode 100644 index 00000000..6119ad9a --- /dev/null +++ b/examples/ecommerce-jewellery-store/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/examples/ecommerce-jewellery-store/src/main.tsx b/examples/ecommerce-jewellery-store/src/main.tsx new file mode 100644 index 00000000..6f4ac9bc --- /dev/null +++ b/examples/ecommerce-jewellery-store/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/examples/ecommerce-jewellery-store/src/vite-env.d.ts b/examples/ecommerce-jewellery-store/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/examples/ecommerce-jewellery-store/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/ecommerce-jewellery-store/tsconfig.app.json b/examples/ecommerce-jewellery-store/tsconfig.app.json new file mode 100644 index 00000000..f0a23505 --- /dev/null +++ b/examples/ecommerce-jewellery-store/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/examples/ecommerce-jewellery-store/tsconfig.json b/examples/ecommerce-jewellery-store/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/examples/ecommerce-jewellery-store/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/examples/ecommerce-jewellery-store/tsconfig.node.json b/examples/ecommerce-jewellery-store/tsconfig.node.json new file mode 100644 index 00000000..0d3d7144 --- /dev/null +++ b/examples/ecommerce-jewellery-store/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/examples/ecommerce-jewellery-store/vite.config.ts b/examples/ecommerce-jewellery-store/vite.config.ts new file mode 100644 index 00000000..5a33944a --- /dev/null +++ b/examples/ecommerce-jewellery-store/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()], +}) From b0a0eb22e412a88d0e533a0758062403380170c2 Mon Sep 17 00:00:00 2001 From: filipKovachev Date: Mon, 28 Oct 2024 15:34:35 +0200 Subject: [PATCH 02/41] add Header and Footer, add alias for imports --- .../ecommerce-jewellery-store/package.json | 12 +++ .../ecommerce-jewellery-store/src/App.css | 42 --------- .../ecommerce-jewellery-store/src/App.tsx | 30 +----- .../src/assets/vilora-logo.png | Bin 0 -> 1024 bytes .../src/components/Footer.tsx | 88 ++++++++++++++++++ .../src/components/Header.tsx | 69 ++++++++++++++ .../src/data/items.ts | 18 ++++ .../src/data/language-items.ts | 11 +++ .../ecommerce-jewellery-store/src/index.css | 68 -------------- .../ecommerce-jewellery-store/src/main.tsx | 2 +- .../ecommerce-jewellery-store/src/styles.css | 11 +++ .../ecommerce-jewellery-store/vite.config.ts | 12 ++- 12 files changed, 224 insertions(+), 139 deletions(-) delete mode 100644 examples/ecommerce-jewellery-store/src/App.css create mode 100644 examples/ecommerce-jewellery-store/src/assets/vilora-logo.png create mode 100644 examples/ecommerce-jewellery-store/src/components/Footer.tsx create mode 100644 examples/ecommerce-jewellery-store/src/components/Header.tsx create mode 100644 examples/ecommerce-jewellery-store/src/data/items.ts create mode 100644 examples/ecommerce-jewellery-store/src/data/language-items.ts delete mode 100644 examples/ecommerce-jewellery-store/src/index.css create mode 100644 examples/ecommerce-jewellery-store/src/styles.css diff --git a/examples/ecommerce-jewellery-store/package.json b/examples/ecommerce-jewellery-store/package.json index ff50aebf..815b394a 100644 --- a/examples/ecommerce-jewellery-store/package.json +++ b/examples/ecommerce-jewellery-store/package.json @@ -10,6 +10,18 @@ "preview": "vite preview" }, "dependencies": { + "@progress/kendo-drawing": "^1.21.0", + "@progress/kendo-licensing": "^1.3.5", + "@progress/kendo-react-buttons": "^8.5.0", + "@progress/kendo-react-dropdowns": "^8.5.0", + "@progress/kendo-react-inputs": "^8.5.0", + "@progress/kendo-react-intl": "^8.5.0", + "@progress/kendo-react-layout": "^8.5.0", + "@progress/kendo-react-notification": "^8.5.0", + "@progress/kendo-react-progressbars": "^8.5.0", + "@progress/kendo-react-treeview": "^8.5.0", + "@progress/kendo-svg-icons": "^3.1.0", + "@progress/kendo-theme-default": "^9.1.0", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/ecommerce-jewellery-store/src/App.css b/examples/ecommerce-jewellery-store/src/App.css deleted file mode 100644 index b9d355df..00000000 --- a/examples/ecommerce-jewellery-store/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#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/examples/ecommerce-jewellery-store/src/App.tsx b/examples/ecommerce-jewellery-store/src/App.tsx index afe48ac7..4683f3aa 100644 --- a/examples/ecommerce-jewellery-store/src/App.tsx +++ b/examples/ecommerce-jewellery-store/src/App.tsx @@ -1,33 +1,13 @@ -import { useState } from 'react' -import reactLogo from './assets/react.svg' -import viteLogo from '/vite.svg' -import './App.css' +import Header from '@/components/Header'; +import Footer from '@/components/Footer'; +import '@progress/kendo-theme-default/dist/all.css'; function App() { - const [count, setCount] = useState(0) return ( <> -
- - Vite logo - - - React logo - -
-

Vite + React

-
- -

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

-
-

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

+
+