<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[My First ever JS mini project]]></title><description><![CDATA[My First ever JS mini project]]></description><link>https://mood-tracker.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 04:53:26 GMT</lastBuildDate><atom:link href="https://mood-tracker.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[My Journey of Building My First Project]]></title><description><![CDATA[Project Topic:
"Mood Tracker"
Requirements:

Users select a mood emoji (happy, sad, neutral, excited, etc.) for the day.

Store mood logs in Local Storage for persistent data.

Display a timeline view of past moods with day, week, and month filters.
...]]></description><link>https://mood-tracker.hashnode.dev/my-journey-of-building-my-first-project</link><guid isPermaLink="true">https://mood-tracker.hashnode.dev/my-journey-of-building-my-first-project</guid><category><![CDATA[ChaiCode]]></category><category><![CDATA[ChaiCohort]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Siddharth Roy]]></dc:creator><pubDate>Thu, 20 Mar 2025 16:51:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1742489200039/dd922dfc-27ae-489d-a2f0-102aa2cc1f99.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-project-topic"><strong>Project Topic:</strong></h3>
<p><strong>"Mood Tracker"</strong></p>
<h3 id="heading-requirements"><strong>Requirements:</strong></h3>
<ul>
<li><p>Users select a mood emoji (happy, sad, neutral, excited, etc.) for the day.</p>
</li>
<li><p>Store mood logs in <strong>Local Storage</strong> for persistent data.</p>
</li>
<li><p>Display a timeline view of past moods with <strong>day, week, and month</strong> filters.</p>
</li>
</ul>
<h2 id="heading-overview-of-my-project"><strong>Overview of My Project</strong></h2>
<p>It is crucial to understand the functionality of our projects, along with their requirements. Creating an overview or layout helps ensure we gather the necessary information correctly and minimize mistakes. Here is how I visualized my project at first.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742487394953/85a3dc8f-913f-4c10-b928-88a3fb1c29b0.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-html"><strong>HTML</strong></h2>
<p>HTML is a fundamental part of our project as it acts as the <strong>skeleton</strong> of the web page. It helps structure and organize elements based on project requirements, ensuring proper alignment and layout. With HTML, we define the placement of buttons, text fields, images, and other components necessary for the <strong>Mood Tracker</strong> interface.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742485088322/e319bbb2-e9c5-47a1-84ad-be309d39261f.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-css">CSS</h2>
<p>CSS plays a crucial role in designing and styling our project, making the interface visually appealing and well-structured. It helps in aligning elements, setting colors, fonts, and spacing to enhance the user experience.</p>
<p>To ensure the website is <strong>responsive</strong>, I used <strong>media queries</strong>, which adjust the layout based on different screen sizes. Here’s an example of how I implemented responsiveness:</p>
<pre><code class="lang-javascript">@media (max-width: <span class="hljs-number">768</span>px) {
    .container {
        <span class="hljs-attr">width</span>: <span class="hljs-number">95</span>%;
        padding: <span class="hljs-number">30</span>px;
    }

    .moods {
        flex-direction: column;
        align-items: center;
    }

    .moods div {
        <span class="hljs-attr">width</span>: <span class="hljs-number">150</span>px;
    }

    #confirmation-card {
        <span class="hljs-attr">width</span>: auto; <span class="hljs-comment">/* Ensuring it adapts to the screen */</span>
    }
}
</code></pre>
<p>With this, the website adapts well to smaller screens, improving usability across devices. 📱💻</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742486189215/893a0b0f-6fd0-4e53-ac84-885cddadae31.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-javascript">JavaScript</h2>
<p>This JavaScript code makes the <strong>Mood Tracker</strong> interactive by allowing users to log their moods, store them, and view past entries. Let’s break it down!</p>
<hr />
<h3 id="heading-1-selecting-elements"><strong>1️⃣ Selecting Elements</strong></h3>
<p>We first grab key elements from the HTML to interact with them in JavaScript.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> moods = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">".moods .button"</span>);
<span class="hljs-keyword">const</span> delButton = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"#delete-logs"</span>);
<span class="hljs-keyword">const</span> container = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">".container"</span>);
</code></pre>
<p>These elements help us detect <strong>user actions</strong> like clicking mood buttons or deleting logs.</p>
<hr />
<h3 id="heading-2-creating-ui-elements-dynamically"><strong>2️⃣ Creating UI Elements Dynamically</strong></h3>
<p>We create elements to <strong>display the selected mood</strong> and past logs.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> moodDisplay = createElement(<span class="hljs-string">"p"</span>, { <span class="hljs-attr">class</span>: <span class="hljs-string">"moodDisplay"</span> });
container.appendChild(moodDisplay);

