<?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: Jonas Pfalzgraf</title>
    <description>The latest articles on DEV Community by Jonas Pfalzgraf (@josunlp).</description>
    <link>https://dev.to/josunlp</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%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png</url>
      <title>DEV Community: Jonas Pfalzgraf</title>
      <link>https://dev.to/josunlp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josunlp"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:35:18 +0000</pubDate>
      <link>https://dev.to/josunlp/-558i</link>
      <guid>https://dev.to/josunlp/-558i</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" class="crayons-story__hidden-navigation-link"&gt;bQuery.js Grows Up: From Tiny jQuery Tribute to a Full-Stack Framework — and a Brand New Home at bquery.js.org 🎉&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3773228" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" id="article-link-3773228"&gt;
          bQuery.js Grows Up: From Tiny jQuery Tribute to a Full-Stack Framework — and a Brand New Home at bquery.js.org 🎉
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 29 May 2026 09:21:52 +0000</pubDate>
      <link>https://dev.to/josunlp/-4bph</link>
      <guid>https://dev.to/josunlp/-4bph</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" class="crayons-story__hidden-navigation-link"&gt;bQuery.js Grows Up: From Tiny jQuery Tribute to a Full-Stack Framework — and a Brand New Home at bquery.js.org 🎉&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3773228" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa" id="article-link-3773228"&gt;
          bQuery.js Grows Up: From Tiny jQuery Tribute to a Full-Stack Framework — and a Brand New Home at bquery.js.org 🎉
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>bQuery.js Grows Up: From Tiny jQuery Tribute to a Full-Stack Framework — and a Brand New Home at bquery.js.org 🎉</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Thu, 28 May 2026 19:41:00 +0000</pubDate>
      <link>https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa</link>
      <guid>https://dev.to/josunlp/bqueryjs-grows-up-from-tiny-jquery-tribute-to-a-full-stack-framework-and-a-brand-new-home-at-1paa</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bQuery/bQuery" rel="noopener noreferrer"&gt;bQuery.js&lt;/a&gt; started last autumn with a question I couldn't stop chewing on: &lt;strong&gt;why was jQuery actually invented?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strip away two decades of memes and "jQuery is dead" hot takes, and the answer is pretty simple. jQuery existed to make developer life easier under the conditions of &lt;em&gt;its&lt;/em&gt; time — inconsistent browsers, a painful DOM API, no fetch, no querySelector, no module system worth speaking of. It papered over the platform because the platform needed papering.&lt;/p&gt;

&lt;p&gt;So I started asking the modern version of that question: &lt;strong&gt;if you sat down today and tried to do for 2025+ what jQuery did for 2006, what would you actually build?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "jQuery, but updated". Not "jQuery, but TypeScript". An honest answer to: &lt;em&gt;what are today's pain points, and what would a library look like that fixes them without adding new ones?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That question is where bQuery comes from. A few months later, it's not really a library anymore — it's a full-stack framework. And to celebrate that, the docs have officially moved into their own home:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🥂 &lt;strong&gt;&lt;a href="https://bquery.js.org" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt;&lt;/strong&gt; — your new bookmark for everything bQuery.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me tell you how we got here.&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 Chapter 1 — Three Non-Negotiables
&lt;/h2&gt;

&lt;p&gt;When I started sketching this thing last autumn, three principles were locked in from day one. Everything else had to bend around them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Zero mandatory build step.&lt;/strong&gt; You should be able to drop a single &lt;code&gt;&amp;lt;script type="module"&amp;gt;&lt;/code&gt; into a plain HTML file and write something useful in 12 lines. No &lt;code&gt;node_modules&lt;/code&gt;. No bundler config. No vibes-based &lt;code&gt;tsconfig.json&lt;/code&gt; you cargo-culted from a tutorial. The platform is good now — the library shouldn't gatekeep you behind a toolchain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Single import, with or without CDN.&lt;/strong&gt; One entry point. You either install from npm/bun/pnpm, or you point at unpkg/jsDelivr. Either way, the API is identical. No "CDN edition" vs. "module edition" mind games.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Real tree-shaking.&lt;/strong&gt; Importing &lt;code&gt;bQuery&lt;/code&gt; shouldn't drag in the whole framework if you only wanted &lt;code&gt;$&lt;/code&gt;. Every module is its own explicit entry point. You pay for exactly what you import — nothing more.&lt;/p&gt;

&lt;p&gt;Those three rules made the design decisions almost automatic. They're also the reason it grew the way it did: when the API is honest about cost, you can keep adding without bloating anyone's bundle.&lt;/p&gt;

&lt;p&gt;The first version looked exactly like you'd expect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&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;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hovered&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. A typed, chainable, modern DOM helper. Zero build step required. Zero runtime dependencies. Roughly the energy of "jQuery, but it understands what &lt;code&gt;unknown&lt;/code&gt; means".&lt;/p&gt;

&lt;p&gt;It scratched the itch. People used it. The story could have ended there.&lt;/p&gt;

&lt;p&gt;It didn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌱 Chapter 2 — "Hm, this could use signals"
&lt;/h2&gt;

&lt;p&gt;The first time the project stopped being a library was the day I added &lt;a href="https://bquery.js.org/reactive" rel="noopener noreferrer"&gt;signals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have reactive primitives, suddenly &lt;code&gt;$('#counter').text(...)&lt;/code&gt; isn't just a one-shot DOM write — it's an &lt;em&gt;expression of state&lt;/em&gt;. And once you have that, you want components. And once you have components, you want a router. And once you have a router, you want SSR. And once you have SSR…&lt;/p&gt;

&lt;p&gt;You see where this is going.&lt;/p&gt;

&lt;p&gt;Crucially: none of that broke the three rules. Tree-shaking meant new modules didn't tax the people who only wanted &lt;code&gt;$&lt;/code&gt;. The single-import contract held. The CDN entry still worked. Every release tried to keep the same jQuery-ish hand feel, but the surface kept growing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signals &amp;amp; effects&lt;/strong&gt; for reactive state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Components&lt;/strong&gt; built on the native Web Components API — no virtual DOM, no shipping a runtime renderer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Views &amp;amp; directives&lt;/strong&gt; (&lt;code&gt;bq-on&lt;/code&gt;, &lt;code&gt;bq-html-safe&lt;/code&gt;, &lt;code&gt;bq-memo&lt;/code&gt;, &lt;code&gt;bq-cloak&lt;/code&gt;…) for declarative templates without JSX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forms&lt;/strong&gt; with validation, dirty/touched state, the whole thing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Router&lt;/strong&gt; with guards, lazy routes, navigation results, and a proper &lt;code&gt;useNavigation()&lt;/code&gt; composable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n&lt;/strong&gt; with locale negotiation, RTL detection, relative time, and list formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A11y&lt;/strong&gt; helpers — live regions, focus management, &lt;code&gt;prefersReducedMotion&lt;/code&gt;, forced colors, scroll-lock, the lot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP / fetch composables&lt;/strong&gt; that plug straight into signals — polling, pagination, REST helpers, WebSocket and SSE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag &amp;amp; drop&lt;/strong&gt;, including sortables, grid snapping, keyboard handling, viewport bounds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSR&lt;/strong&gt; with streaming, boundaries, edge handlers, response caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt; — yes, a proper server runtime with middleware, cookies, SSE, streaming responses, &lt;code&gt;app.listen()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devtools, testing utilities, plugin system, media composables…&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a library. That's a framework. It took me a while to admit it out loud.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Chapter 3 — The Three Rules, Still Holding
&lt;/h2&gt;

&lt;p&gt;Here's the part I'm proudest of: bQuery grew into a framework &lt;em&gt;without breaking the original promises&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You can still drop a single &lt;code&gt;&amp;lt;script type="module"&amp;gt;&lt;/code&gt; into a plain HTML file and write 12 lines of code. You can also build a server-rendered app with streaming SSR, a typed router, signal-driven data fetching, and Web Components — using &lt;strong&gt;the same API surface&lt;/strong&gt;. Same single import. Same tree-shaking. Same "no build step required, but works great if you want one".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Minimal — just the DOM helpers&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&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;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Reactive&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;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&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;@bquery/bquery/reactive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Whole kitchen sink&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;registerDefaultComponents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineBqueryConfig&lt;/span&gt;&lt;span class="p"&gt;,&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;@bquery/bquery&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;Explicit entry points. TypeScript-first. Truly tree-shakeable. Same vocabulary across the whole framework.&lt;/p&gt;

&lt;p&gt;The CDN entry isn't a marketing afterthought — it's a core feature, in the same way the build-based install is. The moment you force people into a toolchain, you've already lost the "I just want to make a thing" crowd. And that crowd is sacred.&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&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;https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&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;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#btn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#out&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Count: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&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="s2"&gt;`&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;p&gt;That's a reactive counter. No bundler. No &lt;code&gt;node_modules&lt;/code&gt;. No vibes-based config file. Just the platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Quick Aside: Security That Isn't Optional
&lt;/h2&gt;

&lt;p&gt;If you remember the jQuery era, you also remember &lt;code&gt;.html(userInput)&lt;/code&gt; shipping XSS into production. Hard pass.&lt;/p&gt;

