implementing-drag-drop
Implements drag-and-drop and sortable interfaces with React/TypeScript including kanban boards, sortable lists, file uploads, and reorderable grids. Use when building interactive UIs requiring direct manipulation, spatial organization, or touch-friendly reordering.
What this skill does
# Drag-and-Drop & Sortable Interfaces ## Purpose This skill helps implement drag-and-drop interactions and sortable interfaces using modern React/TypeScript libraries. It covers accessibility-first approaches, touch support, and performance optimization for creating intuitive direct manipulation UIs. ## When to Use Invoke this skill when: - Building Trello-style kanban boards with draggable cards between columns - Creating sortable lists with drag handles for priority ordering - Implementing file upload zones with visual drag-and-drop feedback - Building reorderable grids for dashboard widgets or galleries - Creating visual builders with node-based interfaces - Implementing any UI requiring spatial reorganization through direct manipulation ## Core Patterns ### Sortable Lists Reference `references/dnd-patterns.md` for: - Vertical lists with drag handles - Horizontal lists for tab/carousel reordering - Grid layouts with 2D dragging - Auto-scrolling near edges ### Kanban Boards Reference `references/kanban-implementation.md` for: - Multi-column boards with cards - WIP limits and swimlanes - Card preview on hover - Column management (add/remove/collapse) ### File Upload Zones Reference `references/file-dropzone.md` for: - Visual feedback states - File type validation - Multi-file handling - Progress indicators ### Accessibility Reference `references/accessibility-dnd.md` for: - Keyboard navigation patterns - Screen reader announcements - Alternative UI approaches - ARIA attributes ## Library Selection ### Primary: dnd-kit Modern, accessible, and performant drag-and-drop for React. Reference `references/library-guide.md` for: - Library comparison (dnd-kit vs alternatives) - Installation and setup - Core concepts and API - Migration from react-beautiful-dnd ### Key Features - Built-in accessibility support - Touch, mouse, and keyboard input - Zero dependencies (~10KB core) - Highly customizable - TypeScript native ## Implementation Workflow ### Step 1: Analyze Requirements Determine the drag-and-drop pattern needed: - Simple list reordering → Sortable list pattern - Multi-container movement → Kanban pattern - File handling → Dropzone pattern - Complex interactions → Visual builder pattern ### Step 2: Set Up Library Install required packages: ```bash npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities ``` ### Step 3: Implement Core Functionality Use examples as starting points: - `examples/sortable-list.tsx` for basic lists - `examples/kanban-board.tsx` for multi-column boards - `examples/file-dropzone.tsx` for file uploads - `examples/grid-reorder.tsx` for grid layouts ### Step 4: Add Accessibility Reference `references/accessibility-dnd.md` to: - Implement keyboard navigation - Add screen reader announcements - Provide alternative controls - Test with assistive technologies Run `scripts/validate_accessibility.js` to check implementation. ### Step 5: Optimize Performance For lists with >100 items: - Reference `references/performance-optimization.md` - Implement virtual scrolling - Use `scripts/calculate_drop_position.js` for efficient calculations ### Step 6: Style with Design Tokens Apply theming using the design-tokens skill: - Reference design token variables - Implement drag states (hovering, dragging, dropping) - Add visual feedback and animations ## Mobile & Touch Support Reference `references/touch-support.md` for: - Long press to initiate drag - Preventing scroll during drag - Touch-friendly hit areas (44px minimum) - Gesture conflict resolution ## State Management Reference `references/state-management.md` for: - Managing drag state in React - Optimistic updates - Undo/redo functionality - Persisting order changes ## Scripts ### Calculate Drop Position Run `scripts/calculate_drop_position.js` to: - Determine valid drop zones - Calculate insertion indices - Handle edge cases ### Generate Configuration Run `scripts/generate_dnd_config.js` to: - Create dnd-kit configuration - Set up sensors and modifiers - Configure animations ### Validate Accessibility Run `scripts/validate_accessibility.js` to: - Check keyboard navigation - Verify ARIA attributes - Test screen reader compatibility ## Examples Each example includes complete TypeScript code with accessibility: ### Sortable List `examples/sortable-list.tsx` - Vertical list with drag handles - Keyboard navigation (Space/Enter to grab, arrows to move) - Screen reader announcements ### Kanban Board `examples/kanban-board.tsx` - Multiple columns with draggable cards - Card movement between columns - Column management features - WIP limits ### File Dropzone `examples/file-dropzone.tsx` - Drag files to upload - Visual feedback states - File type validation - Upload progress ### Grid Reorder `examples/grid-reorder.tsx` - 2D grid dragging - Auto-layout on drop - Responsive breakpoints ## Assets ### TypeScript Types `assets/drag-state-types.ts` provides: - Type definitions for drag state - Event handler types - Configuration interfaces ### Configuration Schema `assets/dnd-config-schema.json` defines: - Valid configuration options - Sensor settings - Animation parameters ## Best Practices ### Visual Feedback - Show drag handles (⋮⋮) to indicate draggability - Change cursor (grab → grabbing) - Display drop zone placeholders - Make dragged items semi-transparent - Highlight valid drop targets ### Performance - Use CSS transforms, not position properties - Apply `will-change: transform` for animations - Throttle drag events for large lists - Implement virtual scrolling when needed ### Accessibility First - Always provide keyboard alternatives - Include screen reader announcements - Test with NVDA/JAWS/VoiceOver - Provide non-drag alternatives (buttons/forms) ### Error Handling - Show invalid drop feedback - Implement undo functionality - Auto-save after successful drops - Handle network failures gracefully ## Common Pitfalls ### Avoid These Issues - Forgetting keyboard navigation - Missing touch support - Not preventing scroll during drag - Ignoring accessibility - Poor performance with large lists ### Solutions Reference the appropriate guide for each issue: - Accessibility → `references/accessibility-dnd.md` - Touch → `references/touch-support.md` - Performance → `references/performance-optimization.md` - State → `references/state-management.md` ## Testing Checklist Before deployment, verify: - [ ] Keyboard navigation works completely - [ ] Screen readers announce all actions - [ ] Touch devices can drag smoothly - [ ] Performance acceptable with expected data volume - [ ] Visual feedback clear and responsive - [ ] Undo/redo functionality works - [ ] Alternative UI provided for accessibility - [ ] Works across all target browsers ## Next Steps After implementing basic drag-and-drop: 1. Add advanced features (auto-scroll, multi-select) 2. Implement gesture support for mobile 3. Add animation polish with Framer Motion 4. Create custom drag preview components 5. Build complex interactions (nested dragging)
Related in Web Dev
generating-lwc-components
IncludedLightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use generating-apex), Aura components, or Visualforce.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Set up queries with useQuery, mutations with useMutation, configure QueryClient caching strategies, implement optimistic updates, and handle infinite scroll with useInfiniteQuery. Use when: setting up data fetching in React projects, migrating from v4 to v5, or fixing object syntax required errors, query callbacks removed issues, cacheTime renamed to gcTime, isPending vs isLoading confusion, keepPreviousData removed problems.
document-processor-api
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
nutrient-document-processing
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Covers useMutationState, simplified optimistic updates, throwOnError, network mode (offline/PWA), and infiniteQueryOptions. Use when setting up data fetching, fixing v4→v5 migration errors (object syntax, gcTime, isPending, keepPreviousData), or debugging SSR/hydration issues with streaming server components.
accelint-nextjs-best-practices
IncludedNext.js performance optimization and best practices. Use when writing Next.js code (App Router or Pages Router); implementing Server Components, Server Actions, or API routes; optimizing RSC serialization, data fetching, or server-side rendering; reviewing Next.js code for performance issues; fixing authentication in Server Actions; or implementing Suspense boundaries, parallel data fetching, or request deduplication.