---
name: adynato-web
description: Web development conventions for Adynato projects. Covers image optimization with img4web, asset management, component patterns, styling, and performance best practices. Use when building or modifying web applications, adding images/assets, or creating UI components.
---
# Web Development Skill
Use this skill for all Adynato web projects and frontend development.
## Image & Asset Management
### Always Use img4web
When adding images or visual assets to any Adynato project, use [adynato/img4web](https://github.com/adynato/img4web).
```bash
# Install globally
npm install -g @adynato/img4web
# Or use npx
npx @adynato/img4web [options]
```
### When to Use img4web
- Adding any new image to a project
- Processing user-uploaded images
- Optimizing existing unoptimized images
- Converting images to modern formats (WebP, AVIF)
- Generating responsive image sets
### img4web Usage
```bash
# Basic optimization
npx @adynato/img4web ./src/images
# With specific output formats
npx @adynato/img4web ./image.png --formats webp,avif
# Generate responsive sizes
npx @adynato/img4web ./hero.jpg --sizes 640,1024,1920
# Watch mode during development
npx @adynato/img4web ./src/images --watch
```
### Image Requirements
| Use Case | Max Width | Formats | Quality |
|----------|-----------|---------|---------|
| Hero/Banner | 1920px | WebP, AVIF, fallback JPG | 80-85 |
| Content Images | 1200px | WebP, AVIF | 80 |
| Thumbnails | 400px | WebP | 75 |
| Icons/Logos | Original | SVG preferred, else PNG | Lossless |
| OG Images | 1200x630 | PNG or JPG | 90 |
### Image Component Pattern
Always use responsive images with modern format fallbacks:
```tsx
// Next.js
import Image from 'next/image'
```
```html
```
## Asset Organization
```
public/
├── images/
│ ├── blog/
│ │ └── [post-slug]/
│ │ ├── cover.webp
│ │ ├── cover.avif
│ │ └── *.webp
│ ├── og/
│ │ └── [page-slug].png
│ ├── icons/
│ │ └── *.svg
│ └── hero/
│ └── *.webp
├── fonts/
│ └── *.woff2
└── videos/
└── *.mp4
```
## Component Patterns
### File Naming
- Components: `PascalCase.tsx` (e.g., `Button.tsx`, `NavBar.tsx`)
- Utilities: `camelCase.ts` (e.g., `formatDate.ts`)
- Hooks: `useCamelCase.ts` (e.g., `useAuth.ts`)
- Types: `types.ts` or `[feature].types.ts`
### Component Structure
```tsx
// components/Button.tsx
import { type ReactNode } from 'react'
interface ButtonProps {
children: ReactNode
variant?: 'primary' | 'secondary'
onClick?: () => void
}
export function Button({ children, variant = 'primary', onClick }: ButtonProps) {
return (
)
}
```
### Export Pattern
Prefer named exports over default exports:
```tsx
// Good
export function Button() { ... }
export function Input() { ... }
// Avoid
export default function Button() { ... }
```
## Performance Checklist
Before deploying any web project:
- [ ] All images processed through img4web
- [ ] Images use WebP/AVIF with fallbacks
- [ ] Above-fold images have `priority` or `fetchpriority="high"`
- [ ] Below-fold images have `loading="lazy"`
- [ ] Fonts are self-hosted as WOFF2
- [ ] Critical CSS is inlined
- [ ] JavaScript is code-split appropriately
- [ ] No layout shift (CLS) issues
## Styling
### Preferred Stack
1. **Tailwind CSS** - utility-first styling
2. **CSS Modules** - when component-scoped styles needed
3. **CSS Variables** - for theming and dynamic values
### Tailwind Conventions
```tsx
// Use consistent ordering: layout, spacing, sizing, typography, colors, effects
```
### Dark Mode
Always support dark mode:
```tsx
```