&lt;p&gt;bQuery sanitizes DOM writes by default and ships first-class helpers for &lt;strong&gt;Trusted Types&lt;/strong&gt; and &lt;strong&gt;CSP&lt;/strong&gt;. There's a &lt;code&gt;bq-html-safe&lt;/code&gt; directive for templates that need to render markup explicitly. The defaults are the safe ones — you have to opt &lt;em&gt;in&lt;/em&gt; to the dangerous thing, not opt out. That's the way it should have been all along.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 Chapter 4 — Welcome to bquery.js.org
&lt;/h2&gt;

&lt;p&gt;Okay. The actual reason for this post.&lt;/p&gt;

&lt;p&gt;The docs used to live wherever I could shove them — README, GitHub Pages under a long URL, scattered Markdown files. That worked when the surface was "here are 8 functions and a chain API". It does &lt;strong&gt;not&lt;/strong&gt; work when the surface is a full framework with 20+ modules, hundreds of composables, SSR, a server runtime, and a plugin system.&lt;/p&gt;

&lt;p&gt;So I did the obvious thing. The docs got their own home:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://bquery.js.org" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What you'll find there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A proper &lt;strong&gt;getting started&lt;/strong&gt; path — from "drop a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag" to "scaffold a full SSR app"&lt;/li&gt;
&lt;li&gt;Module-by-module reference with every signal, composable, directive, and helper&lt;/li&gt;
&lt;li&gt;A searchable &lt;strong&gt;API reference&lt;/strong&gt; generated straight from the source&lt;/li&gt;
&lt;li&gt;Migration notes if you've been riding the 1.x train&lt;/li&gt;
&lt;li&gt;A changelog that doesn't try to hide breaking changes in a footnote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The domain change is also a small but real symbolic thing. &lt;code&gt;bquery.js.org&lt;/code&gt; is on the &lt;a href="https://js.org" rel="noopener noreferrer"&gt;js.org&lt;/a&gt; registry — a community-run home for JavaScript projects. It feels right. It's where bQuery belongs now that it's stopped pretending to be small.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Where We Are Today (v1.14.1)
&lt;/h2&gt;

&lt;p&gt;For the people who like a quick state-of-the-union:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What's in it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$&lt;/code&gt;, &lt;code&gt;$$&lt;/code&gt;, chainable DOM API, sane defaults&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reactive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Signals, computed, effects, stores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Components&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web Components-based, no VDOM runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Views&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Directives, &lt;code&gt;bq-on&lt;/code&gt; modifier system, memoization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Router&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Guards, lazy routes, &lt;code&gt;useNavigation&lt;/code&gt;, dynamic routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Forms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Validation, dirty/touched, field-level signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fetch composables, polling, pagination, REST, WebSocket, SSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;i18n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Locale negotiation, RTL, relative time, list &amp;amp; display name formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A11y&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Live regions, focus-visible, forced-colors, reduced-motion, scroll-lock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Drag &amp;amp; Drop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sortables, grids, keyboard, viewport bounds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Media&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25+ reactive composables for preferences, page state, observers, pointer/scroll, clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Streaming, boundaries, edge handlers, response caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP runtime, middleware, cookies, SSE, streaming responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugin system&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hook bus, DI container, namespaced directives, lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Devtools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timeline ring buffer, signal/store diffs, traces, snapshots, browser bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto cleanup, &lt;code&gt;userEvent&lt;/code&gt;, shadow-DOM-aware queries, module mocks, a11y helpers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of that, and the 1.x API surface is still backwards compatible going back to 1.0. I'm a bit smug about that one ^^ .&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 But Is It Still… jQuery-y?
&lt;/h2&gt;

&lt;p&gt;Yes. That's the whole point.&lt;/p&gt;

&lt;p&gt;You can absolutely write a 2026 app using nothing but &lt;code&gt;$('#thing').addClass(...).on('click', ...)&lt;/code&gt;. The framework parts are &lt;em&gt;opt-in&lt;/em&gt;. If you want to write tiny scripts, write tiny scripts. If you want to ship an SSR app with reactive forms and a typed server, that's the same install. Same imports. Same API conventions.&lt;/p&gt;

&lt;p&gt;The whole thesis goes back to that original question — &lt;em&gt;what would jQuery look like if it were designed today, for today's pain points?&lt;/em&gt; The platform is genuinely good now. We shouldn't have to choose between "ergonomic" and "uses what the browser already gives you". And we shouldn't have to choose between "powerful framework" and "drop a script tag and it works". bQuery is the bet that you can have all of it, in one import.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Contribute, Star, Yell at Me
&lt;/h2&gt;

&lt;p&gt;bQuery is open source under the same spirit as everything else I publish. If you want to help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the &lt;a href="https://github.com/bQuery/bQuery" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; — it does more than you'd think&lt;/li&gt;
&lt;li&gt;🐛 Open issues when things break&lt;/li&gt;
&lt;li&gt;✨ PRs are welcome, especially for the parts you actually use&lt;/li&gt;
&lt;li&gt;📝 Docs improvements over at &lt;a href="https://bquery.js.org" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt; are &lt;em&gt;very&lt;/em&gt; welcome — even a typo fix is a typo someone else won't trip over&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you'd previously written off "jQuery-style" as a museum piece, this might be a good moment to look again. The vibes are familiar. The internals are not.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;bQuery.js&lt;/strong&gt; started last autumn with one question: &lt;em&gt;what would jQuery look like if you designed it today, for today's pain points?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Three rules locked in from day one: &lt;strong&gt;zero mandatory build step&lt;/strong&gt;, &lt;strong&gt;single import (CDN or npm)&lt;/strong&gt;, &lt;strong&gt;real tree-shaking&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It has since grown into a full-stack framework — signals, components, SSR, routing, a server runtime, forms, i18n, a11y, devtools, testing utilities — without breaking any of those rules&lt;/li&gt;
&lt;li&gt;🎉 &lt;strong&gt;New docs home: &lt;a href="https://bquery.js.org" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt;&lt;/strong&gt; — go bookmark it&lt;/li&gt;
&lt;li&gt;Latest release is &lt;strong&gt;v1.14.1&lt;/strong&gt;, backwards compatible all the way back to 1.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The jQuery for the modern web platform is no longer just jQuery for the modern web platform.&lt;/p&gt;

&lt;p&gt;Cheers, and see you on &lt;a href="https://bquery.js.org" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt;. 🥂&lt;/p&gt;

&lt;p&gt;— Josun&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Tue, 14 Apr 2026 09:29:44 +0000</pubDate>
      <link>https://dev.to/josunlp/-kbp</link>
      <guid>https://dev.to/josunlp/-kbp</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho" class="crayons-story__hidden-navigation-link"&gt;bQuery.js v1.9.0 🥂 Still the jQuery for the Modern Web Platform — but sharper than ever&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3460674" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 6&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho" id="article-link-3460674"&gt;
          bQuery.js v1.9.0 🥂 Still the jQuery for the Modern Web Platform — but sharper than ever
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>bQuery.js v1.9.0 🥂 Still the jQuery for the Modern Web Platform — but sharper than ever</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 12:06:46 +0000</pubDate>
      <link>https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho</link>
      <guid>https://dev.to/josunlp/bqueryjs-v190-still-the-jquery-for-the-modern-web-platform-but-sharper-than-ever-3pho</guid>
      <description>&lt;p&gt;&lt;em&gt;A modular, zero-build JavaScript toolkit for people who want modern reactivity, Web Components, and DOM ergonomics without marrying a giant framework&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;A little while ago, I wrote about &lt;strong&gt;bQuery.js&lt;/strong&gt; and called it what it honestly feels like: &lt;strong&gt;the jQuery for the modern web platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And yes — I still stand by that.&lt;/p&gt;

&lt;p&gt;But bQuery didn’t stop there. The ecosystem kept evolving, the APIs matured further, and with &lt;strong&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt; 1.9.0&lt;/strong&gt;, the project feels even more like a serious option for people who want modern frontend capabilities &lt;strong&gt;without immediately summoning an entire framework stack from the underworld&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because let’s be honest: sometimes you don’t want to set up a mega toolchain, configure seventeen plugins, and debate hydration strategies for three business days.&lt;/p&gt;

&lt;p&gt;Sometimes you just want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;select DOM elements&lt;/li&gt;
&lt;li&gt;react to state changes&lt;/li&gt;
&lt;li&gt;fetch some data&lt;/li&gt;
&lt;li&gt;build a component&lt;/li&gt;
&lt;li&gt;ship your app&lt;/li&gt;
&lt;li&gt;and go to sleep at a reasonable hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where bQuery still shines.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎉 What is bQuery again?
&lt;/h2&gt;

&lt;p&gt;If you haven’t heard of it yet:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;bQuery&lt;/strong&gt; is a modular JavaScript/TypeScript library published as &lt;strong&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt;&lt;/strong&gt; on npm. It aims to combine the directness of classic DOM libraries with modern frontend features like &lt;strong&gt;signals, typed Web Components, async composables, forms, i18n, routing, SSR, accessibility helpers, and more&lt;/strong&gt;. Your earlier article also highlighted its modular architecture and zero-build approach. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So yes, the “jQuery for the modern web platform” label is not just marketing fluff. It’s actually a pretty accurate mental model.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DOM ergonomics&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fine-grained reactivity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;progressive enhancement&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;modular imports&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;security-conscious APIs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;native platform-first thinking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that combo is still weirdly rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Why this matters in 2026
&lt;/h2&gt;

