<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: jun</title>
    <description>The latest articles on Forem by jun (@junlow).</description>
    <link>https://forem.com/junlow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F245773%2Fcac40936-d729-4bcf-949a-0a3fd9610ad3.jpg</url>
      <title>Forem: jun</title>
      <link>https://forem.com/junlow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/junlow"/>
    <language>en</language>
    <item>
      <title>Stop Shipping Boring AI-Generated UIs</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Sun, 17 Aug 2025 12:33:41 +0000</pubDate>
      <link>https://forem.com/junlow/stop-shipping-boring-ai-generated-uis-4ck3</link>
      <guid>https://forem.com/junlow/stop-shipping-boring-ai-generated-uis-4ck3</guid>
      <description>&lt;p&gt;If you’ve been vibing with AI coding tools like bolt.new, altan.ai, or Lovable, this article is for you. It’s about taking your AI-generated UI from decent to &lt;em&gt;damn, that looks good&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been experimenting with these AI tools for a while now, and honestly the UIs they generate are honestly pretty decent! You get working interactions, clean layouts, and some visual polish. But let’s be real: what AI gives you out of the box still needs a little love. Most of them lean heavily on &lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;shadcn/ui&lt;/a&gt; as the foundation — which is fine, but kind of obvious.&lt;/p&gt;

&lt;p&gt;You don’t have to settle for that “AI starter pack” look, there are plenty of libraries you can use, and I’ll show you some of my favourites below. Just copy-paste a component into your project, tweak the colours to match your brand, and you’ll save hours while making your UI actually stand out!&lt;/p&gt;

&lt;h3&gt;
  
  
  1.&lt;a href="https://originui.com/" rel="noopener noreferrer"&gt;Origin UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4y2zmxhtvnyh617twfqp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4y2zmxhtvnyh617twfqp.png" alt="Image Origin UI" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.&lt;a href="https://skiper-ui.com/" rel="noopener noreferrer"&gt;skiper/ui&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7topjyip2jx1e42yhvo6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7topjyip2jx1e42yhvo6.png" alt="Image skiper/ui" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.&lt;a href="https://www.kibo-ui.com/" rel="noopener noreferrer"&gt;Kibo UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcmcd5079qglauc4dfgs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpcmcd5079qglauc4dfgs.png" alt="Image Kibo UI" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.&lt;a href="https://www.shsfui.com/" rel="noopener noreferrer"&gt;SHSF UI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkrz5p37ml4aohdlf6zn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnkrz5p37ml4aohdlf6zn.png" alt="Image SHSF UI" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5.&lt;a href="https://blocks.mvp-subha.me/" rel="noopener noreferrer"&gt;Mvpblocks&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz8pmhh74nvzrgojqakl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuz8pmhh74nvzrgojqakl.png" alt="Image Mvpblocks" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="https://tweakcn.com/" rel="noopener noreferrer"&gt;tweakcn&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vft8zt45s4s833cgy8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vft8zt45s4s833cgy8v.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;&lt;em&gt;Pro tip&lt;/em&gt;&lt;/strong&gt; for adding some personality: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://motion.dev/" rel="noopener noreferrer"&gt;Motion (prev Framer Motion)&lt;/a&gt; - Smooth animations and micro-interactions&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.react-spring.dev/" rel="noopener noreferrer"&gt;React Spring&lt;/a&gt; - Physics-based animations that feel natural &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://lottiereact.com/" rel="noopener noreferrer"&gt;Lottie React&lt;/a&gt; - Beautiful animated illustrations and icons &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also mix and match these libraries! Use &lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;shadcn/ui&lt;/a&gt; as your foundation, then layer on the missing pieces. At the end of the day, AI can give you a solid foundation. But the magic happens when you add your own creative touch 😉&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>ui</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The React Performance Rabbit Hole I Fell Into (And How I Climbed Out)</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Tue, 04 Mar 2025 07:19:29 +0000</pubDate>
      <link>https://forem.com/junlow/the-react-performance-rabbit-hole-i-fell-into-and-how-i-climbed-out-4k6g</link>
      <guid>https://forem.com/junlow/the-react-performance-rabbit-hole-i-fell-into-and-how-i-climbed-out-4k6g</guid>
      <description>&lt;p&gt;Recently, while working on a project with React and Next.js, I encountered several performance challenges that taught me valuable lessons I'm excited to share with you. This post details my experiences and the solutions I discovered, hoping it will serve as both inspiration and practical guidance for your own React development journey. 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  Better Performance = Better User Experience
&lt;/h3&gt;

&lt;p&gt;Let's be real - nobody has time for slow apps. Not me, not you, and definitely not our users. People want to get things done fast.&lt;/p&gt;

&lt;p&gt;Strong performance builds trust in your app and brand. It shows you respect your users' time. And in 2025, with attention spans shorter than ever, performance isn't just nice to have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv787156fa0g685dk2umf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv787156fa0g685dk2umf.gif" alt="gif" width="480" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Silent Killer: Unnecessary Re-renders
&lt;/h3&gt;

