# Contributing to React Split Pane [Bug Reports](#bugs) | [Feature Requests](#features) | [Pull Requests](#pull-requests) | [Development Setup](#development-setup) | [Running Tests](#running-tests) Thank you for considering contributing to React Split Pane! Please take a moment to review this document to make the contribution process easy and effective. ## Using the Issue Tracker The issue tracker is the preferred channel for bug reports and feature requests. Please respect these guidelines: - **Do not** use the issue tracker for personal support requests. - **Do not** derail or troll issues. Keep discussions on topic. ## Bug Reports A bug is a _demonstrable problem_ caused by the code in the repository. Good bug reports are extremely helpful! Guidelines for bug reports: 1. **Search first** — Check if the issue has already been reported. 2. **Test latest** — Try to reproduce it using the latest `master` branch. 3. **Isolate** — Create a minimal reproduction using [CodeSandbox](https://codesandbox.io/) or [StackBlitz](https://stackblitz.com/). A good bug report includes: - React Split Pane version - React version - Browser and OS - Steps to reproduce - Expected vs actual behavior - Link to reproduction ## Feature Requests Feature requests are welcome! Please provide: - Clear use case - Why existing features don't solve your problem - API suggestions (if applicable) - Examples from similar libraries (if applicable) ## Pull Requests Good pull requests are a fantastic help! They should remain focused and avoid unrelated changes. **Please ask first** before starting significant work (new features, major refactoring). Open an issue to discuss your idea. ### Pull Request Process 1. Fork and clone the repository: ```bash git clone https://github.com//react-split-pane cd react-split-pane git remote add upstream https://github.com/tomkp/react-split-pane ``` 2. Create a branch from `master`: ```bash git checkout master git pull upstream master git checkout -b my-feature ``` 3. Install dependencies: ```bash npm install ``` 4. Make your changes, following the [code style](#code-style). 5. Add tests for new functionality. 6. Ensure all tests pass: ```bash npm test ``` 7. Ensure code passes linting: ```bash npm run lint ``` 8. Commit with a clear message: ```bash git commit -m "feat: add new feature" ``` 9. Push and open a pull request against `master`: ```bash git push origin my-feature ``` ### Commit Message Format We follow [Conventional Commits](https://www.conventionalcommits.org/): - `feat:` — New feature - `fix:` — Bug fix - `docs:` — Documentation only - `style:` — Formatting, no code change - `refactor:` — Code change that neither fixes a bug nor adds a feature - `test:` — Adding or fixing tests - `chore:` — Build process or auxiliary tools ## Development Setup ### Prerequisites - Node.js 20+ - npm 9+ ### Setup ```bash # Clone the repository git clone https://github.com/tomkp/react-split-pane cd react-split-pane # Install dependencies npm install # Start the development server (examples) npm run dev ``` The examples will be available at http://localhost:5173 ### Project Structure ``` src/ ├── components/ # React components (SplitPane, Pane, Divider) ├── hooks/ # React hooks (useResizer, useKeyboardResize) ├── types/ # TypeScript type definitions ├── utils/ # Utility functions ├── test/ # Test setup └── index.ts # Main entry point examples/ # Example applications ``` ### Available Scripts | Command | Description | |---------|-------------| | `npm run dev` | Start examples dev server | | `npm test` | Run tests | | `npm run test:watch` | Run tests in watch mode | | `npm run lint` | Run ESLint | | `npm run build` | Build for production | | `npm run typecheck` | Run TypeScript type checking | ## Running Tests All tests must pass before a pull request will be merged. ```bash # Run all tests npm test # Run tests in watch mode npm run test:watch # Run tests with coverage npm run test:coverage ``` ### Writing Tests - Place tests next to the code they test (e.g., `useResizer.test.ts`) - Use descriptive test names - Test both success and error cases - For hooks, use `@testing-library/react` and `renderHook` Example: ```typescript import { describe, it, expect } from 'vitest'; import { renderHook } from '@testing-library/react'; import { useResizer } from './useResizer'; describe('useResizer', () => { it('initializes with provided sizes', () => { const { result } = renderHook(() => useResizer({ direction: 'horizontal', sizes: [300, 700], minSizes: [100, 100], maxSizes: [500, 900], }) ); expect(result.current.currentSizes).toEqual([300, 700]); }); }); ``` ## Code Style - **TypeScript** — All code must be typed - **ESLint** — Run `npm run lint` before committing - **Prettier** — Code is auto-formatted - **No `any`** — Avoid `any` types; use `unknown` if necessary - **Functional** — Prefer functional components and hooks - **Comments** — Add JSDoc comments to exported functions ### Example Component ```typescript import type { CSSProperties } from 'react'; interface MyComponentProps { /** Description of the prop */ value: string; /** Optional prop with default */ size?: number; } /** * Description of the component. * * @example * ```tsx * * ``` */ export function MyComponent({ value, size = 10 }: MyComponentProps) { // Implementation } ``` ## License By contributing, you agree to license your work under the [MIT License](./LICENSE).