&lt;p&gt;The frontend world still has a small addiction problem.&lt;/p&gt;

&lt;p&gt;Not with caffeine.&lt;br&gt;&lt;br&gt;
Okay, also with caffeine.&lt;/p&gt;

&lt;p&gt;But especially with complexity.&lt;/p&gt;

&lt;p&gt;There are plenty of cases where React, Vue, Angular, Svelte, Solid, or whatever else absolutely make sense. I use frameworks too. This is not a crusade.&lt;/p&gt;

&lt;p&gt;But there’s also a huge space between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“just use vanilla JS”&lt;/li&gt;
&lt;li&gt;and&lt;/li&gt;
&lt;li&gt;“spin up an enterprise-grade framework architecture for a settings panel”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That middle ground is where libraries like bQuery are genuinely interesting.&lt;/p&gt;

&lt;p&gt;If you’re building things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;progressive web enhancements&lt;/li&gt;
&lt;li&gt;browser-based utilities&lt;/li&gt;
&lt;li&gt;Web Components&lt;/li&gt;
&lt;li&gt;small to mid-sized apps&lt;/li&gt;
&lt;li&gt;interactive islands on otherwise static pages&lt;/li&gt;
&lt;li&gt;prototypes that accidentally became real products&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then bQuery makes a lot of sense.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Getting started
&lt;/h2&gt;

&lt;p&gt;You can install it the normal way:&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; @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with pnpm / bun if you’re living the good life:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm add @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
bun add @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your previous article also showed that bQuery can be used directly in the browser via ES modules, without forcing a traditional build step, which is one of its most compelling traits. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That alone is such a refreshing thing.&lt;/p&gt;

&lt;p&gt;No “before you begin, initialize six config files.”&lt;/p&gt;

&lt;p&gt;Just code.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ The familiar part: DOM manipulation that doesn’t feel painful
&lt;/h2&gt;

&lt;p&gt;The easiest way to understand bQuery is to start with the part that feels familiar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&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;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&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;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ready&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;css&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rebeccapurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.1rem&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;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from bQuery!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&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="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you ever used jQuery, this feels immediately understandable.&lt;/p&gt;

&lt;p&gt;But unlike old-school jQuery, this is not where the story ends.&lt;/p&gt;

&lt;p&gt;The core module gives you a chainable, ergonomic API for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classes and attributes&lt;/li&gt;
&lt;li&gt;events&lt;/li&gt;
&lt;li&gt;DOM traversal&lt;/li&gt;
&lt;li&gt;form helpers&lt;/li&gt;
&lt;li&gt;dimensions and positioning&lt;/li&gt;
&lt;li&gt;content updates&lt;/li&gt;
&lt;li&gt;insertion and replacement utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one detail I particularly like: &lt;strong&gt;sanitization-aware HTML handling&lt;/strong&gt;. In your earlier write-up, you pointed out that &lt;code&gt;html()&lt;/code&gt; is sanitized by default and &lt;code&gt;htmlUnsafe()&lt;/code&gt; is the explicit opt-out, which is a very sane design choice. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That’s one of those “small” details that actually says a lot about a library’s philosophy.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Signals, because modern state should not be miserable
&lt;/h2&gt;

&lt;p&gt;This is where bQuery stops being “just a DOM helper” and starts becoming something much more interesting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;batch&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;@bquery/bquery/reactive&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;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jonas&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="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pfalzgraf&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;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;firstName&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="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="nx"&gt;value&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="nf"&gt;effect&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fullName&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="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;batch&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="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Josun&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LP&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the kind of API I really like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;readable&lt;/li&gt;
&lt;li&gt;explicit&lt;/li&gt;
&lt;li&gt;modern&lt;/li&gt;
&lt;li&gt;not overloaded with ceremony&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your March article already covered that bQuery’s reactive layer includes things like &lt;strong&gt;signals, computed values, effects, batching, watchers, persisted signals, and linked signals&lt;/strong&gt;, which makes it much more than a tiny convenience wrapper. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;And honestly?&lt;br&gt;&lt;br&gt;
Signals are one of the best things that happened to frontend state management in recent years.&lt;/p&gt;

&lt;p&gt;They’re simple enough to understand quickly, but powerful enough to build serious UI logic on top of them.&lt;/p&gt;


&lt;h2&gt;
  
  
  🌐 Async data without writing the same boilerplate forever
&lt;/h2&gt;

&lt;p&gt;Another area where frontend code often becomes deeply annoying: async state.&lt;/p&gt;

&lt;p&gt;Loading states. Error states. Refresh logic. Cleanup. Watching dependencies. Re-running on change.&lt;br&gt;&lt;br&gt;
Fun. So much fun. Absolutely thrilling. Definitely not repetitive at all.&lt;/p&gt;

&lt;p&gt;bQuery wraps this into composables like &lt;code&gt;useAsyncData&lt;/code&gt; and &lt;code&gt;useFetch&lt;/code&gt;, which your earlier article described in detail, including support for lifecycle state like pending/success/error and HTTP niceties like query params and response parsers. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useFetch&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;@bquery/bquery/reactive&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users&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;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That kind of API is exactly what I want for smaller apps and tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expressive&lt;/li&gt;
&lt;li&gt;low-friction&lt;/li&gt;
&lt;li&gt;practical&lt;/li&gt;
&lt;li&gt;doesn’t force me into a giant framework runtime&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Web Components that don’t feel like punishment
&lt;/h2&gt;

&lt;p&gt;I’ve said it before and I’ll say it again:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Web Component API is powerful, but raw Web Component authoring can be annoyingly verbose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s another place where bQuery becomes genuinely useful.&lt;/p&gt;

&lt;p&gt;Your previous article showed that bQuery’s component layer supports &lt;strong&gt;typed props, configurable Shadow DOM usage, sanitized render output, lifecycle hooks, local reactive helpers, and external signals for rerendering&lt;/strong&gt;. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That means you can build native custom elements without drowning in low-level setup code.&lt;/p&gt;

&lt;p&gt;And that’s huge.&lt;/p&gt;

&lt;p&gt;Because Web Components are great when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;framework-agnostic components&lt;/li&gt;
&lt;li&gt;encapsulation&lt;/li&gt;
&lt;li&gt;reusability across projects&lt;/li&gt;
&lt;li&gt;native browser primitives&lt;/li&gt;
&lt;li&gt;long-lived maintainable UI building blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they become a lot more fun when the authoring experience is decent.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Why I like the philosophy behind bQuery
&lt;/h2&gt;

&lt;p&gt;There are lots of libraries that can do one or two of these things. That’s not the special part.&lt;/p&gt;

&lt;p&gt;What I like about bQuery is the overall mindset:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Platform-first&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It builds on browser capabilities instead of fighting them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Progressive&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You don’t need to buy into everything at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Modular&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Import what you need. Leave the rest alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Modern&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Signals, typed components, async composables, SSR support, i18n, accessibility tools — this is not “nostalgia jQuery”.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Pragmatic&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It feels built for developers who actually want to get things done.&lt;/p&gt;

&lt;p&gt;And that last point matters a lot to me.&lt;/p&gt;

&lt;p&gt;Because sometimes frontend tooling feels like it was designed primarily to create conference talks.&lt;/p&gt;

&lt;p&gt;bQuery feels more like it was designed to solve real problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Ecosystem breadth: more than just selectors
&lt;/h2&gt;

&lt;p&gt;One of the strongest things in your previous bQuery article was how clearly it showed the ecosystem breadth. bQuery is not just core DOM helpers — it spans modules for &lt;strong&gt;routing, global store management, forms, i18n, accessibility, drag-and-drop, media helpers, plugins, devtools, testing, and SSR&lt;/strong&gt;. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That matters because it means the project can scale with your needs.&lt;/p&gt;

&lt;p&gt;You can start small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I just want cleaner DOM utilities”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And later move into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reactive state&lt;/li&gt;
&lt;li&gt;reusable components&lt;/li&gt;
&lt;li&gt;shared stores&lt;/li&gt;
&lt;li&gt;localized UI&lt;/li&gt;
&lt;li&gt;accessible interactions&lt;/li&gt;
&lt;li&gt;server-rendered output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without switching mental models every five minutes.&lt;/p&gt;

&lt;p&gt;That’s a pretty compelling story.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆕 Why write about 1.9.0 specifically?
&lt;/h2&gt;

&lt;p&gt;Because version bumps are only interesting if they reflect maturity.&lt;/p&gt;

&lt;p&gt;And that’s the real point here.&lt;/p&gt;

&lt;p&gt;For me, &lt;strong&gt;1.9.0&lt;/strong&gt; is less about “look, number bigger” and more about this project continuing to feel like a serious, coherent toolkit rather than a random utility collection. The npm package exists as &lt;code&gt;@bquery/bquery&lt;/code&gt;, the source is maintained in the &lt;code&gt;bQuery/bQuery&lt;/code&gt; GitHub repository, and there’s also an official project site available. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7?utm_source=openai"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That coherence is what makes a package worth adopting.&lt;/p&gt;

