<?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: sharath mohan</title>
    <description>The latest articles on DEV Community by sharath mohan (@sharathmohan007).</description>
    <link>https://dev.to/sharathmohan007</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%2F380673%2Fb39e9710-954e-4fd1-a2c6-441709cf259c.jpg</url>
      <title>DEV Community: sharath mohan</title>
      <link>https://dev.to/sharathmohan007</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sharathmohan007"/>
    <language>en</language>
    <item>
      <title>Stop Copying shadcn Components Across Projects — Use This Turborepo Starter Instead</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:45:02 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/stop-copying-shadcn-components-across-projects-use-this-turborepo-starter-instead-3ma1</link>
      <guid>https://dev.to/sharathmohan007/stop-copying-shadcn-components-across-projects-use-this-turborepo-starter-instead-3ma1</guid>
      <description>&lt;p&gt;You know the drill.&lt;/p&gt;

&lt;p&gt;You build a beautiful set of shadcn/ui components for Project A — a Button, a Card, a Dialog with custom animations. Then Project B kicks off. You copy the files over. Then Project C. Then a subtle bug is found in the Button. Now you're patching it in three places.&lt;/p&gt;

&lt;p&gt;This is the classic monorepo problem, and it's exactly what I set out to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/sharath-mohan/turborepo-react-shadcn-starter" rel="noopener noreferrer"&gt;turborepo-react-shadcn-starter&lt;/a&gt;&lt;/strong&gt; is a production-ready monorepo template that wires up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turborepo&lt;/strong&gt; for workspace orchestration and intelligent build caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React + Vite&lt;/strong&gt; for the fastest possible frontend dev experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shadcn/ui&lt;/strong&gt; as a &lt;em&gt;shared package&lt;/em&gt; — write once, use everywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; across the entire workspace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; with shared config baked in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: shadcn/ui lives in &lt;code&gt;@repo/ui&lt;/code&gt;, a shared package, not inside any single app. Every app in your monorepo consumes the same components from the same source of truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Typical Setups
&lt;/h2&gt;

&lt;p&gt;Most teams drop shadcn/ui directly into a single app. That works fine until you need a second app. Then your choices are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Copy-paste&lt;/strong&gt; the components → drift and duplication immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish to npm&lt;/strong&gt; → versioning overhead for internal code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monorepo with a shared package&lt;/strong&gt; → ✅ This is the right answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Turborepo makes option 3 near-effortless, but setting it up from scratch (workspace configs, TypeScript path aliases, ESLint sharing, shadcn CLI pointing at the right package) takes a few hours of trial and error. This starter eliminates all of that.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;turborepo-react-shadcn-starter/
├── apps/
│   └── web/              # Vite + React app
├── packages/
│   ├── ui/               # @repo/ui — shared shadcn/ui components
│   ├── eslint-config/    # @repo/eslint-config
│   └── typescript-config/ # @repo/typescript-config
├── turbo.json
└── package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;apps/web&lt;/code&gt; — The Main App
&lt;/h3&gt;

&lt;p&gt;A clean Vite + React app already wired to consume components from &lt;code&gt;@repo/ui&lt;/code&gt;. No boilerplate to delete, no config to untangle.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;packages/ui&lt;/code&gt; — The Shared Component Library
&lt;/h3&gt;

&lt;p&gt;This is where all your shadcn/ui components live. The package is set up so the shadcn CLI knows exactly where to drop new components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add any shadcn component directly into the shared package&lt;/span&gt;
npx &lt;span class="nt"&gt;-w&lt;/span&gt; @repo/ui shadcn@latest add alert-dialog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every app that imports from &lt;code&gt;@repo/ui&lt;/code&gt; gets the component instantly. No copying. No syncing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared ESLint + TypeScript Configs
&lt;/h3&gt;

&lt;p&gt;Both are extracted into their own packages and extended by every app and package in the workspace. Change a lint rule once, it applies everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started in Under 2 Minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the template&lt;/span&gt;
git clone https://github.com/sharath-mohan/turborepo-react-shadcn-starter.git my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project

