A modern, feature-rich class notes application built with React 19, Vite, TailwindCSS v4, and DaisyUI. This project serves as a comprehensive learning platform for mastering React development through Test-Driven Development (TDD).
- Overview
- Learning Objectives
- Features
- Tech Stack
- Getting Started
- Development Workflow
- Contributing
- License
- Team
- Acknowledgements
- Learning Resources
- Educational Philosophy
- Final Thoughts
Class Notes App is a comprehensive note-taking application designed for students to create, organize, and manage their class notes efficiently. The application emphasizes learning React 19 fundamentals through hands-on development using Test-Driven Development (TDD) methodology.
- π± Responsive design with TailwindCSS v4 and DaisyUI
- π¨ Theme switching capability (light/dark modes)
- π Rich text editing with Quill WYSIWYG editor
- π·οΈ Tag-based organization system
- π Powerful search functionality
- πΎ Local storage persistence (backend API integration planned)
- π Simple authentication system
- β Built using TDD with Jest/Vitest and React Testing Library
- Understanding React's component-based architecture (CBA)
- State management with hooks (useState, useEffect, useReducer)
- Props and component composition
- Event handling and forms
- TailwindCSS v4 utility-first styling
- DaisyUI component integration
- Custom hooks creation
- Context API for global state
- Local storage integration
- Form validation and error handling
- Conditional rendering patterns
- Component lifecycle understanding
- Test-Driven Development (TDD) workflow
- Component testing with Jest/Vitest
- React Testing Library best practices
- Performance optimization techniques
- Code organization and architecture
- Git collaboration workflows
- β User Authentication: Simple email/password login with local storage
- β CRUD Operations: Create, Read, Update, Delete notes
- β Rich Text Editor: Quill-based WYSIWYG editor for note content
- β Tag Management: Create and assign tags to organize notes
- β Search Functionality: Search notes by title, content, or tags
- β Theme Switching: Toggle between light and dark themes
- β Responsive Design: Mobile-first, works on all devices
- β Local Persistence: All data stored in browser's local storage
- π Backend API integration
- π€ Export notes (PDF, Markdown)
- π File attachments
- π Note sharing between users
- π Analytics and statistics
- ποΈ Folders/Categories
- β Favorite/Pin notes
- React 19: UI library with the latest improvements
- Vite: Next-generation frontend build tool
- TypeScript: Type-safe JavaScript
- TailwindCSS v4: Utility-first CSS framework
- DaisyUI: TailwindCSS component library
- Quill: Rich text WYSIWYG editor
- React Router v7: Client-side routing
- date-fns: Modern date utility library
- Jest: Testing framework (initial phase)
- Vitest: Vite-native testing framework (migration phase)
- React Testing Library: React component testing
- ESLint: Code linting
- Prettier: Code formatting
- Git: Version control
- Node.js (v22 or higher)
- npm or yarn or pnpm
- Git
- Code editor (WebStorm recommended)
-
Clone the repository
git clone https://github.com/dbc2201/class-notes.git cd class-notes -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser
http://localhost:5173
npm run dev # Start dev server
npm run build # Build for production
npm run preview # Preview production build
npm run lint # Run ESLintThis project follows the Red-Green-Refactor cycle:
1. π΄ RED: Write a failing test
β
2. π’ GREEN: Write minimal code to pass the test
β
3. π΅ REFACTOR: Improve code quality
β
4. β»οΈ REPEAT
- Read the component specification
- Review component hierarchy and props
- Understand expected behavior and edge cases
# Create test file
touch src/__tests__/components/ui/Button.test.tsxExample test structure:
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from '@/components/ui/Button';
describe('Button Component', () => {
it('should render with text', () => {
render(<Button>Click me</Button>);
expect(screen.getByText('Click me')).toBeInTheDocument();
});
it('should handle click events', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Click me</Button>);
fireEvent.click(screen.getByText('Click me'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
it('should be disabled when disabled prop is true', () => {
render(<Button disabled>Click me</Button>);
expect(screen.getByRole('button')).toBeDisabled();
});
});npm run test
# Tests should FAIL - this is expected!// src/components/ui/Button/Button.tsx
import { ButtonHTMLAttributes, FC } from 'react';
interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'ghost';
size?: 'sm' | 'md' | 'lg';
}
export const Button: FC<ButtonProps> = ({
label,
variant = 'primary',
size = 'md',
className = '',
...props
}) => {
return (
<button
className={`btn btn-${variant} btn-${size} ${className}`}
{...props}
>
{label}
</button>
);
};npm run test
# Tests should PASS now!- Improve code quality
- Extract reusable logic
- Add comments if needed
- Ensure tests still pass
git add .
git commit -m "feat(ui): implement Button component with tests"
git push origin feature/button-component- Follow the PR template
- Request code review
- Address feedback
- Merge when approved
We welcome contributions from students and developers! Here's how you can contribute:
- Pick a component from the milestones/issues list
- Create a feature branch following naming conventions
- Write tests first (TDD approach)
- Implement the component
- Ensure tests pass
- Commit with conventional commits
- Create a pull request
- Request code review
- Address feedback
- Celebrate when merged! π
Thank you for your interest in contributing! Please follow these guidelines:
- Fork the repository
- Clone your fork
git clone https://github.com/YOUR_USERNAME/class-notes-app.git
- Add upstream remote
git remote add upstream https://github.com/dbc2201/class-notes.git
- Create a feature branch
git checkout -b feature/your-feature-name
- Follow the existing code style
- Write tests for new features
- Ensure all tests pass
npm run test npm run lint - Update documentation if needed
- Commit with conventional commits
- Push to your fork
git push origin feature/your-feature-name
- Create a pull request from your fork to the main repository
- Fill out the PR template
- Wait for code review
- Address review comments
- Celebrate when merged! π
- π Bug fixes
- π Documentation improvements
- β¨ New features (please discuss in issues first)
- βΏ Accessibility improvements
- π¨ UI/UX enhancements
- β‘ Performance optimizations
- β Additional tests
- Be respectful and constructive
- Help others learn
- Focus on the code, not the person
- Assume good intentions
- Be patient with beginners
This project is created for educational purposes. Feel free to use it for learning and teaching.
- Create an issue in the repository
- Ask questions in pull request comments
- Schedule a review session with the instructor
- Check existing issues before creating new ones
- Read the contributing guide thoroughly
- Join discussions on issues and PRs
- Be patient and respectful
- Rohit Sharma (@rohit3171999)
- Arnab Mandal (@Arnab-Mandal1)
- Divyansh Bhardwaj (dbc2201) - Project Guide & Mentor
- React Team for React 19
- Vite Team for the amazing build tool
- TailwindCSS Team for the utility-first framework
- DaisyUI Team for beautiful components
- Quill Team for the rich text editor
- All contributors and supporters
This project is designed with the following educational principles:
- Hands-on coding from day one
- Build real, functional features
- Immediate feedback through testing
- Write tests first, code second
- Build confidence through comprehensive testing
- Learn to think about edge cases early
- Start simple, increase complexity gradually
- Build on previous knowledge
- Clear milestones and goals
- Pair programming on complex features
- Code reviews for knowledge sharing
- Learn from each other's approaches
- Real-world Git workflows
- Industry-standard tools and patterns
- Documentation and communication skills
- Architecture designed for future enhancements
- Easy transition to backend integration
- Scalable patterns and practices
This project is more than just building a notes app. It's about:
- π§ Learning how to think like a developer
- π οΈ Building real-world, professional-quality software
- π€ Collaborating effectively in a team
- π Understanding best practices and patterns
- π― Achieving tangible, portfolio-worthy results
- πͺ Growing your confidence as a React developer
Remember: Everyone was a beginner once. Embrace the challenge, learn from mistakes, help each other, and most importantly - enjoy the journey!
Happy Coding! π