<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by code.with.ferdi on Medium]]></title>
        <description><![CDATA[Stories by code.with.ferdi on Medium]]></description>
        <link>https://medium.com/@akun.ferdiyanto?source=rss-20d48d25ef36------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*58NEvGEpAmwF_IXOJT5K1g.jpeg</url>
            <title>Stories by code.with.ferdi on Medium</title>
            <link>https://medium.com/@akun.ferdiyanto?source=rss-20d48d25ef36------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 22 May 2026 18:48:55 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@akun.ferdiyanto/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The App Works… But the Code Is Problematic: Flutter BMI Bug Hunting]]></title>
            <link>https://medium.com/@akun.ferdiyanto/the-app-works-but-the-code-is-problematic-flutter-bmi-bug-hunting-6d0e8306c592?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/6d0e8306c592</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Mon, 18 May 2026 12:15:49 GMT</pubDate>
            <atom:updated>2026-05-18T12:30:59.853Z</atom:updated>
            <content:encoded><![CDATA[<p>A simple Flutter BMI calculator may look fully functional, but behind the UI there are hidden logic bugs, testing issues, UX flaws, and bad coding.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gz8Vnyb4PMhEdslER-qpIQ.png" /></figure><h3>Introduction</h3><p>When learning Flutter, many beginners focus on one thing: <em>“Does the app run successfully?”</em> If the application compiles without errors and the UI looks correct, it often feels finished. However, in real software development, a working app does not always mean the code is good, scalable, or even correct.</p><p>In this article, I performed a simple bug hunting session on a beginner Flutter BMI Calculator project. At first glance, the app looked completely fine, but after reviewing the code more carefully, I found several hidden issues related to logic, validation, UI/UX, testing, and maintainability. This article explores those problems, their impacts, and how they can be improved.</p><h3>Incorrect BMI Classification Logic</h3><p>One of the most important bugs existed inside the BMI classification logic.</p><pre>if (bmi &lt; 18.5) return &#39;Kurus&#39;;<br>if (bmi &lt; 25.0) return &#39;Normal&#39;;<br>if (bmi &lt; 30.0) return &#39;Normal&#39;;<br>return &quot;Obesitas&quot;;</pre><p>The issue is here:</p><pre>if (bmi &lt; 30.0) return &#39;Normal&#39;;</pre><p>The BMI classification logic is incorrect because values between 25–29.9 are still categorized as “Normal” instead of “Overweight.” As a result, users may receive misleading health information even though the application appears to work correctly. This can be fixed by changing the returned category for BMI values below 30 to “Overweight.”</p><pre>if (bmi &lt; 30.0) return &#39;Overweight&#39;;</pre><h3>Potential Keyboard Overflow</h3><p>The form layout uses a long Column without scroll support.</p><pre>Column(<br>  children: [</pre><p>When the keyboard appears on smaller screens, Flutter may throw:</p><pre>Bottom overflowed by XX pixels</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/878/1*2kHDXwU_42u-WptLaHlD_w.png" /></figure><p>Wrap the content with:</p><pre>SingleChildScrollView</pre><p>This allows the UI to scroll safely.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/878/1*2UNWWjS_82EHyGcd3OAjfg.png" /></figure><h3>GestureDetector Used as a Button</h3><p>The submit button is built using:</p><pre>GestureDetector + Container</pre><p>instead of Flutter’s built-in Material buttons.</p><p>This removes several important features: ripple effects, accessibility support, disabled states, proper semantics</p><p>Better Alternative</p><pre>ElevatedButton</pre><h3>No Responsive Design</h3><p>The layout relies heavily on fixed spacing:</p><pre>SizedBox(height: 30)</pre><p>The UI may look inconsistent across different screen sizes.</p><p>Better Approach Use: MediaQuery, LayoutBuilder, responsive utilities</p><h3>UI Makeover: From Basic Layout to Modern Minimalist Design</h3><p>Besides fixing bugs and logic issues, I also redesigned the UI to make the application feel cleaner and more modern. The original version used basic Flutter widgets with minimal styling, while the improved version focuses on:</p><ul><li>cleaner spacing</li><li>soft background colors</li><li>rounded corners</li><li>modern card layouts</li><li>better typography</li><li>Material Design components</li></ul><p>For example, the old version used a simple GestureDetector + Container as a button:</p><pre>GestureDetector(<br>  child: Container(</pre><p>This was replaced with a modern ElevatedButton:</p><pre>ElevatedButton(<br>  style: ElevatedButton.styleFrom(<br>    borderRadius: BorderRadius.circular(18),<br>  ),<br>)</pre><p>I also redesigned the result page by adding:</p><ul><li>dynamic BMI status colors</li><li>card-based layout</li><li>health icons</li><li>better visual hierarchy</li><li>more responsive spacing</li></ul><p>The updated UI not only looks more professional, but also improves user experience and readability. This demonstrates that bug hunting is not only about fixing crashes or logic errors, but also about improving usability and overall application quality.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/557/1*H58DXiwRz6UPtu-D9MCzfg.png" /></figure><h3>Conclusion</h3><p>Building a working application is only the first step in software development. Even though this Flutter BMI app runs successfully, it still contains hidden issues related to logic, validation, UI/UX, and maintainability. This project shows that bug hunting is an important learning process because good software is not only about whether the app works, but also about how safe, scalable, and reliable the code is.</p><h3>Online Resource</h3><p>Resources:<br><a href="https://drive.google.com/file/d/1SJrlPqwXC1c0eVo0L00GyKexMXNjKnZL/view?usp=sharing">https://drive.google.com/file/d/1SJrlPqwXC1c0eVo0L00GyKexMXNjKnZL/view?usp=sharing</a></p><p>🙌 Thanks for reading! If you found this helpful, give it a clap and follow for more beginner-friendly guides on Flutter Mobile Programming!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d0e8306c592" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter State Management Made Simple with a Quiz App Case Study]]></title>
            <link>https://medium.com/@akun.ferdiyanto/flutter-state-management-made-simple-with-a-quiz-app-case-study-d5155be290d1?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/d5155be290d1</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Mon, 06 Apr 2026 23:10:27 GMT</pubDate>
            <atom:updated>2026-04-06T23:10:27.230Z</atom:updated>
            <content:encoded><![CDATA[<img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d5155be290d1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Simple Dice App with Stateful Widgets in Flutter]]></title>
            <link>https://medium.com/@akun.ferdiyanto/building-a-simple-dice-app-with-stateful-widgets-in-flutter-f1897599a9b8?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1897599a9b8</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Sat, 14 Mar 2026 09:37:17 GMT</pubDate>
            <atom:updated>2026-03-14T09:37:17.273Z</atom:updated>
            <content:encoded><![CDATA[<p>A beginner-friendly guide to understanding dynamic UI updates using Stateful Widgets.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Eyc9EBqBORgxMLVMQ0I62A.png" /></figure><h3>Introduction</h3><p>When developing mobile applications, many interfaces need to change dynamically based on user interactions. Flutter provides <strong>Stateful Widgets</strong> to handle UI elements that need to update during runtime.</p><p>In this tutorial, we will build a simple <strong>Dice application</strong>. Each time the user taps the dice, the app will generate a random number and update the dice image accordingly.</p><h3>Understanding Stateful Widgets</h3><p>In Flutter, widgets are divided into two main categories:</p><h4>Stateless Widget</h4><p>A <strong>StatelessWidget</strong> is used when the UI does not change during runtime.</p><p>Example:</p><ul><li>Static text</li><li>Icons</li><li>Layout structures</li></ul><h4>Stateful Widget</h4><p>A <strong>StatefulWidget</strong> is used when the UI needs to update dynamically.</p><p>Examples:</p><ul><li>Counters</li><li>Form inputs</li><li>Interactive components</li><li>Games</li></ul><p>In our dice application, the dice image must change every time the user taps it. Therefore, we need to use a <strong>Stateful Widget</strong>.</p><h3>Designing the Dice Layout</h3><p>Before writing the code, let’s understand the layout structure of the UI.</p><p>The widget hierarchy looks like this:</p><pre>MaterialApp<br> └── Scaffold<br>      ├── AppBar<br>      └── Center<br>           └── Row<br>                ├── Dice Image<br>                └── Dice Image</pre><p>Explanation:</p><ul><li><strong>MaterialApp</strong> provides the main structure of the Flutter application.</li><li><strong>Scaffold</strong> creates the basic screen layout.</li><li><strong>AppBar</strong> displays the application title.</li><li><strong>Row</strong> arranges the dice horizontally.</li><li><strong>Expanded</strong> ensures each dice takes equal space.</li></ul><h3>Creating the Dice State</h3><p>To store the current dice values, we define two integer variables.</p><pre>int leftDiceNumber = 1;<br>int rightDiceNumber = 1;</pre><p>These variables represent the dice images that will be displayed on the screen.</p><h3>Generating Random Dice Numbers</h3><p>To simulate rolling the dice, we generate random numbers using Dart’s <strong>Random()</strong> class.</p><pre>void changeDiceFace(){<br>  setState(() {<br>    leftDiceNumber = Random().nextInt(6) + 1;<br>    rightDiceNumber = Random().nextInt(6) + 1;<br>  });<br>}</pre><p>Explanation:</p><ul><li><strong>Random().nextInt(6)</strong> generates numbers between <strong>0–5</strong></li><li>We add <strong>+1</strong> so the result becomes <strong>1–6</strong></li><li><strong>setState()</strong> tells Flutter to rebuild the UI with the new values</li></ul><p>Whenever setState() is called, Flutter updates the interface automatically.</p><h3>Displaying the Dice Images</h3><p>Each dice is displayed using <strong>Image.asset</strong>.</p><pre>Image.asset(&quot;images/dice$leftDiceNumber.png&quot;)</pre><p>This allows Flutter to dynamically load images such as:</p><ul><li>dice1.png</li><li>dice2.png</li><li>dice3.png</li><li>dice4.png</li><li>dice5.png</li><li>dice6.png</li></ul><p>The number changes depending on the value stored in leftDiceNumber and rightDiceNumber.</p><h3>Making the Dice Interactive</h3><p>To allow user interaction, we wrap the dice image inside a <strong>TextButton</strong>.</p><pre>TextButton(<br>  onPressed: () {<br>    changeDiceFace();<br>  },<br>  child: Image.asset(&quot;images/dice$leftDiceNumber.png&quot;),<br>)</pre><p>When the user taps the dice:</p><ol><li>The button triggers changeDiceFace()</li><li>The dice numbers change</li><li>setState() updates the UI</li><li>New dice images appear on the screen</li></ol><h3>Result</h3><p>When the application runs:</p><ul><li>Two dice images appear on the screen</li><li>Tapping any dice will <strong>randomize both dice values</strong></li><li>The UI updates instantly using <strong>setState()</strong></li></ul><p>This demonstrates how <strong>Stateful Widgets allow Flutter apps to create dynamic and interactive interfaces.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/382/1*G2FMYM_Z9bzycPlCsKHaHA.gif" /></figure><h3>Conclusion</h3><p>In this tutorial, we built a simple dice application to understand how <strong>Stateful Widgets</strong> work in Flutter.</p><p>We learned how to:</p><ul><li>Create interactive UI using <strong>StatefulWidget</strong></li><li>Update the interface using <strong>setState()</strong></li><li>Generate random numbers using Dart’s <strong>Random class</strong></li><li>Display dynamic images with <strong>Image.asset</strong></li></ul><p>Although simple, this project introduces one of the most important concepts in Flutter development: <strong>managing UI state</strong>.</p><h3>Online Resource</h3><p>Resources:<br> <a href="https://github.com/codewithferdi-rgb/practical_mobile.git">https://github.com/codewithferdi-rgb/practical_mobile.git</a></p><p>🙌 Thanks for reading! If you found this helpful, give it a clap and follow for more beginner-friendly guides on Flutter Mobile Programming!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1897599a9b8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Designing a Modern Profile Page with Flutter Widgets]]></title>
            <link>https://medium.com/@akun.ferdiyanto/designing-a-modern-profile-page-with-flutter-widgets-37b16aba2a03?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/37b16aba2a03</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Mon, 09 Mar 2026 15:36:02 GMT</pubDate>
            <atom:updated>2026-03-09T15:42:08.163Z</atom:updated>
            <content:encoded><![CDATA[<h4>A practical guide to building clean and responsive profile interfaces in Flutter.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XeKlhlxHCoSaiT5nHScIWQ.png" /></figure><h3>Introduction</h3><p>User profile pages are one of the most common interfaces in modern mobile applications. They usually display important information such as a user’s name, role, profile picture, and contact details.</p><p>In this tutorial, we will learn the basics of <strong>Flutter UI development</strong> by building a simple profile page. Through this example, we will explore how Flutter layouts work using widgets like <strong>Column</strong>, <strong>Row</strong>, and <strong>Container</strong>, as well as how to display a profile image using <strong>CircleAvatar</strong>.</p><h3>Project Setup</h3><p>Before we start building the UI, we need to create a new Flutter project.</p><pre>flutter create session4<br>cd session4</pre><p>This command generates a new Flutter project with the default folder structure.</p><p>After the project is created, run the application using:</p><pre>flutter run</pre><p>Flutter will build and launch the default starter application on your emulator or connected device.</p><h3>Installing Google Fonts</h3><p>Typography is an important element in modern UI design. Using the right font can significantly improve readability and visual hierarchy.</p><p>Flutter provides an easy way to integrate Google Fonts through the <strong>google_fonts package</strong>.</p><pre>flutter pub add google_fonts</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/866/1*NvXET3h-f3yiHYbZMFI9Ow.png" /></figure><p>After adding the dependency, run the following command:</p><pre>flutter pub get</pre><p>This will download the package and make it available in your project.</p><h3>Designing the Profile Page Layout</h3><p>Before writing the code, it’s helpful to understand the structure of the profile page layout.</p><p>The UI hierarchy will look like this:</p><pre>Scaffold<br> └── SafeArea<br>      └── Column<br>           ├── Profile Header<br>           ├── Divider<br>           └── Contact Information</pre><p>The <strong>Scaffold</strong> widget provides the basic structure for the screen, while <strong>SafeArea</strong> ensures the UI does not overlap with system elements such as the status bar.</p><h3>Building the Profile Header</h3><p>The first section of the profile page contains the <strong>profile picture</strong>, <strong>user name</strong>, and <strong>job title</strong>.</p><p>Flutter provides the CircleAvatar widget, which is perfect for displaying profile images.</p><p>Here is the implementation:</p><pre>CircleAvatar(<br>  radius: 50,<br>  backgroundImage: AssetImage(&quot;assets/images/profile.png&quot;),<br>),<br>Text(<br>  &quot;Emma Stone&quot;,<br>  style: GoogleFonts.inter(<br>    fontSize: 24,<br>    fontWeight: FontWeight.w500,<br>    color: Color(0xFF181818),<br>  ),<br>),<br>Text(<br>  &quot;Flutter Developer&quot;,<br>  style: GoogleFonts.inter(<br>    fontSize: 16,<br>    fontWeight: FontWeight.w400,<br>    color: Color(0xFF181818),<br>  ),<br>),</pre><p>Explanation:</p><ul><li>CircleAvatar displays the profile picture in a circular frame.</li><li>Text widgets show the user&#39;s name and profession.</li><li>GoogleFonts.inter() applies a modern typography style.</li></ul><p>To add spacing between elements, we use SizedBox.</p><h3>Adding a Divider for Visual Separation</h3><p>To create a visual break between the header and the contact information, we can add a Divider.</p><pre>SizedBox(<br>  height: 20,<br>  width: 150,<br>  child: Divider(color: Color(0xFFF8F8F8)),<br>),</pre><h3>Creating Contact Information Cards</h3><p>Next, we add sections to display the user’s <strong>phone number</strong> and <strong>email address</strong>.</p><p>Each item is wrapped inside a Container with padding and a subtle background color.</p><h4>Phone Number Section</h4><pre>Container(<br>  padding: EdgeInsets.all(12),<br>  decoration: BoxDecoration(<br>    color: Color(0xFFF8F8F8),<br>    borderRadius: BorderRadius.circular(8),<br>  ),<br>  margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),<br>  child: Row(<br>    children: [<br>      Icon(Icons.phone, color: Color(0xFF181818)),<br>      SizedBox(width: 8),<br>      Text(<br>        &quot;+1 234 567 890&quot;,<br>        style: GoogleFonts.inter(<br>          fontSize: 16,<br>          fontWeight: FontWeight.w400,<br>          color: Color(0xFF181818),<br>        ),<br>      ),<br>    ],<br>  ),<br>)</pre><h4>Email Section</h4><pre>Container(<br>  padding: EdgeInsets.all(12),<br>  margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),<br>  decoration: BoxDecoration(<br>    color: Color(0xFFF8F8F8),<br>    borderRadius: BorderRadius.circular(8),<br>  ),<br>  child: Row(<br>    children: [<br>      Icon(Icons.email, color: Color(0xFF181818)),<br>      SizedBox(width: 8),<br>      Text(<br>        &quot;emma.stone@example.com&quot;,<br>        style: GoogleFonts.inter(<br>          fontSize: 16,<br>          fontWeight: FontWeight.w400,<br>          color: Color(0xFF181818),<br>        ),<br>      ),<br>    ],<br>  ),<br>)</pre><p>Explanation:</p><ul><li>Container provides styling such as padding and background color.</li><li>Row arranges the icon and text horizontally.</li><li>Icon visually represents the type of contact information.</li><li>SizedBox adds spacing between the icon and text.</li></ul><h3>Complete Flutter Code</h3><p>Below is the complete implementation of the profile page UI:</p><pre>import &#39;package:flutter/material.dart&#39;;<br>import &#39;package:google_fonts/google_fonts.dart&#39;;<br><br>void main() {<br>  runApp(const MyApp());<br>}<br><br>class MyApp extends StatelessWidget {<br>  const MyApp({super.key});<br><br>  @override<br>  Widget build(BuildContext context) {<br>    return MaterialApp(<br>      home: Scaffold(<br>        backgroundColor: Colors.white,<br>        body: SafeArea(<br>          child: Column(<br>            mainAxisAlignment: MainAxisAlignment.center,<br>            children: [<br>              CircleAvatar(<br>                radius: 50,<br>                backgroundImage: AssetImage(&quot;assets/images/profile.png&quot;),<br>              ),<br>              Text(<br>                &quot;Emma Stone&quot;,<br>                style: GoogleFonts.inter(<br>                  fontSize: 24,<br>                  fontWeight: FontWeight.w500,<br>                  color: Color(0xFF181818),<br>                ),<br>              ),<br>              Text(<br>                &quot;Flutter Developer&quot;,<br>                style: GoogleFonts.inter(<br>                  fontSize: 16,<br>                  fontWeight: FontWeight.w400,<br>                  color: Color(0xFF181818),<br>                ),<br>              ),<br>              SizedBox(<br>                height: 20,<br>                width: 150,<br>                child: Divider(color: Color(0xFFF8F8F8)),<br>              ),<br>              Container(<br>                padding: EdgeInsets.all(12),<br>                decoration: BoxDecoration(<br>                  color: Color(0xFFF8F8F8),<br>                  borderRadius: BorderRadius.circular(8),<br>                ),<br>                margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),<br>                child: Row(<br>                  children: [<br>                    Icon(Icons.phone, color: Color(0xFF181818)),<br>                    SizedBox(width: 8),<br>                    Text(<br>                      &quot;+1 234 567 890&quot;,<br>                      style: GoogleFonts.inter(<br>                        fontSize: 16,<br>                        fontWeight: FontWeight.w400,<br>                        color: Color(0xFF181818),<br>                      ),<br>                    ),<br>                  ],<br>                ),<br>              ),<br>              Container(<br>                padding: EdgeInsets.all(12),<br>                margin: EdgeInsets.symmetric(horizontal: 20, vertical: 10),<br>                decoration: BoxDecoration(<br>                  color: Color(0xFFF8F8F8),<br>                  borderRadius: BorderRadius.circular(8),<br>                ),<br>                child: Row(<br>                  children: [<br>                    Icon(Icons.email, color: Color(0xFF181818)),<br>                    SizedBox(width: 8),<br>                    Text(<br>                      &quot;emma.stone@example.com&quot;,<br>                      style: GoogleFonts.inter(<br>                        fontSize: 16,<br>                        fontWeight: FontWeight.w400,<br>                        color: Color(0xFF181818),<br>                      ),<br>                    ),<br>                  ],<br>                ),<br>              ),<br>            ],<br>          ),<br>        ),<br>      ),<br>    );<br>  }<br>}</pre><p>Result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mLFSaIx82jN3ex6qtbC2TQ.png" /></figure><h3>Conclusion</h3><p>In this article, we built a <strong>simple and modern profile page UI using Flutter widgets</strong>. We explored how Flutter’s widget-based architecture allows developers to easily construct user interfaces using reusable components.</p><p>We also learned how to integrate <strong>Google Fonts</strong> to enhance typography and improve the visual appearance of the interface.</p><h3>Online Resource</h3><p>Resources: <a href="https://github.com/codewithferdi-rgb/practical_mobile.git">https://github.com/codewithferdi-rgb/practical_mobile.git</a></p><p>🙌 Thanks for reading! If you found this helpful, give it a clap and follow for more beginner-friendly guides on Flutter Mobile Programming!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=37b16aba2a03" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Manually Slicing the Mindforge Dashboard Using HTML & TailwindCSS]]></title>
            <link>https://medium.com/@akun.ferdiyanto/manually-slicing-the-mindforge-dashboard-using-html-tailwindcss-aeb1139af35c?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/aeb1139af35c</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Wed, 04 Mar 2026 15:38:44 GMT</pubDate>
            <atom:updated>2026-03-11T14:32:19.431Z</atom:updated>
            <content:encoded><![CDATA[<h4>How I translated a complex SaaS dashboard design into clean, scalable frontend code.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2mECouKjZg3YqNMil73ntQ.png" /></figure><h3>Introduction</h3><p>Design to code is one of the most important skills for frontend engineers. In this article, I will explain how I manually convert the Mindforge web dashboard design (created in Figma) into HTML and TailwindCSS code.</p><h3>About the Project</h3><p><strong>Mindforge</strong> is a task and project management web application designed to help users:</p><ul><li>Manage daily tasks</li><li>Organize projects</li><li>Track performance</li><li>Visualize productivity trends</li></ul><p>The main focus of this article is the <strong>Dashboard and Task Board layout slicing process</strong>.</p><h3>Understanding the Design Before Writing Code</h3><p>Before touching the HTML code, I analyzed the layout structure in Figma to understand how each part of the interface worked. Through this process, I identified that the Mindforge dashboard was divided into several main sections:</p><ul><li>Fixed sidebar (left)</li><li>Top header section</li><li>Greeting section</li><li>Summary card</li><li>Statistics cards</li><li>Task board (Kanban style)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f-RBfY5X-A4rcoG6URB6pA.png" /></figure><h3>Tailwind Config Configuration</h3><p>To simplify the process of converting Figma designs into code, you can configure tailwind.config.js to include design tokens from Figma such as colors, font sizes, and spacing. By defining custom theme values, this is useful for ensuring visual consistency across layouts.</p><pre>theme: {<br>    extend: {<br>      fontFamily: {<br>        sans: [&#39;Inter&#39;, &#39;sans-serif&#39;],<br>      },<br><br>      fontWeight: {<br>        regular: &#39;400&#39;,<br>        medium: &#39;500&#39;,<br>        semibold: &#39;600&#39;,<br>        bold: &#39;700&#39;,<br>      },<br><br>      colors: {<br>        grey: {<br>          50:  &#39;#F8F8F8&#39;,<br>          100: &#39;#b8b8b8&#39;,<br>          200: &#39;#959595&#39;,<br>          300: &#39;#656565&#39;,<br>          400: &#39;#474747&#39;,<br>          500: &#39;#191919&#39;,<br>          600: &#39;#171717&#39;,<br>          700: &#39;#121212&#39;,<br>          800: &#39;#0e0e0e&#39;,<br>          900: &#39;#0b0b0b&#39;,<br>        }<br>      }<br><br>    },<br>  },</pre><h3>Building the Main Layout Structure</h3><p>The layout consists of two main sections: sidebar and main content</p><pre>&lt;body class=&quot;flex min-h-screen bg-white font-sans&quot;&gt;<br>    &lt;aside class=&quot;w-[260px] 2xl:w-[290px] flex flex-col justify-between shrink-0 px-3 py-6 border-r border-[#E5E7EB]&quot;&gt;<br>          &lt;!-- Sidebar --&gt;<br>    &lt;/aside&gt;<br>    &lt;main class=&quot;flex-1 flex-col flex gap-6&quot;&gt;<br>          &lt;!--- Main Content --&gt;<br>    &lt;/main&gt;<br>&lt;/body&gt;</pre><p>I used Flexbox because the overall layout is horizontal, with a fixed-width sidebar on the left and a main content area that needs to fill the remaining space by applying flex and flex-1.</p><h3>Slicing the Sidebar</h3><p>The sidebar functions as the main navigation anchor of the dashboard.</p><p>The sidebar includes:</p><ul><li>Logo</li><li>Navigation links</li><li>Section labels</li><li>Settings at the bottom</li></ul><p>To achieve this layout, I applied several key Tailwind utilities: flex flex-col, justify-between, min-h-screen. These utilities ensure the sidebar stacks its elements vertically, distributes space properly between the top and bottom sections.</p><pre>&lt;aside class=&quot;w-[260px] 2xl:w-[290px] flex flex-col justify-between shrink-0 px-3 py-6 border-r border-[#E5E7EB]&quot;&gt;<br>        &lt;div class=&quot;flex flex-col gap-6&quot;&gt;<br>            &lt;h2 class=&quot;text-xl pl-3 font-semibold text-grey-500&quot;&gt;<br>                Mindforge<br>            &lt;/h2&gt;<br><br>            &lt;nav class=&quot;space-y-4&quot;&gt;<br>                &lt;div&gt;<br>                    &lt;h3 class=&quot; font-semibold text-grey-500 mb-1 pl-3&quot;&gt;<br>                        Overview<br>                    &lt;/h3&gt;<br><br>                    &lt;a href=&quot;#&quot; class=&quot;flex items-center px-3 py-2 rounded-lg bg-grey-50 text-grey-500 mb-1&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/home.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;Dashboard&lt;/span&gt;<br>                    &lt;/a&gt;<br><br>                    &lt;a href=&quot;tasks.html&quot;<br>                        class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition mb-1&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/list.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;My Tasks&lt;/span&gt;<br>                    &lt;/a&gt;<br>                &lt;/div&gt;<br><br>                &lt;div&gt;<br>                    &lt;h3 class=&quot;font-semibold text-grey-500 mb-1 pl-3&quot;&gt;<br>                        Workspace<br>                    &lt;/h3&gt;<br><br>                    &lt;a href=&quot;#&quot;<br>                        class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition mb-1&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/Folder.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;Projects&lt;/span&gt;<br>                    &lt;/a&gt;<br><br>                    &lt;a href=&quot;#&quot;<br>                        class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition mb-1&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/Pin.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;Events&lt;/span&gt;<br>                    &lt;/a&gt;<br><br>                    &lt;a href=&quot;#&quot;<br>                        class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/Date_today.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;Calendar&lt;/span&gt;<br>                    &lt;/a&gt;<br>                &lt;/div&gt;<br><br>                &lt;div&gt;<br>                    &lt;h3 class=&quot; font-semibold text-grey-500 mb-1 pl-3&quot;&gt;<br>                        Insight<br>                    &lt;/h3&gt;<br><br>                    &lt;a href=&quot;#&quot;<br>                        class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition&quot;&gt;<br>                        &lt;img src=&quot;assets/icons/Frame 4.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                        &lt;span class=&quot;text-base font-medium&quot;&gt;Analytics&lt;/span&gt;<br>                    &lt;/a&gt;<br>                &lt;/div&gt;<br><br>            &lt;/nav&gt;<br>        &lt;/div&gt;<br><br><br>        &lt;div&gt;<br>            &lt;a href=&quot;#&quot; class=&quot;flex items-center px-3 py-2 rounded-lg hover:bg-grey-50 text-grey-500 transition&quot;&gt;<br>                &lt;img src=&quot;assets/icons/Setting_line.png&quot; class=&quot;w-5 h-5 mr-3&quot; /&gt;<br>                &lt;span class=&quot;text-base font-medium&quot;&gt;Settings&lt;/span&gt;<br>            &lt;/a&gt;<br>        &lt;/div&gt;<br>    &lt;/aside&gt;</pre><h3>Creating the Header</h3><p>After finishing with the sidebar, we then slice the header, which contains a search box and a create task button. At this stage, we use the tailwind css flex box utility with the space-between and items-center properties.</p><pre>&lt;div class=&quot;flex items-center justify-between px-6 py-3 sticky border-b border-[#E0E0E0]&quot;&gt;<br>            &lt;div class=&quot;flex items-center border border-[#E0E0E0] rounded-lg px-3 py-2 gap-2 focus-within:ring-1&quot;&gt;<br>                &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                    &lt;path<br>                        d=&quot;M11 19C15.4183 19 19 15.4183 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19Z&quot;<br>                        stroke=&quot;#828282&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; /&gt;<br>                    &lt;path d=&quot;M21.0004 21.0004L16.6504 16.6504&quot; stroke=&quot;#828282&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot;<br>                        stroke-linejoin=&quot;round&quot; /&gt;<br>                &lt;/svg&gt;<br><br>                &lt;input type=&quot;text&quot; placeholder=&quot;Search...&quot;<br>                    class=&quot;outline-none bg-transparent w-full font-regular text-[#828282] placeholder:text-[#828282]&quot;&gt;<br>            &lt;/div&gt;<br><br>            &lt;button id=&quot;openmodalTask&quot;<br>                class=&quot;bg-grey-500 text-white text-sm px-4 py-2.5 font-medium rounded-lg hover:opacity-90 transition&quot;&gt;<br>                Create Task<br>            &lt;/button&gt;<br>        &lt;/div&gt;</pre><h3>Adding the Greeting Section</h3><p>Right below the header, the dashboard includes a greeting section that personalizes the user experience.</p><p>Structurally, this section is relatively simple but important for the visual hierarchy. It consists of:</p><ul><li>A title (font text-5xl, semi-bold style)</li><li>A short descriptive paragraph</li><li>Notification icon</li></ul><pre>&lt;div class=&quot;flex items-start justify-between px-6&quot;&gt;<br>            &lt;div class=&quot;flex gap-1 flex-col&quot;&gt;<br>                &lt;h1 class=&quot;text-[40px] font-bold text-grey-500&quot;&gt;<br>                    Good morning, Emma Stone<br>                &lt;/h1&gt;<br>                &lt;p class=&quot;font-medium text-grey-300&quot;&gt;<br>                    You have 5 tasks due today and 2 upcoming events. Let&#39;s make progress.<br>                &lt;/p&gt;<br>            &lt;/div&gt;<br><br>            &lt;button<br>                class=&quot; rounded-full p-3 mt-3 border border-[#E0E0E0] flex items-center justify-center text-gray-400 hover:bg-gray-50 transition shrink-0&quot;&gt;<br>                &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                    &lt;path<br>                        d=&quot;M6.44784 7.96942C6.76219 5.14032 9.15349 3 12 3C14.8465 3 17.2378 5.14032 17.5522 7.96942L17.804 10.2356C17.8072 10.2645 17.8088 10.279 17.8104 10.2933C17.9394 11.4169 18.3051 12.5005 18.8836 13.4725C18.8909 13.4849 18.8984 13.4973 18.9133 13.5222L19.4914 14.4856C20.0159 15.3599 20.2782 15.797 20.2216 16.1559C20.1839 16.3946 20.061 16.6117 19.8757 16.7668C19.5971 17 19.0873 17 18.0678 17H5.93223C4.91268 17 4.40291 17 4.12434 16.7668C3.93897 16.6117 3.81609 16.3946 3.77841 16.1559C3.72179 15.797 3.98407 15.3599 4.50862 14.4856L5.08665 13.5222C5.10161 13.4973 5.10909 13.4849 5.11644 13.4725C5.69488 12.5005 6.06064 11.4169 6.18959 10.2933C6.19123 10.279 6.19283 10.2645 6.19604 10.2356L6.44784 7.96942Z&quot;<br>                        stroke=&quot;black&quot; /&gt;<br>                    &lt;path<br>                        d=&quot;M8 17C8 17.5253 8.10346 18.0454 8.30448 18.5307C8.5055 19.016 8.80014 19.457 9.17157 19.8284C9.54301 20.1999 9.98396 20.4945 10.4693 20.6955C10.9546 20.8965 11.4747 21 12 21C12.5253 21 13.0454 20.8965 13.5307 20.6955C14.016 20.4945 14.457 20.1999 14.8284 19.8284C15.1999 19.457 15.4945 19.016 15.6955 18.5307C15.8965 18.0454 16 17.5253 16 17&quot;<br>                        stroke=&quot;black&quot; stroke-linecap=&quot;round&quot; /&gt;<br>                &lt;/svg&gt;<br><br>            &lt;/button&gt;<br>        &lt;/div&gt;</pre><h3>Creating the Dashboard Summary Cards</h3><p>The statistics cards (Projects, Tasks, Events, Completion Rate) were built using flex box</p><pre>&lt;!-- Summary Card--&gt;<br>        &lt;div class=&quot;flex gap-3 px-6&quot;&gt;<br>            &lt;div class=&quot;flex-1 bg-white rounded-xl border border-[#E0E0E0] p-5 shadow-sm&quot;&gt;<br>                &lt;div class=&quot;text-sm font-bold text-[#111111] mb-2&quot;&gt;Active Projects&lt;/div&gt;<br>                &lt;div class=&quot;text-2xl font-bold text-[#111111] mb-1&quot;&gt;12 Projects&lt;/div&gt;<br>                &lt;div class=&quot;text-xs text-[#888888]&quot;&gt;+2 this month&lt;/div&gt;<br>            &lt;/div&gt;<br><br>            &lt;div class=&quot;flex-1 bg-white rounded-xl border border-[#E0E0E0] p-5 shadow-sm&quot;&gt;<br>                &lt;div class=&quot;text-sm font-bold text-[#111111] mb-2&quot;&gt;Open Tasks&lt;/div&gt;<br>                &lt;div class=&quot;text-2xl font-bold text-[#111111] mb-1&quot;&gt;48 Tasks&lt;/div&gt;<br>                &lt;div class=&quot;text-xs text-[#888888]&quot;&gt;+6 due today&lt;/div&gt;<br>            &lt;/div&gt;<br><br>            &lt;div class=&quot;flex-1 bg-white rounded-xl border border-[#E0E0E0] p-5 shadow-sm&quot;&gt;<br>                &lt;div class=&quot;text-sm font-bold text-[#111111] mb-2&quot;&gt;Upcoming Events&lt;/div&gt;<br>                &lt;div class=&quot;text-2xl font-bold text-[#111111] mb-1&quot;&gt;5 Events&lt;/div&gt;<br>                &lt;div class=&quot;text-xs text-[#888888]&quot;&gt;Next: Team Sync – 14:00&lt;/div&gt;<br>            &lt;/div&gt;<br><br>            &lt;div class=&quot;flex-1 bg-white rounded-xl border border-[#E0E0E0] p-5 shadow-sm&quot;&gt;<br>                &lt;div class=&quot;text-sm font-bold text-[#111111] mb-2&quot;&gt;Completion Rate&lt;/div&gt;<br>                &lt;div class=&quot;text-2xl font-bold text-[#111111] mb-1&quot;&gt;87%&lt;/div&gt;<br>                &lt;div class=&quot;text-xs text-[#888888]&quot;&gt;↑ 12% from last week&lt;/div&gt;<br>            &lt;/div&gt;<br>        &lt;/div&gt;<br>        &lt;!-- End Summary Card--&gt;</pre><h3>Adding the Today’s Tasks Section</h3><p>The <strong>Today’s Tasks</strong> section is designed to highlight priority work that needs immediate attention. Unlike the Kanban board, which focuses on workflow stages, this section emphasizes urgency and daily focus.</p><p>Structurally, it is built as a vertical list of task cards inside a container card. Each task item typically includes a title, short description, time or deadline, and status indicator.</p><p>This section uses a simple column layout with:</p><ul><li>flex flex-col</li><li>gap-4</li><li>bg-white</li><li>rounded-xl</li><li>p-6</li></ul><pre>&lt;!-- Today&#39;s Tasks --&gt;<br>        &lt;div class=&quot;w-[60%] bg-white rounded-xl border border-[#E0E0E0] p-6 shadow-sm&quot;&gt;<br>            &lt;h2 class=&quot;text-lg font-semibold mb-6 text-grey-500&quot;&gt;<br>                Today&#39;s Tasks<br>            &lt;/h2&gt;<br><br>            &lt;div class=&quot;space-y-6&quot;&gt;<br>                &lt;!-- Task 1 --&gt;<br>                &lt;div class=&quot;task-item flex justify-between items-start gap-4&quot;&gt;<br>                    &lt;div class=&quot;flex gap-3 items-start flex-1&quot;&gt;<br>                        &lt;input type=&quot;checkbox&quot; class=&quot;task-checkbox mt-1 w-4 h-4 accent-black&quot;&gt;<br>                        &lt;div&gt;<br>                            &lt;p class=&quot;task-title text-sm font-medium text-grey-500&quot;&gt;<br>                                Finalize onboarding flow UI<br>                            &lt;/p&gt;<br>                            &lt;p class=&quot;text-xs text-gray-400&quot;&gt;<br>                                Website Revamp<br>                            &lt;/p&gt;<br>                        &lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;flex items-center gap-3&quot;&gt;<br>                        &lt;span class=&quot;text-[11px] px-3 py-1 rounded-full bg-red-100 text-red-600 font-semibold&quot;&gt;<br>                            High Priority<br>                        &lt;/span&gt;<br><br>                        &lt;span class=&quot;task-due text-xs text-gray-400&quot;&gt;<br>                            • Due 10:00 AM<br>                        &lt;/span&gt;<br><br>                        &lt;span class=&quot;task-completed text-xs text-gray-400 hidden&quot;&gt;<br>                            Completed<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br>                &lt;!-- Task 2 --&gt;<br>                &lt;div class=&quot;task-item flex justify-between items-start gap-4&quot;&gt;<br>                    &lt;div class=&quot;flex gap-3 items-start flex-1&quot;&gt;<br>                        &lt;input type=&quot;checkbox&quot; class=&quot;task-checkbox mt-1 w-4 h-4 accent-black&quot;&gt;<br><br>                        &lt;div&gt;<br>                            &lt;p class=&quot;task-title text-sm font-medium text-grey-500&quot;&gt;<br>                                Draft weekly performance report<br>                            &lt;/p&gt;<br>                            &lt;p class=&quot;text-xs text-gray-400&quot;&gt;<br>                                Operations<br>                            &lt;/p&gt;<br>                        &lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;flex items-center gap-3&quot;&gt;<br>                        &lt;span class=&quot;text-[11px] px-3 py-1 rounded-full bg-green-100 text-green-600 font-semibold&quot;&gt;<br>                            Low Priority<br>                        &lt;/span&gt;<br>                        &lt;span class=&quot;task-due text-xs text-gray-400&quot;&gt;<br>                            • Due 05:00 PM<br>                        &lt;/span&gt;<br>                        &lt;span class=&quot;task-completed text-xs text-gray-400 hidden&quot;&gt;<br>                            Completed<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br><br>                &lt;/div&gt;<br><br><br>                &lt;!-- Task 3 --&gt;<br>                &lt;div class=&quot;task-item flex justify-between items-start gap-4&quot;&gt;<br>                    &lt;div class=&quot;flex gap-3 items-start flex-1&quot;&gt;<br>                        &lt;input type=&quot;checkbox&quot; class=&quot;task-checkbox mt-1 w-4 h-4 accent-black&quot;&gt;<br>                        &lt;div&gt;<br>                            &lt;p class=&quot;task-title text-sm font-medium text-grey-500&quot;&gt;<br>                                Prepare pitch deck for investor meeting<br>                            &lt;/p&gt;<br>                            &lt;p class=&quot;text-xs text-gray-400&quot;&gt;<br>                                Fundraising Q1<br>                            &lt;/p&gt;<br>                        &lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;flex items-center gap-3&quot;&gt;<br>                        &lt;span class=&quot;text-[11px] px-3 py-1 rounded-full bg-red-100 text-red-600 font-semibold&quot;&gt;<br>                            High Priority<br>                        &lt;/span&gt;<br>                        &lt;span class=&quot;task-due text-xs text-gray-400&quot;&gt;<br>                            • Due 01:30 PM<br>                        &lt;/span&gt;<br><br>                        &lt;span class=&quot;task-completed text-xs text-gray-400 hidden&quot;&gt;<br>                            Completed<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br>            &lt;/div&gt;<br>        &lt;/div&gt;</pre><h3>Adding the Upcoming Events Section</h3><p>The <strong>Upcoming Events</strong> section complements task management by displaying scheduled activities such as meetings, and deadlines.</p><pre>&lt;div class=&quot;w-[40%] bg-white rounded-xl border border-[#E0E0E0] p-6 shadow-sm&quot;&gt;<br>            &lt;h2 class=&quot;text-lg font-semibold mb-6 text-grey-500&quot;&gt;<br>                Upcoming Events<br>            &lt;/h2&gt;<br><br>            &lt;div class=&quot;space-y-6 relative pl-6&quot;&gt;<br>                &lt;!-- Timeline vertical line --&gt;<br>                &lt;div class=&quot;absolute left-[7px] top-1 bottom-1 w-[2px] bg-gray-200&quot;&gt;&lt;/div&gt;<br><br>                &lt;!-- Event 1 --&gt;<br>                &lt;div class=&quot;flex items-start gap-4 relative&quot;&gt;<br>                    &lt;div class=&quot;relative&quot;&gt;<br>                        &lt;span class=&quot;w-3 h-3 bg-green-500 rounded-full block&quot;&gt;&lt;/span&gt;<br>                    &lt;/div&gt;<br>                    &lt;div&gt;<br>                        &lt;p class=&quot;text-sm font-medium text-grey-500&quot;&gt;<br>                            Today, 14:00 – 15:00<br>                        &lt;/p&gt;<br>                        &lt;span class=&quot;inline-block mt-2 text-xs px-3 py-1 rounded-full bg-gray-100 text-gray-500&quot;&gt;<br>                            Team Sync Meeting<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br><br>                &lt;/div&gt;<br><br>                &lt;!-- Event 2 --&gt;<br>                &lt;div class=&quot;flex items-start gap-4 relative&quot;&gt;<br>                    &lt;div class=&quot;relative&quot;&gt;<br>                        &lt;span class=&quot;w-3 h-3 bg-green-500 rounded-full block&quot;&gt;&lt;/span&gt;<br>                    &lt;/div&gt;<br>                    &lt;div&gt;<br>                        &lt;p class=&quot;text-sm font-medium text-grey-500&quot;&gt;<br>                            26 Feb, 10:00 AM<br>                        &lt;/p&gt;<br>                        &lt;span class=&quot;inline-block mt-2 text-xs px-3 py-1 rounded-full bg-gray-100 text-gray-500&quot;&gt;<br>                            Investor Pitch Review<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br><br>                &lt;!-- Event 3 --&gt;<br>                &lt;div class=&quot;flex items-start gap-4 relative&quot;&gt;<br>                    &lt;div class=&quot;relative&quot;&gt;<br>                        &lt;span class=&quot;w-3 h-3 bg-green-500 rounded-full block&quot;&gt;&lt;/span&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div&gt;<br>                        &lt;p class=&quot;text-sm font-medium text-grey-500&quot;&gt;<br>                            27 Feb • 01:30 PM<br>                        &lt;/p&gt;<br>                        &lt;span class=&quot;inline-block mt-2 text-xs px-3 py-1 rounded-full bg-gray-100 text-gray-500&quot;&gt;<br>                            Product Roadmap Planning<br>                        &lt;/span&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br>            &lt;/div&gt;<br>        &lt;/div&gt;</pre><h3>Implementing the Chart Section</h3><p>The chart section provides visual insight into productivity trends and task completion rates.</p><pre>&lt;!-- Grafik --&gt;<br><br>        &lt;div class=&quot;flex gap-6 px-6&quot;&gt;<br><br>            &lt;div class=&quot;w-[60%] bg-white rounded-xl border border-[#E0E0E0] p-6 pb-12 relative shadow-sm&quot;&gt;<br>                &lt;h2 class=&quot;text-lg font-semibold mb-6 text-grey-500&quot;&gt;Task Completion Trend&lt;/h2&gt;<br><br>                &lt;div class=&quot;relative mx-2 h-48&quot;&gt;<br><br>                    &lt;div class=&quot;absolute inset-0 flex flex-col justify-between&quot;&gt;<br>                        &lt;div class=&quot;relative border-t border-gray-100 w-full h-0&quot;&gt;<br>                            &lt;span class=&quot;absolute -top-3 -left-2 text-gray-400 text-xs&quot;&gt;22&lt;/span&gt;<br>                        &lt;/div&gt;<br>                        &lt;div class=&quot;relative border-t border-gray-100 w-full h-0&quot;&gt;<br>                            &lt;span class=&quot;absolute -top-3 -left-2 text-gray-400 text-xs&quot;&gt;22&lt;/span&gt;<br>                        &lt;/div&gt;<br>                        &lt;div class=&quot;relative border-t border-gray-100 w-full h-0&quot;&gt;<br>                            &lt;span class=&quot;absolute -top-3 -left-2 text-gray-400 text-xs&quot;&gt;19&lt;/span&gt;<br>                        &lt;/div&gt;<br>                        &lt;div class=&quot;relative border-t border-gray-100 w-full h-0&quot;&gt;<br>                            &lt;span class=&quot;absolute -top-3 -left-2 text-gray-400 text-xs&quot;&gt;25&lt;/span&gt;<br>                        &lt;/div&gt;<br>                        &lt;div class=&quot;relative border-t border-gray-100 w-full h-0&quot;&gt;<br>                            &lt;span class=&quot;absolute -top-3 -left-2 text-gray-400 text-xs&quot;&gt;28&lt;/span&gt;<br>                        &lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;svg viewBox=&quot;0 0 512 207&quot; class=&quot;absolute inset-0 w-full h-full overflow-visible&quot; fill=&quot;none&quot;<br>                        preserveAspectRatio=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                        &lt;path<br>                            d=&quot;M493 19L429.643 79.2087C429.135 79.6908 428.42 79.8841 427.739 79.7228L400.544 73.2744C400.044 73.1559 399.519 73.2276 399.069 73.4754L261.212 149.407C260.692 149.693 260.075 149.743 259.517 149.543L227.747 138.181C227.186 137.98 226.565 138.031 226.044 138.321L126.21 193.889C125.969 194.023 125.704 194.108 125.43 194.138L26.3545 205L2 205&quot;<br>                            stroke=&quot;black&quot; stroke-width=&quot;5&quot; stroke-linecap=&quot;round&quot; /&gt;<br><br>                        &lt;circle cx=&quot;493&quot; cy=&quot;19&quot; r=&quot;6&quot; fill=&quot;black&quot; /&gt;<br>                        &lt;circle opacity=&quot;0.1&quot; cx=&quot;493&quot; cy=&quot;19&quot; r=&quot;18&quot; fill=&quot;black&quot; /&gt;<br>                    &lt;/svg&gt;<br><br>                    &lt;div class=&quot;absolute -bottom-10 left-0 right-0 flex justify-between text-[11px] text-gray-400&quot;&gt;<br>                        &lt;span&gt;23 Nov&lt;/span&gt;<br>                        &lt;span&gt;24 Feb&lt;/span&gt;<br>                        &lt;span&gt;25 Feb&lt;/span&gt;<br>                        &lt;span&gt;26 Feb&lt;/span&gt;<br>                        &lt;span&gt;27 Feb&lt;/span&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br>            &lt;/div&gt;<br><br>            &lt;div class=&quot;w-[40%] bg-white rounded-xl border border-[#E0E0E0] p-6&quot;&gt;<br>                &lt;h2 class=&quot;text-lg font-semibold mb-6 text-grey-500&quot;&gt;Task Distribution by Project&lt;/h2&gt;<br><br>                &lt;div class=&quot;space-y-6&quot;&gt;<br>                    &lt;div class=&quot;bg-gray-100 rounded-full h-6&quot;&gt;<br>                        &lt;div class=&quot;bg-grey-500 h-6 rounded-full w-[70%]&quot;&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;bg-gray-100 rounded-full h-6&quot;&gt;<br>                        &lt;div class=&quot;bg-grey-500 h-6 rounded-full w-[85%]&quot;&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;bg-gray-100 rounded-full h-6&quot;&gt;<br>                        &lt;div class=&quot;bg-grey-500 h-6 rounded-full w-[60%]&quot;&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;bg-gray-100 rounded-full h-6&quot;&gt;<br>                        &lt;div class=&quot;bg-grey-500 h-6 rounded-full w-[90%]&quot;&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;bg-gray-100 rounded-full h-6&quot;&gt;<br>                        &lt;div class=&quot;bg-grey-500 h-6 rounded-full w-[50%]&quot;&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br>            &lt;/div&gt;<br><br>        &lt;/div&gt;<br><br>        &lt;!-- End Grafik --&gt;</pre><h3>Task Board (Kanban Layout)</h3><p>The task board section was structured using Flexbox to create a horizontal layout consisting of three columns: <strong>To Do</strong>, <strong>In Progress</strong>, and <strong>Completed</strong>, allowing tasks to be organized clearly based on their workflow status.</p><pre>&lt;main class=&quot;flex-1 p-6 flex-col flex gap-6 min-h-screen&quot;&gt;<br><br>        &lt;div class=&quot;bg-[#F7F7F7] font-medium text-grey-500 flex justify-between items-center rounded-lg w-fit p-1.5&quot;&gt;<br>            &lt;a class=&quot;px-2.5 py-1&quot; href=&quot;index.html&quot;&gt;Mindforge&lt;/a&gt;<br>            &lt;a class=&quot;px-2.5 py-1 rounded bg-white&quot; href=&quot;tasks.html&quot;&gt;My Tasks&lt;/a&gt;<br>        &lt;/div&gt;<br><br>        &lt;div class=&quot;flex justify-between items-center&quot;&gt;<br>            &lt;form action=&quot;&quot; class=&quot;relative w-[405px]&quot;&gt;<br>                &lt;div<br>                    class=&quot;flex items-center border border-[#E0E0E0] rounded-lg px-3 py-2 gap-2 focus-within:ring-1 focus-within:ring-grey-500&quot;&gt;<br>                    &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                        &lt;path<br>                            d=&quot;M11 19C15.4183 19 19 15.4183 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19Z&quot;<br>                            stroke=&quot;#828282&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; /&gt;<br>                        &lt;path d=&quot;M21.0004 21.0004L16.6504 16.6504&quot; stroke=&quot;#828282&quot; stroke-width=&quot;2&quot;<br>                            stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; /&gt;<br>                    &lt;/svg&gt;<br>                    &lt;input type=&quot;text&quot; placeholder=&quot;Search tasks...&quot;<br>                        class=&quot;outline-none bg-transparent w-full font-regular text-[#828282] placeholder:text-[#828282]&quot;&gt;<br>                &lt;/div&gt;<br>            &lt;/form&gt;<br><br>            &lt;div<br>                class=&quot;flex  flex-row gap-3 items-center px-3 py-2 border border-[#E0E0E0] text-[#828282] rounded-lg cursor-pointer&quot;&gt;<br>                &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                    &lt;path d=&quot;M22 3H2L10 12.46V19L14 21V12.46L22 3Z&quot; stroke=&quot;#828282&quot; stroke-width=&quot;2&quot;<br>                        stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; /&gt;<br>                &lt;/svg&gt;<br>                &lt;p&gt;Filter&lt;/p&gt;<br>            &lt;/div&gt;<br>        &lt;/div&gt;<br><br>        &lt;div class=&quot;flex flex-1 gap-6 w-full&quot;&gt;<br><br>            &lt;div<br>                class=&quot;task-column w-full border font-medium flex gap-3 flex-col text-grey-500 border-[#E0E0E0] bg-[#FDFDFD] rounded-lg px-4 py-3 &quot;&gt;<br>                &lt;div class=&quot;flex justify-between mb-2&quot;&gt;<br>                    &lt;div class=&quot;flex flex-row gap-2 items-center&quot;&gt;<br>                        &lt;svg width=&quot;8&quot; height=&quot;8&quot; viewBox=&quot;0 0 8 8&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                            &lt;rect width=&quot;8&quot; height=&quot;8&quot; rx=&quot;4&quot; fill=&quot;#191919&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                        &lt;div&gt; To Do &lt;span class=&quot;text-grey-200&quot;&gt;(8)&lt;/span&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;border border-[#E0E0E0] rounded-full p-1.5&quot;&gt;<br>                        &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                            &lt;path<br>                                d=&quot;M12 2.67188C12.2859 2.67188 12.5605 2.78512 12.7627 2.9873C12.9649 3.18949 13.0781 3.46406 13.0781 3.75V10.9219H20.25C20.5359 10.9219 20.8105 11.0351 21.0127 11.2373C21.2149 11.4395 21.3281 11.7141 21.3281 12C21.3281 12.2859 21.2149 12.5605 21.0127 12.7627C20.8105 12.9649 20.5359 13.0781 20.25 13.0781H13.0781V20.25C13.0781 20.5359 12.9649 20.8105 12.7627 21.0127C12.5605 21.2149 12.2859 21.3281 12 21.3281C11.7141 21.3281 11.4395 21.2149 11.2373 21.0127C11.0351 20.8105 10.9219 20.5359 10.9219 20.25V13.0781H3.75C3.46406 13.0781 3.18949 12.9649 2.9873 12.7627C2.78512 12.5605 2.67188 12.2859 2.67188 12C2.67188 11.7141 2.78512 11.4395 2.9873 11.2373C3.18949 11.0351 3.46406 10.9219 3.75 10.9219H10.9219V3.75C10.9219 3.46406 11.0351 3.18949 11.2373 2.9873C11.4395 2.78512 11.7141 2.67188 12 2.67188Z&quot;<br>                                fill=&quot;#656565&quot; stroke=&quot;#959595&quot; stroke-width=&quot;0.09375&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br><br>                &lt;div class=&quot;task-list flex flex-col gap-3 min-h-[50px]&quot;&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-grey-50 w-fit px-3 text-[12px] font-medium text-grey-500 py-1 rounded-full&quot;&gt;<br>                            Important<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;UI/UX Design in the age of AI&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Review dan evaluasi anggaran bulanan&lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-[#FFFBEB] w-fit px-3 text-[12px] font-medium text-[#F59E0B] py-1 rounded-full&quot;&gt;OK<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Research User Persona&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Menganalisis target audiens untuk proyek baru<br>                        &lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-[#FFF1F2] w-fit px-3 text-[12px] font-medium text-[#F43F5E] py-1 rounded-full&quot;&gt;Not<br>                            that<br>                            important&lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Update Documentation&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Merapikan file dokumentasi sprint minggu lalu<br>                        &lt;/p&gt;<br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br><br>            &lt;/div&gt;<br><br>            &lt;div<br>                class=&quot;task-column w-full border font-medium flex gap-3 flex-col text-grey-500 border-[#E0E0E0] bg-[#FDFDFD] rounded-lg px-4 py-3 &quot;&gt;<br>                &lt;div class=&quot;flex justify-between mb-2&quot;&gt;<br>                    &lt;div class=&quot;flex flex-row gap-2 items-center&quot;&gt;<br>                        &lt;svg width=&quot;8&quot; height=&quot;8&quot; viewBox=&quot;0 0 8 8&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                            &lt;rect width=&quot;8&quot; height=&quot;8&quot; rx=&quot;4&quot; fill=&quot;#F59E0B&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                        &lt;div&gt; In Proggres &lt;span class=&quot;text-grey-200&quot;&gt;(8)&lt;/span&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;border border-[#E0E0E0] rounded-full p-1.5&quot;&gt;<br>                        &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot;<br>                            xmlns=&quot;http://www.w3.org/2000/svg overflow-hidden&quot;&gt;<br>                            &lt;path<br>                                d=&quot;M12 2.67188C12.2859 2.67188 12.5605 2.78512 12.7627 2.9873C12.9649 3.18949 13.0781 3.46406 13.0781 3.75V10.9219H20.25C20.5359 10.9219 20.8105 11.0351 21.0127 11.2373C21.2149 11.4395 21.3281 11.7141 21.3281 12C21.3281 12.2859 21.2149 12.5605 21.0127 12.7627C20.8105 12.9649 20.5359 13.0781 20.25 13.0781H13.0781V20.25C13.0781 20.5359 12.9649 20.8105 12.7627 21.0127C12.5605 21.2149 12.2859 21.3281 12 21.3281C11.7141 21.3281 11.4395 21.2149 11.2373 21.0127C11.0351 20.8105 10.9219 20.5359 10.9219 20.25V13.0781H3.75C3.46406 13.0781 3.18949 12.9649 2.9873 12.7627C2.78512 12.5605 2.67188 12.2859 2.67188 12C2.67188 11.7141 2.78512 11.4395 2.9873 11.2373C3.18949 11.0351 3.46406 10.9219 3.75 10.9219H10.9219V3.75C10.9219 3.46406 11.0351 3.18949 11.2373 2.9873C11.4395 2.78512 11.7141 2.67188 12 2.67188Z&quot;<br>                                fill=&quot;#656565&quot; stroke=&quot;#959595&quot; stroke-width=&quot;0.09375&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br><br>                &lt;div class=&quot;task-list flex flex-col gap-3 min-h-[50px]&quot;&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-grey-50 w-fit px-3 text-[12px] font-medium text-grey-500 py-1 rounded-full&quot;&gt;<br>                            Important<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Final Prototype Review&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Presentasi hasil akhir desain ke stakeholder<br>                        &lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-[#FFFBEB] w-fit px-3 text-[12px] font-medium text-[#F59E0B] py-1 rounded-full&quot;&gt;OK<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Asset Exporting&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Menyiapkan aset gambar untuk tim developer&lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                &lt;/div&gt;<br>            &lt;/div&gt;<br><br>            &lt;div<br>                class=&quot;task-column w-full border font-medium flex gap-3 flex-col text-grey-500 border-[#E0E0E0] bg-[#FDFDFD] rounded-lg px-4 py-3&quot;&gt;<br>                &lt;div class=&quot;flex justify-between mb-2&quot;&gt;<br>                    &lt;div class=&quot;flex flex-row gap-2 items-center&quot;&gt;<br>                        &lt;svg width=&quot;8&quot; height=&quot;8&quot; viewBox=&quot;0 0 8 8&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                            &lt;rect width=&quot;8&quot; height=&quot;8&quot; rx=&quot;4&quot; fill=&quot;#22C55E&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                        &lt;div&gt; Completed &lt;span class=&quot;text-grey-200&quot;&gt;(8)&lt;/span&gt;&lt;/div&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div class=&quot;border border-[#E0E0E0] rounded-full p-1.5&quot;&gt;<br>                        &lt;svg width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;<br>                            &lt;path<br>                                d=&quot;M12 2.67188C12.2859 2.67188 12.5605 2.78512 12.7627 2.9873C12.9649 3.18949 13.0781 3.46406 13.0781 3.75V10.9219H20.25C20.5359 10.9219 20.8105 11.0351 21.0127 11.2373C21.2149 11.4395 21.3281 11.7141 21.3281 12C21.3281 12.2859 21.2149 12.5605 21.0127 12.7627C20.8105 12.9649 20.5359 13.0781 20.25 13.0781H13.0781V20.25C13.0781 20.5359 12.9649 20.8105 12.7627 21.0127C12.5605 21.2149 12.2859 21.3281 12 21.3281C11.7141 21.3281 11.4395 21.2149 11.2373 21.0127C11.0351 20.8105 10.9219 20.5359 10.9219 20.25V13.0781H3.75C3.46406 13.0781 3.18949 12.9649 2.9873 12.7627C2.78512 12.5605 2.67188 12.2859 2.67188 12C2.67188 11.7141 2.78512 11.4395 2.9873 11.2373C3.18949 11.0351 3.46406 10.9219 3.75 10.9219H10.9219V3.75C10.9219 3.46406 11.0351 3.18949 11.2373 2.9873C11.4395 2.78512 11.7141 2.67188 12 2.67188Z&quot;<br>                                fill=&quot;#656565&quot; stroke=&quot;#959595&quot; stroke-width=&quot;0.09375&quot; /&gt;<br>                        &lt;/svg&gt;<br><br>                    &lt;/div&gt;<br>                &lt;/div&gt;<br><br>                &lt;div class=&quot;task-list flex flex-col gap-3 min-h-[50px]&quot;&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-[#FFFBEB] w-fit px-3 text-[12px] font-medium text-[#F59E0B] py-1 rounded-full&quot;&gt;OK<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Benchmarking Competitors&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Melihat fitur-fitur unggulan dari kompetitor<br>                            sejenis&lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-grey-50 w-fit px-3 text-[12px] font-medium text-grey-500 py-1 rounded-full&quot;&gt;<br>                            Important<br>                        &lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Fixing Design Debt&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Memperbaiki inkonsistensi komponen pada sistem<br>                            desain&lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                    &lt;div<br>                        class=&quot;task-card cursor-move w-full flex flex-col gap-3 p-3 border border-[#E0E0E0] rounded-lg&quot;&gt;<br>                        &lt;p class=&quot;bg-[#FFF1F2] w-fit px-3 text-[12px] font-medium text-[#F43F5E] py-1 rounded-full&quot;&gt;Not<br>                            that<br>                            important&lt;/p&gt;<br>                        &lt;h3 class=&quot;font-medium text-grey-500&quot;&gt;Weekly Sync Meeting&lt;/h3&gt;<br>                        &lt;p class=&quot;text-grey-300 text-[15px] font-regular&quot;&gt;Rapat rutin mingguan untuk sinkronisasi tugas<br>                        &lt;/p&gt;<br>                    &lt;/div&gt;<br><br>                &lt;/div&gt;<br>            &lt;/div&gt;<br>        &lt;/div&gt;<br><br>    &lt;/main&gt;</pre><h3>Adding Interactivity with JavaScript</h3><p>After finishing the manual slicing of the dashboard using <strong>HTML and TailwindCSS</strong>, the next step is adding interactivity to make the interface feel more like a real application.</p><p>In this project, JavaScript is used for several key features:</p><ul><li>Opening and closing the task panel (modal sidebar)</li><li>Highlighting the active navigation link</li><li>Changing navbar style on scroll</li><li>Enabling drag-and-drop task management using SortableJS</li></ul><h4>Task Panel</h4><p>One of the interactive elements in the dashboard is a <strong>slide-in task panel</strong>. This panel appears from the right side when the user clicks the <strong>Add Task</strong> button and can be closed using the close button, clicking outside the panel, or pressing the <strong>Escape</strong> key.</p><p>This behavior is implemented by toggling Tailwind utility classes like hidden and translate-x-full.</p><pre>const overlay = document.getElementById(&quot;taskPanelOverlay&quot;);<br>const panel = document.getElementById(&quot;taskPanel&quot;);<br>const openBtn = document.getElementById(&quot;openmodalTask&quot;);<br>const closeBtn = document.getElementById(&quot;closeTaskPanel&quot;);<br><br>function openPanel() {<br>    overlay.classList.remove(&quot;hidden&quot;);<br>    setTimeout(() =&gt; {<br>        panel.classList.remove(&quot;translate-x-full&quot;);<br>    }, 10);<br>}<br><br>function closePanel() {<br>    panel.classList.add(&quot;translate-x-full&quot;);<br>    setTimeout(() =&gt; {<br>        overlay.classList.add(&quot;hidden&quot;);<br>    }, 300);<br>}<br><br>openBtn?.addEventListener(&quot;click&quot;, openPanel);<br>closeBtn?.addEventListener(&quot;click&quot;, closePanel);<br><br>overlay.addEventListener(&quot;click&quot;, (e) =&gt; {<br>    if (!panel.contains(e.target)) {<br>        closePanel();<br>    }<br>});<br><br>document.addEventListener(&quot;keydown&quot;, (e) =&gt; {<br>    if (e.key === &quot;Escape&quot;) {<br>        closePanel();<br>    }<br>});</pre><h4>Active Navigation Highlight</h4><p>To improve navigation clarity, the sidebar automatically highlights the current page. This is done by comparing the current URL path with the href attribute of each navigation link.</p><pre>document.addEventListener(&quot;DOMContentLoaded&quot;, function () {<br>    const currentPath = window.location.pathname.split(&quot;/&quot;).pop();<br><br>    const navLinks = document.querySelectorAll(&quot;#sidebar-nav a&quot;);<br><br>    navLinks.forEach(link =&gt; {<br>        const linkPath = link.getAttribute(&quot;href&quot;);<br><br>        if (currentPath === linkPath) {<br>            link.classList.add(&quot;bg-grey-50&quot;);<br>            link.classList.remove(&quot;text-grey-500&quot;);<br>            link.classList.add(&quot;text-[#191919]&quot;);<br>        } else {<br>            link.classList.remove(&quot;bg-grey-50&quot;);<br>            link.classList.add(&quot;text-grey-500&quot;);<br>        }<br>    });<br>});</pre><h4>Dynamic Navbar on Scroll</h4><p>To enhance the visual hierarchy of the page, the navbar changes appearance when the user scrolls down. A background color and subtle shadow are added to make the navigation bar more visible.</p><pre>const navbar = document.getElementById(&quot;navbar&quot;);<br><br>window.addEventListener(&quot;scroll&quot;, () =&gt; {<br>    if (window.scrollY &gt; 10) {<br>        navbar.classList.add(&#39;bg-white&#39;, &#39;shadow-sm&#39;)<br>    } else {<br>        navbar.classList.remove(&#39;bg-white&#39;, &#39;shadow-sm&#39;)<br>    }<br>});</pre><h4>Drag-and-Drop Kanban Board (SortableJS)</h4><p>To simulate real task management functionality, the dashboard uses <strong>SortableJS</strong> to enable drag-and-drop interactions between task columns.</p><pre>document.addEventListener(&quot;DOMContentLoaded&quot;, function () {<br><br>    const columns = document.querySelectorAll(&#39;.task-list&#39;);<br><br>    columns.forEach(list =&gt; {<br>        new Sortable(list, {<br>            group: &#39;kanban&#39;,<br>            animation: 200,<br>            ghostClass: &#39;opacity-40&#39;,<br>            forceFallback: true,<br>            dragClass: &#39;rotate-1 scale-105&#39;,<br>        });<br>    });<br><br>});</pre><p>SortableJS is loaded via CDN:</p><pre>&lt;script src=&quot;https://cdn.jsdelivr.net/npm/sortablejs@1.15.2/Sortable.min.js&quot;&gt;&lt;/script&gt;</pre><h3>Final Result</h3><p>After translating the design structure into HTML and TailwindCSS, the Mindforge dashboard is now fully structured with a fixed sidebar, responsive main content area, reusable card components, and a clean Kanban task board layout.</p><p>Below is the final rendered result:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nBS3zFpFNjgzaST1eRcr5Q.gif" /></figure><h3>Conclusion</h3><p>Manually slicing the Mindforge dashboard from Figma into HTML and TailwindCSS strengthened my understanding of layout structure, spacing systems, and component-based thinking.</p><p>Online Resource: <a href="https://github.com/HFOURM/mindforge.git">https://github.com/HFOURM/mindforge.git</a></p><p>Our Team: <a href="https://medium.com/u/71b862b1b80a">Hammam Al Rosyid Mudhoffar</a> <a href="https://medium.com/u/d33bfc32cdd7">Septianadaw</a> <a href="https://medium.com/u/3d1835549049">Evellyn Liena</a> <a href="https://medium.com/u/67100baaf181">Nadhifatus Zalfa A</a></p><p>🙌 <strong>Thanks for reading!</strong> If you found this helpful, give it a clap and follow for more beginner-friendly guides on <strong>Web Programming!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aeb1139af35c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter Layout Deep Dive: How to Control Spacing, Size, and Alignment Properly]]></title>
            <link>https://medium.com/@akun.ferdiyanto/flutter-layout-deep-dive-how-to-control-spacing-size-and-alignment-properly-17784338451a?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/17784338451a</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Fri, 27 Feb 2026 13:55:46 GMT</pubDate>
            <atom:updated>2026-03-02T12:31:01.429Z</atom:updated>
            <content:encoded><![CDATA[<h4>A practical guide to building structured and responsive UI using Flutter layout widgets.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nVm3aCzkxWCent0YOuzj3A.png" /></figure><h3>Introduction</h3><p>When building user interfaces (UI) in Flutter, layout is everything. You can have neat business logic and beautiful colors, but if spacing, alignment, and structure are not handled properly, your UI will feel broken.</p><p>In this article, we’ll break down Flutter’s layout system and master essential widgets such as Padding, Container, SizedBox, Row, Column, and alignment properties.</p><h3>How Flutter Layout System Works</h3><p>Before discussing specific widgets, we must understand the core principles of the Flutter layout system:</p><p>Flutter follows a very important rule: Constraints go down. Sizes go up. Parent sets position.</p><p>Here’s what that means:</p><ol><li>The parent widget provides constraints to the child (maximum width, height).</li><li>The child chooses its size within those constraints.</li><li>The parent determines the child’s position.</li></ol><p>Unlike CSS, the child cannot freely determine its size outside the constraints provided by the parent. That’s why understanding constraints is so important to avoid layout errors such as overflow.</p><h3>Spacing in Flutter: Padding vs Margin</h3><p>Spacing is one of the most fundamental aspects of UI design.</p><p>Padding creates space <strong>inside</strong> a widget, between the widget’s content and its boundary.</p><p>Example:</p><pre>Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.blueGrey,<br>                height: 200,<br>                child: Text(&quot;My Container1&quot;),<br>              ),</pre><p>Common EdgeInsets options:</p><ul><li>EdgeInsets.all(10) → same padding on all sides</li><li>EdgeInsets.symmetric(horizontal: 20, vertical: 10)</li><li>EdgeInsets.only(left: 8, top: 12)</li></ul><p>Flutter does not have a standalone Margin widget like CSS. Instead, margin is applied using the Container widget:</p><pre>Container(<br>  margin: EdgeInsets.all(16),<br>  child: Text(&quot;Hello&quot;),<br>)</pre><h3>Controlling Size: Width, Height, and Constraints</h3><p>You can define size directly:</p><pre>Container(<br>  width: 200,<br>  height: 100,<br>  color: Colors.blue,<br>)</pre><p>However, the size must respect the parent’s constraints.</p><p>SizeBox is a lightweight widget used purely for defining size or spacing.</p><pre>SizedBox(<br>  width: 15,<br>  height: 200,<br>)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gVy9rK_lOnLj1w8r59NhpA.png" /></figure><h3>Layout Structure: Column and Row</h3><p>To properly understand Row and Column, you need to understand the concept of axes in Flutter layout.</p><p>Every Row and Column operates on two directions: the main axis and the cross axis. The main axis represents the primary direction in which children are arranged, while the cross axis represents the perpendicular direction.</p><p>In a Column, widgets are arranged vertically. This means the main axis runs from top to bottom, and the cross axis runs horizontally from left to right.</p><pre>body: Column(  <br>            mainAxisAlignment: MainAxisAlignment.spaceBetween,<br>            children: [<br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.blueGrey,<br>                height: 200,<br>                child: Text(&quot;My Container1&quot;),<br>              ),<br><br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.amber,<br>                height: 200,<br>                child: Text(&quot;My Container2&quot;),<br>              ),<br><br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.pinkAccent,<br>                height: 200,<br>                child: Text(&quot;My Container3&quot;),<br>              ),<br>            ],<br>          ),</pre><p>In a Row, the behavior is reversed. Widgets are arranged horizontally, so the main axis runs from left to right, while the cross axis runs vertically from top to bottom.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k_7UnUAIPuGBlvCADsmJag.png" /></figure><pre>body: Row(  <br>            crossAxisAlignment: CrossAxisAlignment.stretch,<br>            children: [<br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.blueGrey,<br>                height: 200,<br>                child: Text(&quot;My Container1&quot;),<br>              ),<br><br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.amber,<br>                height: 200,<br>                child: Text(&quot;My Container2&quot;),<br>              ),<br><br>              Container(<br>                padding: EdgeInsets.all(10),<br>                color: Colors.pinkAccent,<br>                height: 340,<br>                child: Text(&quot;My Container3&quot;),<br>              ),<br>            ],<br>          ),</pre><p>Understanding this distinction is extremely important because properties like mainAxisAlignment and crossAxisAlignment depend entirely on these axis directions. If you misunderstand the axis orientation, your alignment settings will not behave as expected.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k_7UnUAIPuGBlvCADsmJag.png" /></figure><h3>Alignment in Flutter</h3><p>Alignment inside Row and Column is controlled primarily through two properties: mainAxisAlignment and crossAxisAlignment.</p><p>The mainAxisAlignment property controls how children are distributed along the main axis. Depending on the value you choose, widgets can be positioned at the start, centered, placed at the end, or distributed with different spacing strategies such as space between them, space around them, or evenly across the available space.</p><p>For example:</p><pre>Row(<br>  mainAxisAlignment: MainAxisAlignment.spaceBetween,<br>  children: [<br>    Text(&quot;Left&quot;),<br>    Text(&quot;Right&quot;),<br>  ],<br>)</pre><p>On the other hand, crossAxisAlignment controls how children are positioned along the cross axis, which is perpendicular to the main axis. This determines whether widgets align to the start, center, end, or stretch to fill the available space in that direction.</p><p>For example:</p><pre>Column(<br>  crossAxisAlignment: CrossAxisAlignment.start,<br>  children: [<br>    Text(&quot;Aligned Left&quot;),<br>    Text(&quot;Also Left&quot;),<br>  ],<br>)</pre><h3>Conclusion</h3><p>The Flutter layout system may seem complicated at first, but once you understand how constraints, spacing, and axis directions work, everything becomes easier.</p><h3>Online Resource</h3><p>Resources: <a href="https://github.com/codewithferdi-rgb/profile.git">https://github.com/codewithferdi-rgb/profile.git</a></p><p>🙌 Thanks for reading! If you found this helpful, give it a clap and follow for more beginner-friendly guides on Flutter Mobile Programming!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=17784338451a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Scaffold and Asset Management in Flutter: Best Practices and Implementation]]></title>
            <link>https://medium.com/@akun.ferdiyanto/scaffold-and-asset-management-in-flutter-best-practices-and-implementation-f87df9bb267d?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/f87df9bb267d</guid>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[flutter-development]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Mon, 23 Feb 2026 03:37:58 GMT</pubDate>
            <atom:updated>2026-02-23T14:38:02.290Z</atom:updated>
            <content:encoded><![CDATA[<h4>Explore how Flutter’s Scaffold widget organizes layouts and how to configure assets properly in pubspec.yaml.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yQbA7A_SgzRZa-nCLAUHIw.png" /></figure><h3>Introduction</h3><p>When developing applications with Flutter, understanding layout structure and resource management is crucial. A well-structured user interface (UI) improves maintainability, readability, and scalability.</p><p>This article discusses how Scaffold organizes the application layout, how to work with basic UI components such as AppBar and FloatingActionButton, and how to manage assets in Flutter.</p><h3>Understanding Scaffold in Flutter</h3><p>In Flutter, Scaffold serves as the structural foundation for a screen. It implements the basic layout structure defined by Material Design principles.</p><p>Minimal example:</p><pre>import &#39;package:flutter/material.dart&#39;;<br><br>void main() {<br>  runApp(const MyApp());<br>}<br><br>class MyApp extends StatelessWidget {<br>  const MyApp({super.key});<br><br>  @override<br>  Widget build(BuildContext context) {<br>    return MaterialApp(<br>      home: Scaffold(<br>        appBar: AppBar(<br>          title: Text(&#39;Scaffold Example&#39;),<br>        ),<br>        body: Center(<br>          child: Text(&#39;Hello Flutter!&#39;),<br>        ),<br>      ),<br>    );<br>  }<br>}</pre><p>In this structure:</p><ul><li>MaterialApp initializes the application with Material Design styling.</li><li>Scaffold provides the screen layout structure.</li><li>AppBar creates the top navigation bar.</li><li>body defines the primary content area.</li></ul><h3>Visual Structure of Scaffold</h3><p>The following diagram illustrates how Scaffold fits into the overall widget hierarchy of a Flutter application:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/1*9dAcK17mrALpRRzP1qKL2A.jpeg" /></figure><p>From top to bottom, Flutter builds the UI as a nested widget tree:</p><ul><li>MyApp initializes the application.</li><li>MaterialApp provides Material Design configuration.</li><li>MyHomePage defines the screen.</li><li>Scaffold structures the layout.</li><li>AppBar, Center, and FloatingActionButton occupy predefined layout slots.</li></ul><h4>Understanding Scaffold’s Role</h4><p>The Scaffold widget acts as a layout orchestrator. It does not directly render content; instead, it organizes predefined sections such as:</p><ul><li><strong>AppBar</strong> → Top navigation area</li><li><strong>Body (Center in this example)</strong> → Main content section</li><li><strong>FloatingActionButton</strong> → Primary action button</li></ul><p>Each section can contain additional widgets. For example:</p><ul><li>AppBar contains a Text widget.</li><li>Center contains multiple Text widgets.</li><li>FloatingActionButton contains an Icon.</li></ul><h3>Working with AppBar and Basic Components</h3><p>The AppBar widget supports various configuration options such as title alignment and action buttons.</p><p>Example:</p><pre>import &#39;package:flutter/material.dart&#39;;<br><br>void main() {<br>  runApp(const MyApp());<br>}<br><br>class MyApp extends StatelessWidget {<br>  const MyApp({super.key});<br><br>  @override<br>  Widget build(BuildContext context) {<br>    return MaterialApp(<br>      home: Scaffold(<br>        appBar: AppBar(<br>          title: const Text(&#39;Home&#39;),<br>          centerTitle: true,<br>          actions: [<br>            IconButton(icon: const Icon(Icons.search), onPressed: () {}),<br>          ],<br>        ),<br>        body: const Center(child: Text(&#39;Welcome to Flutter&#39;)),<br>        floatingActionButton: FloatingActionButton(<br>          onPressed: () {},<br>          child: const Icon(Icons.add),<br>        ),<br>      ),<br>    );<br>  }<br>}</pre><h4>Explanation:</h4><ul><li>centerTitle aligns the title centrally.</li><li>actions adds interactive icons to the right side.</li><li>IconButton allows user interaction.</li><li>FloatingActionButton emphasizes the primary screen action.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*olOjpqA0VLs61xDpHBYRKQ.png" /></figure><h3>Displaying an Image from the Internet</h3><p>Flutter provides the Image.network() constructor to load images directly from a URL.</p><pre>body: Center(<br>          child: Image(<br>            image: NetworkImage(&#39;https://www.miquido.com/wp-content/uploads/2024/08/Flutter-vs-Dart-%E2%80%93-whats-the-difference.jpg&#39;)),<br>        ),</pre><h3>When to Use Network Images</h3><ul><li>Fetching images dynamically from APIs</li><li>Displaying user-generated content</li><li>Reducing initial app bundle size</li></ul><p>However, network images depend on internet connectivity and may introduce latency.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IGdE-XQYU_fy8UbKaPAxSg.png" /></figure><h3>Managing Local Assets in Flutter</h3><p>For static resources such as logos, icons, or onboarding illustrations, local assets are recommended.</p><h4>Step 1: Create an Assets Folder</h4><p>Project structure example:</p><pre>project_root/<br> └── assets/<br>       └── images/<br>             └── logo.png</pre><h4>Step 2: Register Assets in pubspec.yaml</h4><p>Inside pubspec.yaml:</p><pre>flutter:<br>  assets:<br>    - assets/images/logo.png</pre><p>After saving the file, run:</p><pre>flutter pub get</pre><h4>Step 3: Use AssetImage</h4><pre>body: Center(<br>          child: Image(<br>            image: AssetImage(&#39;assets/images/icon.png&#39;),<br>          )<br>        ),</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_xGOm7RDg3023v-fOEuLrA.png" /></figure><h3>Best Practices for Asset Management</h3><p>To maintain a scalable Flutter project:</p><ol><li>Organize assets into structured folders (images, icons, fonts).</li><li>Use consistent naming conventions (e.g., snake_case).</li><li>Avoid placing all assets in the root directory.</li><li>Register directories instead of individual files when possible.</li><li>Restart the application after modifying pubspec.yaml.</li><li>Use const constructors whenever possible for performance optimization.</li></ol><h3>Conclusion</h3><p>Understanding Scaffold is fundamental to mastering Flutter UI development. It provides a structured layout system that simplifies the implementation of common interface elements such as AppBar, Drawer, and FloatingActionButton.</p><h3>Online Resource</h3><p>Resources: <a href="https://github.com/codewithferdi-rgb/mindforge.git">https://github.com/codewithferdi-rgb/mindforge.git</a></p><p>🙌 Thanks for reading! If you found this helpful, give it a clap and follow for more beginner-friendly guides on Flutter Mobile Programming!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f87df9bb267d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Visualizing Application Logic: A Flowchart Approach to Project and Task Management]]></title>
            <link>https://medium.com/@akun.ferdiyanto/visualizing-application-logic-a-flowchart-approach-to-project-and-task-management-4b6d5d1c6bac?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/4b6d5d1c6bac</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Sun, 15 Feb 2026 13:14:12 GMT</pubDate>
            <atom:updated>2026-02-15T13:14:12.639Z</atom:updated>
            <content:encoded><![CDATA[<h4>A step-by-step explanation of user flow, system processes, and data handling in a task management application</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NMx_gRK_2daLU_VfYu4-FA.png" /></figure><h3>Introduction</h3><p>Before building any application, it is important to understand how users interact with the system. One of the most effective ways to do this is to visualize the workflow through flowcharts.</p><p>This article describes a project management workflow designed using flowchart modeling. The system focuses on project organization, task tracking, and event scheduling in a productivity-oriented platform.</p><h3>Main Flow Overview</h3><p>The workflow begins when the user accesses the application. From this entry point, the system starts with authentication, dashboard access, project creation, task management, and event scheduling.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/672/1*POVG6EaVzHvdqIIwJvnxbA.png" /></figure><h3>Authentication Flow</h3><p>The authentication process ensures that only authorized users can access the platform. Users begin by entering their email address and password, which are then verified by the system.</p><p>If authentication fails, users will be asked to re-enter their credentials. If authentication is successful, the system will generate a session token that allows users to access protected features.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/933/1*iFYFYF5uhSaPcSUC6SVNcQ.png" /></figure><h3>Dashboard Flow</h3><p>After successfully logging in, users will be directed to the dashboard. The system loads and displays user data, including projects, tasks, and related activities.</p><p>The dashboard serves as the main control center of the application.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/675/1*PDdxRbR6hdb8ZRi-CDzGAg.png" /></figure><h3>Add Project Flow</h3><p>Project creation is the basis of the management system. Users enter the project title and category, which are then stored in the database.</p><p>Projects help organize tasks in a structured manner, making it easier for users to plan.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/849/1*byTpg6uamNtPHms5oPPzGQ.png" /></figure><h3>Add Task Flow</h3><p>Tasks represent actionable items within each project. During task creation, users provide details such as task title, project association, priority level, and status.</p><p>Each task is linked to a specific project, allowing users to track progress systematically. This structure supports workflow monitoring and helps users maintain productivity.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*i6PLQ76hjRohtH_dVCiLEw.png" /></figure><h3>Add Event Flow</h3><p>The event feature allows users to schedule important activities related to their projects. Users enter event details such as title, date, and status before the system saves the information.</p><p>Event management supports deadline tracking and reminder functions.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/886/1*zqhYZfmG5HJ49RpHd_DQBw.png" /></figure><h3>Conclusion</h3><p>This project management workflow shows how flowcharts can transform an idea into structured application logic.</p><p>Online Resources: <a href="https://miro.com/app/board/uXjVGBsTNSE=/?share_link_id=46311187421">Miro</a></p><p>🙌 <strong>Thanks for reading!</strong> If you found this helpful, give it a clap and follow for more beginner-friendly guides on <strong>Web Programming!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4b6d5d1c6bac" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Install Flutter and Set Up Development Environment on Ubuntu]]></title>
            <link>https://medium.com/@akun.ferdiyanto/install-flutter-and-set-up-development-environment-on-ubuntu-1f9e5b30e8bc?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/1f9e5b30e8bc</guid>
            <category><![CDATA[flutter]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[ubuntu]]></category>
            <category><![CDATA[flutter-app-development]]></category>
            <category><![CDATA[linux-tutorial]]></category>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Tue, 10 Feb 2026 04:53:05 GMT</pubDate>
            <atom:updated>2026-02-16T11:42:42.976Z</atom:updated>
            <content:encoded><![CDATA[<h4>A Step-by-Step Tutorial for Beginners to Build Flutter Apps on Linux</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d_7Hy9C3anWXBoZ9psQ7GA.png" /></figure><h3>Introduction</h3><p>Flutter has become one of the most popular frameworks for cross-platform application development. With a single code base, developers can build applications for Android, iOS, web, desktop, and other platforms.</p><p>In this guide, we will learn how to install Flutter and set up a complete development environment on Ubuntu.</p><h3>Prerequisites</h3><p>Before starting the installation process, make sure your system meets the following requirements.</p><h4>System Requirements</h4><ul><li>Ubuntu 24.04 LTS (or compatible Linux distribution)</li><li>Minimum 8 GB RAM recommended</li><li>At least 10 GB of free storage space</li><li>Stable internet connection for downloading dependencies</li></ul><h4>Required Tools</h4><p>Make sure you have the following tools installed:</p><ul><li>Visual Studio Code</li><li>Basic familiarity with terminal commands</li><li>Git for downloading Flutter SDK</li></ul><p>You can install Git using:</p><pre>sudo apt install git</pre><h3>Install and set up Flutter</h3><p>Now that you’ve installed Git and VS Code, follow these steps to use VS Code to install and set up Flutter.</p><h4>Add the Flutter extension to VS Code</h4><p>To add the Dart and Flutter extensions to VS Code</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/722/1*8qXu_hwUtqOz86tpf_Rp9w.png" /></figure><h4>Install Flutter SDK with VS Code</h4><p>To check your Flutter setup in VS Code, open the Command Palette (Control + Shift + P), type <em>Flutter</em>, and run <strong>Flutter: Flutter Doctor</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/595/1*Ncj8IJOUXOMzVlU28xKQZA.png" /></figure><p>VS Code will prompt you to locate the Flutter SDK. If it is not installed, select <strong>Download SDK</strong> and choose the folder where you want to install it.</p><h4>Configure Environment Variables</h4><p>To use Flutter commands globally, add Flutter to your system PATH.</p><p>Open your shell configuration file:</p><pre>nano ~/.bashrc</pre><p>Add the following line:</p><pre>export PATH=&quot;$PATH:/home/your-username/flutter/bin&quot;</pre><p>Save the file and reload the configuration:</p><pre>source ~/.bashrc</pre><p>Verify the Flutter installation:</p><pre>flutter --version</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/806/1*kq9BcS5qIV5O6cIHm8Pp5w.png" /></figure><h3>Installing Android Development Tools</h3><p>Flutter requires Android development tools to build and run Android applications.</p><h4>Installing Android SDK and Command-Line Tools</h4><p>You can install the Android SDK through Android Studio. Follow the installation steps until completion.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1010/1*Y3PWkGxBzLdWUNcBx8RPNg.png" /></figure><p>After the SDK installation process is complete, the next step is to install the Android SDK Command-line Tools.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1010/1*G_OHhiHiinaqe_uJNDw9tA.png" /></figure><p>After installation, define the Android SDK location:</p><pre>export ANDROID_HOME=$HOME/Android/Sdk<br>export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin<br>export PATH=$PATH:$ANDROID_HOME/platform-tools</pre><h4>Accept Android licenses</h4><pre>flutter doctor --android-licenses</pre><h3>Installing Linux Build Dependencies</h3><p>Flutter desktop development requires additional Linux dependencies. Install them using:</p><pre>sudo apt install clang cmake ninja-build pkg-config libgtk-3-dev</pre><p>These dependencies serve different roles:</p><ul><li><strong>clang</strong> — Compiler required for building Flutter desktop applications</li><li><strong>cmake</strong> — Build configuration tool</li><li><strong>ninja-build</strong> — High-performance build system</li><li><strong>pkg-config</strong> — Helps locate installed libraries</li><li><strong>libgtk-3-dev</strong> — Required for Linux graphical user interface support</li></ul><p>Installing these ensures Flutter can build Linux desktop applications successfully.</p><h3>Verifying Installation Using Flutter Doctor</h3><p>Flutter provides a diagnostic tool to verify environment setup.</p><p>Run:</p><pre>flutter doctor</pre><p>Flutter Doctor checks for:</p><ul><li>Flutter SDK installation</li><li>Android toolchain availability</li><li>Emulator configuration</li><li>Linux development dependencies</li></ul><p>If all components are correctly installed, Flutter Doctor should show no issues. If warnings appear, follow the suggested fixes displayed in the terminal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/806/1*lmSoSnQ3Wt4LJj9rT3t0_g.png" /></figure><h3>Running Your First Flutter Project</h3><p>Once the environment is ready, create your first Flutter project:</p><pre>flutter create my_first_app</pre><p>Run the application:</p><pre>flutter run</pre><p>If the real device launches and displays the default Flutter application, your development environment is successfully configured.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*H7abMQBmkldbf1Z2xyLXyg.jpeg" /></figure><h3>Conclusion</h3><p>In this guide, we have learned how to install the Flutter SDK, set environment variables, install Android development tools, set up an emulator, and verify your development environment.</p><p>With the setup complete, you are now ready to start building cross-platform applications using Flutter.</p><p>Online Resources : <a href="https://github.com/iniiferdi/coba.git">https://github.com/iniiferdi/coba.git</a></p><p>🙌 <strong>Thanks for reading!</strong> If you found this helpful, give it a clap and follow for more beginner-friendly guides on <strong>Mobile Programming!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1f9e5b30e8bc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Digital Library Management System Using Object-Oriented Programming in Java]]></title>
            <link>https://medium.com/@akun.ferdiyanto/building-a-digital-library-management-system-using-object-oriented-programming-in-java-84e9400e7c01?source=rss-20d48d25ef36------2</link>
            <guid isPermaLink="false">https://medium.com/p/84e9400e7c01</guid>
            <dc:creator><![CDATA[code.with.ferdi]]></dc:creator>
            <pubDate>Sat, 20 Dec 2025 14:17:57 GMT</pubDate>
            <atom:updated>2025-12-20T14:19:22.103Z</atom:updated>
            <content:encoded><![CDATA[<h4>A Practical Case Study on Abstraction, Interfaces, and Data Persistence</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j1nB0XW7zhYvpISerg0IFg.png" /></figure><h3>Introduction</h3><p>Rapid advances in digital technology have transformed how libraries manage and distribute information. Traditional manual systems are being replaced by digital solutions that require structured, reliable, and scalable software capable of managing book collections, members, borrowing transactions, and data consistency.</p><p>Object-Oriented Programming (OOP) is well suited for building such systems because it models real-world entities into reusable and maintainable components. This article presents a case study of a console-based Digital Library Management System developed in Java, highlighting the practical use of OOP principles such as abstraction, interfaces, composition, aggregation, exception handling, collections, and data persistence through serialization.</p><h3>Problem Statement &amp; Requirements</h3><p>This case study focuses on a digital library system designed to manage book collections, members, and borrowing transactions in a reliable and persistent manner. The application supports core library operations such as searching, borrowing, returning, and managing inventory, while applying Object-Oriented Programming principles and file-based persistence through serialization.</p><h3>Object-Oriented Design Overview</h3><p>Before implementing the system, it is important to design the object model that represents the core elements of the library. Conceptually, the system is built around three main entities: <strong>Book</strong>, <strong>Member</strong>, and <strong>LibraryManager</strong>.</p><p>The Book class represents a library collection item with attributes such as ID, title, author, stock, and borrowing information. The Member class represents a library user who can borrow books. The LibraryManager acts as the central controller that manages the collection of books and coordinates system operations.</p><h4>Figure 1: Diagram UML Class</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6GaFglHTe6hrbKaJTttchA.jpeg" /></figure><h3>Abstraction and Abstract Classes</h3><p>Abstraction is a fundamental concept in OOP that allows developers to focus on what an object does rather than how it does it. In this system, abstraction is implemented through the LibraryItem abstract class.</p><h4>Code Snippet 1: Abstract Class</h4><pre>public abstract class LibraryItem implements Serializable {<br>    private String id;<br>    private String title;<br><br>    public abstract void displayInfo();<br>}</pre><p>LibraryItem represents a generic library collection entity and defines common attributes such as ID and title. It also declares an abstract method displayInfo(), which must be implemented by all subclasses. This design enforces a consistent behavior across different types of library items while allowing flexibility in how the information is displayed.</p><h4>Code Snippet 2: Implementation in Book</h4><pre>public class Book extends LibraryItem {<br>    @Override<br>    public void displayInfo() {<br>        // implementation<br>    }<br>}</pre><p>By using an abstract class, the system becomes more extensible. If new types of library items (such as magazines or journals) are added in the future, they can inherit from LibraryItem without changing existing code.</p><h3>Interfaces and Polymorphism</h3><p>To model borrowing behavior, the system uses an interface called IBorrowable. This interface defines methods for borrowing and returning items, without specifying how those actions are implemented.</p><h4>Code Snippet 3: Interface Definition</h4><pre>public interface IBorrowable {<br>    void borrowItem(Member member) throws LibraryException;<br>    void returnItem();<br>}</pre><p>Interfaces improve flexibility because they allow different classes to share the same behavior contract while having different implementations. In this case, the Book class implements IBorrowable, enabling books to be borrowed and returned.</p><h4>Code Snippet 4: Interface Implementation</h4><pre>public class Book implements IBorrowable {<br>    // borrowItem and returnItem implementation<br>}</pre><h3>Composition and Aggregation in Practice</h3><p>The system applies both composition and aggregation to model relationships between objects. Aggregation is used in the relationship between LibraryManager and Book, where the library manages a list of books. The books can exist independently of the manager, making this a weak relationship.</p><p>Composition is applied in the borrowing mechanism within the Book class. Each book contains information about its borrower and loan date. This relationship is strong because the borrowing data is tightly coupled with the book itself. If the book is removed from the system, the borrowing information is also removed.</p><h3>Exception Handling Strategy</h3><p>A robust system must be able to handle errors gracefully. In this application, custom exceptions are implemented through the LibraryException class. This allows the system to provide meaningful error messages when issues occur, such as attempting to borrow an out-of-stock book or accessing a non-existent ID.</p><h4>Code Snippet 5: Custom Exception</h4><pre>public class LibraryException extends Exception {<br>    public LibraryException(String message) {<br>        super(message);<br>    }<br>}</pre><h4>Output Screenshot</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/707/1*ooPR8VZg0MONSXa6ge2txQ.png" /></figure><h3>Collections, Streams, and Generics</h3><p>To manage the book collection efficiently, the system uses Java’s List&lt;Book&gt; collection. Generics ensure type safety and prevent runtime casting errors.</p><p>Searching and filtering operations are implemented using the Stream API, allowing concise and readable data processing. This approach not only reduces boilerplate code but also improves maintainability. By combining collections, streams, and generics, the system adheres to modern Java development practices.</p><h4>Code Snippet 6: Stream API Search</h4><pre>books.stream()<br>     .filter(b -&gt; b.getTitle().toLowerCase().contains(query))<br>     .collect(Collectors.toList());</pre><h3>File I/O and Object Serialization</h3><p>Persistence is achieved through Java object serialization. The entire state of the LibraryManager is saved to a binary file when the application exits and loaded again when the program starts.</p><h4>Code Snippet 7: Serialization</h4><pre>ObjectOutputStream oos =<br>    new ObjectOutputStream(new FileOutputStream(&quot;library_db.bin&quot;));</pre><p>Serialization simplifies data storage because objects can be written and read directly without manually converting them into text formats. This ensures that all book records, borrowing data, and system states remain consistent across sessions.</p><p><strong>Code Snippet 8: Deserialization</strong></p><pre>ObjectInputStream ois =<br>    new ObjectInputStream(new FileInputStream(&quot;library_db.bin&quot;));</pre><h3>Console-Based User Interface Design</h3><p>Although the application is console-based, attention is given to user experience. The system uses a menu-driven interface that guides users through available actions. ANSI color codes are applied to highlight important messages such as errors, success notifications, and headers.</p><h4>Figure 2: Main Menu Output</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/702/1*o137ilwcsLugvdshQoA_IA.png" /></figure><h4><strong>Figure 3: Inventory Table Output</strong></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/697/1*p5s-MY6FJPPIz1Xgos9RhQ.png" /></figure><h4>Figure 4: Statistics Report Output</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/690/1*uQHISwcbX8xp8InbQiddJA.png" /></figure><p>This design demonstrates that even command-line applications can provide a clear and engaging user experience when designed thoughtfully.</p><h3>System Evaluation</h3><p>The primary strength of this system lies in its clear object-oriented structure and adherence to core OOP principles. The code is modular, readable, and easy to extend. The use of serialization ensures reliable data persistence, while exception handling maintains stability.</p><p>However, the system also has limitations. Being console-based, it lacks a graphical interface. Additionally, borrowing transactions are simplified and could be further enhanced by introducing a dedicated Loan class or integrating a database for large-scale usage.</p><h3>Conclusion</h3><p>This project demonstrates how Object-Oriented Programming can be effectively applied to solve real-world problems such as digital library management. Through abstraction, interfaces, composition, and proper exception handling, the system achieves both functionality and maintainability.</p><p>The case study highlights the importance of OOP principles in building scalable and reliable software. Even with a simple console-based implementation, thoughtful design choices can result in a robust and extensible application.</p><h3>Source Code</h3><p>Online Resources: <a href="https://github.com/iniiferdi/akshara.git">Askara</a></p><p>🙌 <strong>Thanks for reading!</strong> If you found this helpful, give it a clap and follow for more beginner-friendly guides on <strong>Java and Object-Oriented Programming!</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=84e9400e7c01" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>