&lt;span class="c"&gt;# Install everything (all workspaces in one shot)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start dev servers&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Turborepo runs tasks in parallel and caches outputs intelligently — subsequent builds are dramatically faster because it only rebuilds what changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adding a Second App
&lt;/h2&gt;

&lt;p&gt;This is where monorepos shine. Scaffolding a new app that immediately has access to your entire shared UI library takes 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;&lt;span class="c"&gt;# Generate a new workspace app&lt;/span&gt;
npx turbo gen workspace &lt;span class="nt"&gt;--name&lt;/span&gt; my-dashboard

&lt;span class="c"&gt;# Or copy the existing web app as a starting point&lt;/span&gt;
npx turbo gen workspace &lt;span class="nt"&gt;--name&lt;/span&gt; my-dashboard &lt;span class="nt"&gt;--copy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your new app can immediately import from &lt;code&gt;@repo/ui&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@repo/ui/components/button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CardContent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@repo/ui/components/card&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;No extra setup. No publishing. No path hacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Remote Caching (The Turborepo Superpower)
&lt;/h2&gt;

&lt;p&gt;If you're working in a team or running CI, Turborepo's remote cache means builds are shared across machines. Your CI pipeline can skip rebuilding packages that haven't changed since the last run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx turbo login
npx turbo &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Now every engineer on the team — and your CI — shares a single build cache.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Stack Makes Sense
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast local DX&lt;/td&gt;
&lt;td&gt;Vite HMR — updates in milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared UI components&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@repo/ui&lt;/code&gt; — single source of truth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type safety&lt;/td&gt;
&lt;td&gt;TypeScript across all apps + packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code quality&lt;/td&gt;
&lt;td&gt;Shared ESLint config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build performance&lt;/td&gt;
&lt;td&gt;Turborepo task graph + caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Add apps without touching existing code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Teams building &lt;strong&gt;multiple frontend apps&lt;/strong&gt; that share design system components&lt;/li&gt;
&lt;li&gt;Developers tired of &lt;strong&gt;duplicating UI code&lt;/strong&gt; across projects&lt;/li&gt;
&lt;li&gt;Anyone who wants to adopt a &lt;strong&gt;monorepo architecture&lt;/strong&gt; without the setup cost&lt;/li&gt;
&lt;li&gt;Frontend leads looking for a &lt;strong&gt;clean starting point&lt;/strong&gt; for a new platform&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm planning to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Storybook integration for the shared UI package&lt;/li&gt;
&lt;li&gt;[ ] Playwright e2e testing setup&lt;/li&gt;
&lt;li&gt;[ ] Docker + CI/CD workflow examples&lt;/li&gt;
&lt;li&gt;[ ] Additional shadcn/ui components pre-included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these would be useful to you — or if you have other ideas — open an issue or drop a comment below.&lt;/p&gt;




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

&lt;p&gt;The template is open source and ready to use:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/sharath-mohan/turborepo-react-shadcn-starter" rel="noopener noreferrer"&gt;github.com/sharath-mohan/turborepo-react-shadcn-starter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If it saves you setup time, a ⭐ on GitHub goes a long way — it helps more developers discover it.&lt;/p&gt;

&lt;p&gt;Contributions, feedback, and PRs are all welcome. Let's make the scaffolding part of monorepos a solved problem.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Turborepo, React, Vite, shadcn/ui, and TypeScript.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>turborepo</category>
      <category>react</category>
      <category>shadcn</category>
      <category>monorepo</category>
    </item>
    <item>
      <title>Why CSS Still Rocks in 2024</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Tue, 10 Dec 2024 18:28:24 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/why-css-still-rocks-in-2024-446i</link>
      <guid>https://dev.to/sharathmohan007/why-css-still-rocks-in-2024-446i</guid>
      <description>&lt;p&gt;Love it or hate it, CSS continues to prove its worth. The past year has been a rollercoaster in the world of software engineering, with AI seemingly poised to take over our jobs. Yet, despite the rise of automation, CSS remains an essential skill that evolves alongside technology.  &lt;/p&gt;

