The Brief
You are applying for a Senior Frontend Developer role. This is your take-home assignment. The goal is not just to make it work, but to make it maintainable, performant, and accessible.
Project: "TaskMaster Pro"
A Trello-style Kanban board with drag-and-drop functionality, persistent state, and URL-driven navigation.
MVP: Core Board Functionality
As a user, I want to organize my tasks into columns so I can track progress.
- Columns: Three fixed columns: "To Do", "In Progress", "Done".
- CRUD: Create, Read, Update, and Delete tasks.
- State: Use Zustand for global state management.
- Persistence: Save data to
localStorageautomatically.
export type Status = 'TODO' | 'IN_PROGRESS' | 'DONE';
export interface Task {
id: string;
title: string;
description: string;
status: Status;
createdAt: number;
}
export interface BoardState {
tasks: Task[];
addTask: (title: string, status: Status) => void;
moveTask: (id: string, newStatus: Status) => void;
deleteTask: (id: string) => void;
}
Senior Feature: Drag & Drop
As a user, I want to drag tasks between columns for a natural interaction.
- Implement dnd-kit (recommended) or
react-beautiful-dnd. - Tasks must visually snap into place.
- Accessibility: Must support keyboard navigation (Space to lift, Arrows to move, Space to drop).
Senior Feature: URL-Driven Modals
As a user, I want to share a link to a specific task with my colleague.
- Clicking a task opens a modal.
- The URL must update to
/board/task/123. - Refreshing the page at that URL must open the board and the modal immediately.
- Closing the modal returns the URL to
/board.
Quality Assurance
As a developer, I want to ensure the app is robust and bug-free.
- Testing: Write unit tests for the `TaskCard` and integration tests for the "Add Task" flow.
- Performance: Use
React.memoon `TaskCard`. Ensure dragging one card doesn't re-render the whole board. - Linting: No ESLint warnings or TypeScript errors.
🏁 Final Challenge: The "Clean Slate"
Once you build this project and it works perfectly:
- Delete the entire folder.
- Rebuild it from scratch without looking at your old code.
This is the only way to know if you truly understand the concepts or if you were just copying code. Good luck.