<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[JoBins Blog]]></title><description><![CDATA[Best Hiring Tech Solutions in Japan. ]]></description><link>https://blog.jobins.jp</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 12:43:24 GMT</lastBuildDate><atom:link href="https://blog.jobins.jp/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[UX/UI Trends: That Will Change The Shape of Digital Experience]]></title><description><![CDATA[We are moving into products that adapt, predict and react with real context. Designing only interfaces is not enough anymore. We are designing experiences that understand the user.
Designers and digital agencies are now challenged to move beyond trad...]]></description><link>https://blog.jobins.jp/uxui-trends-that-will-change-the-shape-of-digital-experience</link><guid isPermaLink="true">https://blog.jobins.jp/uxui-trends-that-will-change-the-shape-of-digital-experience</guid><category><![CDATA[UX]]></category><category><![CDATA[UI Design]]></category><category><![CDATA[Product Design]]></category><dc:creator><![CDATA[Suresh Sapkota]]></dc:creator><pubDate>Thu, 08 Jan 2026 07:49:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767624473185/e9bbf9bc-870f-47d2-baae-0350377ceb5e.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are moving into products that adapt, predict and react with real context. Designing only interfaces is not enough anymore. We are designing experiences that understand the user.</p>
<p>Designers and digital agencies are now challenged to move beyond traditional screens, layouts and patter. The focus is now on designing adaptable system that <a target="_blank" href="https://blog.jobins.jp/product-designers-how-to-meet-business-goals-and-user-needs">understand users, anticipate their needs</a> and respond with empathy and precision.</p>
<h1 id="heading-1-contest-aware-design-adapting-real-time-personalization-experience">1. Contest aware design adapting real time: Personalization experience</h1>
<h3 id="heading-spotify-mood-and-moments">Spotify <strong>—</strong> “Mood and Moments”</h3>
<p>Spotify has been experimenting with context awareness through its “Mood and Moments” playlists, which adapt to time of day, activity and even weather.</p>
<h3 id="heading-netflix-personalized-movie-rows-amp-artwork"><strong>Netflix — “Personalized Movie Rows &amp; Artwork”</strong></h3>
<ul>
<li><p>Netflix analyzes:</p>
</li>
<li><p>Viewing history</p>
</li>
<li><p>Time of day</p>
</li>
<li><p>Device type</p>
</li>
<li><p>User mood inferred from behavior</p>
</li>
<li><p>Then it personalizes:</p>
</li>
<li><p>Homepage rows (e.g., “Because You Watched…”)</p>
</li>
<li><p>Thumbnail artwork (romantic scenes vs. action scenes depending on your taste)</p>
</li>
<li><p>Autoplay preview recommendations</p>
</li>
</ul>
<p><img src="https://vodzilla.co/wp-content/uploads/2020/02/netflix-autoplay-700x411.jpeg" alt /></p>
<p>Netflix dynamically changes the entire interface based on your behavior, making each user’s home screen unique</p>
<h3 id="heading-tiktok-for-you-page-fyp">TikTok — “For You Page (FYP)”</h3>
<ul>
<li><p>The FYP is generated from:</p>
</li>
<li><p>Micro-interactions (watch time per second)</p>
</li>
<li><p>Replays</p>
</li>
<li><p>Likes, comments, follows</p>
</li>
<li><p>Geo-location</p>
</li>
<li><p>Device type</p>
</li>
</ul>
<p>TikTok builds a highly individualized stream within minutes—no two users have the same FYP.</p>
<hr />
<h1 id="heading-2-generative-ux-co-designing-with-ai">2. Generative UX: Co Designing with AI</h1>
<p>AI has long influenced UX, but generative UX takes the partnership between designers and machines to a new level. Instead of manually creating layouts, <a target="_blank" href="https://blog.jobins.jp/personalized-user-experience-with-ai">AI tools can now generate design</a> variations instantly based on user goals, accessibility standards, or brand guidelines.</p>
<h3 id="heading-figmas-ai">Figma’s AI</h3>
<p>Figma’s AI tools and other emerging platforms are already generating interface layouts from text prompts. A designer types prompts and the system instantly produces mockups.</p>
<h3 id="heading-adobe-firefly-for-ui-components">Adobe Firefly for UI Components</h3>
<p>Adobe Firefly can generate UI elements such as buttons, cards, or full compositions from natural language prompts. Designers can refine the output with styles, themes, or accessibility constraints.</p>
<h3 id="heading-framer-ai-instant-website-generation">Framer AI – Instant Website Generation</h3>
<p>Framer AI can generate full websites—including sections, layout, illustrations, and typography—using only a short prompt. Designers can then fine-tune everything visually.</p>
<p><img src="https://substackcdn.com/image/fetch/$s_!qDMj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35a174e1-778d-46b7-9a04-605349130bad_800x450.gif" alt="Framer AI page generator " class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-3-conversational-ai-integration-humanizing-digital-dialogue">3. Conversational AI integration: Humanizing Digital Dialogue</h1>
<p>The line between human and machine communication continues to blur. In 2026 conversational AI will evolve from a support feature into a <a target="_blank" href="https://blog.jobins.jp/what-is-data-driven-design-how-does-data-help-in-design-decisions">centric UX element</a> allowing natural dialogue as part of navigation, search &amp; action.</p>
<h3 id="heading-duolingos-ai">Duolingo’s AI</h3>
<p>Duolingo’s AI Tutor already personalizes lessons through conversation, adjusting its prompts based on user confidence. We’ll see this technology embedded across interface.</p>
<h3 id="heading-meta-ai-instagram-whatsapp-messenger-contextual-conversational-assistant">Meta AI (Instagram / WhatsApp / Messenger) — Contextual Conversational Assistant</h3>
<p>Meta’s AI now interacts directly inside chats:</p>
<ul>
<li><p>Understands context of conversation</p>
</li>
<li><p>Suggests replies, image creation, or information</p>
</li>
<li><p>Adjusts tone and detail based on user messages</p>
</li>
</ul>
<p>It turns messaging apps into two-way assistants that feel “human-aware.”</p>
<h3 id="heading-snapchat-myai-real-time-conversational-layer">Snapchat MyAI — Real-Time Conversational Layer</h3>
<p>Snap integrates AI inside the chat interface:</p>
<ul>
<li><p>Users ask for ideas, lenses, info</p>
</li>
<li><p>AI replies in conversational tone</p>
</li>
<li><p>Suggests Snap-specific content</p>
</li>
</ul>
<p><img src="https://miro.medium.com/0*xYaa0GmF8c13ao61.gif" alt /></p>
<p>It blends social UX with conversational intelligence in a seamless way.</p>
<hr />
<h1 id="heading-4-3d-and-depth-interfaces-designing-with-dimension">4. 3D and Depth interfaces: Designing with dimension</h1>
<p>As hardware and rendering capabilities advance, 3D design is entering a new phase of maturity. In 2026 3D and depth interface will become a mainstream components of digital experience. Not only for visual flair, but for clarity and engagement.</p>
<h3 id="heading-apples-vision-pro">Apple’s Vision Pro</h3>
<p>Apple’s Vision Pro interface demonstrates how digital elements can float in space and react naturally to user focus or gestures. Similar depth based systems will appear on everyday platforms.</p>
<h3 id="heading-meta-quest-3-spatial-ui-amp-mixed-reality-panels">Meta Quest 3 — Spatial UI &amp; Mixed-Reality Panels</h3>
<p>Meta Quest OS uses:</p>
<ul>
<li><p>Floating interface panels</p>
</li>
<li><p>Depth-aware windows</p>
</li>
<li><p>Hand-tracking controls</p>
</li>
<li><p>Pass-through mixed reality Panels expand or shrink depending on your proximity and focus.</p>
</li>
</ul>
<p>It delivers consumer-level spatial computing where apps “exist in your room.”</p>
<h3 id="heading-google-maps-ar-real-world-depth-guidance">Google Maps AR — Real-World Depth Guidance</h3>
<p>Live View AR displays:</p>
<ul>
<li><p>3D arrows aligned with real-world buildings</p>
</li>
<li><p>Depth-aware navigation</p>
</li>
<li><p>Direction changes based on your phone’s orientation</p>
</li>
</ul>
<p>A depth-aware interface layered over reality, reacting to movement + direction.</p>
<h3 id="heading-kea-place-ikea-kreativ-true-to-scale-depth-placement">KEA Place / IKEA Kreativ — True-to-Scale Depth Placement</h3>
<p>KEA uses:</p>
<ul>
<li><p>Room scanning</p>
</li>
<li><p>Depth detection</p>
</li>
<li><p>Spatial anchors</p>
</li>
<li><p>True-to-scale 3D furniture placement Furniture appears as if it physically exists in your room. Real-world depth + digital precision = seamless spatial UX.</p>
</li>
</ul>
<p><img src="https://www.ikea.com/global/en/images/484828_b4450698dc.jpg" alt class="image--center mx-auto" /></p>
<hr />
<h1 id="heading-5-liquid-motion-design-the-art-of-fluid-interaction">5. Liquid Motion Design: the Art of Fluid Interaction</h1>
<p>Motion has always played a vital role in UX, but the trend toward liquid motion design in 2026 pushes it to new creative heights. This approach focuses on seamless fluid transitions that make interaction feel organic and responsive.  Instead of abrupt screen changes, buttons morph smoothly into menu, content cards glide softy as user scroll. These transitions <a target="_blank" href="https://blog.jobins.jp/product-design-review-an-effective-guide-to-implement">make a digital experiences</a> feel alive, reducing friction and increasing emotional engagement.</p>
<h3 id="heading-apple-music">Apple Music</h3>
<p>In Apple Music, the mini player at the bottom smoothly expands into the full-screen player. The album artwork scales up, text and control flow into position and the background color often softly adapts to the album art.</p>
<h3 id="heading-spotify-mobile-app-fluid-player-expansion">Spotify Mobile App — Fluid Player Expansion</h3>
<p>When tapping the mini-player:</p>
<ul>
<li><p>Album art smoothly scales upward</p>
</li>
<li><p>Controls glide into view</p>
</li>
<li><p>Background blends into a color gradient from the track’s artwork</p>
</li>
<li><p>Navigation bar melts away instead of abruptly disappearing</p>
</li>
</ul>
<p>Elegant, liquid-like motion that feels “continuous.”</p>
<h3 id="heading-ios-weather-app-animated-fluid-state-changes">iOS Weather App — Animated, Fluid State Changes</h3>
<p>Switching cities:</p>
<ul>
<li><p>Weather panels slide and blend</p>
</li>
<li><p>Background animations transition with soft gradients</p>
</li>
<li><p>Temperature and icons flow into place</p>
</li>
</ul>
<p><img src="https://i.giphy.com/ln8AOVaLecZhmP4UbI.gif" alt="Ios city switch weather animation - gif" /></p>
<p>Feels like water-like motion rather than traditional UI movement.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>The style of UX/UI design is evolving as a result of the rapid development of technology. The new definition of UX/UI design is that we are no longer creating static page layouts; we are creating an ever-evolving and adaptable experience. <a target="_blank" href="https://blog.jobins.jp/how-wireframing-boosts-product-design-and-development-efficiency">Products must do much more than show the correct information</a>; they must not only see context but also predict what the user will need and respond appropriately.</p>
<p>There is also a more significant paradigm shift in the value of design today. The only way to create value through design is to move away from passive users and into a world of dynamic individuals. Ultimately, the next evolution in the design of user experience/user interfaces will be characterized by intelligent systems that adapt and predict user behavior. Some examples of this would be interfaces that change depending on user mood or website usage patterns and systems that guide users toward the desired outcome.</p>
<p>In the words of John Maeda, “Design creates value faster than it creates cost.” As we enter this next era of user experience design, designers and design agencies must adapt by embracing fluid interaction with users, intelligent emergent systems, and the ability to be empathetic toward a user’s experience. We need to build systems that do more than simply respond in a predictable fashion; we need to build systems that interpret and anticipate user intent. As Don Norman says, “It’s about creating designs and experiences that are not only useful and usable, but are meaningful and dignified."</p>
<h2 id="heading-references">References</h2>
<p>Img sources: <a target="_blank" href="https://www.ikea.com">https://www.ikea.com</a>, <a target="_blank" href="https://ios.gadgethacks.com">https://ios.gadgethacks.com</a>, <a target="_blank" href="https://www.netflix.com">https://www.netflix.com</a>,<br /><a target="_blank" href="https://www.snapchat.com/">https://www.snapchat.com/</a>, <a target="_blank" href="https://medium.com/design-bootcamp/how-snapchats-ux-builds-trust-according-to-psychology-c7fc92b6c54b">https://medium.com</a>  </p>
<p>🙏 Thanks for reading the post, you are welcome to comment &amp; leave feedback 🙂🙂🙂</p>
]]></content:encoded></item><item><title><![CDATA[Fixing PHPStan map() Type Errors with Laravel Eloquent Collections]]></title><description><![CDATA[TL;DR
Refactor property declaration for collection as
/** 
 * @property Collection<int, Comment> $comment 
 ...


Overview
When using PHPStan (or Larastan) with Laravel, you may encounter confusing type errors when calling collection methods like map...]]></description><link>https://blog.jobins.jp/fixing-phpstan-map-type-errors-with-laravel-eloquent-collections</link><guid isPermaLink="true">https://blog.jobins.jp/fixing-phpstan-map-type-errors-with-laravel-eloquent-collections</guid><category><![CDATA[phpstan]]></category><category><![CDATA[Laravel]]></category><category><![CDATA[PHP]]></category><category><![CDATA[generics]]></category><category><![CDATA[eloquent]]></category><dc:creator><![CDATA[Birendra Gurung]]></dc:creator><pubDate>Tue, 06 Jan 2026 08:02:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766751519954/99823c10-946d-4edd-b9ce-72b53c019392.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>TL;DR</p>
<p><em>Refactor property declaration for collection as</em></p>
<pre><code class="lang-php"><span class="hljs-comment">/** 
 * <span class="hljs-doctag">@property</span> Collection&lt;int, Comment&gt; $comment 
 ...</span>
</code></pre>
</blockquote>
<h2 id="heading-overview">Overview</h2>
<p>When using <strong>PHPStan (or Larastan)</strong> with Laravel, you may encounter confusing type errors when calling collection methods like <code>map()</code> on Eloquent relationships. A very common one looks like this:</p>
<blockquote>
<p>Parameter #1 $callback of method <code>Collection::map()</code> expects callable(Model, int), Closure(Comment) given</p>
</blockquote>
<p>This blog explains <strong>why this happens</strong>, <strong>what PHPStan is actually telling us</strong>, and <strong>the correct, long-term fix</strong> that works cleanly across your codebase.</p>
<hr />
<h2 id="heading-the-problem-scenario">The Problem Scenario</h2>
<p>Consider a Laravel model relationship:</p>
<pre><code class="lang-php">$user-&gt;comments-&gt;map(
    <span class="hljs-function"><span class="hljs-keyword">fn</span> (<span class="hljs-params">Comment $comment</span>) =&gt; [ 
        '<span class="hljs-title">comment</span>' =&gt; $<span class="hljs-title">comment</span>-&gt;<span class="hljs-title">text</span>, 
        '<span class="hljs-title">created_date</span>' =&gt; $<span class="hljs-title">answer</span>-&gt;<span class="hljs-title">created_at</span>?-&gt;<span class="hljs-title">toArray</span>(<span class="hljs-params"></span>),
    ])</span>;
</code></pre>
<p>At runtime, this works perfectly. However, PHPStan reports an error similar to:</p>
<pre><code class="lang-plaintext">Parameter #1 $callback of method Illuminate\Support\Collection::map() expects callable(Illuminate\Database\Eloquent\Model, int) Closure(Comment) given
</code></pre>
<hr />
<h2 id="heading-why-this-happens">Why This Happens</h2>
<h3 id="heading-1-eloquent-collections-are-generic">1. Eloquent Collections Are Generic</h3>
<p>Laravel Collections are <strong>generic</strong>:</p>
<pre><code class="lang-php">Collection&lt;TKey, TValue&gt;
</code></pre>
<p>If PHPStan does not know the <strong>exact model type</strong> inside the collection, it falls back to:</p>
<pre><code class="lang-php">Collection&lt;<span class="hljs-keyword">int</span>, Model&gt;
</code></pre>
<p>So PHPStan assumes your callback must accept <strong>any</strong> <code>Model</code>, not a specific one like <code>Comment</code>.</p>
<h3 id="heading-2-property-annotations-are-often-incomplete">2. Property Annotations Are Often Incomplete</h3>
<p>Many projects annotate Eloquent properties like this:</p>
<pre><code class="lang-php">@property Illuminate\Database\Eloquent\Collection&lt;Comment&gt; $comments
</code></pre>
<p>Unfortunately, this is <strong>incomplete for PHPStan</strong>.</p>
<p>PHPStan requires <strong>both key and value types</strong>.</p>
<hr />
<h2 id="heading-what-phpstan-sees-incorrect">❌ What PHPStan Sees (Incorrect)</h2>
<pre><code class="lang-php">Collection&lt;<span class="hljs-keyword">int</span>, Model&gt;
</code></pre>
<h2 id="heading-what-we-want-phpstan-to-see">✅ What We Want PHPStan to See</h2>
<pre><code class="lang-php">Collection&lt;<span class="hljs-keyword">int</span>, Comment&gt;
</code></pre>
<hr />
<h2 id="heading-the-correct-fix">The Correct Fix</h2>
<h3 id="heading-option-1-fix-the-property-annotation">✅ Option 1: Fix the Property Annotation</h3>
<p>Update the PHPDoc on your model by using PHPStan generics:</p>
<pre><code class="lang-php"><span class="hljs-comment">/** 
* <span class="hljs-doctag">@property</span> \Illuminate\Database\Eloquent\Collection&lt;int, Comment&gt; $answers 
*/</span> 
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Comment</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span> </span>{ <span class="hljs-comment">// ... }</span>
</code></pre>
<p>This tells PHPStan <strong>exactly</strong> what the collection contains.</p>
<hr />
<h3 id="heading-option-2-recommended-type-the-relationship-method">⭐ Option 2 (Recommended): Type the Relationship Method</h3>
<p>If <code>answers</code> is an Eloquent relationship, this is the <strong>best and cleanest solution</strong>.</p>
<pre><code class="lang-php"><span class="hljs-keyword">use</span> <span class="hljs-title">Illuminate</span>\<span class="hljs-title">Database</span>\<span class="hljs-title">Eloquent</span>\<span class="hljs-title">Relations</span>\<span class="hljs-title">HasMany</span>; 

<span class="hljs-comment">/** * <span class="hljs-doctag">@return</span> HasMany&lt;Comment, $this&gt; */</span> 
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">comments</span>(<span class="hljs-params"></span>): <span class="hljs-title">HasMany</span> </span>{ 
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;hasMany(Comment::class); 
}
</code></pre>
<p>Benefits:</p>
<ul>
<li><p>No need for <code>@property</code> annotations</p>
</li>
<li><p>PHPStan auto-infers the collection type</p>
</li>
<li><p>Works everywhere the relationship is used</p>
</li>
</ul>
<hr />
<h2 id="heading-result-clean-map-usage">Result: Clean <code>map()</code> Usage</h2>
<p>After applying either fix, this works without errors:</p>
<pre><code class="lang-php">$user-&gt;comments-&gt;map(
    <span class="hljs-function"><span class="hljs-keyword">fn</span> (<span class="hljs-params">Comment $comment</span>) =&gt; [ 
        ... 
    ])</span>;
</code></pre>
<p>✅ PHPStan passes<br />✅ Strong typing preserved</p>
<hr />
<h2 id="heading-common-anti-patterns-to-avoid">Common Anti-Patterns to Avoid</h2>
<p>❌ Removing the type hint:</p>
<p><code>fn ($comment) =&gt; [...]</code></p>
<p>❌ Widening the type unnecessarily:</p>
<p><code>fn (Model $comment) =&gt; [...]</code></p>
<p>These silence PHPStan but <strong>lose static safety</strong>.</p>
<hr />
<h2 id="heading-takeaways">Takeaways</h2>
<ul>
<li><p>PHPStan errors here are <strong>not false positives</strong></p>
</li>
<li><p>The issue is almost always <strong>missing or incomplete generics</strong></p>
</li>
<li><p>Always prefer <strong>typing relationship return values</strong></p>
</li>
<li><p>This fix also applies to <code>filter</code>, <code>each</code>, <code>flatMap</code>, <code>reduce</code>, etc.</p>
</li>
</ul>
<hr />
<h2 id="heading-final-recommendation-for-teams">Final Recommendation for Teams</h2>
<blockquote>
<p><strong>Always annotate Eloquent relationship methods with generics.</strong></p>
</blockquote>
<p>This single practice eliminates an entire class of PHPStan errors and makes your Laravel codebase safer and more maintainable.</p>
<hr />
<p>For more details on generics in PHP, please read <a target="_blank" href="https://phpstan.org/blog/generics-by-examples">here</a></p>
<p><em>Happy static analyzing!</em> 🚀</p>
]]></content:encoded></item><item><title><![CDATA[Stop Creating Ghosts! Factory Defaults That Won't Haunt Your Database]]></title><description><![CDATA[Laravel factories are powerful, but a single line of code can turn your pristine test database into a graveyard of useless, hidden records. We're talking phantom data that slows down your test suite and makes debugging feel like an archaeological dig...]]></description><link>https://blog.jobins.jp/stop-creating-ghosts-factory-defaults-that-wont-haunt-your-database</link><guid isPermaLink="true">https://blog.jobins.jp/stop-creating-ghosts-factory-defaults-that-wont-haunt-your-database</guid><category><![CDATA[Laravel]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Testing]]></category><category><![CDATA[best practices]]></category><category><![CDATA[performance]]></category><dc:creator><![CDATA[Kushal Raj Shrestha]]></dc:creator><pubDate>Thu, 27 Nov 2025 01:15:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764050306719/5bd35262-c588-4d7a-bf85-ec0b9983e2a0.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Laravel factories are powerful, but a single line of code can turn your pristine test database into a graveyard of useless, hidden records. We're talking phantom data that slows down your test suite and makes debugging feel like an archaeological dig.</p>
<p>If you’ve ever run a test and found extra database entries you didn't ask for, you've hit this exact problem. It’s time to teach your factories some manners.</p>
<p>This article focuses on how to leverage <strong>conditional defaults</strong> and the <code>for()</code> method to make your factories lean, fast, and reliable.</p>
<h2 id="heading-the-common-pitfall-always-calling-gtcreate">The Common Pitfall: Always Calling <code>-&gt;create()</code></h2>
<p>Consider a standard <code>CommentFactory</code> that needs a <code>blog_id</code> foreign key. A developer often defines the factory like this, inadvertently scheduling the creation of a ghost blog every single time:</p>
<h3 id="heading-the-bad-factory-definition-the-hidden-data-creator">🚩 The Bad Factory Definition (The Hidden Data Creator)</h3>
<pre><code class="lang-php"><span class="hljs-comment">// database/factories/CommentFactory.php (THE PROBLEM CODE)</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CommentFactory</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Factory</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">definition</span>(<span class="hljs-params"></span>): <span class="hljs-title">array</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            <span class="hljs-string">'comment'</span> =&gt; <span class="hljs-keyword">$this</span>-&gt;faker-&gt;sentence(),
            <span class="hljs-comment">// PROBLEM: This line is ALWAYS executed, creating a new Blog every time.</span>
            <span class="hljs-string">'blog_id'</span> =&gt; \App\Models\Blog::factory()-&gt;create()-&gt;id, 
        ];
    }
}
</code></pre>
<h3 id="heading-the-performance-toll">The Performance Toll</h3>
<p>When you try to associate a comment with an existing blog, the factory executes its default logic <em>before</em> checking your explicit instruction:</p>
<pre><code class="lang-php">$existingBlog = Blog::factory()-&gt;create(); <span class="hljs-comment">// Creates Blog A (Valid)</span>

<span class="hljs-comment">// Intention: Create a comment attached to Blog A</span>
Comment::factory()-&gt;create([<span class="hljs-string">'blog_id'</span> =&gt; $existingBlog-&gt;id]);
</code></pre>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Resulting Database State</td><td>Consequence</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Blog A</strong> (ID 1)</td><td>The intended, valid blog.</td></tr>
<tr>
<td><strong>Blog B</strong> (ID 2)</td><td>A <strong>garbage blog</strong> created by the factory's default <code>-&gt;create()</code> call.</td></tr>
<tr>
<td><strong>Comment 1</strong></td><td>Attached to Blog A. <strong>Blog B was created for nothing.</strong></td></tr>
</tbody>
</table>
</div><p>For every comment created this way, you execute <strong>one query too many</strong> and pollute your test database. This quickly adds up and dramatically slows down your entire test suite.</p>
<h2 id="heading-the-solution-conditional-defaults-amp-relationship-definitions">The Solution: Conditional Defaults &amp; Relationship Definitions</h2>
<p>The factory's core purpose is to define a "default state." If a required foreign key (like <code>blog_id</code>) is not provided, the factory should only create it on demand.</p>
<h3 id="heading-method-1-conditional-defaults-for-cleanliness">Method 1: Conditional Defaults for Cleanliness</h3>
<p>We define a dedicated state that only creates the parent model if a specific foreign key (<code>blog_id</code>) hasn't already been supplied in the factory call.</p>
<pre><code class="lang-php"><span class="hljs-comment">// database/factories/CommentFactory.php</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CommentFactory</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Factory</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">definition</span>(<span class="hljs-params"></span>): <span class="hljs-title">array</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            <span class="hljs-string">'comment'</span> =&gt; <span class="hljs-keyword">$this</span>-&gt;faker-&gt;sentence(),

            <span class="hljs-comment">// FIX 1: Set a placeholder value. We'll handle the creation in the state method.</span>
            <span class="hljs-string">'blog_id'</span> =&gt; <span class="hljs-literal">null</span>, 
        ];
    }

    <span class="hljs-comment">// METHOD 1: Define a dedicated state to create the parent if needed.</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">withNewBlog</span>(<span class="hljs-params"></span>): <span class="hljs-title">Factory</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>-&gt;state(<span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"><span class="hljs-keyword">array</span> $attributes</span>) </span>{
            <span class="hljs-comment">// Check if 'blog_id' was NOT provided externally (i.e., it's null from the definition).</span>
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">isset</span>($attributes[<span class="hljs-string">'blog_id'</span>])) {
                <span class="hljs-keyword">return</span> []; <span class="hljs-comment">// Do nothing; use the supplied ID.</span>
            }

            <span class="hljs-keyword">return</span> [
                <span class="hljs-comment">// If not supplied, return a factory instance. Laravel handles the creation/linking.</span>
                <span class="hljs-string">'blog_id'</span> =&gt; \App\Models\Blog::factory(), 
            ];
        });
    }
}
</code></pre>
<h4 id="heading-usage-example-for-method-1">Usage Example for Method 1</h4>
<p>If you want a comment attached to a new, random blog, you use the state explicitly:</p>
<pre><code class="lang-php"><span class="hljs-comment">// Code will only run the 'withNewBlog' state if you call it, or if it's implicitly triggered.</span>
$comment = Comment::factory()-&gt;withNewBlog()-&gt;create(); 