&lt;p&gt;A lot of libraries have nice APIs in isolated examples.&lt;br&gt;&lt;br&gt;
Far fewer feel like they have a real philosophy and an ecosystem that fits together.&lt;/p&gt;

&lt;p&gt;bQuery increasingly does.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Who should use bQuery?
&lt;/h2&gt;

&lt;p&gt;I’d especially recommend taking a look if you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a developer who likes &lt;strong&gt;vanilla JS, but wants better ergonomics&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;someone building &lt;strong&gt;small to medium-sized frontend apps&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;into &lt;strong&gt;Web Components&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;doing &lt;strong&gt;progressive enhancement&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;tired of framework overhead for simpler projects&lt;/li&gt;
&lt;li&gt;looking for a &lt;strong&gt;modern, modular toolkit&lt;/strong&gt; instead of a monolithic solution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would especially keep it on my radar for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dashboard tools&lt;/li&gt;
&lt;li&gt;admin panels&lt;/li&gt;
&lt;li&gt;widgets&lt;/li&gt;
&lt;li&gt;browser tools&lt;/li&gt;
&lt;li&gt;static sites with interactive islands&lt;/li&gt;
&lt;li&gt;component libraries based on native custom elements&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  😅 Who is it &lt;em&gt;not&lt;/em&gt; for?
&lt;/h2&gt;

&lt;p&gt;Let’s be fair.&lt;/p&gt;

&lt;p&gt;If your team already has a deeply established framework ecosystem with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict conventions&lt;/li&gt;
&lt;li&gt;internal tooling&lt;/li&gt;
&lt;li&gt;existing component libraries&lt;/li&gt;
&lt;li&gt;SSR infra&lt;/li&gt;
&lt;li&gt;testing patterns&lt;/li&gt;
&lt;li&gt;onboarding optimized around one framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…then bQuery may not replace that.&lt;/p&gt;

&lt;p&gt;And that’s okay.&lt;/p&gt;

&lt;p&gt;Not every tool has to replace everything.&lt;/p&gt;

&lt;p&gt;Sometimes being the &lt;strong&gt;best fit for a certain class of projects&lt;/strong&gt; is more valuable than pretending to be universal.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 My honest takeaway
&lt;/h2&gt;

&lt;p&gt;What I like most about bQuery is that it feels like it respects both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;web platform&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;and the &lt;strong&gt;developer’s time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a rare combo.&lt;/p&gt;

&lt;p&gt;It gives you modern frontend capabilities without acting like the browser is an annoying implementation detail.&lt;/p&gt;

&lt;p&gt;And it gives you structure without forcing a whole religion on you.&lt;/p&gt;

&lt;p&gt;That alone makes it worth paying attention to.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Check it out
&lt;/h2&gt;

