<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TargetJS</title>
    <description>The latest articles on DEV Community by TargetJS (@targetjs).</description>
    <link>https://dev.to/targetjs</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%2Forganization%2Fprofile_image%2F10175%2F700c562b-f469-4c20-98f6-e59d961be2c7.png</url>
      <title>DEV Community: TargetJS</title>
      <link>https://dev.to/targetjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/targetjs"/>
    <language>en</language>
    <item>
      <title>TargetJS: Code-Ordered Reactivity and Targets - A New Paradigm for UI Development</title>
      <dc:creator>Ahmad Wasfi</dc:creator>
      <pubDate>Sat, 14 Jun 2025 01:18:13 +0000</pubDate>
      <link>https://dev.to/targetjs/targetjs-code-ordered-reactivity-and-targets-a-new-paradigm-for-ui-development-5eef</link>
      <guid>https://dev.to/targetjs/targetjs-code-ordered-reactivity-and-targets-a-new-paradigm-for-ui-development-5eef</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Reactive methods, where one method runs automatically when another completes, whether synchronous or asynchronous, is a powerful idea. TargetJS introduces a distinctly innovative approach to this concept: it enables methods to react exclusively to their immediately preceding counterparts, fostering a declarative and simple code flow.&lt;/p&gt;

&lt;p&gt;TargetJS also brings in a second key concept: it unifies both variables and methods into a new construct called “Targets”. Targets also provide state, loops, timing, and more, whether it's a variable or a function.&lt;/p&gt;

&lt;p&gt;When these two ideas are combined: code-ordered reactivity and Targets, they unlock a fundamentally new way of coding that simplifies everything from animations and UI updates to API calls and state management. The result is code that is not only more intuitive to write but also significantly more compact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding TargetJS Syntax: Reactive Postfixes
&lt;/h2&gt;

&lt;p&gt;TargetJS uses the postfixes &lt;code&gt;$&lt;/code&gt; and &lt;code&gt;$$&lt;/code&gt; appended to target names for defining reactive behaviors. While initially appearing a bit cryptic, this convention provides a compact syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$&lt;/code&gt; Postfix (Immediate Reactivity):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A target name ending with a single &lt;code&gt;$&lt;/code&gt; (e.g., &lt;code&gt;height$&lt;/code&gt;) indicates that this target will execute every time its immediately preceding target runs or emits a new value. If the preceding target involves an asynchronous operation like an API call, the reactive target activates when the response is received. If there are multiple API calls made, &lt;code&gt;$&lt;/code&gt; postfix ensures that the target reacts to the first API result when it becomes available, then the second, and so on, maintaining a strict, code-ordered sequence of operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$$&lt;/code&gt; Postfix (Full Completion Reactivity):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A target name ending with a double &lt;code&gt;$$&lt;/code&gt; (e.g., &lt;code&gt;fetch$$&lt;/code&gt;) will activate only after its immediately preceding targets have fully and comprehensively completed all of their operations. This includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The successful resolution of any timed sequences, such as animations.&lt;/li&gt;
&lt;li&gt;The completion and return of results from all associated API calls.&lt;/li&gt;
&lt;li&gt;The finalization of all tasks, animations, and API calls initiated by any dependent child targets that were themselves triggered by a preceding target.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Targets: The Building Blocks of TargetJS
&lt;/h2&gt;

&lt;p&gt;Targets provide a unified interface for both variables and methods. Each Target comes equipped with a built-in set of capabilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State Management: Targets are inherently stateful, enabling implicit state handling across your application.&lt;/li&gt;
&lt;li&gt;Iterations: They can iterate towards defined values, making them perfect for creating animations.&lt;/li&gt;
&lt;li&gt;Multiple or Conditional Execution: Targets can execute repeatedly or only under specific conditions.&lt;/li&gt;
&lt;li&gt;Execution timing: Targets enable fine-grained control over when they execute.&lt;/li&gt;
&lt;li&gt;Code-Ordered Execution: Targets execute sequentially and predictably in the order they are written within a JavaScript object, thanks to ES2015's guaranteed property order.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  An All-in-One Solution
&lt;/h2&gt;

&lt;p&gt;The elegance of TargetJS emerges when its two innovations: Reactivity and Targets, work in concert. The combination allows TargetJS to serve as a consistent, all-in-one solution for most front-end development needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative UI Rendering:  Define your user interface using Targets, and let TargetJS automatically manage rendering updates.&lt;/li&gt;
&lt;li&gt;Animations: Leverage a target's built-in iteration, looping, and timing capabilities alongside reactivity to create complex animations with minimal effort.&lt;/li&gt;
&lt;li&gt;API Integration: Execute API calls as targets and utilize their reactivity features to automatically process responses.&lt;/li&gt;
&lt;li&gt;State Management: With targets inherently managing their own state, application state management becomes implicit.&lt;/li&gt;
&lt;li&gt;Event Handling: Attach event listeners directly as targets  to work consistently with the rest of the application&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Examples in Action
&lt;/h2&gt;

&lt;p&gt;To demonstrate the power and simplicity of TargetJS, let's explore its concepts through practical examples. We'll begin with a simple animation and incrementally expand it to demonstrate API integration, event handling, and dynamic UI updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Growing and Shrinking Box: Declarative Animation
&lt;/h3&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;//  width animates through 100 → 250 → 100, over 50 steps with 10ms intervals.&lt;/span&gt;
    &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// `$` creates a reactive target: the `height` updates each time `width` executes&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;prevTargetValue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Targets execute precisely in the order they are defined:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;background&lt;/code&gt;: This target runs first, setting the element's background color to &lt;code&gt;mediumpurple&lt;/code&gt;. Once the assignment is complete, its lifecycle ends.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;width&lt;/code&gt;: Next, the &lt;code&gt;width&lt;/code&gt; target takes over. It's configured to animate through a list of values (100, 250, 100), performing 50 steps with a 10ms pause between each step, creating a grow-then-shrink effect.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;height$&lt;/code&gt;: Finally, the &lt;code&gt;height$&lt;/code&gt; target demonstrates TargetJS's reactivity. Because its name ends with a single &lt;code&gt;$&lt;/code&gt; postfix, &lt;code&gt;height$&lt;/code&gt; is explicitly declared to react whenever its immediately preceding target (&lt;code&gt;width&lt;/code&gt;) executes on every step. As &lt;code&gt;width&lt;/code&gt; animates and changes its value, &lt;code&gt;height$&lt;/code&gt; automatically re-runs, setting its value to half of width's value.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The example above can also be implemented directly in HTML, utilizing tg- attributes that mirror the object literal keys used in JavaScript:&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;div&lt;/span&gt;
   &lt;span class="na"&gt;tg-background=&lt;/span&gt;&lt;span class="s"&gt;"mediumpurple"&lt;/span&gt;
   &lt;span class="na"&gt;tg-width=&lt;/span&gt;&lt;span class="s"&gt;"[{ list: [100, 250, 100] }, 50, 10]"&lt;/span&gt;
   &lt;span class="na"&gt;tg-height&lt;/span&gt;&lt;span class="err"&gt;$="&lt;/span&gt;&lt;span class="na"&gt;return&lt;/span&gt; &lt;span class="na"&gt;this.prevTargetValue&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;2;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding an API Call