<span class="hljs-comment">// 2 Queries executed: 1 for Blog, 1 for Comment. Clean!</span>
</code></pre>
<h3 id="heading-method-2-the-for-relationship-power-up">Method 2: The <code>for()</code> Relationship Power-Up</h3>
<p>This is the cleanest, most semantic pattern and is the gold standard for linking models. It often makes the conditional state logic (Method 1) unnecessary.</p>
<p><strong>The principle:</strong> Don't tell the factory <em>what ID</em> to use; tell the factory <em>what object</em> it belongs to.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Goal</td><td>Code</td><td>Efficiency</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Attach to existing Blog</strong></td><td><code>$comment = Comment::factory()-&gt;for($existingBlog, 'blog')-&gt;create();</code></td><td><strong>1 Query (Comment Insert).</strong> No extra Blog created.</td></tr>
<tr>
<td><strong>Create new Blog and attach</strong></td><td><code>$comment = Comment::factory()-&gt;for(\App\Models\Blog::factory(), 'blog')-&gt;create();</code></td><td><strong>2 Queries (Blog Insert + Comment Insert).</strong> Perfect.</td></tr>
</tbody>
</table>
</div><h4 id="heading-why-for-is-so-great-and-why-we-name-the-relationship">Why <code>for()</code> is So Great (And Why We Name the Relationship)</h4>
<p>When you use <code>-&gt;for($existingBlog, 'blog')</code>, Laravel sees the parent object and <em>removes</em> the default foreign key generation from the factory definition entirely. It intelligently knows: "Aha! I have the parent object, I don't need to create a new one or guess the ID." This is cleaner, faster, and much more readable than manually fiddling with ID arrays.</p>
<p><strong>Explicit Naming:</strong> Although Laravel often guesses the relationship name correctly (e.g., inferring <code>blog</code> from the <code>Blog</code> model), <strong>explicitly defining the relationship name (</strong><code>'blog'</code>) is the most robust and highly recommended approach. It guards against cases where your relationship method might be named differently (e.g., <code>author</code> instead of <code>user</code>) or where the relationship is ambiguous.</p>
<h2 id="heading-additional-approach-sequential-data">Additional Approach: Sequential Data</h2>
<p>Sometimes you need to create a batch of records, and each one needs a unique, predictable value (e.g., status, order). <strong>Please, for the love of clean code, do not write a</strong> <code>for</code> loop for this.</p>
<p>Laravel's <code>sequence()</code> helper is the right tool. It allows you to specify a set of attributes that cycle through the created models.</p>
<h4 id="heading-example-sequential-roles">Example: Sequential Roles</h4>
<p>Suppose you need to create three users with distinct roles in a single batch.</p>
<pre><code class="lang-php"><span class="hljs-keyword">use</span> <span class="hljs-title">App</span>\<span class="hljs-title">Models</span>\<span class="hljs-title">User</span>;

$users = User::factory(<span class="hljs-number">3</span>)
    -&gt;sequence(
        [<span class="hljs-string">'role'</span> =&gt; <span class="hljs-string">'user'</span>],     <span class="hljs-comment">// Assigned to User 1</span>
        [<span class="hljs-string">'role'</span> =&gt; <span class="hljs-string">'editor'</span>],   <span class="hljs-comment">// Assigned to User 2</span>
        [<span class="hljs-string">'role'</span> =&gt; <span class="hljs-string">'admin'</span>]     <span class="hljs-comment">// Assigned to User 3</span>
    )
    -&gt;create();

<span class="hljs-comment">// 1 Query executed. </span>
<span class="hljs-comment">// User 1 will have role 'user'</span>
<span class="hljs-comment">// User 2 will have role 'editor'</span>
<span class="hljs-comment">// User 3 will have role 'admin'</span>
</code></pre>
<h2 id="heading-things-to-keep-in-mind">Things to Keep in Mind</h2>
<p>Before you go refactoring your entire codebase, here are a few trade-offs to consider. This approach prioritizes control and performance, but it changes how you interact with <a target="_blank" href="https://laravel.com/docs/eloquent-factories">Model Factories</a>.</p>
<h3 id="heading-1-the-convenience-tax">1. The "Convenience Tax"</h3>
<p>By setting <code>blog_id =&gt; null</code>, your factories will no longer work "out of the box" without arguments. Calling <code>Comment::factory()-&gt;create()</code> will now throw a database integrity error because the <code>blog_id</code> is missing. <strong>This is a feature, not a bug!</strong> It forces you to be intentional about where your data belongs. You must explicitly chain <code>-&gt;for()</code> or <code>-&gt;withNewBlog()</code>, or simply pass the ID manually: <code>Comment::factory()-&gt;create(['blog_id' =&gt; $blog-&gt;id])</code>.</p>
<h3 id="heading-2-refactoring-legacy-projects">2. Refactoring Legacy Projects</h3>
<p>Be careful when applying this to an existing codebase. If you change a widely used factory (like <code>UserFactory</code>), you might break hundreds of old tests that implicitly relied on it creating a profile or team in the background. It's often safer to apply this to <em>new</em> factories or refactor incrementally.</p>
<h2 id="heading-conclusion">🚀 Conclusion</h2>
<p>The core lesson is simple: <strong>Do not call</strong> <code>-&gt;create()</code> inside your factory's <code>definition()</code> method.</p>
<p>By adopting semantic relationship methods (<code>for()</code>) and using conditional factory states (Method 1) or <code>sequence()</code> for variety, you eliminate database ghosts, make your test setup readable, and significantly speed up your testing pipeline. Your tests will thank you.</p>
]]></content:encoded></item><item><title><![CDATA[Personalized User Experience With AI]]></title><description><![CDATA[AI-based personalization in user experience (UX) design involves using artificial intelligence and machine learning to tailor digital interfaces, content, and interactions to individual users in real time.
Introduction
However, nowadays users do not ...]]></description><link>https://blog.jobins.jp/personalized-user-experience-with-ai</link><guid isPermaLink="true">https://blog.jobins.jp/personalized-user-experience-with-ai</guid><category><![CDATA[AI]]></category><category><![CDATA[UX]]></category><category><![CDATA[Personalization ]]></category><dc:creator><![CDATA[Suresh Sapkota]]></dc:creator><pubDate>Tue, 25 Nov 2025 06:01:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1763395924487/ef1845ea-26a5-44b3-802c-7e98c213a4b7.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI-based personalization in user experience (UX) design involves using artificial intelligence and machine learning to tailor digital interfaces, content, and interactions to individual users in real time.</p>
<h2 id="heading-introduction">Introduction</h2>
<p>However, nowadays users do not feel content with a smooth user flow, colorful animations and the aesthetically pleasing user interface. They require more custom user experience (UX) of products, systems, or services. Only when they feel a sense of personal and individual communication will they show their loyalty and choose one product or service over others.</p>
<p>Effortless UX designs aim at getting individualized behavioral data in order to increase the customer interaction in an effective manner. The opportunities of artificial intelligence (AI) and machine learning in personalized UX design are considered to be one of the up-and-coming trends that are gaining popularity.</p>
<p>Most organizations are willing to make the UX of their products or services more personal using AI technology. As AI is adopted, UX will experience a considerable transformation to make it more user-satisfied, personalized, and increase positive user behavior. AI uses the data that is gathered by the system to customize products, systems, or services according to the unique needs of the users.</p>
<p>Evidently, AI helps to personalize UX, making it more individualized and approachable. With the increasing scale of UX data, AI has become a promising technique to extract knowledge from this data and aid in designing personalized UX. However, with an abundance of user information, hyper-contextual and hyper-personalized experiences can finally be designed. It allows users the freedom to create a platform tailored to their own needs.</p>
<h2 id="heading-benefits-of-ai-driven-personalization">Benefits of AI-Driven Personalization</h2>
<h3 id="heading-collect-user-information">Collect User Information</h3>
<p>Collected user information is frequently used to provide various individual or personalized experiences. This data enables the creation of unique interactions that closely align with users’ interests and needs, whether by gathering user preferences directly or analyzing past experiences to predict relevance. In today's digital world, users encounter orchestrated content controlled by marketers and algorithms that determine which products or services they are shown. Organizations often encourage users to build profiles on websites or apps, starting with basic registration details such as name, age, behavior, and interests. However, transparency and consent are crucial when collecting user data in this manner.</p>
<p>AI-based personalization offers significant advantages in user data collection. By utilizing algorithms, AI creates profiles of potential customers based on factors like demographics, geolocation, behavior, and device usage. Once information is collected, AI- based personalization tailors every interaction a customer has with a brand. For example, Google tracks users' upcoming travel plans, appointments, and other events stored on their devices, notifying them before scheduled times.</p>
<hr />
<h3 id="heading-enable-user-engagement">Enable User Engagement</h3>
<p>Collecting user data is vital for personalized UX design, however it will only be as valuable as the willingness of users to contribute. Customer acquisition is one thing. Engagement is a measure of how much users actually engage with the website or app. The flip side of more engagement is more active users and therefore a lot more user data. Below are four of the most powerful strategies you can adopt to drive user engagement and enable personalized content from data capture:</p>
<ul>
<li><p>A streamlined and efficient on-boarding process encourages more users to participate. Complex UX processes can deter users, so reducing account creation steps and offering various registration options is advisable. Providing feature education during on-boarding helps users understand functionality through action.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763910579467/2af94402-f616-4c2a-9ee3-fac9847f73ca.jpeg" alt class="image--center mx-auto" /></p>
</li>
<li><p>UX messages aligned with users' needs and preferences encourage continued product use. These messages might include alerts about application issues, payment failures, or updates. Segmenting audiences and designing personalized content ensures relevance and value in the information users receive.</p>
</li>
<li><p>Provision of motivation like rewards or loyalty programs exploits user engagement. Such programs do not only promote the use of the product but they also generate a feeling of significance and identification with the brand.</p>
</li>
</ul>
<hr />
<h3 id="heading-personalize-the-content">Personalize the Content</h3>
<p>Personalization on content is a tactic which utilizes visitor information to provide content that is related to interests and motivations in the audience. This is an expediency method to user experience, which effectively links audiences to the information they require, and increases their chances of turning lead. It is known to be an essential element in the AI-enhanced customization of UX design, which is appreciated by both decision-makers and professionals in quality control.</p>
<p>Content personalization becomes particularly impactful when users can directly manipulate data to adapt content to their preferences. When the data of users is obtained and their needs and interests are known, profiles may also be tailored to them. This involves calling users by their name, displaying material that is relevant to their interests, and suggesting similar material depending on the actions that they do. The personalized approach can be further promoted by the streamlining of forms to automatically fill in with the information provided by the user. Let’s clear with Spotify example.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Spotify: A marketing strategy in Personalization at massive scale</strong></div>
</div>

<p>Spotify isn’t just a music app — it’s one of the world’s smartest personalization machines.</p>
<p>With <strong>207+ million active listeners globally</strong>, Spotify quietly collects and processes an unbelievable <strong>100 billion data signals every single day</strong>. Every tap, skip, search, playlist add, and repeat plays a role.</p>
<p><a target="_blank" href="https://newsroom.spotify.com/2023-10-18/how-spotify-uses-design-to-make-personalization-features-delightful/">And what does Spotify do with all this data</a>?<br />It turns it into <em>experiences that feel made just for you</em>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763908934800/9b407cce-e022-4a38-b60c-09255aa3e89d.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-discover-weekly-the-star-of-personalization">🌟 <strong>Discover Weekly: The Star of Personalization</strong></h3>
<p>One of Spotify’s most celebrated features, <strong>Discover Weekly</strong>, is a perfect example of Big Data + AI working in harmony.</p>
<p>Here’s what makes it magic:</p>
<ul>
<li><p>It blends your listening behavior with patterns from people who love similar music.</p>
</li>
<li><p>Machine learning models then analyze these patterns to predict what you’re likely to enjoy next.</p>
</li>
<li><p>And voilà — every Monday, you get a fresh 30-track playlist that feels uncannily accurate.</p>
</li>
</ul>
<p>The result?</p>
<p>🚀 <strong>Over 40 million people listened to Discover Weekly in its first year alone.</strong><br />That’s not just a feature — that’s a global hit created by data.</p>
<hr />
<h3 id="heading-ai-model">AI Model</h3>
<p>AI model, particularly neural networks, operates in a manner like neurons in the human brain. Neural networks are a widely used AI model, and understanding their specific architectures involves viewing each "neuron" within the network as a node (as shown in below figure). In a neural network, layers consist of multiple nodes, creating a hierarchical structure with multiple layers. Each node, or perceptron, takes inputs and computes a weighted sum, into multiple linear regression.</p>
<p>This calculated signal is subsequently subjected to an activation function which is usually nonlinear and therefore adds complexity and enables the network to capture nonlinear relationships in data. Such a process of weighted sums and activations of layers allows neural networks to learn and capture the intricate patterns and relationships in data and is a potent instrument in AI and machine learning. There are <a target="_blank" href="https://www.tableau.com/data-insights/ai/algorithms">three sub-categories of AI algorithms that are distinguished by their applications and availability of data.</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763396662620/d0d5d304-ff39-4e06-a0bb-7ea3a01d20d4.webp" alt class="image--center mx-auto" /></p>
<p>Supervised learning algorithms make predictions based on correctly labeled data, where each example in the dataset is accompanied by a label or output. This labeled data allows the algorithm to learn a mapping from inputs to outputs. For example, in the case of photos with relevant tags or houses with characteristics and prices, supervised learning can predict tags for new photos or estimate the price of a new house based on its features. If the output to predict is a list of labels or values, it's called classification. If the output is a numerical value, it's called regression. Supervised learning involves fitting a model (like a line in simple cases or more complex models in others) to the labeled data to generalize patterns and make predictions on new, unseen data.</p>
<p>Unsupervised learning algorithms investigate unclassified data, where no labels or outputs are given. The algorithm determines patterns or structures in the data instead. An example is on e-commerce where the item relationships can be discovered through unsupervised learning, or a product can be suggested to a customer based on their viewing or buying pattern, without necessarily knowing what they mean by meaningful outputs (such as type of product or taste). In case the algorithm discovers clusters of related items, it is referred to as clustering. When it finds a link or a rule in the data like people who purchase product A also have a tendency of buying product B, it is referred to as association.</p>
<p><img src="https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExZTZnZWR6YWp1NXp2NzMyeXdmejgwN3YzbWgyeTNrZGx5eHVpd3UzYiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/iPj5oRtJzQGxwzuCKV/giphy.gif" alt /></p>
<p>As compared to supervised and unsupervised learning, reinforcement learning does not depend on an already existing dataset. Rather, an agency becomes trained to make decision by trial and error interaction with a dynamic environment. Feedback is presented to the agent in the form of rewards or penalties depending on what the agent does. Reinforcement learning is aimed at enabling the agent to acquire the best behavior that gathers a maximum of cumulative reward with time. In the example of something as Mario or a strategic game as Go and Dota, reinforcement learning algorithms can be taught to play by maximizing rewards (such as picking up coins) or minimizing punishment (such as losing points or lives).</p>
<hr />
<h3 id="heading-key-concern-and-challenges">Key Concern and Challenges</h3>
<p>The AI is fast expanding and although it is an incredible convenience, it also causes certain real concerns. Human beings are afraid of privacy, employment and the extent to which machines will control the process of making decisions. There is also the aspect of biased data which may result in unfair results. And with AI being more and more powerful, the need to keep it safe, transparent and human-centered is more than ever before.</p>
<h3 id="heading-ai-bias">AI bias</h3>
<p>People have a common myth that since AI is a computer system, it is inherently unbiased. However, this is obviously untrue. AI is only as unbiased as the data and people training the AI programs. So if the data is flawed, impartial, or biased in any way. Then the final result that AI will generate will also be biased as well.  The two main types of bias in AI are “data bias” and “societal bias.”</p>
<p><strong>Data bias</strong> is when the data used to develop and train an AI is incomplete, skewed, or invalid. This can be because the data is incorrect, excludes certain groups, or was collected in bad format.</p>
<p>On the other hand, <strong>societal bias</strong> is when the assumptions and biases present in everyday society make their way into AI through blind spots and expectations that the programmers held when creating the AI.</p>
<h3 id="heading-lack-of-transparency">Lack of transparency</h3>
<p>In AI decision-making, one can quite often not know the method of how and why decisions were made. Such transparency can confuse and lower the trust of the users. Individuals might be concerned about whether the outcomes are fair, precise or skewed in any manner. In case mistakes are made, it is extremely hard to recognize the reason and correct the problem. Users may experience the feeling of powerlessness, such as their inability to control the technology. This may have a particular effect on such crucial aspects as healthcare, employment, and economics. AI must be more transparent in explaining its decisions and make them more trustworthy. The better we understand the way AI works, the safer and more confident we will be allowed to use it.</p>
<h3 id="heading-mis-personalization">Mis-Personalization</h3>
<p>Providing correct &amp; enjoyful information on user’s activity will satisfy user who is using the product or service. But, when personalization becomes <em>too accurate</em> or <em>too frequent</em>, users may feel monitored or trapped in a bubble, as having fear &amp; want to reducing discovery and freedom from the system. Which may also tends to disconnect with system.</p>
<p>Also, when AI unable to understands user intent or context, the final recommendations can be irrelevant or frustrating from the actual context. In that case, we need more mature &amp; developed AI system. Which, can communicate like human by understanding user’s behavior, preferences, or context.</p>
<h3 id="heading-legal-responsibility">Legal responsibility</h3>
<p>The issue of legal liability, which is related to nearly every other danger mentioned above. Who is in charge when something goes wrong? The AI itself? Who created it, the programmer? The business that put it into practice? Or is it the fault of the human operator if there was a human involved?</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Let’s take an example for a self-driving car that killed a pedestrian in the road, where the backup driver was found at fault while investigation. But does that set the precedent for every case involving AI? Probably not, as the question is complex and ever-evolving. Different uses of AI will have different legal liabilities if something goes wrong. </div>
</div>



