<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alexander van Elsas</title>
    <description>The latest articles on Forem by Alexander van Elsas (@avanelsas).</description>
    <link>https://forem.com/avanelsas</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%2F3862692%2F5e74f159-9ca2-4404-8049-b700a5002d21.jpeg</url>
      <title>Forem: Alexander van Elsas</title>
      <link>https://forem.com/avanelsas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/avanelsas"/>
    <language>en</language>
    <item>
      <title>BareDom v2.0.0: 80 Components, customisable themes, responsive, and Zero Framework Tax</title>
      <dc:creator>Alexander van Elsas</dc:creator>
      <pubDate>Fri, 10 Apr 2026 20:13:04 +0000</pubDate>
      <link>https://forem.com/avanelsas/baredom-v200-80-components-customisable-themes-responsive-and-zero-framework-tax-1c3f</link>
      <guid>https://forem.com/avanelsas/baredom-v200-80-components-customisable-themes-responsive-and-zero-framework-tax-1c3f</guid>
      <description>&lt;p&gt;I’ve just released BareDom v2.0.0, and it’s the biggest update yet. BareDom has always been about "No framework, just the DOM," but v2.0.0 brings the library into a new form: a fully responsive design system powered by a centralized theming engine.&lt;/p&gt;

&lt;p&gt;If you’ve been looking for a way to build high-performance, beautiful UIs without the weight of a heavy framework, this is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The New Theming Engine: x-theme&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The star of this release is x-theme. Instead of hunting through CSS variables for every component, you can now control your entire UI through one centralized component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;br&gt;
33 Design Tokens: Precise control over typography, spacing, shadows, and colors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 Built-in Presets:&lt;/strong&gt; Instantly switch between ocean, forest, sunset, neo-brutalist, aurora, mono-ai, warm-mineral, and the default theme.&lt;/p&gt;

&lt;p&gt;registerPreset() API: Create your own custom themes with partial merging, making it incredibly easy to brand your app.&lt;/p&gt;

&lt;p&gt;The new theme picker is used on all 80 demo pages!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile-First &amp;amp; Fully Responsive&lt;/strong&gt;&lt;br&gt;
In v2.0.0, all 80 components are overhauled for responsiveness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile-Ready:&lt;/strong&gt; Components now adapt seamlessly to smaller screens.&lt;br&gt;
The demo pages now work on both desktop and mobile. Interaction states and spacing have been refined for better mobile usability.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Why BareDom?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;BareDom is built on a unique stack: ClojureScript compiled to tiny, tree-shakeable ES modules via Google Closure. It gives you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero Runtime Dependency:&lt;/strong&gt; Your users don't download a framework to render a button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standards First:&lt;/strong&gt; Built on Custom Elements v1 and Shadow DOM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lightweight:&lt;/strong&gt; Each component is its own module. Use only what you need.&lt;/p&gt;
&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Setting up a themed UI is now easier than ever:&lt;/p&gt;

&lt;p&gt;HTML&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;x-theme&lt;/span&gt; &lt;span class="na"&gt;preset=&lt;/span&gt;&lt;span class="s"&gt;"neo-brutalist"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;x-button&lt;/span&gt; &lt;span class="na"&gt;variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello BareDom v2&lt;span class="nt"&gt;&amp;lt;/x-button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/x-theme&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;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;init&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;initTheme&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="s1"&gt;./dist/x-theme.js&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;init&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;initButton&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="s1"&gt;./dist/x-button.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;initTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;initButton&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Check out the 80 Demos!
&lt;/h2&gt;

&lt;p&gt;I’ve updated every single demo page with the new theme picker so you can see x-theme in action across the entire library.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/avanelsas/baredom" rel="noopener noreferrer"&gt;avanelsas/baredom&lt;/a&gt;&lt;br&gt;
Live demos: &lt;a href="https://avanelsas.github.io/baredom/" rel="noopener noreferrer"&gt;BareDOM Github Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear which of the 8 new presets is your favorite!.&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #showdev #webcomponents #clojurescript #javascript #uidesign
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>webcomponents</category>
      <category>uidesign</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Native Web Components don't have to be boring. Meet BareDOM v1.3.0</title>
      <dc:creator>Alexander van Elsas</dc:creator>
      <pubDate>Tue, 07 Apr 2026 18:25:57 +0000</pubDate>
      <link>https://forem.com/avanelsas/native-web-components-dont-have-to-be-boring-meet-baredom-v130-4m6e</link>
      <guid>https://forem.com/avanelsas/native-web-components-dont-have-to-be-boring-meet-baredom-v130-4m6e</guid>
      <description>&lt;p&gt;Announcing v1.3.0 of &lt;a href="https://github.com/avanelsas/baredom" rel="noopener noreferrer"&gt;BareDOM&lt;/a&gt;&lt;br&gt;