&lt;/h3&gt;

&lt;p&gt;Let's extend our previous example to demonstrate how TargetJS handles asynchronous operations. We'll fetch user details from an API, but we also want this API call to initiate only after the box animation has fully completed.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;fetch$&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://targetjs.io/api/randomUser?id=user0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// `$$` ensures this runs only after width and height animation is complete&lt;/span&gt;
  &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// it runs when the API response is resolved&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;prevTargetValue&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="c1"&gt;// `prevTargetValue` holds the result from the previous target (i.e., the API response)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This example introduces two new targets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;fetch$$&lt;/code&gt;: &lt;code&gt;fetch&lt;/code&gt; target is a specialized target designed to retrieve data when given a URL string. Since its name ends with a &lt;code&gt;$$&lt;/code&gt; postfix, as previously discussed, this indicates that &lt;code&gt;fetch$$&lt;/code&gt; will activate only after preceding targets fully completed all of its operations. This guarantees the API call is initiated just after the animation finishes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;html$&lt;/code&gt;: Following &lt;code&gt;fetch$$&lt;/code&gt;, the &lt;code&gt;html&lt;/code&gt; target is responsible for setting the text content of the &lt;code&gt;div&lt;/code&gt; element to the fetched user's name. The &lt;code&gt;$&lt;/code&gt; postfix here signifies that &lt;code&gt;html$&lt;/code&gt; is a reactive target that executes each time its immediately preceding target (&lt;code&gt;fetch$$&lt;/code&gt;) provides a result. In this context, &lt;code&gt;this.prevTargetValue&lt;/code&gt; will hold the resolved data from the API call, allowing &lt;code&gt;html$&lt;/code&gt; to dynamically display the user's name as soon as it's available.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together, these targets orchestrate the flow: animation completes, then the API call happens, then the UI updates with the fetched data, all managed declaratively and in code order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attaching a Click Handler
&lt;/h3&gt;

&lt;p&gt;Let's expand our box further by adding a click handler. The goal is to change the box's background color to orange when clicked, pause for two seconds, and then revert the background back to its original mediumpurple.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;fetch$&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://targetjs.io/api/randomUser?id=user0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&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="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Special target that runs when the element is clicked&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;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Animates background to orange over 30 steps&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;pause$&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// `$$` ensures this runs ONLY after the preceding 'onClick' animation is fully complete&lt;/span&gt;
  &lt;span class="nx"&gt;purpleAgain$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// `$$` ensures this runs ONLY after `pause$$` completes (2-second interval)&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;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Animates background back to mediumpurple&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;onClick&lt;/code&gt;: This is a special TargetJS function that automatically runs whenever the associated element is clicked. Inside, &lt;code&gt;this.setTarget('background', 'orange', 30, 10)&lt;/code&gt; imperatively triggers a new animation, changing the background color to orange over 30 steps.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pause$$&lt;/code&gt;: Notice the &lt;code&gt;$$&lt;/code&gt; postfix. This &lt;code&gt;pause$$&lt;/code&gt; target is configured with an interval of 2000 milliseconds (2 seconds). Crucially, its &lt;code&gt;$$&lt;/code&gt; postfix means it will only begin its 2-second pause after its immediately preceding target (onClick) has fully completed its animation of changing the background to orange.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;purpleAgain$$&lt;/code&gt;: Also ending with &lt;code&gt;$$&lt;/code&gt;, this target executes only after the &lt;code&gt;pause$$&lt;/code&gt; target has finished its 2-second execution. It then uses this.setTarget again to animate the background color back to &lt;code&gt;mediumpurple&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sequence demonstrates how TargetJS allows you to define complex, timed flow with a guaranteeing execution order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's Make it More Complicated :)
&lt;/h3&gt;

&lt;p&gt;Let’s expand the previous example by creating 10 boxes instead of just one. Each box will be added with a slight delay and undergo its own task from the previous example. Once all these individual box processes (creation, animation, and API calls) are complete, we'll trigger a final collective action: changing all their backgrounds to green.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// A special target that generates a new list of child objects each time it executes&lt;/span&gt;
    &lt;span class="na"&gt;cycles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Creates 10 children (from cycle 0 to 9)&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Adds a new child every 100 milliseconds&lt;/span&gt;
    &lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cycle&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="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nx"&gt;fetch$&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://targetjs.io/api/randomUser?id=user&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cycle&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Each child fetches a unique user&lt;/span&gt;
        &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&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="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;onClick&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="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nx"&gt;pause$&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nx"&gt;purpleAgain$&lt;/span&gt;&lt;span class="nf"&gt;$&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="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mediumpurple&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;greenify$&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// `$$` ensures this runs ONLY after ALL children have completed ALL their tasks&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;getChildren&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Iterates and animates each child's background&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This advanced example demonstrates TargetJS's capability to manage complex, dynamic UI scenarios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;children&lt;/code&gt;: A special target construct used to create a collection of child objects. Each time it executes, the returned object or objects are added to the current one. The &lt;code&gt;cycles&lt;/code&gt; property specifies that the value function will run 10 times (from &lt;code&gt;cycle&lt;/code&gt; 0 to 9), thus creating 10 individual box elements.&lt;br&gt;