<hr />
<h3 id="heading-conclusion">Conclusion</h3>
<p>The fact is that AI does improve personalized UX more than any traditional tech or marketing fad. It enables more meaningful, personalized engagement between brands and their users at scale, harnessing actionable insights to automate repetitive processes giving human resources more time to be creative and focus on what matters most. And while there’s handwringing about A.I. taking the jobs of humans, it’s not clear that professions that demand high levels of innovation, creativity and experience will go away any time soon. AI is great at automating repetitive tasks and analyzing large data sets — which are normally time-sinks, albeit not particularly creative ones.</p>
<p>AI will more likely be used to enhance their knowledge by managing the routine jobs and allowing humans to focus on things for which common sense, intuition, and creativity are crucial. In short, AI's place in the workforce is one of augmentation not replacement with human skills and capabilities. Through incorporating AI in the workflow, businesses improve their productivity, users’ experiences and enable employees to spend more time on meaningful parts of their jobs.</p>
<h3 id="heading-references">References</h3>
<p>Image: Spotify AI-Driven music experience<br /><a target="_blank" href="https://medium.com/@tiwariaman0305/spotify-the-art-of-personalization-user-engagement-in-ux-design-2ca861bfaf78">https://medium.com/@tiwariaman0305/spotify-the-art-of-personalization-user-engagement-in-ux-design-2ca861bfaf78</a><br />Image: How AI model works<br /><a target="_blank" href="https://www.openxcell.com/blog/ai-models/">https://www.openxcell.com/blog/ai-models/</a><br /><a target="_blank" href="https://giphy.com/gifs/gigabyte-official-ai-machine-learning-gigabyte-iPj5oRtJzQGxwzuCKV">Gif src: giphy.com</a><br />Research reference from : Yangyang Lu, Hanyu Liu</p>
]]></content:encoded></item><item><title><![CDATA[Understanding Japanese UX/UI Design: Key Insights]]></title><description><![CDATA[Why Japanese Websites and Apps Look Different
Ever noticed how Japanese websites and apps often look very busy compared to what you usually see? They might have lots of text, bright colors, and many different sections all on one page. To many of us, ...]]></description><link>https://blog.jobins.jp/understanding-japanese-uxui-design-key-insights</link><guid isPermaLink="true">https://blog.jobins.jp/understanding-japanese-uxui-design-key-insights</guid><category><![CDATA[Japan]]></category><category><![CDATA[UI Design]]></category><category><![CDATA[UX]]></category><category><![CDATA[Design]]></category><dc:creator><![CDATA[Abishek  Chuhan]]></dc:creator><pubDate>Sun, 27 Jul 2025 18:15:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753718630463/3d2dbb89-1774-4af3-8950-575a4d0b1d5a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXftZl1Vf6zLlshTfVRO9J2pv1OLCnKUFsnKyzltKDI00jeL5ldN2ZCljmPXynkWjovIdF9Y7D6iLlcEbNid7UpAGlvaFlGnFoWUNbJYKgWADIpm41uwfB9W5LlJF9hqLMVSvU5_WQ?key=ua6fwA_LOB80pECh8Vn2Yg" alt="Japanese UI Design Example" /></p>
<h2 id="heading-why-japanese-websites-and-apps-look-different"><strong>Why Japanese Websites and Apps Look Different</strong></h2>
<p>Ever noticed how Japanese websites and apps often look very busy compared to what you usually see? They might have lots of text, bright colors, and many different sections all on one page. To many of us, this might seem messy or old-fashioned. But what if this isn't a mistake? What if it's actually a smart way to design for Japanese users, based on their culture and how they like to get information?</p>
<p>This blog post will help you understand why Japanese digital experiences are unique. Whether you're a business leader, a designer, or just curious, get ready to see design from a new angle. You'll learn why, in Japan, being different actually works better.</p>
<p><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdTkXAXtVRIIi5Vl5I7KDe1TwtFV7iq8aaSD8uNjC7v12J0qCS8wKRqbs5f42gmtte2nv8LfqpUFv_b_mrayVgSxT4q2_GH5qQLp6B9X5OGfoCVKo8LMHz_quDFEaLbOaoDwibq?key=ua6fwA_LOB80pECh8Vn2Yg" alt="Western vs Japanese UI Design" /></p>
<h2 id="heading-culture-shapes-design-how-japanese-values-influence-uxui"><strong>Culture Shapes Design: How Japanese Values Influence UX/UI</strong></h2>
<p>To understand Japanese digital design, we need to look at their culture. Japan is a high-context culture. This means people understand a lot from unspoken cues, shared history, and the situation itself, rather than needing everything spelled out directly. Think of it like a close-knit family where everyone knows what each other means without saying much.</p>
<p>Because of this, Japanese users often prefer to see all the information upfront. They want to be sure they have every detail before making a decision. This might look overwhelming to someone from a low-context culture (like many Western countries) where information is given bit by bit. But for Japanese users, it’s about feeling secure and having a complete picture.</p>
<p>Another key idea is <strong>wa</strong> (harmony). Japanese society values smooth relationships and avoiding conflict. In design, this means creating experiences that are easy, clear, and reassuring. Websites and apps often provide lots of guidance to prevent any confusion or frustration. It’s about making users feel comfortable and respected.</p>
<p>Then there’s <strong>omotenashi</strong>, which is the special Japanese way of hospitality. It’s about anticipating someone’s needs and fulfilling them without expecting anything in return. In the digital world, this translates to designs that are super detailed, give full information, and guide users every step of the way. It’s like a thoughtful host making sure you have everything you need, reflecting the amazing service you find in Japan.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753719128226/633122bd-b760-4d3a-97d2-21c2af3c3783.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-language-matters-how-japanese-writing-affects-design"><strong>Language Matters: How Japanese Writing Affects Design</strong></h2>
<p>Japanese is a unique language with three different writing styles: Kanji, Hiragana, and Katakana. This makes designing for Japanese very different from designing for languages like English. For example, Japanese doesn't use italics or capital letters to highlight words.</p>
<p>So, designers have to find other ways to make important text stand out. They use different font sizes, bold text, colors, and even boxes or backgrounds. This is one reason why Japanese websites can look busy – designers are trying to make up for the lack of simple Western text tools.</p>
<p>Because of these language features, Japanese websites often have a lot of text packed into a small space. While this might seem overwhelming to an English speaker who likes lots of empty space, Japanese readers are used to it and often prefer it. They are comfortable with a lot of visual information, which shows how good they are at reading and understanding complex layouts.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753719340796/9e86168a-bf2b-4719-8db8-2df2b1c35fad.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-real-examples-seeing-the-differences-in-action"><strong>Real Examples: Seeing the Differences in Action</strong></h2>
<p>Let’s look at some real-world examples to see how these cultural and language differences show up in Japanese digital design.</p>
<h3 id="heading-rakuten-the-online-shopping-mall"><strong>Rakuten: The Online Shopping Mall</strong></h3>
<p>Rakuten, a huge online store in Japan, looks very different from Amazon or eBay. Its homepage is full of products, ads, and deals. It might seem like a lot to take in.</p>
<p>But this design is on purpose. It’s like walking into a busy Japanese department store or a lively shopping street. Japanese shoppers love to see many options and find good deals. The detailed layout gives them all the information they need to feel confident about buying something. It builds trust because everything is out in the open.</p>
<h3 id="heading-yahoo-japan-your-all-in-one-online-hub"><strong>Yahoo! Japan: Your All-in-One Online Hub</strong></h3>
<p>Yahoo! Japan’s homepage is another example of a busy, information-packed design. Unlike Yahoo in other countries, which is much simpler, Yahoo! Japan has news, weather, shopping, and more, all on one page. This is because Japanese users often prefer one place for all their information, making things efficient.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753719501138/a5b6fac0-4f67-4c35-8c48-34f12036f278.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-cookpad-recipes-with-lots-of-detail"><strong>Cookpad: Recipes with Lots of Detail</strong></h3>
<p>If you compare the Spanish and Japanese versions of Cookpad (a recipe app), you’ll see a big difference. The Spanish version uses big, beautiful food pictures. The Japanese version, however, focuses on detailed written instructions, user comments, and exact measurements. Pictures are there, but the text is key.</p>
<p>This shows that Japanese users want clear, step-by-step guides and value what other users say. This helps them avoid mistakes and feel more successful, which is important in Japanese culture.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753719460724/5495159f-aa2b-425d-b241-32005daf4833.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-line-fun-and-expressive-messaging"><strong>LINE: Fun and Expressive Messaging</strong></h3>
<p>LINE, Japan’s most popular messaging app, is very different from simple messaging apps in the West. LINE is famous for its stamps (large, fun stickers) and emojis. These aren’t just decorations; they’re a big part of how people communicate in Japan.</p>
<p>Stamps and emojis help users show feelings and social cues that might be hard or rude to say directly in text. They add a touch of kawaii (cuteness) and playfulness that Japanese people love. This visual language helps people connect better and makes conversations richer, showing how design can be made for a specific culture.</p>
<h3 id="heading-don-quijote-organized-chaos-online"><strong>Don Quijote: Organized Chaos Online</strong></h3>
<p>The website for Don Quijote, a famous Japanese discount store, is like its physical stores: a colorful, busy, and exciting place. It’s packed with bright colors, flashing ads, and tons of product info. For someone from the West, it might feel like too much.</p>
<p>But for Japanese shoppers, this design creates the same excitement and feeling of discovery they get in the actual store. The busyness is part of the brand’s charm, hinting at great deals and unique items. It proves that what might seem like bad design can actually be very effective and loved when it fits the culture.</p>
<h2 id="heading-what-this-means-for-global-design"><strong>What This Means for Global Design</strong></h2>
<p>The unique style of Japanese UX/UI teaches us a lot about design for a global audience. It shows that there’s no single right way to design. What works well in one culture might not work in another.</p>
<p>For business leaders, understanding these differences is key to success in Japan. You can’t just translate your Western website into Japanese and expect it to work. You need to truly understand Japanese users and their culture. This means doing your homework to learn how they behave, what they like, and how they communicate. Your digital presence needs to feel natural and right for them.</p>
<p>For designers, the Japanese approach challenges what we usually think of as good design. It makes us rethink ideas like cleanliness, simplicity, and how we organize information. It reminds us that empathy is super important in design – putting yourself in the user’s shoes and seeing the world through their cultural lens. It also shows how powerful visual tools like emojis and stamps can be for expressing ideas and connecting with people.</p>
<p>In short, Japanese UX/UI proves that good design is deeply tied to culture. It’s not about one style being better than another, but about what makes sense and feels right for the people using it. By appreciating these differences, we not only create better digital experiences for Japanese users but also learn to make the internet a more welcoming and effective place for everyone around the world.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>As our world becomes more connected online, designing with cultural differences in mind will become even more important. The Japanese example shows us that great design isn’t about forcing one style on everyone. Instead, it’s about understanding and respecting what makes each group of users unique. It’s about looking past simple translations and really getting into the cultural mindset that shapes how people use technology.</p>
<p>For businesses, this means changing how they approach design. Instead of a one-size-fits-all plan, they need to adopt a more local and understanding way of designing. This means being open to new ideas about what good design is and learning from different cultures. For designers, it’s a chance to grow, to think bigger about how to organize information, use visuals, and subtly communicate meaning in a world where not everything is said directly.</p>
<p>To sum it up, Japanese users aren’t different in a way that’s better or worse. They’re different in a way that deserves respect for their unique culture. By understanding and designing for these differences, we not only open up new opportunities but also make the internet a truly inclusive and effective place for everyone.</p>
<p>Feel free to share your experiences, thoughts, or any questions you have in the comments. I'm here to help you make the most out of these tools!</p>
<p>Until next time, keep designing with passion and creativity!<br />Cheers to building beautiful, intuitive digital experiences! 🎨✨</p>
]]></content:encoded></item><item><title><![CDATA[What is Data Driven Design? How Does Data Help in Design Decisions?]]></title><description><![CDATA[Design often feels like a mix of creativity, gut instinct, and making things look good. Data, on the other hand, is becoming equally significant.
Data can take your design from being just good to extremely great, be it for a website, app, or somethin...]]></description><link>https://blog.jobins.jp/what-is-data-driven-design-how-does-data-help-in-design-decisions</link><guid isPermaLink="true">https://blog.jobins.jp/what-is-data-driven-design-how-does-data-help-in-design-decisions</guid><category><![CDATA[data-and-design]]></category><category><![CDATA[Design]]></category><category><![CDATA[research]]></category><category><![CDATA[Product Design]]></category><dc:creator><![CDATA[Suresh Sapkota]]></dc:creator><pubDate>Fri, 25 Apr 2025 01:49:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744626066590/53ae8a13-db4e-4f59-be52-1ceba629c582.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Design often feels like a mix of creativity, gut instinct, and making things look good. Data, on the other hand, is becoming equally significant.</p>
<p>Data can take your design from being just good to extremely great, be it for a website, app, or something else entirely. So, let's look at it - what exactly is data-driven design and how does it influence decision-making?</p>
<h2 id="heading-what-is-data-driven-design">What Is Data-Driven Design?</h2>
<p>Essentially, data-driven design is the mechanism whereby decisions are made using facts and data—user behavior, feedback, and performance metrics—while not giving any credence to gut feelings or other assumptions.</p>
<p>In another way, a data-driven designer says, "I think this will work. But let's validate the hypothesis and see what the data tells us."</p>
<p>It’s not about taking away from creativity; it’s about bringing in evidence to support it.</p>
<h2 id="heading-types-of-data-for-design">Types of Data for Design?</h2>
<p>Most commonly used data type that helps in decision making &amp; shape the product design are:</p>
<h3 id="heading-quantitative-data">Quantitative Data</h3>
<p>Quantitative information implies the numerical data and can further be analyzed statistically. It answers "how many?" "how often?" "how much?" and "what percent?". This form of data is very useful for identifying trends and patterns and confirming judgments.</p>
<p><strong>Some real examples of Quantitative Data</strong></p>
<ol>
<li><p><strong>Click-through rates (CTR):</strong> A total of 33% of users have clicked on the "Sign Up" button.</p>
</li>
<li><p><strong>Task completion rate:</strong> Checkout process was successfully accomplished by 80% of users.</p>
</li>
<li><p><strong>Time on task:</strong> Users took an average of 2.4 minutes to fill in this form.</p>
</li>
<li><p><strong>Bounce rate:</strong> 35% of users left the site after they had seen only one page.</p>
</li>
<li><p><strong>Conversion rate:</strong> 11% of visitors signed up for the free trial.</p>
</li>
<li><p><strong>User sessions:</strong> In the past week, 1,600 users have used this feature.</p>
</li>
<li><p><strong>A/B test results:</strong> Version B improved sign-up rates by 20% when compared with Version A.</p>
</li>
</ol>
<hr />
<h3 id="heading-qualitative-data">Qualitative Data</h3>
<p>Qualitative data are those that convey ideas and facts that cannot be quantified. They are frequently obtained through focus groups and open-ended feedback, lab notebooks and personal diaries, maps, photos, and other printed materials or observations.</p>
<p><strong>Some real examples of Quantitative Data</strong></p>
<ol>
<li><p><strong>User interview quotes:</strong> The homepage's abundance of options left me feeling overloaded.</p>
</li>
<li><p><strong>Usability testing observations:</strong> When entering payment information, the user appeared perplexed and paused during the checkout process.</p>
</li>
<li><p><strong>Open-ended survey responses:</strong> I totally like the design. It could be better if it had a dark mode.</p>
</li>
<li><p><strong>Support ticket feedback or chat transcripts:</strong> I had to spend an eternity locating the page for resetting my password.</p>
</li>
<li><p><strong>User journey mapping insights:</strong> Users just feel confused during on-boarding. Perhaps the reason is the absence of any progress indicator.</p>
</li>
<li><p><strong>Card sorting or tree testing feedback:</strong> I would look to see 'Billing' under 'Settings,' not 'Support.'</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744629576496/3f5d4e46-9f3d-466d-9c00-3003758877da.jpeg" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-behavioral-data">Behavioral Data</h3>
<p>Behavioral data provide a clear presentation of user preferences, habits, and decisions, it is more based on observation actions. Engagement with your on your website, apps, and servers or product is any activity done by the users, like number of times the page is viewed, new sign-ups, sales, logins or any other action all are interaction that can be tracked.</p>
<p><strong>Some real examples of Quantitative Data</strong></p>
<ol>
<li><p><strong>Click paths / navigation flows:</strong> Monitoring how users navigate through an application or a website.</p>
</li>
<li><p><strong>Button clicks / interaction heatmaps:</strong> 10% of visitors clicked on the call to action on the homepage.</p>
</li>
<li><p><strong>Scroll depth:</strong> On blog posts, 0% user actually scrolling down below 'the fold.'</p>
</li>
<li><p><strong>Feature usage frequency:</strong> Last week, merely 5% of customers used the "Save for later" feature.</p>
</li>
<li><p><strong>Mouse movements &amp; rage clicks (in tools like Hotjar/FullStory):</strong> <em>S</em>hows annoyance or perplexity in some UI sections.</p>
</li>
</ol>
<h2 id="heading-how-data-helps-in-design-decisions">How Data Helps in Design Decisions</h2>
<p>Here’s how data can help throughout the design process:</p>
<h3 id="heading-1-understanding-user-needs">1. <strong>Understanding user needs</strong></h3>
<p>For better design decisions, one can take quantitative data on usage or send out questionnaires to discover what actually are the needs or pain points of customers. You may discover that the user has stopped halfway through the checkout process often-and that should be a point that deserves special investigation.</p>
<h3 id="heading-2-validating-assumptions">2. Validating assumptions</h3>
<p>Imagine you're convinced that the "Save for Later" feature would be something that could really boost engagement. With A/B testing, you can prove whether that belief actually holds true by analyzing some actual behaviors.</p>
<h3 id="heading-3-prioritizing-what-to-work-on">3. Prioritizing what to work on?</h3>
<p>Helps in prioritizing task based on, how data is actually useful for a team in realizing impact. Not by trying to improve many things within a team at once, but which can be shown by the data, indicated about the biggest hole or opportunity.</p>
<h3 id="heading-4-measuring-the-impact-of-design">4. Measuring the impact of design</h3>
<p>Improved user flows with this new navigation? Is that redesign of the homepage effective in driving sign-ups? Data can measure outcomes and provide evidence for the case of value in design decisions.</p>
<h3 id="heading-5-iterating-faster-and-smarter">5. Iterating faster and smarter</h3>
<p>Using design as a fulcrum instead of waiting for a yearly redesign cycle begs the question, "What would the focus be?" Intermodes can be used for design: decide, build, test; learn, tweak, and repeat.</p>
<h3 id="heading-6-sales-amp-marketing">6. Sales &amp; marketing</h3>
<p>Better conversion is through drop-off minimization and support for targeted, high-performing campaigns. Data to guide layouts, messaging, and flow ensures that all touch-points become persuasive. At the end of the day, it leads to better engagement, qualified leads, and revenue.</p>
<h2 id="heading-the-real-world-redesigning-airbnbs-search-results">The Real World: Redesigning Airbnb's Search Results</h2>
<h3 id="heading-the-problem">The Problem:</h3>
<p>Airbnb noticed that users would often click into a listing from search results and quickly return to the search page. This led to a conclusion that users were not finding their needs met by the listing preview, which frustratingly affects their booking decision.</p>
<h3 id="heading-the-evidence">The Evidence:</h3>
<ul>
<li><p>There was a high CTR but a fairly low conversion rate with regard to bookings.</p>
</li>
<li><p>Session replay analyzes and scroll depth analysis showed many users went through the listings but clicked into only a few of them.</p>
</li>
<li><p>User feedback indicated that the important information (e.g., price, cancellation policy, and amenities) was not obvious in the preview.</p>
</li>
</ul>
<h3 id="heading-the-design-solution">The Design Solution:</h3>
<ul>
<li><p>The redesigned search results page listing cards were made with features concerning:</p>
</li>
<li><p>Presenting upfront information (price, rating, and amenities).</p>
</li>
<li><p>Implementing filters based on user habits.</p>
</li>
<li><p>Enhancing visibility hierarchy and spacing to reduce clutter.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744565296810/5f7e4d12-c3dc-4a25-a529-23dc19163bb3.webp" alt class="image--center mx-auto" /></p>
<p>Image src: airbnb</p>
<h3 id="heading-the-results">The Results:</h3>
<ul>
<li><p>Decrease in bounce rate for listing pages.</p>
</li>
<li><p>Increased interaction with search filters.</p>
</li>
<li><p>Increase in bookings, especially in favor of mobile users.</p>
</li>
<li><p>Users' feedback was positive regarding how easy it was to understand and compare.</p>
</li>
</ul>
<h2 id="heading-best-tools-for-data-driven-design">Best Tools for Data-Driven Design</h2>
<h3 id="heading-1-analytics-amp-behavior-tracking">1. Analytics &amp; Behavior Tracking</h3>
<p>What users are doing in your product or on your website.</p>
<p><strong>Google Analytics:</strong> The tool for user flow, traffic, bounce rates, and overall conversion goals.</p>
<p><strong>Mixpanel:</strong> Fantastic for product analytics, funnel segmentation and cohort retention.</p>
<p><strong>Amplitude:</strong> Strongly built for behavior insight and journey tracking, with advanced segmentation capabilities.</p>
<p><strong>Heap:</strong> Automatically captures ""all"" user interactions without any manual tagging.</p>
<p><strong>Plausible (privacy-optimized):</strong> An analytics tool that is lightweight, cookie-free.</p>
<hr />
<h3 id="heading-2-session-replay-amp-heatmaps"><strong>2. Session Replay &amp; Heatmaps</strong></h3>
<p>These tools helps you to see how users interact with your design.</p>
<p><strong>Hotjar:</strong> Heat maps, scroll tracking, and session recordings are great for discovering UX issues.</p>
<p><strong>FullStory:</strong> It's an advanced session replay with detailed user journey data.</p>
<p><strong>Smartlook:</strong> Very similar to Hotjar, but offers event tracking and insights into user sessions.</p>
<p><strong>Clarity from Microsoft:</strong> It's a free tool and surprisingly robust for heatmaps and session replays.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744630478946/56edf9da-b915-4f02-b67a-c1fecfe5a454.jpeg" alt class="image--center mx-auto" /></p>
<h3 id="heading-3-user-feedback-amp-surveys"><strong>3. User Feedback &amp; Surveys</strong></h3>
<p>Tools for collecting qualitative data directly from users.</p>
<p><strong>Typeform:</strong> Clean and interactive surveys for gathering structured feedback.</p>
<p><strong>Google Forms:</strong> Simple and effective for internal or user research.</p>
<p><strong>Usabilla / GetFeedback</strong>: In-product feedback widgets and surveys.</p>
<p><strong>Survicate:</strong> Surveys based on user behaviour.</p>
<p><strong>UserVoice:</strong> Effective at collecting product feedback and prioritizing features.</p>
<hr />
<h3 id="heading-4-ab-testing-amp-experimentation"><strong>4. A/B Testing &amp; Experimentation</strong></h3>
<p>Test your design decisions against real users.</p>
<p><strong>Optimizely:</strong> This is Enterprise-level A/B and multivariate testing.</p>
<p><strong>VWO (Visual Website Optimizer):</strong> Easy-to-use A/B testing for web interfaces.</p>
<p><strong>Convert:</strong> A platform that does A/B testing in compliance with privacy rules, with robust reporting.</p>
<p><strong>Launchdarkly:</strong> For feature flagging and controlled rollout, useful for product teams.</p>
<hr />
<h3 id="heading-5-research-amp-usability-testing">5. Research &amp; Usability Testing</h3>
<p>Tools that will help you dig deeper into the why behind user behavior.</p>
<p><strong>Maze:</strong> Replicate your design prototypes (from Figma, Adobe XD etc.) with real users and get data-rich reports.</p>
<p><strong>Lookback:</strong> User interviews, remote usability testing, and session recordings.</p>
<p><strong>User Testing:</strong> Access a large panel of users to test your design ideas.</p>
<p><strong>Dovetail:</strong> Organizes qualitative research findings like interview notes and insights.</p>
<p><strong>ShopOptimal Workshop:</strong> Card sorting, tree testing, and information architecture tools.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744629371694/2eac7bdd-036a-4806-81de-007be0712172.jpeg" alt class="image--center mx-auto" /></p>
<p>Source: makeameme.org</p>
<h2 id="heading-summary">Summary</h2>
<p>The data-driven design is one of the strategies situated at the intersection of creativity and real-life insights that make for better and user-centered design decision-making. Rather than making unreflected design decisions, one would incorporate quantitative and qualitative data and behavioral data-from analytics, to conversion rates, A/B tests, user interviews, and interaction heat maps-in order to frame understanding of user needs, validate assumptions, prioritize for improvement, and assess impact. With this, usability and engagement may be improved, iteration cycles become a more intelligent process, and alignment with business objectives is now a reasonable assurance. This gives designers a reasonable assurance that design experiences will be worthy-not just pretty, but truly impactful and results-driven.</p>
<p>🙏 Thanks for reading the post, you are welcome to comment &amp; leave feedback 🙂🙂🙂</p>
]]></content:encoded></item><item><title><![CDATA[Bridging the Gap: How Designers and Developers Can Truly Collaborate]]></title><description><![CDATA[The Age-Old Tug of War
Imagine building a bridge—one team on the left, one on the right, to meet perfectly in the middle. But what happens when one side builds with bricks while the other uses steel? Or when the teams don't communicate until the fina...]]></description><link>https://blog.jobins.jp/bridging-the-gap-how-designers-and-developers-can-truly-collaborate</link><guid isPermaLink="true">https://blog.jobins.jp/bridging-the-gap-how-designers-and-developers-can-truly-collaborate</guid><category><![CDATA[UI Design]]></category><category><![CDATA[ux design]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[full stack]]></category><category><![CDATA[Design]]></category><dc:creator><![CDATA[Abishek  Chuhan]]></dc:creator><pubDate>Sun, 23 Mar 2025 18:15:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1742785102433/906b03dc-0150-4894-a258-b95cd55f0b53.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-the-age-old-tug-of-war"><strong>The Age-Old Tug of Wa</strong>r</h1>
<p>Imagine building a bridge—one team on the left, one on the right, to meet perfectly in the middle. But what happens when one side builds with bricks while the other uses steel? Or when the teams don't communicate until the final moment? Disaster. This mirrors the reality of most designer-developer relationships.</p>
<p>Designers communicate through images, emotions, and aesthetics, while developers focus on logic, functionality, and usability. Though they're creating the same product, they might as well be working on different planets. The result? Frustration, wasted time, and a final product that strays far from its original vision.</p>
<p>But it doesn't have to be this way.</p>
<h1 id="heading-step-1-build-a-shared-understanding">Step 1: Build a Shared Understanding</h1>
<p>While designers and developers don't need to master each other's work, they must understand and value how the other thinks—this is the key to effective collaboration.</p>
<p><strong>For Designers:</strong> Look beyond pure aesthetics and consider how interactions shape real product experiences. Think about your design's performance, accessibility, and scalability. Remember that a product's success depends on both its appearance and functionality. Consider key questions: How will the design perform across different environments? How well does it adapt to various screen sizes? Can users with disabilities access it effectively?</p>
<p><strong>For Developers:</strong> Don't simply focus on making things work—understand how design choices shape the user's journey. Look beyond technical implementation to see the bigger picture. How do micro-interactions, typography, and spacing enhance the overall user experience? In what ways does the design either support or impede user satisfaction and functionality?</p>
<p>A great product isn’t just about looking good or working well—it’s about seamlessly merging both worlds. Designers and developers need to think of themselves as co-architects of the user experience.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742784329655/db550d5b-50ad-44f4-b472-76623f163d41.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-step-2-kill-the-handoff-mindset">Step 2: Kill the "Handoff" Mindset</h1>
<p>The traditional "handoff" approach—where designers complete their work before passing it to developers—is outdated and ineffective. Instead, embrace ongoing collaboration from day one. This early partnership enables both teams to make informed decisions that strengthen the final product.</p>
<h3 id="heading-bring-developers-into-the-design-process-early">Bring Developers into the Design Process Early</h3>
<p>Instead of waiting until the design is complete to involve developers, bring them into the process during the ideation phase. Here’s how you can do that:</p>
<p><strong>Co-Create Wireframes and Prototypes:</strong> Involve developers in the early wireframing process, where ideas are still in their infancy. Developers can offer valuable input on feasibility, ensuring that the design is realistic and scalable from the start.</p>
<p><strong>Collaborative Design Sessions:</strong> Set up short, focused sessions where both designers and developers can work together to tweak UI elements as the design evolves. This not only reduces confusion but also fosters a sense of shared ownership.</p>
<p><strong>Micro-Check-ins Instead of Formal Reviews:</strong> Instead of waiting for formal design reviews, implement quick, informal check-ins throughout the design process. These check-ins can help identify potential issues before they become major roadblocks.</p>
<p>The goal is to make the design and development process iterative, not linear. Both teams should be in sync from start to finish, making continuous improvements rather than handing off finished work for someone else to execute.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742784385935/835f5ddf-97d2-4add-868e-e72b0e5a85c5.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-design-iteratively-with-feedback-loops">Design Iteratively with Feedback Loops</h3>
<p>Great collaboration doesn’t happen with one big feedback session at the end of a project—it happens through constant iteration.</p>
<p><strong>Design Prototypes that Developers Can Test:</strong> Create interactive prototypes early in the process that developers can play with. This gives them a sense of how the design will feel and lets them provide real-time feedback on functionality, usability, and performance.</p>
<p><strong>Developer-First Annotations:</strong> Add clear annotations to your designs to explain behaviors, transitions, and expected outcomes. This will help developers understand the nuances of your designs and how they are meant to function, making it easier for them to implement.</p>
<p><strong>Frequent Sync-ups:</strong> Schedule regular, short syncs to discuss progress, challenges, and any necessary adjustments. These informal meetings help both teams stay aligned and adapt as needed, preventing any last-minute surprises.</p>
<p>The more often designers and developers communicate and collaborate, the smoother the process becomes.</p>
<h1 id="heading-step-3-replace-the-wall-with-a-window">Step 3: Replace the Wall with a Window</h1>
<p>Most of the time, communication between designers and developers happens through siloed channels—Slack threads, Jira tickets, and emails. These isolated conversations can create barriers and lead to misunderstandings.</p>
<p>To improve this, make everything visible and interactive. Transparency is key to building trust and fostering collaboration.</p>
<p><strong>Join Design Critiques and Code Reviews:</strong> Design and development critiques should happen together, not separately. Let designers and developers review each other's work. Designers can give feedback on code implementation, while developers can highlight how design choices affect the product’s functionality.</p>
<p><strong>Live Prototyping:</strong> Instead of static wireframes or design files, use interactive prototypes that simulate real user interactions. This allows developers to visualize the final product more clearly and understand the context of each design element.</p>
<p><strong>Shared Workspaces:</strong> Utilize collaborative tools like Notion, Miro, or Confluence to document decisions, updates, and guidelines. This keeps both teams on the same page and ensures that all information is accessible to everyone.</p>
<p>Think of it as replacing a brick wall with a glass window—transparency leads to better collaboration and a more cohesive product.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742784355679/803a81f4-a34f-40ae-b5cb-11acd34ffa37.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-step-4-build-empathy-through-role-reversal">Step 4: Build Empathy Through Role Reversal</h1>
<p>Empathy is at the heart of collaboration. If designers and developers truly understand each other’s challenges, they’ll work together more effectively.</p>
<p>One powerful way to build empathy is through role reversal. Take the time to step into each other’s shoes and experience the challenges the other team faces:</p>
<p><strong>Developers:</strong> Try designing a basic user interface and have a designer critique it. You'll quickly realize how intricate and delicate design choices can be and how small changes can affect the user experience.</p>
<p><strong>Designers:</strong> Attempt to build a simple webpage from scratch. It’s harder than it looks, and it will give you insight into the technical constraints developers face daily.</p>
<p>This exercise isn’t about becoming an expert in the other team’s field—it’s about gaining an understanding and appreciation for their work. Empathy goes a long way in improving communication and collaboration.</p>
<h1 id="heading-step-5-align-on-the-why-not-just-the-what">Step 5: Align on the "Why" (Not Just the "What")</h1>
<p>Designers and developers often focus on the "what"—what features to build, what aesthetic choices to make, and what code to write. But the most important question is "why."</p>
<p>Both designers and developers share the same ultimate goal: delivering an exceptional user experience. While designers focus on creating delightful, intuitive interfaces, and developers prioritize scalable, efficient solutions, the core mission transcends individual team preferences. What matters most is understanding how design and development decisions affect the end user.</p>
<p>Always return to the product’s vision. How does this decision impact the user’s experience? How does this feature align with the product’s goals and objectives? When both teams align on the “why,” it becomes much easier to navigate the “what” and the “how.”</p>
<h1 id="heading-final-thoughts-ditch-the-divide">Final Thoughts: Ditch the Divide</h1>
<p>At the end of the day, designers and developers aren’t opponents. They are two sides of the same coin. Instead of working in silos or competition, they should view themselves as co-creators, with the same goal in mind: creating an exceptional product that delivers real value to users.</p>
<p>So let’s stop treating collaboration as a challenge to be solved and start seeing it as a superpower to be unlocked. Because when design and development truly work together, the possibilities are endless. Magic happens.  </p>
<p>Feel free to share your experiences, thoughts, or any questions you have in the comments. I'm here to help you make the most out of these tools!</p>
<p>Until next time, keep designing with passion and creativity!<br />Cheers to building beautiful, intuitive digital experiences! 🎨✨</p>
]]></content:encoded></item><item><title><![CDATA[Product design review | An effective guide to implement]]></title><description><![CDATA[A product design review is a evaluation process within a product development process where designers, product managers, engineers, and stakeholders evaluate a product against its requirements in order to verify that the design have meet the business ...]]></description><link>https://blog.jobins.jp/product-design-review-an-effective-guide-to-implement</link><guid isPermaLink="true">https://blog.jobins.jp/product-design-review-an-effective-guide-to-implement</guid><category><![CDATA[Product Design]]></category><category><![CDATA[management]]></category><category><![CDATA[Collaboration]]></category><dc:creator><![CDATA[Suresh Sapkota]]></dc:creator><pubDate>Fri, 21 Mar 2025 02:05:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1742392611688/fed98768-ac6e-4f91-9c8f-d1c4228abc9c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A product design review is a evaluation process within a product development process where designers, product managers, engineers, and stakeholders evaluate a product against its requirements in order to verify that the design have meet the business requirement with user needs before development. The goal is to ensure that the design is user-friendly, visually consistent, technically feasible, and align with business objectives. During the evaluation, teams evaluate usability, accessibility, user flows, and overall experience to discover areas for improvement early on. This helps to avoid costly development revision later on and guarantees that the final product fits both user needs and business objectives.</p>
<p>A well-structured design review includes a walkthrough of wireframes, prototypes, or mockups, followed by feedback &amp; suggestion from various team members, those are participate in review. It provides an opportunity to evaluate the ideas, refine interactions, and optimize the user experience based on real insights that we have. Product design reviews promote open discussions and organized input, resulting in intuitive, high-quality products that people enjoy while keeping the design and development process efficient.</p>
<h2 id="heading-key-objectives-of-a-product-design-review">✨ <strong>Key Objectives of a Product Design Review</strong></h2>
<ol>
<li><h3 id="heading-validate-user-centered-design">Validate User-Centered Design</h3>
</li>
</ol>
<p>Ensure that the design aligns with the user's needs at each step with focusing of creating useful, usable, and enjoyful solution for the users. UCD design process involved 4 phases, that are:</p>
<ul>
<li><p>Context analysis and user research</p>
</li>
<li><p>Specify user requirements</p>
</li>
<li><p>Design solution</p>
</li>
<li><p>Iterative testing and evaluation</p>
</li>
</ul>
<ol start="2">
<li><h3 id="heading-check-business-amp-product-goals">Check Business &amp; Product Goals</h3>
</li>
</ol>
<p>To ensure that the product design supports key business objectives. While designing the product it should not only be user-friendly but also need to support key metrics like user engagement, conversion rates, or revenue growth. For that we need to define our business goals clearly &amp; need to involve design team early in the process with better communication. That helps to refine the product design on regular basis, before validating the final version with users.</p>
<ol start="3">
<li><h3 id="heading-ensure-technical-feasibility">Ensure Technical Feasibility</h3>
</li>
</ol>
<p>Identify any potential implementation challenges of a design using current or available technology within the define time, budget and system constraints. Technical feasibility while design review helps to collaborate with engineers to assess whether the design aligns with existing technology, infrastructure, and performance capabilities. Early identifying potential technical &amp; implementation challenges early also helps to avoid costly rework and ensures a smooth risk management.</p>
<ol start="4">
<li><h3 id="heading-improve-usability-amp-accessibility"><strong>Improve Usability &amp; Accessibility</strong></h3>
</li>
</ol>
<p>Usability ensures that users can navigate and interact with the product to achieve a defined goal effectively, efficiently and satisfactorily, whereas accessibility ensures that people of all abilities can use it effective way. During a design review, make use that the interface is <strong>i</strong>ntuitive, easy to use, and free of friction**.** Factors like simple &amp; clean UI, easy navigation, search functionality, findable information, visual hierarchy and responsive design to enhance the overall user experience. Products which are usable, useful, findable, accessible, credible, valuable and desirable are much more likely to succeed in the market place.</p>
<ol start="5">
<li><h3 id="heading-maintain-visual-amp-brand-consistency">Maintain Visual &amp; Brand Consistency</h3>
</li>
</ol>
<p>Visual branding is the visual representation of a brand to create your unique identity to gain the trust of your clients and serving as a differentiating yourself from competitors. It includes elements such as logos, typography, color palettes, illustration elements, and design system. With a brand consistency we can create harmonious brand voice throughout all marketing channels like, websites, emails, social media platforms, brochures, posters – everything your potential customers see and interact.</p>
<ol start="6">
<li><h3 id="heading-optimize-performance-amp-scalability">Optimize Performance &amp; Scalability</h3>
</li>
</ol>
<p>Performance and scalability are critical for providing a smooth, efficient user experience as the product grows. During design review we need a discussion, if the design is efficient and adaptable for future updates. When creating layouts, components, and workflows, scalability should be taken into account to make sure they can accommodate growing user traffic, bigger datasets, and new features.</p>
<blockquote>
<p><em>Ask: Will this design operate effortlessly with more users? Can additional elements be introduced without disturbing the experience?</em></p>
</blockquote>
<h2 id="heading-design-review-process">✅ Design Review Process</h2>
<p>A design review is a formal evaluation process where teams collaborate to ensure that the design is user-friendly, technically feasible, and aligned with business goals before implementation phase. Design reviews are crucial because they serve as a quality control in product design, by helping the project is on on right track and aligned with its primary goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742399694517/95e5df83-7bbd-4f45-bd43-ac22cf6e97a2.jpeg" alt class="image--center mx-auto" /></p>
<p>There is no accurate design review process, since review process differ from organization and product design teams. Every design team have their own design review process. Here are few steps that you can implement in your organization design review process;</p>
<h2 id="heading-step-1-preparing-for-the-design-review"><strong>Step 1: Preparing for the Design Review</strong></h2>
<p>This initial step ensures the design review process is focused on team objectives, avoids confusion, and makes the review process more productive. During this phase, it is important to organize all the necessary details such as the project/feature title, objectives, participants list and date &amp; time. Some of the main considerations during this step are:</p>
<h3 id="heading-define-the-review-objectives">Define the review objectives</h3>
<ul>
<li><p>Are we validating the design against requirements, discussion for potential issues or gathering stakeholder/ business team feedback.</p>
</li>
<li><p>What specific questions or concerns need to be addressed in design?</p>
</li>
<li><p>What are we evaluating? (Usability, accessibility, technical feasibility, etc.)</p>
</li>
<li><p>Are we <a target="_blank" href="https://blog.jobins.jp/how-wireframing-boosts-product-design-and-development-efficiency">focusing on early wireframes</a>, high-fidelity design, or interactive prototypes?</p>
</li>
</ul>
<h3 id="heading-preparing-amp-organize-design-assets">Preparing &amp; organize design assets</h3>
<ul>
<li><p>Prepare all wireframes, UI &amp; components, user flows, or interactive prototypes.</p>
</li>
<li><p>Include design artifacts like user research insights, personas, and problem statements for context, so so that the review can proceed smoothly.</p>
</li>
</ul>
<h3 id="heading-provide-clear-context">Provide clear Context</h3>
<ul>
<li><p>Summarize the user needs, business goals, and design logic</p>
</li>
<li><p>Define or present any technical constraints or design system guidelines that must be followed.</p>
</li>
</ul>
<h3 id="heading-set-the-review-meeting-amp-invite-the-right-team-members">Set the review meeting &amp; invite the right team members</h3>
<ul>
<li><p>Keep the meeting structured and time-bound (30–45 minutes max). But the time can be extended on the nature of review</p>
</li>
<li><p>Ensure key cross-team stakeholders are present: product managers, designers, engineers, and relevant team members. If needed(we can also invite business &amp; marketing team)</p>
</li>
<li><p>Assign a facilitator to guide the design, discussions and keep things focused while review session</p>
</li>
</ul>
<h2 id="heading-step-2-design-review-session"><strong>Step 2: Design Review Session</strong></h2>
<p>A design review session is an organized meeting in which designers, product managers, engineers, and stakeholders analyze a design, provide input/feedback, and decide for the next steps. The purpose is to detect possible issues early on, establish alignment with user needs and company goals, and optimize the design for developer hand-off. Some of the main considerations during this step are:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742394656532/28d5dd03-dc50-422f-9a15-4a6f0437952c.png" alt class="image--center mx-auto" /></p>
<p><em>References</em> <a target="_blank" href="https://www.figma.com/community/file/769740081575343235"><em>figma template</em></a> <em>,</em> <a target="_blank" href="https://www.atlassian.com/software/confluence/templates/design-review"><em>Confluence design review template</em></a> <em>for design review checklist</em></p>
<h3 id="heading-brief-the-context-and-introduce-the-design">Brief the context and introduce the design</h3>
<ul>
<li><p>Share the design link through a collaborative platform like Figma, Miro, or Notion.</p>
</li>
<li><p>Start by briefing the design outline and its purpose.</p>
</li>
<li><p>Provide clear context about the user personas, user needs, and business goals that have been addresses by the design</p>
</li>
<li><p>Explain the design decisions and the logic behind the solution</p>
</li>
<li><p>Discuss with technical constraints or dependencies that could affect the design.</p>
</li>
</ul>
<h3 id="heading-walkthrough-of-the-design">Walkthrough of the Design</h3>
<ul>
<li><p>Share the design link through a collaborative platform like Figma, Miro, or Notion.</p>
</li>
<li><p>Start by briefing the design outline and its purpose.</p>
</li>
<li><p>Provide clear context about the user personas, user needs, and business goals that have been addresses by the design</p>
</li>
<li><p>Explain the design decisions and the logic behind the solution</p>
</li>
<li><p>Discuss with technical constraints or dependencies that could affect the design.</p>
</li>
</ul>
<h3 id="heading-facilitate-feedback-discussion">Facilitate feedback discussion</h3>
<ul>
<li><p>Allow time for stakeholders to ask questions and provide feedback.</p>
</li>
<li><p>Distinguish feedback into structured categories, so it will easy to work on (e.g., usability, aesthetic consistency, technical feasibility, accessibility, etc.).</p>
</li>
<li><p>Encourage participate for providing constructive &amp; actionable feedback (feedback should be clear, specific, and align to user goals or business objectives).</p>
</li>
</ul>
<h3 id="heading-prioritize-collected-issues-for-actionable-changes">Prioritize collected issues for actionable changes</h3>
<ul>
<li><p>Review all the collected feedback and identify critical issues that require quick solutions.</p>
</li>
<li><p>Prioritize changes based on their impact</p>
</li>
<li><p>Clearly outline action items &amp; define who is responsible and when</p>
</li>
</ul>
<h3 id="heading-summarize-amp-set-for-the-next-steps">Summarize &amp; set for the next steps</h3>
<ul>
<li><p>Summarize the main feedback points and decisions reached during the session.</p>
</li>
<li><p>Talk about the next design iteration steps and, if necessary, set up any follow-up meetings.</p>
</li>
<li><p>Assign task to the product managers, engineers, and designers that need to be changes</p>
</li>
</ul>
<h2 id="heading-step-3-post-design-review-actions">Step 3: Post Design Review Actions</h2>
<p>After a design review session, it's important to maintain a feedback documentation on priority basis and ensure proper execution for next steps. Effective follow-up facilitates collaboration, keep the design on schedule and also helps to convert feedback into possible improvements.</p>
<h3 id="heading-maintain-document-for-feedback-amp-key-decisions">Maintain document for feedback &amp; key decisions</h3>
<ul>
<li><p>Document all provided insightful feedback, discussion and decision from the review session</p>
</li>
<li><p>Prioritize the next stage by separating the main design issues from the minor enhancement</p>
</li>
</ul>
<h3 id="heading-iteration-amp-feedback-implementation">Iteration &amp; feedback implementation</h3>
<ul>
<li><p>Work together with engineers to resolve issues related to technical viability.</p>
</li>
<li><p>Based on feedback that is prioritized, designers make adjustments to the design.</p>
</li>
<li><p>If required <a target="_blank" href="https://blog.jobins.jp/building-better-products-the-role-of-usability-testing-in-design-excellence">do usability testing before completing the final adjustments.</a></p>
</li>
</ul>
<h3 id="heading-schedule-a-follow-up-design-review-if-needed">Schedule a follow-up design review (if needed)</h3>
<ul>
<li><p>After iteration &amp; new changes, if major revisions were required, schedule another review session with team</p>
</li>
<li><p>Ensure all stakeholders have access to new version of design to validate the final changes before development begins.</p>
</li>
<li><p>Verify the latest version and confirm that the design is ready for handoff to developers.</p>
</li>
</ul>
<h3 id="heading-maintain-feedback-log-amp-design-consistency">Maintain feedback log &amp; design consistency</h3>
<ul>
<li><p>Maintain a record of each iteration design decisions or feedback to ensure consistency across teams.</p>
</li>
<li><p>Update design system components &amp; style guide, if new introduced component can impact the overall design</p>
</li>
<li><p>Maintain proper version of design in figma or in sheet (having version number and design link)</p>
</li>
</ul>
<hr />
<h2 id="heading-key-benefits-of-design-review">📋 Key benefits of design review</h2>
<p>After a design review session, it's important to maintain a feedback documentation on priority basis and ensure proper execution for next steps. Effective follow-up facilitates collaboration, keep the design on schedule and also helps to convert feedback into possible improvements.</p>
<h3 id="heading-improves-user-experience-amp-usability">Improves User Experience &amp; Usability</h3>
<ul>
<li><p><strong>Ensures user-friendliness</strong>: Design reviews guarantee that the product is intuitive and simple to use.</p>
</li>
<li><p><strong>Meets audience needs</strong>: Reviews make sure the design satisfies the needs and expectations of the target audience.</p>
</li>
<li><p><strong>Refines usability</strong>: Feedback from a range of viewpoints aids in optimizing the design's usability.</p>
</li>
<li><p><strong>Improves design quality</strong>: A more effective and efficient user experience is produced by incorporating different points of view.</p>
</li>
</ul>
<h3 id="heading-reduces-cost-for-revisions-amp-rework">Reduces cost for revisions &amp; rework</h3>
<ul>
<li><p><strong>Saves time and resources</strong>: Delays and unnecessary costs can be avoided by identifying design flaws early.</p>
</li>
<li><p><strong>Prevents rework</strong>: By identifying issues early on in the development process, expensive changes are avoided later.</p>
</li>
<li><p><strong>Reduces development costs</strong>: The time and cost required to fix mistakes made during or after development are reduced by early defect detection.</p>
</li>
<li><p><strong>Speeds up the process</strong>: The team can stay on course and proceed more effectively with early detection.</p>
</li>
</ul>
<h3 id="heading-aligns-teams-amp-improves-collaboration">Aligns Teams &amp; Improves Collaboration</h3>
<ul>
<li><p><strong>Aligns teams</strong>: Design reviews guarantee that stakeholders, engineers, product managers, and designers are all in agreement.</p>
</li>
<li><p><strong>Promotes collaboration</strong>: All important people are encouraged to collaborate and contribute during the evaluation process.</p>
</li>
<li><p><strong>Facilitates clear communication</strong>: Ensure clear and efficient team communication.</p>
</li>
<li><p><strong>Aligns product vision with business goals</strong>: Makes certain that the design is <a target="_blank" href="https://blog.jobins.jp/product-designers-how-to-meet-business-goals-and-user-needs">in line with the overarching goals and strategy of the company.</a></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742400310092/ba3d6960-da33-4595-bdee-1ff4dd3bc232.jpeg" alt class="image--center mx-auto" /></p>
<p>Meme source: <a target="_blank" href="https://makesaasbetter.com/teamwork-memes/">https://makesaasbetter.com/teamwork-memes/</a></p>
<h3 id="heading-encourages-innovation-amp-product-quality">Encourages Innovation &amp; product quality</h3>
<ul>
<li><p><strong>Encourages brainstorming</strong>: Reviews offer a chance to produce and hone original ideas.</p>
</li>
<li><p><strong>Promotes constructive feedback</strong>: Feedback during design reviews helps improve and strengthen design concepts.</p>
</li>
<li><p><strong>Fosters innovation</strong>: More creative and practical design solutions are frequently the result of constructive criticism.<br />  <strong>Results in higher-quality products</strong>: More careful designs result from the review process, raising the caliber of the finished product.</p>
</li>
</ul>
<h3 id="heading-ensures-consistency-amp-brand-alignment">Ensures Consistency &amp; brand alignment</h3>
<ul>
<li><p><strong>Maintains visual consistency</strong>: Consistent design aspects throughout the product are ensured via routine design evaluations.</p>
</li>
<li><p><strong>Ensures functional consistency</strong>: Reviews aid in maintaining consistent functioning and user interactions across the product.</p>
</li>
<li><p><strong>Enhances brand identity</strong>: Consistent design increases brand recognition and strengthens the product's brand.</p>
</li>
</ul>
<h2 id="heading-summary">📝 Summary</h2>
<p>Designers, product managers, engineers, and stakeholders assess a product before it is produced to ensure that it meets business and user goals. This process is known as a product design review. Verifying that the design is technically possible, aesthetically consistent, user-friendly, and in line with corporate goals is the aim. The team focuses on usability, accessibility, user flows, and the entire experience during this assessment in order to spot possible areas for improvement early on and prevent later, expensive updates.</p>
<p>organized design review, after which all team members provide comments and suggestions. Based on actual insights, this method offers the chance to assess concepts, improve user interactions, and maximize the user experience. Design reviews maintain an effective design and development process while promoting organized input and candid conversations, which results in the creation of high-quality, user-friendly products. Design reviews, as a structured assessment procedure, serve as quality control by guaranteeing that the project remains on course and is in line with its main objectives prior to the implementation stage.</p>
<p>🙏 Thanks for reading the post, you are welcome to comment &amp; leave feedback 🙂🙂🙂</p>
]]></content:encoded></item><item><title><![CDATA[Design Consistency: The Key to Intuitive and Scalable UX]]></title><description><![CDATA[In today’s competitive digital landscape, user experience (UX) can make or break a product. While innovation and creativity are celebrated, one principle remains non-negotiable: design consistency. Consistent design reduces friction, builds trust, an...]]></description><link>https://blog.jobins.jp/design-consistency-the-key-to-intuitive-and-scalable-ux</link><guid isPermaLink="true">https://blog.jobins.jp/design-consistency-the-key-to-intuitive-and-scalable-ux</guid><category><![CDATA[UX]]></category><category><![CDATA[Design]]></category><category><![CDATA[Developer]]></category><category><![CDATA[development]]></category><category><![CDATA[UI]]></category><category><![CDATA[consistency]]></category><dc:creator><![CDATA[Sandip Bhandari]]></dc:creator><pubDate>Fri, 21 Mar 2025 02:05:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1742320512943/29463341-3835-4e0f-940c-e2e42925076c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today’s competitive digital landscape, user experience (UX) can make or break a product. While innovation and creativity are celebrated, one principle remains non-negotiable: <strong><em>design consistency</em></strong>. Consistent design reduces friction, builds trust, and scales seamlessly—yet it’s often undervalued. Imagine using an app where buttons change color randomly, navigation shifts across screens, or typography feels disjointed. Confusing, right? This blog explores why consistency is the backbone of intuitive UX.</p>
<h2 id="heading-understand-what-is-design-consistency"><strong>Understand what is Design Consistency ?</strong></h2>
<p>Design consistency means maintaining uniform patterns, components, and behaviors across a product’s interface. It spans:</p>
<ul>
<li><p><strong>Visual Consistency</strong>: Colors, typography, icons, and spacing.</p>
</li>
<li><p><strong>Functional Consistency</strong>: Predictable interactions (e.g., back button, search icon, edit icon…).</p>
</li>
<li><p><strong>Internal Consistency</strong>: Alignment within a single product.</p>
</li>
<li><p><strong>External Consistency</strong>: Harmony with platform conventions (e.g., iOS vs. Android).</p>
</li>
</ul>
<p>As Jakob Nielsen of the Nielsen Norman Group (NN/g) states, <em>“<strong><strong>Consistency is one of the most powerful usability principles.</strong></strong>”</em></p>
<h2 id="heading-why-consistency-matters"><strong>Why Consistency Matters</strong></h2>
<ol>
<li><p><strong>Reduce Cognitive Load</strong> : Consistency minimizes the mental effort required to learn an interface. When users encounter familiar patterns—like a magnifying glass icon for search—they focus on tasks, not relearning basics. NN/g’s research shows inconsistent UI increases cognitive load by 50%, leading to frustration and abandonment.<br /> <code>Example: Airbnb’s Redesign In 2016, Airbnb overtake its design system to unify its fragmented ecosystem. By standardizing components like cards, buttons, and filters, they reduced user onboarding time by 30% and boosted conversion rates.</code></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742298998392/8ff44793-6b3c-41c1-b894-87c1e799f67c.jpeg" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Build Brand Trust</strong> : A consistent design looks professional, while mismatched colors and branding can make a product feel untrustworthy.<br /> <code>Example: Google’s Material Design Material Design, launched in 2014, unified Google’s products under a single design language. Its tactile surfaces, bold typography, and meaningful motion created a recognizable brand identity. By 2023, Material Design powered over 1.5 million apps, proving scalability without sacrificing familiarity.</code></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742299491188/006eeb67-96d9-4643-9a0a-b876dd2b89ea.jpeg" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Accelerates Development</strong> : Reusable components streamline workflows. Developers spend less time rebuilding elements, while designers focus on solving user’s problems.<br /> <code>Example: IBM's Carbon Design System IBM’s Carbon system standardized UI components for 200+ enterprise products. Development cycles shortened by 40%, and product teams shipped features 2x faster</code></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742312655733/f1cf5ac7-4412-465a-8f3e-92da194fb8dc.jpeg" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Enhance Accessibility</strong> : Consistency in design ensures predictable navigation, benefiting users with disabilities. WCAG 2.1 emphasizes uniform UI elements for better screen reader and keyboard support. Apple’s VoiceOver, powered by structured UI from HIG, enables seamless interaction. A well-structured, consistent interface enhances usability for all.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1742314550998/b61ef526-4470-4f08-99b0-a6c8e645ab82.jpeg" alt class="image--center mx-auto" /></p>
</li>
</ol>
<h2 id="heading-best-practices-for-achieving-consistency">Best Practices for Achieving Consistency</h2>
<ol>
<li><p><strong>Building a Design System</strong> : Design systems are the ultimate toolkit for consistency. They include:</p>
<ul>
<li><p><strong>Style Guides</strong>: Typography, color palettes, iconography.</p>
</li>
<li><p><strong>Component Libraries</strong>: Reusable UI elements (buttons, modals).</p>
</li>
<li><p><strong>Pattern Libraries</strong>: Templates for common workflows (e.g., onboarding).</p>
</li>
</ul>
</li>
<li><p><strong>Conduct Regular UX Audits</strong> : Reviewing designs periodically helps identify inconsistencies before they impact users. <strong>NN/g’s Usability Heuristics</strong> emphasize consistency and standards as “<strong>Users should not have to wonder whether different words, situations, or actions mean the same thing.</strong>“</p>
</li>
<li><p><strong>Design Review</strong> : Regular design reviews within teams ensure that UI components follow the design system, maintain visual hierarchy, and align with accessibility standards. Reviewing spacing, typography, and interaction consistency helps prevent fragmentation and improves overall user experience.</p>
</li>
<li><p><strong>Cross-Team Alignment</strong> : Collaboration between designers, developers, and product teams is key. Tools like <strong>Figma, Storybook, and ZeroHeight</strong> help bridge gaps and keep everyone aligned on component usage and styling.</p>
</li>
</ol>
<h2 id="heading-case-studies-consistency-in-action">Case Studies: Consistency in Action</h2>
<ol>
<li><p><strong>Microsoft’s Fluent Design System: Unifying Windows, Teams, and Office</strong></p>
<ul>
<li><p>Teams saw a <strong>25% reduction</strong> in user-reported navigation issues within 6 months.</p>
</li>
<li><p>Office 365 adoption increased by <strong>18%</strong> post-update due to smoother cross-app workflows.</p>
</li>
<li><p>Developers shipped features <strong>30% faster</strong> with reusable Fluent components.</p>
</li>
</ul>
</li>
<li><p><strong>Spotify’s Global Redesign: Harmonizing Mobile and Desktop</strong></p>
<ul>
<li><p><strong>15% increase</strong> in cross-device session retention after aligning navigation.</p>
</li>
<li><p>Playlist creation became <strong>40% faster</strong> with predictable UI patterns.</p>
</li>
<li><p>Navigation-related support tickets dropped by <strong>22%</strong>.</p>
</li>
</ul>
</li>
<li><p><strong>Uber’s Driver App Overhaul: Safety Through Consistency</strong></p>
<ul>
<li><p>Trip cancellations decreased by <strong>27%</strong> with clearer alerts.</p>
</li>
<li><p>Driver satisfaction scores improved by <strong>33%</strong> post-launch.</p>
</li>
<li><p><strong>90% compliance</strong> with safety notifications due to consistent design.</p>
</li>
</ul>
</li>
<li><p><strong>Notion’s Template Ecosystem: Scaling with Modular Design</strong></p>
<ul>
<li><p>Team workspace adoption grew by <strong>50%</strong> year-over-year.</p>
</li>
<li><p>New user onboarding time dropped from <strong>2 hours to 45 minutes</strong>.</p>
</li>
<li><p>Enterprises reported <strong>60% faster collaboration</strong> with standardized templates.</p>
</li>
</ul>
</li>
</ol>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>Design consistency isn’t about stifling creativity—it’s about creating a foundation for innovation. By reducing cognitive load, accelerating development, and fostering inclusivity, consistency becomes a strategic asset.</p>
<p>Happy Designing 👨‍💻</p>
]]></content:encoded></item><item><title><![CDATA[Advanced Tips for Frontend Developers: Successful Refactoring and Debugging Techniques]]></title><description><![CDATA[Introduction
Refactoring and debugging are two essential skills for a frontend developer. While writing code is the initial step in building applications, maintaining, improving, and optimizing the code. As projects grow, code becomes more complex, a...]]></description><link>https://blog.jobins.jp/advanced-tips-for-frontend-developers-successful-refactoring-and-debugging-techniques</link><guid isPermaLink="true">https://blog.jobins.jp/advanced-tips-for-frontend-developers-successful-refactoring-and-debugging-techniques</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[frontend]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[webdev]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[CSS]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[React]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[guide]]></category><dc:creator><![CDATA[Nirajan Basnet]]></dc:creator><pubDate>Sat, 28 Sep 2024 13:57:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727531784948/faa60a80-495c-43a8-8fdb-ac22b59d293d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction"><strong>Introduction</strong></h3>
<p>Refactoring and debugging are two essential skills for a frontend developer. While writing code is the initial step in building applications, maintaining, improving, and optimizing the code. As projects grow, code becomes more complex, and without continuous refactoring, it can lead to difficult-to-maintain systems that are prone to bugs. We’ll explore why refactoring and debugging are important, some common challenges developers face, and how developers approach these tasks effectively.</p>
<hr />
<h3 id="heading-why-refactoring-is-important"><strong>Why Refactoring Is Important</strong></h3>
<p>Refactoring is the process of restructuring existing code without changing its external behavior. Over time, the initial structure of your code may no longer suit the application's needs, making it hard to maintain, difficult to extend, and prone to bugs. Proper refactoring ensures that the code remains clean, efficient, and easy to understand, which leads to:</p>
<ul>
<li><p><strong>Improved Readability</strong>: Cleaner, more organized code that is easier to read and comprehend for developers working on the project.</p>
</li>
<li><p><strong>Maintainability</strong>: Code that is well-structured makes it easier to modify and extend as requirements evolve.</p>
</li>
<li><p><strong>Performance Optimization</strong>: Streamlined code is often faster and uses fewer resources.</p>
</li>
<li><p><strong>Reduced Bugs</strong>: Cleaner code with fewer complexities is less error-prone, making debugging more efficient.</p>
</li>
</ul>
<p>However, refactoring comes with its own set of challenges. Let’s look at some scenarios where the process becomes frustrating and difficult to maintain.</p>
<hr />
<h3 id="heading-challenges-in-refactoring"><strong>Challenges in Refactoring</strong></h3>
<ol>
<li><p><strong>Legacy Code</strong>: Often, a frontend developer encounters legacy code—code written years ago or by other developers. Legacy code can be a tangled mess of outdated libraries, inconsistent naming conventions, and insufficient comments. Refactoring such code without introducing bugs requires experience and deep understanding.</p>
</li>
<li><p><strong>Tight Deadlines</strong>: Many times, refactoring is overlooked due to tight deadlines. Developers prioritize quick fixes or adding new features rather than optimizing existing code. However, ignoring refactoring leads to technical debt that slows development in the long run.</p>
</li>
<li><p><strong>Unclear Architecture</strong>: Sometimes, applications evolve without a clear architectural vision, leading to disorganized and duplicated code. In such cases, refactoring can be daunting, as it involves restructuring both frontend logic and data flow, without breaking existing functionality.</p>
</li>
<li><p><strong>Risk of New Bugs</strong>: Refactoring always carries the risk of introducing new bugs, especially when working with large codebases or complex interactions. Frontend developers must be careful to ensure that refactoring does not unintentionally change the behavior of the application.</p>
</li>
</ol>
<hr />
<h3 id="heading-a-realistic-refactoring-scenario">A Realistic Refactoring Scenario</h3>
<p>Let’s walk through a refactoring scenario where a frontend developer needs to refactor a React component that has become too complex to maintain.</p>
<h4 id="heading-original-code-a-complex-form-component">Original Code: A Complex Form Component</h4>
<pre><code class="lang-javascript"><span class="hljs-comment">// JobApplicationForm.tsx</span>
<span class="hljs-keyword">import</span> React, { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-keyword">const</span> JobApplicationForm = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> [name, setName] = useState(<span class="hljs-string">''</span>);
  <span class="hljs-keyword">const</span> [email, setEmail] = useState(<span class="hljs-string">''</span>);
  <span class="hljs-keyword">const</span> [resume, setResume] = useState(<span class="hljs-literal">null</span>);
  <span class="hljs-keyword">const</span> [error, setError] = useState(<span class="hljs-string">''</span>);
  <span class="hljs-keyword">const</span> [loading, setLoading] = useState(<span class="hljs-literal">false</span>);

  <span class="hljs-keyword">const</span> handleSubmit = <span class="hljs-keyword">async</span> () =&gt; {
    setLoading(<span class="hljs-literal">true</span>);
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">if</span> (!name || !email || !resume) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'All fields are required'</span>);
      }
      <span class="hljs-comment">// Simulate API call</span>
      <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(resolve, <span class="hljs-number">1000</span>));
      alert(<span class="hljs-string">'Application submitted!'</span>);
    } <span class="hljs-keyword">catch</span> (e) {
      setError(e.message);
    } <span class="hljs-keyword">finally</span> {
      setLoading(<span class="hljs-literal">false</span>);
    }
  };

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      {error &amp;&amp; <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">color:</span> '<span class="hljs-attr">red</span>' }}&gt;</span>{error}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>}
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Name"</span>
        <span class="hljs-attr">value</span>=<span class="hljs-string">{name}</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{(e)</span> =&gt;</span> setName(e.target.value)}
      /&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span>
        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email"</span>
        <span class="hljs-attr">value</span>=<span class="hljs-string">{email}</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{(e)</span> =&gt;</span> setEmail(e.target.value)}
      /&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{(e)</span> =&gt;</span> setResume(e.target.files[0])}
      /&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">disabled</span>=<span class="hljs-string">{loading}</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{handleSubmit}</span>&gt;</span>
        Submit
      <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> JobApplicationForm;
</code></pre>
<h4 id="heading-problems">Problems:</h4>
<ul>
<li><p><strong>State management</strong>: The form has too many individual state variables (<code>name</code>, <code>email</code>, <code>resume</code>, <code>error</code>, <code>loading</code>). This makes it harder to extend the form in the future.</p>
</li>
<li><p><strong>No separation of concerns</strong>: The component handles form logic, validation, and UI in a single place, which reduces maintainability.</p>
</li>
<li><p><strong>Reusability</strong>: Any new form would require duplication of logic.</p>
</li>
</ul>
<hr />
<h3 id="heading-refactored-code-breaking-down-the-logic"><strong>Refactored Code: Breaking Down the Logic</strong></h3>
<p>A frontend developer would refactor this component by separating concerns and improving state management.</p>
<h4 id="heading-refactored-code">Refactored Code:</h4>
<pre><code class="lang-javascript"><span class="hljs-comment">// useForm.ts - A Custom Hook for Form State Management</span>
<span class="hljs-keyword">import</span> { useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> useForm = <span class="hljs-function">(<span class="hljs-params">initialValues</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> [values, setValues] = useState(initialValues);
  <span class="hljs-keyword">const</span> [error, setError] = useState(<span class="hljs-string">''</span>);
  <span class="hljs-keyword">const</span> [loading, setLoading] = useState(<span class="hljs-literal">false</span>);

  <span class="hljs-keyword">const</span> handleChange = <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {
    <span class="hljs-keyword">const</span> { name, value, files } = e.target;
    setValues({ ...values, [name]: files ? files[<span class="hljs-number">0</span>] : value });
  };

  <span class="hljs-keyword">const</span> validate = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> key <span class="hljs-keyword">in</span> values) {
      <span class="hljs-keyword">if</span> (!values[key]) <span class="hljs-keyword">return</span> <span class="hljs-string">`Field <span class="hljs-subst">${key}</span> is required`</span>;
    }
    <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
  };

  <span class="hljs-keyword">return</span> { values, setValues, error, setError, loading, setLoading, handleChange, validate };
};