&lt;p&gt;Remember when we used to joke about AI being "too dumb to center a div"? Well, times have changed—and so has CSS. Let’s explore some exciting new features that make CSS more powerful than ever.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;Align Content&lt;/strong&gt;: Centering Made Easy
&lt;/h2&gt;

&lt;p&gt;Gone are the days when you &lt;em&gt;had&lt;/em&gt; to rely on Flexbox or Grid to center a div. With the &lt;code&gt;align-content&lt;/code&gt; property, CSS now offers a simpler and more direct way to handle alignment.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/align-content" rel="noopener noreferrer"&gt;Learn more about &lt;code&gt;align-content&lt;/code&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;@property&lt;/strong&gt;: Dynamic Custom Properties
&lt;/h2&gt;

&lt;p&gt;CSS variables introduced us to reusable variable names, but the &lt;code&gt;@property&lt;/code&gt; feature takes this a step further. It allows developers to define custom properties with explicit rules, making animations and theming more predictable and flexible.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@property" rel="noopener noreferrer"&gt;Learn more about &lt;code&gt;@property&lt;/code&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;@starting-style&lt;/strong&gt;: Simplifying Transitions
&lt;/h2&gt;

&lt;p&gt;Transitioning from &lt;code&gt;display: block&lt;/code&gt; to &lt;code&gt;display: none&lt;/code&gt; while maintaining animations used to be a headache. Enter &lt;code&gt;@starting-style&lt;/code&gt;—a new feature that makes it easier to define styles at the start of a transition.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style" rel="noopener noreferrer"&gt;Learn more about &lt;code&gt;@starting-style&lt;/code&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;Light-Dark Function&lt;/strong&gt;: Native Theme Switching
&lt;/h2&gt;

&lt;p&gt;Many developers use JavaScript to manage light and dark modes, but CSS now offers a built-in &lt;code&gt;light-dark&lt;/code&gt; function. This simplifies theme management, reducing reliance on external scripts.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📖 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark" rel="noopener noreferrer"&gt;Learn more about &lt;code&gt;light-dark&lt;/code&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Honoring Rebecca Purple: A Tribute to CSS History
&lt;/h2&gt;

