|
1 | | -# React + TypeScript + Vite |
| 1 | +# hello-react |
2 | 2 |
|
3 | | -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. |
| 3 | +An interactive React greeting app that lets you customize your hello message in real-time. |
4 | 4 |
|
5 | | -Currently, two official plugins are available: |
| 5 | +Live demo: [https://reacting.thehww.app/hello-react/](https://reacting.thehww.app/hello-react/) |
6 | 6 |
|
7 | | -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh |
8 | | -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh |
| 7 | +## What it does |
9 | 8 |
|
10 | | -## React Compiler |
| 9 | +This app displays a simple greeting dialog where you can: |
| 10 | +- Type any name into the input field to see "Hello, [name]!" update live |
| 11 | +- Click the shuffle button to randomly select from predefined names |
| 12 | +- Watch as the greeting updates dynamically throughout the interface |
11 | 13 |
|
12 | | -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). |
| 14 | +I built this as my first React project to practice fundamental concepts like state management, event handlers, and component composition. The app uses React 19's latest features with TypeScript for type safety. |
13 | 15 |
|
14 | | -## Expanding the ESLint configuration |
| 16 | +## Tech stack |
15 | 17 |
|
16 | | -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: |
| 18 | +- **React 19** with TypeScript for type-safe components |
| 19 | +- **Vite 8** (beta) for fast builds and HMR |
| 20 | +- **Tailwind CSS 4** for utility-first styling |
| 21 | +- Deployed to GitHub Pages |
17 | 22 |
|
18 | | -```js |
19 | | -export default defineConfig([ |
20 | | - globalIgnores(['dist']), |
21 | | - { |
22 | | - files: ['**/*.{ts,tsx}'], |
23 | | - extends: [ |
24 | | - // Other configs... |
| 23 | +## Project structure |
25 | 24 |
|
26 | | - // Remove tseslint.configs.recommended and replace with this |
27 | | - tseslint.configs.recommendedTypeChecked, |
28 | | - // Alternatively, use this for stricter rules |
29 | | - tseslint.configs.strictTypeChecked, |
30 | | - // Optionally, add this for stylistic rules |
31 | | - tseslint.configs.stylisticTypeChecked, |
| 25 | +``` |
| 26 | +src/ |
| 27 | +├── App.tsx # Main application component |
| 28 | +├── components/ |
| 29 | +│ ├── BackgroundDecoration.tsx # Floating greeting text |
| 30 | +│ ├── GreetingDialog.tsx # Interactive dialog box |
| 31 | +│ └── SvgIcon.tsx # SVG icon wrapper |
| 32 | +└── constants/ |
| 33 | + └── shuffleWords.ts # Array of names for shuffle feature |
| 34 | +``` |
| 35 | + |
| 36 | +## Running locally |
32 | 37 |
|
33 | | - // Other configs... |
34 | | - ], |
35 | | - languageOptions: { |
36 | | - parserOptions: { |
37 | | - project: ['./tsconfig.node.json', './tsconfig.app.json'], |
38 | | - tsconfigRootDir: import.meta.dirname, |
39 | | - }, |
40 | | - // other options... |
41 | | - }, |
42 | | - }, |
43 | | -]) |
| 38 | +Install dependencies: |
| 39 | +```bash |
| 40 | +npm install |
44 | 41 | ``` |
45 | 42 |
|
46 | | -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: |
47 | | - |
48 | | -```js |
49 | | -// eslint.config.js |
50 | | -import reactX from 'eslint-plugin-react-x' |
51 | | -import reactDom from 'eslint-plugin-react-dom' |
52 | | - |
53 | | -export default defineConfig([ |
54 | | - globalIgnores(['dist']), |
55 | | - { |
56 | | - files: ['**/*.{ts,tsx}'], |
57 | | - extends: [ |
58 | | - // Other configs... |
59 | | - // Enable lint rules for React |
60 | | - reactX.configs['recommended-typescript'], |
61 | | - // Enable lint rules for React DOM |
62 | | - reactDom.configs.recommended, |
63 | | - ], |
64 | | - languageOptions: { |
65 | | - parserOptions: { |
66 | | - project: ['./tsconfig.node.json', './tsconfig.app.json'], |
67 | | - tsconfigRootDir: import.meta.dirname, |
68 | | - }, |
69 | | - // other options... |
70 | | - }, |
71 | | - }, |
72 | | -]) |
| 43 | +Start the development server: |
| 44 | +```bash |
| 45 | +npm run dev |
73 | 46 | ``` |
| 47 | + |
| 48 | +Build for production: |
| 49 | +```bash |
| 50 | +npm run build |
| 51 | +``` |
| 52 | + |
| 53 | +Preview production build: |
| 54 | +```bash |
| 55 | +npm run preview |
| 56 | +``` |
| 57 | + |
| 58 | +## What I learned |
| 59 | + |
| 60 | +- Managing component state with `useState` |
| 61 | +- Passing props and event handlers between components |
| 62 | +- Building reusable components with TypeScript interfaces |
| 63 | +- Configuring Vite for GitHub Pages deployment |
| 64 | +- Using Tailwind CSS with modern CSS features |
| 65 | + |
| 66 | +## License |
| 67 | + |
| 68 | +MIT License - Copyright (c) 2025 [The Hello World Writer](https://www.thehelloworldwriter.com/) |
0 commit comments