<span class="hljs-comment">// Refactored JobApplicationForm.tsx</span>
<span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> { useForm } <span class="hljs-keyword">from</span> <span class="hljs-string">'./useForm'</span>;

<span class="hljs-keyword">const</span> JobApplicationForm = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { values, error, loading, handleChange, setError, setLoading, validate } = useForm({
    <span class="hljs-attr">name</span>: <span class="hljs-string">''</span>,
    <span class="hljs-attr">email</span>: <span class="hljs-string">''</span>,
    <span class="hljs-attr">resume</span>: <span class="hljs-literal">null</span>,
  });

  <span class="hljs-keyword">const</span> handleSubmit = <span class="hljs-keyword">async</span> () =&gt; {
    setLoading(<span class="hljs-literal">true</span>);
    <span class="hljs-keyword">try</span> {
      <span class="hljs-keyword">const</span> validationError = validate();
      <span class="hljs-keyword">if</span> (validationError) <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(validationError);
      <span class="hljs-comment">// Simulate API call</span>
      <span class="hljs-keyword">await</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve</span>) =&gt;</span> <span class="hljs-built_in">setTimeout</span>(resolve, <span class="hljs-number">1000</span>));
      alert(<span class="hljs-string">'Application submitted!'</span>);
    } <span class="hljs-keyword">catch</span> (e) {
      setError(e.message);
    } <span class="hljs-keyword">finally</span> {
      setLoading(<span class="hljs-literal">false</span>);
    }
  };

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
      {error &amp;&amp; <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{{</span> <span class="hljs-attr">color:</span> '<span class="hljs-attr">red</span>' }}&gt;</span>{error}<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>}
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span>
        <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span>
        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Name"</span>
        <span class="hljs-attr">value</span>=<span class="hljs-string">{values.name}</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{handleChange}</span>
      /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span>
        <span class="hljs-attr">name</span>=<span class="hljs-string">"email"</span>
        <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email"</span>
        <span class="hljs-attr">value</span>=<span class="hljs-string">{values.email}</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{handleChange}</span>
      /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">input</span>
        <span class="hljs-attr">type</span>=<span class="hljs-string">"file"</span>
        <span class="hljs-attr">name</span>=<span class="hljs-string">"resume"</span>
        <span class="hljs-attr">onChange</span>=<span class="hljs-string">{handleChange}</span>
      /&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">disabled</span>=<span class="hljs-string">{loading}</span> <span class="hljs-attr">onClick</span>=<span class="hljs-string">{handleSubmit}</span>&gt;</span>
        Submit
      <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> JobApplicationForm;
