<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Joe Pea</title>
    <description>The latest articles on Forem by Joe Pea (@trusktr).</description>
    <link>https://forem.com/trusktr</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%2F94254%2F332c897b-9261-4d5c-9299-6fd77bd4e655.jpg</url>
      <title>Forem: Joe Pea</title>
      <link>https://forem.com/trusktr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/trusktr"/>
    <language>en</language>
    <item>
      <title>Write concise Custom Elements for React, Vue, Svelte, Solid, etc. Write once, use everywhere, type checked!</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Tue, 13 Jan 2026 07:40:01 +0000</pubDate>
      <link>https://forem.com/trusktr/write-concise-custom-elements-for-react-vue-svelte-solid-etc-write-once-use-everywhere-with-27ik</link>
      <guid>https://forem.com/trusktr/write-concise-custom-elements-for-react-vue-svelte-solid-etc-write-once-use-everywhere-with-27ik</guid>
      <description>&lt;p&gt;I'm proud to release &lt;a href="https://github.com/lume/element/releases/tag/v0.17.0" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt; v0.17.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This release adds support for Solid.js memos and effects for Custom Elements via decorator syntax.&lt;/p&gt;

&lt;p&gt;Concisely write custom HTML elements, type checked in React, Vue, Svelte, Solid.js, React, Stencil, and more.&lt;/p&gt;

&lt;p&gt;Here's a glance at what elements authored with &lt;code&gt;@lume/element&lt;/code&gt; look like in JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;numberAttribute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventAttribute&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;@lume/element&lt;/span&gt;&lt;span class="dl"&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;memo&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;startEffects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stopEffects&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;classy-solid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;element&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FurryDog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Element&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;numberAttribute&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;eventAttribute&lt;/span&gt; &lt;span class="nx"&gt;onwoof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;memo&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;dogYears&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;effect&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nf"&gt;log&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;dog years:&lt;/span&gt;&lt;span class="dl"&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;dogYears&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;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;woof&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// bark any time age changes&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;template&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt; &lt;span class="nx"&gt;years&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;dogYears&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
  &lt;span class="nx"&gt;css&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`:host {color: cornflowerblue}`&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;dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;furry-dog&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="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// initially logs "dog years: 49"&lt;/span&gt;

&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="c1"&gt;// logs "dog years: 56"&lt;/span&gt;

&lt;span class="c1"&gt;// ...later, effects cleaned up when removed from DOM...&lt;/span&gt;
&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// ...later, effects re-started if element reconnected...&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;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use the custom element in HTML, or declarative framework templates.&lt;/p&gt;

