hyp / docs /folder-pattern.md
Leon4gr45's picture
Upload folder using huggingface_hub
1dbc34b verified
# Folder & Naming Pattern Guide
This document defines the folder structure and naming conventions used in this codebase.
## File Naming Convention
**All files use kebab-case** (lowercase with hyphens):
```
βœ… add-feature-dialog.tsx
βœ… use-board-actions.ts
βœ… board-view.tsx
❌ AddFeatureDialog.tsx
❌ useBoardActions.ts
❌ BoardView.tsx
```
## Export Naming Convention
While files use kebab-case, **exports use PascalCase for components and camelCase for hooks/functions**:
```tsx
// File: add-feature-dialog.tsx
export function AddFeatureDialog() { ... }
// File: use-board-actions.ts
export function useBoardActions() { ... }
```
## View Folder Structure
Each complex view should have its own folder with the following structure:
```
components/views/
β”œβ”€β”€ [view-name].tsx # Entry point (exports the main view)
└── [view-name]/ # Subfolder for complex views
β”œβ”€β”€ components/ # View-specific reusable components
β”‚ β”œβ”€β”€ index.ts # Barrel export
β”‚ └── [component].tsx # Individual components
β”œβ”€β”€ dialogs/ # View-specific dialogs and modals
β”‚ β”œβ”€β”€ index.ts # Barrel export
β”‚ └── [dialog-name].tsx # Individual dialogs/modals
β”œβ”€β”€ hooks/ # View-specific hooks
β”‚ β”œβ”€β”€ index.ts # Barrel export
β”‚ └── use-[name].ts # Individual hooks
β”œβ”€β”€ shared/ # Shared utilities between components
β”‚ β”œβ”€β”€ index.ts # Barrel export
β”‚ └── [name].ts # Shared code
β”œβ”€β”€ constants.ts # View constants
β”œβ”€β”€ types.ts # View-specific types (optional)
β”œβ”€β”€ utils.ts # View utilities (optional)
└── [main-component].tsx # Main view components (e.g., kanban-board.tsx)
```
## Example: board-view
```
components/views/
β”œβ”€β”€ board-view.tsx # Entry point
└── board-view/
β”œβ”€β”€ components/
β”‚ β”œβ”€β”€ index.ts
β”‚ β”œβ”€β”€ kanban-card.tsx
β”‚ └── kanban-column.tsx
β”œβ”€β”€ dialogs/
β”‚ β”œβ”€β”€ index.ts
β”‚ β”œβ”€β”€ add-feature-dialog.tsx
β”‚ β”œβ”€β”€ edit-feature-dialog.tsx
β”‚ β”œβ”€β”€ follow-up-dialog.tsx
β”‚ β”œβ”€β”€ delete-all-verified-dialog.tsx
β”‚ β”œβ”€β”€ delete-completed-feature-dialog.tsx
β”‚ β”œβ”€β”€ completed-features-modal.tsx
β”‚ β”œβ”€β”€ agent-output-modal.tsx
β”‚ └── feature-suggestions-dialog.tsx
β”œβ”€β”€ hooks/
β”‚ β”œβ”€β”€ index.ts
β”‚ β”œβ”€β”€ use-board-actions.ts
β”‚ β”œβ”€β”€ use-board-features.ts
β”‚ └── use-board-drag-drop.ts
β”œβ”€β”€ shared/
β”‚ β”œβ”€β”€ index.ts
β”‚ β”œβ”€β”€ model-constants.ts
β”‚ └── model-selector.tsx
β”œβ”€β”€ constants.ts
└── kanban-board.tsx
```
## Global vs View-Specific Code
### Global (`src/hooks/`, `src/lib/`, etc.)
Code that is used across **multiple views**:
- `src/hooks/use-auto-mode.ts` - Used by board-view, agent-view, etc.
- `src/hooks/use-keyboard-shortcuts.ts` - Used across the app
- `src/lib/utils.ts` - Global utilities
### View-Specific (`[view-name]/hooks/`, `[view-name]/components/`)
Code that is **only used within a single view**:
- `board-view/hooks/use-board-actions.ts` - Only used by board-view
- `board-view/components/kanban-card.tsx` - Only used by board-view
## Barrel Exports
Use `index.ts` files to create clean import paths:
```tsx
// board-view/hooks/index.ts
export { useBoardActions } from './use-board-actions';
export { useBoardFeatures } from './use-board-features';
// Usage in board-view.tsx
import { useBoardActions, useBoardFeatures } from './board-view/hooks';
```
## When to Create a Subfolder
Create a subfolder for a view when:
1. The view file exceeds ~500 lines
2. The view has 3+ related components
3. The view has 2+ custom hooks
4. Multiple dialogs/modals are specific to the view
## Dialogs Folder
The `dialogs/` folder contains all dialog and modal components specific to a view:
### What goes in `dialogs/`:
- Confirmation dialogs (e.g., `delete-all-verified-dialog.tsx`)
- Form dialogs (e.g., `add-feature-dialog.tsx`, `edit-feature-dialog.tsx`)
- Modal overlays (e.g., `agent-output-modal.tsx`, `completed-features-modal.tsx`)
- Any component that renders as an overlay/popup
### Naming convention:
- Use `-dialog.tsx` suffix for confirmation/form dialogs
- Use `-modal.tsx` suffix for content-heavy modals
### Barrel export pattern:
```tsx
// dialogs/index.ts
export { AddFeatureDialog } from './add-feature-dialog';
export { EditFeatureDialog } from './edit-feature-dialog';
export { AgentOutputModal } from './agent-output-modal';
// ... etc
// Usage in view entry point
import { AddFeatureDialog, EditFeatureDialog, AgentOutputModal } from './board-view/dialogs';
```
## Quick Reference
| Location | File Naming | Export Naming |
| ---------- | ------------------------------- | ---------------------- |
| Components | `kebab-case.tsx` | `PascalCase` |
| Dialogs | `*-dialog.tsx` or `*-modal.tsx` | `PascalCase` |
| Hooks | `use-kebab-case.ts` | `camelCase` |
| Utils/Lib | `kebab-case.ts` | `camelCase` |
| Types | `kebab-case.ts` | `PascalCase` |
| Constants | `constants.ts` | `SCREAMING_SNAKE_CASE` |