&lt;p&gt;In my project, I discovered React components were re-rendering 3-4x more often than needed. These silent re-render cycles are particularly insidious because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They don't crash your app, making them easy to overlook&lt;/li&gt;
&lt;li&gt;Performance degradation compounds gradually as features get added&lt;/li&gt;
&lt;li&gt;Mobile users pay double with slower processors + re-render penalties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes this especially tricky is React's "&lt;em&gt;render everywhere just in case&lt;/em&gt;" philosophy. While great for correctness, it means components often update when nothing visually changes. &lt;/p&gt;

&lt;h3&gt;
  
  
  Here's how I fought back
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Identifying Performance Bottlenecks
&lt;/h4&gt;

&lt;p&gt;I started by analyzing runtime performance with Chrome DevTools. The Performance panel became my best friend during optimization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for components that render frequently&lt;/li&gt;
&lt;li&gt;Identify render cascades (when one component update triggers a waterfall of child updates)&lt;/li&gt;
&lt;li&gt;Spot components with abnormally long render times&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Embracing Memoization Strategically
&lt;/h4&gt;

&lt;p&gt;React gives us powerful tools to avoid unnecessary work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;memo&lt;/code&gt; prevented my complex UI components from re-rendering when their props hadn't changed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useMemo&lt;/code&gt; helped me cache expensive calculations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useCallback&lt;/code&gt; kept function references on every render, particularly important for optimising callbacks passed to child components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memoization isn't free - I found that applying these tools thoughtfully (rather than everywhere) gave me the best results. The upcoming React Compiler is getting better at handling simple optimizations automatically, complex components still benefit from manual memoization.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Function Definitions Matter More Than You Think
&lt;/h4&gt;

&lt;p&gt;Something I didn't realize at first: defining functions inside your render scope creates new functions on every render, triggering re-renders in child components even with memo.&lt;br&gt;
Moving these definitions outside the component or wrapping them with &lt;code&gt;useCallback&lt;/code&gt; made a noticeable difference.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Leveraging DevTools
&lt;/h4&gt;

&lt;p&gt;Rather than guessing where performance issues might be, I learned to rely on Chrome DevTools' Performance panel to identify actual bottlenecks. Here are some other tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Use the Profiler tab in &lt;a href="https://react.dev/learn/react-developer-tools" rel="noopener noreferrer"&gt;React DevTools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Start a Lighthouse audit &lt;a href="https://developer.chrome.com/docs/lighthouse/overview/#devtools" rel="noopener noreferrer"&gt;in the Chrome DevTools&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Track rerenders of specific components with &lt;a href="https://github.com/welldone-software/why-did-you-render" rel="noopener noreferrer"&gt;Why did you render?&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv11qod8mxw8agc66sbvi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv11qod8mxw8agc66sbvi.gif" alt="gif-wwf" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Working For You?
&lt;/h3&gt;

&lt;p&gt;I'm curious - have you hit similar walls with React performance? Have you tried any of these techniques? Let me know in the comments ✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>react</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Discovering lesser-known features of Tailwind CSS</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Tue, 25 Jun 2024 03:08:04 +0000</pubDate>
      <link>https://forem.com/junlow/discovering-lesser-known-features-of-tailwind-css-308c</link>
      <guid>https://forem.com/junlow/discovering-lesser-known-features-of-tailwind-css-308c</guid>
      <description>&lt;p&gt;Hey everyone, hope you're all doing great! Today, I want to share some hidden gems in Tailwind CSS that can make your web development smoother and more fun. I've kept it simple and beginner-friendly, so let's jump right in!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv39vt5z14kefn3fqgnjz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv39vt5z14kefn3fqgnjz.gif" alt="gif" width="480" height="344"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Aspect Ratio Utility
&lt;/h3&gt;

&lt;p&gt;Keeping your images and videos responsive with consistent aspect ratios is easy with Tailwind CSS. Just use classes like &lt;code&gt;aspect-square&lt;/code&gt; and &lt;code&gt;aspect-video&lt;/code&gt;, and you're good to go on any screen size. You can also use variant modifiers to target different screen sizes and modes. For example, use &lt;code&gt;md:aspect-square&lt;/code&gt; to apply the aspect-square utility only at medium screen sizes and above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full aspect-video md:aspect-square"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.youtube.com/..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preflight
&lt;/h3&gt;

&lt;p&gt;Another point to take note that Tailwind CSS comes with Preflight, a built-in CSS reset. Just include &lt;code&gt;@tailwind base&lt;/code&gt; in your CSS, and it automatically injects these styles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Preflight will be injected here */&lt;/span&gt;

&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preflight is a great way to avoid those annoying browser inconsistencies, like default margins on headings and paragraphs.&lt;/p&gt;

&lt;h3&gt;
  
  
  File input buttons
&lt;/h3&gt;

&lt;p&gt;You can easily style file input buttons using the &lt;code&gt;:file&lt;/code&gt; modifier&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yxszrlu0908kcqg64hd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yxszrlu0908kcqg64hd.png" alt="file input image example" width="800" height="373"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sr-only"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Choose profile photo&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"file"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block w-full text-sm text-slate-500
      file:mr-4 file:py-2 file:px-4
      file:rounded-full file:border-0
      file:text-sm file:font-semibold
      file:bg-blue-50 file:text-blue-700
      hover:file:bg-violet-100
    "&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change radio/checkbox colors
&lt;/h3&gt;