</code></pre>
<h4 id="heading-improvements">Improvements:</h4>
<ol>
<li><p><strong>Custom Hook for Form State Management</strong>: The form logic is now handled by a reusable hook (<code>useForm</code>). This allows other components to reuse the logic.</p>
</li>
<li><p><strong>Reduced State Variables</strong>: Instead of separate state variables for each field, the form now uses a single <code>values</code> object.</p>
</li>
<li><p><strong>Validation Logic</strong>: Validation is abstracted into the custom hook, reducing repetition and making it easier to extend.</p>
</li>
</ol>
<hr />
<h3 id="heading-debugging-a-crucial-part-of-development"><strong>Debugging: A Crucial Part of Development</strong></h3>
<p>Refactoring goes hand in hand with debugging. Developers use advanced debugging techniques to solve issues without making random guesses or introducing new problems. Here's how a frontend developer might approach debugging:</p>
<ol>
<li><p><strong>Use Console Logs Wisely</strong>: Rather than littering code with <code>console.log</code>, a frontend developer uses strategic logging to isolate problematic areas.</p>
<pre><code class="lang-javascript"> <span class="hljs-comment">// Example: Logging specific areas</span>
 <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Form submitted with data:"</span>, values);
</code></pre>
</li>
<li><p><strong>Leverage Browser Developer Tools</strong>: Using features like breakpoints, step-by-step debugging, and network request inspection allows for precise identification of issues.</p>
</li>
<li><p><strong>Test-Driven Debugging</strong>: Writing unit tests around problematic areas can help ensure that refactoring doesn't introduce new bugs.<br /> Here's an example of a simple Jest test for the form validation logic:</p>
<pre><code class="lang-javascript"> codetest(<span class="hljs-string">'form validation should require all fields'</span>, <span class="hljs-function">() =&gt;</span> {
   <span class="hljs-keyword">const</span> { validate } = useForm({ <span class="hljs-attr">name</span>: <span class="hljs-string">''</span>, <span class="hljs-attr">email</span>: <span class="hljs-string">''</span>, <span class="hljs-attr">resume</span>: <span class="hljs-literal">null</span> });
   expect(validate()).toBe(<span class="hljs-string">'Field name is required'</span>);
 });
</code></pre>
</li>
</ol>
<hr />
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>For frontend developers, refactoring and debugging are critical practices that ensure the longevity and quality of the codebase. Through careful restructuring, separating concerns, and using appropriate debugging techniques, developers can maintain a clean, scalable, and bug-free application.</p>
<p>While challenges such as legacy code and tight deadlines can make this process difficult, the payoff is substantial in terms of performance and maintainability.</p>
<p>👏👏 Congratulations on making it this far! I hope you can implement these techniques in your project. Give it a try and enjoy it!</p>
<p>Feel free to share your thoughts and opinions, and leave a comment if you have any problems or questions.</p>
<p>Until then, keep on hacking. Cheers!</p>
]]></content:encoded></item><item><title><![CDATA[Integrating AI into UX: A New Frontier for Designers and Developers]]></title><description><![CDATA[Introduction
Artificial intelligence is transforming industries around the world. UX design hasn't been left behind either. This means, that with AI, huge amounts of data can be analyzed, such as what a user will do next, and automatically doing repe...]]></description><link>https://blog.jobins.jp/integrating-ai-into-ux-a-new-frontier-for-designers-and-developers</link><guid isPermaLink="true">https://blog.jobins.jp/integrating-ai-into-ux-a-new-frontier-for-designers-and-developers</guid><category><![CDATA[UI]]></category><category><![CDATA[UX]]></category><category><![CDATA[AI]]></category><category><![CDATA[Product Design]]></category><category><![CDATA[designer]]></category><dc:creator><![CDATA[Abishek  Chuhan]]></dc:creator><pubDate>Sat, 28 Sep 2024 13:37:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727414862258/608bd4b1-ac3e-4126-90f8-01310607204c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction"><strong>Introduction</strong></h3>
<p>Artificial intelligence is transforming industries around the world. UX design hasn't been left behind either. This means, that with AI, huge amounts of data can be analyzed, such as what a user will do next, and automatically doing repetitive tasks that redesign how designers work and develop digital products. On a more critical thought, balance has to be sought in integrating AI with UX Design between innovation and user-centered design principles. This blog covers the role of AI in UX, mentioning tools like ChatGPT, Uizard, Attention Insights and other AI-driven systems that are developing the field while keeping the user at the heart.</p>
<h3 id="heading-the-potential-of-ai-in-ux-design"><strong>The Potential of AI in UX Design</strong></h3>
<p>AI provides great opportunities for personalizing user experiences more effectively and interactively. In Japan, where great attention to minute detail and precision is highly valued, AI-driven tools have become a significant player in optimizing digital products and services. One such example is Rakuten, a Japanese leading e-commerce platform that uses AI to continuously analyze user preferences and behavior for highly personalized shopping experiences of customers, therefore fostering greater satisfaction and loyalty among the customer base. AI also is one of the serious drivers of automation of mundane activities that require lots of time and resources. For instance, AI was helping several Japanese fintech companies to make designing mobile apps easier and more intuitive. Using powerful analytics tools powered by AI, several versions of the design are automatically tested, the best-performing variances identified, and it helps hone the user journey well before the final product launch.</p>
<h3 id="heading-ai-tools-smoothening-the-design-process"><strong>AI Tools Smoothening the Design Process</strong></h3>
<p>Other than ChatGPT, a number of AI tools are being used to help UX designers and developers in their work. This includes the following:</p>
<p><strong>Figma with AI Plugins:</strong> Figma is a popular design tool that has recently introduced AI plugins, which are designed to support designers in organizing the design elements by suggesting the best layouts and automating all the repetitive tasks. This helps UX designers be more creative because all the tedious work is taken over by the machines.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857010376/d2a4ee6b-7493-4f4c-b1cb-9a5546fb88f4.webp?auto=compress,format&amp;format=webp" alt /></p>
<p><strong>Adobe Sensei:</strong> This creative suite, through AI from Adobe, automates mundane tasks such as image cropping, font recognition, and color palette suggestions. With the help of Adobe Sensei, designers working on Japanese e-commerce sites or mobile apps can have consistent designs created much faster that appeal to local tastes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857161786/a043ae6a-0bfa-4224-b5d2-29d75b76b950.png?auto=compress,format&amp;format=webp" alt /></p>
<p><strong>Uizard:</strong> The tool is designed to transform a sketched design into a digital prototype in no time. It uses AI to digitize the hand-drawings into wireframes, thus fully automating the ideation phase when one deals with UX design. Pretty useful for designers who want to bring their ideas to life without creating it from scratch.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857231561/1bc0c13d-e357-4b22-af54-7f904d4c37fc.png?auto=compress,format&amp;format=webp" alt /></p>
<p><strong>Attention Insight:</strong> An AI-powered tool for forecasting how users would interact with a design before it goes live; it uses depictions of heatmaps through artificial intelligence algorithms to point out which areas on a page draw the most attention. It can also be quite useful for Japanese designers who try to enhance user engagement in busy e-commerce platforms or news sites that have dense packing.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857470382/331fa9dc-fcd0-413d-9c2f-ff0431f562d0.jpeg?auto=compress,format&amp;format=webp" alt /></p>
<p><strong>UserTesting:</strong> It leverages AI to analyze feedback and user behavior in usability tests. It's able to highlight patterns, identify points of recurring pain, and provide insights for designers that can help them do their job more effectively. For example, subtle user preferences in Japan's hyper-competitive mobile gaming market can make all the difference in user retention.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857558314/78d985c8-d8d5-49c5-b77e-7434f0e29458.png?auto=compress,format&amp;format=webp" alt /></p>
<p><strong>Jasper AI:</strong> A tool like Jasper AI helps in generating creative content on everything from marketing copy to UX writing to product descriptions that is going to resonate more with users. It will help designers create content that actually matches their user personas and brand tone, enhancing overall user engagement.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724857624413/54437b3f-c885-4032-8fd7-c5998afef774.png?auto=compress,format&amp;format=webp" alt /></p>
<h2 id="heading-maintaining-a-human-centered-approach"><strong>Maintaining a Human-Centered Approach</strong></h2>
<p>While these tools strongly enhance the design process, keeping the design process human-centered will be imperative in UX design. AI should enhance but not replace human elements like empathy, creativity, and intuition. This becomes even more relevant in Japan because understanding cultural nuances and user expectations is one of the key ingredients to success.<br />For example, LINE uses AI in its messaging app-native to Japan to suggest stickers and emojis based on the users' conversations. However, LINE is also careful to ensure that such suggestions do not stray from cultural contexts and mirror user emotions, to retain a personal, original feel to which Japanese people have grown accustomed.<br />Besides, designers have to make sure that the control remains with the users.</p>
<p>For example, even though AI-driven chatbots can answer a lot of various questions, it is often desirable to make the option of switching to a human agent available. This keeps the user experience positive, preventing frustration when the AI may not understand or be nuanced enough to understand complex queries.</p>
<h3 id="heading-ethical-considerations-in-ai-driven-design"><strong>Ethical Considerations in AI-Driven Design</strong></h3>
<p>Ethics are going to come to the fore as AI integrates even more with UX. People in Japan want trust, integrity, and privacy, so a system driven by AI needs to work in an open, non-discriminatory way that fosters inclusivity.<br />If religiously not monitored and updated, AI tools do have the capacity to introduce bias of their own.<br />For example, AI recruitment tools adopted by companies in Japan must be done without biases that might reduce the chances of some candidates. Fairness and diversity would necessitate frequent auditing and updates, therefore.<br />Transparency will also be of great help in gaining confidence among users. When decisions have been made with the intervention of AI, whether in financial services, healthcare, or even digital marketing, the user should be allowed to understand how such decisions have come about. Clear explanations coupled with the right to question AI-driven outcomes are needed to help maintain user trust and satisfaction.</p>
<h2 id="heading-kio">**</h2>
<p>AI as a Collaborative Tool**</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724856953781/229076ec-daf0-4684-b81d-ba4d3bd30ce0.webp?auto=compress,format&amp;format=webp" alt /></p>
<p>AI is always complementary and can never replace human skills. In UX design, AI tools work on data-driven tasks while human designers create innovative, empathetic, and strategic thinking behind designing. Companies such as Nissan and Toyota in Japan's automotive sector have introduced AI to design user interfaces for autonomous cars. While AI does analyze large data sets of user behavior, it is up to a human designer to account for emotional and psychological aspects in making final decisions.<br />Moving forward, it will be critical to have products that are a result of a collaboration between AI and human designers in a way that they are functional, efficient, and deeply resonating with users. This approach in Japan, where thorough design and users satisfaction are key, will successfully drive the next wave of innovation for UX design.</p>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>Without a doubt, AI is changing the dynamics of UX design; it gives new opportunities to enhance user experiences and simplify workflows. However, the success of AI will rely on how responsibly and thoughtfully we can integrate it into processes, keeping users at the heart of every decision. This is how, by integrating the capabilities of AI and human-centered design, we can create digital experiences that will be innovative, intuitive, and truly meaningful to every user.</p>
<p>👏👏 Congratulations on reaching this point! By now, you should have a good grasp of how AI tools can revolutionize your UX design process, making it more efficient, personalized, and user-friendly. Now is the time to take these insights and apply them to your own projects — explore, experiment, and innovate!</p>
<p>Feel free to share your experiences, thoughts, or any questions you have in the comments. I'm here to help you make the most out of these tools!</p>
<p>Until next time, keep designing with passion and creativity!<br />Cheers to building beautiful, intuitive digital experiences! 🎨✨</p>
]]></content:encoded></item><item><title><![CDATA[Automating Daily Task Reports with Jira: A Deep Dive into the Jira Daily Task Extractor]]></title><description><![CDATA[Managing a growing number of tasks in JIRA can quickly become overwhelming, especially when you need to report your daily progress or track open tasks for your team. In a fast-paced development environment, manually tracking and extracting tasks is t...]]></description><link>https://blog.jobins.jp/automating-daily-task-reports-with-jira-a-deep-dive-into-the-jira-daily-task-extractor</link><guid isPermaLink="true">https://blog.jobins.jp/automating-daily-task-reports-with-jira-a-deep-dive-into-the-jira-daily-task-extractor</guid><category><![CDATA[JIRA]]></category><category><![CDATA[Python]]></category><category><![CDATA[Jira automation]]></category><dc:creator><![CDATA[Bikram Tuladhar]]></dc:creator><pubDate>Fri, 27 Sep 2024 05:24:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727412926517/6b32f3d0-5437-40d9-8d19-23319c565ff0.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Managing a growing number of tasks in <strong>JIRA</strong> can quickly become overwhelming, especially when you need to report your daily progress or track open tasks for your team. In a fast-paced development environment, manually tracking and extracting tasks is time-consuming and prone to error. That's where automation comes in handy, particularly with tools like the <a target="_blank" href="https://github.com/bikramtuladhar/Jira-daily-task-extractor">Jira Daily Task Extractor</a> created by Bikram Tuladhar.</p>
<p>In this blog, we'll explore how the <strong>Jira Daily Task Extractor</strong> works, why it's useful, and how you can set it up to streamline your daily task management.</p>
<h3 id="heading-what-is-the-jira-daily-task-extractor">What is the Jira Daily Task Extractor?</h3>
<p>The <strong>Jira Daily Task Extractor</strong> is a Python script designed to extract daily task details from Jira. This script fetches the task information based on a Jira user's activity, helping to generate a summarized task report. The idea is to automate the process of gathering tasks assigned to you or your team, ensuring that you don’t have to waste time manually compiling task lists for reporting or daily stand-up meetings.</p>
<h3 id="heading-key-features">Key Features</h3>
<p>Here are some standout features of the Jira Daily Task Extractor:</p>
<ol>
<li><p><strong>Automated Task Retrieval</strong>: The script connects to the Jira API and retrieves tasks that are assigned to you, filtered by the current day. This eliminates the need for manual task checking.</p>
</li>
<li><p><strong>Customizable Filters</strong>: You can adjust filters to extract tasks based on various parameters such as date is customized by user where project, task status, and assignee are now static.</p>
</li>
<li><p><strong>Summarized Output</strong>: The extracted data is output in a clean, readable format, making it easy to paste into emails, documents, or instant messaging tools for daily reporting.</p>
</li>
<li><p><strong>Easy to Set Up</strong>: The script is straightforward to install and configure, requiring only basic Python skills and access to your Jira account credentials.</p>
</li>
</ol>
<h3 id="heading-how-does-it-work">How Does It Work?</h3>
<p>The <strong>Jira Daily Task Extractor</strong> relies on Jira’s REST API to pull task information. Let’s break down the process step by step:</p>
<ol>
<li><p><strong>Jira API Authentication</strong>: To communicate with Jira, the script requires an API token for authentication. This ensures secure access to your Jira tasks.</p>
</li>
<li><p><strong>Querying Jira for Tasks</strong>: The script runs a query to retrieve the tasks that are either assigned to you or where you have been mentioned. The query can be customized to fetch data based on specific fields such as task creation date or status.</p>
</li>
<li><p><strong>Formatting the Output</strong>: Once the tasks are extracted, the script formats the data into a human-readable format. The output can be as detailed or as summarized as you prefer, making it suitable for daily updates or deeper analysis.</p>
</li>
<li><p><strong>Integration with Other Tools</strong>: You can also extend the script’s functionality by integrating it with other reporting tools like Slack, Teams, or email platforms, allowing the task report to be sent out automatically at a specific time every day.</p>
</li>
</ol>
<h3 id="heading-benefits-of-using-the-jira-daily-task-extractor">Benefits of Using the Jira Daily Task Extractor</h3>
<p>Here are some reasons why automating daily task extraction with this tool is highly beneficial:</p>
<ol>
<li><p><strong>Time-Saving</strong>: Instead of manually copying and pasting your tasks from Jira, you can automate the entire process, saving valuable time that can be spent on more important work.</p>
</li>
<li><p><strong>Consistency in Reporting</strong>: The extractor ensures that the task report follows a consistent format, reducing the chances of human error and miscommunication in daily reports.</p>
</li>
<li><p><strong>Real-Time Updates</strong>: Since the script can be run daily, you get an accurate and up-to-date snapshot of your tasks, which is especially useful for project tracking and managing deadlines.</p>
</li>
<li><p><strong>Increased Productivity</strong>: By removing the manual overhead of task tracking, you and your team can focus on completing tasks instead of spending time compiling them.</p>
</li>
</ol>
<h3 id="heading-setting-it-up">Setting It Up</h3>
<p>To get started with the <strong>Jira Daily Task Extractor</strong>, follow these simple steps:</p>
<ol>
<li><p><strong>Clone the Repository</strong>: First, you need to clone the repository from GitHub:</p>
<pre><code class="lang-bash"> git <span class="hljs-built_in">clone</span> https://github.com/bikramtuladhar/Jira-daily-task-extractor
</code></pre>
</li>
<li><p><strong>Install the Required Dependencies</strong>: The script uses Python, so make sure you have it installed. Additionally, install the necessary libraries by running:</p>
<pre><code class="lang-bash"> pip install -r requirements.txt
</code></pre>
</li>
<li><p><strong>Configure Your Jira Credentials</strong>: You need to provide your Jira API token and base URL. Update the <a target="_blank" href="http://config.py"><code>config.py</code></a> file with your credentials:</p>
<pre><code class="lang-python"> JIRA_BASE_URL = <span class="hljs-string">'https://your-jira-instance.atlassian.net'</span>
 JIRA_API_TOKEN = <span class="hljs-string">'your-api-token'</span>
 JIRA_USER_EMAIL = <span class="hljs-string">'your-email@example.com'</span>
