<?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: Naveen R</title>
    <description>The latest articles on DEV Community by Naveen R (@naveen2070).</description>
    <link>https://dev.to/naveen2070</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1404456%2F12023491-0e79-4e94-8851-2a0256f9ff79.png</url>
      <title>DEV Community: Naveen R</title>
      <link>https://dev.to/naveen2070</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/naveen2070"/>
    <language>en</language>
    <item>
      <title>Crucible v1.1.0 — Generate UI components you actually own (React/Vue/Angular)</title>
      <dc:creator>Naveen R</dc:creator>
      <pubDate>Sat, 06 Jun 2026 08:49:36 +0000</pubDate>
      <link>https://dev.to/naveen2070/crucible-v110-generate-ui-components-you-actually-own-reactvueangular-49eo</link>
      <guid>https://dev.to/naveen2070/crucible-v110-generate-ui-components-you-actually-own-reactvueangular-49eo</guid>
      <description>&lt;h1&gt;
  
  
  Crucible v1.1.0 — The App-Building Kit Release 🚀
&lt;/h1&gt;

&lt;p&gt;Most component libraries give you a black box: install a package, fight its API, and inherit a runtime dependency you can't fully control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crucible takes the opposite approach&lt;/strong&gt; — it &lt;em&gt;generates the source code&lt;/em&gt; for components directly into your project.&lt;/p&gt;

&lt;p&gt;No runtime. You own every file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v1.1.0&lt;/code&gt; is the &lt;strong&gt;App-Building Kit&lt;/strong&gt; release.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;14 new components&lt;/strong&gt;, bringing the library to &lt;strong&gt;25&lt;/strong&gt; — Label, Separator, Badge, Skeleton, Avatar, Textarea, Checkbox, Switch, Alert, Progress (linear + circular), Breadcrumb, RadioGroup, Accordion, and a floating-ui DropdownMenu.&lt;/li&gt;
&lt;li&gt;Enough to scaffold a &lt;strong&gt;minimal SaaS app, web app, form, or marketing site&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;plug-and-play plugin architecture&lt;/strong&gt; — add your own components by dropping a manifest + templates into &lt;code&gt;.crucible/plugins/&lt;/code&gt;, with no changes to the engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every component ships across &lt;strong&gt;React / Vue / Angular × CSS / SCSS / Tailwind&lt;/strong&gt;, is token-backed, and is accessible by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-D&lt;/span&gt; @cruciblelab/crucible
npx crucible init
npx crucible add Button Card Dialog Accordion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated files land in your project as plain, readable source — edit them like code you wrote yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "you own it" matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No version-lock to a library's release cadence&lt;/li&gt;
&lt;li&gt;No fighting an opinionated API — change the markup directly&lt;/li&gt;
&lt;li&gt;No runtime footprint shipped to users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📦 &lt;strong&gt;npm:&lt;/strong&gt; &lt;code&gt;@cruciblelab/crucible&lt;/code&gt;&lt;br&gt;
📖 &lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://crucible-docs.naveenr.in" rel="noopener noreferrer"&gt;https://crucible-docs.naveenr.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What would you want generated next? Drop ideas in the comments 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Crucible v1.0 — generate React, Vue, and Angular components that you actually own</title>
      <dc:creator>Naveen R</dc:creator>
      <pubDate>Sun, 29 Mar 2026 18:02:01 +0000</pubDate>
      <link>https://dev.to/naveen2070/crucible-v10-generate-react-vue-and-angular-components-that-you-actually-own-3452</link>
      <guid>https://dev.to/naveen2070/crucible-v10-generate-react-vue-and-angular-components-that-you-actually-own-3452</guid>
      <description>&lt;p&gt;I shipped Crucible v1.0 today. It's a code generation engine — you run a CLI command, it writes production-ready component source files into your project, and then it disappears. Zero runtime footprint. You own every line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx crucible add Button