I wanted to add some modern, fun, kinetic, organic, and animated UI elements that feel alive, without the 50kb runtime tax. The latest update to BareDOM moves away from static UI elements and introduces components designed with motion and fluidity in mind. &lt;/p&gt;

&lt;p&gt;New web components include :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Effects&lt;/strong&gt; : x-ripple-effect, x-gaussian-blur, x-splash, x-metaball-cursor, x-neural-glow, x-organic-progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout&lt;/strong&gt; : x-bento-grid, x-bento-item&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scroll&lt;/strong&gt; : x-scroll-stack, x-scroll-parallax, x-scroll-timeline, x-scroll-story&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography&lt;/strong&gt; : x-typography, x-kinetic-typography&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decorative&lt;/strong&gt; : x-organic-divider, x-organic-shape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why go Bare?&lt;/p&gt;

&lt;p&gt;BareDOM is built in ClojureScript but delivered as pure ESM or via NPM. You get the benefit of sophisticated functional logic under the hood, but for your project, it’s just a standard tag.&lt;/p&gt;

&lt;p&gt;Why BareDOM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Works in any stack.&lt;/strong&gt; Because components are native HTML elements, they work wherever HTML works — vanilla JavaScript, React, Vue, Svelte, Angular, server-rendered HTML, or a static page. No adapter layer, no wrapper library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No framework lock-in.&lt;/strong&gt; Your components are not tied to the framework you are building with today. Migrate your app, keep your components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tree-shakeable by design.&lt;/strong&gt; Each component is a separate ES module. Import only what you use; bundle tools eliminate the rest automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full theming with CSS custom properties.&lt;/strong&gt; Every visual detail — colours, spacing, radius, shadows, typography — is exposed as a &lt;code&gt;--x-&amp;lt;component&amp;gt;-&amp;lt;property&amp;gt;&lt;/code&gt; CSS custom property. Override at any scope: globally, per-page, per-instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light and dark mode included.&lt;/strong&gt; All components adapt automatically to &lt;code&gt;prefers-color-scheme&lt;/code&gt;. No JavaScript required, no class toggling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility built in.&lt;/strong&gt; ARIA roles, live regions, keyboard navigation, focus management, and &lt;code&gt;prefers-reduced-motion&lt;/code&gt; support are part of the component, not an afterthought. You do not need to layer accessibility on top.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Shadow DOM.&lt;/strong&gt; Shadow roots are &lt;code&gt;mode: "open"&lt;/code&gt; — inspectable in DevTools, styleable via &lt;code&gt;::part()&lt;/code&gt;, and testable with standard DOM APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See it in &lt;a href="https://avanelsas.github.io/baredom/" rel="noopener noreferrer"&gt;action&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the repo, grab a few components, and let me know what you think!&lt;/p&gt;

</description>
      <category>webcomponents</category>
      <category>animation</category>
      <category>kinetic</category>
      <category>showdev</category>
    </item>
    <item>
      <title>BareDOM: 67 Zero-Dependency Web Components (Built with CLJS)</title>
      <dc:creator>Alexander van Elsas</dc:creator>
      <pubDate>Sun, 05 Apr 2026 19:48:29 +0000</pubDate>
      <link>https://forem.com/avanelsas/baredom-67-zero-dependency-web-components-built-with-cljs-2n1i</link>
      <guid>https://forem.com/avanelsas/baredom-67-zero-dependency-web-components-built-with-cljs-2n1i</guid>
      <description>&lt;p&gt;Like most ClojureScript developers, I started building UIs with Reagent and Re-frame. They're great tools. But as my UIs grew larger and more complex, I kept rebuilding the same generic components from scratch. Bundle sizes crept up. Framework lock-in felt heavier with each project.&lt;/p&gt;

&lt;p&gt;I started looking for a different approach and discovered Web Components. Native. Framework-free. Works anywhere HTML works. I built a few by hand, but never had the spare time to develop a full set.&lt;/p&gt;