</code></pre>
</li>
<li><p><strong>Run the Script</strong>: Once the configuration is done, you can run the script to generate your daily task report:</p>
<pre><code class="lang-bash"> python extract_tasks.py
</code></pre>
</li>
</ol>
<h3 id="heading-customizing-the-script">Customizing the Script</h3>
<p>One of the advantages of this open-source script is that it can be easily customized. Here are a few ways you can tweak the script to better suit your needs:</p>
<ul>
<li><p><strong>Filter by Project or Status</strong>: Modify the query parameters to filter tasks based on specific projects or task statuses. This can be useful for tracking tasks in large projects with multiple moving parts.</p>
</li>
<li><p><strong>Adjust Output Format</strong>: If you need the task data in a specific format, such as CSV or JSON, you can modify the output section of the script to generate reports in your preferred format.</p>
</li>
<li><p><strong>Schedule Task Extraction</strong>: Use a task scheduler like <code>cron</code> (for Linux/macOS) or Task Scheduler (for Windows) to run the script at regular intervals. This way, your daily task report will be generated automatically.</p>
</li>
</ul>
<h3 id="heading-conclusion">Conclusion</h3>
<p>The <strong>Jira Daily Task Extractor</strong> is a powerful tool for anyone who uses Jira extensively and needs a streamlined way to manage and report their tasks. By automating the extraction and formatting of your daily tasks, this script can significantly reduce the time and effort spent on manual reporting, allowing you to focus more on completing the tasks at hand.</p>
<p>Whether you’re a project manager, a developer, or a team lead, automating your Jira workflow with this task extractor can greatly improve your productivity. It’s simple to set up, highly customizable, and can be integrated with other tools to fit seamlessly into your existing workflow. If you haven’t automated your Jira task tracking yet, now might be the perfect time to start!</p>
<p>For more details and to access the script, visit the <a target="_blank" href="https://github.com/bikramtuladhar/Jira-daily-task-extractor">Jira Daily Task Extractor repository on GitHub</a>.</p>
]]></content:encoded></item><item><title><![CDATA[What is Interaction Design and it's Principle?]]></title><description><![CDATA[Interaction design is all about making it easy and natural for people to use digital products, like websites or apps. It does this by giving feedback when users interact, such as showing animations when they scroll, changing the look of buttons when ...]]></description><link>https://blog.jobins.jp/what-is-interaction-design-and-its-principle</link><guid isPermaLink="true">https://blog.jobins.jp/what-is-interaction-design-and-its-principle</guid><category><![CDATA[IXD Design]]></category><category><![CDATA[Interaction design principle]]></category><category><![CDATA[Affordance]]></category><category><![CDATA[Human to computer interface]]></category><category><![CDATA[interaction design]]></category><category><![CDATA[visibility]]></category><category><![CDATA[Mapping]]></category><category><![CDATA[consistency]]></category><category><![CDATA[HCI]]></category><dc:creator><![CDATA[Ravi Gurung]]></dc:creator><pubDate>Fri, 27 Sep 2024 03:27:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1726766709558/3810e318-23ea-4e2a-848c-14463a3ddf16.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Interaction design is all about making it easy and natural for people to use digital products, like websites or apps. It does this by giving feedback when users interact, such as showing animations when they scroll, changing the look of buttons when clicked, or transition between multiple pages.</p>
<p>Interaction design also called IxD, uses things like animations, small interactive details, text, colors, and layout to guide how people feel and act while using the product. Basically, it is all about helping to create a better overall experience.</p>
<p><strong>The goal of interaction design is to create a user experience that makes interacting with technology easy and enjoyable. It involves understanding user needs, behaviors, and expectations to design interfaces that are both functional and fun to use.</strong></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=U7rS_2ch_Ps">https://www.youtube.com/watch?v=U7rS_2ch_Ps</a></div>
<p> </p>
<h3 id="heading-how-the-interaction-design-helps-on-engaging-user"><strong>How the interaction design helps on engaging user?</strong></h3>
<p>When we use an app or website, we follow steps based on what we want to do. Each time we take an action or enter information, the computer responds. When we do something else, it reacts again according to the action performed. Interaction design makes this process feel easy and smooth, like a conversation between us and the computer, rather than the computer just telling us what to do.</p>
<p>UI elements, micro-interactions, and navigation options helps to guide users through tasks. Interaction design not only arranges these elements but also predicts user behavior.</p>
<p>According to <a target="_blank" href="http://Usability.gov">Usability.gov</a>, designers should consider:</p>
<ul>
<li><p>Are the elements sized properly for easy interaction?</p>
</li>
<li><p>Do menus and navigation options appear in expected places, like corners or edges?</p>
</li>
<li><p>Are familiar design patterns used to help users navigate smoothly?</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726772391833/a499e52e-a0b8-4463-b7c2-2660696da6b1.png" alt="The Reserve button on this UI urge user to interact and book their reservation" class="image--center mx-auto" /></p>
<h3 id="heading-what-are-the-interaction-design-principles"><strong>What are the Interaction Design Principles?</strong></h3>
<p>According to the book “<strong>The Design of Everyday things”</strong> by Don Norman, father of UX also co-founder of NN Group these are some principles of IxD Design.</p>
<ol>
<li><p><strong>Visibility</strong></p>
<p> With many features and limited space, making sure key elements are visible is a big design challenge. Don Norman's theory says that the more visible something is, the more likely users will notice and use it. Interaction designers need to balance making important features easy to find while considering user needs and business goals.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726773216458/c69fde04-0cc9-4ca1-863d-8c43d447996f.png" alt class="image--center mx-auto" /></p>
<p> A common example is prioritizing segmented button on mobile devices. Designers choose which section to show and which ones to hide.</p>
</li>
<li><p><strong>Feedback</strong></p>
<p> Feedback is how a digital product communicates with users. Interaction designers can show this feedback using animations, touch responses, sounds, or text.</p>
<p> Designers must also consider accessibility, making sure feedback is clear and usable for everyone</p>
</li>
<li><p><strong>Constraints</strong></p>
<p> Cluttered UIs with too many options can confuse users and cause usability issues. Good interaction design makes the user experience simpler by limiting actions and guiding users through the product more effectively.</p>
<p> This is clear on landing pages, where designers remove extra navigation, links, and other distractions. By focusing on a single, clear call-to-action (CTA) or form, users are encouraged to engage with the content that leads to conversions.</p>
</li>
<li><p><strong>Consistency</strong></p>
<p> Consistency is crucial in interaction and UI design. Inconsistent designs can confuse users and cause usability problems. Designers must ensure a uniform experience within the interface and across different screen sizes and devices.</p>
<p> To keep things consistent, many organizations create a design system or use an open-source component library. These tools offer standardized UI patterns and interactions, letting designers focus on improving the user experience instead of making the same design decisions repeatedly. This approach helps users achieve their goals more efficiently.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726773829524/b49ba54f-934e-49f9-b19d-4e89f747ef74.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Mapping</strong></p>
<p> Interaction designers need to make sure there's a clear link between controls and their effects on a digital product, so users find it natural.</p>
<p> For example, on an iPhone, the top button raises the volume, and the bottom button lowers it. This simple layout means users don't have to remember which button does what.</p>
<p> The more intuitive and simple a product is, the easier and more enjoyable it is to use.</p>
</li>
<li><p><strong>Affordance</strong></p>
<p> Affordance shows users how to interact with a UI element or perform an action. It's the interaction designer's job to make sure it's clear how to use these elements to complete tasks.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726774212094/41cd3ce9-9dff-41f0-a7ad-0ec4d47975e0.png" alt class="image--center mx-auto" /></p>
<p> For example, using different colors and underlines for links makes it obvious which text is clickable. Also, disabled submit button seen on UI indicates that users need to fill out all required fields before submitting the form.</p>
</li>
</ol>
<h3 id="heading-conclusion">Conclusion</h3>
<p>In conclusion, good interaction design relies on key principles that help users navigate digital experiences easily. Visibility makes sure important elements are easy to see and access. Consistency keeps the experience uniform across different contexts and devices. Affordance shows users how to use various UI elements. Mapping aligns controls with their functions in an intuitive way. Constraints streamline user actions, focusing their attention and preventing errors. Feedback confirms user actions and guides them through interactions. By using these principles well, designers can create intuitive, engaging, and effective digital products that improve user satisfaction and drive success.</p>
]]></content:encoded></item><item><title><![CDATA[Using Google reCAPTCHA v3 with Next.js 14]]></title><description><![CDATA[Google reCAPTCHA v3 is a powerful tool that helps differentiate between human and bot traffic on your website. By integrating it into your Next.js 14 application, you can enhance security and protect against spam and abuse. Here’s a guide to integrat...]]></description><link>https://blog.jobins.jp/using-google-recaptcha-v3-with-nextjs-14</link><guid isPermaLink="true">https://blog.jobins.jp/using-google-recaptcha-v3-with-nextjs-14</guid><category><![CDATA[Next.js]]></category><category><![CDATA[recaptcha]]></category><category><![CDATA[google captcha v3]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[Binay Maharjan]]></dc:creator><pubDate>Fri, 27 Sep 2024 01:32:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727017895123/be6aef4d-32b1-42c8-b68f-0922f6065eec.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Google reCAPTCHA v3 is a powerful tool that helps differentiate between human and bot traffic on your website. By integrating it into your Next.js 14 application, you can enhance security and protect against spam and abuse. Here’s a guide to integrating Google reCAPTCHA v3 with a form submission in a Next.js 14 application, using Zod for form validation and Axios for making API requests.</p>
<h4 id="heading-step-1-install-required-dependencies">Step 1: Install Required Dependencies</h4>
<p>First, ensure you have the necessary dependencies installed:</p>
<pre><code class="lang-javascript">npm install react-google-recaptcha-v3 zod axios react-hook-form
</code></pre>
<h4 id="heading-step-2-create-the-form-component">Step 2: Create the Form Component</h4>
<p>In this component, we define the form using <code>react-hook-form</code> for form handling and <code>Zod</code> for validation. We use the <code>useGoogleReCaptcha</code> hook to access the reCAPTCHA token before submission.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React, { useCallback, useState } <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> { useForm } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-hook-form'</span>;
<span class="hljs-keyword">import</span> { z } <span class="hljs-keyword">from</span> <span class="hljs-string">'zod'</span>;
<span class="hljs-keyword">import</span> { zodResolver } <span class="hljs-keyword">from</span> <span class="hljs-string">'@hookform/resolvers/zod'</span>;
<span class="hljs-keyword">import</span> axiosApi <span class="hljs-keyword">from</span> <span class="hljs-string">'@/services/axiosApi'</span>;
<span class="hljs-keyword">import</span> { useGoogleReCaptcha } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-google-recaptcha-v3'</span>;
<span class="hljs-keyword">import</span> { Input } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/ui/input'</span>; <span class="hljs-comment">// This is shadcn Input component</span>
<span class="hljs-keyword">import</span> { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } <span class="hljs-keyword">from</span> <span class="hljs-string">'@/components/ui/form'</span>; <span class="hljs-comment">// UI Form Components</span>

<span class="hljs-comment">// Zod validation schema</span>
<span class="hljs-keyword">const</span> formSchema = z.object({
  <span class="hljs-attr">name</span>: z.string().min(<span class="hljs-number">1</span>, { <span class="hljs-attr">message</span>: <span class="hljs-string">'Name is required'</span> }),
  <span class="hljs-attr">email</span>: z.string().email({ <span class="hljs-attr">message</span>: <span class="hljs-string">'Invalid email'</span> }),
});

<span class="hljs-keyword">const</span> OurForm = <span class="hljs-function">(<span class="hljs-params">{ params }</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> { executeRecaptcha } = useGoogleReCaptcha();
  <span class="hljs-keyword">const</span> [isLoading, setIsLoading] = useState(<span class="hljs-literal">false</span>);

  <span class="hljs-keyword">const</span> form = useForm({
    <span class="hljs-attr">resolver</span>: zodResolver(formSchema),
    <span class="hljs-attr">defaultValues</span>: {
      <span class="hljs-attr">name</span>: <span class="hljs-string">''</span>,
      <span class="hljs-attr">email</span>: <span class="hljs-string">''</span>,
    },
  });

  <span class="hljs-comment">// Submit the form</span>
  <span class="hljs-keyword">const</span> onSubmit = useCallback(
    <span class="hljs-keyword">async</span> (data) =&gt; {
      <span class="hljs-keyword">try</span> {
        setIsLoading(<span class="hljs-literal">true</span>);

        <span class="hljs-keyword">if</span> (!executeRecaptcha) {
          <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'executeRecaptcha is not ready'</span>);
          <span class="hljs-keyword">return</span>;
        }

        <span class="hljs-keyword">const</span> gRecaptchaToken = <span class="hljs-keyword">await</span> executeRecaptcha(<span class="hljs-string">'form_submit'</span>);
        <span class="hljs-keyword">const</span> formData = { ...data, <span class="hljs-string">'g-recaptcha-response'</span>: gRecaptchaToken };

        <span class="hljs-keyword">await</span> axiosApi.post(<span class="hljs-string">`/form`</span>, formData);

        <span class="hljs-comment">// Handle success (e.g., navigate to a success page)</span>
      } <span class="hljs-keyword">catch</span> (error) {
        <span class="hljs-built_in">console</span>.error(error);
      } <span class="hljs-keyword">finally</span> {
        setIsLoading(<span class="hljs-literal">false</span>);
      }
    },
    [executeRecaptcha, params.id]
  );

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Form</span> {<span class="hljs-attr">...form</span>}&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">onSubmit</span>=<span class="hljs-string">{form.handleSubmit(onSubmit)}</span>&gt;</span>
        {/* Form Fields */}
        <span class="hljs-tag">&lt;<span class="hljs-name">FormField</span>
          <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span>
          <span class="hljs-attr">render</span>=<span class="hljs-string">{({</span> <span class="hljs-attr">field</span> }) =&gt;</span> (
            <span class="hljs-tag">&lt;<span class="hljs-name">FormItem</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormLabel</span>&gt;</span>Name<span class="hljs-tag">&lt;/<span class="hljs-name">FormLabel</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormControl</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Input</span> {<span class="hljs-attr">...field</span>} <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter your name"</span> /&gt;</span>
              <span class="hljs-tag">&lt;/<span class="hljs-name">FormControl</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormMessage</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">FormItem</span>&gt;</span>
          )}
        /&gt;
        <span class="hljs-tag">&lt;<span class="hljs-name">FormField</span>
          <span class="hljs-attr">name</span>=<span class="hljs-string">"email"</span>
          <span class="hljs-attr">render</span>=<span class="hljs-string">{({</span> <span class="hljs-attr">field</span> }) =&gt;</span> (
            <span class="hljs-tag">&lt;<span class="hljs-name">FormItem</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormLabel</span>&gt;</span>Email<span class="hljs-tag">&lt;/<span class="hljs-name">FormLabel</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormControl</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">Input</span> {<span class="hljs-attr">...field</span>} <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter your email"</span> /&gt;</span>
              <span class="hljs-tag">&lt;/<span class="hljs-name">FormControl</span>&gt;</span>
              <span class="hljs-tag">&lt;<span class="hljs-name">FormMessage</span> /&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">FormItem</span>&gt;</span>
          )}
        /&gt;
        <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-attr">disabled</span>=<span class="hljs-string">{isLoading}</span>&gt;</span>
          {isLoading ? 'Submitting...' : 'Submit'}
        <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">Form</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> OurForm;
</code></pre>
<h4 id="heading-step-3-wrap-form-with-googlerecaptchaprovider-in-parent-component">Step 3: Wrap Form with <code>GoogleReCaptchaProvider</code> in Parent Component</h4>
<p>To enable reCAPTCHA, you need to wrap your form component with <code>GoogleReCaptchaProvider</code>, providing the <code>reCaptchaKey</code> from environment variables.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> { GoogleReCaptchaProvider } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-google-recaptcha-v3'</span>;
<span class="hljs-keyword">import</span> OurForm <span class="hljs-keyword">from</span> <span class="hljs-string">'./OurForm'</span>;

<span class="hljs-keyword">const</span> OurPage = <span class="hljs-function">(<span class="hljs-params">{ params }</span>) =&gt;</span> {
  <span class="hljs-keyword">const</span> googleReCaptchaKey = process.env.NEXT_PUBLIC_GOOGLE_RECAPTCHA_SITE_KEY;

  <span class="hljs-keyword">return</span> (
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"relative"</span>&gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">GoogleReCaptchaProvider</span> <span class="hljs-attr">reCaptchaKey</span>=<span class="hljs-string">{googleReCaptchaKey}</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">OurForm</span> <span class="hljs-attr">params</span>=<span class="hljs-string">{params}</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">GoogleReCaptchaProvider</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
  );
};

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> OurPage;
</code></pre>
<h4 id="heading-step-4-setup-environment-variables">Step 4: Setup Environment Variables</h4>
<p>In your <code>.env</code> file, add your Google reCAPTCHA site key:</p>
<pre><code class="lang-javascript">NEXT_PUBLIC_GOOGLE_RECAPTCHA_SITE_KEY=your-site-key <span class="hljs-comment">// generated from google reCaptcha admin </span>
NEXT_PUBLIC_GOOGLE_RECAPTCHA_SECRET_KEY=your-secret-key
NEXT_PUBLIC_API_BASE_URL=your-url
</code></pre>
<h4 id="heading-step-5-axios-api-service-axiosapijs">Step 5: Axios API Service (<code>axiosApi.js</code>)</h4>
<p>Create a reusable Axios instance for making API requests.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> axios <span class="hljs-keyword">from</span> <span class="hljs-string">'axios'</span>;

<span class="hljs-keyword">const</span> axiosApi = axios.create({
  <span class="hljs-attr">baseURL</span>: process.env.NEXT_PUBLIC_API_BASE_URL,
  <span class="hljs-attr">headers</span>: {
    <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>,
  },
});

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> axiosApi;
</code></pre>
<p>This integration helps protect your forms against bots while maintaining a smooth user experience. For example you can visit the link <a target="_blank" href="https://codesandbox.io/p/devbox/nextjs-google-recaptcha-v3-demo-803er0?file=%2Fpages%2Findex.js">Google-Recaptcha-v3</a></p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>By integrating Google reCAPTCHA v3 into your Next.js 14 application and utilizing Zod for validation, you can significantly enhance your website's security and protect against spam and abuse. This guide has provided a comprehensive step-by-step approach to implementing reCAPTCHA v3, ensuring a seamless user experience while safeguarding your unwanted requests.<br />Thank you.</p>
<h3 id="heading-references">References</h3>
<p><a target="_blank" href="https://www.google.com/recaptcha/admin/create">https://www.google.com/recaptcha/admin/create</a></p>
<p><a target="_blank" href="https://www.youtube.com/watch?v=pcxh7cpeboU">https://www.youtube.com/watch?v=pcxh7cpeboU</a></p>
<p><a target="_blank" href="https://dev.to/adrianbailador/integrating-recaptcha-v3-in-nextjs-170o">https://dev.to/adrianbailador/integrating-recaptcha-v3-in-nextjs-170o</a></p>
<p><a target="_blank" href="https://www.npmjs.com/package/react-google-recaptcha-v3">https://www.npmjs.com/package/react-google-recaptcha-v3</a></p>
<p><a target="_blank" href="https://codesandbox.io/p/devbox/nextjs-google-recaptcha-v3-demo-803er0?file=%2Fpages%2Findex.js">https://codesandbox.io/p/devbox/nextjs-google-recaptcha-v3-demo-803er0?file=%2Fpages%2Findex.js</a></p>
]]></content:encoded></item><item><title><![CDATA[The High Cost of Bad UX: 7 Stats Every Business Should Know]]></title><description><![CDATA[In today’s competitive digital world, user experience (UX) is crucial for a business's success. Many companies still overlook the impact of poor UX, resulting in negative outcomes like lower customer satisfaction, revenue loss, and damage to their re...]]></description><link>https://blog.jobins.jp/the-high-cost-of-bad-ux-7-stats-every-business-should-know</link><guid isPermaLink="true">https://blog.jobins.jp/the-high-cost-of-bad-ux-7-stats-every-business-should-know</guid><category><![CDATA[UX]]></category><category><![CDATA[Bad UX]]></category><category><![CDATA[user experience]]></category><category><![CDATA[Customer Experience]]></category><category><![CDATA[engineering]]></category><category><![CDATA[Design]]></category><category><![CDATA[business]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[product]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Developer]]></category><category><![CDATA[development]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[design thinking]]></category><category><![CDATA[UX design process ]]></category><dc:creator><![CDATA[Sandip Bhandari]]></dc:creator><pubDate>Fri, 27 Sep 2024 01:31:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727108473954/7940d44e-4715-4cf5-b259-cf2c295d79ec.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In today’s competitive digital world, user experience (UX) is crucial for a business's success. Many companies still overlook the impact of poor UX, resulting in negative outcomes like lower customer satisfaction, revenue loss, and damage to their reputation. Here, we’ll look at 7 key statistics that show why businesses must focus on great UX—and the serious consequences of ignoring it.</p>
<h3 id="heading-88-of-users-wont-return-after-a-bad-experience">88% of Users Won’t Return After a Bad Experience</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727104548777/05f02e0d-d72a-4988-bcbc-5f844bac8b15.png" alt class="image--center mx-auto" /></p>
<p>A negative first impression can cost you more than just one sale—it can cost you a customer for life. Research reveals that 88% of users are unlikely to return to a website after a poor user experience. This includes factors such as slow load times, complicated navigation, or a non-intuitive interface.</p>
<p><strong>Tip:</strong> Regularly conduct usability testing and audits to uncover pain points before launch. Use behavior analytics tools such as Hotjar, Google Analytics, or Crazy Egg to track user actions and adjust based on data-driven insights.</p>
<h3 id="heading-poor-ux-costs-companies-26-billion-annually">Poor UX Costs Companies $2.6 Billion Annually</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727104737046/26fb861f-b1a1-46c3-86a3-8cde91a187f3.png" alt class="image--center mx-auto" /></p>
<p>The financial toll of bad UX is staggering. Globally, companies are losing a combined $2.6 billion each year due to poor user experience. This loss is felt through a variety of ways: abandoned carts, high bounce rates, and low user engagement.</p>
<p><strong>Tip:</strong> Optimize your user journey by focusing on key friction points. Ensure that forms are easy to complete, minimize the number of steps in the checkout process, and streamline navigation to reduce user frustration.</p>
<h3 id="heading-every-1-invested-in-ux-yields-a-100-return">Every $1 Invested in UX Yields a $100 Return</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727104134041/f9ad031b-6229-48d1-85c2-e3ff0274dc9b.png" alt class="image--center mx-auto" /></p>
<p>One of the most compelling arguments for investing in UX is the remarkable return on investment (ROI). For every dollar spent on UX improvements, businesses can expect an average return of $100, equating to a 9,900% ROI.</p>
<p><strong>Tip:</strong> Focus on continuous UX improvements. Begin by investing in user research and prototyping. Conduct A/B testing to determine which design elements resonate most with users, and use iterative design processes to refine the user journey continually.</p>
<h3 id="heading-bounce-rate-increases-by-123-if-page-loading-time-becomes-more-than-one-second">Bounce rate increases by 123%, If page loading time becomes more than one second</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727107675349/8449ad38-cb55-4515-b7aa-392c03f28da4.png" alt class="image--center mx-auto" /></p>
<p>A 123% increase in bounce rates is observed when page loading times surpass just one second. As users become increasingly impatient with slow-loading websites, they are more likely to leave, significantly impacting conversion rates and overall user engagement.</p>
<p><strong>Tip:</strong> Optimize website speed by compressing images, reducing HTTP requests, and leveraging content delivery networks (CDNs) to ensure faster load times and retain users.</p>
<h3 id="heading-67-of-customers-abandon-brands-due-to-poor-experiences">67% of Customers Abandon Brands Due to Poor Experiences</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727104287033/d4d8cc71-07a2-4d4a-9e1b-1fe753c29472.png" alt class="image--center mx-auto" /></p>
<p>Customer loyalty is fragile. Research shows that 67% of customers leave brands due to negative experiences, whether it’s a sluggish website, confusing navigation, or poor mobile optimization. Once customers have a bad experience, they are far less likely to give a brand another chance.</p>
<p><strong>Tip:</strong> Continuously gather and analyze customer feedback. Tools like Qualtrics or SurveyMonkey can help you measure user satisfaction and identify specific pain points in your digital experience that need attention.</p>
<h3 id="heading-better-ux-can-increase-conversion-rates-by-200">Better UX Can Increase Conversion Rates by 200%</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727103866306/6649f2cf-0c2f-4786-ba80-f20857d6a41f.png" alt class="image--center mx-auto" /></p>
<p>Good UX doesn’t just mitigate losses—it drives measurable gains. Studies show that improving your UX can increase conversion rates by as much as 200%, transforming more visitors into paying customers and driving sustainable business growth.</p>
<p><strong>Tip:</strong> Employ A/B testing to refine your conversion funnels. Test different design elements like call-to-action buttons, form fields, and layout configurations to find what resonates best with your audience and optimizes the user journey.</p>
<h3 id="heading-89-of-users-goto-competitors-after-a-poor-user-experience">89% of Users goto competitors after a poor user experience</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727104850064/03a573af-2f6c-4704-9818-eb52a8cbacda.png" alt class="image--center mx-auto" /></p>
<p>When users encounter some issues, they’re more likely to abandon your website in favor of a competitor who offers a smoother experience. The result? Lost revenue, diminished brand loyalty, and potentially long-term damage to your reputation.</p>
<p><strong>Tip:</strong> Regularly optimize your site through usability testing, performance enhancements, and design updates. Stay ahead of competitors by ensuring your platform is fast, easy to navigate, and visually appealing across all devices.</p>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>The statistics make one thing abundantly clear: bad UX is costly—not just in terms of financial loss but also in lost customers, damaged reputations, and missed opportunities. Investing in creating seamless, intuitive, and responsive digital experiences is no longer a luxury; it’s a necessity. Businesses that embrace UX as a core business strategy will not only avoid the high costs of bad UX but will also see their revenue, customer satisfaction, and brand loyalty soar.</p>
<p>Now is the time to invest in UX—and watch your business thrive.</p>
]]></content:encoded></item><item><title><![CDATA[How to use Figma slide deck : Step by step guide]]></title><description><![CDATA[Figma Slides is currently available in beta throughout 2024, allowing users to explore its features and provide feedback during the testing phase. This new tool is designed to seamlessly integrate with Figma’s existing design platform, offering a str...]]></description><link>https://blog.jobins.jp/how-to-use-figma-slide-deck-step-by-step-guide</link><guid isPermaLink="true">https://blog.jobins.jp/how-to-use-figma-slide-deck-step-by-step-guide</guid><category><![CDATA[figma presentation]]></category><category><![CDATA[Design]]></category><category><![CDATA[Developer]]></category><category><![CDATA[development]]></category><category><![CDATA[UX]]></category><category><![CDATA[figma]]></category><category><![CDATA[slides]]></category><dc:creator><![CDATA[Sandip Bhandari]]></dc:creator><pubDate>Tue, 27 Aug 2024 03:23:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724609211171/5371a5bb-ac77-4d09-8544-624875ff9622.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Figma Slides is currently available in beta throughout 2024, allowing users to explore its features and provide feedback during the testing phase. This new tool is designed to seamlessly integrate with Figma’s existing design platform, offering a streamlined way to create and present slide decks within the same environment where your design work happens.</p>
<p>Starting in early 2025, Figma Slides will become accessible on the Starter plans at no additional cost, making it an ideal choice for teams and individuals looking to create visually engaging presentations. For those on paid plans, Figma Slides will be available at an affordable rate of $3 or $5 per month, depending on your subscription tier. This pricing structure ensures that users can continue to enjoy the benefits of Figma’s collaborative design tools while also leveraging the new slide deck feature to enhance their workflow.</p>
<p>To learn more about pricing, <a target="_blank" href="https://www.figma.com/pricing/"><strong>click here</strong></a></p>
<h3 id="heading-how-to-use-figma-slides"><strong>How to use Figma slides</strong></h3>
<p>While Figma offers an intuitive interface, I’m here to guide you through the features of Figma Slides, giving you a quick and clear overview. Whether you’re new to Figma or looking to enhance your skills, we’ll explore how to make the most of this powerful tool for creating engaging presentations. Let’s dive in and unlock the full potential of Figma Slides together.</p>
<ol>
<li><h3 id="heading-open-figma-and-click-new-slide-deck">Open Figma and Click “<strong>New slide deck</strong>”</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724260108786/45aa2d10-4056-4d25-b743-949e1e214852.png" alt class="image--center mx-auto" /></p>
<p>Creating a new slide deck in Figma is simple and intuitive. Just click “New slide deck” to start building your presentation directly within Figma. With Figma’s collaborative environment, you can work with your team in real-time, ensuring that your slides are polished and ready to impress. Let’s explore how you can leverage Figma Slides to create presentations that stand out.</p>
<ol start="2">
<li><h3 id="heading-figma-slides-templates">Figma slides templates</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724260353423/96cca2a0-95ae-4e34-af98-f64227f7fdc2.png" alt class="image--center mx-auto" /></p>
<p>Figma offers a variety of templates to kickstart your presentation. Whether you're aiming for a professional look or a creative flair, you can choose a template that perfectly matches the purpose of your document. But if you're feeling bold, you can always dive in and start from scratch with blank slides, giving you complete creative freedom.</p>
<ol start="3">
<li><h3 id="heading-figma-slides-for-better-team-work">Figma slides for better team work</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724260834188/486b3767-811c-49da-af2b-98b99f82b82b.png" alt class="image--center mx-auto" /></p>
<p>One of the standout features of Figma Slides is the ability to collaborate in real-time with your teammates. You and your co-workers can work on the same document simultaneously, making the creative process more dynamic and efficient. Want to drop a quick message or give feedback on a slide? <strong>Just hit the “/” button to say hi or leave a note!</strong> This seamless collaboration keeps everyone on the same page and makes working together more engaging and fun. Whether you’re brainstorming ideas or finalizing details, Figma Slides brings your team closer together.</p>
<ol start="4">
<li><h3 id="heading-single-slide-view-vs-grid-view">Single slide view vs Grid view</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724517182009/ad696ade-3375-4fd4-b94f-4966875f7197.png" alt class="image--center mx-auto" /></p>
<p>By clicking the toggle layout button in the top left corner, you can effortlessly switch between list and grid slide layout views. Whether you want to concentrate on a single slide for detailed editing or get a broader perspective by viewing your entire document in grid view, this feature gives you the flexibility to work the way that suits you best. This simple toggle makes navigating and editing your presentation a breeze.</p>
<ol start="5">
<li><h3 id="heading-properties-panel">Properties panel</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724518807638/9fa656aa-3a81-4769-ba06-03fbf523e00a.png" alt class="image--center mx-auto" /></p>
<p>Simply click on the element you want to edit, and the design bar will instantly appear. From there, you can access all your favorite design features, including auto layout and advanced properties. Whether you’re adjusting alignment, tweaking spacing, or diving into more complex settings, everything you need is right at your fingertips. You can find animate tab on the other side of properties panel where you can play with different style, curves &amp; timing while presenting your slides.<br />Figma Slides includes Presenter Notes, a handy feature that lets you add key talking points and reminders directly within your slide deck. These notes are visible only to you during presentations, ensuring you stay on track and deliver a polished, well-organized presentation without missing any important details. It's the perfect tool to help you confidently navigate through your slides.</p>
<ol start="6">
<li><h3 id="heading-live-interaction">Live Interaction</h3>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724598742105/3fefc111-7b94-444b-bb83-7cd39596787a.png" alt class="image--center mx-auto" /></p>
<p>Figma Slides offers a powerful <strong>Live Interaction</strong> feature that enhances audience engagement during presentations. This tool allows presenters to integrate interactive elements such as polls, alignment scales, stamps, and prototype demonstrations directly into their slide decks. By enabling real-time participation, you can gather instant feedback, gauge audience opinions, and create a more immersive experience. Whether you’re seeking input on design directions or showcasing interactive prototypes, Figma’s Live Interaction feature turns a traditional presentation into a collaborative dialogue, making your sessions more impactful and engaging.</p>
<h3 id="heading-better-ways-to-make-slides-with-figma">Better ways to make slides with figma</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724599017480/95abe8f0-5306-4467-9c2e-93d99042b900.png" alt class="image--center mx-auto" /></p>
<p>The Figma plugin for exporting to Interactive PDFs and gaining Docs Insight is a game-changer for creating and analyzing slide decks. This tool allows you to transform your Figma slides into interactive PDFs, ensuring that your presentations are not only visually appealing but also engaging for your audience. With built-in page analytics, you can track how long viewers spend on each slide, providing valuable insights into which parts of your presentation are resonating most. This plugin is essential for anyone looking to elevate their presentations with interactive features and data-driven improvements.<br />To learn more about FeatPaper Figma Plugin <a target="_blank" href="https://www.figma.com/community/plugin/1326016838560913134/figma-to-pdf-featpaper-docs-presentation-pitchdeck-deck-proposal-portfolio-etc">click here</a></p>
<p>Here is the actual link for demo slide<mark><br /></mark><a target="_blank" href="https://www.figma.com/deck/xDWPhihjK2v9VFGqPdNU3N/Untitled?node-id=18-59&amp;viewport=632%2C255%2C0.29&amp;t=HywytgXpbsHLUpKU-1&amp;scaling=min-zoom&amp;content-scaling=fixed&amp;page-id=0%3A1"><mark>https://www.figma.com/deck/xDWPhihjK2v9VFGqPdNU3N/Untitled?node-id=18-59&amp;viewport=632%2C255%2C0.29&amp;t=HywytgXpbsHLUpKU-1&amp;scaling=min-zoom&amp;content-scaling=fixed&amp;page-id=0%3A1</mark></a></p>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>Congratulations! You've now mastered the basics of creating a slide presentation using Figma, whether it's for school, business, or any other purpose. With Figma's intuitive design tools, a wide range of templates, and powerful collaboration features, crafting visually stunning and effective presentations has never been easier. The ability to seamlessly integrate interactive elements, track viewer engagement, and customize your slides ensures that your presentations stand out. As you continue exploring Figma Slide Deck, you'll discover even more advanced features to elevate your work.</p>
<p>Happy Designing 👨‍💻</p>
]]></content:encoded></item><item><title><![CDATA[Boost ReactJs and VueJs Performance with Data Virtualization Techniques]]></title><description><![CDATA[As web applications grow more complex and data-intensive, performance optimization becomes increasingly critical. Recently, I encountered significant performance challenges while building list card components for a large-scale data set in a Next.js a...]]></description><link>https://blog.jobins.jp/boost-reactjs-and-vuejs-performance-with-data-virtualization-techniques</link><guid isPermaLink="true">https://blog.jobins.jp/boost-reactjs-and-vuejs-performance-with-data-virtualization-techniques</guid><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Vue.js]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[guide]]></category><category><![CDATA[optimization]]></category><category><![CDATA[performance]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Nirajan Basnet]]></dc:creator><pubDate>Mon, 26 Aug 2024 03:20:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724642402955/d1b554e2-75f0-4eb9-b3de-b81d6a12e3ce.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As web applications grow more complex and data-intensive, performance optimization becomes increasingly critical. Recently, I encountered significant performance challenges while building list card components for a large-scale data set in a Next.js application. The application had to handle more than 2,000 data items, and without pagination, the UI became sluggish and unresponsive. This led me to explore data virtualization as a solution, which proved to be a game-changer for optimizing the system.</p>
<h3 id="heading-the-challenge-handling-large-data-sets-without-pagination"><strong>The Challenge: Handling Large Data Sets Without Pagination</strong></h3>
<p>In a recent project, I was tasked with building a list card component to display over 2,000 data items in a Next.js application. Initially, I opted to render all the data at once, thinking it would provide a seamless user experience. However, this approach quickly exposed its limitations:</p>
<ul>
<li><p><strong>Performance Issues:</strong> The browser struggled to render such a large number of DOM elements simultaneously. This led to slow page loads, increased memory usage, and a generally sluggish user experience.</p>
</li>
<li><p><strong>User Experience:</strong> Scrolling through the list became choppy, and the overall responsiveness of the application suffered. This was especially problematic for users on lower-end devices or with slower internet connections.</p>
</li>
</ul>
<p>Without implementing pagination or any form of data optimization, the application’s performance degraded, making it clear that an alternative solution was necessary.</p>
<h3 id="heading-the-solution-data-virtualization"><strong>The Solution: Data Virtualization</strong></h3>
<p>Data virtualization emerged as the perfect solution to this problem. It allows only a subset of the data to be rendered in the DOM at any given time, typically only the items visible in the viewport. As the user scrolls, the data virtualization library dynamically renders the next set of items, keeping the DOM lightweight and the application fast.</p>
<h3 id="heading-how-data-virtualization-works"><strong>How Data Virtualization Works</strong></h3>
<p>Data virtualization works by rendering only the visible portion of a large data set and a small buffer of off-screen items. As the user scrolls, the components that move out of view are removed from the DOM, and new components are added to represent the next set of visible items. This technique significantly reduces the number of DOM elements at any given time, improving both rendering performance and memory usage.</p>
<p>Here’s a simplified illustration of how data virtualization works:</p>
<ol>
<li><p><strong>Initial Render:</strong> Only the items visible in the viewport and a small buffer above and below are rendered.</p>
</li>
<li><p><strong>Scroll Event:</strong> As the user scrolls, the list dynamically updates, rendering new items that come into view and removing those that move out of view.</p>
</li>
<li><p><strong>Continuous Update:</strong> This process continues, ensuring that the DOM always contains a manageable number of elements, regardless of the total size of the data set.</p>
</li>
</ol>
<h3 id="heading-implementing-data-virtualization-in-a-react-application"><strong>Implementing Data Virtualization in a React Application</strong></h3>
<p>To implement data virtualization in a React application, you can use libraries like <code>react-window</code> or <code>react-virtualized</code>. Below is an example using <code>react-window</code>:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { FixedSizeList <span class="hljs-keyword">as</span> List } <span class="hljs-keyword">from</span> <span class="hljs-string">'react-window'</span>;