&lt;p&gt;Want to customize the color of checkboxes and radio buttons? Use the &lt;code&gt;accent-*&lt;/code&gt; utilities to override the default browser colors. One ofo the feature I used most of the time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxecy0owxy8caeyrlptle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxecy0owxy8caeyrlptle.png" alt="change radio example" width="800" height="368"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;checked&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Browser default
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"accent-violet-500"&lt;/span&gt; &lt;span class="na"&gt;checked&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; Customized color
&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Transition Utilities
&lt;/h3&gt;

&lt;p&gt;Adding transitions to UI elements is super easy with Tailwind CSS. Especially when I work on hover/active states, Transitions can really improve the user experience by making your app feel smoother and more responsive.&lt;/p&gt;

&lt;h4&gt;
  
  
  With transition
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhsk7tel1iyc0iq6v9ba.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhsk7tel1iyc0iq6v9ba.gif" alt="button with transition example" width="876" height="506"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;" bg-indigo-100 hover:bg-indigo-200 text-indigo-500 transition delay-150 duration-300 ease-in-out rounded py-2 px-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save Changes&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Without transition
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw62mkvucmlph9mq3nsy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw62mkvucmlph9mq3nsy.gif" alt="button without transition example" width="800" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;" bg-indigo-100 hover:bg-indigo-200 text-indigo-500 rounded py-2 px-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save Changes&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Truncating multi-line text
&lt;/h3&gt;

&lt;p&gt;Another feature I like to use is the &lt;code&gt;line-clamp-*&lt;/code&gt; utilities to truncate a block of text after a specific number of lines without writing CSS. Furthermore, you can also remove the line clamp by using &lt;code&gt;line-clamp-none&lt;/code&gt;. For instance, use &lt;code&gt;lg:line-clamp-none&lt;/code&gt; to undo the previously applied line clamp on larger screens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u9ulsaas667t4uh1u1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u9ulsaas667t4uh1u1s.png" alt="Truncating example" width="788" height="524"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"line-clamp-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reaaally long text here to truncate 3 lines above. On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By exploring these features, you can make your development process easier and your web applications look awesome. Give these a try and see how they can improve your Tailwind CSS projects! &lt;/p&gt;

&lt;p&gt;That's it for now. Thanks for reading! 🪄&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tailwindcss</category>
      <category>beginners</category>
      <category>css</category>
    </item>
    <item>
      <title>AWS Certified Cloud Practitioner: My Journey and Tips</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Wed, 28 Feb 2024 04:14:12 +0000</pubDate>
      <link>https://forem.com/junlow/aws-certified-cloud-practitioner-my-journey-and-tips-3p6i</link>
      <guid>https://forem.com/junlow/aws-certified-cloud-practitioner-my-journey-and-tips-3p6i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvw5oyvvfek4gf8530af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frvw5oyvvfek4gf8530af.png" alt="jun's badge" width="800" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my professional journey, I've always been curious and developing myself to constantly try to expand my skill set. Recently, I passed the AWS Certified Cloud Practitioner exam on my first try. This accomplishment has inspired me to share my journey with you, in the hopes that it will serve as both inspiration and guidance for your own AWS journey. To deepen my knowledge and familiarity with the world of AWS, I decided to join the &lt;a href="https://pages.awscloud.com/cloudup-for-her-cloud-practitioner.html" rel="noopener noreferrer"&gt;AWS CloudUp for her program&lt;/a&gt;, a fantastic community-based learning pathway for women worldwide with helps from AWS mentors. 👯‍♀️&lt;/p&gt;

&lt;h2&gt;
  
  
  My preparation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exam Guide&lt;/strong&gt;: I downloaded the &lt;a href="https://d1.awsstatic.com/training-and-certification/docs-cloud-practitioner/AWS-Certified-Cloud-Practitioner_Exam-Guide.pdf" rel="noopener noreferrer"&gt;exam guide&lt;/a&gt; provided by AWS, which offered valuable insights into the exam content and areas to focus my studies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Skill Builder&lt;/strong&gt;: I completed the free &lt;a href="https://skillbuilder.aws/" rel="noopener noreferrer"&gt;AWS Skill Builder&lt;/a&gt; course and used it to practice with Official Practice Question Sets and Exam Prep Courses. I also used &lt;a href="https://www.notion.so/" rel="noopener noreferrer"&gt;Notion&lt;/a&gt; for note-taking, especially for the mistakes I made on the questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS Cloud Practitioner Essentials&lt;/strong&gt;: I highly recommend this &lt;a href="https://explore.skillbuilder.aws/learn/course/external/view/elearning/134/aws-cloud-practitioner-essentials" rel="noopener noreferrer"&gt;course&lt;/a&gt;, which covers AWS Cloud concepts, services, security, architecture, pricing, and support through videos, demonstrations, and knowledge checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labs&lt;/strong&gt;: With the CloudUp for her program, I participated in workshop labs to get hands-on practices and attended Q&amp;amp;A sessions. I also signed up for a &lt;a href="https://aws.amazon.com/free/free-tier/?p=ft&amp;amp;z=subnav&amp;amp;loc=2" rel="noopener noreferrer"&gt;free-tier account&lt;/a&gt; to practice on AWS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: As a developer, I've always found &lt;a href="https://docs.aws.amazon.com/index.html" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; to be incredibly helpful. I used &lt;a href="https://aws.amazon.com/premiumsupport/plans/?cp=sec&amp;amp;sec=prep" rel="noopener noreferrer"&gt;Compare AWS Support Plans&lt;/a&gt; and &lt;a href="https://aws.amazon.com/faqs/" rel="noopener noreferrer"&gt;AWS FAQs&lt;/a&gt; to solidify my knowledge from the Skill Builder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Question Sets&lt;/strong&gt;: Apart from the official sets, I tried &lt;a href="https://www.linkedin.com/learning/practice-exam-1-for-aws-cloud-practitioner-clf-c02" rel="noopener noreferrer"&gt;LinkedIn Learning&lt;/a&gt; and &lt;a href="https://portal.tutorialsdojo.com/courses/free-aws-certified-cloud-practitioner-practice-exams-sampler/" rel="noopener noreferrer"&gt;Tutorial Dojo&lt;/a&gt; (both free) and found LinkedIn to be more challenging than the actual exam.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Exam Experience
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F647sa0d915ug0bu0dvnd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F647sa0d915ug0bu0dvnd.gif" alt="gif exam" width="343" height="253"&gt;&lt;/a&gt;&lt;br&gt;
Scheduling the online exam was a breeze, with plenty of date and time slots available, including weekends. I scheduled my exam only a day before I felt I was ready to take the exam. &lt;/p&gt;