&lt;span class="c"&gt;# writes Button/Button.tsx, Button/Button.module.css,&lt;/span&gt;
&lt;span class="c"&gt;# Button/Button.types.ts, Button/README.md&lt;/span&gt;
&lt;span class="c"&gt;# into your project. yours forever.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I built it because I kept running into the ceiling of what component libraries let you do — and I wanted to see what the "no library, just code" model looked like taken further than copy-paste snippets.&lt;/p&gt;

&lt;p&gt;Here's how it works.&lt;/p&gt;




&lt;h3&gt;
  
  
  The five-layer pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crucible.config.json
  → Config Layer      read + validate with ajv
  → Token Resolver    CSS custom props + OKLCH dark mode derivation
  → Component Model   normalised IR for templates
  → Template Engine   Handlebars, strictly logic-free
  → File Writer       hash protection + Prettier formatting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The IR (intermediate representation) layer is the decision I'm happiest with. Without it, templates become conditional nightmares — &lt;code&gt;{{#if angular}}&lt;/code&gt;, &lt;code&gt;{{#if dark}}&lt;/code&gt;, &lt;code&gt;{{#if compoundComponents}}&lt;/code&gt;. With it, all that logic lives in TypeScript where it can be typed and tested. Templates become pure interpolation.&lt;/p&gt;

&lt;p&gt;Templates are audited on every build. Comparisons, ternaries, and &lt;code&gt;else-if&lt;/code&gt; chains are prohibited at the &lt;code&gt;.hbs&lt;/code&gt; level. &lt;code&gt;npm run audit:templates&lt;/code&gt; runs as a &lt;code&gt;prebuild&lt;/code&gt; hook and fails the build on any violation.&lt;/p&gt;




&lt;h3&gt;
  
  
  Token resolution
&lt;/h3&gt;

&lt;p&gt;Tokens deep-merge with your chosen preset. Set only what you want to change:&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;"theme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"minimal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tokens"&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;span class="nl"&gt;"color"&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;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#FF6B6B"&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;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;Only &lt;code&gt;primary&lt;/code&gt; changes. The rest of the minimal preset — radius, typography, backgrounds — is untouched.&lt;/p&gt;

&lt;p&gt;Everything resolves to CSS custom properties. No mode ever hard-codes a hex value:&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FF6B6B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--radius-md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--spacing-unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&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;h3&gt;
  
  
  OKLCH dark mode
&lt;/h3&gt;

&lt;p&gt;Dark tokens are derived in OKLCH, not HSL.&lt;/p&gt;

&lt;p&gt;HSL lightness shifts change perceived hue — blue can drift toward cyan, purple toward gray-purple. OKLCH is perceptually uniform: lightness changes without hue drift.&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;"darkMode"&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;span class="nl"&gt;"strategy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&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;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;That's the whole config. Crucible derives the full dark palette automatically and emits it as &lt;code&gt;[data-theme="dark"]&lt;/code&gt; CSS vars alongside the light &lt;code&gt;:root&lt;/code&gt; block.&lt;/p&gt;

&lt;p&gt;Manual override is also supported for specific tokens.&lt;/p&gt;




&lt;h3&gt;
  
  
  Framework output
&lt;/h3&gt;