<span class="hljs-keyword">const</span> logContainer = createElement(<span class="hljs-string">"div"</span>, { <span class="hljs-attr">class</span>: <span class="hljs-string">"logContainer"</span> });
container.appendChild(logContainer);
</code></pre>
<p>This ensures moods are displayed properly in the UI.</p>
<hr />
<h3 id="heading-3-retrieving-past-moods-from-local-storage"><strong>3️⃣ Retrieving Past Moods from Local Storage</strong></h3>
<p>To keep mood logs even after refreshing, we fetch stored data.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> moodLogs = <span class="hljs-built_in">JSON</span>.parse(<span class="hljs-built_in">localStorage</span>.getItem(<span class="hljs-string">"moodLogs"</span>)) || [];
updateMoodDisplay(<span class="hljs-built_in">localStorage</span>.getItem(<span class="hljs-string">"selectedMood"</span>));
updateLogDisplay();
</code></pre>
<p>This allows users to <strong>continue tracking moods</strong> seamlessly.</p>
<hr />
<h3 id="heading-4-logging-moods-and-storing-data"><strong>4️⃣ Logging Moods and Storing Data</strong></h3>
<p>When a user clicks a mood, we <strong>capture the date &amp; time</strong> and save it.</p>
<pre><code class="lang-javascript">moods.forEach(<span class="hljs-function"><span class="hljs-params">mood</span> =&gt;</span> {
    mood.addEventListener(<span class="hljs-string">'click'</span>, <span class="hljs-function">() =&gt;</span> {
        <span class="hljs-keyword">const</span> now = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>();
        <span class="hljs-keyword">const</span> date = now.toLocaleDateString(<span class="hljs-string">"en-IN"</span>, { <span class="hljs-attr">day</span>: <span class="hljs-string">"2-digit"</span>, <span class="hljs-attr">month</span>: <span class="hljs-string">"2-digit"</span>, <span class="hljs-attr">year</span>: <span class="hljs-string">"numeric"</span> });
        <span class="hljs-keyword">const</span> time = now.toLocaleTimeString(<span class="hljs-string">"en-IN"</span>, { <span class="hljs-attr">hour</span>: <span class="hljs-string">"2-digit"</span>, <span class="hljs-attr">minute</span>: <span class="hljs-string">"2-digit"</span>, <span class="hljs-attr">hour12</span>: <span class="hljs-literal">true</span> });

        saveMood(mood.textContent, date, time);
    });
});
</code></pre>
<p>This ensures <strong>accurate tracking</strong> of emotions over time.</p>
<hr />
<h3 id="heading-5-displaying-mood-history-in-a-structured-way"><strong>5️⃣ Displaying Mood History in a Structured Way</strong></h3>
<p>We organize logs <strong>by date</strong> and show timestamps.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">updateLogDisplay</span>(<span class="hljs-params"></span>) </span>{
    logContainer.innerHTML = <span class="hljs-string">"&lt;h3&gt;Your Mood swings throughout the day 🫣:&lt;/h3&gt;"</span>;

    <span class="hljs-keyword">if</span> (!moodLogs.length) {
        logContainer.innerHTML += <span class="hljs-string">"&lt;p&gt;Please enter your mood :&lt;/p&gt;"</span>;
        <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">let</span> lastDate = <span class="hljs-string">""</span>;
    moodLogs.forEach(<span class="hljs-function"><span class="hljs-params">log</span> =&gt;</span> {
        <span class="hljs-keyword">if</span> (log.date !== lastDate) {
            <span class="hljs-keyword">const</span> dateEntry = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"h4"</span>);
            dateEntry.textContent = log.date;
            logContainer.appendChild(dateEntry);
            lastDate = log.date;
        }

        <span class="hljs-keyword">const</span> logEntry = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"p"</span>);
        logEntry.textContent = <span class="hljs-string">`<span class="hljs-subst">${log.time}</span> - <span class="hljs-subst">${log.mood}</span>`</span>;
        logContainer.appendChild(logEntry);
    });
}
</code></pre>
<p>This keeps mood logs <strong>clear and easy to read</strong>.</p>
<hr />
<h3 id="heading-6-deleting-logs-with-confirmation"><strong>6️⃣ Deleting Logs with Confirmation</strong></h3>
<p>Users can clear their mood history, but we <strong>ask for confirmation first</strong>.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">confirmation</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"confirmation-card"</span>).style.display = <span class="hljs-string">"block"</span>;

    <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"confirm"</span>).addEventListener(<span class="hljs-string">'click'</span>, clearLogs);
    <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"Cancel"</span>).addEventListener(<span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
        <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">"#confirmation-card"</span>).style.display = <span class="hljs-string">"none"</span>;
    });
}
</code></pre>
<p>This <strong>prevents accidental deletions</strong>.</p>
<hr />
<h3 id="heading-7-showing-a-success-message-after-deletion"><strong>7️⃣ Showing a Success Message After Deletion</strong></h3>
<p>Once logs are cleared, we <strong>notify the user</strong>.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">messageDeleted</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">".alert-card"</span>).style.display = <span class="hljs-string">"block"</span>;

    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
        <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">".alert-card"</span>).style.display = <span class="hljs-string">"none"</span>;
    }, <span class="hljs-number">3000</span>);
}
</code></pre>
<p>This enhances the <strong>user experience</strong> by providing feedback.</p>
<hr />
<h3 id="heading-why-this-code"><strong>Why This Code?</strong></h3>
<p>✅ <strong>Saves data</strong> – Uses local Storage to retain logs.<br />✅ <strong>Organized tracking</strong> – Groups logs by date.<br />✅ <strong>Interactive &amp; responsive</strong> – Updates UI in real-time.<br />✅ <strong>User-friendly</strong> – Includes confirmation &amp; clear display of moods.</p>
<p>This code ensures a <strong>smooth and engaging</strong> mood-tracking experience.</p>
<h2 id="heading-how-the-mood-tracker-works"><strong>How the Mood Tracker Works?</strong></h2>
<p>1️⃣ <strong>User selects a mood</strong> using the available mood buttons (😊 😢 😐 😍 😝).</p>
<p>2️⃣ The selected mood is <strong>displayed on the screen</strong> for the user.</p>
<p>3️⃣ The app maintains a <strong>log of past moods</strong>, showing what the user has selected throughout the day.</p>
<p>4️⃣ A <strong>"Delete All Logs" button</strong> allows users to clear their recorded moods.</p>
<p>5️⃣ When the delete button is clicked, a <strong>confirmation card appears</strong>, asking if the user really wants to delete their logs.</p>
<ul>
<li><p><strong>If the user selects "Yes"</strong> → The logs are cleared, and a message appears at the bottom confirming the deletion.</p>
</li>
<li><p><strong>If the user selects "No"</strong> → The action is canceled, and the user returns to the main page.</p>
</li>
</ul>
<p>This simple workflow ensures users can track their emotions daily and manage their mood history easily.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742488364718/ac571ddd-713b-4a97-9735-d06e23f9a10a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-website-overview"><strong>Website Overview</strong> 🚀</h2>
<p>After implementing <strong>HTML, CSS, and JavaScript</strong>, we have finally built our <strong>Mood Tracker</strong>! Below is a video showcasing the final result:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/V9o6tg25UlM">https://youtu.be/V9o6tg25UlM</a></div>
<p> </p>
<p>Hope my Blog helps you in any way. Thanks for reading &lt;3 !</p>
<p>you can check the code on my GitHub repo: - <a target="_blank" href="https://github.com/Siddharth8509">Siddharth8509 (Siddharth Roy)</a></p>
]]></content:encoded></item></channel></rss>