&lt;p&gt;HTML:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;furry-dog&lt;/span&gt; &lt;span class="na"&gt;years=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"dog"&lt;/span&gt; &lt;span class="na"&gt;onwoof=&lt;/span&gt;&lt;span class="s"&gt;"console.log('woof!')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/furry-dog&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&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;React, Preact:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAge&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;furry&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;dog&lt;/span&gt; &lt;span class="na"&gt;years&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onwoof&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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;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;woof!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Solid.js JSX:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setAge&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSignal&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;furry&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="na"&gt;dog&lt;/span&gt; &lt;span class="na"&gt;years&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;age&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="na"&gt;woof&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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;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;woof!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Vue:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;furry-dog&lt;/span&gt; &lt;span class="na"&gt;:years=&lt;/span&gt;&lt;span class="s"&gt;"age"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;woof=&lt;/span&gt;&lt;span class="s"&gt;"console.log('woof!')"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Svelte:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;furry&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onwoof&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="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;woof!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Type checking is available for all the above frameworks, including in the &lt;code&gt;template&lt;/code&gt;s of the elements defined with &lt;code&gt;@lume/element&lt;/code&gt; (templates are powered by (&lt;a class="mentioned-user" href="https://dev.to/ryansolid"&gt;@ryansolid&lt;/a&gt;'s) Solid.js). See the docs on &lt;a href="https://github.com/lume/element?tab=readme-ov-file#type-definitions-for-custom-elements-in-frameworks" rel="noopener noreferrer"&gt;how to connect your element definition to the type systems of each framework&lt;/a&gt;, and the various &lt;a href="https://github.com/lume/element/tree/main/examples" rel="noopener noreferrer"&gt;examples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/element" rel="noopener noreferrer"&gt;
        element
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fast and simple custom elements.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;@lume/element &lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Easily and concisely write Custom Elements with simple templates and reactivity.&lt;/p&gt;

&lt;p&gt;Use the custom elements on their own in plain HTML or vanilla JavaScript, or in
Vue, Svelte, Solid.js, Stencil.js, React, and Preact, with full type checking
autocompletion, and intellisense in all the template systems of those
frameworks, in any IDE that supports TypeScript such as VS Code.&lt;/p&gt;
&lt;p&gt;Write your elements once, then use them in any app, with a complete developer
experience no matter which base component system your app uses.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;code&gt;&lt;strong&gt;npm install @lume/element&lt;/strong&gt;&lt;/code&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;💡&lt;strong&gt;Tip:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are new to Custom Elements, first &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_custom_elements" rel="nofollow noopener noreferrer"&gt;learn about the basics of Custom
Element
APIs&lt;/a&gt;
available natively in browsers. Lume Element simplifies the creation of Custom
Elements compared to writing them with vanilla APIs, but sometimes vanilla
APIs are all that is needed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Live demos &lt;/h1&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://lume.io" rel="nofollow noopener noreferrer"&gt;Lume 3D HTML&lt;/a&gt; (The landing page, all of Lume's 3D elements, and the live code editors…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/element" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>customelements</category>
      <category>solidjs</category>
      <category>vue</category>
      <category>svelte</category>
    </item>
    <item>
      <title>HTML's Graphical 3D Future</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Tue, 30 May 2023 09:41:17 +0000</pubDate>
      <link>https://forem.com/trusktr/htmls-graphical-3d-future-3gnd</link>
      <guid>https://forem.com/trusktr/htmls-graphical-3d-future-3gnd</guid>
      <description>&lt;p&gt;For a few years now, one of my free-time projects has been to start answering the question "what would HTML elements with 3D powers be like?"&lt;/p&gt;

&lt;p&gt;The project is &lt;a href="https://lume.io" rel="noopener noreferrer"&gt;Lume&lt;/a&gt;, working towards a 1.0 release. Lume provides a set of HTML elements for 3D rendering, built on &lt;a href="http://threejs.org/" rel="noopener noreferrer"&gt;three.js&lt;/a&gt; for rendering, with a system for defining new custom HTML elements with reactivity and templating powered by &lt;a href="https://solidjs.com" rel="noopener noreferrer"&gt;Solid.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is Lume's &lt;a href="https://docs.lume.io/examples/hello-world/" rel="noopener noreferrer"&gt;"hello world" example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Paste that code into a &lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;CodePen&lt;/a&gt; pen, and you will have a demo that simply works (no build tools required!):&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/dypwZNP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In this &lt;a href="https://docs.lume.io/examples/disco-helmet/" rel="noopener noreferrer"&gt;Disco Helmet example&lt;/a&gt;, remove the &lt;code&gt;enable-css="false"&lt;/code&gt; attribute, inspect the elements in your browser devtools, hover on a &lt;code&gt;&amp;lt;flickering-orb&amp;gt;&lt;/code&gt; element, and notice that the browser will natively show you the position of the 3D object in the view, and that we can change the color of a light right from the inspector:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/LS6AFWuELi4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;We removed the &lt;code&gt;enable-css="false"&lt;/code&gt; attribute (it defaults to true) to make Lume apply CSS 3D transforms to the elements. Lume's CSS transforms are aligned with the WebGL transforms, which is what tells Chrome devtools where WebGL objects are located on the screen. This is nifty for development and debugging! We didn't have to install additional devtools like we would with React, Vue, Svelte, etc. Custom HTML elements are simply supported out of the box by browser devtools!&lt;/p&gt;

&lt;p&gt;With CSS rendering enabled using &lt;code&gt;enable-css="true"&lt;/code&gt;, we get the ability to combine today's standard built-in HTML elements with Lume's 3D elements. The next demo shows the browser's built-in &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; elements mixed with Lume's WebGL rendering. Right click and inspect the buttons!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/LYgoeQo?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This is powerful because it means we can use all of today's HTML/CSS abilities inside of a 3D space with additional graphical powers, gaining accessibility of 3D content.&lt;/p&gt;

&lt;p&gt;3D content made with Lume is not only more accessible to humans, but also to robots such as&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;screen readers&lt;/li&gt;
&lt;li&gt;search engines&lt;/li&gt;
&lt;li&gt;automation and design tools&lt;/li&gt;
&lt;li&gt;and AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is Lume in the wild, in an app called &lt;a href="https://world.neofairies.com" rel="noopener noreferrer"&gt;Neo Fairies&lt;/a&gt; that gives players the ability to own characters in a fantasy-punk open world:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/NdFDNYyBd0Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Besides 3D elements, Lume also provides &lt;a href="https://github.com/lume/element" rel="noopener noreferrer"&gt;Lume Element&lt;/a&gt;, a system for defining custom elements. The next demo shows a &lt;code&gt;&amp;lt;name-card&amp;gt;&lt;/code&gt; element that has no relation to Lume's 3D elements. It is a custom element that is composed only of today's built-in elements. None of Lume's 3D features are loaded in the next demo, only the necessary pieces for making Custom Elements are imported and downloaded:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/dyQmpJm?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;In a following article, I'll describe additional features that Lume builds on top of Three.js, as well as more details on parts of Lume's road map which include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3D elements for geospatial globe/planet rendering powered by &lt;a href="https://github.com/lume/harp.gl" rel="noopener noreferrer"&gt;lume/harp.gl&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AR/VR/MR/XR controls&lt;/li&gt;
&lt;li&gt;3D-oriented UI component library with the ability to transition from 2D UIs into 3D XR UIs &lt;/li&gt;
&lt;li&gt;HTML elements for applying physics to objects&lt;/li&gt;
&lt;li&gt;2D and 3D layouts&lt;/li&gt;
&lt;li&gt;Server-side rendering of 3D scenes for simple resumability and link sharing of 3D experiences&lt;/li&gt;
&lt;li&gt;Compilation of Lume's TypeScript codebase to WebAssembly and native, including Three.js and Solid.js (more on this later!)&lt;/li&gt;
&lt;li&gt;A no/low/full-code creative studio and IDE with AI assisted asset and code generation&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm excited to see where HTML 3D can go. We have some fun work ahead!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>webgl</category>
      <category>lume</category>
    </item>
    <item>
      <title>Docsify.js single-page apps are indexable on Google!</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Sun, 29 Jan 2023 02:11:44 +0000</pubDate>
      <link>https://forem.com/trusktr/docsifyjs-single-page-apps-are-indexable-on-google-3loi</link>
      <guid>https://forem.com/trusktr/docsifyjs-single-page-apps-are-indexable-on-google-3loi</guid>
      <description>&lt;p&gt;I recently got &lt;a href="https://docs.lume.io/" rel="noopener noreferrer"&gt;LUME docs&lt;/a&gt;, a single-page app, on real URLs instead of hash-based routing.&lt;/p&gt;

&lt;p&gt;As an example, the Docsify site currently uses hash-based routing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docsify.js.org" rel="noopener noreferrer"&gt;https://docsify.js.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you click an item in the sidebar, the URL will change to something like &lt;a href="https://docsify.js.org/#/quickstart" rel="noopener noreferrer"&gt;https://docsify.js.org/#/quickstart&lt;/a&gt; with a &lt;code&gt;/#&lt;/code&gt; in the URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hash-based Routing
&lt;/h2&gt;

&lt;p&gt;Since the old days, anything after the hash was dynamically modifiable with JavaScript and people took advantage of this to implement "single-page apps" with URL navigation that way. Clicking on a link would dynamically update the URL hash and the page's DOM without actually re-loading the whole site.&lt;/p&gt;

&lt;h2&gt;
  
  
  History-based Routing
&lt;/h2&gt;

&lt;p&gt;Eventually browsers added the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API" rel="noopener noreferrer"&gt;History API&lt;/a&gt; to make it possible to dynamically modify normal URLs without using a hash. As an example, clicking on a link in the LUME docs sidebar will take you to a hashless URL like &lt;a href="https://docs.lume.io/guide/scene-graph" rel="noopener noreferrer"&gt;https://docs.lume.io/guide/scene-graph&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO
&lt;/h2&gt;

&lt;p&gt;Using Docsify's &lt;a href="https://docsify.js.org/#/configuration?id=routermode" rel="noopener noreferrer"&gt;&lt;code&gt;routerMode: "history"&lt;/code&gt;&lt;/a&gt; option switches from hash-based routing to history-based routing, and Google can see and index the dynamically-loaded content.&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href="https://www.google.com/search?q=lume+%22defines+a+viewport+into+the+3d+scene+as+will+be+seen+on+screen%22" rel="noopener noreferrer"&gt;Google search result&lt;/a&gt; for specific text that Google has so far indexed from the LUME site.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fgz8fxzxly6pznt0b8hkv.png" class="article-body-image-wrapper"&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%2Farticles%2Fgz8fxzxly6pznt0b8hkv.png" alt=" " width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google has not indexed everything on the site yet as of this writing, and it is a slow process; I just started over a week ago.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://search.google.com/search-console" rel="noopener noreferrer"&gt;Google Search Console&lt;/a&gt;, I can see what Google sees:&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fc9256qz4sxxy4npusobk.png" class="article-body-image-wrapper"&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%2Farticles%2Fc9256qz4sxxy4npusobk.png" alt="Google Search Console screenshot" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Yay!
&lt;/h1&gt;

&lt;p&gt;This is awesome!&lt;/p&gt;

&lt;p&gt;It means we can publish static websites that are single-page apps, without needing any build steps, without needing any build tools. The LUME docs site is just an HTML file with JavaScript, served from &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;'s static web hosting. There is no backend, and none of the HTML pages are pre-built.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Thinking about Linode + dev.to Hackthon?</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Sun, 29 Jan 2023 01:29:36 +0000</pubDate>
      <link>https://forem.com/trusktr/thinking-about-linode-devto-hackthon-5afp</link>
      <guid>https://forem.com/trusktr/thinking-about-linode-devto-hackthon-5afp</guid>
      <description>&lt;p&gt;I wouldn't join it. When my payment method failed and I missed the emails, Linode deleted some of my content and I could not get it back.&lt;/p&gt;

&lt;p&gt;That's not very good service.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A few reasons why I love Solid.js</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Sun, 04 Jul 2021 18:28:55 +0000</pubDate>
      <link>https://forem.com/trusktr/a-few-reasons-why-i-love-solid-js-4036</link>
      <guid>https://forem.com/trusktr/a-few-reasons-why-i-love-solid-js-4036</guid>
      <description>&lt;p&gt;Solid is such an amazing reactive declarative tool for composing and manipulating DOM with simple reactive declarative templates! By far the best component system that currently exists for web. The Solid dev experience is really good, and Ryan is so meticulous with performance: you'll be on the shoulder of a giant that can go anywhere.&lt;/p&gt;

&lt;p&gt;Here are some reasons why.&lt;/p&gt;

&lt;p&gt;The Solid playground sets a new high bar for all other frameworks by not only making it very easy to share snippets of how to do things with Solid, but by explaining (via it's compile output) why and how Solid is super fast at reactive templating despite the clean and simple declarative API.&lt;/p&gt;

&lt;p&gt;Solid's magic is right here in plain sight, in the visible compile output of any playground example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://playground.solidjs.com" rel="noopener noreferrer"&gt;https://playground.solidjs.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This sort of openness is the type of thing that can change a technology segment for the better.&lt;/p&gt;

&lt;p&gt;Not only is what you see in the playground open, but Solid openly invites reactive library developers to challenge boundaries: Solid's JSX compiler allows reactive authors to power JSX templates with their own reactive primitives. This invites any author to challenge Solid at its own speed, and sets up a foundation for open innovation. See that here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ryansolid/dom-expressions" rel="noopener noreferrer"&gt;https://github.com/ryansolid/dom-expressions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Solid effectively changes the component world because it is so open, that other frameworks will have no choice but to adapt or else fall behind in the dust of innovation. Just like React was impactful in it's debut, Solid is the next big move in how reactive declarative UI trees can be manipulated with raw speed while not sacrificing dev experience.&lt;/p&gt;

&lt;p&gt;As an example of no sacrifice of dev experience, in Solid we can animate anything declaratively by passing animated values directly into templates and modifying any state as we wish, even in rapid animation loops (like loops found in games and other rich experiences).&lt;/p&gt;

&lt;p&gt;In contrast, animating state or props in an animation loop in a React component is considered a bad practice and can easily lead to performance issues. For example, react-three-fiber (React components that render with Three.js for 3D experiences such as games) mentions specifically not to do this in it's &lt;a href="https://github.com/pmndrs/react-three-fiber/blob/master/markdown/pitfalls.md#never-ever-set-state" rel="noopener noreferrer"&gt;Performance Pitfalls&lt;/a&gt; guide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never, ever, setState animations!&lt;br&gt;
Avoid forcing a full component (+ its children) through React and its diffing mechanism 60 times per second.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Solid makes declarative templating a first class citizen without the performance caveats. Write everything declaratively and rest assured it'll be compiled to an essentially-vanilla fast equivalent. Animate props at 60fps as much as you want in Solid!&lt;/p&gt;

&lt;p&gt;All parts of Solid are independently reusable, which makes it possible to build a variety of different types of projects with it, and due to the simplicity of Solid's reactive system it is very easy to hook &lt;em&gt;any&lt;/em&gt; other state system into Solid components. For example see how simple Storeon's Solid bindings are:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/storeon/solidjs" rel="noopener noreferrer"&gt;https://github.com/storeon/solidjs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In contrast, one can not independently import React's state system and use it standalone, and one often has a difficult time integrating external state systems into React components (just ask the Mobx team what sorts of problems they faced with double rendering, for example).&lt;/p&gt;

&lt;p&gt;On top of things being more difficult in React, they are simply more verbose and difficult to understand with the strange Hooks rules that often trip up newcomers in a way that is much less than desirable. You'll write more in React, and you'll have less-understandable code.&lt;/p&gt;

&lt;p&gt;Solid is very modular: one can use its reactive primitives while skipping out on declarative templating (for example) to create a reactive state machine, or to create a reactive backend server, both of which could have nothing to do with making UIs. Such projects only need to import APIs like &lt;code&gt;createSignal&lt;/code&gt;, &lt;code&gt;createStore&lt;/code&gt;, or &lt;code&gt;createMutable&lt;/code&gt; and leave everything else behind.&lt;/p&gt;

&lt;p&gt;In Solid, DOM is a first-class citizen: the DOM is not hidden behind an abstract virtual dom and therefore is fully accessible. It's just DOM! JSX expressions give you elements exactly as you would intuitively expect, which means it is very easy to interop with any DOM library you can think of. In the following example we simply pass a div created from a JSX expression to jQuery, while the content of the div's template is reactive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Make a reactive variable (signal):&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;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSignal&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="c1"&gt;// Increment the count value every second:&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="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&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="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Use count in a template:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;The count is: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// The JSX expression gave us back the *real* div element,&lt;/span&gt;
&lt;span class="c1"&gt;// now we can pass it to jQuery or any other DOM API:&lt;/span&gt;
&lt;span class="nf"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;whatever&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;div&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// true!&lt;/span&gt;

&lt;span class="c1"&gt;// Even compose the DOM:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Info: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&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="nx"&gt;info&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// true!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You see! The div is... an actual div! It's just DOM! This makes things easy! We have two benefits here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We simply got a div and can do any regular DOM thing we want with it.&lt;/li&gt;
&lt;li&gt;The div's content is updated automatically any time the value of count changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We get the best of both worlds: DOM and reactive declarative templating, all in one!&lt;/p&gt;

&lt;p&gt;Because of Solid's simple reactive and fast templating, plus the fact that &lt;em&gt;it's just DOM!&lt;/em&gt;, Solid is the perfect fit for use with custom elements or any other DOM-based project.&lt;/p&gt;

&lt;p&gt;To contrast, LitElement's lit-html template expressions don't return DOM back to you. Lit is a DOM library that gets in the way more than it should. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&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="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lit-html&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;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;div&amp;gt;Hello World&amp;lt;/div&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="nx"&gt;div&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;HTMLDivElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// false!&lt;/span&gt;

&lt;span class="nf"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// ERROR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As an example of how Solid fits well with DOM projects, LUME Element, a system for making custom elements in a simple and concise way with reactive templating, uses Solid at its core:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://github.com/lume/element" rel="noopener noreferrer"&gt;http://github.com/lume/element&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This results in being able to make custom elements with the speed of vanilla JS, &lt;em&gt;without&lt;/em&gt; sacrificing experience, &lt;em&gt;without&lt;/em&gt; the more difficult-to-maintain imperative code that would otherwise be required with initial plain vanilla JS.&lt;/p&gt;

&lt;p&gt;LUME's 3D Webgl-powered HTML elements are simple, reactive, and fast (despite being written declaratively, because declarative templating should not ever be a performance issue!) thanks to Solid underneath.&lt;/p&gt;

&lt;p&gt;Here's a 3D WebGL scene written in HTML:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/trusktr/pen/dypwZNP" rel="noopener noreferrer"&gt;https://codepen.io/trusktr/pen/dypwZNP&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(LUME is still alpha, please complain about everything. :)&lt;/p&gt;

&lt;p&gt;TLDR: Solid is the currently the best way to make composable UI components without sacrifice of dev experience (without limitations on when to use declarative templating, without complicated function scope rules, without unneeded verbosity). The API will be very easy to work with for anyone who knows DOM and would like to integrate with existing applications (f.e. legacy jQuery applications).&lt;/p&gt;

&lt;p&gt;All this with the most speed as a bonus!&lt;/p&gt;

&lt;p&gt;Knowing Ryan, he will keep Solid at the bleeding edge of performance and ability.&lt;/p&gt;

&lt;p&gt;Like SSR for SEO and fast loading? Solid's has you covered.&lt;/p&gt;

&lt;p&gt;Like TypeScript? Solid has you covered.&lt;/p&gt;

&lt;p&gt;Like to write plain HTML with no build system? Solid has you covered! You can use the &lt;code&gt;html&lt;/code&gt; template tag instead of JSX. Here's an example on CodePen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/trusktr/pen/eYWNrMJ" rel="noopener noreferrer"&gt;https://codepen.io/trusktr/pen/eYWNrMJ&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;html&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;solid-js/html&lt;/span&gt;&lt;span class="dl"&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;createSignal&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;solid-js&lt;/span&gt;&lt;span class="dl"&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;createSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Amadar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// It's just DOM!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;div&amp;gt;Hello name is &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="s2"&gt;&amp;lt;/div&amp;gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// ... change name later ...&lt;/span&gt;

&lt;span class="nf"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// It works!&lt;/span&gt;

&lt;span class="c1"&gt;// Even compose the DOM:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;section&amp;gt;Profile: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/section&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="nx"&gt;card&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// true!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You need routing? You're covered:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rturnq/solid-router" rel="noopener noreferrer"&gt;https://github.com/rturnq/solid-router&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/mduclehcm/solid-router" rel="noopener noreferrer"&gt;https://github.com/mduclehcm/solid-router&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need CSS? You're covered:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/solidjs/solid-styled-components" rel="noopener noreferrer"&gt;https://github.com/solidjs/solid-styled-components&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/solidjs/solid-styled-jsx" rel="noopener noreferrer"&gt;https://github.com/solidjs/solid-styled-jsx&lt;/a&gt;&lt;br&gt;
Emotion has been ported to Solid (link not available yet)&lt;/p&gt;

&lt;p&gt;Need a way to bootstrap a starter Solid application? There you go:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/solidjs/solid-start" rel="noopener noreferrer"&gt;https://github.com/solidjs/solid-start&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Solid is just too good, and it is all true!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>solidjs</category>
      <category>html</category>
    </item>
    <item>
      <title>Loosely coupled code: Babylon vs Three.js</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Wed, 26 May 2021 21:31:35 +0000</pubDate>
      <link>https://forem.com/trusktr/babylon-s-codebase-is-highly-coupled-compared-to-three-js-4l4m</link>
      <guid>https://forem.com/trusktr/babylon-s-codebase-is-highly-coupled-compared-to-three-js-4l4m</guid>
      <description>&lt;p&gt;Hello! :)&lt;/p&gt;

&lt;p&gt;A while back, I started a port of &lt;a href="http://threejs.org" rel="noopener noreferrer"&gt;Three.js&lt;/a&gt; from JavaScript to &lt;a href="https://www.assemblyscript.org/" rel="noopener noreferrer"&gt;AssemblyScript&lt;/a&gt; (an awesome &lt;a href="http://typescriptlang.org" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; to &lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;WebAssembly&lt;/a&gt; compiler):&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/glas" rel="noopener noreferrer"&gt;
        glas
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      WebGL in WebAssembly with AssemblyScript
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Fglas%2F.%2Fassets%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GLAS&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Web&lt;strong&gt;GL&lt;/strong&gt; in WebAssembly with &lt;strong&gt;A&lt;/strong&gt;ssembly&lt;strong&gt;S&lt;/strong&gt;cript.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is a work-in-progress port of &lt;a href="https://threejs.org" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Three.js&lt;/strong&gt;&lt;/a&gt;, a JavaScript 3D WebGL library, into &lt;a href="https://assemblyscript.org" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;AssemblyScript&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Motivation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;It'd be sweet to have a high-performing WebGL engine that runs in the web via
WebAssembly and is written in a language that web developers are already
familiar with:
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/About_JavaScript" rel="nofollow noopener noreferrer"&gt;JavaScript&lt;/a&gt;,
in the form of &lt;a href="http://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;TypeScript&lt;/a&gt; (a
superset of JavaScript with types).&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://assemblyscript.org" rel="nofollow noopener noreferrer"&gt;AssemblyScript&lt;/a&gt;, a
toolchain that allows us to write a strictly-typed subset of
&lt;a href="http://www.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;TypeScript&lt;/a&gt; code and compile it to
&lt;a href="https://developer.mozilla.org/en-US/docs/WebAssembly" rel="nofollow noopener noreferrer"&gt;WebAssembly&lt;/a&gt; (an
&lt;a href="https://en.wikipedia.org/wiki/Assembly_language" rel="nofollow noopener noreferrer"&gt;assembly&lt;/a&gt;-like language
representing machine code) for speed.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Status&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/lume/glas/workflows/Node%20CI/badge.svg"&gt;&lt;img src="https://github.com/lume/glas/workflows/Node%20CI/badge.svg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;
⚠️ ALPHA STATE&lt;/h4&gt;

&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The project is currently in its very early alpha stages. We have an amazing
group of programmers building the initial
&lt;a href="https://github.com/lume/ASWebGLue" rel="noopener noreferrer"&gt;&lt;strong&gt;ASWebGLue&lt;/strong&gt;&lt;/a&gt; library. This library allows
AssemblyScript programs to call the browser's underlying WebGL interface. This
is required before we are able to render anything to the screen…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/glas" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;I was originally interested in porting &lt;a href="http://babylonjs.com" rel="noopener noreferrer"&gt;Babylon&lt;/a&gt; because it is already written in TypeScript, so porting would be easier compared to taking a JavaScript codebase and adding types to it after refactoring the dynamic parts that TypeScript can't handle.&lt;/p&gt;

&lt;p&gt;However, when I started to port Babylon classes, I soon realized that the classes in the library are highly coupled: importing Babylon’s &lt;code&gt;Scene&lt;/code&gt; class means practically importing the whole Babylon library and instantiating many parts of the library (&lt;code&gt;new This&lt;/code&gt;, &lt;code&gt;new That&lt;/code&gt;, etc) even if those parts will never be used by your application.&lt;/p&gt;

&lt;p&gt;Essentially, with Babylon you want the banana (f.e. &lt;code&gt;Scene&lt;/code&gt;) and you get the Gorilla and the whole jungle (rest of the Babylon lib).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Coupling_(computer_programming)" rel="noopener noreferrer"&gt;High coupling is something to be avoided when possible.&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To get an understanding of this problem with respect to Babylon's codebase, take look at the import statements in Babylon’s &lt;a href="https://github.com/BabylonJS/Babylon.js/blob/master/src/scene.ts" rel="noopener noreferrer"&gt;&lt;code&gt;scene.ts&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Nullable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./types&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;Tools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/tools&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;IAnimatable&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;./Animations/animatable.interface&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;PrecisionDate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/precisionDate&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;Observable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Observer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/observable&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;SmartArrayNoDuplicate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SmartArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ISmartArrayLike&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/smartArray&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;StringDictionary&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/stringDictionary&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;Tags&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/tags&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;Vector2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Matrix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TmpVectors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Vector4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Maths/math.vector&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;Geometry&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Meshes/geometry&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;TransformNode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Meshes/transformNode&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;SubMesh&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Meshes/subMesh&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;AbstractMesh&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Meshes/abstractMesh&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;Mesh&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Meshes/mesh&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;IParticleSystem&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Particles/IParticleSystem&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;Bone&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Bones/bone&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;Skeleton&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Bones/skeleton&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;MorphTargetManager&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Morph/morphTargetManager&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;Camera&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Cameras/camera&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;AbstractScene&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./abstractScene&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;BaseTexture&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/Textures/baseTexture&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;Texture&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/Textures/texture&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;RenderTargetTexture&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/Textures/renderTargetTexture&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;ImageProcessingConfiguration&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/imageProcessingConfiguration&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;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="s2"&gt;./Materials/effect&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;UniformBuffer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/uniformBuffer&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;MultiMaterial&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Materials/multiMaterial&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;Light&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Lights/light&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;PickingInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Collisions/pickingInfo&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;ICollisionCoordinator&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Collisions/collisionCoordinator&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;PointerEventTypes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PointerInfoPre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PointerInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Events/pointerEvents&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;KeyboardInfoPre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;KeyboardInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Events/keyboardEvents&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;ActionEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Actions/actionEvent&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;PostProcessManager&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./PostProcesses/postProcessManager&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;IOfflineProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Offline/IOfflineProvider&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;RenderingGroupInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RenderingManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;IRenderingManagerAutoClearSetup&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Rendering/renderingManager&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;ISceneComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ISceneSerializableComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Stage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SimpleStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RenderTargetsStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RenderTargetStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MeshStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EvaluateSubMeshStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PreActiveMeshStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CameraStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RenderingGroupStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RenderingMeshStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PointerMoveStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PointerUpDownStageAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CameraStageFrameBufferAction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./sceneComponent&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;Engine&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Engines/engine&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;Node&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./node&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;MorphTarget&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Morph/morphTarget&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;Constants&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Engines/constants&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;DomManagement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/domManagement&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;Logger&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Misc/logger&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;EngineStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Engines/engineStore&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;AbstractActionManager&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;./Actions/abstractActionManager&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;_DevTools&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;./Misc/devTools&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;WebRequest&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;./Misc/webRequest&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;InputManager&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;./Inputs/scene.inputManager&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;PerfCounter&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;./Misc/perfCounter&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;IFileRequest&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;./Misc/fileRequest&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;Color4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Color3&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;./Maths/math.color&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;Plane&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;./Maths/math.plane&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;Frustum&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;./Maths/math.frustum&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;UniqueIdGenerator&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;./Misc/uniqueIdGenerator&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;FileTools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LoadFileError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;RequestFileError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ReadFileError&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;./Misc/fileTools&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;IClipPlanesHolder&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;./Misc/interfaces/iClipPlanesHolder&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;IPointerEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Events/deviceInputEvents&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;WebVRFreeCamera&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Cameras/VR/webVRCamera&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;That's a fairly long list for what a "Scene" represents, and I can see the whole list on my computer screen without scrolling.&lt;/p&gt;

&lt;p&gt;In contrast, the Three.js codebase is much more loosely coupled, which to me is very attractive from a code authoring perspective, so I ended up choosing Three.js and accepting that I would perform more porting from JavaScript instead of from TypeScript, because I felt the end result would be cleaner.&lt;/p&gt;

&lt;p&gt;As an example of Three’s lose coupling, here are the first few lines of Three’s &lt;a href="https://github.com/mrdoob/three.js/blob/dev/src/scenes/Scene.js" rel="noopener noreferrer"&gt;&lt;code&gt;Scene.js&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Object3D&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;../core/Object3D.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Scene&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Object3D&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;super&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;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Scene&lt;/span&gt;&lt;span class="dl"&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;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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;environment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&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;fog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explore Three's code base, and you’ll see that classes try to be minimal and do only one thing well (or representing only one concept well).&lt;/p&gt;

&lt;p&gt;After starting the port using Babylon, going back to Three.js felt pleasant due to the loose coupling. The Three.js codebase is clean.&lt;/p&gt;

&lt;p&gt;If I had to choose to develop with, or extend from, one codebase or the other, I would choose Three.js because the loosely-coupled organization within the library makes code maintenance and extension easier, while allowing certain parts of the Three library to be used without pulling unneeded dependencies into an application.&lt;/p&gt;




&lt;p&gt;I wanted to ask the Babylon community if anyone else there feels that Babylon's parts are too tightly coupled compared to, for example, Three.js, but my post was immediately hidden as "spam":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forum.babylonjs.com/t/high-coupling-in-the-bablyon-codebase-compared-to-three-js/21156/3" rel="noopener noreferrer"&gt;https://forum.babylonjs.com/t/high-coupling-in-the-bablyon-codebase-compared-to-three-js/21156/3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(You might not be able to see it if they permanently delete it).&lt;/p&gt;

&lt;p&gt;In that thread, I asked&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Has anyone else (especially on Bablyon’s team) thought about this difference between Babylon and Three.js? What are your thoughts on this? Are there any plans or desires to decouple the Babylon code base?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was hoping to open a discussion on the topic, hoping it might light a fire for Babylon improvement, for everyone's benefit (having alternatives is always great).&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webgl</category>
      <category>threejs</category>
      <category>babylonjs</category>
    </item>
    <item>
      <title>Day 9 of 365: Beautiful cube with inertial rotation (live demo)</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Sun, 10 Jan 2021 02:09:03 +0000</pubDate>
      <link>https://forem.com/trusktr/day-9-of-365-beautiful-cube-with-inertial-rotation-live-demo-ofg</link>
      <guid>https://forem.com/trusktr/day-9-of-365-beautiful-cube-with-inertial-rotation-live-demo-ofg</guid>
      <description>&lt;p&gt;Day 9 of 365: Live demo! Beautiful cube with inertial rotation.&lt;/p&gt;

&lt;p&gt;I added fling ability to last demo. Fling to spin!&lt;/p&gt;

&lt;p&gt;👇 &lt;a class="mentioned-user" href="https://dev.to/codepen"&gt;@codepen&lt;/a&gt;&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/trusktr/embed/rNMrvOY?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;👇 Made with #LUME&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;topics: #codeart #webdev #3D #webgl #creativecode #newmediaart #webdesign #365DaysOfCode2021&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Day 8 of 365: Beautiful rotatable cube (live demo)</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Sun, 10 Jan 2021 00:31:57 +0000</pubDate>
      <link>https://forem.com/trusktr/beautiful-rotatable-cube-live-demo-44aj</link>
      <guid>https://forem.com/trusktr/beautiful-rotatable-cube-live-demo-44aj</guid>
      <description>&lt;p&gt;Day 8 of 365: A #beautiful rotatable #3D cube with #LUME.&lt;/p&gt;

&lt;p&gt;Posting a new demo every day of 2021!&lt;/p&gt;

&lt;p&gt;The demo makes a  element. It applies rotation on mouse/finger move events.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/XWjBEaN?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;The demo shows how to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a custom &lt;code&gt;&amp;lt;codepen-cube&amp;gt;&lt;/code&gt; HTML element with with &lt;code&gt;@lume/element&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;How to use the element and assign the size of the cube via HTML attributes.&lt;/li&gt;
&lt;li&gt;Position 6 flat square surfaces in the shape of a cube using LUME's HTML elements.&lt;/li&gt;
&lt;li&gt;Observe mouse/finger movement in order to make it rotate.&lt;/li&gt;
&lt;li&gt;Apply beautiful coloring.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Made with LUME:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;topics: #codeart #creativecode #mediaart #graphics #webdev #creativecoding #CSS #webgl #webdevelopment&lt;/p&gt;

</description>
      <category>lume</category>
      <category>webdev</category>
      <category>html</category>
      <category>3d</category>
    </item>
    <item>
      <title>Tiny mini galaxy (live demo)</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Fri, 08 Jan 2021 17:56:33 +0000</pubDate>
      <link>https://forem.com/trusktr/tiny-mini-galaxy-live-demo-444i</link>
      <guid>https://forem.com/trusktr/tiny-mini-galaxy-live-demo-444i</guid>
      <description>&lt;p&gt;While I write documentation for LUME, a &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;3D HTML toolkit&lt;/a&gt;, I will be posting demos that I create for the docs. I am posting one demo per day all 2021.&lt;/p&gt;

&lt;p&gt;This demo is a tiny mini galaxy!&lt;/p&gt;

&lt;p&gt;It shows the basics of the &lt;code&gt;&amp;lt;lume-node&amp;gt;&lt;/code&gt; element, which is a primitive element for making a hierarchy in 3D space.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;&amp;lt;lume-node&amp;gt;&lt;/code&gt; element can contain child LUME elements. Each child LUME element transforms relative to its parent. A &lt;code&gt;&amp;lt;lume-node&amp;gt;&lt;/code&gt; element can also contain any regular HTML content that will not be decorated with WebGL rendering.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/jOMpPJR?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;For WebGL rendering you can use &lt;code&gt;&amp;lt;lume-dom-plane&amp;gt;&lt;/code&gt; for mixing HTML content with WebGL content such as &lt;code&gt;&amp;lt;lume-mesh&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;lume-gltf-model&amp;gt;&lt;/code&gt;, etc. More info will be landing in the docs!&lt;/p&gt;

&lt;p&gt;Made with LUME:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;topics: #CSS3D #HTML #JavaScript&lt;/p&gt;

</description>
      <category>lume</category>
      <category>webdev</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Morphing spirals (live demos), 6 of 365</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Thu, 07 Jan 2021 17:53:03 +0000</pubDate>
      <link>https://forem.com/trusktr/morphing-spirals-live-demos-7-of-365-3951</link>
      <guid>https://forem.com/trusktr/morphing-spirals-live-demos-7-of-365-3951</guid>
      <description>&lt;p&gt;I'm making one demo per day for 2021!&lt;/p&gt;

&lt;p&gt;I took an old spiral demo of mine, and made two new spirals from it. All I had to do was modify a couple numbers, and the result was two distinct spirals. The code is short too!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/xxEzYgw?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/dypKdMp?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Which spiral do you like more?&lt;/p&gt;

&lt;p&gt;👇 Made with #LUME&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;topics: #365DaysOfCode2021 #webgl #html #css #creativecoding #creativecode #graphics #webdev&lt;/p&gt;

</description>
      <category>lume</category>
      <category>html</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Updated &lt;lume-gltf-model&gt; 3D model element (live demo)</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Wed, 06 Jan 2021 04:57:37 +0000</pubDate>
      <link>https://forem.com/trusktr/updated-lume-gltf-model-3d-model-element-live-demo-pch</link>
      <guid>https://forem.com/trusktr/updated-lume-gltf-model-3d-model-element-live-demo-pch</guid>
      <description>&lt;p&gt;I'm posting one demo per day all 2021!&lt;/p&gt;

&lt;p&gt;I improved the &lt;a href="https://dev.to/trusktr/lume-gltf-model-3d-model-element-live-demo-37e1"&gt;previous demo&lt;/a&gt; by adding new attributes to the &lt;code&gt;&amp;lt;lume-scene&amp;gt;&lt;/code&gt; element that give the rendering an "environment map" that reflects off of shiny surfaces in the scene.&lt;/p&gt;

&lt;p&gt;This what it looks like now:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/wvzjgbo?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;And this is what it looked like before:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/mdrxvVx?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The gist of it is you can write HTML like the following and you'll have a 3D model on your web site:&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;lume-scene&lt;/span&gt;
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"scene"&lt;/span&gt;
    &lt;span class="na"&gt;webgl&lt;/span&gt;
    &lt;span class="na"&gt;disable-css&lt;/span&gt;
    &lt;span class="na"&gt;background=&lt;/span&gt;&lt;span class="s"&gt;"https://assets.codepen.io/191583/airplane-hanger-env-map.jpg"&lt;/span&gt;
    &lt;span class="na"&gt;equirectangular-background=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
    &lt;span class="na"&gt;environment=&lt;/span&gt;&lt;span class="s"&gt;"https://assets.codepen.io/191583/airplane-hanger-env-map.jpg"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lume-point-light&lt;/span&gt; &lt;span class="na"&gt;position=&lt;/span&gt;&lt;span class="s"&gt;"200 -200 200"&lt;/span&gt; &lt;span class="na"&gt;intensity=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/lume-point-light&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lume-ambient-light&lt;/span&gt; &lt;span class="na"&gt;color=&lt;/span&gt;&lt;span class="s"&gt;"white"&lt;/span&gt; &lt;span class="na"&gt;intensity=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/lume-ambient-light&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;lume-node&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cameraRig"&lt;/span&gt; &lt;span class="na"&gt;rotation=&lt;/span&gt;&lt;span class="s"&gt;"0 200 0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;lume-perspective-camera&lt;/span&gt; &lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;"0 0 0"&lt;/span&gt; &lt;span class="na"&gt;position=&lt;/span&gt;&lt;span class="s"&gt;"0 0 1000"&lt;/span&gt; &lt;span class="na"&gt;rotation=&lt;/span&gt;&lt;span class="s"&gt;"0 0 0"&lt;/span&gt; &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/lume-perspective-camera&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/lume-node&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;lume-gltf-model&lt;/span&gt;
        &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"model"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://rawcdn.githack.com/KhronosGroup/glTF-Sample-Models/c99173c645f47fae603dcb2e7263e656e265cf06/2.0/DamagedHelmet/glTF-Binary/DamagedHelmet.glb"&lt;/span&gt;
        &lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;"2 2 0"&lt;/span&gt;
        &lt;span class="na"&gt;scale=&lt;/span&gt;&lt;span class="s"&gt;"400 400 400"&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/lume-gltf-model&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/lume-scene&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The demo is built with LUME, a software developer toolkit for making interactive 2D or 3D experiences with HTML. We're working towards its initial release.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;topics: #webgl #threejs #html #css #webdev #javascript #365DaysOfCode2021&lt;/p&gt;

</description>
      <category>lume</category>
      <category>webdev</category>
      <category>webgl</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Ripple of flipping squares (live demo)</title>
      <dc:creator>Joe Pea</dc:creator>
      <pubDate>Tue, 05 Jan 2021 08:55:05 +0000</pubDate>
      <link>https://forem.com/trusktr/ripple-flip-animation-live-demo-2fol</link>
      <guid>https://forem.com/trusktr/ripple-flip-animation-live-demo-2fol</guid>
      <description>&lt;p&gt;I had limited time today, but still one demo per day! So I tweaked the #animation and colors of an old demo.&lt;/p&gt;

&lt;p&gt;It uses only the CSS 3D rendering that LUME had at the time (back when it was called Infamous, and before it had any #WebGL features).&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/mdrLmOX?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;LUME's WebGL rendering abilities allow regular HTML content (div tags, span tags, etc) to be mixed with 3D content in the same 3D rendering space. Check out my &lt;a href="https://dev.to/trusktr"&gt;previous posts&lt;/a&gt; for examples, and stay tuned for one new demo every day all 2021!&lt;/p&gt;

&lt;p&gt;👇 Made with:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt; / &lt;a href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;
        lume
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GPU-powered 3D HTML. ✨🧊 &amp;lt;lume-box size="1 2 3"&amp;gt;
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Flume%2Flume%2F.%2Flogo.svg" width="200" alt="LUME" title="LUME"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;A toolkit that simplifies the creation of rich and interactive 2D or 3D experiences.&lt;/strong&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
  &lt;a href="https://github.com//lume.io" rel="nofollow noopener noreferrer"&gt;Home&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;  · 
  &lt;a href="https://github.com//docs.lume.io/examples/hello-world/" rel="nofollow noopener noreferrer"&gt;Examples&lt;/a&gt;  · 
  &lt;a href="https://github.com//lume.community" rel="nofollow noopener noreferrer"&gt;Forum&lt;/a&gt;  · 
  &lt;a href="https://github.com//discord.gg/PgeyevP" rel="nofollow noopener noreferrer"&gt;Chat&lt;/a&gt;  · 
  &lt;a href="https://github.com//github.com/lume/lume" rel="noopener noreferrer"&gt;Source&lt;/a&gt;
&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;code&gt;npm install lume&lt;/code&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;LUME is composed of several packages that can be used individually, or
together as a whole:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com/lume/lume/./README.md" rel="noopener noreferrer"&gt;&lt;code&gt;lume&lt;/code&gt;&lt;/a&gt; - HTML elements for rich graphics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;HTML elements for easily defining rich and interactive 2D or 3D applications
powered by CSS3D, WebGL, or a combination of both.&lt;/p&gt;
&lt;p&gt;This package uses and re-exports features from the below packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element" rel="noopener noreferrer"&gt;&lt;code&gt;@lume/element&lt;/code&gt;&lt;/a&gt; - System for defining HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is a web component system that allows you to create new, fast, and
performant HTML elements in a simple way. It provides the foundation for
LUME's HTML elements, and a standard pattern for building new elements that
extend the features of LUME.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;a href="https://github.com//github.com/lume/element-behaviors" rel="noopener noreferrer"&gt;&lt;code&gt;element-behaviors&lt;/code&gt;&lt;/a&gt; - Mix functionalities onto HTML elements&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This allows you to augment HTML elements with features called…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lume/lume" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tweenjs" rel="noopener noreferrer"&gt;
        tweenjs
      &lt;/a&gt; / &lt;a href="https://github.com/tweenjs/tween.js" rel="noopener noreferrer"&gt;
        tween.js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      JavaScript/TypeScript animation engine
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;tween.js&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;JavaScript (TypeScript) tweening engine for easy animations, incorporating optimised Robert Penner's equations.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://npmjs.org/package/@tweenjs/tween.js" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6bb96a5f6d8ca05fc3e993755d0a3dda65c9189ec2641968b0df92307e62f133/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f40747765656e6a732f747765656e2e6a732e737667" alt="NPM Version"&gt;&lt;/a&gt;
&lt;a href="https://cdnjs.com/libraries/tween.js" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/314cc965da0896b6c7309535f9d06aee8ad055b934778bce46315ebf03601649/68747470733a2f2f696d672e736869656c64732e696f2f63646e6a732f762f747765656e2e6a732e737667" alt="CDNJS"&gt;&lt;/a&gt;
&lt;a href="https://npmjs.org/package/@tweenjs/tween.js" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/972db91ea7a81b034111a241304ffb2c59f87ddfd8a13dad895bc99e778b6494/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f40747765656e6a732f747765656e2e6a732e737667" alt="NPM Downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/tweenjs/tween.js/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/tweenjs/tween.js/workflows/build%20and%20tests/badge.svg?branch=master" alt="Build and Tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;More languages: &lt;a href="https://github.com/tweenjs/tween.js/./README.md" rel="noopener noreferrer"&gt;English&lt;/a&gt;, &lt;a href="https://github.com/tweenjs/tween.js/./README_zh-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt; &lt;span class="pl-c1"&gt;id&lt;/span&gt;="&lt;span class="pl-s"&gt;box&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;div&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;style&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="pl-kos"&gt;#&lt;/span&gt;&lt;span class="pl-c1"&gt;box&lt;/span&gt; {
        &lt;span class="pl-c1"&gt;background-color&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; deeppink;
        &lt;span class="pl-c1"&gt;width&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;px&lt;/span&gt;&lt;/span&gt;;
        &lt;span class="pl-c1"&gt;height&lt;/span&gt;&lt;span class="pl-kos"&gt;:&lt;/span&gt; &lt;span class="pl-c1"&gt;100&lt;span class="pl-smi"&gt;px&lt;/span&gt;&lt;/span&gt;;
    }
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;style&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;type&lt;/span&gt;="&lt;span class="pl-s"&gt;module&lt;/span&gt;"&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-v"&gt;Tween&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-v"&gt;Easing&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'https://unpkg.com/@tweenjs/tween.js@23.1.3/dist/tween.esm.js'&lt;/span&gt;

    &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;box&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-smi"&gt;document&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;getElementById&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'box'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c"&gt;// Get the element we want to animate.&lt;/span&gt;

    &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;coords&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-c1"&gt;x&lt;/span&gt;: &lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;y&lt;/span&gt;: &lt;span class="pl-c1"&gt;0&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-c"&gt;// Start at (0, 0)&lt;/span&gt;

    &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;tween&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-k"&gt;new&lt;/span&gt; &lt;span class="pl-v"&gt;Tween&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;coords&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;false&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c"&gt;// Create a new tween that modifies 'coords'.&lt;/span&gt;
        &lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;to&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;&lt;span class="pl-c1"&gt;x&lt;/span&gt;: &lt;span class="pl-c1"&gt;300&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;y&lt;/span&gt;: &lt;span class="pl-c1"&gt;200&lt;/span&gt;&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;1000&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c"&gt;// Move to (300, 200) in 1 second.&lt;/span&gt;
        &lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;easing&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-v"&gt;Easing&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;Quadratic&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-c1"&gt;InOut&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tweenjs/tween.js" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Here's the original demo:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/trusktr/embed/bWwdqR?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;topics: #css #javascript #webdev #3D #CSS3D #365DaysOfCode2021&lt;/p&gt;

</description>
      <category>lume</category>
      <category>css</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
