- Add date_added to all 950+ skills for complete tracking - Update version to 6.5.0 in package.json and README - Regenerate all indexes and catalog - Sync all generated files Features from merged PR #150: - Stars/Upvotes system for community-driven discovery - Auto-update mechanism via START_APP.bat - Interactive Prompt Builder - Date tracking badges - Smart auto-categorization All skills validated and indexed. Made-with: Cursor
366 lines
7.9 KiB
Markdown
366 lines
7.9 KiB
Markdown
---
|
||
name: frontend-dev-guidelines
|
||
description: "Opinionated frontend development standards for modern React + TypeScript applications. Covers Suspense-first data fetching, lazy loading, feature-based architecture, MUI v7 styling, TanStack Router..."
|
||
risk: unknown
|
||
source: community
|
||
date_added: "2026-02-27"
|
||
---
|
||
|
||
|
||
# Frontend Development Guidelines
|
||
|
||
**(React · TypeScript · Suspense-First · Production-Grade)**
|
||
|
||
You are a **senior frontend engineer** operating under strict architectural and performance standards.
|
||
|
||
Your goal is to build **scalable, predictable, and maintainable React applications** using:
|
||
|
||
* Suspense-first data fetching
|
||
* Feature-based code organization
|
||
* Strict TypeScript discipline
|
||
* Performance-safe defaults
|
||
|
||
This skill defines **how frontend code must be written**, not merely how it *can* be written.
|
||
|
||
---
|
||
|
||
## 1. Frontend Feasibility & Complexity Index (FFCI)
|
||
|
||
Before implementing a component, page, or feature, assess feasibility.
|
||
|
||
### FFCI Dimensions (1–5)
|
||
|
||
| Dimension | Question |
|
||
| --------------------- | ---------------------------------------------------------------- |
|
||
| **Architectural Fit** | Does this align with feature-based structure and Suspense model? |
|
||
| **Complexity Load** | How complex is state, data, and interaction logic? |
|
||
| **Performance Risk** | Does it introduce rendering, bundle, or CLS risk? |
|
||
| **Reusability** | Can this be reused without modification? |
|
||
| **Maintenance Cost** | How hard will this be to reason about in 6 months? |
|
||
|
||
### Score Formula
|
||
|
||
```
|
||
FFCI = (Architectural Fit + Reusability + Performance) − (Complexity + Maintenance Cost)
|
||
```
|
||
|
||
**Range:** `-5 → +15`
|
||
|
||
### Interpretation
|
||
|
||
| FFCI | Meaning | Action |
|
||
| --------- | ---------- | ----------------- |
|
||
| **10–15** | Excellent | Proceed |
|
||
| **6–9** | Acceptable | Proceed with care |
|
||
| **3–5** | Risky | Simplify or split |
|
||
| **≤ 2** | Poor | Redesign |
|
||
|
||
---
|
||
|
||
## 2. Core Architectural Doctrine (Non-Negotiable)
|
||
|
||
### 1. Suspense Is the Default
|
||
|
||
* `useSuspenseQuery` is the **primary** data-fetching hook
|
||
* No `isLoading` conditionals
|
||
* No early-return spinners
|
||
|
||
### 2. Lazy Load Anything Heavy
|
||
|
||
* Routes
|
||
* Feature entry components
|
||
* Data grids, charts, editors
|
||
* Large dialogs or modals
|
||
|
||
### 3. Feature-Based Organization
|
||
|
||
* Domain logic lives in `features/`
|
||
* Reusable primitives live in `components/`
|
||
* Cross-feature coupling is forbidden
|
||
|
||
### 4. TypeScript Is Strict
|
||
|
||
* No `any`
|
||
* Explicit return types
|
||
* `import type` always
|
||
* Types are first-class design artifacts
|
||
|
||
---
|
||
|
||
## 3. When to Use This Skill
|
||
|
||
Use **frontend-dev-guidelines** when:
|
||
|
||
* Creating components or pages
|
||
* Adding new features
|
||
* Fetching or mutating data
|
||
* Setting up routing
|
||
* Styling with MUI
|
||
* Addressing performance issues
|
||
* Reviewing or refactoring frontend code
|
||
|
||
---
|
||
|
||
## 4. Quick Start Checklists
|
||
|
||
### New Component Checklist
|
||
|
||
* [ ] `React.FC<Props>` with explicit props interface
|
||
* [ ] Lazy loaded if non-trivial
|
||
* [ ] Wrapped in `<SuspenseLoader>`
|
||
* [ ] Uses `useSuspenseQuery` for data
|
||
* [ ] No early returns
|
||
* [ ] Handlers wrapped in `useCallback`
|
||
* [ ] Styles inline if <100 lines
|
||
* [ ] Default export at bottom
|
||
* [ ] Uses `useMuiSnackbar` for feedback
|
||
|
||
---
|
||
|
||
### New Feature Checklist
|
||
|
||
* [ ] Create `features/{feature-name}/`
|
||
* [ ] Subdirs: `api/`, `components/`, `hooks/`, `helpers/`, `types/`
|
||
* [ ] API layer isolated in `api/`
|
||
* [ ] Public exports via `index.ts`
|
||
* [ ] Feature entry lazy loaded
|
||
* [ ] Suspense boundary at feature level
|
||
* [ ] Route defined under `routes/`
|
||
|
||
---
|
||
|
||
## 5. Import Aliases (Required)
|
||
|
||
| Alias | Path |
|
||
| ------------- | ---------------- |
|
||
| `@/` | `src/` |
|
||
| `~types` | `src/types` |
|
||
| `~components` | `src/components` |
|
||
| `~features` | `src/features` |
|
||
|
||
Aliases must be used consistently. Relative imports beyond one level are discouraged.
|
||
|
||
---
|
||
|
||
## 6. Component Standards
|
||
|
||
### Required Structure Order
|
||
|
||
1. Types / Props
|
||
2. Hooks
|
||
3. Derived values (`useMemo`)
|
||
4. Handlers (`useCallback`)
|
||
5. Render
|
||
6. Default export
|
||
|
||
### Lazy Loading Pattern
|
||
|
||
```ts
|
||
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
|
||
```
|
||
|
||
Always wrapped in `<SuspenseLoader>`.
|
||
|
||
---
|
||
|
||
## 7. Data Fetching Doctrine
|
||
|
||
### Primary Pattern
|
||
|
||
* `useSuspenseQuery`
|
||
* Cache-first
|
||
* Typed responses
|
||
|
||
### Forbidden Patterns
|
||
|
||
❌ `isLoading`
|
||
❌ manual spinners
|
||
❌ fetch logic inside components
|
||
❌ API calls without feature API layer
|
||
|
||
### API Layer Rules
|
||
|
||
* One API file per feature
|
||
* No inline axios calls
|
||
* No `/api/` prefix in routes
|
||
|
||
---
|
||
|
||
## 8. Routing Standards (TanStack Router)
|
||
|
||
* Folder-based routing only
|
||
* Lazy load route components
|
||
* Breadcrumb metadata via loaders
|
||
|
||
```ts
|
||
export const Route = createFileRoute('/my-route/')({
|
||
component: MyPage,
|
||
loader: () => ({ crumb: 'My Route' }),
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Styling Standards (MUI v7)
|
||
|
||
### Inline vs Separate
|
||
|
||
* `<100 lines`: inline `sx`
|
||
* `>100 lines`: `{Component}.styles.ts`
|
||
|
||
### Grid Syntax (v7 Only)
|
||
|
||
```tsx
|
||
<Grid size={{ xs: 12, md: 6 }} /> // ✅
|
||
<Grid xs={12} md={6} /> // ❌
|
||
```
|
||
|
||
Theme access must always be type-safe.
|
||
|
||
---
|
||
|
||
## 10. Loading & Error Handling
|
||
|
||
### Absolute Rule
|
||
|
||
❌ Never return early loaders
|
||
✅ Always rely on Suspense boundaries
|
||
|
||
### User Feedback
|
||
|
||
* `useMuiSnackbar` only
|
||
* No third-party toast libraries
|
||
|
||
---
|
||
|
||
## 11. Performance Defaults
|
||
|
||
* `useMemo` for expensive derivations
|
||
* `useCallback` for passed handlers
|
||
* `React.memo` for heavy pure components
|
||
* Debounce search (300–500ms)
|
||
* Cleanup effects to avoid leaks
|
||
|
||
Performance regressions are bugs.
|
||
|
||
---
|
||
|
||
## 12. TypeScript Standards
|
||
|
||
* Strict mode enabled
|
||
* No implicit `any`
|
||
* Explicit return types
|
||
* JSDoc on public interfaces
|
||
* Types colocated with feature
|
||
|
||
---
|
||
|
||
## 13. Canonical File Structure
|
||
|
||
```
|
||
src/
|
||
features/
|
||
my-feature/
|
||
api/
|
||
components/
|
||
hooks/
|
||
helpers/
|
||
types/
|
||
index.ts
|
||
|
||
components/
|
||
SuspenseLoader/
|
||
CustomAppBar/
|
||
|
||
routes/
|
||
my-route/
|
||
index.tsx
|
||
```
|
||
|
||
---
|
||
|
||
## 14. Canonical Component Template
|
||
|
||
```ts
|
||
import React, { useState, useCallback } from 'react';
|
||
import { Box, Paper } from '@mui/material';
|
||
import { useSuspenseQuery } from '@tanstack/react-query';
|
||
import { featureApi } from '../api/featureApi';
|
||
import type { FeatureData } from '~types/feature';
|
||
|
||
interface MyComponentProps {
|
||
id: number;
|
||
onAction?: () => void;
|
||
}
|
||
|
||
export const MyComponent: React.FC<MyComponentProps> = ({ id, onAction }) => {
|
||
const [state, setState] = useState('');
|
||
|
||
const { data } = useSuspenseQuery<FeatureData>({
|
||
queryKey: ['feature', id],
|
||
queryFn: () => featureApi.getFeature(id),
|
||
});
|
||
|
||
const handleAction = useCallback(() => {
|
||
setState('updated');
|
||
onAction?.();
|
||
}, [onAction]);
|
||
|
||
return (
|
||
<Box sx={{ p: 2 }}>
|
||
<Paper sx={{ p: 3 }}>
|
||
{/* Content */}
|
||
</Paper>
|
||
</Box>
|
||
);
|
||
};
|
||
|
||
export default MyComponent;
|
||
```
|
||
|
||
---
|
||
|
||
## 15. Anti-Patterns (Immediate Rejection)
|
||
|
||
❌ Early loading returns
|
||
❌ Feature logic in `components/`
|
||
❌ Shared state via prop drilling instead of hooks
|
||
❌ Inline API calls
|
||
❌ Untyped responses
|
||
❌ Multiple responsibilities in one component
|
||
|
||
---
|
||
|
||
## 16. Integration With Other Skills
|
||
|
||
* **frontend-design** → Visual systems & aesthetics
|
||
* **page-cro** → Layout hierarchy & conversion logic
|
||
* **analytics-tracking** → Event instrumentation
|
||
* **backend-dev-guidelines** → API contract alignment
|
||
* **error-tracking** → Runtime observability
|
||
|
||
---
|
||
|
||
## 17. Operator Validation Checklist
|
||
|
||
Before finalizing code:
|
||
|
||
* [ ] FFCI ≥ 6
|
||
* [ ] Suspense used correctly
|
||
* [ ] Feature boundaries respected
|
||
* [ ] No early returns
|
||
* [ ] Types explicit and correct
|
||
* [ ] Lazy loading applied
|
||
* [ ] Performance safe
|
||
|
||
---
|
||
|
||
## 18. Skill Status
|
||
|
||
**Status:** Stable, opinionated, and enforceable
|
||
**Intended Use:** Production React codebases with long-term maintenance horizons
|
||
|
||
|
||
## When to Use
|
||
This skill is applicable to execute the workflow or actions described in the overview.
|