&lt;p&gt;One thing I learned the hard way was the importance of checking in at least 30 minutes before the exam. After taking the pictures of my room and identity, I queued at  least 10 minutes with other candidates for the proctor to check my exam room and identity. I only have my laptop on my desk, and no watch on my hands. Throughout the exam, I could flag questions for review or jot down comments, but toilet breaks or stand up weren't allowed, so I stayed seated the whole time. After the review stage, you’re given a survey for your exam experience. &lt;/p&gt;

&lt;p&gt;Finally, with a mixture of nerves and excitement, I clicked "submit" and was overjoyed to see a "PASS" result. The next day, I received my exam score and a badge in my Credly account.&lt;/p&gt;

&lt;p&gt;While AWS keeps exam content confidential, they do provide insights into areas where you can improve. So, if you're considering pursuing your Cloud Practitioner Certification, my advice is simple: go for it! Remember, even the smallest achievements can lead to something truly remarkable💪&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>cloudpractitioner</category>
      <category>devops</category>
    </item>
    <item>
      <title>Angular v17 Hydration Explained! 💻💦</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Fri, 24 Nov 2023 03:52:39 +0000</pubDate>
      <link>https://forem.com/junlow/key-facts-of-angular-v17-hydration-56e</link>
      <guid>https://forem.com/junlow/key-facts-of-angular-v17-hydration-56e</guid>
      <description>&lt;p&gt;Ever wished your Angular app could load faster, ace SEO, and dodge UI glitches? 🚀🪄 That's where Angular Hydration swoops in! Picture it like sending your app for a spa day – all that server-side goodness now chilling on the client's turf, saving you from redoing DOM nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5wop5drxxzemwha5vai.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl5wop5drxxzemwha5vai.gif" alt="puppy is doing spa" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hydration?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Restores server-rendered apps on the client.&lt;/li&gt;
&lt;li&gt;Reusing the DOM, preserving state, and transferring data from the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why is it Important?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Boosts Performance: Reusing DOM nodes speeds up loading.&lt;/li&gt;
&lt;li&gt;Enhances Core Web Vitals: Improves FID, LCP, and CLS.&lt;/li&gt;
&lt;li&gt;Improves SEO: Ensures search engines get fully rendered content.&lt;/li&gt;
&lt;li&gt;Prevents UI Issues: Avoids flicker and layout shift.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enabling Hydration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Server-Side Rendering (SSR): Requires an SSR application.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;provideClientHydration&lt;/code&gt;: In the main app component/module.&lt;/li&gt;
&lt;li&gt;Bootstrapping: Include in both client and server providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Constraints
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DOM Structure of server and client must match.&lt;/li&gt;
&lt;li&gt;No Direct DOM Manipulation to keep things smooth.&lt;/li&gt;
&lt;li&gt;Mismatches in DOM structure can cause errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Handling Errors
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ngSkipHydration&lt;/code&gt;: Temporarily bypass issues caused by DOM differences or direct manipulation.&lt;/li&gt;
&lt;li&gt;Skipping Hydration for Components&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Skipping Hydration for Components
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ngSkipHydration&lt;/code&gt; for components incompatible with hydration.&lt;/li&gt;
&lt;li&gt;Useful for components with DOM manipulation issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Internationalization (i18n): No support yet.&lt;/li&gt;
&lt;li&gt;Third-Party Libraries: Some may need &lt;code&gt;ngSkipHydration&lt;/code&gt; for compatibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there you have it – a quick rundown of the essential facts to consider about Angular Hydration. Have you played around with Hydration yet? 😊&lt;/p&gt;

