skills/gemini960114/skills/frontend-development

frontend-development

SKILL.md

Frontend Development Instructions

This skill provides general guidance for frontend development across various projects. Use this when working with web-based user interfaces, regardless of the specific framework or library.

General Principles

Code Organization

  • Separate concerns: HTML for structure, CSS for styling, JavaScript for behavior
  • Use semantic HTML elements for accessibility
  • Keep CSS modular and maintainable
  • Avoid global variable pollution using modules or IIFEs

Performance

  • Minimize DOM manipulations
  • Use CSS animations over JavaScript when possible
  • Lazy load images and resources
  • Debounce/throttle event handlers
  • Use requestAnimationFrame for animations

Accessibility

  • Use proper ARIA labels
  • Ensure keyboard navigation works
  • Maintain sufficient color contrast
  • Provide alt text for images

Common Patterns

Event Handling

// Event delegation for multiple elements
document.querySelector('.container').addEventListener('click', (e) => {
  if (e.target.matches('.btn')) {
    handleButtonClick(e);
  }
});

// Debounced input handler
function debounce(fn, delay) {
  let timeout;
  return (...args) => {
    clearTimeout(timeout);
    timeout = setTimeout(() => fn(...args), delay);
  };
}

DOM Manipulation

// Efficient DOM updates
const fragment = document.createDocumentFragment();
items.forEach(item => {
  const li = document.createElement('li');
  li.textContent = item.name;
  fragment.appendChild(li);
});
document.querySelector('#list').appendChild(fragment);

// Template literals for dynamic HTML
const html = `<div class="card">
  <h3>${title}</h3>
  <p>${description}</p>
</div>`;

State Management

// Simple state management
class StateManager {
  constructor() {
    this.state = {};
    this.listeners = [];
  }

  getState(key) {
    return this.state[key];
  }

  setState(key, value) {
    this.state[key] = value;
    this.listeners.forEach(fn => fn(this.state));
  }

  subscribe(fn) {
    this.listeners.push(fn);
    return () => {
      this.listeners = this.listeners.filter(f => f !== fn);
    };
  }
}

Fetch API

// GET request
async function fetchData(url) {
  try {
    const response = await fetch(url);
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    return await response.json();
  } catch (error) {
    console.error('Fetch failed:', error);
    throw error;
  }
}

// POST request with JSON
async function postData(url, data) {
  const response = await fetch(url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data)
  });
  return response.json();
}

CSS Best Practices

/* Use CSS custom properties */
:root {
  --primary-color: #007bff;
  --spacing: 1rem;
}

/* Mobile-first responsive */
.container {
  padding: var(--spacing);
}

@media (min-width: 768px) {
  .container {
    max-width: 1200px;
    margin: 0 auto;
  }
}

/* Efficient selectors */
.card { /* Avoid overly specific selectors */ }
.card__title { }
.card__title--highlighted { }

Framework-Specific Notes

React

  • Use functional components with hooks
  • Keep components small and focused
  • Use useMemo/useCallback for expensive operations
  • Follow ESLint rules for React

Vue

  • Use Composition API for better code organization
  • Leverage computed properties for derived state
  • Use v-for with :key for list rendering

Vanilla JavaScript

  • Use ES6+ features (const/let, arrow functions, destructuring)
  • Prefer modules over script tags
  • Use modern APIs (fetch, IntersectionObserver, etc.)

Debugging

Browser DevTools

  • Use Console API effectively: console.log, console.warn, console.error
  • Use breakpoints for step-through debugging
  • Inspect network requests in Network tab
  • Check Application tab for localStorage/sessionStorage

Common Issues

  • CORS errors: Check server headers
  • Memory leaks: Monitor in Performance tab
  • Layout shifts: Check for dynamic content loading
  • Event listener issues: Verify cleanup in useEffect/destroy

Build Tools

Vite

npm create vite@latest my-app -- --template vanilla
npm install
npm run dev

Webpack

  • Configure loaders for different file types
  • Use code splitting for large apps
  • Enable production optimizations

Testing

Unit Testing

// Simple test example
function sum(a, b) {
  return a + b;
}

// Test
function testSum() {
  const result = sum(2, 3);
  console.assert(result === 5, 'Expected sum to be 5');
}

E2E Testing

  • Use Playwright or Cypress for end-to-end tests
  • Test critical user flows
  • Mock external APIs when needed

Performance Optimization

Core Web Vitals

  • LCP (Largest Contentful Paint): < 2.5s
  • FID (First Input Delay): < 100ms
  • CLS (Cumulative Layout Shift): < 0.1

Techniques

  • Optimize images (WebP, compression)
  • Minify CSS/JS
  • Use CDN for static assets
  • Implement caching strategies
Weekly Installs
8
First Seen
Feb 22, 2026
Installed on
opencode8
gemini-cli8
github-copilot8
codex8
amp8
kimi-cli8