&lt;p&gt;One of the most exciting updates this year isn’t a feature—it’s a tribute. The CSS logo has adopted the color &lt;strong&gt;Rebecca Purple&lt;/strong&gt; (&lt;code&gt;#663399&lt;/code&gt;) to honor Rebecca Alison Meyer, daughter of CSS pioneer Eric Meyer. This thoughtful change celebrates the human stories behind the technology we use every day.  &lt;/p&gt;




&lt;p&gt;CSS continues to evolve, introducing features that make our lives easier while honoring its rich history. Whether you're a fan or a skeptic, one thing is clear: CSS still rocks!  &lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>programming</category>
      <category>news</category>
    </item>
    <item>
      <title>Setup Prettier with Vite &amp; VS Code</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Tue, 01 Nov 2022 06:11:30 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/setup-prettier-with-vite-vs-code-3fme</link>
      <guid>https://dev.to/sharathmohan007/setup-prettier-with-vite-vs-code-3fme</guid>
      <description>&lt;p&gt;Lets face it code formatting is real pain, specially when working on shared projects. Fortunately we have got prettier to solve this problem. This is article is a short guide for setting up prettier in Visual Studio Code, But IDE would do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Prettier?
&lt;/h2&gt;

&lt;p&gt;Prettier is an opinionated code formatter, for many languages,like Javacript, CSS, JSX.. (mostly all client side tools) and also can be extended to other languages with community plugins&lt;/p&gt;

&lt;h2&gt;
  
  
  Time to setup
&lt;/h2&gt;

&lt;p&gt;I will scaffold a quick react typescript project using vite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create vite@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install prettier
&lt;/h2&gt;

&lt;p&gt;Install prettier as a dev dependency, this helps us to configure prettier on a per page project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; &lt;span class="nt"&gt;--save-exact&lt;/span&gt; prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create file name .prettierrc.json
&lt;/h2&gt;

&lt;p&gt;This will act as the configuration file for prettier. It can be configured using json, YAML or javascript I will be using json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"tabWidth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"semi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"singleQuote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arrowParens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"avoid"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would format the code by using a tab space of 2, adding semi colons at the end of all line endings, using single quotes instead of double, and omits parathesis in arrow functions whenever possible&lt;/p&gt;

&lt;p&gt;More rules can be found &lt;a href="https://prettier.io/docs/en/options.html"&gt;Rules&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;now you can run prettier using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prettier &lt;span class="nt"&gt;--write&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great!, but can still do better, instead of manually running the configuration we can setup our IDE/Text Editor to help us out.&lt;/p&gt;

&lt;p&gt;I am giving the guide for VS Code&lt;/p&gt;

&lt;h2&gt;
  
  
  Install the prettier extension
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode"&gt;VS code extension&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Settings
&lt;/h2&gt;

&lt;p&gt;You can quickly configure the settings by using settings.json file&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;CMD+OPTION+P&lt;/strong&gt; or  &lt;strong&gt;CTRL+ALT+P&lt;/strong&gt; and type in &lt;strong&gt;open settings json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"editor.defaultFormatter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"esbenp.prettier-vscode"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnPaste"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will use the formatting option as prettier and follow the configuration set in the configuration file created earlier and also apply formatting when you save or paste a code.&lt;/p&gt;

&lt;p&gt;Bam !! &lt;/p&gt;

&lt;p&gt;But what if you need to ignore certain files from formatting say the package-lock.json or the dist/build files. That where .prettierignore comes into play&lt;/p&gt;

&lt;p&gt;Create a file called .prettierignore. This works similar to .gitignore and you can follow the same setup&lt;/p&gt;

&lt;p&gt;Hope you guys loved it. This is the first part of setting up a good DX using Vite and React. eventually reaching &lt;a href="https://github.com/sharath-mohan/react-dx-template"&gt;https://github.com/sharath-mohan/react-dx-template&lt;/a&gt; this template.&lt;/p&gt;

&lt;p&gt;If you liked this article, a star on the github repo would be awesome &lt;/p&gt;

</description>
      <category>vite</category>
      <category>vscode</category>
      <category>prettier</category>
      <category>javascript</category>
    </item>
    <item>
      <title>File Upload in React</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Thu, 11 Aug 2022 15:56:43 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/file-upload-in-react-1j2k</link>
      <guid>https://dev.to/sharathmohan007/file-upload-in-react-1j2k</guid>
      <description>&lt;p&gt;Working with file upload is one of those things you somehow wind up doing. Here is a small article on doing the same in React&lt;br&gt;
First of all, we need to understand on how &lt;strong&gt;refs&lt;/strong&gt; work in React. Ref's act as pointers on DOM elements, like how you would be selecting an element using say&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tqpn4fh2ai7sd0ya3iu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9tqpn4fh2ai7sd0ya3iu.png" alt="docuemnt is selector"&gt;&lt;/a&gt;&lt;br&gt;
and the &lt;strong&gt;useContext&lt;/strong&gt; Hook to manage those ref's&lt;/p&gt;

&lt;p&gt;In this example, I have created a ref called inputRef that is connected to the input element, each element connected to the ref can a current property on which you can use all the properties supported by that element, in this case value&lt;/p&gt;

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

&lt;p&gt;lets add the FileType, FormData and fetch API&lt;/p&gt;

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

</description>
      <category>react</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Chrome Extensions to make your life with css easy</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Mon, 04 Jul 2022 10:41:39 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/chrome-extensions-to-make-your-life-with-css-easy-1ej</link>
      <guid>https://dev.to/sharathmohan007/chrome-extensions-to-make-your-life-with-css-easy-1ej</guid>
      <description>&lt;p&gt;Working with CSS can be a brain-drainer, and it is not a hidden fact. Here are few chrome extensions that can make life easy when working and debugging css&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Whatfont&lt;/strong&gt;&lt;br&gt;
Ever wondered what is that awesome font that you find on a site that you just visited, &lt;a href="https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm"&gt;whatfont&lt;/a&gt; can help you find it in a giffy&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3DyvQ3O0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/CyGmJzJBUyaEwgAlsTqiCVRrkhKQpEaDHiXGLIbjJnQIz4txsgGuo-cNTeRDI2ljxAHjJFjM72xXTtJfvZrDx50Fnw%3Dw640-h400-e365-rj-sc0x00ffffff" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3DyvQ3O0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/CyGmJzJBUyaEwgAlsTqiCVRrkhKQpEaDHiXGLIbjJnQIz4txsgGuo-cNTeRDI2ljxAHjJFjM72xXTtJfvZrDx50Fnw%3Dw640-h400-e365-rj-sc0x00ffffff" alt="whatfont" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Visbug&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/visbug/cdockenadnadldjbbgcallicgledbeoc"&gt;Visbug&lt;/a&gt; is what I could call the swiss amry knife of a web developer, it providers easy inspection, modification of a web page&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0lXayNiH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://portalzine.de/wp-content/uploads/sites/3/2019/02/visbug_browser_design_tool.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0lXayNiH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://portalzine.de/wp-content/uploads/sites/3/2019/02/visbug_browser_design_tool.jpg" alt="visbug" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. CSS peeper&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/css-peeper/mbnbehikldjhnfehhnaidhjhoofhpehk"&gt;CSS peeper&lt;/a&gt; helps you to look into the web pages assets and styles without ever opening up your inspector&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oeJ9dk4R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mac-cdn.softpedia.com/screenshots/CSS-Peeper_2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oeJ9dk4R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mac-cdn.softpedia.com/screenshots/CSS-Peeper_2.jpg" alt="css peeper" width="880" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Emmet re:view&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://chrome.google.com/webstore/detail/emmet-review/epejoicbhllgiimigokgjdoijnpaphdp"&gt;Emmet Re:view&lt;/a&gt;,is the easiest way to check the responsiveness of a website&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--unHbJZ0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/og19ii-_XXkaIYDepWFufuHFLlRIbcMyvJLuQRrXjHoO9jIE3GkiZ7DlPnEg1tPtHifJHUrXJ_Q4xBLmXRDHQ341Mkc%3Dw640-h400-e365-rj-sc0x00ffffff" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--unHbJZ0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lh3.googleusercontent.com/og19ii-_XXkaIYDepWFufuHFLlRIbcMyvJLuQRrXjHoO9jIE3GkiZ7DlPnEg1tPtHifJHUrXJ_Q4xBLmXRDHQ341Mkc%3Dw640-h400-e365-rj-sc0x00ffffff" alt="emmet" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding!!&lt;/p&gt;

</description>
      <category>css</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Make your Git Commit Messages better</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Tue, 28 Jun 2022 06:21:04 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/make-your-git-commit-messages-better-1mco</link>
      <guid>https://dev.to/sharathmohan007/make-your-git-commit-messages-better-1mco</guid>
      <description>&lt;p&gt;Have you wondered how the make awesome commit messages in open source projects?. Here’s how you can also make your git commit messages better&lt;br&gt;
I am huge fan of&lt;a href="https://angular.io/"&gt; Angular&lt;/a&gt; and digging through the contribution guidelines of the project I found a specific pattern, and after a brief search I came across this guideline called &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;conventional commits&lt;/a&gt;, they say&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A specification for adding human and machine readable meaning to commit messages&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9gw9Wz08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iheegmskpap2dlg4l26x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9gw9Wz08--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iheegmskpap2dlg4l26x.gif" alt="whats special" width="498" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so whats special here?&lt;/p&gt;

&lt;p&gt;The idea is to organize your commit messages, by using a standard specification, and your commit message would look somewhat 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;&amp;lt;type&amp;gt;[optional scope]: &amp;lt;description&amp;gt;

[optional body]

[optional footer(s)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commit contains the following structural elements, to communicate intent to the consumers of your library:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fix: a commit of the type fix patches a bug in your codebase (this correlates with PATCH in Semantic Versioning).&lt;/li&gt;
&lt;li&gt;feat: a commit of the type feat introduces a new feature to the codebase (this correlates with MINOR in Semantic Versioning).&lt;/li&gt;
&lt;li&gt;BREAKING CHANGE: a commit that has a footer BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in Semantic Versioning). A BREAKING CHANGE can be part of commits of any type.&lt;/li&gt;
&lt;li&gt;types other than fix: and feat: are allowed, for example @commitlint/config-conventional (based on the the Angular convention) recommends build:, chore:, ci:, docs:, style:, refactor:, perf:, test:, and others.&lt;/li&gt;
&lt;li&gt;footers other than BREAKING CHANGE:  may be provided and follow a convention similar to git trailer format.&lt;/li&gt;
&lt;li&gt;Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE). A scope may be provided to a commit’s type, to provide additional contextual information and is contained within parenthesis, e.g., feat(parser): add ability to parse arrays.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now why should I use this? …&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically generating CHANGELOGs.&lt;/li&gt;
&lt;li&gt;Automatically determining a semantic version bump (based on the types of commits landed).&lt;/li&gt;
&lt;li&gt;Communicating the nature of changes to teammates, the public, and other stakeholders.&lt;/li&gt;
&lt;li&gt;Triggering build and publish processes.&lt;/li&gt;
&lt;li&gt;Making it easier for people to contribute to your projects, by allowing them to explore a more structured commit history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QZ7p0ovY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4lr4aw2ug14xj76d04bc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QZ7p0ovY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4lr4aw2ug14xj76d04bc.gif" alt="easy commits" width="220" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It sure has made my life easy  while merging code, and boarding new people to the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Happy Coding!!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>programming</category>
      <category>productivity</category>
      <category>git</category>
    </item>
    <item>
      <title>Nginx configuration for Angular2+ Deployment</title>
      <dc:creator>sharath mohan</dc:creator>
      <pubDate>Wed, 06 May 2020 11:08:57 +0000</pubDate>
      <link>https://dev.to/sharathmohan007/nginx-configuration-for-angular2-deployment-2b94</link>
      <guid>https://dev.to/sharathmohan007/nginx-configuration-for-angular2-deployment-2b94</guid>
      <description>&lt;h2&gt;
  
  
  Quick note