&lt;p&gt;For more details, check out the &lt;a href="//angular.dev/guide/hydration"&gt;Angular Documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>🚀 My ChatGPT Prompting Tips (with Frontend examples)</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Fri, 13 Oct 2023 03:46:50 +0000</pubDate>
      <link>https://forem.com/junlow/top-8-chatgpt-prompting-tips-frontend-version-5f91</link>
      <guid>https://forem.com/junlow/top-8-chatgpt-prompting-tips-frontend-version-5f91</guid>
      <description>&lt;p&gt;No doubt, AI tools like ChatGPT and GitHub Copilot have revolutionized the way we approach coding. They're not just about saving time; they actually enhancing the whole developer experience(DX) more nicer. To make the most of this powerful tool, it's essential to know how to write effective prompts. In this tutorial, we'll delve into the best practices for frontend prompting with ChatGPT, with some specific examples. Let's get started! 😊&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfhkk6jkz1xxxkcaw0uj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfhkk6jkz1xxxkcaw0uj.gif" alt="gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Be Clear and Specific
&lt;/h2&gt;

&lt;p&gt;❌ "How do I center something?"&lt;br&gt;
✅ "What's the best way to center a div element horizontally and vertically on a webpage?"&lt;/p&gt;

&lt;p&gt;When crafting your prompt, be as clear and specific as possible. This helps ChatGPT understand your requirement and provide relevant information or code examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Specify Language and Context
&lt;/h2&gt;

&lt;p&gt;❌ "Explain reduce"&lt;br&gt;
✅ "Explain JavaScript's &lt;code&gt;reduce()&lt;/code&gt; method, and include two simple code examples."&lt;/p&gt;

&lt;p&gt;Try to provide context by specifying the programming language or technology you're working with. Also, consider your expertise level and project status to tailor the response effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Break into Smaller Steps
&lt;/h2&gt;

&lt;p&gt;✅ "Explain JavaScript's &lt;code&gt;reduce()&lt;/code&gt; method to me as if I am a beginning developer just learning how to code. Provide an example of how I can use &lt;code&gt;reduce()&lt;/code&gt; to calculate the total price of several items in a shopping cart."&lt;/p&gt;

&lt;p&gt;Extension to the tip number two, break down a complex questions into smaller, actionable steps. This makes it easier for ChatGPT to provide a comprehensive answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Include Example Requests
&lt;/h2&gt;

&lt;p&gt;❌ "How do I create a form?"&lt;br&gt;
✅ "Your task is to create a form in JavaScript with one input that accepts a string and prints that string to the webpage in reverse on submit."&lt;/p&gt;

&lt;p&gt;Including example requests helps ChatGPT understand precisely what you want to achieve and generates more accurate responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Request Relevant Details
&lt;/h2&gt;

&lt;p&gt;❌ "Show me an example React component"&lt;br&gt;
✅ "Create an example of React component that takes in at least one prop and demonstrates how to use hooks like useState and useEffect. The example should not be a typical 'Hello World' example like a counter or a greeting. Assume that I have already set up a React project."&lt;/p&gt;

&lt;p&gt;Request specific details and your project status will help you receive a response tailored to your needs. Be explicit about your requirements to avoid generic answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Control Response Length
&lt;/h2&gt;

&lt;p&gt;✅ Ask for steps: "Provide a brief 2-step explanation of creating a custom JavaScript event"&lt;/p&gt;

&lt;p&gt;✅ Table: "Highlight the differences between React and Vue in a tabular format"&lt;/p&gt;

&lt;p&gt;✅ Summarize with bullet points: "Please summarize in 3 bullet points why innerHTML should be avoided"&lt;/p&gt;

&lt;p&gt;✅ Summarize as flow chart: "Use a flowchart to explain how to make a pull request on Github" &lt;/p&gt;

&lt;p&gt;✅ Summarize as pseudo code: "Create pseudo code in the form of code comments describing how I can write a React component that displays the time in a user's local timezone." &lt;/p&gt;

&lt;p&gt;We can control the length and formatting of responses by specifying your preferences. You can request concise answers, detailed explanations, or code snippets, depending on your requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Role-Based Prompting
&lt;/h2&gt;

&lt;p&gt;✅ "Act as a product owner to help me define crucial features for my app and write user stories."&lt;/p&gt;

&lt;p&gt;✅ "Act as a software architect and help me determine which technologies to use for my web app."&lt;/p&gt;

&lt;p&gt;✅ "Act as a senior engineer and advise me on best practices."&lt;/p&gt;

&lt;p&gt;ChatGPT can acting different roles to assist you effectively, whether with project planning, technology decisions, or coding guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Give Examples
&lt;/h2&gt;

&lt;p&gt;✅ "Please write a function to total an array of numbers and return the value as a dollar amount:&lt;/p&gt;

&lt;p&gt;Example input: &lt;code&gt;[5, 40.5, 9, 45, 23, 50]&lt;/code&gt;&lt;br&gt;
Example output: &lt;code&gt;"$172.50"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Provide specific examples of th input and output results will helps ChatGPT provide precise code solutions to your request.&lt;/p&gt;

&lt;p&gt;That's all! Remember that creating effective prompts is a skill that improves with practice. By following these best practices, we can unlock the full potential of ChatGPT and make your web development journey smoother and more productive. Feel free to comment on which one is most useful for you and happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>chatgpt</category>
      <category>promptengineering</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Angular 15: Transitioning deprecated CanDeactivate() to Functional Guards</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Thu, 07 Sep 2023 22:25:42 +0000</pubDate>
      <link>https://forem.com/junlow/angular-15-transitioning-deprecated-candeactivate-to-functional-guards-4ia8</link>
      <guid>https://forem.com/junlow/angular-15-transitioning-deprecated-candeactivate-to-functional-guards-4ia8</guid>
      <description>&lt;p&gt;As developers, we often find ourselves adapting to changes in the tools and frameworks we use. Recently, while working on my Angular project, I stumbled upon a significant shift in Angular 15: the deprecation of class-based route guards like &lt;code&gt;CanDeactivate()&lt;/code&gt;. In their place, Angular has introduced functional guards, providing a more modern and flexible approach to managing route deactivation. In this article, I'll guide you through this transition and share how you can smoothly update your codebase. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Change
