Back to Projects
Productivity

Resume Builder

A drag-and-drop resume builder with customizable templates and PDF export functionality.

Resume Builder

Project Overview

The Resume Builder is an intuitive web application that helps users create professional resumes with ease. It features a drag-and-drop interface for arranging resume sections, real-time preview, customizable templates, and the ability to export to PDF or share online. The application is designed to streamline the resume creation process, allowing users to focus on content while the tool handles formatting and design.

Key Features

  • Drag-and-drop section arrangement
  • Multiple professionally designed templates
  • Real-time preview of changes
  • Custom color schemes and font selection
  • PDF export with optimized formatting
  • Cloud storage for resume data
  • AI-powered content suggestions

Technical Implementation

The Resume Builder is built with React for the frontend, utilizing the DnD Kit library for drag-and-drop functionality. The application uses a custom form system with React Hook Form for data validation and management. PDF generation is handled with React-PDF, which creates high-quality, print-ready documents.

For state management, the application uses Redux Toolkit to maintain a consistent state across components and enable undo/redo functionality. Template rendering is implemented with a component-based architecture that separates content from presentation, allowing for easy addition of new templates. User data is stored in Firebase Firestore with authentication handled by Firebase Auth.

Code Snippet

// Drag and drop functionality for resume sections
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import { ResumeSection } from '@/types';

interface SortableSectionProps {
  section: ResumeSection;
  children: React.ReactNode;
}

export function SortableSection({ section, children }: SortableSectionProps) {
  const {
    attributes,
    listeners,
    setNodeRef,
    transform,
    transition,
    isDragging,
  } = useSortable({
    id: section.id,
    data: {
      type: 'section',
      section,
    },
  });

  const style = {
    transform: CSS.Transform.toString(transform),
    transition,
    opacity: isDragging ? 0.5 : 1,
  };

  return (
    <div
      ref={setNodeRef}
      style={style}
      className={`relative bg-white rounded-md shadow-sm mb-4 ${
        isDragging ? 'z-10' : ''
      }`}
    >
      <div
        {...attributes}
        {...listeners}
        className="absolute top-2 right-2 p-1 cursor-move bg-gray-100 rounded-md hover:bg-gray-200"
      >
        <svg
          xmlns="http://www.w3.org/2000/svg"
          width="16"
          height="16"
          viewBox="0 0 24 24"
          fill="none"
          stroke="currentColor"
          strokeWidth="2"
          strokeLinecap="round"
          strokeLinejoin="round"
        >
          <circle cx="9" cy="5" r="1" />
          <circle cx="9" cy="12" r="1" />
          <circle cx="9" cy="19" r="1" />
          <circle cx="15" cy="5" r="1" />
          <circle cx="15" cy="12" r="1" />
          <circle cx="15" cy="19" r="1" />
        </svg>
      </div>
      {children}
    </div>
  );
}

Technologies

React
DnD Kit
React-PDF
Redux Toolkit
Firebase
TypeScript

Contact

Interested in learning more about this project or discussing potential collaborations?