The &lt;code&gt;interval&lt;/code&gt; property ensures that each new box is created and added to the UI every 100 milliseconds.&lt;br&gt;
The &lt;code&gt;value(cycle)&lt;/code&gt; function return the same object element from the previous example.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;greenify$$&lt;/code&gt;: This target demonstrates the &lt;code&gt;$$&lt;/code&gt; postfix's full completion reactivity at a higher level. The &lt;code&gt;greenify$$&lt;/code&gt; target will execute only after the entire children target has comprehensively completed all of its work. This includes:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The creation of all 10 child boxes.&lt;/li&gt;
&lt;li&gt;The completion of each individual child's width animation.&lt;/li&gt;
&lt;li&gt;The successful return of all 10 API calls (&lt;code&gt;fetch&lt;/code&gt;) for each child.&lt;/li&gt;
&lt;li&gt;The population of all user names (&lt;code&gt;html&lt;/code&gt;) for each child.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only when all tasks initiated by children are finished will &lt;code&gt;greenify$$&lt;/code&gt; runs. It then uses &lt;code&gt;this.getChildren().forEach(child =&amp;gt; child.setTarget("background", "green", 30, 10))&lt;/code&gt; to iterate over all the created child boxes and animate their backgrounds to green. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if &lt;code&gt;greenify&lt;/code&gt; ends with only one &lt;code&gt;$&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;greenify&lt;/code&gt; ended with only one &lt;code&gt;$&lt;/code&gt; (i.e., &lt;code&gt;greenify$&lt;/code&gt;), it would exhibit immediate reactivity to its preceding target &lt;code&gt;children&lt;/code&gt;. Instead of waiting for all 10 children to be fully animated, etc, &lt;code&gt;greenify$&lt;/code&gt; would run immediately each time a new child is added.&lt;/p&gt;

&lt;p&gt;This example highlights TargetJS's ability to orchestrate complex, dependent operations across multiple elements in a compact, declarative, and code-ordered fashion.&lt;/p&gt;

&lt;p&gt;Ready to learn more?&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Visit:&lt;/strong&gt; &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TargetJS: Unifying UI Dev – Animations, State, APIs</title>
      <dc:creator>Ahmad Wasfi</dc:creator>
      <pubDate>Sun, 25 May 2025 02:02:00 +0000</pubDate>
      <link>https://dev.to/targetjs/targetjs-unifying-ui-dev-animations-state-apis-4hj8</link>
      <guid>https://dev.to/targetjs/targetjs-unifying-ui-dev-animations-state-apis-4hj8</guid>
      <description>&lt;p&gt;TargetJS offers a fresh approach to UI development: a single, unifying, and consistent method for handling animations, state management, APIs, and event handling.&lt;/p&gt;

&lt;p&gt;We've designed TargetJS around a few core ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Variables and methods are unified via an internal wrapper called "targets."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Targets execute sequentially and predictably in the order they are written leveraging ES2015's guaranteed property order.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reactive pipelines are enabled between adjacent targets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lifecycles are added to targets enabling them to behave like living, responsive cells.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a quick example of a growing and shrinking box:&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// width animates through 50 → 100 → 50, over 50 steps, 10ms interval&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
    &lt;span class="c1"&gt;// `$` creates a reactive pipeline: the `height` updates each&lt;/span&gt;
    &lt;span class="c1"&gt;// time `width` executes&lt;/span&gt;
    &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what's happening.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Targets run initially in the order they appear in the code, so &lt;code&gt;background&lt;/code&gt; runs first, followed by &lt;code&gt;width&lt;/code&gt;. The &lt;code&gt;_&lt;/code&gt; prefix indicates that a target is inactive by default, meaning &lt;code&gt;height&lt;/code&gt; does not run initially.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;background&lt;/code&gt; sets the background to purple, and its lifecycle ends.&lt;br&gt;
Then, &lt;code&gt;width&lt;/code&gt; animates from 50 → 100 → 50px, in 50 steps with 10ms pauses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;height&lt;/code&gt; follows width and scales dynamically with its value. The &lt;code&gt;$&lt;/code&gt; postfix creates a reactive pipeline where the target is triggered each time the preceding target runs. &lt;code&gt;prevTargetValue&lt;/code&gt; refers to the previous target's value, which in this case is width.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can also implement the growing box directly in an HTML element using &lt;code&gt;tg-&lt;/code&gt; attributes that mirror object literal keys:&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;div&lt;/span&gt;
   &lt;span class="na"&gt;tg-background=&lt;/span&gt;&lt;span class="s"&gt;"purple"&lt;/span&gt;
   &lt;span class="na"&gt;tg-width=&lt;/span&gt;&lt;span class="s"&gt;"[{ list: [50, 100, 50] }, 50, 10]"&lt;/span&gt;
   &lt;span class="na"&gt;tg-_height&lt;/span&gt;&lt;span class="err"&gt;$="&lt;/span&gt;&lt;span class="na"&gt;return&lt;/span&gt; &lt;span class="na"&gt;this.prevTargetValue&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;2;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  API Call Example
&lt;/h2&gt;

&lt;p&gt;In this example, we demonstrate how to integrate with an API: we'll load one user and display their name.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://targetjs.io/api/randomUser?id=user0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;_html&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in 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;div&lt;/span&gt;
   &lt;span class="na"&gt;tg-fetch=&lt;/span&gt;&lt;span class="s"&gt;"https://targetjs.io/api/randomUser?id=user0"&lt;/span&gt;
   &lt;span class="na"&gt;tg-_html&lt;/span&gt;&lt;span class="err"&gt;$="&lt;/span&gt;&lt;span class="na"&gt;return&lt;/span&gt; &lt;span class="na"&gt;this.prevTargetValue.name&lt;/span&gt;&lt;span class="err"&gt;;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what's happening.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fetch&lt;/code&gt; is a special target that performs a data fetch when given a URL string.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;html&lt;/code&gt; sets the text content of the div to the user's name. Since the target name is prefixed with &lt;code&gt;_&lt;/code&gt; and ends with &lt;code&gt;$&lt;/code&gt;, it executes only when an API call returns a result. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prevTargetValue&lt;/code&gt; refers to the result of the previous target, which, in this case, is the result of the API call.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Click Counter Example
&lt;/h2&gt;

&lt;p&gt;In this example, we demonstrate a click counter, which is commonly used as the ‘Hello World’ example in front-end frameworks.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nf"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="nx"&gt;_html&lt;/span&gt;&lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;initialValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;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;value&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="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in 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;div&lt;/span&gt;
 &lt;span class="na"&gt;tg-onClick=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
 &lt;span class="na"&gt;tg-_html&lt;/span&gt;&lt;span class="err"&gt;$="{&lt;/span&gt;
   &lt;span class="na"&gt;initialValue:&lt;/span&gt; &lt;span class="err"&gt;0,&lt;/span&gt;
   &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="err"&gt;()&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;return&lt;/span&gt; &lt;span class="na"&gt;this.value&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="err"&gt;1;&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
 &lt;span class="err"&gt;}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what’s happening.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;onClick&lt;/code&gt; target is a special function that runs whenever the &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; element is clicked.&lt;/li&gt;
