<?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>DEV Community: kandz</title>
    <description>The latest articles on DEV Community by kandz (@kandz).</description>
    <link>https://dev.to/kandz</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4010024%2Fba5408f9-0a6c-4392-8632-b33b6c9bb4df.jpg</url>
      <title>DEV Community: kandz</title>
      <link>https://dev.to/kandz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kandz"/>
    <language>en</language>
    <item>
      <title>A Complete Free Angular Curriculum — 132 Chapters, From CLI to Zoneless Change Detection</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Thu, 05 Nov 2026 18:31:01 +0000</pubDate>
      <link>https://dev.to/kandz/a-complete-free-angular-curriculum-132-chapters-from-cli-to-zoneless-change-detection-8fb</link>
      <guid>https://dev.to/kandz/a-complete-free-angular-curriculum-132-chapters-from-cli-to-zoneless-change-detection-8fb</guid>
      <description>&lt;p&gt;Angular is a full framework—routing, forms, HTTP, dependency injection, and a build system all included. That's also why it's hard to learn: most tutorials only cover a slice.&lt;/p&gt;

&lt;p&gt;I found a curriculum that covers the whole thing. &lt;strong&gt;132 chapters&lt;/strong&gt;, split into a clear progression.&lt;/p&gt;

&lt;p&gt;It's on &lt;strong&gt;KandZ Tuts&lt;/strong&gt;, and here's what's inside.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foundations (1–18)
&lt;/h3&gt;

&lt;p&gt;Introduction, environment setup, Angular CLI basics, project structure, components, templates and interpolation, the three binding directions, structural directives (&lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt;, &lt;code&gt;*ngSwitch&lt;/code&gt;), the &lt;strong&gt;modern block syntax&lt;/strong&gt; (&lt;code&gt;@if&lt;/code&gt;, &lt;code&gt;@for&lt;/code&gt;, &lt;code&gt;@switch&lt;/code&gt;, &lt;code&gt;@let&lt;/code&gt;), attribute directives, built-in pipes, custom pipes, component communication with &lt;code&gt;@Input&lt;/code&gt;/&lt;code&gt;@Output&lt;/code&gt;, the &lt;strong&gt;modern &lt;code&gt;input()&lt;/code&gt;, &lt;code&gt;output()&lt;/code&gt;, &lt;code&gt;model()&lt;/code&gt; functions&lt;/strong&gt;, lifecycle hooks, advanced lifecycle hooks, and view encapsulation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Services, DI, and Routing (19–28)
&lt;/h3&gt;

&lt;p&gt;Services and basic dependency injection, DI decorators and provider scopes, the &lt;code&gt;inject()&lt;/code&gt; function, routing basics, route and query parameters, nested routes, lazy loading, route guards, resolvers, and route-level data with component input binding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forms and HTTP (29–38)
&lt;/h3&gt;

&lt;p&gt;Reactive forms, &lt;code&gt;FormArray&lt;/code&gt; and dynamic controls, template-driven forms, validation and custom validators, advanced dynamic and nested forms, custom form controls, &lt;code&gt;HttpClient&lt;/code&gt;, interceptors, error handling, and logging/observability.&lt;/p&gt;

&lt;h3&gt;
  
  
  RxJS (39–46)
&lt;/h3&gt;

&lt;p&gt;Observables, transformation and filtering operators, higher-order mapping operators (&lt;code&gt;switchMap&lt;/code&gt;, &lt;code&gt;mergeMap&lt;/code&gt;, &lt;code&gt;concatMap&lt;/code&gt;), subjects and &lt;code&gt;BehaviorSubject&lt;/code&gt;/&lt;code&gt;ReplaySubject&lt;/code&gt;, combining streams, error handling in RxJS, multicasting and sharing, and advanced state patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signals (47–53)
&lt;/h3&gt;

&lt;p&gt;Reactive primitives, computed signals, effects and side effects, signal-based components, signal interop with RxJS, advanced signal patterns, and the &lt;strong&gt;&lt;code&gt;resource()&lt;/code&gt; and &lt;code&gt;httpResource()&lt;/code&gt; APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced DI and Standalone (54–61)
&lt;/h3&gt;

&lt;p&gt;DI in depth, providers and injection tokens, hierarchical injectors, provider recipes, advanced injection scopes, standalone components, standalone directives and pipes, and bootstrapping without &lt;code&gt;NgModule&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Change Detection (62–65)
&lt;/h3&gt;

&lt;p&gt;Default and &lt;code&gt;OnPush&lt;/code&gt;, signals and manual control, Zone.js internals, and &lt;strong&gt;zoneless Angular&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Templates and Components (66–74)
&lt;/h3&gt;

&lt;p&gt;Animations, advanced animations and route transitions, dynamic components, content projection, &lt;code&gt;ViewChild&lt;/code&gt;/&lt;code&gt;ViewChildren&lt;/code&gt;/&lt;code&gt;ContentChild&lt;/code&gt;, &lt;code&gt;HostBinding&lt;/code&gt;/&lt;code&gt;HostListener&lt;/code&gt;, custom directives in depth, custom pipes in depth, and &lt;strong&gt;deferrable views with &lt;code&gt;@defer&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSR and Routing (75–80)
&lt;/h3&gt;

&lt;p&gt;Angular Universal, hydration and SSR best practices, prerendering and SSG, router internals, advanced router features, and authentication/route protection.&lt;/p&gt;

&lt;h3&gt;
  
  
  State Management (81–85)
&lt;/h3&gt;

&lt;p&gt;Services, NgRx, NgRx Effects and Entity, Component Store, and &lt;strong&gt;Signal Store&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI and Platform (86–94)
&lt;/h3&gt;

&lt;p&gt;i18n, i18n in depth, accessibility, Angular Material components and theming, Angular CDK, Web Components, PWAs, and service workers/offline support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance (95–99)
&lt;/h3&gt;

&lt;p&gt;Rendering and change detection, bundles and loading, lazy loading strategies, tree shaking and bundle analysis, and image/font optimization with &lt;code&gt;NgOptimizedImage&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing and Tooling (100–110)
&lt;/h3&gt;

