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:

// 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:

// 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:

// 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