&lt;/h2&gt;

&lt;p&gt;In previous Angular versions, we used the &lt;code&gt;CanDeactivate()&lt;/code&gt; guard to handle route deactivation, implementing custom logic to determine whether a user could leave a particular route. However, Angular 15 introduces functional guards as the new way forward. This change aligns with Angular's mission to simplify and enhance the development experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transitioning to Functional Guards
&lt;/h2&gt;

&lt;p&gt;1) Create a Functional Guard: Start by creating a TypeScript function as your functional guard. This function should return true to allow deactivation or false to prevent it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasUnsavedChangesGuard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CanDeactivateFn&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ComponentCanDeactivate&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ComponentCanDeactivate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Observable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canDeactivate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;canDeactivate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Are you sure you want to leave this page? If you do, any unsaved changes will be lost.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) Implement the Functional Guard: In your routing configuration, specify the functional guard for a route.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;canDeactivate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hasUnsavedChangesGuard&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use an injectable class as a functional guard by leveraging the &lt;code&gt;inject&lt;/code&gt; function. This approach keeps your guard logic separate from your routing configuration, especially for the case you have your custom component such as Dialog component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;canDeactivate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasUnsavedChangesGuard&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;canDeactivate&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By embracing this change in Angular 15, you'll find your route guard implementation becomes more streamlined and adaptable. For detailed examples and additional information, refer to the &lt;a href="https://angular.io/api/router/CanDeactivate" rel="noopener noreferrer"&gt;official Angular documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Change in the development world is inevitable, and adapting to it is key to staying at the forefront of technology. As I worked through this transition in Angular 15, I found it not only improved the development experience but also reinforced the idea that growth and improvement are constants in the world of software development. Embrace these changes, and you'll continue to build better, more maintainable applications 😄🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>angular</category>
      <category>typescript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>5 quick ways to center a div with CSS</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Sat, 29 Oct 2022 04:35:41 +0000</pubDate>
      <link>https://forem.com/junlow/5-quick-ways-to-center-a-div-with-css-3nno</link>
      <guid>https://forem.com/junlow/5-quick-ways-to-center-a-div-with-css-3nno</guid>
      <description>&lt;p&gt;Hello DEV community 👋 Centering div is one of the common problems encountered in front-end layout. Avoid long-windedness, here are five simple and common centering methods:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using Flexbox&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkik0t0wuzxbxyoaywx1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkik0t0wuzxbxyoaywx1.png" alt="using flexbox" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Grid&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7qhhwtlw8rurac6xjkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7qhhwtlw8rurac6xjkz.png" alt="using grid" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Position&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12bs2nvpiuudtwb2zy8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12bs2nvpiuudtwb2zy8g.png" alt="using position" width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Flex and Margin&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8l72oiopwliq0ynmqkk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8l72oiopwliq0ynmqkk.png" alt="using flex and margin" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Grid and Margin&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwoghxgyo0gw79efga0sd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwoghxgyo0gw79efga0sd.png" alt="using grid and margin" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! 5 easy and quick ways to solve one of my most googled css problems in every situation. Welcome to comment if you know of any other way to center a div, cheers! 🦹‍♂️&lt;/p&gt;

</description>
      <category>css</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Nevertheless, jun Coded in 2022</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Wed, 09 Mar 2022 03:27:45 +0000</pubDate>
      <link>https://forem.com/junlow/nevertheless-jun-coded-in-2022-3467</link>
      <guid>https://forem.com/junlow/nevertheless-jun-coded-in-2022-3467</guid>
      <description>&lt;p&gt;Happy International Women's Day!✨💖👯&lt;/p&gt;

&lt;h2&gt;
  
  
  My biggest technical achievements are…
&lt;/h2&gt;

&lt;p&gt;In a pandemic year, I'm celebrating my one-year anniversary of working fully remotely. I also started getting involved in designing and creating applications, using technologies I had never heard of before at every layer of the stack, which challenged me to think about projects from the start and make sure they were robust and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advocating for myself looks like…
&lt;/h2&gt;

&lt;p&gt;Self-love first - From time to time I'd be feeling burnout from the work and social media. What I do is spending time and energy on things that truly matter to me and take a break from the screens. &lt;/p&gt;

&lt;h2&gt;
  
  
  I pledge to support women, non-binary folks, and other minorities in tech by…
&lt;/h2&gt;

&lt;p&gt;Always the same as my previous #shecoded posts. Always be kind and support them in every possible way 🌻 You can be everything you are meant to be. All of you are super amazing!&lt;/p&gt;

&lt;h2&gt;
  
  
  I’m excited about…
&lt;/h2&gt;

&lt;p&gt;To about to start my first ever - digital nomad journey. I'm excited about the challenge to travel and working in foreign countries. Also, an opportunity to start a van life and adapt the new lifestyle. &lt;/p&gt;