&lt;p&gt;Jasmine/Karma unit tests, component and service tests, &lt;code&gt;TestBed&lt;/code&gt; and DI, async and signal testing, Playwright E2E, Cypress E2E, Angular DevTools, debugging, Angular Language Service and IDE setup, environment configuration, and build optimizations and budgets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment and Architecture (111–122)
&lt;/h3&gt;

&lt;p&gt;Static and SSR deployment, CI/CD and caching, monorepos with Nx, libraries and workspaces, micro-frontends, Angular Elements, security, OAuth/JWT, GraphQL, WebSockets, serverless, and AI integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Internals and Migration (123–132)
&lt;/h3&gt;

&lt;p&gt;The compiler and Ivy, schematics and custom generators, builders and custom CLI commands, migrating from AngularJS, migrating between Angular versions, migrating to the new control flow, upgrading legacy applications, real-world architecture patterns, a &lt;strong&gt;full capstone application&lt;/strong&gt;, and a cheatsheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It's Worth Your Time
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It teaches old and new side by side.&lt;/strong&gt; You get &lt;code&gt;*ngIf&lt;/code&gt; and &lt;code&gt;@if&lt;/code&gt;, &lt;code&gt;@Input&lt;/code&gt; and &lt;code&gt;input()&lt;/code&gt;, &lt;code&gt;NgModule&lt;/code&gt; and standalone. You learn what's current and what it replaced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Signals and zoneless are treated as first-class.&lt;/strong&gt; Chapters 47–53 and 65 cover the reactivity model Angular is actively moving toward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It goes past application code.&lt;/strong&gt; Ivy internals, schematics, custom CLI builders, and migration paths—the material usually found only in source code and conference talks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who Should Read It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beginners:&lt;/strong&gt; Start at Chapter 1 and read in order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experienced Angular devs:&lt;/strong&gt; Use the table of contents as an audit. Jump to signals (47), zoneless (65), or &lt;code&gt;httpResource&lt;/code&gt; (53) if those are gaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Link
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://tuts.kandz.me/category/programming/frontend-fed/angular-ecosystem/angular/" rel="noopener noreferrer"&gt;Angular — KandZ Tuts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free, no signup, 132 chapters.&lt;/p&gt;

&lt;p&gt;If Angular felt too large to learn properly, this is the resource that makes the size manageable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What Angular topics do you wish had better tutorials? Let me know in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Make Iframes Responsive, Secure, and Fast</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Thu, 05 Nov 2026 08:44:19 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-make-iframes-responsive-secure-and-fast-hla</link>
      <guid>https://dev.to/kandz/how-to-make-iframes-responsive-secure-and-fast-hla</guid>
      <description>&lt;p&gt;Embedding iframes is easy. Making them responsive, secure, and performant is hard.&lt;/p&gt;

&lt;p&gt;You forget sandbox attributes. The aspect ratio breaks on mobile. It slows down your page load because it loads immediately.&lt;/p&gt;

&lt;p&gt;Let's look at how to fix all three issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Responsive Problem
&lt;/h2&gt;

&lt;p&gt;By default, iframes use fixed widths and heights, which break on mobile devices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Modern Method: &lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you only need to support modern browsers, this is the cleanest and easiest method. You can use the CSS &lt;code&gt;aspect-ratio&lt;/code&gt; property directly on the iframe.&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="nc"&gt;.responsive-iframe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&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;The browser automatically calculates the correct height based on the width and the ratio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Legacy Method: Padding-Bottom Wrapper&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before &lt;code&gt;aspect-ratio&lt;/code&gt; existed, developers used a clever CSS trick involving absolute positioning and percentage padding.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"iframe-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="na"&gt;allowfullscreen&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.iframe-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;56.25%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* 16:9 aspect ratio */&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.iframe-container&lt;/span&gt; &lt;span class="nt"&gt;iframe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&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;&lt;em&gt;To calculate the percentage:&lt;/em&gt; 9 divided by 16 equals 0.5625, or 56.25%.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Security Problem
&lt;/h2&gt;

&lt;p&gt;Iframes can be a major security risk. An iframe from an untrusted source can run scripts, redirect the top-level page, or access cookies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;sandbox&lt;/code&gt; attribute&lt;/strong&gt; restricts what the iframe can do. By default, it applies all restrictions. You can then selectively allow specific behaviors.&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;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt; 
  &lt;span class="na"&gt;sandbox=&lt;/span&gt;&lt;span class="s"&gt;"allow-scripts allow-same-origin"&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;p&gt;Never add &lt;code&gt;allow-scripts&lt;/code&gt; and &lt;code&gt;allow-same-origin&lt;/code&gt; together if the iframe is from a different domain—it allows the iframe to remove its own sandbox attribute.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Performance Problem
&lt;/h2&gt;

&lt;p&gt;If you have an iframe far down the page (like a map or an embedded video), you don't want it to load until the user scrolls to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;loading="lazy"&lt;/code&gt; attribute&lt;/strong&gt; tells the browser to defer loading the iframe until it's near the viewport.&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;src=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt; 
  &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt; 
  &lt;span class="na"&gt;sandbox=&lt;/span&gt;&lt;span class="s"&gt;"allow-scripts"&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;p&gt;This saves bandwidth and speeds up the initial page load.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;allowfullscreen&lt;/code&gt;:&lt;/strong&gt; If you are embedding a video, you must include &lt;code&gt;allowfullscreen&lt;/code&gt; for the video player's fullscreen button to work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Borders:&lt;/strong&gt; By default, iframes have an ugly 3D border. Always add &lt;code&gt;border: none;&lt;/code&gt; (or &lt;code&gt;frameBorder="0"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing title:&lt;/strong&gt; For accessibility, every iframe must have a &lt;code&gt;title&lt;/code&gt; attribute explaining its content.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prototyping Visually
&lt;/h2&gt;

&lt;p&gt;Writing the responsive wrapper markup, calculating the aspect ratio percentages, and configuring the correct sandbox permissions by hand is tedious and easy to get wrong.&lt;/p&gt;