&lt;li&gt;Since the &lt;code&gt;html&lt;/code&gt; is prefixed with &lt;code&gt;_&lt;/code&gt; and ends with &lt;code&gt;$&lt;/code&gt;, it executes every time &lt;code&gt;onClick&lt;/code&gt; runs.&lt;/li&gt;
&lt;li&gt;It is also possible to implement the counter update directly within the &lt;code&gt;onClick&lt;/code&gt; target, but we wanted to demonstrate the reactive feature between adjacent targets.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Via CDN&lt;/strong&gt;&lt;br&gt;
No installation is necessary. Just add the following &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag to your HTML to load TargetJS from a CDN (only 44KB compressed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://ltstaticfiles.s3.us-east-1.amazonaws.com/targetjs.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add &lt;code&gt;TargetJS&lt;/code&gt; to the global &lt;code&gt;window&lt;/code&gt; object, making it accessible throughout your JavaScript such as TargetJS.app(YourApp).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Via package manager&lt;/strong&gt;&lt;br&gt;
You can install also TargetJS via npm (note: there’s no “s” at the end):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;targetj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ready to see to learn more?&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Visit:&lt;/strong&gt; &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;br&gt;
🔗 Site: &lt;a href="https://targetjs.io" rel="noopener noreferrer"&gt;targetjs.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>TargetJS: Rethinking UI with Declarative, Synchronous Pipelines</title>
      <dc:creator>Ahmad Wasfi</dc:creator>
      <pubDate>Thu, 03 Apr 2025 17:46:35 +0000</pubDate>
      <link>https://dev.to/targetjs/targetjs-rethinking-ui-with-declarative-synchronous-pipelines-5bbi</link>
      <guid>https://dev.to/targetjs/targetjs-rethinking-ui-with-declarative-synchronous-pipelines-5bbi</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Explore TargetJS and contribute on &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have always been drawn to the JavaScript literal object. It is expressive, compact, and readable, if only there was a way to execute it. But JavaScript didn’t guarantee property order for a long time, until ES2015, which finally made the order predictable. It also introduced the shorter method syntax. This made the object literal more powerful and even more compact.&lt;/p&gt;

&lt;p&gt;This inspired the core idea behind TargetJS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provide an internal wrapper (called "targets") for both properties and methods of the literal object. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the targets sequentially in the same order as the code is written, using the framework's execution cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable a functional pipeline between adjacent targets. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add lifecycles, looping, and timing to targets so they can execute or re-execute themselves when a condition or time is met. This also makes the functional pipeline even more powerful as we will see later.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the basic idea. &lt;/p&gt;

&lt;p&gt;As a byproduct of uniformly treating properties and methods with lifecycles and states, state management becomes straightforward and implicit in the framework.&lt;/p&gt;

&lt;p&gt;To make the framework suitable for front-end development, TargetJS allows CSS styles to be integrated into the same object as targets especially since CSS styles closely resemble JavaScript object literals. To enhance style property utility, we added value iteration, so we can animate styles easily.&lt;/p&gt;

&lt;p&gt;In the following section, we explain how targets work and then demonstrate how they provide a unified solution for UI rendering, event handling, and API interactions.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding Targets With Basic examples&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;At the heart of TargetJS lies the concept of "Targets." As mentioned in the introduction, Targets provide a unified wrapper for both properties and methods of JavaScript literal objects. This wrapping process is handled implicitly by the TargetJS engine. The framework's execution cycle run the active targets initially based on the order in which they're written. The execution cycle also ensures that the execution is synchronous.&lt;/p&gt;

&lt;p&gt;Ok, let's start with a simple 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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code renders a 50px purple square. All properties become targets but there is one static value for each so the target lifecycles end, and nothing happens afterward. &lt;/p&gt;

&lt;p&gt;The object by default will create a &lt;code&gt;div&lt;/code&gt; element but can create any other element by implementing the special target &lt;code&gt;baseElement&lt;/code&gt;. While a literal object can represent an HTML block, it is best used to represent a single HTML element. This creates an enhanced HTML element that is highly extensible and flexible for handling any logic.&lt;/p&gt;

&lt;p&gt;In the next example, we animate the width from 50px to 100px and back to 50px, using 50 steps with 10ms pauses. The &lt;code&gt;_&lt;/code&gt; prefix on the height target indicates it's initially inactive and not ready for execution. The &lt;code&gt;$&lt;/code&gt; postfix creates a functional pipeline, activating the height target when the preceding width target executes. This causes the height to dynamically scale with the width's value. prevTargetValue refers to the previous target's value, which, in this case, is the width.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Target values, steps, interval&lt;/span&gt;
    &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// activated when width executes&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;prevTargetValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2Fymzpoe0ierfg0gafzddi.gif" 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%2Fymzpoe0ierfg0gafzddi.gif" alt="first example" width="506" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;UI Rendering and Animation Example&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This example builds upon the previous square animation. We create 10 animated squares. We then transition their background from purple to orange.&lt;/p&gt;

&lt;p&gt;First, we generate 10 squares. We also want to create one square every 100ms:&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cycles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;children&lt;/code&gt; target is a special type of target that adds new items each time it executes. &lt;code&gt;cycles: 9&lt;/code&gt; specifies 10 total cycles (0-9), executed every 100ms, as defined by &lt;code&gt;interval&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To transition the background after the square animations, we add another target with the postfix &lt;code&gt;$$&lt;/code&gt;, creating a functional pipeline.&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%2Fc8ycbc3j6610hwuzsgrb.gif" 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%2Fc8ycbc3j6610hwuzsgrb.gif" alt="second example" width="2156" height="344"&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;width&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="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cycles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;_changeBackround$&lt;/span&gt;&lt;span class="nf"&gt;$&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="nf"&gt;getChildren&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;child&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;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;$$&lt;/code&gt; postfix ensures that the &lt;code&gt;changeBackround&lt;/code&gt; target executes only after the &lt;code&gt;children&lt;/code&gt; target completes, including all of its children and their respective targets. This guarantees the background transition occurs after all squares are created and their animations finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Event Handling Example&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This example adds click event handling to the squares, resetting their width animation on each click. &lt;code&gt;onClick&lt;/code&gt; is another specialized target that activates in response to click events.&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;App&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;width&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="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cycles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nf"&gt;onClick&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="nf"&gt;activateTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;width&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;_changeBackround$&lt;/span&gt;&lt;span class="nf"&gt;$&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="nf"&gt;getChildren&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fvhiuv6ufb3s0v87bkyyz.gif" 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%2Fvhiuv6ufb3s0v87bkyyz.gif" alt="third example" width="2156" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  API Call Example
&lt;/h2&gt;

&lt;p&gt;This example demonstrates integrating API calls into the square animation. We have added two new targets: &lt;code&gt;loadSquare&lt;/code&gt; to fetch data, and &lt;code&gt;populate&lt;/code&gt; to display the result. As the &lt;code&gt;populate&lt;/code&gt; target ends with &lt;code&gt;$&lt;/code&gt;, it executes after the API completes. &lt;code&gt;prevTargetValue&lt;/code&gt; refers to the API's response.&lt;/p&gt;

&lt;p&gt;Note that the &lt;code&gt;changeBackround&lt;/code&gt; target will not execute until the API result is available and all other targets have completed.&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;App&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fetch&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;targetj&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;width&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="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;cycles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;square&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;purple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="nx"&gt;_height&lt;/span&gt;&lt;span class="nf"&gt;$&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;prevTargetValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="nf"&gt;loadSquare&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;fetch&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://targetjs.io/api/randomUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;id&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;oid&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="nx"&gt;_populate&lt;/span&gt;&lt;span class="nf"&gt;$&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="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;html&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;prevTargetValue&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="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;_changeBackround$&lt;/span&gt;&lt;span class="nf"&gt;$&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="nf"&gt;getChildren&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;orange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2Fk81wmrczjkng3muwh26d.gif" 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%2Fk81wmrczjkng3muwh26d.gif" alt="forth example" width="2156" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Try TargetJS Today!&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;TargetJS is an evolving framework. We invite you to explore its potential and contribute to its development.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Visit:&lt;/strong&gt; &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;br&gt;
🔗 Site: &lt;a href="https://targetjs.io" rel="noopener noreferrer"&gt;targetjs.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Building a Single-Page App with a New Paradigm Using TargetJ</title>
      <dc:creator>Ahmad Wasfi</dc:creator>
      <pubDate>Thu, 24 Oct 2024 22:53:42 +0000</pubDate>
      <link>https://dev.to/targetjs/building-a-single-page-app-with-a-new-paradigm-using-targetj-5h80</link>
      <guid>https://dev.to/targetjs/building-a-single-page-app-with-a-new-paradigm-using-targetj-5h80</guid>
      <description>&lt;p&gt;React has become one of the most popular frameworks for building user interfaces. A typical React application looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React Application (App.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import React, &lt;span class="o"&gt;{&lt;/span&gt; useState &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'react'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
import &lt;span class="s1"&gt;'./App.css'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;function &lt;/span&gt;App&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  // State to hold the message
  const &lt;span class="o"&gt;[&lt;/span&gt;message, setMessage] &lt;span class="o"&gt;=&lt;/span&gt; useState&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Welcome to My Simple React App'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  // Function to update the message
  const handleClick &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    setMessage&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Hello! You clicked the button.'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &amp;lt;div &lt;span class="nv"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"App"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &amp;lt;header &lt;span class="nv"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"App-header"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &amp;lt;h1&amp;gt;&lt;span class="o"&gt;{&lt;/span&gt;message&lt;span class="o"&gt;}&lt;/span&gt;&amp;lt;/h1&amp;gt;
        &amp;lt;button &lt;span class="nv"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;handleClick&lt;span class="o"&gt;}&amp;gt;&lt;/span&gt;Click Me!&amp;lt;/button&amp;gt;
      &amp;lt;/header&amp;gt;
    &amp;lt;/div&amp;gt;
  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;default App&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Styling with CSS (App.css)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.App &lt;span class="o"&gt;{&lt;/span&gt;
  text-align: center&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

.App-header &lt;span class="o"&gt;{&lt;/span&gt;
  background-color: &lt;span class="c"&gt;#282c34;&lt;/span&gt;
  min-height: 100vh&lt;span class="p"&gt;;&lt;/span&gt;
  display: flex&lt;span class="p"&gt;;&lt;/span&gt;
  flex-direction: column&lt;span class="p"&gt;;&lt;/span&gt;
  align-items: center&lt;span class="p"&gt;;&lt;/span&gt;
  justify-content: center&lt;span class="p"&gt;;&lt;/span&gt;
  font-size: calc&lt;span class="o"&gt;(&lt;/span&gt;10px + 2vmin&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  color: white&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

button &lt;span class="o"&gt;{&lt;/span&gt;
  font-size: 1.2em&lt;span class="p"&gt;;&lt;/span&gt;
  padding: 10px 20px&lt;span class="p"&gt;;&lt;/span&gt;
  cursor: pointer&lt;span class="p"&gt;;&lt;/span&gt;
  background-color: &lt;span class="c"&gt;#61dafb;&lt;/span&gt;
  border: none&lt;span class="p"&gt;;&lt;/span&gt;
  border-radius: 5px&lt;span class="p"&gt;;&lt;/span&gt;
  margin-top: 20px&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

button:hover &lt;span class="o"&gt;{&lt;/span&gt;
  background-color: &lt;span class="c"&gt;#21a1f1;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The issue with this approach is that React doesn't provide a unified way to manage state, handle presentation, manage events, make API calls, or handle animations. Additionally, controlling program flow with time is challenging. Moreover, the HTML tree and CSS introduce an extra intermediary layer that is inherently static, making it difficult to control affecting design flexibility.&lt;/p&gt;

&lt;p&gt;TargetJ is a new JavaScript framework that introduces a new paradigm for programming single-page sites, addressing all the issues mentioned above. It is open-source, and you can find it at &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;https://github.com/livetrails/targetj&lt;/a&gt;. The core concept of the framework is that it gives life cycles to methods and variable assignments, allowing them to operate autonomously, much like living cells.&lt;/p&gt;

&lt;p&gt;This is achieved by providing a unified interface wrapper for both methods and variable assignments, forming new constructs called targets. The interface wrapper doesn't necessarily add extra code, as targets can also be written as methods or variable assignments. Targets can also be written as objects, which is the most expressive format, allowing them to have callbacks to adjust to external changes.&lt;/p&gt;

&lt;p&gt;In other words, targets are the fundamental building blocks of components. Every component in TargetJ is composed of a set of targets.&lt;/p&gt;

&lt;p&gt;A brief explanation of what targets consist of will help in understanding how TargetJ works. Each target has the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Target Value and Actual Value&lt;/strong&gt;&lt;br&gt;
The target value is the value assigned to a variable or the result produced by a method, while the actual value is the one used by the rest of the application. When the target value differs from the actual value, TargetJ updates the actual value iteratively until it matches the target value. This process is controlled by two additional variables: &lt;code&gt;Step&lt;/code&gt;, which defines the number of iterations, and &lt;code&gt;Interval&lt;/code&gt;, which specifies the duration (in milliseconds) the system waits before executing each iteration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. State&lt;/strong&gt;&lt;br&gt;
Targets have four states that control their lifecycle: Active, Inactive, Updating, and Complete.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Active&lt;/strong&gt;: This is the default state for all targets. It indicates that the target is ready to be executed, meaning the target value needs to be initialized from the variable it represents, or its &lt;code&gt;value()&lt;/code&gt; method needs to be executed to calculate its output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inactive&lt;/strong&gt;: Indicates that the target is not ready to be executed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updating&lt;/strong&gt;: Indicates that the actual value is being adjusted to match the target value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete&lt;/strong&gt;: Indicates that the target execution is finished, and the actual value has successfully matched the target value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Target Methods&lt;/strong&gt;&lt;br&gt;
All methods are optional. They are used to control the lifecycle of targets or serve as callbacks to reflect changes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Controlling methods&lt;/strong&gt;: &lt;code&gt;enabledOn&lt;/code&gt;, &lt;code&gt;loop&lt;/code&gt;, &lt;code&gt;steps&lt;/code&gt;, &lt;code&gt;cycles&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Callbacks&lt;/strong&gt;: &lt;code&gt;onValueChange&lt;/code&gt;, &lt;code&gt;onStepsEnd&lt;/code&gt;, &lt;code&gt;onImperativeStep&lt;/code&gt;, &lt;code&gt;onImperativeEnd&lt;/code&gt;, &lt;code&gt;onSuccess&lt;/code&gt;, &lt;code&gt;onError&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  TargetJ Solution
&lt;/h2&gt;

&lt;p&gt;Let’s see how TargetJ tackles the issues mentioned earlier.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Handling presentation
&lt;/h3&gt;

&lt;p&gt;Let’s start with the button as we work progressively to implement the React example above, allowing us to illustrate each issue more clearly.&lt;/p&gt;

&lt;p&gt;In the example below, you can see that the HTML elements, styles, and attributes are all written as targets, each capable of operating independently. For instance, the background target has three values and will continuously morph between them over 50 steps. HTML nesting can also be dynamically changed by targets. This is achieved by declaring the &lt;code&gt;domParent&lt;/code&gt; target from the element seeking a container or the &lt;code&gt;domHolder&lt;/code&gt; target, declared by containers for elements without a &lt;code&gt;domParent&lt;/code&gt;. In our example, the button has no &lt;code&gt;domParent&lt;/code&gt;, so it will be nested in the application root, supporting a flat HTML structure.&lt;/p&gt;

&lt;p&gt;You can view a live example here: &lt;a href="https://targetj.io/examples/articlePresentation.html" rel="noopener noreferrer"&gt;https://targetj.io/examples/articlePresentation.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TargetJ Application (articlePresentation.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;App&lt;span class="o"&gt;(&lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
    width: 100,
    height: 100,
    fontSize: &lt;span class="s1"&gt;'1.2em'&lt;/span&gt;,
    lineHeight: 100,
    cursor: &lt;span class="s1"&gt;'pointer'&lt;/span&gt;,
    border: &lt;span class="s1"&gt;'none'&lt;/span&gt;,
    borderRadius: 5,
    html: &lt;span class="s1"&gt;'Click me'&lt;/span&gt;,
    topMargin: 20,
    x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,                      
    background: &lt;span class="o"&gt;{&lt;/span&gt;
        loop: &lt;span class="nb"&gt;true&lt;/span&gt;,
        value&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; list: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'#21a1f1'&lt;/span&gt;, &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        steps: 30
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2Fx106vr9uqqyt4120us4p.gif" 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%2Fx106vr9uqqyt4120us4p.gif" alt="presentation" width="608" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Animation
&lt;/h3&gt;

&lt;p&gt;In the next example, we add four sets of animation moves to our button by creating a new target called &lt;code&gt;animate&lt;/code&gt;. We iterate through the array of moves using &lt;code&gt;cycle&lt;/code&gt;, which only updates once all the moves in a set are completed. The &lt;code&gt;setTarget&lt;/code&gt; defines an imperative target within the declarative target of &lt;code&gt;animate&lt;/code&gt;. The &lt;code&gt;onImperativeEnd&lt;/code&gt; callback is triggered when the actual value reaches the target value of each style attribute.&lt;/p&gt;

&lt;p&gt;We also added a &lt;code&gt;baseElement&lt;/code&gt; target, which alternates between &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; every second. The focus here is not on presentation, but rather to illustrate how HTML can be seen in a new light, reducing the design constraints typically imposed by it.&lt;/p&gt;

&lt;p&gt;You can view a live example here: &lt;a href="https://targetj.io/examples/articleAnimation.html" rel="noopener noreferrer"&gt;https://targetj.io/examples/articleAnimation.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TargetJ Application (articleAnimation.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;App&lt;span class="o"&gt;(&lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
    width: 100,
    height: 100,
    src: &lt;span class="s1"&gt;'https://targetj.io/img/structure.jpg'&lt;/span&gt;,
    fontSize: &lt;span class="s1"&gt;'1.2em'&lt;/span&gt;,
    lineHeight: 100,
    cursor: &lt;span class="s1"&gt;'pointer'&lt;/span&gt;,
    border: &lt;span class="s1"&gt;'none'&lt;/span&gt;,
    borderRadius: 5,
    html: &lt;span class="s1"&gt;'Click me'&lt;/span&gt;,
    topMargin: 20,
    x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,           
    baseElement: &lt;span class="o"&gt;{&lt;/span&gt;
        loop: &lt;span class="nb"&gt;true&lt;/span&gt;,
        cycles: 1,
        interval: 1000,
        value&lt;span class="o"&gt;(&lt;/span&gt;cycle&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'img'&lt;/span&gt;, &lt;span class="s1"&gt;'button'&lt;/span&gt; &lt;span class="o"&gt;][&lt;/span&gt;cycle]&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,            
    background: &lt;span class="o"&gt;{&lt;/span&gt;
        loop: &lt;span class="nb"&gt;true&lt;/span&gt;,
        value&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; list: &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'#21a1f1'&lt;/span&gt;, &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
        steps: 30
    &lt;span class="o"&gt;}&lt;/span&gt;,
    animate: &lt;span class="o"&gt;{&lt;/span&gt;
        cycles: 3,
        value&lt;span class="o"&gt;(&lt;/span&gt;cycle&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;{&lt;/span&gt; rotate: 0, scale: 1, background: &lt;span class="s1"&gt;'blue'&lt;/span&gt;, borderRadius: 0 &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="o"&gt;{&lt;/span&gt; rotate: 180, scale: 1.5, background: &lt;span class="s1"&gt;'red'&lt;/span&gt;, borderRadius: 75 &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="o"&gt;{&lt;/span&gt; rotate: 360, scale: 2, background: &lt;span class="s1"&gt;'yellow'&lt;/span&gt;, borderRadius: 50 &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="o"&gt;{&lt;/span&gt; rotate: 0, scale: 1, background: &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;, borderRadius: 5  &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;][&lt;/span&gt;cycle]&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        onValueChange&lt;span class="o"&gt;(&lt;/span&gt;value&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"coolAnimation"&lt;/span&gt;, value, 50&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
        &lt;span class="o"&gt;}&lt;/span&gt;,
        onImperativeEnd&lt;span class="o"&gt;(&lt;/span&gt;key&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;key &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'background'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; this.getTargetCycle&lt;span class="o"&gt;(&lt;/span&gt;this.key&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; 3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                this.resetImperative&lt;span class="o"&gt;(&lt;/span&gt;key&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;      
&lt;span class="o"&gt;}))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2Fi4qq2yy92m0dlhz3w9mq.gif" 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%2Fi4qq2yy92m0dlhz3w9mq.gif" alt="animation" width="608" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Handling events
&lt;/h3&gt;

&lt;p&gt;In this example, we added three targets to handle three events: &lt;code&gt;click&lt;/code&gt;, &lt;code&gt;mouseenter&lt;/code&gt;, and &lt;code&gt;mouseleave&lt;/code&gt;. The target events &lt;code&gt;onClickEvent&lt;/code&gt;, &lt;code&gt;onEnterEvent&lt;/code&gt;, and &lt;code&gt;onLeaveEvent&lt;/code&gt; are special targets that the TargetJ task will call when the corresponding events are triggered. These targets can either activate other targets or handle the events directly as methods. &lt;/p&gt;

&lt;p&gt;We also added a special target called &lt;code&gt;canHandleEvents&lt;/code&gt;, which specifies that the button can handle touch events. Since &lt;code&gt;canHandleEvents&lt;/code&gt; is a target, it can also be activated by other events, enabling or disabling touch event handling based on certain conditions.&lt;/p&gt;

&lt;p&gt;Notice that the &lt;code&gt;shake&lt;/code&gt; target has the &lt;code&gt;active&lt;/code&gt; flag set to &lt;code&gt;false&lt;/code&gt;. This indicates that the target will not be executed until it is activated by other targets.&lt;/p&gt;

&lt;p&gt;You can view a live example here: &lt;a href="https://targetj.io/examples/articleEvents.html" rel="noopener noreferrer"&gt;https://targetj.io/examples/articleEvents.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TargetJ Application (articleEvents.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import &lt;span class="o"&gt;{&lt;/span&gt; App, TModel, Easing &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"targetj"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

App&lt;span class="o"&gt;(&lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
    canHandleEvents: &lt;span class="s1"&gt;'touch'&lt;/span&gt;,
    width: 100,
    height: 100,
    fontSize: &lt;span class="s1"&gt;'1.2em'&lt;/span&gt;,
    lineHeight: 100,
    cursor: &lt;span class="s1"&gt;'pointer'&lt;/span&gt;,
    border: &lt;span class="s1"&gt;'none'&lt;/span&gt;,
    textAlign: &lt;span class="s1"&gt;'center'&lt;/span&gt;,
    borderRadius: 5,
    html: &lt;span class="s1"&gt;'Click me'&lt;/span&gt;,
    background: &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;,
    topMargin: 20,
    x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,    
    shake: &lt;span class="o"&gt;{&lt;/span&gt;
        active: &lt;span class="nb"&gt;false&lt;/span&gt;,
        cycles: 3,
        value&lt;span class="o"&gt;(&lt;/span&gt;cycle&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            const x &lt;span class="o"&gt;=&lt;/span&gt; this.getX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'x'&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; list: &lt;span class="o"&gt;[&lt;/span&gt; x - 20, x, x + 20, x &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, 10 - 2 &lt;span class="k"&gt;*&lt;/span&gt; cycle, 0, Easing.inOut&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    onClickEvent: &lt;span class="s1"&gt;'shake'&lt;/span&gt;,
    onEnterEvent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'background'&lt;/span&gt;, &lt;span class="s1"&gt;'#21a1f1'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
    onLeaveEvent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'background'&lt;/span&gt;, &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,     
&lt;span class="o"&gt;}))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2F9ncnfqilwnp2xi9e4os7.gif" 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%2F9ncnfqilwnp2xi9e4os7.gif" alt="animation" width="608" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Calling API
&lt;/h3&gt;

&lt;p&gt;In the example below, we define a target named &lt;code&gt;load&lt;/code&gt;. Inside the &lt;code&gt;value&lt;/code&gt; function, we make an API call using &lt;code&gt;fetch()&lt;/code&gt;. The second argument specifies the API URL, and the third argument contains the query parameters passed to the API. A fourth optional parameter, omitted in this example, can specify a cache ID if we want to cache the result. This cache ID can also be used to retrieve the cached data. If it’s not specified, the result will always come from the API. &lt;/p&gt;

&lt;p&gt;Once the API response is received, it triggers either &lt;code&gt;onSuccess&lt;/code&gt; or &lt;code&gt;onError&lt;/code&gt;, depending on the outcome.&lt;/p&gt;

&lt;p&gt;You can view a live example here: &lt;a href="https://targetj.io/examples/articleAPI.html" rel="noopener noreferrer"&gt;https://targetj.io/examples/articleAPI.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TargetJ Application (articleAPI.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import &lt;span class="o"&gt;{&lt;/span&gt; App, TModel, getLoader &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"targetj"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

App&lt;span class="o"&gt;(&lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
    canHandleEvents: &lt;span class="s1"&gt;'touch'&lt;/span&gt;,
    width: 100,
    height: 100,
    fontSize: &lt;span class="s1"&gt;'1.2em'&lt;/span&gt;,
    display: &lt;span class="s1"&gt;'flex'&lt;/span&gt;,
    justifyContent: &lt;span class="s1"&gt;'center'&lt;/span&gt;,
    alignItems: &lt;span class="s1"&gt;'center'&lt;/span&gt;,
    textAlign: &lt;span class="s1"&gt;'center'&lt;/span&gt;,    
    cursor: &lt;span class="s1"&gt;'pointer'&lt;/span&gt;,
    border: &lt;span class="s1"&gt;'none'&lt;/span&gt;,
    borderRadius: 5,
    html: &lt;span class="s1"&gt;'Click me'&lt;/span&gt;,
    background: &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;,
    topMargin: 20,
    x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, 
    load: &lt;span class="o"&gt;{&lt;/span&gt;
        active: &lt;span class="nb"&gt;false&lt;/span&gt;,
        value&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return &lt;/span&gt;getLoader&lt;span class="o"&gt;()&lt;/span&gt;.fetch&lt;span class="o"&gt;(&lt;/span&gt;this, &lt;span class="s1"&gt;'https://targetj.io/api/randomUser'&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;: &lt;span class="s1"&gt;'user0'&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
        &lt;span class="o"&gt;}&lt;/span&gt;,
        onSuccess&lt;span class="o"&gt;(&lt;/span&gt;res&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;   
            this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'html'&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;My name is &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.result.name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                     
        &lt;span class="o"&gt;}&lt;/span&gt;,
        onError&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'html'&lt;/span&gt;, &lt;span class="s1"&gt;'Click again!'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,    
    onClickEvent: &lt;span class="s1"&gt;'load'&lt;/span&gt;,
    onEnterEvent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'background'&lt;/span&gt;, &lt;span class="s1"&gt;'#21a1f1'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
    onLeaveEvent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; this.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'background'&lt;/span&gt;, &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;    
&lt;span class="o"&gt;}))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2F1vtk861jxd6lv7ae3xmf.gif" 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%2F1vtk861jxd6lv7ae3xmf.gif" alt="animation" width="608" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. State Management
&lt;/h3&gt;

&lt;p&gt;Each target manages its own state. Targets can be activated by certain events, such as user actions or when the page is closed, allowing them to refresh their states. TargetJ tasks execute all targets in the order they appear, from top to bottom. For more complex cases, &lt;code&gt;enabledOn()&lt;/code&gt; can keep a target active until the condition defined within &lt;code&gt;enabledOn()&lt;/code&gt; is met.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;getPager()&lt;/code&gt; function in TargetJ, used for switching between pages, maintains a cache of each page. Similarly, the &lt;code&gt;getLoader()&lt;/code&gt;, as we saw above, can cache results to be used across different parts of the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Controlling the execution flow with time
&lt;/h3&gt;

&lt;p&gt;TargetJ was designed from the ground up to handle complicated and intricate sequences. Here is a brief explanation of what it provides: Each target has an &lt;code&gt;interval&lt;/code&gt; property, which can also be implemented as a method. The &lt;code&gt;interval&lt;/code&gt; controls the execution rate of the &lt;code&gt;value()&lt;/code&gt; of the target. The execution rate for each step, which updates the actual value to match the target value, can also be configured. Imperative targets can define their own &lt;code&gt;interval&lt;/code&gt; as well. The &lt;code&gt;onImperativeStep&lt;/code&gt; and &lt;code&gt;onImperativeEnd&lt;/code&gt; callbacks allow you to listen for each step update or when all steps of the imperative targets are completed.&lt;/p&gt;

&lt;p&gt;Here is the full implementation of the React example mentioned earlier, with the following added to demonstrate TargetJ’s ability to control different parts of the application over time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display the message first, then add the button after 1 second.&lt;/li&gt;
&lt;li&gt;Scale the button and revert back after 1 second from showing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can view a live example here: &lt;a href="https://targetj.io/examples/articleTime.html" rel="noopener noreferrer"&gt;https://targetj.io/examples/articleTime.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TargetJ Application (articleTime.js)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import &lt;span class="o"&gt;{&lt;/span&gt; App, TModel, getEvents &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"targetj"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

App&lt;span class="o"&gt;(&lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
    title&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
            topMargin: 20,
            html: &lt;span class="s1"&gt;'Welcome to My Simple TargetJ App'&lt;/span&gt;,
            x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    button&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;new TModel&lt;span class="o"&gt;({&lt;/span&gt;
            canHandleEvents: &lt;span class="s1"&gt;'touch'&lt;/span&gt;,
            fontSize: &lt;span class="s1"&gt;'1.2em'&lt;/span&gt;,
            padding: &lt;span class="s1"&gt;'10px 20px'&lt;/span&gt;,
            cursor: &lt;span class="s1"&gt;'pointer'&lt;/span&gt;,
            border: &lt;span class="s1"&gt;'none'&lt;/span&gt;,
            borderRadius: &lt;span class="s1"&gt;'5px'&lt;/span&gt;,
            html: &lt;span class="s1"&gt;'Click me'&lt;/span&gt;,
            topMargin: 20,
            scale: &lt;span class="o"&gt;{&lt;/span&gt;
                cycles: 1,
                interval: 1000,
                value&lt;span class="o"&gt;(&lt;/span&gt;cycle&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; 1, &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; list: &lt;span class="o"&gt;[&lt;/span&gt; 1, 2, 1 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, 30, 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;][&lt;/span&gt;cycle]&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;,
            background&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;getEvents&lt;span class="o"&gt;()&lt;/span&gt;.isTouchHandler&lt;span class="o"&gt;(&lt;/span&gt;this&lt;span class="o"&gt;)&lt;/span&gt; ? &lt;span class="s1"&gt;'#21a1f1'&lt;/span&gt; : &lt;span class="s1"&gt;'#61dafb'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,            
            x&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return &lt;/span&gt;this.getCenterX&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
            onClickEvent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; this.getParentValue&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;.setTarget&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'html'&lt;/span&gt;, &lt;span class="s1"&gt;'Hello! You clicked the button.'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
            onEnterEvent: &lt;span class="s1"&gt;'background'&lt;/span&gt;,
            onLeaveEvent: &lt;span class="s1"&gt;'background'&lt;/span&gt;
        &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
    children: &lt;span class="o"&gt;{&lt;/span&gt;
       cycles: 1,
       interval: 1000,
       value&lt;span class="o"&gt;(&lt;/span&gt;cycle&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; this.val&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, this.val&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'button'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;][&lt;/span&gt;cycle]&lt;span class="p"&gt;;&lt;/span&gt;
       &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;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%2Fgsbg0ck6pp79zncra98u.gif" 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%2Fgsbg0ck6pp79zncra98u.gif" alt="animation" width="608" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We believe TargetJ offers a fluid and flexible medium that enables a new kind of user experience that was previously difficult to achieve. It also simplifies development significantly, making it more enjoyable without sacrificing performance. You can find the framework at &lt;a href="https://github.com/livetrails/targetj" rel="noopener noreferrer"&gt;https://github.com/livetrails/targetj&lt;/a&gt; and explore its interactive documentation at &lt;a href="http://www.targetj.io" rel="noopener noreferrer"&gt;www.targetj.io&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>ui</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