&lt;p&gt;Thanks to DEV and GitHub has generously offered donations for #SheCoded posts! Lets us continue creating opportunities and supporting for women and girls in technology.&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>theycoded</category>
    </item>
    <item>
      <title>Some handy HTML tags can do to make things easier</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Sat, 11 Sep 2021 10:29:56 +0000</pubDate>
      <link>https://forem.com/junlow/some-handy-html-tags-can-do-to-make-things-easier-1jla</link>
      <guid>https://forem.com/junlow/some-handy-html-tags-can-do-to-make-things-easier-1jla</guid>
      <description>&lt;p&gt;HTML (Hypertext Markup Language) is a standard markup language used to create web pages. Tags are like blocks to give special semantics meaning to the content and help browser rendering. Thus, they play a very important role in SEO(search engine optimization).&lt;/p&gt;

&lt;p&gt;Although HTML tags is widely known and widely used, some of them have been long forgotten. In this article I’ll share some HTML tags that have helped me a lot when developing websites over the years 🎉&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; &amp;amp; &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; tag defines a visible heading for the &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; element. The heading can be clicked to view/hide the details.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; tag is often used to create an accordion that the user can open and close.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3elahvlp8tihyd5ssu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3elahvlp8tihyd5ssu1.png" alt="image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt; tag defines a dialog box or other interactive components like alert, inspector, or subwindow.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqubq4xc5kdl87ejfowu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqubq4xc5kdl87ejfowu8.png" alt="image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt; tag defines a specific time/date. It does not render anything special on webpage but it's extremely helpful for better search engine results or custom features such as reminders.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnihifg6rff1slsgq7ijk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnihifg6rff1slsgq7ijk.png" alt="image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;datalist&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;datalist&amp;gt;&lt;/code&gt; tag is used to define the list of valid dropdown list for your various  element and provide an "autocomplete" feature.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpdq6uv5q6v9vveh2ehk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpdq6uv5q6v9vveh2ehk.png" alt="image" width="800" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;progress&amp;gt;&lt;/code&gt; tag represents the completion progress of a task on a bar indicator.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7y4mk2qcqejgt8vjpgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7y4mk2qcqejgt8vjpgy.png" alt="image" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;&amp;lt;small&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;small&amp;gt;&lt;/code&gt; tag defines smaller text like copyright or legal text. Although it may be perceived to violate the principle of separation between structure and presentation, but it's valid in HTML5. Therefore, please determining whether to use &lt;code&gt;&amp;lt;small&amp;gt;&lt;/code&gt; or CSS your content accordingly.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3j2yrkw1rqg8tdxy7k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3j2yrkw1rqg8tdxy7k.png" alt="image" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;I hope you find this helpful and don't forget to check on the cross-browser compatibility before adding more semantics to your HTML. Your webpages will become more user friendly and more machine-readable. Thank you 😊&lt;/p&gt;

</description>
      <category>html</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Nevertheless, jun coded in 2021!</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Mon, 08 Mar 2021 07:23:52 +0000</pubDate>
      <link>https://forem.com/junlow/nevertheless-jun-coded-in-2021-5a2l</link>
      <guid>https://forem.com/junlow/nevertheless-jun-coded-in-2021-5a2l</guid>
      <description>&lt;p&gt;Happy International Women's Day!✨💖👯&lt;/p&gt;

&lt;h2&gt;
  
  
  My most recent achievement was…
&lt;/h2&gt;

&lt;p&gt;My dream goal. One of the reasons I work in tech is because it allows us to work remotely easily. Last year, I got my first full remote position - which is my third and current job. &lt;/p&gt;

&lt;p&gt;I very appreciate the company value non-technical expertise and people skills just as highly as technical expertise. The job was challenging from the beginning but I've learned so much there. If I hadn't been given the opportunity, I wouldn't have all that valuable experience behind me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advocating for myself looks like…
&lt;/h2&gt;

&lt;p&gt;The first would be allowing myself to take a break and rest. Next would be knowing I have a lot to learn and take it one step at a time. I've also learned to make sure I am comfortable with being uncomfortable.&lt;/p&gt;

&lt;h2&gt;
  
  
  My biggest goal is…
&lt;/h2&gt;

&lt;p&gt;I am keen to help inspire women from non-tech backgrounds to get into tech. It was really encouraging for me to see women from all kinds of backgrounds who didn’t have a Computer Science degree like me to work in the tech industry. And I always believe there were transferable skills between each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  My advice for allies to support underrepresented folks who code is...
&lt;/h2&gt;

&lt;p&gt;Always be kind and support them in every possible way🌻 Be proud of what you achieved and learned in a time even if it is just a small thing.&lt;/p&gt;

&lt;p&gt;I have grown so much as a woman and a developer and I am still working on it but despite everything, nevertheless, I coded. &lt;/p&gt;

&lt;p&gt;Thanks to Dev.to, for the extra step of having someone reading the #shecoded posts and inspired other women through women's stories.&lt;/p&gt;