&lt;p&gt;If you want to configure and embed responsive, secure iframes with sandbox permissions, lazy loading, and aspect ratio wrappers, I built a free HTML Iframe Code Builder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/html-iframe-builder" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's the hardest part of working with iframes for you? Let me know in the comments.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>A Complete Free TypeScript Curriculum — 107 Chapters, From Basics to Compiler Internals</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Wed, 04 Nov 2026 18:43:56 +0000</pubDate>
      <link>https://dev.to/kandz/a-complete-free-typescript-curriculum-107-chapters-from-basics-to-compiler-internals-3llc</link>
      <guid>https://dev.to/kandz/a-complete-free-typescript-curriculum-107-chapters-from-basics-to-compiler-internals-3llc</guid>
      <description>&lt;p&gt;I've been looking for a TypeScript resource that doesn't stop halfway.&lt;/p&gt;

&lt;p&gt;Most either cover the basics and quit, or assume you already know what a conditional type is. I found one that covers the full arc, and I wanted to share it.&lt;/p&gt;

&lt;p&gt;It's on &lt;strong&gt;KandZ Tuts&lt;/strong&gt;, and it's structured as &lt;strong&gt;106 chapters plus a cheatsheet&lt;/strong&gt;, split into five sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Inside
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Foundations (1–18):&lt;/strong&gt; Setup, CLI, &lt;code&gt;tsconfig.json&lt;/code&gt;, primitives, arrays/tuples/enums, unions/intersections, aliases vs interfaces, functions and overloads, object types, inference, literal types, assertions, control flow narrowing, &lt;code&gt;typeof&lt;/code&gt;/&lt;code&gt;instanceof&lt;/code&gt;/&lt;code&gt;in&lt;/code&gt; guards, user-defined predicates, discriminated unions, exhaustiveness checking, and &lt;code&gt;unknown&lt;/code&gt;/&lt;code&gt;any&lt;/code&gt;/&lt;code&gt;never&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intermediate (19–54):&lt;/strong&gt; Classes, access modifiers, abstract classes, inheritance, getters/setters, static members, generics (functions, classes, interfaces, constraints, defaults), &lt;code&gt;keyof&lt;/code&gt;/&lt;code&gt;typeof&lt;/code&gt;/indexed access, mapped types, conditional types, &lt;code&gt;infer&lt;/code&gt;, template literal types, the full utility-type toolkit (chapters 34–37), type composition, variance, structural vs nominal typing, covariance/contravariance/bivariance, branded types, recursive types, distributive conditional types, higher-kinded type patterns, type-level programming, and type-safe patterns (builders, fluent interfaces, immutability, event emitters, DI, state machines, API clients, Zod/io-ts validation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modules &amp;amp; Async (55–70):&lt;/strong&gt; &lt;code&gt;import&lt;/code&gt;/&lt;code&gt;export&lt;/code&gt;, module resolution, path mapping, namespaces and declaration merging, &lt;code&gt;.d.ts&lt;/code&gt; files, ambient declarations, publishing typed packages, &lt;code&gt;@types&lt;/code&gt; and DefinitelyTyped, Promises and async/await typing, callbacks, event handlers and DOM, Node.js APIs, third-party libraries without types, error handling, Result/Either patterns, and typing JSON/unknown data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tooling &amp;amp; Advanced (71–87):&lt;/strong&gt; Strict mode flags, compiler options in depth, project references, incremental builds, type-only imports/exports, &lt;code&gt;isolatedModules&lt;/code&gt; and &lt;code&gt;verbatimModuleSyntax&lt;/code&gt;, legacy and Stage 3 decorators, decorators in Angular and NestJS, mixins, the &lt;code&gt;this&lt;/code&gt; type, function overloads in depth, assertion functions, the &lt;code&gt;satisfies&lt;/code&gt; operator, const type parameters, and the &lt;code&gt;using&lt;/code&gt; keyword with &lt;code&gt;Disposable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrations &amp;amp; Capstone (88–107):&lt;/strong&gt; React, Vue, Angular, Node/Express, Deno/Bun, Jest/Vitest, ESLint/Prettier, bundlers (Vite, esbuild, webpack), migrating JS to TS, migrating between TS versions, compiler internals, custom transformers, LSP and editor integration, type-checking performance at scale, monorepos, publishing libraries, style guide, architecture patterns, a full type-safe capstone application, and a cheatsheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It's Worth Your Time
&lt;/h3&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The ordering is deliberate.&lt;/strong&gt; Narrowing and type guards come before conditional types. Utility types get four chapters, not one table. You build the mental model before the advanced material.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It doesn't skip the tooling.&lt;/strong&gt; Chapters 88–95 cover the framework and bundler integrations that most TypeScript tutorials ignore. If you've ever fought &lt;code&gt;tsconfig.json&lt;/code&gt; in a monorepo, this is covered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It goes past application code.&lt;/strong&gt; Compiler internals, custom transformers, and the Language Server Protocol are the topics you usually only find in conference talks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who Should Read It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beginners:&lt;/strong&gt; Start at Chapter 1 and go in order. Don't skip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experienced developers:&lt;/strong&gt; Use the table of contents as a checklist. Jump to variance (39), &lt;code&gt;satisfies&lt;/code&gt; (85), or &lt;code&gt;using&lt;/code&gt; (87) if those are gaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Link
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://tuts.kandz.me/category/programming/languages/typescript/" rel="noopener noreferrer"&gt;TypeScript — KandZ Tuts&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Free, no signup, no paywall.&lt;/p&gt;

&lt;p&gt;If you've been meaning to learn TypeScript properly, or if you've been using it for years and know there are holes, this is the most complete free curriculum I've found.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What TypeScript topics do you wish had better tutorials? Let me know in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Format Git Log Output (And Stop Googling the Commands)</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Wed, 04 Nov 2026 08:41:04 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-format-git-log-output-and-stop-googling-the-commands-1bca</link>
      <guid>https://dev.to/kandz/how-to-format-git-log-output-and-stop-googling-the-commands-1bca</guid>
      <description>&lt;p&gt;Git log is powerful, but the syntax is impossible to remember.&lt;/p&gt;

&lt;p&gt;You want a clean graph, a custom date format, or a search by author—and you end up Googling it for the tenth time.&lt;/p&gt;

&lt;p&gt;Let's look at how to get exactly what you want from your Git history.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shortest Possible Output
&lt;/h2&gt;

&lt;p&gt;If you just want the author and date, you need to use the &lt;code&gt;--format&lt;/code&gt; flag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%an %ad"&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down what those flags do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--format="%an %ad"&lt;/code&gt;: &lt;code&gt;%an&lt;/code&gt; is the author's name, and &lt;code&gt;%ad&lt;/code&gt; is the author's date.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--date=short&lt;/code&gt;: This formats the date as YYYY-MM-DD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alice 2023-10-24
Bob 2023-10-23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Adding the Commit Hash
&lt;/h2&gt;

&lt;p&gt;If you need the short commit hash for reference, add &lt;code&gt;%h&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%h %an %ad"&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a1b2c3d Alice 2023-10-24
e4f5g6h Bob 2023-10-23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The &lt;code&gt;--oneline&lt;/code&gt; Shortcut (And Its Limits)
&lt;/h2&gt;

&lt;p&gt;Git has a built-in shortcut for a compact format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, &lt;code&gt;--oneline&lt;/code&gt; only includes the short hash and the commit message. It does &lt;em&gt;not&lt;/em&gt; include the author or date. For that, you have to use the custom &lt;code&gt;--format&lt;/code&gt; string above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visualizing the Graph
&lt;/h2&gt;

&lt;p&gt;To see the branching history of your commits, add the &lt;code&gt;--graph&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to combine this with custom formatting, you can do it all in one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--graph&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%h %an %ad %s"&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; &lt;code&gt;%ad&lt;/code&gt; uses the author's timezone. If you want a consistent timezone, use &lt;code&gt;%cd&lt;/code&gt; (committer date) and set the &lt;code&gt;TZ&lt;/code&gt; environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long names:&lt;/strong&gt; If a user has a long name, the output alignment can break. You can't easily truncate strings in the format flag without some complex string manipulation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Building Complex Log Commands
&lt;/h2&gt;

&lt;p&gt;While &lt;code&gt;--format="%an %ad"&lt;/code&gt; is easy to remember, things get complicated when you want to add graph visualizers (&lt;code&gt;--graph&lt;/code&gt;), filter by date (&lt;code&gt;--since&lt;/code&gt;), or search by author (&lt;code&gt;--author&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;If you want to configure advanced Git log formatting interactively without memorizing all the flags, I built a free Git Log Commands Generator.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/git-log-generator" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's your most-used git log command? Let me know in the comments.&lt;/p&gt;

</description>
      <category>git</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>React &amp; Modern UI Stack</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Tue, 03 Nov 2026 11:31:28 +0000</pubDate>
      <link>https://dev.to/kandz/-react-modern-ui-stack-1cno</link>
      <guid>https://dev.to/kandz/-react-modern-ui-stack-1cno</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;React &amp;amp; Modern UI Stack&lt;/strong&gt; path covers the essential frontend ecosystem and modern tooling roadmap, built directly on top of the Core Web Stack foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorials
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;00. Core Web Stack Path ✅&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internet Beginner: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/servers-self-hosting/internet/internet-beginner/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Learn how the web works, client-server architecture, and HTTP request-response cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/html/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Master semantic markup, document structure, and web form fundamentals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/css/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Build responsive layouts using modern styling, Flexbox, and CSS Grid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/javascript/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Learn core programming concepts, DOM manipulation, asynchronous execution, and ES6+ features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rest API: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/servers-self-hosting/networking-dns/rest-api/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Design and consume scalable web services using HTTP standards and JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Control ✅&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Git:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/git/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Track changes, manage branches, handle merge conflicts, and maintain local project history.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VCS Hosting ✅&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;GitHub: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/github/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Host repositories, collaborate using Pull Requests, and automate workflows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;GitLab: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/version-control/gitlab/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Manage projects, maintain codebases, and run integrated CI/CD pipelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package Managers ✅&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;npm: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/npm/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Manage project dependencies, automate tasks with scripts, and publish packages.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Yarn: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/yarn/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Speed up package installations and manage locks efficiently.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;pnpm: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/pnpm/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Save disk space using a content-addressable store and strict dependency trees.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Bun: ✅&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/bun/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Run TypeScript applications natively with an ultra-fast package manager and runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;01. TypeScript ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/typescript/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Learn strongly typed JavaScript, interfaces, generics, and compiler configurations for scalable applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;02. React ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/frameworks/react/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Master components, hooks, state management, and the virtual DOM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;03. Routing ✅&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Router ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/frontend-fed/react-ecosystem/react-router/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — The industry standard for declarative routing in React applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Router ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/frontend-fed/react-ecosystem/tanstack-router/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — A modern, fully type-safe router with built-in data fetching capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;04. Tailwind CSS ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/css/tailwind-css/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Build responsive, modern UIs quickly using a utility-first CSS framework.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;05. State Management &amp;amp; Data Fetching ✅&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TanStack Query (React Query) ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/frontend-fed/react-ecosystem/tanstack-query-react-query/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Manage server state, caching, synchronization, and data fetching with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zustand ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/frontend-fed/react-ecosystem/zustand/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — A small, fast, and scalable bearbones state-management solution for client state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redux Toolkit ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/https://tuts.kandz.me/category/programming/frontend-fed/react-ecosystem/redux-toolkit/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — The recommended approach for writing Redux logic in larger, complex legacy applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;06. Frameworks &amp;amp; SSR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js (App Router):&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Build SEO-friendly, performant applications with server-side rendering (SSR) and static site generation (SSG).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React Server Components (RSC):&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Understand the new React architecture that enables rendering on the server and reduces bundle sizes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;07. Module Bundlers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Utilize an ultra-fast frontend build tool and dev server for a modern developer experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;esbuild:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Understand the extremely fast JavaScript bundler that powers Vite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parcel:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A zero-configuration bundler focused on simplicity and developer ease.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;08. Linters and Formatters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prettier:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Maintain a consistent, opinionated code format across your entire project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eslint:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Find and fix problems in your JavaScript code based on custom rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biome:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — An all-in-one ultra-fast formatter and linter tool aimed at replacing both Prettier and Eslint.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;09. Forms &amp;amp; Validation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Hook Form:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Perform efficient form state management and validation with minimal re-renders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zod:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A TypeScript-first schema declaration and validation library for parsing and validating data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;10. Testing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vitest:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A blazing-fast unit test framework compatible with Vite, aimed at replacing Jest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A comprehensive tool for reliable, cross-browser End-to-End (E2E) testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cypress:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A powerful E2E test runner that runs in the browser for a visual testing experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jest:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — The traditional, widely-used test runner (consider Vitest for newer projects).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;11. Web Security:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Learn essential security practices for frontend applications, including Cross-Site Scripting (XSS) prevention, Content Security Policy (CSP) implementation, and secure authentication handling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;12. Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Pages:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — The simplest way to deploy static websites directly from a GitHub repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — The optimal platform for deploying Next.js applications, providing an excellent developer workflow and serverless functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netlify:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — A modern cloud platform with continuous deployment and serverless capabilities for static and Jamstack sites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/" rel="noopener noreferrer"&gt;Coming Soon&lt;/a&gt; — Utilize Cloudflare Pages for lightning-fast static and dynamic web deployments on a massive global edge network, perfect for modern frameworks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>path</category>
    </item>
    <item>
      <title>How to Build a CSS Dropdown Menu That Doesn't Push Content Down</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Tue, 03 Nov 2026 09:20:14 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-build-a-css-dropdown-menu-that-doesnt-push-content-down-3552</link>
      <guid>https://dev.to/kandz/how-to-build-a-css-dropdown-menu-that-doesnt-push-content-down-3552</guid>
      <description>&lt;p&gt;Building CSS dropdown menus is a classic struggle.&lt;/p&gt;

&lt;p&gt;Hover states get stuck. Keyboard navigation breaks. Accessibility is forgotten. And if you don't position it right, the menu pushes all your page content down when it opens.&lt;/p&gt;

&lt;p&gt;Let's fix the layout and the accessibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Layout Problem
&lt;/h2&gt;

&lt;p&gt;If your dropdown menu is in the normal document flow, making it visible (&lt;code&gt;display: block&lt;/code&gt;) will expand the container's height. This pushes everything below it down.&lt;/p&gt;

&lt;p&gt;To fix this, you need to take the dropdown out of the document flow using &lt;code&gt;position: absolute&lt;/code&gt;.&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="c"&gt;/* The parent container must be relative */&lt;/span&gt;
&lt;span class="nc"&gt;.dropdown&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* The menu is absolute and hidden by default */&lt;/span&gt;
&lt;span class="nc"&gt;.dropdown-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Positions it right below the parent */&lt;/span&gt;
  &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;z-index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Ensures it sits on top of other elements */&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.1&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;Because the dropdown is &lt;code&gt;absolute&lt;/code&gt;, the browser ignores its space when calculating the layout of the rest of the page.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Accessibility Problem
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;display: none&lt;/code&gt; and &lt;code&gt;display: block&lt;/code&gt; on &lt;code&gt;:hover&lt;/code&gt; works for mice, but it breaks for keyboard users and screen readers.&lt;/p&gt;

&lt;p&gt;If a keyboard user tabs into the menu, the dropdown won't appear because they aren't hovering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix: &lt;code&gt;:focus-within&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of just &lt;code&gt;:hover&lt;/code&gt;, you should trigger the menu when the parent or any child receives focus.&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="nc"&gt;.dropdown&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nc"&gt;.dropdown-content&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.dropdown&lt;/span&gt;&lt;span class="nd"&gt;:focus-within&lt;/span&gt; &lt;span class="nc"&gt;.dropdown-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&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;This ensures the menu stays open when a user tabs through the links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better yet: &lt;code&gt;opacity&lt;/code&gt; and &lt;code&gt;visibility&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;display: none&lt;/code&gt; means CSS transitions won't work (elements can't transition from &lt;code&gt;display: none&lt;/code&gt; to &lt;code&gt;display: block&lt;/code&gt;). It also removes the content from the accessibility tree entirely.&lt;/p&gt;

&lt;p&gt;A smoother, more accessible approach is to toggle &lt;code&gt;visibility&lt;/code&gt; and &lt;code&gt;opacity&lt;/code&gt;:&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="nc"&gt;.dropdown-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;visibility&lt;/span&gt; &lt;span class="m"&gt;0.2s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dropdown&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nc"&gt;.dropdown-content&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="nc"&gt;.dropdown&lt;/span&gt;&lt;span class="nd"&gt;:focus-within&lt;/span&gt; &lt;span class="nc"&gt;.dropdown-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;visible&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&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;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Z-Index:&lt;/strong&gt; Dropdowns often appear behind other elements. Ensure the parent has a high enough &lt;code&gt;z-index&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hover Gaps:&lt;/strong&gt; If there's a gap between the button and the menu, moving the mouse across the gap will close the menu. Add a transparent padding to bridge the gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile:&lt;/strong&gt; Hover doesn't exist on touch devices. You need a click-based JavaScript toggle for mobile menus.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Visual Way
&lt;/h2&gt;

&lt;p&gt;Writing multi-level CSS dropdowns, handling focus states, and ensuring accessibility is complex.&lt;/p&gt;

&lt;p&gt;If you want to design, test, and export accessible multi-level CSS dropdown navigation menus visually, I built a free CSS Dropdown Menu Builder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visually designs multi-level dropdowns&lt;/li&gt;
&lt;li&gt;Handles hover and focus triggers&lt;/li&gt;
&lt;li&gt;Exports accessible CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/css-dropdown-menu" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's the hardest part of building navigation menus for you? Let me know in the comments.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>a11y</category>
    </item>
    <item>
      <title>How to Convert TSV Data into TOML Configuration Files</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Mon, 02 Nov 2026 08:40:46 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-convert-tsv-data-into-toml-configuration-files-4h0p</link>
      <guid>https://dev.to/kandz/how-to-convert-tsv-data-into-toml-configuration-files-4h0p</guid>
      <description>&lt;p&gt;Converting TSV spreadsheet data into a TOML config file by hand is a headache.&lt;/p&gt;

&lt;p&gt;One wrong bracket and the whole file breaks. You forget a quote. The parser fails. You spend twenty minutes hunting for a missing &lt;code&gt;]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's look at why TOML is useful and how to convert your tabular data into it safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why TOML?
&lt;/h2&gt;

&lt;p&gt;TOML (Tom's Obvious, Minimal Language) is a configuration file format designed to be easy to read and write. It's heavily used in modern development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rust:&lt;/strong&gt; &lt;code&gt;Cargo.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; &lt;code&gt;pyproject.toml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hugo:&lt;/strong&gt; Site configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netlify:&lt;/strong&gt; &lt;code&gt;netlify.toml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike JSON, TOML supports comments and is much easier for humans to read and edit manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  The TSV to TOML Problem
&lt;/h2&gt;

&lt;p&gt;TSV (Tab-Separated Values) is flat. It's just rows and columns. TOML is hierarchical. It has sections (tables) and key-value pairs.&lt;/p&gt;

&lt;p&gt;If your TSV looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name    version description
my-app  1.0.0   A cool tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need to convert it to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"my-app"&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.0.0"&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"A cool tool"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doing this manually means carefully typing brackets, adding quotes around strings, and ensuring the data types are correct. If you have 100 rows, it's a nightmare.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code Way (JavaScript)
&lt;/h2&gt;

&lt;p&gt;If you're writing a script, you can parse the TSV and build a TOML string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tsvToToml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tsvString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tsvString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;toml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[config]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&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="c1"&gt;// Add quotes around string values&lt;/span&gt;
    &lt;span class="nx"&gt;toml&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;"\n`&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="nx"&gt;toml&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;This handles basic key-value pairs. But if your TSV represents nested data (e.g., multiple &lt;code&gt;[tables]&lt;/code&gt;), the logic gets much more complex.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Types:&lt;/strong&gt; TOML is strict about types. Strings need quotes (&lt;code&gt;"value"&lt;/code&gt;), integers don't (&lt;code&gt;123&lt;/code&gt;), and booleans are lowercase (&lt;code&gt;true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Special Characters:&lt;/strong&gt; If your TSV data contains double quotes, you have to escape them in TOML (&lt;code&gt;\"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nested Tables:&lt;/strong&gt; TOML uses &lt;code&gt;[table.subtable]&lt;/code&gt; syntax. Flat TSV data doesn't easily map to this without custom logic.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Visual Way
&lt;/h2&gt;

&lt;p&gt;If you just need to convert a spreadsheet into a TOML config file without writing a custom script, I built a free TSV to TOML Converter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Converts TSV data into structured TOML&lt;/li&gt;
&lt;li&gt;Handles nested configurations automatically&lt;/li&gt;
&lt;li&gt;Outputs clean, human-readable format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No installation&lt;/li&gt;
&lt;li&gt;No upload (100% client-side)&lt;/li&gt;
&lt;li&gt;Saves you from typing brackets and quotes&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/tsv-to-toml" rel="noopener noreferrer"&gt;TSV to TOML Converter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's your preferred configuration format? Do you use TOML, YAML, or JSON? Let me know in the comments.&lt;/p&gt;

</description>
      <category>data</category>
      <category>programming</category>
      <category>webdev</category>
      <category>toml</category>
    </item>
    <item>
      <title>How to Replace Values in a JSON Array (Without Breaking It)</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Sun, 01 Nov 2026 10:13:18 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-replace-values-in-a-json-array-without-breaking-it-461k</link>
      <guid>https://dev.to/kandz/how-to-replace-values-in-a-json-array-without-breaking-it-461k</guid>
      <description>&lt;p&gt;Replacing values in a JSON array depends on whether you know the exact index of the item or if you need to search for it based on a property.&lt;/p&gt;

&lt;p&gt;Doing it wrong can mutate your original data or break the structure entirely. Let's look at the right way to do it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Replacing by Index
&lt;/h2&gt;

&lt;p&gt;If you know exactly which item in the array you want to change, you can target it directly by its index.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&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;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&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="c1"&gt;// Replace the second item entirely&lt;/span&gt;
&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Robert&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Replacing a Property in an Object (using &lt;code&gt;map&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;If you want to keep the array structure but update a specific property across all items, use &lt;code&gt;map()&lt;/code&gt;. This creates a new array, which is best practice if you want to avoid mutating the original data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updatedUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&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="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Robert&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;user&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;
  
  
  3. Finding and Replacing in Deeply Nested Arrays
&lt;/h2&gt;

&lt;p&gt;If your JSON has arrays inside objects inside arrays, a simple &lt;code&gt;.map()&lt;/code&gt; won't be enough. You need a recursive function to traverse the entire structure and replace the value wherever it's found.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;replaceDeep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replacement&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="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&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="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;replaceDeep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replacement&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;obj&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;replaceDeep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;replacement&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="nx"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// If the current value matches the target, replace it&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;replacement&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;obj&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;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reference vs Value:&lt;/strong&gt; If you are replacing objects, make sure you are creating a new object (&lt;code&gt;{ ...obj }&lt;/code&gt;) rather than just modifying the reference, or you might accidentally mutate the original JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regex vs String:&lt;/strong&gt; Simple &lt;code&gt;.replace()&lt;/code&gt; only replaces the &lt;em&gt;first&lt;/em&gt; match in a string. If you want to replace all occurrences, you need a global regex (&lt;code&gt;/target/g&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Null values:&lt;/strong&gt; Remember that &lt;code&gt;typeof null === 'object'&lt;/code&gt;, so you must check for &lt;code&gt;obj !== null&lt;/code&gt; before recursing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Visual Way
&lt;/h2&gt;

&lt;p&gt;Writing recursive scripts is fine for code, but if you just need to replace a specific value or pattern across a massive JSON payload once, writing a script is overkill.&lt;/p&gt;

&lt;p&gt;If you want to find and batch replace targeted values, patterns, or data types across nested JSON visually, I built a free JSON Value Replacer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/json-value-replacer" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;Have you ever accidentally mutated a JSON object and spent hours debugging it? Let me know in the comments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>json</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Plot Data Using SVG on the Web</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Sat, 31 Oct 2026 08:45:39 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-plot-data-using-svg-on-the-web-647</link>
      <guid>https://dev.to/kandz/how-to-plot-data-using-svg-on-the-web-647</guid>
      <description>&lt;p&gt;The "best" way to plot data using SVG depends on how much data you have and how much control you want over the visuals.&lt;/p&gt;

&lt;p&gt;There are three main approaches, ranging from pure code to powerful libraries. Let's look at them.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. D3.js (Maximum Control)
&lt;/h2&gt;

&lt;p&gt;D3 is the industry standard for custom data visualization on the web. It doesn't render the chart for you; instead, it binds your data to the DOM and gives you helper functions to map values to SVG coordinates.&lt;/p&gt;

&lt;p&gt;You use &lt;code&gt;d3.line()&lt;/code&gt; to convert an array of data points into the &lt;code&gt;d&lt;/code&gt; attribute of an SVG &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;line&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;xScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;y&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;yScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path&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="nf"&gt;datum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blue&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="nf"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fill&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Highly customized, complex, or interactive visualizations.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Charting Libraries (Speed)
&lt;/h2&gt;

&lt;p&gt;If you don't want to build axes, tooltips, and legends from scratch, use a library that outputs SVG.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chart.js:&lt;/strong&gt; Easy to use, great for standard charts (line, bar, pie).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recharts (React):&lt;/strong&gt; Built on top of D3, but uses React components so it fits perfectly into React apps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ApexCharts:&lt;/strong&gt; Great for interactive, modern-looking dashboards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Standard dashboards where you need to move fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Vanilla SVG + JavaScript (For simple shapes)
&lt;/h2&gt;

&lt;p&gt;If you just need to draw a simple line or a few polygons, you don't need a library. You can manipulate the SVG DOM directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElementNS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://www.w3.org/2000/svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;y1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;y2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;100&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;stroke&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;black&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Simple icons, static diagrams, or minimal custom graphics.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Manual Coordinate Problem
&lt;/h2&gt;

&lt;p&gt;Even if you use a library, you often need to hand-code specific SVG shapes (like custom polylines or annotations). &lt;/p&gt;

&lt;p&gt;Calculating exact &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; coordinates for a polyline by hand is tedious. You write numbers, reload the browser, realize the line is off by 10 pixels, and repeat. &lt;/p&gt;

&lt;p&gt;If you need to visually plot, adjust, and inspect SVG line or polyline vector coordinates with real-time markup export, I built a free SVG Line Coordinates Editor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/svg-line-coordinates" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's your preferred library for data visualization? Let me know in the comments.&lt;/p&gt;

</description>
      <category>svg</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to Add a Border in CSS Without Changing Element Size</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Fri, 30 Oct 2026 08:34:05 +0000</pubDate>
      <link>https://dev.to/kandz/how-to-add-a-border-in-css-without-changing-element-size-4jd0</link>
      <guid>https://dev.to/kandz/how-to-add-a-border-in-css-without-changing-element-size-4jd0</guid>
      <description>&lt;p&gt;Using CSS &lt;code&gt;border&lt;/code&gt; is the standard way to outline an element. But it has a side effect that breaks layouts: &lt;strong&gt;borders add to the element's total width and height.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have a 100px wide &lt;code&gt;div&lt;/code&gt; and add a 5px border, it suddenly becomes 110px wide. In a tight grid or flexbox layout, this causes elements to overflow or wrap unexpectedly.&lt;/p&gt;

&lt;p&gt;You can fix this globally by setting &lt;code&gt;box-sizing: border-box&lt;/code&gt;, but sometimes you need a border that doesn't take up &lt;em&gt;any&lt;/em&gt; space at all, or you want multiple borders on a single element.&lt;/p&gt;

&lt;p&gt;The solution is to use &lt;code&gt;box-shadow&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Borders
&lt;/h2&gt;

&lt;p&gt;Here is a standard box:&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="nc"&gt;.box&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nx"&gt;blue&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;Total width: 104px. Total height: 104px.&lt;/p&gt;

&lt;p&gt;If you're positioning this element absolutely, or fitting it into a strict grid, those extra 4 pixels matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Hard Box Shadows
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;box-shadow&lt;/code&gt; is normally used for fuzzy drop shadows, but if you set the &lt;code&gt;blur&lt;/code&gt; and &lt;code&gt;spread&lt;/code&gt; values correctly, it acts as a solid border.&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="nc"&gt;.shadow-border&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c"&gt;/* x-offset | y-offset | blur | spread | color */&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nx"&gt;blue&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;Total width: 100px. Total height: 100px.&lt;/p&gt;

&lt;p&gt;Because shadows are drawn &lt;em&gt;outside&lt;/em&gt; the box model and don't affect layout, the element's dimensions remain exactly 100x100.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Inset Shadow
&lt;/h2&gt;

&lt;p&gt;You can also use box-shadow to draw inside the element. Add the &lt;code&gt;inset&lt;/code&gt; keyword.&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="nc"&gt;.inner-shadow&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="nf"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.15&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;This creates a recessed, "pushed-in" look, useful for input fields or pressed buttons.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layering Multiple Borders
&lt;/h2&gt;

&lt;p&gt;The real power of &lt;code&gt;box-shadow&lt;/code&gt; is that it accepts a comma-separated list. You can stack multiple borders on a single element.&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="nc"&gt;.multi-border&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nx"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="nx"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt; &lt;span class="nx"&gt;green&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;This creates three distinct borders without adding a single wrapper &lt;code&gt;div&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Border Radius:&lt;/strong&gt; Box shadows follow the &lt;code&gt;border-radius&lt;/code&gt; of the element. If your element is round, your shadow borders will be round.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clipping:&lt;/strong&gt; If the parent container has &lt;code&gt;overflow: hidden&lt;/code&gt;, the outer shadow borders will get clipped and disappear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility:&lt;/strong&gt; Focus states using &lt;code&gt;box-shadow&lt;/code&gt; are fine visually, but make sure they are distinct enough for keyboard users.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prototyping Visually
&lt;/h2&gt;

&lt;p&gt;Writing shadow borders by hand is tricky. You have to guess the spread and offset values, and one typo makes the border look fuzzy instead of crisp.&lt;/p&gt;

&lt;p&gt;If you want to design and test multi-layered borders using CSS &lt;code&gt;box-shadow&lt;/code&gt; without altering the box model, I built a free CSS Shadow Borders Designer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designs crisp, multi-layered borders using &lt;code&gt;box-shadow&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Previews them without altering DOM dimensions&lt;/li&gt;
&lt;li&gt;Exports clean CSS instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/css-shadow-borders" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;Do you use &lt;code&gt;box-shadow&lt;/code&gt; for borders, or do you rely on &lt;code&gt;border&lt;/code&gt; and &lt;code&gt;box-sizing&lt;/code&gt;? Let me know in the comments.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>design</category>
    </item>
    <item>
      <title>Core Web Stack</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Thu, 29 Oct 2026 10:37:03 +0000</pubDate>
      <link>https://dev.to/kandz/core-web-stack-4i4n</link>
      <guid>https://dev.to/kandz/core-web-stack-4i4n</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Core Web Stack&lt;/strong&gt; path covers the essential foundation required to design, build, and deploy modern web applications. From understanding basic web protocols and standard client-side markup to building REST APIs, managing source code with version control, and handling package dependencies, this roadmap provides a complete developer toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorials
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;01. Internet Beginner ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/servers-self-hosting/internet/internet-beginner/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Learn how the web works, including client-server architecture, HTTP request-response cycles, and basic networking concepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;02. HTML ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/html/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Master semantic markup, document structure, accessibility standards, and web form fundamentals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;03. CSS ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/css/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Build responsive layouts using modern styling, Flexbox, CSS Grid, and custom properties.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;04. JavaScript ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/languages/javascript/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Learn core programming concepts, DOM manipulation, asynchronous execution, and modern ES6+ features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;05. REST API ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/servers-self-hosting/networking-dns/rest-api/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Design, consume, and secure scalable web services using HTTP standards and JSON data formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;06. Version Control ✅&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/git/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Track changes, manage branches, handle merge conflicts, and maintain clean project histories locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VCS Hosting&lt;/strong&gt; &lt;em&gt;(Choose one of the following; GitHub is recommended)&lt;/em&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/github/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Host repositories, collaborate using Pull Requests, conduct code reviews, and automate workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/version-control/gitlab/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Manage projects, maintain codebases, run integrated CI/CD pipelines, and manage private registries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;07. Package Managers ✅&lt;/strong&gt; &lt;em&gt;(Choose one of the following; npm is recommended)&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/npm/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Manage project dependencies, automate tasks with scripts, handle versioning, and publish packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yarn ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/yarn/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Speed up package installations, manage locks efficiently, and utilize workspaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pnpm  ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/pnpm/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Save disk space and boost performance using a content-addressable store and strict dependency trees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bun  ✅:&lt;/strong&gt; &lt;a href="https://tuts.kandz.me/category/programming/tools-programming/bun/" rel="noopener noreferrer"&gt;Start Now&lt;/a&gt; — Run JavaScript/TypeScript applications natively with an ultra-fast, all-in-one package manager and runtime toolkit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>JavaScript String Concatenation: `+` vs Template Literals vs .join()</title>
      <dc:creator>kandz</dc:creator>
      <pubDate>Thu, 29 Oct 2026 08:50:47 +0000</pubDate>
      <link>https://dev.to/kandz/javascript-string-concatenation-vs-template-literals-vs-join-47kg</link>
      <guid>https://dev.to/kandz/javascript-string-concatenation-vs-template-literals-vs-join-47kg</guid>
      <description>&lt;p&gt;The "best" way to concatenate strings in JavaScript depends on what you're doing, but for modern JavaScript, &lt;strong&gt;template literals&lt;/strong&gt; are usually the cleanest and most readable option.&lt;/p&gt;

&lt;p&gt;Let's break down the three main methods, their performance, and when to use each.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Template Literals (ES6+)
&lt;/h2&gt;

&lt;p&gt;Use backticks and &lt;code&gt;${}&lt;/code&gt; to embed variables directly into a string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Smith&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Hello, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is generally the best approach because it's readable, avoids messy quote escaping, and allows for multi-line strings without special characters.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The &lt;code&gt;+&lt;/code&gt; Operator
&lt;/h2&gt;

&lt;p&gt;The classic way. It works fine for simple combinations but gets messy fast.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello, &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have lots of variables or need to mix single and double quotes, it becomes hard to read.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Array &lt;code&gt;.join()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Best for concatenating a large list of items or when building strings in a loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is highly performant for large datasets because you aren't creating a new string in memory with every single concatenation operation.&lt;/p&gt;




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

&lt;p&gt;In older browsers, &lt;code&gt;+&lt;/code&gt; was slow for large loops because strings are immutable. Every time you concatenate, it creates a new string in memory. Array &lt;code&gt;.join()&lt;/code&gt; was the standard performance fix.&lt;/p&gt;

&lt;p&gt;However, modern JavaScript engines (like V8 in Chrome and Node.js) have optimized the &lt;code&gt;+&lt;/code&gt; operator using "ropes" (a data structure that defers string copying). In most modern environments, template literals and &lt;code&gt;+&lt;/code&gt; are fast enough for everyday use.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to use which
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Template literals:&lt;/strong&gt; Default choice for 99% of cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;+&lt;/code&gt; operator:&lt;/strong&gt; Simple, single-line combinations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.join()&lt;/code&gt;:&lt;/strong&gt; Huge loops or building strings from arrays.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Converting Legacy Code
&lt;/h2&gt;

&lt;p&gt;If you're modernizing a codebase, converting old &lt;code&gt;+&lt;/code&gt; concatenations to template literals makes the code much easier to read. But doing it by hand for hundreds of lines is error-prone—it's easy to miss a backtick or a dollar sign.&lt;/p&gt;

&lt;p&gt;If you want to quickly convert standard string concatenation into ES6 template literals (or vice versa), I built a free JS String Concatenation Utility.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tools.kandz.me/js-string-concatenation" rel="noopener noreferrer"&gt;Try it here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;100% client-side. Nothing uploaded.&lt;/p&gt;




&lt;p&gt;What's your go-to method for string concatenation? Do you use template literals exclusively, or do you still use &lt;code&gt;+&lt;/code&gt;? Let me know in the comments.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>es6</category>
    </item>
  </channel>
</rss>