<span class="hljs-keyword">const</span> Row = <span class="hljs-function">(<span class="hljs-params">{ index, style }</span>) =&gt;</span> (
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">style</span>=<span class="hljs-string">{style}</span>&gt;</span>
    {/* Render your card component here */}
    <span class="hljs-tag">&lt;<span class="hljs-name">CardComponent</span> <span class="hljs-attr">data</span>=<span class="hljs-string">{data[index]}</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
);

<span class="hljs-keyword">const</span> VirtualizedList = <span class="hljs-function">(<span class="hljs-params">{ data }</span>) =&gt;</span> (
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">List</span>
    <span class="hljs-attr">height</span>=<span class="hljs-string">{600}</span> // <span class="hljs-attr">Height</span> <span class="hljs-attr">of</span> <span class="hljs-attr">the</span> <span class="hljs-attr">list</span> <span class="hljs-attr">container</span>
    <span class="hljs-attr">itemCount</span>=<span class="hljs-string">{data.length}</span> // <span class="hljs-attr">Total</span> <span class="hljs-attr">number</span> <span class="hljs-attr">of</span> <span class="hljs-attr">items</span>
    <span class="hljs-attr">itemSize</span>=<span class="hljs-string">{120}</span> // <span class="hljs-attr">Height</span> <span class="hljs-attr">of</span> <span class="hljs-attr">each</span> <span class="hljs-attr">item</span>
    <span class="hljs-attr">width</span>=<span class="hljs-string">"100%"</span> // <span class="hljs-attr">Width</span> <span class="hljs-attr">of</span> <span class="hljs-attr">the</span> <span class="hljs-attr">list</span> <span class="hljs-attr">container</span>
  &gt;</span>
    {Row}
  <span class="hljs-tag">&lt;/<span class="hljs-name">List</span>&gt;</span></span>
);

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> VirtualizedList;
</code></pre>
<p>In this example:</p>
<ul>
<li><p><code>height</code> defines the height of the list container.</p>
</li>
<li><p><code>itemCount</code> is the total number of items in your data set.</p>
</li>
<li><p><code>itemSize</code> specifies the height of each item in the list.</p>
</li>
<li><p>The <code>Row</code> component renders each item, and <code>react-window</code> handles the rendering and removal of items as the user scrolls.</p>
</li>
</ul>
<p>For more information visit this <a target="_blank" href="https://react-window.vercel.app/#/examples/list/fixed-size"><strong>link</strong></a>.</p>
<h3 id="heading-implementing-data-virtualization-in-a-vuejs-application"><strong>Implementing Data Virtualization in a Vue.js Application</strong></h3>
<p>In a Vue.js application, you can achieve data virtualization using the <code>vue-virtual-scroller</code> library. Below is an example implementation:</p>
<pre><code class="lang-javascript">&lt;template&gt;
  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">virtual-scroller</span>
      <span class="hljs-attr">:items</span>=<span class="hljs-string">"items"</span>
      <span class="hljs-attr">:item-height</span>=<span class="hljs-string">"120"</span>
      <span class="hljs-attr">class</span>=<span class="hljs-string">"scroller"</span>
    &gt;</span>
      <span class="hljs-tag">&lt;<span class="hljs-name">template</span> #<span class="hljs-attr">default</span>=<span class="hljs-string">"{ item }"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">CardComponent</span> <span class="hljs-attr">:data</span>=<span class="hljs-string">"item"</span> /&gt;</span>
      <span class="hljs-tag">&lt;/<span class="hljs-name">template</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">virtual-scroller</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>
&lt;/template&gt;

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
<span class="hljs-keyword">import</span> { defineComponent } <span class="hljs-keyword">from</span> <span class="hljs-string">'vue'</span>;
<span class="hljs-keyword">import</span> VirtualScroller <span class="hljs-keyword">from</span> <span class="hljs-string">'vue-virtual-scroller'</span>;
<span class="hljs-keyword">import</span> CardComponent <span class="hljs-keyword">from</span> <span class="hljs-string">'./CardComponent.vue'</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> defineComponent({
  <span class="hljs-attr">components</span>: { VirtualScroller, CardComponent },
  data() {
    <span class="hljs-keyword">return</span> {
      <span class="hljs-attr">items</span>: [] <span class="hljs-comment">// Your data array</span>
    };
  },
  mounted() {
    <span class="hljs-comment">// Fetch or initialize your data here</span>
    <span class="hljs-built_in">this</span>.items = fetchData();
  }
});
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span>

<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
<span class="hljs-selector-class">.scroller</span> {
  <span class="hljs-attribute">height</span>: <span class="hljs-number">600px</span>; <span class="hljs-comment">/* Height of the scroller container */</span>
  <span class="hljs-attribute">overflow-y</span>: auto;
}
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span></span>
</code></pre>
<p>In this Vue.js example:</p>
<ul>
<li><p>The <code>virtual-scroller</code> component dynamically renders only the visible items.</p>
</li>
<li><p>The <code>items</code> array contains the data set, and <code>item-height</code> defines the height of each item.</p>
</li>
<li><p>The <code>CardComponent</code> is used to render each item in the list.</p>
</li>
</ul>
<p>For more information visit this <a target="_blank" href="https://vue-virtual-scroller-demo.netlify.app/"><strong>link</strong></a><strong>.</strong></p>
<h4 id="heading-the-impact-of-data-virtualization">The Impact of Data Virtualization</h4>
<p>By implementing data virtualization, I was able to drastically improve the performance of the Next.js application. The list card component became smooth and responsive, even with over 1,000 data items. The memory usage was reduced, and the overall user experience was enhanced. Similarly, in Vue.js applications, data virtualization can provide the same performance benefits, making it an essential tool for handling large data sets efficiently.  </p>
<hr />
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>Data virtualization is a powerful optimization technique for React and Vue.js applications dealing with large data sets. By rendering only the visible portion of the data, you can significantly improve performance, reduce memory usage, and enhance the user experience. Whether you’re building a complex Next.js application or a feature-rich Vue.js app, data virtualization should be a key part of your performance optimization toolkit.</p>
<p>👏👏 By coming this far I hope you understand how data virtualization works and can implement this awesome packages on your project. So, I suggest you give it a try on your project and enjoy it!</p>
<p>Feel free to share your thoughts and opinions and leave me a comment if you have any problems or questions.</p>
<p>Till then, Keep on Hacking, Cheers</p>
]]></content:encoded></item><item><title><![CDATA[How Wireframing Boosts Product Design and Development Efficiency]]></title><description><![CDATA[Wireframe represent a skeleton structure or an initial concept of any future website, system, app or any other digital product. It focuses mainly on crucial aspects like page structure, layout, information architecture, user flow, functionality, and ...]]></description><link>https://blog.jobins.jp/how-wireframing-boosts-product-design-and-development-efficiency</link><guid isPermaLink="true">https://blog.jobins.jp/how-wireframing-boosts-product-design-and-development-efficiency</guid><category><![CDATA[UX]]></category><category><![CDATA[wireframes]]></category><category><![CDATA[design principles]]></category><category><![CDATA[Product Design]]></category><dc:creator><![CDATA[Suresh Sapkota]]></dc:creator><pubDate>Mon, 26 Aug 2024 01:28:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724166935977/1928a479-f332-4445-a93e-01911c13a048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Wireframe represent a skeleton structure or an initial concept of any future website, system, app or any other digital product. It focuses mainly on crucial aspects like page structure, layout, information architecture, user flow, functionality, and intended behaviors and other active parts neglecting details related to color, typography or graphics.</p>
<p>Typically used during initial periods of development; these blueprints are a way for designing teams, software engineers and economic stakeholders to interactively reach agreement concerning user interface (UI) design before advancing to finer design stages.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Simple tools such as pen and paper may be applied in their creation although some purposes may be satisfied by using <a target="_blank" href="https://webflow.com/blog/wireframe-tools">wireframing tools</a> such as Figma, Sketch, as well as Adobe XD and many more.</div>
</div>

<h3 id="heading-types-of-wireframe">Types of wireframe</h3>
<p>Wireframes vary in detail and complexity, and they are classified into three varieties based on fidelity: low-fidelity, mid-fidelity, and high-fidelity. Each kind has a different function in the design process.</p>
<p>1. <strong>Low-Fidelity Wireframes:</strong></p>
<p>Overview:<br />These are basic sketches that are often done by hand and which focus on the general structure and layout without much detail. They usually have one color and contain simple shapes like boxes or placeholders that represent the different components.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724244288696/54a6dd40-c8c4-4b28-8c29-5d845b8ad11d.png" alt="wireframe-best-UX-design-tool" class="image--center mx-auto" /></p>
<p>Purpose:<br />- Used in the initial phases of design to swiftly visualize and convey ideas.<br />- Suitable for brainstorming sessions, early conceptualization, and early-stage feedback.</p>
<p>Features:<br />- Minimal detail, often just outlines and basic shapes.<br />- No attention to scale, spacing, or specific design elements.<br />- Focuses on overall layout, placement of contents and navigation flow.</p>
<p>Tools:<br />Pen and paper, whiteboards or basic digital tools such as Balsamiq.</p>
<p>2. <strong>Mid-Fidelity Wireframes:</strong></p>
<p>Overview<br />These wireframes provide more detail than low-fidelity wireframes. They often show more accurately how the layout will be, clearly labeling elements and more properly structured; therefore, they focus on their functionalities.</p>
<p>Purpose<br />- Helps in refining design concepts as well as get feedback that is more specific about structures and functionalities.<br />- Aids in identifying possible issues with the design before advancing to high-fidelity wireframes or prototypes.</p>
<p>Features<br />- They represent elements, headings, text blocks, buttons or forms in greater detail than low-fidelity wireframes.<br />- The aspect of spacing and alignment is given some attention.<br />May contain simple interactive components like dropdown lists, sliders and navigation menus.</p>
<p>Tools<br />Digital tools like Sketch, Figma or Adobe XD are usually used for this purpose.</p>
<p>3. <strong>High-Fidelity Wireframes:</strong></p>
<p>Overview:<br />These are wireframe designs which have high detailing and look alike to the final design in all aspects except for the full visual styling (colors, fonts, images). They contain specific content, comprehensive annotations and frequently simulate how interactions should flow.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724247485995/13fd133c-a1d6-48eb-938b-a177322a97e2.png" alt="wireframe-best-UX-design-tool" class="image--center mx-auto" /></p>
<p>Purpose:<br />- They are used during the later stages of design in order to finalize both structure and interaction before embarking on complete design as well as development.<br />- A blueprint for developers is what this serves as because it offers a <a target="_blank" href="https://blog.jobins.jp/product-designers-how-to-meet-business-goals-and-user-needs">clear guide for building this product</a>.</p>
<p>Features:<br />- They have a minute plan with accurate spacing, alignment and proportions.<br />- They have in-depth explanations about functionalities, interactions and how elements behave.<br />- There might be some basic forms of styling included like grayscale variants of the ultimate design.</p>
<p>Tools:<br />Advanced design tools such as Figma Sketch Adobe XD or Axure.</p>
<h3 id="heading-benefits-of-wireframe">Benefits of Wireframe</h3>
<p>Wireframes act as a blueprint for your digital product, outlining the primary structure and functionality ideas and placements prior to thorough design and development. This promotes seamless collaboration and improved communication because all product stakeholders, designers, and developers have a clear grasp of the project's direction. Below are the key benefits of wireframe:</p>
<p>1. <strong>Clarifies Project Requirements:</strong></p>
<ul>
<li><strong>Early Visualization</strong></li>
</ul>
<p>The wireframes show clearly the general structure of the project, enabling stakeholders to see how the final product will look and function. Especially when you are trying out ideas and seeking someone’s opinion early on, it comes in handy.</p>
<ul>
<li><strong>Scope Definition</strong></li>
</ul>
<p>In defining the project scope, they outline the pages, features and elements that are required, hence preventing scope creep.</p>
<p>2.<strong>Facilitates Collaboration:</strong></p>
<ul>
<li><strong>Communication Tool</strong></li>
</ul>
<p>Wireframes serve as a means of communication among designers, developers, and clients. They help to verify that everyone is on the same page about design and functionality before more comprehensive design work begins.</p>
<ul>
<li><strong>Feedback Gathering</strong></li>
</ul>
<p>Wireframes make it easy to gather early feedbacks and make modifications before investing considerable time and resources. Since, they are more focused on structure and information</p>
<p>3. <strong>Save Time &amp; Resources</strong></p>
<ul>
<li><strong>Efficient Iteration</strong></li>
</ul>
<p>A wireframe can be adjusted much more easily and quickly than a high-fidelity design or final product. Early iterations enable for the refinement of the user experience (UX) without the expense of rewriting code or redesigning detailed parts.</p>
<ul>
<li><strong>Prevents Misunderstandings</strong></li>
</ul>
<p>Wireframes help to avoid misconceptions by clearly displaying the intended functionality, layout, and flow, lowering the likelihood of significant adjustments later in the project.</p>
<p>4. <strong>Focuses on User Experience (UX):</strong></p>
<ul>
<li><strong>User-Centered Design</strong></li>
</ul>
<p>Wireframes urge designers to prioritize usability and user experience. They enable designers to consider how users will browse and interact with the interface, ensuring that the layout is both intuitive and efficient.</p>
<ul>
<li><strong>Identifying Potential Issues</strong></li>
</ul>
<p>By visualizing the flow and structure early on, possible usability concerns can be detected and solved before going on to the more complex design and production stages.</p>
<p>5. <strong>Guides the Design Process:</strong></p>
<ul>
<li><strong>Foundation for Design</strong></li>
</ul>
<p>Wireframes serve as a foundation for visual design. They specify where material, graphics, and functional aspects should be put, leading the design team to produce a unified, visually appealing end result.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724246439566/f00572f5-da61-4ef1-9321-4e999d377933.png" alt="product-design-foundation" class="image--center mx-auto" /></p>
<ul>
<li><strong>Content Prioritization</strong></li>
</ul>
<p>Through reducing interface to basics, wireframes give importance to content and functions as they make sure that most crucial aspects are exposed.</p>
<p>6. <strong>Enhances Development Efficiency:</strong></p>
<ul>
<li><strong>Blueprint for Development</strong></li>
</ul>
<p>Wireframes provide an outline for developers, which indicates the specific items that require construction. This minimizes the possibility of misunderstanding between parties involved and confirms that the development team comprehends what functions were expected from it.</p>
<ul>
<li><strong>Early Testing</strong></li>
</ul>
<p>Early <a target="_blank" href="https://blog.jobins.jp/building-better-products-the-role-of-usability-testing-in-design-excellence">usability testing can be conducted using basic wireframes so that user feedback is obtained by teams</a> before development starts which leads to more user-friendly final outputs.</p>
<h3 id="heading-different-approach-for-desktopweb-amp-mobile-app-wireframes">Different Approach For Desktop/web &amp; Mobile App Wireframes</h3>
<p>When building wireframes for mobile and desktop apps, there are several best practices and methodologies to follow to guarantee that the wireframes are effective and meet the unique requirements of each platform.</p>
<p>📌 <strong>Screen Size &amp; Orientation:</strong></p>
<p><strong>Mobile Apps</strong></p>
<p>Humans use smaller mobile screens, most of them are vertically oriented. Thus, the layout designs must consider vertical scrolling and it should be made possible to get important data without doing too much of scrolling.</p>
<p><strong>Desktop/Web Apps</strong></p>
<p>Desktop wireframes can use more screen space, enabling for more sophisticated layouts with many columns and larger content sections.</p>
<hr />
<p>📌 <strong>Interaction:</strong></p>
<p><strong>Mobile Apps</strong></p>
<p>Because mobile devices rely on touch, wireframes should take into account touch targets, such as gestures like tap or pinch (swipe).</p>
<p><strong>Desktop/Web Apps</strong></p>
<p>Desktops use mouse and keyboard inputs, therefore wireframes can feature smaller clickable objects and more sophisticated interactions (hover states, right-click menus).</p>
<hr />
<p>📌 <strong>Context &amp; Usage:</strong></p>
<p><strong>Mobile Apps</strong></p>
<p>Being that mobile users tend to move around, wireframes targeting this group should focus on providing instant access to important activities while making navigation easier. Consider where and how users will use mobile apps, such as on the go or in short bursts.</p>
<p><strong>Desktop/Web Apps</strong></p>
<p>Consider longer session and maybe more challenging activities while using desktop programs.</p>
<hr />
<p>📌 <strong>Hierarchy of Information:</strong></p>
<p><strong>Mobile Apps</strong></p>
<p>For mobile apps, this often means simplifying navigation and reducing content to essentials by ensuring clear and most critical content with quick access.</p>
<p><strong>Desktop/Web Apps</strong></p>
<p>For mobile apps, this often means simplifying navigation and reducing content to essentials.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1724248713779/c4df6ae2-f0f8-478d-84ab-458dca9faaf4.png" alt="best-wireframe-meme" class="image--center mx-auto" /></p>
<p><em>Img src: imgflip.com, tsh.io</em></p>
<hr />
<p>📌 <strong>Navigation &amp; User Flow:</strong></p>
<p><strong>Mobile Apps</strong></p>
<p>Consider mobile-specific navigation patterns, such as bottom navigation bars, hamburger menus, and tabs. Ensure that the navigation is easy and intuitive.</p>
<p><strong>Desktop/Web Apps</strong></p>
<p>Desktop wireframes should include more standard navigation features such as sidebars, top navigation bars, and dropdown menus. Desktop apps can also support more complicated navigational structures.</p>
<hr />
<h3 id="heading-summary">Summary</h3>
<p>Wireframes are important tools in UX design because they serve as blueprints for the layout, structure, and functionality of digital products. They come in three levels of detail: low-fidelity for early idea exploration, mid-fidelity for fine-tuning structure and functionality, and high-fidelity for extensive design and development assistance.</p>
<p>Wireframes are used to explain project requirements, simplify collaboration, and improve user experience by mapping out content layout, navigation, and interactions. They are especially useful in the early stages of design, allowing for quick iterations and feedback before moving on to more complex phases.</p>
<p>🙏 Thanks for reading my post, you are welcome to comment &amp; leave feedback 🙂🙂🙂</p>
<h3 id="heading-references">References</h3>
<ul>
<li><p><a target="_blank" href="https://balsamiq.com/learn/articles/what-are-wireframes/">https://balsamiq.com/learn/articles/what-are-wireframes</a></p>
</li>
<li><p><a target="_blank" href="https://www.webfx.com/blog/web-design/wireframing-benefits/">https://www.webfx.com/blog/web-design/wireframing-benefits</a></p>
</li>
<li><p><a target="_blank" href="https://linkupst.com/blog/6-important-benefits-of-wireframing">https://linkupst.com/blog/6-important-benefits-of-wireframing</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Forms with Zod Validation in Next.js]]></title><description><![CDATA[Forms are a common feature in web applications. They are used to collect user input and submit it to a server. However, it is important to validate form data before submitting it to ensure it is accurate and complete. We will show you how to create f...]]></description><link>https://blog.jobins.jp/forms-with-zod-validation-in-nextjs</link><guid isPermaLink="true">https://blog.jobins.jp/forms-with-zod-validation-in-nextjs</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[HTML5]]></category><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[zod]]></category><category><![CDATA[react-hook-form]]></category><category><![CDATA[form validation]]></category><dc:creator><![CDATA[Binay Maharjan]]></dc:creator><pubDate>Mon, 26 Aug 2024 01:28:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724484013546/a770eb42-6a27-4ecf-a8e6-a645b2fc0e29.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Forms are a common feature in web applications. They are used to collect user input and submit it to a server. However, it is important to validate form data before submitting it to ensure it is accurate and complete. We will show you how to create forms with validation in Next.js using Zod, React Hook Form, and Zod Resolver. For the UI parts of forms, we choose Shadcn which is not a component library but It's a collection of reusable components that you can copy and paste into your apps</p>
<p><strong>What is Zod?</strong></p>
<p>Zod is a powerful TypeScript validation library that provides a simple and intuitive way to define and validate data structures. It is designed to work seamlessly with TypeScript's type system, offering type safety and reducing the likelihood of runtime errors. <a target="_blank" href="https://zod.dev/?id=introduction">Learn more</a></p>
<p><strong>What is React Hook Form?</strong></p>
<p>React Hook Form is a library that simplifies form handling in React by providing custom hooks and utility functions. It offers features such as controlled inputs, validation, and form submission. <a target="_blank" href="https://react-hook-form.com/get-started">Learn more</a></p>
<p><strong>What is Zod Resolver?</strong></p>
<p>Zod Resolver is a utility library that integrates Zod schemas with React Hook Form, providing a seamless way to validate form data using Zod. <a target="_blank" href="https://react-hook-form.com/docs/useform#resolver">Learn more</a></p>
<h3 id="heading-how-to-create-a-form-with-validation-in-nextjs">How to Create a Form with Validation in Next.js</h3>
<ol>
<li><p>Create a new Next.js project or an existing Next.js project.<br /> <strong>Install these packages</strong></p>
<pre><code class="lang-javascript"> npm install react-hook-form <span class="hljs-comment">//Installing React Hook Form</span>
 npm install zod <span class="hljs-comment">// Installing zod package</span>
 npm install @hookform/resolvers <span class="hljs-comment">//Installing React Hook Form resolveInstall  Zod, React Hook Form, and Zod Resolver.</span>