</description>
      <category>wecoded</category>
      <category>theycoded</category>
    </item>
    <item>
      <title>My Mac setup for work 👩‍💻</title>
      <dc:creator>jun</dc:creator>
      <pubDate>Sun, 06 Dec 2020 07:43:18 +0000</pubDate>
      <link>https://forem.com/junlow/my-mac-setup-for-work-1d7k</link>
      <guid>https://forem.com/junlow/my-mac-setup-for-work-1d7k</guid>
      <description>&lt;p&gt;This weekend I'm going to set up a new Macbook Pro 13' for work. 💻 Here are my current preferences for setting up a MacBook Pro. &lt;/p&gt;

&lt;h3&gt;
  
  
   &amp;gt; System Preferences :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Keyboard &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input sources - English - set to ABC instead of a specific country.&lt;/li&gt;
&lt;li&gt;Key repeat set to the fastest and delayed until repeat to the shortest.&lt;/li&gt;
&lt;li&gt;Shortcuts - Mission Control - overwrite &lt;code&gt;command + Q&lt;/code&gt; to the Do Not Disturb on/off &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Desktop &amp;amp; Screen Saver &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen Saver - Hot Corner - Set lock screen or sleep&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Trackpad &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Point &amp;amp; Click - change the speed to the fastest&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Disable Ask Siri&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Dock &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove everything unnecessary application but leave some important like Finder and Trash&lt;/li&gt;
&lt;li&gt;Show recent applications in Dock &lt;/li&gt;
&lt;li&gt;Turn automatically hiding on&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Finder - show path bar&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Accessibility&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pointer Control - Trackpad Options - Enable dragging - three-finger drag&lt;/li&gt;
&lt;li&gt;Double click speed to the fastest&lt;/li&gt;
&lt;li&gt;Scrolling speed to the fastest&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Security and Privacy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow apps downloaded from App Store and identified developers&lt;/li&gt;
&lt;li&gt;Turn the Firewall on &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Cherry-pick some good stuff &lt;a href="https://github.com/mathiasbynens/dotfiles/blob/master/.macos" rel="noopener noreferrer"&gt;here&lt;/a&gt; you think will suit you. &lt;/p&gt;

&lt;h3&gt;
  
  
  Applications :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Brave browser and set it to default. &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Chrome extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/checker-plus-for-gmail/oeopbcgkkoapgobdbedcemjljbihmemj/related" rel="noopener noreferrer"&gt;checker-plus-for-gmail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en" rel="noopener noreferrer"&gt;uBlock Origin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=en" rel="noopener noreferrer"&gt;JSON Formatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=en" rel="noopener noreferrer"&gt;ColorZilla&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/new-tab-studio-countdown/epngggilgnflanfabeldfpbgponcgpgl?hl=en" rel="noopener noreferrer"&gt;New Tab Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/lastpass-free-password-ma/hdokiejnpimakedhajhdlcegeplioahd?hl=en" rel="noopener noreferrer"&gt;LastPass&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall/related?hl=en" rel="noopener noreferrer"&gt;OneTab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/codecopy/fkbfebkcoelajmhanocgppanfoojcdmg/related?hl=en" rel="noopener noreferrer"&gt;CodeCopy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/octolinker/jlmafbaeoofdegohdhinkhilhclaklkp/related?hl=en" rel="noopener noreferrer"&gt;OctoLinker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://theunarchiver.com/" rel="noopener noreferrer"&gt;The Unarchiver&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://zoom.us/" rel="noopener noreferrer"&gt;Zoom&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://slack.com/" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.notion.so/desktop" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://krisp.ai/" rel="noopener noreferrer"&gt;Krisp&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  IDE :
&lt;/h3&gt;

&lt;p&gt;I'm using &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; with &lt;a href="https://www.jetbrains.com/lp/mono/" rel="noopener noreferrer"&gt;JetBrains Mono&lt;/a&gt; and following extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prettier&lt;/li&gt;
&lt;li&gt;GitLens&lt;/li&gt;
&lt;li&gt;ESLint&lt;/li&gt;
&lt;li&gt;Bracket Pair Colorizer&lt;/li&gt;
&lt;li&gt;Code Spell Checker&lt;/li&gt;
&lt;li&gt;Emmet&lt;/li&gt;
&lt;li&gt;Live Share&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal environments :
&lt;/h3&gt;

&lt;p&gt;I'm using iTerm2 + Zsh + Spaceship theme with following setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autosuggestions&lt;/li&gt;
&lt;li&gt;syntax highlighting&lt;/li&gt;
&lt;li&gt;homebrew&lt;/li&gt;
&lt;li&gt;git&lt;/li&gt;
&lt;li&gt;node.js&lt;/li&gt;
&lt;li&gt;SSH &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See also &lt;a href="https://dev.to/aspittel/my-terminal-setup-iterm2--zsh--30lm"&gt;Ali Spittel's My Terminal Setup: iTerm2 + Zsh 🔥&lt;/a&gt; and &lt;a href="https://dev.to/gabsii/2020-macos-terminal-setup-zsh-iterm-1nln"&gt;Lukas Gabsi's 2020 🍀 macOS Terminal Setup (zsh + 🚀 + iTerm)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading my mac setup article. I really hope this could help speed up your process or gave you some ideas for the next macOS setup. 🚀 &lt;/p&gt;

&lt;p&gt;I am always looking for ways to improve my efficiency, so if you use any tool that you find useful, feel free to comment on this post.🙂&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>mac</category>
    </item>
  </channel>
</rss>
