FocusBoard banner

FocusBoard

4 devlogs
7h 4m 53s

"A modern and responsive Task Manager web app that helps you organize your daily tasks efficiently. Features include task creation, completion tracking, analytics dashboard, dark mode support, smooth animations, and local storage to keep your data…

“A modern and responsive Task Manager web app that helps you organize your daily tasks efficiently. Features include task creation, completion tracking, analytics dashboard, dark mode support, smooth animations, and local storage to keep your data saved. Simple, clean, and productivity-focused design.”

This project uses AI

Used AI to recommend colors and help me in design.

Demo Repository

Loading README...

mathew.emad778

Shipped this project!

Hours: 7.08
Cookies: 🍪 24
Multiplier: 3.42 cookies/hr

“Shipped a fully functional Task Manager web app with dynamic task handling, real-time analytics, smooth animations, dark mode support, and persistent local storage — built entirely with pure HTML, CSS, and Vanilla JavaScript.”

mathew.emad778

When implementing dark mode in this project, my goal was to build a structured theme system instead of just changing background colors. I used a single dark-mode class added to the body element to control the entire theme. This keeps JavaScript responsible only for toggling the mode, while CSS handles all visual changes.

The light theme acts as the base design, and dark mode works through CSS overrides using the .dark-mode prefix. Backgrounds, cards, text, buttons, and borders are all adjusted through controlled style changes, keeping the stylesheet organized and maintainable.

A key challenge was maintaining readability. Some elements, especially analytics numbers, became hard to see on darker backgrounds. To fix this, I adjusted text colors and contrast carefully to ensure clarity without breaking the design consistency.

Cards were switched to deep gray instead of pure black to preserve visual hierarchy. Inputs and buttons were also restyled to remain accessible and clear.

Overall, the dark mode implementation reinforces clean separation between logic and styling, scalable CSS structure, and strong UI contrast management.

Attachment
0
mathew.emad778

When developing the analytics system for this project, my main goal was to provide real-time productivity insights while keeping the architecture simple and fully synchronized with the task state. Instead of storing separate counters for totals and completed tasks, I designed analytics to be derived directly from the main tasks array. This ensures that the displayed numbers are always accurate and never fall out of sync with the actual data.

The total number of tasks is calculated using the array length property. Completed tasks are calculated using a filtering operation that counts tasks where the completed value is set to true. This dynamic calculation removes the need for manual updates whenever a task is added, toggled, or deleted.

For the completion rate, I implemented a percentage formula based on completed tasks divided by total tasks. To prevent errors, I added a safeguard to handle cases where there are no tasks. If the total is zero, the completion rate defaults to 0%, avoiding division-by-zero issues and maintaining UI stability.

One important architectural decision was centralizing analytics updates inside the main render cycle. Instead of updating analytics inside each individual action function, I created a structured flow where any state change triggers a save-and-render process. During this cycle, analytics values are recalculated and displayed instantly. This keeps the system predictable and easy to maintain.

From a UI perspective, analytics are updated immediately after every interaction, providing instant feedback to the user. In dark mode, text colors were adjusted to maintain readability and strong contrast against darker backgrounds.

Overall, the analytics system reinforces principles of derived state, centralized updates, clean function separation, and UI synchronization using pure JavaScript without external libraries.

Attachment
0
mathew.emad778

When building the task system for this project, my main objective was to create a clean and reliable state-driven structure using pure Vanilla JavaScript. Instead of treating tasks as simple text entries, I designed each task as an object containing a title, priority level, and a boolean completed value. This approach makes the system scalable and easier to extend in the future.

All tasks are stored inside a single array that acts as the source of truth. The UI does not store any independent state. Instead, every time the state changes, the interface is fully re-rendered based on the current tasks array. This guarantees synchronization between the data and what the user sees on the screen.

When adding a task, the application validates the input, creates a new task object with completed set to false, pushes it into the array, saves the updated array to Local Storage, and re-renders the list. This structured flow ensures consistency and prevents logic duplication.

The toggle completion feature works by flipping the completed boolean when the user clicks on the task text. During rendering, a conditional CSS class is applied if the task is completed, which visually adds a line-through effect. This keeps logic and styling clearly separated.

Deleting a task removes it from the array using its index, then triggers the same save-and-render cycle. Because analytics are derived directly from the tasks array, all statistics update automatically without additional logic.

Local Storage integration ensures persistence after page refresh. On load, stored tasks are parsed and rendered immediately, maintaining continuity.

Overall, this task architecture demonstrates state management, dynamic DOM rendering, separation of concerns, and clean update cycles without relying on any framework

Attachment
0
mathew.emad778

Started the project by setting up the core HTML structure with a clear layout: Sidebar and Main Content. I’m building this as a Single Page Application (SPA) so navigating between sections (Dashboard – Tasks – Analytics) won’t require page reloads, making the experience smoother.

The Sidebar contains buttons linked via data-section attributes to dynamically show/hide each section with JavaScript. Each section is wrapped in its own to make managing content easier later.

At this stage I focused on:

Creating a clean, expandable layout

Preparing the dynamic navigation system

Setting up initial Cards for stats display

Building the Task section (input + priority + list)

Reserving space for Analytics to link with data later

For design, I chose a soft, light color palette to make adding Dark Mode later easy and visually pleasant.

Next steps: connect the Task system to the Dashboard and update stats live.

Attachment
0