</code></pre>
</li>
<li><p>Create a new component called basic-form.tsx which contains the form and inputs. We use <a target="_blank" href="https://ui.shadcn.com/docs/components/form"><strong>Shadcn</strong></a> ui for the form elements. To get work of this basic form we have to install shadcn first and then form, input, and button. Like<br /> <code>npm install shadcn init</code><br /> <code>npm install form input button</code></p>
<pre><code class="lang-javascript"> <span class="hljs-string">"use client"</span>
 <span class="hljs-keyword">import</span> {
   Form,
   FormControl,
   FormField,
   FormItem,
   FormLabel,
 } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/form"</span>
 <span class="hljs-keyword">import</span> { Input } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/input"</span>
 <span class="hljs-keyword">import</span> { Button } <span class="hljs-keyword">from</span> <span class="hljs-string">"@/components/ui/button"</span>

 <span class="hljs-keyword">export</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">BasicForm</span>(<span class="hljs-params"></span>) </span>{
   <span class="hljs-keyword">return</span> (
     <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Form</span> {<span class="hljs-attr">...form</span>}&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">onSubmit</span>=<span class="hljs-string">{form.handleSubmit(onSubmit)}</span> <span class="hljs-attr">className</span>=<span class="hljs-string">"w-2/3 space-y-6"</span>&gt;</span>
         <span class="hljs-tag">&lt;<span class="hljs-name">FormField</span>
           <span class="hljs-attr">control</span>=<span class="hljs-string">{form.control}</span>
           <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span>
           <span class="hljs-attr">render</span>=<span class="hljs-string">{({</span> <span class="hljs-attr">field</span> }) =&gt;</span> (
             <span class="hljs-tag">&lt;<span class="hljs-name">FormItem</span>&gt;</span>
               <span class="hljs-tag">&lt;<span class="hljs-name">FormLabel</span>&gt;</span>Name<span class="hljs-tag">&lt;/<span class="hljs-name">FormLabel</span>&gt;</span>
               <span class="hljs-tag">&lt;<span class="hljs-name">FormControl</span>&gt;</span>
                 <span class="hljs-tag">&lt;<span class="hljs-name">Input</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter name"</span> {<span class="hljs-attr">...field</span>} /&gt;</span>
               <span class="hljs-tag">&lt;/<span class="hljs-name">FormControl</span>&gt;</span>
             <span class="hljs-tag">&lt;/<span class="hljs-name">FormItem</span>&gt;</span>
           )}
         /&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">FormField</span>
               <span class="hljs-attr">control</span>=<span class="hljs-string">{form.control}</span>
               <span class="hljs-attr">name</span>=<span class="hljs-string">"email"</span>
               <span class="hljs-attr">render</span>=<span class="hljs-string">{({</span> <span class="hljs-attr">field</span> }) =&gt;</span> (
                 <span class="hljs-tag">&lt;<span class="hljs-name">FormItem</span>&gt;</span>
                   <span class="hljs-tag">&lt;<span class="hljs-name">FormLabel</span>&gt;</span>Email<span class="hljs-tag">&lt;/<span class="hljs-name">FormLabel</span>&gt;</span>
                   <span class="hljs-tag">&lt;<span class="hljs-name">FormControl</span>&gt;</span>
                     <span class="hljs-tag">&lt;<span class="hljs-name">Input</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter email"</span> {<span class="hljs-attr">...field</span>} /&gt;</span>
                   <span class="hljs-tag">&lt;/<span class="hljs-name">FormControl</span>&gt;</span>
                 <span class="hljs-tag">&lt;/<span class="hljs-name">FormItem</span>&gt;</span>
               )}
             /&gt;
          <span class="hljs-tag">&lt;<span class="hljs-name">FormField</span>
               <span class="hljs-attr">control</span>=<span class="hljs-string">{form.control}</span>
               <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span>
               <span class="hljs-attr">render</span>=<span class="hljs-string">{({</span> <span class="hljs-attr">field</span> }) =&gt;</span> (
                 <span class="hljs-tag">&lt;<span class="hljs-name">FormItem</span>&gt;</span>
                   <span class="hljs-tag">&lt;<span class="hljs-name">FormLabel</span>&gt;</span>Password<span class="hljs-tag">&lt;/<span class="hljs-name">FormLabel</span>&gt;</span>
                   <span class="hljs-tag">&lt;<span class="hljs-name">FormControl</span>&gt;</span>
                     <span class="hljs-tag">&lt;<span class="hljs-name">Input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter Password"</span> {<span class="hljs-attr">...field</span>} /&gt;</span>
                   <span class="hljs-tag">&lt;/<span class="hljs-name">FormControl</span>&gt;</span>
                 <span class="hljs-tag">&lt;/<span class="hljs-name">FormItem</span>&gt;</span>
               )}
             /&gt;
         <span class="hljs-tag">&lt;<span class="hljs-name">Button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span>&gt;</span>Submit<span class="hljs-tag">&lt;/<span class="hljs-name">Button</span>&gt;</span>
       <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
     <span class="hljs-tag">&lt;/<span class="hljs-name">Form</span>&gt;</span></span>
   )
 }
</code></pre>
</li>
<li><p>Define a Zod schema for the form data.</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">const</span> formSchema = z.object({
   <span class="hljs-attr">name</span>: z.string().min(<span class="hljs-number">2</span>),
   <span class="hljs-attr">email</span>: z.string().email(),
   <span class="hljs-attr">password</span>: z.string().min(<span class="hljs-number">6</span>),
 })
</code></pre>
</li>
<li><p>Integrate the Zod schema with React Hook Form using Zod Resolver.</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">const</span> form = useForm&lt;z.infer&lt;<span class="hljs-keyword">typeof</span> formSchema&gt;&gt;({
         <span class="hljs-attr">resolver</span>: zodResolver(formSchema),
         <span class="hljs-attr">defaultValues</span>: {
             <span class="hljs-attr">name</span>:<span class="hljs-string">''</span>,
             <span class="hljs-attr">email</span>:<span class="hljs-string">'example@gmail.com'</span>, <span class="hljs-comment">//we can give default values too</span>
             <span class="hljs-attr">password</span>:<span class="hljs-string">''</span>
         }
 })
</code></pre>
</li>
<li><p>Add error messages to the form to display validation errors.</p>
<pre><code class="lang-javascript"> <span class="hljs-keyword">const</span> formSchema = z.object({
   <span class="hljs-attr">name</span>: z.string().min(<span class="hljs-number">2</span>,{
     <span class="hljs-attr">message</span>: <span class="hljs-string">"Name must be at least 2 characters."</span>,
   }),
   <span class="hljs-attr">email</span>: z.string().email({
     <span class="hljs-attr">message</span>: <span class="hljs-string">"Please enter a valid email address"</span>
     }),
   <span class="hljs-attr">password</span>: z.string().min(<span class="hljs-number">6</span>,{
     <span class="hljs-attr">message</span>: <span class="hljs-string">"Password must be of 6 character"</span>
     }),
 })
</code></pre>
</li>
<li><p>Submit the form and handle the response.</p>
<pre><code class="lang-javascript">  <span class="hljs-keyword">const</span> onSubmit = <span class="hljs-function">(<span class="hljs-params">data: z.infer&lt;<span class="hljs-keyword">typeof</span> formSchema&gt;</span>) =&gt;</span> {
         <span class="hljs-built_in">console</span>.log(data)        
     };
</code></pre>
</li>
<li><p>Here is the working example</p>
<p> <a target="_blank" href="https://codesandbox.io/p/devbox/zod-form-validation-vh9h9w">https://codesandbox.io/p/devbox/zod-form-validation-vh9h9w</a></p>
</li>
</ol>
<iframe src="https://codesandbox.io/p/devbox/zod-form-validation-vh9h9w?embed=1&amp;file=%2Fapp%2Fpage.tsx" style="width:100%;height:500px;border:0;border-radius:4px;overflow:hidden" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"></iframe>

<h3 id="heading-conclusion">Conclusion</h3>
<p>By leveraging Zod, Next.js, React Hook Form, Zod Resolver, and Shadcn, you can create robust, efficient, and visually appealing forms in your Next.js applications. This powerful combination provides a solid foundation for building high-quality user experiences.Thank you.</p>
<h3 id="heading-references">References</h3>
<p><a target="_blank" href="https://react-hook-form.com/docs/useform#resolver">https://react-hook-form.com/docs/useform#resolver</a></p>
<p><a target="_blank" href="https://react-hook-form.com/get-started">https://react-hook-form.com/get-started</a></p>
<p><a target="_blank" href="https://zod.dev/?id=introduction">https://zod.dev/?id=introduction</a></p>
<p><a target="_blank" href="https://www.freecodecamp.org/news/react-form-validation-zod-react-hook-form/">https://www.freecodecamp.org/news/react-form-validation-zod-react-hook-form/</a></p>
<p><a target="_blank" href="https://dev.to/majiedo/using-zod-with-react-hook-form-using-typescript-1mgk">https://dev.to/majiedo/using-zod-with-react-hook-form-using-typescript-1mgk</a></p>
]]></content:encoded></item><item><title><![CDATA[Automating Proxmox and MAAS Integration for Your Home Lab]]></title><description><![CDATA[For those managing a home lab, integrating Proxmox VE with MAAS (Metal as a Service) can streamline the management of both physical and virtual resources. Automating this integration process can save time and reduce manual intervention. This guide co...]]></description><link>https://blog.jobins.jp/automating-proxmox-and-maas-integration-for-your-home-lab</link><guid isPermaLink="true">https://blog.jobins.jp/automating-proxmox-and-maas-integration-for-your-home-lab</guid><category><![CDATA[proxmox]]></category><category><![CDATA[maas]]></category><dc:creator><![CDATA[Bikram Tuladhar]]></dc:creator><pubDate>Mon, 26 Aug 2024 01:27:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1724003694559/a1f09117-b7eb-4591-8cfc-c43e04344b59.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For those managing a home lab, integrating Proxmox VE with MAAS (Metal as a Service) can streamline the management of both physical and virtual resources. Automating this integration process can save time and reduce manual intervention. This guide covers how to set up a seamless automation process using Python, Bash scripts, and systemd.</p>
<h4 id="heading-overview"><strong>Overview</strong></h4>
<p>The automation script setup includes:</p>
<ol>
<li><p>A Python Flask application that communicates with Proxmox and MAAS APIs.</p>
</li>
<li><p>A systemd service to run the Flask app as a background service.</p>
</li>
<li><p>A Bash script that triggers the integration process during MAAS commissioning.</p>
</li>
</ol>
<h4 id="heading-1-python-script-maas-proxmox-integrationpyhttpmaas-proxmox-integrationpy"><strong>1. Python Script:</strong> <a target="_blank" href="http://maas-proxmox-integration.py"><code>maas-proxmox-integration.py</code></a></h4>
<p>This Flask application updates MAAS with information about Proxmox VMs based on their MAC addresses. Here’s the complete code:</p>
<pre><code class="lang-python"><span class="hljs-comment">#!/usr/bin/env python3</span>

<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> Flask, request, jsonify
<span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> warnings
<span class="hljs-keyword">from</span> urllib3.exceptions <span class="hljs-keyword">import</span> InsecureRequestWarning
<span class="hljs-keyword">from</span> oauthlib.oauth1 <span class="hljs-keyword">import</span> SIGNATURE_PLAINTEXT
<span class="hljs-keyword">from</span> requests_oauthlib <span class="hljs-keyword">import</span> OAuth1Session
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> threading

<span class="hljs-comment"># Suppress InsecureRequestWarning</span>
warnings.filterwarnings(<span class="hljs-string">'ignore'</span>, category=InsecureRequestWarning)

<span class="hljs-comment"># Proxmox API credentials</span>
PROXMOX_HOST = <span class="hljs-string">"&lt;proxmox_ip&gt;"</span>
USER = <span class="hljs-string">"user@realm"</span>
TOKENID = <span class="hljs-string">"token_id"</span>
SECRET = <span class="hljs-string">"secret"</span>

<span class="hljs-comment"># MAAS API credentials</span>
MAAS_API_KEY = <span class="hljs-string">"maas api key"</span>
MAAS_API_URL = <span class="hljs-string">"http://&lt;maas_ip&gt;:5240/MAAS/api/2.0"</span>
CONSUMER_KEY, CONSUMER_TOKEN, MAAS_SECRET = MAAS_API_KEY.split(<span class="hljs-string">":"</span>)

<span class="hljs-comment"># Create OAuth1Session for MAAS</span>
maas = OAuth1Session(
    CONSUMER_KEY, 
    resource_owner_key=CONSUMER_TOKEN, 
    resource_owner_secret=MAAS_SECRET, 
    signature_method=SIGNATURE_PLAINTEXT
)

<span class="hljs-comment"># Proxmox API headers</span>
proxmox_headers = {
    <span class="hljs-string">'Authorization'</span>: <span class="hljs-string">f'PVEAPIToken=<span class="hljs-subst">{USER}</span>!<span class="hljs-subst">{TOKENID}</span>=<span class="hljs-subst">{SECRET}</span>'</span>
}

app = Flask(__name__)

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_proxmox_nodes</span>():</span>
    <span class="hljs-keyword">try</span>:
        response = requests.get(<span class="hljs-string">f'https://<span class="hljs-subst">{PROXMOX_HOST}</span>:8006/api2/json/nodes'</span>, headers=proxmox_headers, verify=<span class="hljs-literal">False</span>)
        response.raise_for_status()
        <span class="hljs-keyword">return</span> response.json().get(<span class="hljs-string">'data'</span>, [])
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f'Error fetching Proxmox nodes: <span class="hljs-subst">{e}</span>'</span>)
        <span class="hljs-keyword">return</span> []

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_proxmox_vms</span>(<span class="hljs-params">node</span>):</span>
    <span class="hljs-keyword">try</span>:
        response = requests.get(<span class="hljs-string">f'https://<span class="hljs-subst">{PROXMOX_HOST}</span>:8006/api2/json/nodes/<span class="hljs-subst">{node}</span>/qemu'</span>, headers=proxmox_headers, verify=<span class="hljs-literal">False</span>)
        response.raise_for_status()
        <span class="hljs-keyword">return</span> response.json().get(<span class="hljs-string">'data'</span>, [])
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f'Error fetching VMs for node <span class="hljs-subst">{node}</span>: <span class="hljs-subst">{e}</span>'</span>)
        <span class="hljs-keyword">return</span> []

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_proxmox_vm_config</span>(<span class="hljs-params">node, vm_id</span>):</span>
    <span class="hljs-keyword">try</span>:
        response = requests.get(<span class="hljs-string">f'https://<span class="hljs-subst">{PROXMOX_HOST}</span>:8006/api2/json/nodes/<span class="hljs-subst">{node}</span>/qemu/<span class="hljs-subst">{vm_id}</span>/config'</span>, headers=proxmox_headers, verify=<span class="hljs-literal">False</span>)
        response.raise_for_status()
        <span class="hljs-keyword">return</span> response.json().get(<span class="hljs-string">'data'</span>, {})
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f'Error fetching VM config for VM <span class="hljs-subst">{vm_id}</span>: <span class="hljs-subst">{e}</span>'</span>)
        <span class="hljs-keyword">return</span> {}

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">find_vm_by_mac</span>(<span class="hljs-params">mac_address</span>):</span>
    nodes = get_proxmox_nodes()
    <span class="hljs-keyword">for</span> node <span class="hljs-keyword">in</span> nodes:
        node_id = node[<span class="hljs-string">'node'</span>]
        vms = get_proxmox_vms(node_id)
        <span class="hljs-keyword">for</span> vm <span class="hljs-keyword">in</span> vms:
            vm_id = vm[<span class="hljs-string">'vmid'</span>]
            vm_name = vm[<span class="hljs-string">'name'</span>]
            config = get_proxmox_vm_config(node_id, vm_id)
            <span class="hljs-keyword">for</span> key, value <span class="hljs-keyword">in</span> config.items():
                <span class="hljs-keyword">if</span> key.startswith(<span class="hljs-string">'net'</span>):
                    <span class="hljs-keyword">if</span> mac_address.upper() <span class="hljs-keyword">in</span> value:
                        <span class="hljs-keyword">return</span> node_id, vm_id, vm_name
    <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>, <span class="hljs-literal">None</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_maas_machine_by_mac</span>(<span class="hljs-params">mac_address</span>):</span>
    <span class="hljs-keyword">try</span>:
        response = maas.get(<span class="hljs-string">f"<span class="hljs-subst">{MAAS_API_URL}</span>/machines/"</span>, params={<span class="hljs-string">'mac_address'</span>: mac_address,<span class="hljs-string">'status'</span>: <span class="hljs-string">'new'</span>})
        response.raise_for_status()
        machines = response.json()
        <span class="hljs-keyword">if</span> machines:
            <span class="hljs-keyword">return</span> machines[<span class="hljs-number">0</span>]
        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f'Error fetching MAAS machine with MAC address <span class="hljs-subst">{mac_address}</span>: <span class="hljs-subst">{e}</span>'</span>)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update_maas_machine</span>(<span class="hljs-params">machine_id, hostname, node_id, vm_id, username, password</span>):</span>
    <span class="hljs-keyword">try</span>:
        data = {
            <span class="hljs-string">"hostname"</span>: hostname,
            <span class="hljs-string">"power_type"</span>: <span class="hljs-string">"proxmox"</span>,
            <span class="hljs-string">"power_parameters_power_address"</span>: PROXMOX_HOST,
            <span class="hljs-string">"power_parameters_power_vm_name"</span>: vm_id,
            <span class="hljs-string">"power_parameters_power_user"</span>: username,
            <span class="hljs-string">"power_parameters_power_pass"</span>: password,
            <span class="hljs-string">"power_parameters_power_verify_ssl"</span>: <span class="hljs-string">"n"</span>
        }
        response = maas.put(<span class="hljs-string">f"<span class="hljs-subst">{MAAS_API_URL}</span>/machines/<span class="hljs-subst">{machine_id}</span>/"</span>, data=data)
        response.raise_for_status()
        <span class="hljs-keyword">return</span> response.json()
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f"Error updating MAAS machine <span class="hljs-subst">{machine_id}</span>: <span class="hljs-subst">{e}</span>"</span>)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">commission_maas_machine</span>(<span class="hljs-params">machine_id</span>):</span>
    <span class="hljs-keyword">try</span>:
        response = maas.post(<span class="hljs-string">f"<span class="hljs-subst">{MAAS_API_URL}</span>/machines/<span class="hljs-subst">{machine_id}</span>/op-commission"</span>)
        response.raise_for_status()
        <span class="hljs-keyword">return</span> response.json()
    <span class="hljs-keyword">except</span> requests.exceptions.RequestException <span class="hljs-keyword">as</span> e:
        print(<span class="hljs-string">f"Error commissioning MAAS machine <span class="hljs-subst">{machine_id}</span>: <span class="hljs-subst">{e}</span>"</span>)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update_maas_with_proxmox_info_background</span>(<span class="hljs-params">mac_address</span>):</span>
    mac_address = mac_address.lower()
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> mac_address:
        <span class="hljs-keyword">return</span> jsonify({<span class="hljs-string">"error"</span>: <span class="hljs-string">"MAC address is required"</span>}), <span class="hljs-number">400</span>

    node_id, vm_id, vm_name  = find_vm_by_mac(mac_address)
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> vm_id:
        print(<span class="hljs-string">f'Error: No VM found with MAC address <span class="hljs-subst">{mac_address}</span>'</span>)
        <span class="hljs-keyword">return</span>

    start_time = time.time()
    retry_interval = <span class="hljs-number">5</span>

    <span class="hljs-keyword">while</span> <span class="hljs-literal">True</span>:
        maas_machine = get_maas_machine_by_mac(mac_address)
        <span class="hljs-keyword">if</span> maas_machine:
            <span class="hljs-keyword">break</span>
        <span class="hljs-keyword">if</span> time.time() - start_time &gt; <span class="hljs-number">60</span>:
            print(<span class="hljs-string">f'Error: No MAAS machine found with MAC address <span class="hljs-subst">{mac_address}</span> after 1 minute'</span>)
            <span class="hljs-keyword">return</span>
        time.sleep(retry_interval)

    machine_id = maas_machine[<span class="hljs-string">'system_id'</span>]
    <span class="hljs-comment"># wait for initial machine enlisting to finish</span>
    time.sleep(<span class="hljs-number">60</span>)
    update_result = update_maas_machine(
        machine_id=machine_id,
        hostname=vm_name,
        node_id=node_id,
        vm_id=vm_id,
        username=<span class="hljs-string">"user@relam"</span>,
        password=<span class="hljs-string">"proxmox password"</span>,
    )

    <span class="hljs-keyword">if</span> update_result:
        commission_result = commission_maas_machine(machine_id)
        <span class="hljs-keyword">if</span> commission_result:
            print(<span class="hljs-string">f'MAAS machine <span class="hljs-subst">{machine_id}</span> updated and deployed successfully.'</span>)
        <span class="hljs-keyword">else</span>:
            print(<span class="hljs-string">f'Failed to deploy MAAS machine <span class="hljs-subst">{machine_id}</span>'</span>)
    <span class="hljs-keyword">else</span>:
        print(<span class="hljs-string">f'Failed to update MAAS machine <span class="hljs-subst">{machine_id}</span>'</span>)

<span class="hljs-meta">@app.route('/update_maas', methods=['GET'])</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update_maas_with_proxmox_info</span>():</span>
    mac_address = request.args.get(<span class="hljs-string">'mac_address'</span>)
    <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> mac_address:
        <span class="hljs-keyword">return</span> jsonify({<span class="hljs-string">"error"</span>: <span class="hljs-string">"MAC address is required"</span>}), <span class="hljs-number">400</span>

    thread = threading.Thread(target=update_maas_with_proxmox_info_background, args=(mac_address,))
    thread.start()

    <span class="hljs-keyword">return</span> jsonify({<span class="hljs-string">"message"</span>: <span class="hljs-string">"Update process started in the background."</span>})

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    app.run(host=<span class="hljs-string">'0.0.0.0'</span>, port=<span class="hljs-number">5000</span>, debug=<span class="hljs-literal">True</span>)
</code></pre>
<h4 id="heading-2-systemd-service-maas-proxmox-integrationservice"><strong>2. Systemd Service:</strong> <code>maas-proxmox-integration.service</code></h4>
<p>To run the Python script as a service, create a systemd service file:</p>
<pre><code class="lang-ini"><span class="hljs-section">[Unit]</span>
<span class="hljs-attr">Description</span>=MAAS Proxmox Integration Service

<span class="hljs-section">[Service]</span>
<span class="hljs-attr">ExecStart</span>=/usr/bin/python3 path/to/maas-proxmox-integration.py
<span class="hljs-attr">WorkingDirectory</span>=path/to
<span class="hljs-attr">Restart</span>=always
<span class="hljs-attr">User</span>=example-username
<span class="hljs-attr">Group</span>=example-group
<span class="hljs-attr">StandardOutput</span>=append:/var/log/maas-proxmox-integration.log
<span class="hljs-attr">StandardError</span>=append:/var/log/maas-proxmox-integration.log

<span class="hljs-section">[Install]</span>
<span class="hljs-attr">WantedBy</span>=multi-user.target
</code></pre>
<p>Reload systemd, start the service, and enable it to start on boot:</p>
<pre><code class="lang-bash">sudo systemctl daemon-reload
sudo systemctl start maas-proxmox-integration.service
sudo systemctl <span class="hljs-built_in">enable</span> maas-proxmox-integration.service
</code></pre>
<h4 id="heading-3-maas-commissioning-script"><strong>3. MAAS Commissioning Script</strong></h4>
<p>This Bash script triggers the integration process during MAAS commissioning:</p>
<pre><code class="lang-bash"><span class="hljs-meta">#!/usr/bin/env bash</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment"># proxmox-maas-integration - Trigger Proxmox and MAAS integration</span>
<span class="hljs-comment">#</span>
<span class="hljs-comment"># --- Start MAAS 1.0 script metadata ---</span>
<span class="hljs-comment"># name: proxmox-maas-integration</span>
<span class="hljs-comment"># title: Proxmox and MAAS Integration</span>
<span class="hljs-comment"># description: Triggers Proxmox and MAAS integration process</span>
<span class="hljs-comment"># script_type: commissioning</span>
<span class="hljs-comment"># recommission: True</span>
<span class="hljs-comment"># timeout: 00:05:00</span>
<span class="hljs-comment"># packages:</span>
<span class="hljs-comment">#   apt:</span>
<span class="hljs-comment">#     - curl</span>
<span class="hljs-comment"># --- End MAAS 1.0 script metadata ---</span>

<span class="hljs-comment"># Retrieve the MAC address of the primary network interface</span>
mac_address=$(ip link show | grep -Eo <span class="hljs-string">'link/ether [^ ]+'</span> | awk <span class="hljs-string">'{print $2}'</span>)

<span class="hljs-comment"># Check if a MAC address was found</span>
<span class="hljs-keyword">if</span> [ -z <span class="hljs-string">"<span class="hljs-variable">$mac_address</span>"</span> ]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"No MAC address found. Exiting."</span>
    <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">fi</span>

<span class="hljs-comment"># URL of the Flask service</span>
FLASK_SERVICE_URL=<span class="hljs-string">"http://&lt;maas-ip-address/flash-vm-ip&gt;:5000/update_maas"</span>

<span class="hljs-comment"># Trigger the integration process by calling the Flask endpoint</span>
response=$(curl -s -o /dev/null -w <span class="hljs-string">"%{http_code}"</span> <span class="hljs-string">"<span class="hljs-variable">${FLASK_SERVICE_URL}</span>?mac_address=<span class="hljs-variable">${mac_address}</span>"</span>)

<span class="hljs-comment"># Check the HTTP response code</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">$response</span>"</span> -eq 200 ]; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"Integration process triggered successfully."</span>
<span class="hljs-keyword">else</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"Failed to trigger integration process. HTTP response code: <span class="hljs-variable">$response</span>"</span>
    <span class="hljs-built_in">exit</span> 1
<span class="hljs-keyword">fi</span>
</code></pre>
<h4 id="heading-4-convert-custom-commissioning-script-to-default-via-sql"><strong>4. Convert custom commissioning script to default via sql</strong></h4>
<p>use following sql script to update script status to default true. By doing this our custom script will run at node enlisting aka first commissioning.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">UPDATE</span> maasserver_script 
sqSET <span class="hljs-string">"default"</span>=<span class="hljs-literal">true</span> 
<span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">name</span> = <span class="hljs-string">'proxmox-maas-integration'</span>
</code></pre>
<h4 id="heading-conclusion"><strong>Conclusion</strong></h4>
<p>With these scripts and configurations, your home lab’s Proxmox and MAAS integration will be automated efficiently. Adjust the script parameters, URLs, and credentials as needed to fit your environment. This setup ensures a smoother commissioning process and better management of your virtual and physical resources. Happy automating!</p>
]]></content:encoded></item></channel></rss>