# Contributing to AeThex Studio

Thank you for your interest in contributing to AeThex Studio! We welcome contributions from the community.

## Getting Started

1. **Fork the repository** on GitHub
2. **Clone your fork** locally:
   ```bash
   git clone https://github.com/YOUR_USERNAME/aethex-studio.git
   cd aethex-studio
   ```
3. **Install dependencies**:
   ```bash
   npm install
   ```
4. **Create a branch** for your feature:
   ```bash
   git checkout -b feature/my-amazing-feature
   ```

## Development Workflow

### Running the Development Server

```bash
npm run dev
```

Visit `http://localhost:3000` to see your changes in real-time.

### Code Style

- We use **TypeScript** for type safety
- Follow existing code patterns and conventions
- Use **ESLint** to check your code:
  ```bash
  npm run lint
  ```

### Testing

Before submitting a PR, ensure all tests pass:

```bash
# Run all tests
npm test

# Run tests in watch mode during development
npm run test:watch

# Check test coverage
npm run test:coverage
```

#### Writing Tests

- Place tests in `src/components/__tests__/` or `src/hooks/__tests__/`
- Use descriptive test names
- Test both success and error cases
- Example:
  ```typescript
  describe('MyComponent', () => {
    it('should render correctly', () => {
      // Your test here
    });

    it('should handle errors gracefully', () => {
      // Your test here
    });
  });
  ```

## Types of Contributions

### 🐛 Bug Fixes

1. Check if the bug is already reported in [Issues](https://github.com/AeThex-LABS/aethex-studio/issues)
2. If not, create a new issue with:
   - Clear description
   - Steps to reproduce
   - Expected vs actual behavior
   - Screenshots (if applicable)
3. Create a fix and submit a PR

### ✨ New Features

1. **Discuss first** - Open an issue to discuss the feature before implementing
2. Wait for approval from maintainers
3. Implement the feature
4. Add tests
5. Update documentation
6. Submit a PR

### 📝 Documentation

- Fix typos
- Improve clarity
- Add examples
- Update outdated information

### 🎨 UI/UX Improvements

- Follow the existing design system
- Ensure responsive design (mobile + desktop)
- Test accessibility
- Add screenshots to PR

## Pull Request Process

### Before Submitting

- [ ] Code builds without errors (`npm run build`)
- [ ] All tests pass (`npm test`)
- [ ] Linting passes (`npm run lint`)
- [ ] Code is well-commented
- [ ] Documentation is updated
- [ ] Commit messages are clear and descriptive

### Commit Messages

Use clear, descriptive commit messages:

```bash
# Good
git commit -m "Add drag-and-drop support for file tree"
git commit -m "Fix search highlighting bug in SearchPanel"

# Bad
git commit -m "Update stuff"
git commit -m "Fix bug"
```

### Submitting

1. Push your branch to your fork
2. Open a PR against the `main` branch
3. Fill out the PR template
4. Wait for review

### PR Template

```markdown
## Description
Brief description of what this PR does

## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring

## Testing
Describe how you tested this change

## Screenshots (if applicable)
Add screenshots here

## Checklist
- [ ] Tests pass
- [ ] Linting passes
- [ ] Documentation updated
- [ ] Responsive on mobile
```

## Code Organization

### File Structure

```
src/
├── components/          # React components
│   ├── ui/             # Reusable UI components
│   ├── __tests__/      # Component tests
│   └── ComponentName.tsx
├── hooks/              # Custom React hooks
│   ├── __tests__/      # Hook tests
│   └── use-hook-name.ts
├── lib/                # Utilities and helpers
│   └── helpers.ts
└── App.tsx             # Main application
```

### Naming Conventions

- **Components**: PascalCase (`FileTree.tsx`, `AIChat.tsx`)
- **Hooks**: camelCase with `use` prefix (`use-theme.ts`, `use-keyboard-shortcuts.ts`)
- **Utilities**: camelCase (`helpers.ts`, `validators.ts`)
- **Tests**: Match component name with `.test.tsx` or `.test.ts`

## Adding New Features

### Adding a New Template

1. Edit `src/lib/templates.ts`
2. Add your template to the `templates` array:
   ```typescript
   {
     id: 'your-template-id',
     name: 'Template Name',
     description: 'Brief description',
     category: 'beginner' | 'gameplay' | 'ui' | 'tools' | 'advanced',
     code: `-- Your Lua code here`,
   }
   ```

### Adding a New Component

1. Create the component file in `src/components/`
2. Write the component with TypeScript types
3. Add tests in `src/components/__tests__/`
4. Export from the component file
5. Import and use in `App.tsx` or parent component

### Adding a Keyboard Shortcut

1. Edit `src/App.tsx`
2. Add to the `useKeyboardShortcuts` array:
   ```typescript
   {
     key: 'x',
     meta: true,
     ctrl: true,
     handler: () => {
       // Your action here
     },
     description: 'Description of shortcut',
   }
   ```
3. Update README.md keyboard shortcuts table

### Adding a New CLI Command

The interactive terminal supports custom CLI commands for Roblox development.

1. Edit `src/lib/cli-commands.ts`
2. Add your command to the `commands` object:
   ```typescript
   mycommand: {
     name: 'mycommand',
     description: 'Description of what it does',
     usage: 'mycommand [args]',
     aliases: ['mc', 'mycmd'], // Optional
     execute: async (args, context) => {
       // Access current code, files, etc. from context
       // context.currentCode
       // context.currentFile
       // context.files
       // context.setCode()
       // context.addLog()

       // Perform your command logic

       return {
         success: true,
         output: 'Command output',
         type: 'info', // or 'log', 'warn', 'error'
       };
     },
   }
   ```

#### Available Context:
- `context.currentCode` - Current editor code
- `context.currentFile` - Active file name
- `context.files` - File tree array
- `context.setCode(code)` - Update editor code
- `context.addLog(message, type)` - Add terminal log

#### Command Features:
- Command aliases for shortcuts
- Argument parsing (args array)
- Context-aware execution
- Error handling with toast notifications
- Special `__CLEAR__` output to clear terminal

## Performance Guidelines

- Use React.lazy() for code splitting
- Memoize expensive computations with useMemo()
- Use useCallback() for function props
- Optimize re-renders with React.memo()
- Lazy load images and heavy components

## Accessibility Guidelines

- Add proper ARIA labels
- Ensure keyboard navigation works
- Test with screen readers
- Maintain good color contrast
- Add focus indicators

## Questions?

- Open an issue for questions
- Join our community discussions
- Check existing issues and PRs

## Code of Conduct

- Be respectful and inclusive
- Welcome newcomers
- Give constructive feedback
- Focus on the code, not the person

## License

By contributing, you agree that your contributions will be licensed under the MIT License.

---

Thank you for contributing to AeThex Studio! 🎉