&lt;p&gt;While experimenting with Claude Code, I realised that 1 + 1 could be 3. That's how &lt;strong&gt;BareDOM&lt;/strong&gt; was born — my first open-source project.&lt;/p&gt;

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

&lt;p&gt;BareDOM is a library of &lt;strong&gt;67 UI components&lt;/strong&gt; built entirely on web standards — Custom Elements v1, Shadow DOM, and ES modules. No framework runtime. No virtual DOM. No peer dependencies.&lt;/p&gt;

&lt;p&gt;The rendering model is deliberately simple:&lt;/p&gt;

&lt;p&gt;DOM = f(attributes, properties)&lt;/p&gt;

&lt;p&gt;Components are &lt;strong&gt;stateless&lt;/strong&gt;. Set an attribute, the DOM updates. Remove it, it updates back. No hidden reactive systems, no signals, no state management to learn.&lt;/p&gt;

&lt;p&gt;It's authored in ClojureScript and compiled to optimised ES modules using Google Closure's advanced compilation. But you don't need to know ClojureScript to use it — it's just HTML elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  See it live
&lt;/h2&gt;

&lt;p&gt;Browse all 67 components with interactive demos:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://avanelsas.github.io/baredom/" rel="noopener noreferrer"&gt;https://avanelsas.github.io/baredom/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the box?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Form:&lt;/strong&gt; button, checkbox, switch, slider, select, date-picker, search-field, text-area, and more&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback:&lt;/strong&gt; alert, badge, toast, notification-center, progress, spinner, skeleton&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigation:&lt;/strong&gt; navbar, sidebar, tabs, breadcrumbs, pagination, menu&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layout:&lt;/strong&gt; card, grid, container, collapse, divider, spacer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data:&lt;/strong&gt; table, chart, timeline, avatar, stat&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overlay:&lt;/strong&gt; modal, drawer, dropdown, popover, command-palette, context-menu&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual/Animation:&lt;/strong&gt; scroll-parallax, scroll-story, kinetic-typography, ripple-effect, organic-shape, gaussian-blur&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;No build tool? No problem. Drop this into any HTML page:&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;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;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;init&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="s1"&gt;./dist/x-button.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;x-button&lt;/span&gt; &lt;span class="na"&gt;variant=&lt;/span&gt;&lt;span class="s"&gt;"primary"&lt;/span&gt; &lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;"md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/x-button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. A script tag and an HTML element. The browser loads only the modules you import.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer npm? That works too:
&lt;/h2&gt;

&lt;p&gt;npm install @vanelsas/baredom&lt;/p&gt;

&lt;p&gt;import { init } from '@vanelsas/baredom/x-button';&lt;br&gt;
init();&lt;/p&gt;

&lt;p&gt;No framework setup, no providers, no config. Works in vanilla JS, React, Vue, Svelte, Angular, or a static page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero runtime — no framework overhead, just native custom elements&lt;/li&gt;
&lt;li&gt;Tree-shakeable — each component is a separate ES module, import only what you need&lt;/li&gt;
&lt;li&gt;Full theming — every visual property exposed as CSS custom properties (--x-button-bg, etc.)&lt;/li&gt;
&lt;li&gt;Dark mode built-in — all components adapt to prefers-color-scheme automatically&lt;/li&gt;
&lt;li&gt;Accessibility included — ARIA roles, keyboard navigation, focus management, reduced motion support&lt;/li&gt;
&lt;li&gt;Open Shadow DOM — inspectable, styleable via ::part(), testable with standard APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/avanelsas/baredom" rel="noopener noreferrer"&gt;https://github.com/avanelsas/baredom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@vanelsas/baredom" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@vanelsas/baredom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/avanelsas/baredom/blob/main/docs/javascript-guide.md" rel="noopener noreferrer"&gt;https://github.com/avanelsas/baredom/blob/main/docs/javascript-guide.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://avanelsas.github.io/baredom/" rel="noopener noreferrer"&gt;https://avanelsas.github.io/baredom/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I'd love feedback from both JavaScript and ClojureScript developers. Try a component, file an issue, or just tell me what you think. The current version is v1.2.0 — more components and refinements are coming.&lt;/p&gt;

&lt;p&gt;BareDOM is MIT licensed and open source.&lt;/p&gt;

</description>
      <category>webcomponents</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