&lt;/h2&gt;

&lt;p&gt;Nginx is a high performance web server with some additional capabilities such as load-balancing and reverse-proxy.&lt;br&gt;
Angular is one of the most popular framework for building single page applications.&lt;br&gt;
Angular apps can be connected to a Node js server and deployed but in most cases deployment with a simple web server would be suffice.&lt;/p&gt;

&lt;p&gt;Angular can use either of the two routing strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash Routing&lt;/li&gt;
&lt;li&gt;Path Routing (default for Angular)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Path Routing utilizes the new HTML 5 push state API for routing. Therefore we need a web server capable of working with the HTML 5 push state API.Well most web servers don’t work this way out of the box. In these cases the hash routing strategy can be used, but tends to make the URL look messy. Nginx can be configured to deploy any Angular App with HTML 5 push state API.&lt;br&gt;
Build your Angular app by using the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng build --prod 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new folder under /var/www , usually the domain name of your app, let us assume to be example.com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mkdir /var/www/example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;copy the contents /dist/appname to /var/www/example.com&lt;/p&gt;

&lt;p&gt;Nginx utilizes server blocks to host multiple domains on an single server, you to need to make certain changes to the configuration file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server{
    listen 80;
    listen [::] 80;
    server_name www.example.com example.com;
    root /var/www/example.com;
    index index.html;
    location / {
        try_files $uri$args $uri$args/ /index.html;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configurations are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx listens on port 80&lt;/li&gt;
&lt;li&gt;server name is the domain name with www and without it&lt;/li&gt;
&lt;li&gt;root points to location of the app&lt;/li&gt;
&lt;li&gt;index points to initial page to be loaded&lt;/li&gt;
&lt;li&gt;location refers path that should be pointed to on the url patterns, all routes will point to index.html, if this is not added, on refreshing the page Nginx throws a 404 error.&lt;/li&gt;
&lt;li&gt;Note: Use wildcard route pattern in angular to catch 404 errors
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const routes: Routes = [
{path:"**",component: PagenotfoundComponent}
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Nginx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo service nginx restart 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy coding !!&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>angular</category>
      <category>configuration</category>
      <category>404</category>
    </item>
  </channel>
</rss>