&lt;p&gt;If you want to explore it yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm: &lt;code&gt;@bquery/bquery&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;code&gt;bQuery/bQuery&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;docs / website: &lt;code&gt;bquery.flausch-code.de&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the official package, repository, and project site references you shared for this article request. (&lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7?utm_source=openai"&gt;dev.to&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;bQuery 1.9.0&lt;/strong&gt; continues to be one of the more interesting “modern web without unnecessary drama” libraries out there.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jQuery-like DOM ergonomics&lt;/li&gt;
&lt;li&gt;signals-based reactivity&lt;/li&gt;
&lt;li&gt;async composables&lt;/li&gt;
&lt;li&gt;typed Web Components&lt;/li&gt;
&lt;li&gt;modular architecture&lt;/li&gt;
&lt;li&gt;platform-first design&lt;/li&gt;
&lt;li&gt;progressively adoptable APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If vanilla JavaScript had a glow-up, learned modern reactivity, embraced Web Components, and started making better life decisions, it would probably look a lot like bQuery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Peace out,&lt;br&gt;&lt;br&gt;
— Josun&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Meet bQuery: a TypeScript-first DOM library with jQuery-style chaining, reactive APIs, zero runtime deps, and modern web features out of the box. #TypeScript #WebDev

bquery.flausch-code.de</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 06 Apr 2026 11:38:47 +0000</pubDate>
      <link>https://dev.to/josunlp/meet-bquery-a-typescript-first-dom-library-with-jquery-style-chaining-reactive-apis-zero-runtime-2400</link>
      <guid>https://dev.to/josunlp/meet-bquery-a-typescript-first-dom-library-with-jquery-style-chaining-reactive-apis-zero-runtime-2400</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Wed, 01 Apr 2026 13:04:43 +0000</pubDate>
      <link>https://dev.to/josunlp/-2efg</link>
      <guid>https://dev.to/josunlp/-2efg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Mon, 30 Mar 2026 23:21:50 +0000</pubDate>
      <link>https://dev.to/josunlp/-4km2</link>
      <guid>https://dev.to/josunlp/-4km2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__hidden-navigation-link"&gt;bQuery.js 🥂 The jQuery for the Modern Web Platform&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/josunlp" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" alt="josunlp profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/josunlp" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jonas Pfalzgraf
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jonas Pfalzgraf
                
              
              &lt;div id="story-author-preview-content-3426234" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/josunlp" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F632661%2F66220cf5-baca-4ca5-be93-40f58a0a41e4.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jonas Pfalzgraf&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 29&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7" id="article-link-3426234"&gt;
          bQuery.js 🥂 The jQuery for the Modern Web Platform
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>bQuery.js 🥂 The jQuery for the Modern Web Platform</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:04:45 +0000</pubDate>
      <link>https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7</link>
      <guid>https://dev.to/josunlp/bqueryjs-the-jquery-for-the-modern-web-platform-10o7</guid>
      <description>&lt;p&gt;&lt;em&gt;A deep-dive into the modular, zero-build frontend framework that bridges the gap between vanilla JavaScript and full-blown frameworks&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Remember jQuery? That legendary library that made DOM manipulation actually enjoyable back in the day? Well, times have changed, browsers became smarter, the web platform grew up, and build toolchains ballooned into something that requires a PhD to configure properly.&lt;/p&gt;

&lt;p&gt;But here's the thing: sometimes you just want to grab an element, wire up some reactive state, and get on with your life. No Vite config, no &lt;code&gt;node_modules&lt;/code&gt; rabbit hole, no framework-specific mental model to internalize. Just... JavaScript. On the web. Like the good ol' days, but modern.&lt;/p&gt;

&lt;p&gt;That's exactly where &lt;strong&gt;bQuery.js&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;bQuery (v1.7.0 as of this writing) describes itself as &lt;em&gt;"the jQuery for the modern web platform"&lt;/em&gt; and it earns that title. It takes the directness and ergonomics of jQuery and layers on signals-based reactivity, async data composables, native Web Components, motion, forms, i18n, accessibility primitives, drag-and-drop, SSR, and a whole lot more. All of it modular. All of it progressively adoptable.&lt;/p&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What Is bQuery?&lt;/li&gt;
&lt;li&gt;Getting Started Zero Build, No Excuses&lt;/li&gt;
&lt;li&gt;The Core API Good Old DOM Manipulation&lt;/li&gt;
&lt;li&gt;Reactive Primitives Signals All the Way Down&lt;/li&gt;
&lt;li&gt;Async Data &amp;amp; Fetching&lt;/li&gt;
&lt;li&gt;Building Web Components with bQuery&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@bquery/ui&lt;/code&gt; The Default Component Library&lt;/li&gt;
&lt;li&gt;The Broader Ecosystem at a Glance&lt;/li&gt;
&lt;li&gt;When Should You Reach for bQuery?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. What Is bQuery?
&lt;/h2&gt;

&lt;p&gt;bQuery is a modular JavaScript/TypeScript library published under &lt;code&gt;@bquery/bquery&lt;/code&gt; on npm. Its philosophy can be summed up in three bullet points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero build required&lt;/strong&gt; works via CDN or ES modules straight in the browser; Vite is optional&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure by default&lt;/strong&gt; sanitized DOM operations and Trusted Types compatibility out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progressive&lt;/strong&gt; import only what you need, add complexity only where you need it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The package is split into focused submodules so you never pay for what you don't use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;core&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selectors, DOM manipulation, events, utilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reactive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signals, computed, effects, async composables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;component&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Typed Web Components with Shadow DOM control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;motion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transitions, FLIP, springs, parallax, typewriter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;security&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sanitization, Trusted Types, CSP helpers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platform&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Storage, cookies, cache, page meta, announcer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;router&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SPA routing with guards and declarative links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;store&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signal-based global state with persistence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;forms&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reactive form state and validators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i18n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Locale, translations, pluralization, Intl formatting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a11y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Focus traps, skip links, live regions, media audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dnd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Draggable, drop zones, sortable lists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;media&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Viewport, network, battery, clipboard wrappers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom directive and component registration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devtools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signal/store/component inspection at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;testing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Component mounts, mock signals, async assertions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Server-side rendering with hydration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's a lot of ground covered and yet the entry point stays clean because you only import what you actually touch.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Getting Started Zero Build, No Excuses
&lt;/h2&gt;

&lt;p&gt;The fastest way to try bQuery is dropping a &lt;code&gt;&amp;lt;script type="module"&amp;gt;&lt;/code&gt; into an HTML file:&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;bQuery Demo&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"counter"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Count: 0&lt;span class="nt"&gt;&amp;lt;/button&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&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;https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs&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;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&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;effect&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="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Count: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&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="s2"&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;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&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="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No build step. No config. Reactive state, DOM manipulation, and event handling in ~10 lines. If that doesn't put a smile on your face, I don't know what will.&lt;/p&gt;

&lt;p&gt;For project-based setups you install it the usual way:&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; @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
pnpm add @bquery/bquery
&lt;span class="c"&gt;# or&lt;/span&gt;
bun add @bquery/bquery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then import from the main entry point or directly from individual submodules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Everything from one place&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@bquery/bquery&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Or surgically pick submodules&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;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&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;@bquery/bquery/core&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;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useFetch&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;@bquery/bquery/reactive&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;component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;registerDefaultComponents&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;@bquery/bquery/component&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;
  
  
  3. The Core API Good Old DOM Manipulation
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;core&lt;/code&gt; module is the jQuery-familiar part of bQuery. You get &lt;code&gt;$&lt;/code&gt; for single elements and &lt;code&gt;$$&lt;/code&gt; for collections. Both return wrapper objects with a chainable API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;$$&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;@bquery/bquery/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Single element throws if not found&lt;/span&gt;
&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#app&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;addClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;loaded&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;css&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rebeccapurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.2rem&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;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello, bQuery!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Multiple elements&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&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="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggleClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The single-element wrapper (&lt;code&gt;BQueryElement&lt;/code&gt;) covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class/attribute helpers&lt;/strong&gt;: &lt;code&gt;addClass&lt;/code&gt;, &lt;code&gt;removeClass&lt;/code&gt;, &lt;code&gt;toggleClass&lt;/code&gt;, &lt;code&gt;attr&lt;/code&gt;, &lt;code&gt;removeAttr&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;prop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt; (sanitized by default!), &lt;code&gt;htmlUnsafe&lt;/code&gt;, &lt;code&gt;append&lt;/code&gt;, &lt;code&gt;prepend&lt;/code&gt;, &lt;code&gt;before&lt;/code&gt;, &lt;code&gt;after&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility&lt;/strong&gt;: &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;hide&lt;/code&gt;, &lt;code&gt;toggle&lt;/code&gt;, &lt;code&gt;css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt;: &lt;code&gt;on&lt;/code&gt;, &lt;code&gt;once&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;, &lt;code&gt;trigger&lt;/code&gt;, &lt;code&gt;delegate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traversal&lt;/strong&gt;: &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;closest&lt;/code&gt;, &lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;children&lt;/code&gt;, &lt;code&gt;siblings&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOM manipulation&lt;/strong&gt;: &lt;code&gt;wrap&lt;/code&gt;, &lt;code&gt;unwrap&lt;/code&gt;, &lt;code&gt;replaceWith&lt;/code&gt;, &lt;code&gt;detach&lt;/code&gt;, &lt;code&gt;scrollTo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Form helpers&lt;/strong&gt;: &lt;code&gt;serialize&lt;/code&gt;, &lt;code&gt;serializeString&lt;/code&gt;, &lt;code&gt;val&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt;: &lt;code&gt;rect&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;, &lt;code&gt;outerWidth&lt;/code&gt;, &lt;code&gt;outerHeight&lt;/code&gt;, &lt;code&gt;position&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice that &lt;code&gt;html()&lt;/code&gt; is sanitized by default. That's the "secure by default" principle in practice you have to explicitly call &lt;code&gt;htmlUnsafe()&lt;/code&gt; to bypass it. A small thing that prevents a whole class of XSS bugs.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;core&lt;/code&gt; module also ships a solid utility belt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;throttle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;utils&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;@bquery/bquery/core&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;save&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;debounce&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;saved!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// cancelable&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "component-xyz123"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;a&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;b&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="c1"&gt;// { a: 1, b: 2 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilities include &lt;code&gt;clone&lt;/code&gt;, &lt;code&gt;pick&lt;/code&gt;, &lt;code&gt;omit&lt;/code&gt;, &lt;code&gt;slugify&lt;/code&gt;, &lt;code&gt;truncate&lt;/code&gt;, &lt;code&gt;chunk&lt;/code&gt;, &lt;code&gt;flatten&lt;/code&gt;, &lt;code&gt;compact&lt;/code&gt;, &lt;code&gt;unique&lt;/code&gt;, &lt;code&gt;randomInt&lt;/code&gt;, &lt;code&gt;clamp&lt;/code&gt;, and a full suite of type guards (&lt;code&gt;isString&lt;/code&gt;, &lt;code&gt;isElement&lt;/code&gt;, &lt;code&gt;isPromise&lt;/code&gt;, etc.). It's the kind of utility layer that means you actually &lt;em&gt;don't&lt;/em&gt; need lodash.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Reactive Primitives Signals All the Way Down
&lt;/h2&gt;

&lt;p&gt;This is where bQuery steps firmly into modern territory. The reactive module gives you fine-grained reactivity through signals the same primitive that's now baked into Angular, Solid, and Preact signals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watch&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;@bquery/bquery/reactive&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;firstName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&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="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Doe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Computed values are lazy and cached&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;firstName&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="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="nx"&gt;value&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="c1"&gt;// Effects run immediately, re-run on dependency change&lt;/span&gt;
&lt;span class="nf"&gt;effect&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fullName&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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Batch multiple updates into a single notification pass&lt;/span&gt;
&lt;span class="nf"&gt;batch&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="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Jane&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Smith&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;// Watch with old/new value comparison&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;watch&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newVal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldVal&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Changed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;oldVal&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;newVal&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="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// unsubscribe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things worth highlighting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.peek()&lt;/code&gt;&lt;/strong&gt; reads the value without creating a reactive dependency. Useful when you need to read inside an effect without it re-subscribing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.update(fn)&lt;/code&gt;&lt;/strong&gt; updates based on the current value handy for immutable patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;signal.dispose()&lt;/code&gt;&lt;/strong&gt; removes all subscribers and prevents memory leaks. Important for long-lived apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;readonly(signal)&lt;/code&gt;&lt;/strong&gt; creates a read-only view. Great for exposing reactive state from a store without allowing external mutation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;untrack(() =&amp;gt; ...)&lt;/code&gt;&lt;/strong&gt; reads signals inside an effect without tracking them as dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;persistedSignal&lt;/code&gt;&lt;/strong&gt; syncs a signal to &lt;code&gt;localStorage&lt;/code&gt; automatically, with graceful fallbacks for SSR and Safari private mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;persistedSignal&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;@bquery/bquery/reactive&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;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;persistedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme&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="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Saved to localStorage automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;linkedSignal&lt;/code&gt;&lt;/strong&gt; creates a writable computed you provide both a getter and a setter, so writes can fan out to multiple underlying signals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&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;@bquery/bquery/reactive&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;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ada&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;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lovelace&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;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;linkedSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;first&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="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;last&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;next&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nextFirst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nextLast&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;next&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="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextFirst&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nextLast&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Grace Hopper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Fans out to first and last&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Errors inside effects are caught and logged rather than crashing the reactive system subsequent updates keep working. That's a nice resilience property you don't always get for free.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Async Data &amp;amp; Fetching
&lt;/h2&gt;

&lt;p&gt;Managing loading states, errors, and async lifecycles is boilerplate-heavy in vanilla JS. bQuery abstracts all of that into two composables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;useAsyncData&lt;/code&gt;&lt;/strong&gt; wraps any async function in a signal-based lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useAsyncData&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;@bquery/bquery/reactive&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;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useAsyncData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;        &lt;span class="c1"&gt;// re-run when userId changes&lt;/span&gt;
    &lt;span class="na"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Reactive state you can bind directly to the DOM&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;status&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="c1"&gt;// 'idle' | 'pending' | 'success' | 'error'&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;pending&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="c1"&gt;// boolean&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;data&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="c1"&gt;// the resolved data&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;error&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="c1"&gt;// Error | null&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// manually trigger&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;         &lt;span class="c1"&gt;// reset everything&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// stop watchers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;useFetch&lt;/code&gt;&lt;/strong&gt; builds on top of that and adds HTTP niceties base URLs, query params, custom headers, automatic JSON serialization, and pluggable response parsers (&lt;code&gt;json&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;blob&lt;/code&gt;, &lt;code&gt;arrayBuffer&lt;/code&gt;, &lt;code&gt;formData&lt;/code&gt;, &lt;code&gt;response&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useFetch&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;@bquery/bquery/reactive&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;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useFetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/users&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;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&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;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer my-token&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For shared defaults across multiple requests, &lt;code&gt;createUseFetch&lt;/code&gt; acts as a factory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUseFetch&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;@bquery/bquery/reactive&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;useApi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUseFetch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-client&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="s1"&gt;my-app&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;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/profile&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;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useApi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/posts&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;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;page&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern is really clean for larger apps where you want a pre-configured fetch instance rather than repeating base URLs everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Building Web Components with bQuery
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;component&lt;/code&gt; module is where bQuery really shines for component-driven architectures. It wraps the native Custom Elements API with typed props, optional internal state, scoped reactivity, and a sanitized render function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bool&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;@bquery/bquery/component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card&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;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/default-avatar.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;clicks&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="na"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
    .card { display: grid; gap: 0.5rem; padding: 1rem; border-radius: 8px; }
    .active { border: 2px solid #4f46e5; }
  `&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card mounted&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;disconnected&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user-card removed&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;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;emit&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;html&lt;/span&gt;&lt;span class="s2"&gt;`
      &amp;lt;button
        class="card &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&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="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"
        &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disabled&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
        @click=&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clicks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clicks&lt;/span&gt; &lt;span class="o"&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;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;card-clicked&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;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;
      &amp;gt;
        &amp;lt;img src="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" alt="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" /&amp;gt;
        &amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/strong&amp;gt;
        &amp;lt;span&amp;gt;Clicked &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clicks&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; times&amp;lt;/span&amp;gt;
      &amp;lt;/button&amp;gt;
    `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Usage --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;user-card&lt;/span&gt; &lt;span class="na"&gt;username=&lt;/span&gt;&lt;span class="s"&gt;"Jonas"&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/user-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things to appreciate here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Props are typed and coerced automatically.&lt;/strong&gt; Strings stay strings, numbers get &lt;code&gt;Number()&lt;/code&gt; called on them, booleans understand &lt;code&gt;'true'&lt;/code&gt;, &lt;code&gt;''&lt;/code&gt;, &lt;code&gt;'1'&lt;/code&gt;, &lt;code&gt;'false'&lt;/code&gt;, &lt;code&gt;'0'&lt;/code&gt;. Objects get &lt;code&gt;JSON.parse&lt;/code&gt;d. You can also add a &lt;code&gt;validator&lt;/code&gt; function to enforce invariants at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The render output is sanitized before being written to the Shadow DOM.&lt;/strong&gt; You get security by default with an explicit opt-in mechanism (&lt;code&gt;safeHtml&lt;/code&gt;, &lt;code&gt;trusted&lt;/code&gt;) when you need to pass sanitized fragments through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shadow DOM mode is configurable.&lt;/strong&gt; Open shadow root by default, but you can go closed or render directly into light DOM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;inline-banner&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;shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// renders in light DOM&lt;/span&gt;
  &lt;span class="na"&gt;render&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;p class="banner"&amp;gt;No shadow needed here&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lifecycle hooks&lt;/strong&gt; cover everything you need: &lt;code&gt;beforeMount&lt;/code&gt;, &lt;code&gt;connected&lt;/code&gt;, &lt;code&gt;beforeUpdate&lt;/code&gt; (return &lt;code&gt;false&lt;/code&gt; to cancel a re-render), &lt;code&gt;updated&lt;/code&gt;, &lt;code&gt;disconnected&lt;/code&gt;, &lt;code&gt;onError&lt;/code&gt;, &lt;code&gt;onAdopted&lt;/code&gt;, and &lt;code&gt;onAttributeChanged&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoped reactive helpers&lt;/strong&gt; (&lt;code&gt;useSignal&lt;/code&gt;, &lt;code&gt;useComputed&lt;/code&gt;, &lt;code&gt;useEffect&lt;/code&gt;) create component-local reactive resources that are cleaned up automatically on disconnect no manual cleanup needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;live-timer&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;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;seconds&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;connected&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;tick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSignal&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;useEffect&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;seconds&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tick&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="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;state&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;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;p&amp;gt;Elapsed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;s&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;External signals can drive re-renders&lt;/strong&gt; via the &lt;code&gt;signals&lt;/code&gt; option, keeping component updates predictable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&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;@bquery/bquery/reactive&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;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&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;themeClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`theme-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;theme&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;component&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;theme-badge&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;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;themeClass&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;signals&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;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;span class="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;themeClass&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="s2"&gt;"&amp;gt;Current theme&amp;lt;/span&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. &lt;code&gt;@bquery/ui&lt;/code&gt; The Default Component Library
&lt;/h2&gt;

&lt;p&gt;bQuery ships a companion component library that's registered through &lt;code&gt;registerDefaultComponents()&lt;/code&gt;. It's a small, zero-dependency set of native UI primitives no external CSS framework required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineBqueryConfig&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;@bquery/bquery/platform&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;registerDefaultComponents&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;@bquery/bquery/component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Configure a custom prefix (default is 'ui')&lt;/span&gt;
&lt;span class="nf"&gt;defineBqueryConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ui&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;transitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;skipOnReducedMotion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;registerDefaultComponents&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// {&lt;/span&gt;
&lt;span class="c1"&gt;//   button: 'ui-button',&lt;/span&gt;
&lt;span class="c1"&gt;//   card: 'ui-card',&lt;/span&gt;
&lt;span class="c1"&gt;//   input: 'ui-input',&lt;/span&gt;
&lt;span class="c1"&gt;//   textarea: 'ui-textarea',&lt;/span&gt;
&lt;span class="c1"&gt;//   checkbox: 'ui-checkbox'&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The available primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-button&lt;/code&gt;&lt;/strong&gt; pill-shaped button with &lt;code&gt;variant&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, and &lt;code&gt;disabled&lt;/code&gt; props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-card&lt;/code&gt;&lt;/strong&gt; container with optional &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, and &lt;code&gt;elevated&lt;/code&gt; props&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-input&lt;/code&gt;&lt;/strong&gt; labeled text input that emits &lt;code&gt;input&lt;/code&gt; events with &lt;code&gt;{ value }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-textarea&lt;/code&gt;&lt;/strong&gt; labeled textarea, same event contract as &lt;code&gt;ui-input&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ui-checkbox&lt;/code&gt;&lt;/strong&gt; labeled checkbox that emits &lt;code&gt;change&lt;/code&gt; events with &lt;code&gt;{ checked }&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These components use regular HTML slots and bubble custom events, so they play nicely with forms, routers, and shadow DOM boundaries. You can compose them directly in your markup:&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;ui-card&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Create Account"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-input&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-input&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-input&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-input&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-checkbox&lt;/span&gt; &lt;span class="na"&gt;label=&lt;/span&gt;&lt;span class="s"&gt;"Accept terms"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ui-checkbox&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ui-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;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign Up&lt;span class="nt"&gt;&amp;lt;/ui-button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ui-card&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And wire them up reactively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signal&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;@bquery/bquery&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;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&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;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ui-input[label="Name"]&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;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;input&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="nx"&gt;e&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;CustomEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="nx"&gt;detail&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prefix system via &lt;code&gt;defineBqueryConfig&lt;/code&gt; is a nice touch for teams with strict naming conventions, or for avoiding collisions when integrating bQuery components into an existing design system.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The Broader Ecosystem at a Glance
&lt;/h2&gt;

&lt;p&gt;bQuery v1.7.0 covers a surprising amount of ground beyond what we've walked through. Here's a quick tour of the other modules:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Router&lt;/strong&gt; full SPA routing with constrained params, guards, redirects, and declarative &lt;code&gt;&amp;lt;bq-link&amp;gt;&lt;/code&gt; elements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store&lt;/strong&gt; signal-based global state with persistence, migrations, and action lifecycle hooks. Think a lightweight Pinia, but framework-agnostic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt; declarative &lt;code&gt;bq-*&lt;/code&gt; attribute directives (&lt;code&gt;bq-text&lt;/code&gt;, &lt;code&gt;bq-show&lt;/code&gt;, &lt;code&gt;bq-class&lt;/code&gt;, etc.) for template-style binding without a full component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Motion&lt;/strong&gt; transitions, FLIP animations, springs, parallax, typewriter effects, and scroll-linked animations. Respects &lt;code&gt;prefers-reduced-motion&lt;/code&gt; by default when configured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;i18n&lt;/strong&gt; reactive locale state, nested translation keys, pluralization rules, and Intl-based date/number/relative-time formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a11y&lt;/strong&gt; focus traps, skip navigation links, live region announcers, and audit helpers that flag missing ARIA attributes at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DnD&lt;/strong&gt; make any element draggable, define drop zones, build sortable lists without reaching for a third-party library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt; &lt;code&gt;renderComponent&lt;/code&gt;, &lt;code&gt;fireEvent&lt;/code&gt;, &lt;code&gt;waitFor&lt;/code&gt; utilities that mirror what you'd expect from Testing Library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSR&lt;/strong&gt; &lt;code&gt;renderToString&lt;/code&gt; for server-side HTML generation and &lt;code&gt;hydrateMount&lt;/code&gt; for seamlessly picking up where the server left off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storybook helpers&lt;/strong&gt; &lt;code&gt;storyHtml()&lt;/code&gt; and &lt;code&gt;when()&lt;/code&gt; for writing safe Storybook stories with boolean attribute shorthand (&lt;code&gt;?disabled=${true}&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  9. When Should You Reach for bQuery?
&lt;/h2&gt;

&lt;p&gt;bQuery isn't trying to replace React, Vue, or Svelte for large-scale applications with complex component trees and heavy state management. It's solving a different problem.&lt;/p&gt;

&lt;p&gt;Reach for bQuery when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want reactivity and component primitives &lt;strong&gt;without a build pipeline&lt;/strong&gt; prototypes, experiments, browser extensions, internal tools&lt;/li&gt;
&lt;li&gt;You're writing &lt;strong&gt;vanilla JS/TS&lt;/strong&gt; and want jQuery's ergonomics plus modern signal-based reactivity&lt;/li&gt;
&lt;li&gt;You need &lt;strong&gt;native Web Components&lt;/strong&gt; with typed props and a sane lifecycle, but don't want to set up Lit or Stencil&lt;/li&gt;
&lt;li&gt;You're building &lt;strong&gt;progressively enhanced&lt;/strong&gt; pages where a CDN import is all you need&lt;/li&gt;
&lt;li&gt;You want to ship &lt;strong&gt;accessible, secure-by-default&lt;/strong&gt; UI without bolting on extra libraries for sanitization, focus management, and ARIA&lt;/li&gt;
&lt;li&gt;You're working on a &lt;strong&gt;small-to-medium project&lt;/strong&gt; where a full SPA framework would be overkill&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's also genuinely useful as a companion in larger apps you could use bQuery's reactive core alongside an existing codebase for specific interactive islands without committing to a full rewrite.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;p&gt;bQuery v1.7.0 is one of those rare libraries that manages to feel both nostalgic and completely modern at the same time. It channels the simplicity of jQuery while embracing everything the web platform has become signals, Web Components, Trusted Types, &lt;code&gt;fetch&lt;/code&gt;, Shadow DOM, the whole lot.&lt;/p&gt;

&lt;p&gt;The zero-build path alone makes it worth knowing about. Being able to drop a single CDN import into an HTML file and immediately have signals, reactive DOM manipulation, typed components, and async data composables is genuinely impressive.&lt;/p&gt;

&lt;p&gt;If you've been eyeing signals-based reactivity but felt the existing frameworks were too opinionated or too heavyweight for your use case, bQuery is absolutely worth exploring.&lt;/p&gt;

&lt;p&gt;Give it a spin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📒¦ npm: &lt;a href="https://www.npmjs.com/package/@bquery/bquery" rel="noopener noreferrer"&gt;&lt;code&gt;@bquery/bquery&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 – Docs: &lt;a href="https://bquery.js.org/" rel="noopener noreferrer"&gt;bquery.js.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! If you have questions or feedback, drop them in the comments. And if you're using bQuery in a project, I'd love to hear about it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>QRify v1.3: The Privacy-First QR Code Generator Got Even Better! 🔐</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Sat, 06 Dec 2025 15:29:55 +0000</pubDate>
      <link>https://dev.to/josunlp/qrify-v13-the-privacy-first-qr-code-generator-got-even-better-5e9j</link>
      <guid>https://dev.to/josunlp/qrify-v13-the-privacy-first-qr-code-generator-got-even-better-5e9j</guid>
      <description>&lt;p&gt;Hi everyone! 👋&lt;/p&gt;

&lt;p&gt;Remember my rant about &lt;a href="https://dev.to/josunlp/shady-qr-code-generator-pages-ugh-58c0"&gt;shady QR code generator pages&lt;/a&gt;? You know, the ones that want your subscription, your login, your firstborn child, and probably your soul just to generate a simple QR code?&lt;/p&gt;

&lt;p&gt;Well, I didn't just complain about it — I built something. And now it's even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Introducing: QRify v1.3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;QRify&lt;/a&gt; started as a quick weekend project born out of frustration. But you know how it goes — you start with "just a simple QR code generator" and suddenly you're knee-deep in i18n configuration files at 2 AM, translating "Download" into 27 languages.&lt;/p&gt;

&lt;p&gt;No regrets though. It was worth it.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Check It Out
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;a href="https://qr.flausch-code.de/" rel="noopener noreferrer"&gt;qr.flausch-code.de/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code repo&lt;/strong&gt;: &lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;GitHub - JosunLP/qr-code-generator&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;p&gt;Let me break down what QRify can do for you:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Multiple QR Code Types
&lt;/h3&gt;

&lt;p&gt;Not just boring text QR codes. QRify supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text&lt;/strong&gt; — The classic. Type anything, get a QR code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt; — Scannable links, no fuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vCard&lt;/strong&gt; — Full business cards! Name, phone, email, address, company, website — the whole package.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WiFi&lt;/strong&gt; — Share your network credentials without awkwardly spelling out your password.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt; — Pre-composed emails with recipient, subject, and body.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📥 Export Formats Galore
&lt;/h3&gt;

&lt;p&gt;Choose your poison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;Raster&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SVG&lt;/td&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;GIF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;TIFF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SVG is my personal favorite — it scales infinitely without getting pixelated. Perfect for print.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Privacy-First (For Real)
&lt;/h3&gt;

&lt;p&gt;This is the big one. QRify runs &lt;strong&gt;100% client-side&lt;/strong&gt;. Your data never leaves your browser. Ever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ No tracking&lt;/li&gt;
&lt;li&gt;❌ No analytics&lt;/li&gt;
&lt;li&gt;❌ No login required&lt;/li&gt;
&lt;li&gt;❌ No subscription&lt;/li&gt;
&lt;li&gt;❌ No server-side processing&lt;/li&gt;
&lt;li&gt;✅ Just pure, unadulterated QR code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't build this to harvest your data. I built it because I needed a tool that respects privacy.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 27 Languages
&lt;/h3&gt;

&lt;p&gt;Yeah, you read that right. &lt;strong&gt;Twenty-seven&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;QRify auto-detects your browser language and switches automatically. Or you can pick manually from the dropdown. We've got everything from English to Arabic, Japanese to Ukrainian, and a bunch more in between.&lt;/p&gt;

&lt;p&gt;Here's the full list:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;English, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Russian, Swedish, Chinese, Japanese, Korean, Turkish, Arabic, Hindi, Czech, Greek, Hungarian, Romanian, Ukrainian, Vietnamese, Thai, Indonesian, Danish, Norwegian, Finnish&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Did I translate all of these myself? Let's just say I had some... assistance. 😅 But hey, if you spot a weird translation, PRs are welcome!&lt;/p&gt;

&lt;h3&gt;
  
  
  📱 Progressive Web App (PWA)
&lt;/h3&gt;

&lt;p&gt;QRify is installable. On your phone. On your desktop. Works offline after the first load. Gets automatic updates.&lt;/p&gt;

&lt;p&gt;It's basically an app without the App Store drama.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Tech Stack
&lt;/h2&gt;

&lt;p&gt;For my fellow devs who care about the nerdy details:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vue 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontend framework (Composition API, baby!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Because &lt;code&gt;any&lt;/code&gt; is not a type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build tool &amp;amp; dev server (fast as heck)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tailwind CSS 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Utility-first styling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vue-i18n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internationalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;qrcode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The actual QR code magic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vite-plugin-pwa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PWA support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bun&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runtime &amp;amp; package manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I went with Vue 3 because, well, I'm a Vue person. You probably figured that out by now if you've read my other articles. The Composition API makes the component logic so much cleaner compared to the old Options API days.&lt;/p&gt;

&lt;p&gt;Tailwind CSS 4 is the new hotness, and combined with Vite's speed, the development experience is &lt;em&gt;chef's kiss&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;Want to run it locally or contribute? Here's how:&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;# Clone the repo&lt;/span&gt;
git clone https://github.com/JosunLP/qr-code-generator.git
&lt;span class="nb"&gt;cd &lt;/span&gt;qr-code-generator

&lt;span class="c"&gt;# Install dependencies (I recommend Bun, but npm works too)&lt;/span&gt;
bun &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start the dev server&lt;/span&gt;
bun run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You're up and running at &lt;code&gt;http://localhost:5173&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ What's Next?
&lt;/h2&gt;

&lt;p&gt;I've got some ideas brewing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More QR code types (SMS, geo-location, calendar events?)&lt;/li&gt;
&lt;li&gt;Custom styling options (colors, logos in the center?)&lt;/li&gt;
&lt;li&gt;Batch generation&lt;/li&gt;
&lt;li&gt;History/favorites (stored locally, of course)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But honestly, I'm open to suggestions. What would make QRify more useful for you?&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 Contribution
&lt;/h2&gt;

&lt;p&gt;This is open source, and I genuinely appreciate contributions. Whether it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Bug fixes&lt;/li&gt;
&lt;li&gt;✨ New features&lt;/li&gt;
&lt;li&gt;🌍 Translation improvements&lt;/li&gt;
&lt;li&gt;📝 Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just open a PR or an issue, and let's make it happen.&lt;/p&gt;

&lt;p&gt;The repo: &lt;a href="https://github.com/JosunLP/qr-code-generator" rel="noopener noreferrer"&gt;github.com/JosunLP/qr-code-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, maybe drop a ⭐ on GitHub? It helps more than you'd think!&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QRify&lt;/strong&gt; is a free, open-source QR code generator&lt;/li&gt;
&lt;li&gt;Supports text, URL, vCard, WiFi, and email QR codes&lt;/li&gt;
&lt;li&gt;Exports to SVG, PNG, JPEG, GIF, TIFF, and WebP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;27 languages&lt;/strong&gt; with auto-detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% client-side&lt;/strong&gt; — no tracking, no data collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA&lt;/strong&gt; — install it, use it offline&lt;/li&gt;
&lt;li&gt;Built with Vue 3, TypeScript, Tailwind CSS 4, and Vite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop using shady QR code generators that want your data. Use QRify instead.&lt;/p&gt;

&lt;p&gt;Peace out,&lt;br&gt;
— Josun&lt;/p&gt;

</description>
      <category>vue</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tetris for Logistics: solving the 3D Bin Packing Problem with Rust 🦀</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 05 Dec 2025 09:47:08 +0000</pubDate>
      <link>https://dev.to/josunlp/tetris-for-logistics-solving-the-3d-bin-packing-problem-with-rust-42ag</link>
      <guid>https://dev.to/josunlp/tetris-for-logistics-solving-the-3d-bin-packing-problem-with-rust-42ag</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hi everyone! 👋&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know what’s frustrating? Opening a huge delivery box just to find a tiny item rattling around inside, surrounded by a mountain of bubble wrap. It’s inefficient, it’s bad for the environment, and honestly, it just feels wrong.&lt;/p&gt;

&lt;p&gt;Or maybe you’ve moved house recently and played "Real Life Tetris" trying to fit everything into the moving truck?&lt;/p&gt;

&lt;p&gt;I decided to tackle this problem the way I love most: &lt;strong&gt;with code.&lt;/strong&gt; 💻&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Introducing: sort-it-now
&lt;/h3&gt;

&lt;p&gt;I built &lt;strong&gt;&lt;a href="https://github.com/JosunLP/sort-it-now" rel="noopener noreferrer"&gt;sort-it-now&lt;/a&gt;&lt;/strong&gt;, a 3D packing optimizer written in &lt;strong&gt;Rust&lt;/strong&gt;. The goal is simple but powerful: calculate the most efficient way to pack a set of items into a box (or container) and visualize the result.&lt;/p&gt;

&lt;p&gt;It’s basically an algorithm that plays Tetris for you, but in 3D and with much higher stakes (okay, maybe just better efficiency).&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ The Tech Stack
&lt;/h3&gt;

&lt;p&gt;I chose &lt;strong&gt;Rust&lt;/strong&gt; 🦀 for this project because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Performance:&lt;/strong&gt; When you are calculating 3D space and iterating through thousands of possibilities, speed matters.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Safety:&lt;/strong&gt; Rust’s memory safety guarantees help prevent silly bugs when dealing with complex data structures.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;It’s awesome:&lt;/strong&gt; Let's be honest, writing Rust just feels good.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ✨ Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Intelligent Optimization:&lt;/strong&gt; It calculates the best fit for your items.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;3D Visualization:&lt;/strong&gt; It’s not just a console output saying "It fits." You get an interactive visualization to see &lt;em&gt;how&lt;/em&gt; it fits.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Open Source:&lt;/strong&gt; Because sharing is caring!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Why I built this
&lt;/h3&gt;

&lt;p&gt;I love projects that bridge the gap between abstract algorithms and real-world visual feedback. &lt;code&gt;sort-it-now&lt;/code&gt; was a playground for me to dive deeper into Rust while solving a classic optimization problem (the &lt;em&gt;Bin Packing Problem&lt;/em&gt;). Plus, visualizing the output makes the math feel "real."&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Check it out
&lt;/h3&gt;

&lt;p&gt;The project is hosted on GitHub. I’d love for you to check it out, give it a spin, or maybe even drop a star if you find it cool! ⭐&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/JosunLP/sort-it-now" rel="noopener noreferrer"&gt;JosunLP/sort-it-now&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 Contribution
&lt;/h3&gt;

&lt;p&gt;I'm always open to feedback. If you have ideas on how to make the packing algorithm even smarter, or if you want to improve the visualization, feel free to open an issue or a pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's stop shipping air and start sorting it now!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Peace out,&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;— Josun&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>opensource</category>
      <category>algorithms</category>
      <category>visualization</category>
    </item>
    <item>
      <title>I Supercharged My UserScript Template: Now with ESLint, Prettier, and Full Mobile Support! 🚀</title>
      <dc:creator>Jonas Pfalzgraf</dc:creator>
      <pubDate>Fri, 11 Jul 2025 23:31:30 +0000</pubDate>
      <link>https://dev.to/josunlp/i-supercharged-my-userscript-template-now-with-eslint-prettier-and-full-mobile-support-5ddc</link>
      <guid>https://dev.to/josunlp/i-supercharged-my-userscript-template-now-with-eslint-prettier-and-full-mobile-support-5ddc</guid>
      <description>&lt;p&gt;Hey, dev community!&lt;/p&gt;

&lt;p&gt;I'm super excited to share the latest, and biggest, updates to my &lt;a href="https://github.com/JosunLP/UserScriptProjectTemplate" rel="noopener noreferrer"&gt;UserScript Project Template&lt;/a&gt; on GitHub. I've spent the last few days giving it a major overhaul to modernize the entire development workflow, boost code quality, and—the part I'm most thrilled about—make it fully mobile-ready!&lt;/p&gt;

&lt;p&gt;Let's dive into what's new.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Part 1: A Modern Development Experience
&lt;/h3&gt;

&lt;p&gt;My first goal was to bring the entire development setup up to modern standards. A clean, automated environment is key to writing good code, and this template now has everything you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Quality with ESLint &amp;amp; Prettier&lt;/strong&gt;&lt;br&gt;
Say goodbye to inconsistent code styles! The project now comes pre-configured with ESLint and Prettier to enforce a clean and error-free codebase. I've added &lt;code&gt;.eslintrc.js&lt;/code&gt; and &lt;code&gt;.prettierrc.json&lt;/code&gt; files with solid defaults, full TypeScript support, and custom rules to get you started.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beefed-up Scripts &amp;amp; Dependencies&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;package.json&lt;/code&gt; has been revamped with a bunch of new scripts to make life easier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;npm run lint&lt;/code&gt;: Check your code with ESLint.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run format&lt;/code&gt;: Format the entire codebase with Prettier.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run type-check&lt;/code&gt;: Run the TypeScript compiler to check for type errors.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;npm run clean&lt;/code&gt;: Clean up build artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the necessary dev dependencies for ESLint, Prettier, and TypeScript are, of course, included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modular Architecture &amp;amp; New Utilities&lt;/strong&gt;&lt;br&gt;
The project structure got a significant refactor to be more modular and maintainable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The main application class in &lt;code&gt;src/index.ts&lt;/code&gt; now features a modular architecture, a built-in event system, and examples for using persistent storage and custom styles.&lt;/li&gt;
&lt;li&gt;  New DOM utilities in &lt;code&gt;src/utils/dom.ts&lt;/code&gt; make it a breeze to manipulate elements, inject styles, and check for visibility.&lt;/li&gt;
&lt;li&gt;  A new &lt;code&gt;ExampleModule&lt;/code&gt; in &lt;code&gt;src/modules/example.ts&lt;/code&gt; showcases the event-driven architecture and how to use the new utilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📱 Part 2: The Main Event – Full Mobile Support!
&lt;/h3&gt;

&lt;p&gt;This is the biggest game-changer. UserScripts are no longer just a desktop thing, and this template now fully embraces the mobile web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New &lt;code&gt;MobileModule&lt;/code&gt; for Touch Gestures&lt;/strong&gt;&lt;br&gt;
At the core of this update is the new &lt;code&gt;MobileModule&lt;/code&gt; (&lt;code&gt;src/modules/mobile.ts&lt;/code&gt;). It implements a robust gesture detection system for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Tap&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Swipe&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pinch&lt;/strong&gt; (zoom in/out)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also handles orientation changes and provides mobile-friendly UI elements right out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic Detection &amp;amp; Adaptation&lt;/strong&gt;&lt;br&gt;
The main app in &lt;code&gt;src/index.ts&lt;/code&gt; now automatically detects if it's running on a mobile device. If it is, it initializes the &lt;code&gt;MobileModule&lt;/code&gt;, loads mobile-specific styles, and listens for mobile events like gestures. This makes your script responsive and touch-optimized without any extra work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated Docs &amp;amp; Metadata&lt;/strong&gt;&lt;br&gt;
To reflect all these new capabilities, I've expanded the &lt;code&gt;README.md&lt;/code&gt; and updated the project's metadata (&lt;code&gt;header.config.json&lt;/code&gt;, &lt;code&gt;package.json&lt;/code&gt;). The documentation now includes details on the mobile utilities, supported browsers, and features like responsive design and safe area handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping Up
&lt;/h3&gt;

&lt;p&gt;These changes make the template a powerful starting point for any UserScript project. You get a modern development environment with top-tier tooling, a clean and scalable architecture, and the versatility to build scripts that work beautifully on both desktop and mobile.&lt;/p&gt;

&lt;p&gt;I'm really proud of how this turned out and I hope you find it useful!&lt;/p&gt;

&lt;p&gt;Feel free to check out the project on GitHub, give it a try, and let me know what you think. I appreciate every star and contribution!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the repo here:&lt;/strong&gt; &lt;a href="https://github.com/JosunLP/UserScriptProjectTemplate" rel="noopener noreferrer"&gt;https://github.com/JosunLP/UserScriptProjectTemplate&lt;/a&gt;&lt;/p&gt;

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

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