&lt;p&gt;Three frameworks, three style systems — parallel template folders, no &lt;code&gt;{{#if framework}}&lt;/code&gt; anywhere in the templates themselves:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Patterns used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React 18+&lt;/td&gt;
&lt;td&gt;Hooks, CSS Modules, compound components (static property pattern)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue 3.4+&lt;/td&gt;
&lt;td&gt;Composition API, &lt;code&gt;&amp;lt;script setup&amp;gt;&lt;/code&gt;, named slots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular 17+&lt;/td&gt;
&lt;td&gt;Standalone components, &lt;code&gt;@if&lt;/code&gt;/&lt;code&gt;@for&lt;/code&gt;, &lt;code&gt;ng-content&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Style systems: &lt;code&gt;css&lt;/code&gt; (CSS Modules), &lt;code&gt;scss&lt;/code&gt; (SCSS Modules), &lt;code&gt;tailwind&lt;/code&gt; (Tailwind v4 with CSS variable arbitrary values).&lt;/p&gt;

&lt;p&gt;Adding a new framework means adding a template folder — nothing in the engine changes.&lt;/p&gt;




&lt;h3&gt;
  
  
  Hash-based overwrite protection
&lt;/h3&gt;

&lt;p&gt;Every generated file gets a content hash stored in &lt;code&gt;.crucible/manifest.json&lt;/code&gt;. On re-generation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hash matches → overwrite (file is unchanged from generated output)&lt;/li&gt;
&lt;li&gt;Hash differs → warn and skip (you've edited it; Crucible leaves it alone)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--force&lt;/code&gt; → overwrite regardless&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dry-run&lt;/code&gt; → print what would happen, write nothing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The manifest key includes the component subfolder name (&lt;code&gt;Button/Button.tsx&lt;/code&gt;) to prevent collisions across components.&lt;/p&gt;




&lt;h3&gt;
  
  
  CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crucible init              &lt;span class="c"&gt;# scaffold crucible.config.json&lt;/span&gt;
crucible add Button        &lt;span class="c"&gt;# generate one component&lt;/span&gt;
crucible add &lt;span class="nt"&gt;-a&lt;/span&gt;            &lt;span class="c"&gt;# generate all components&lt;/span&gt;
crucible add Button &lt;span class="nt"&gt;--stories&lt;/span&gt;  &lt;span class="c"&gt;# with Storybook stories&lt;/span&gt;
crucible eject             &lt;span class="c"&gt;# copy preset tokens into config for full manual control&lt;/span&gt;
crucible tokens            &lt;span class="c"&gt;# regenerate tokens.css only&lt;/span&gt;
crucible doctor            &lt;span class="c"&gt;# check Node version, config validity, framework install&lt;/span&gt;
crucible config            &lt;span class="c"&gt;# print resolved config&lt;/span&gt;
crucible clean             &lt;span class="c"&gt;# remove generated files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All commands have short aliases: &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;, &lt;code&gt;t&lt;/code&gt;, &lt;code&gt;e&lt;/code&gt;, &lt;code&gt;l&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt;, &lt;code&gt;cfg&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Components in v1.0
&lt;/h3&gt;

&lt;p&gt;Button · Input · Card · Dialog · Select&lt;/p&gt;

&lt;p&gt;Each one: full variant/size/state matrix, TypeScript types, compound components (React) / named slots (Vue) / ng-content (Angular), WCAG 2.1 AA accessibility, auto-generated README.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test coverage
&lt;/h3&gt;

&lt;p&gt;230 unit tests, 24 test files, 19 E2E phases.&lt;/p&gt;

&lt;p&gt;E2E phases cover every &lt;code&gt;framework × style-system&lt;/code&gt; combination (React/Vue/Angular × CSS/SCSS/Tailwind = 9 phases), plus write protection scenarios, batch generation, theme presets, custom output directories, and all CLI commands. Each phase runs in an isolated temp directory.&lt;/p&gt;




&lt;h3&gt;
  
  
  Repo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Naveen2070/project_crucible" rel="noopener noreferrer"&gt;github.com/Naveen2070/project_crucible&lt;/a&gt; — MIT, open from day one.&lt;/p&gt;

&lt;p&gt;Good first contributions: Textarea, Badge, Checkbox. The pattern is: add to &lt;code&gt;src/registry/manifests/defaults.ts&lt;/code&gt;, create template files in the right framework folders, run the test suite. The engine discovers new components automatically.&lt;/p&gt;

&lt;p&gt;Happy to go deep on any of the architecture decisions in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>designsystem</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
