<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Declarative Dragging on Visualizing.JP</title>
        <link>https://visualizing.jp/en/tags/declarative-dragging/</link>
        <description>Recent content in Declarative Dragging on Visualizing.JP</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-US</language>
        <copyright>Yuichi Yazaki</copyright>
        <lastBuildDate>Wed, 04 Nov 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://visualizing.jp/en/tags/declarative-dragging/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Don&#39;t Write the Drag, List Its Outcomes: Declarative Dragging</title>
        <link>https://visualizing.jp/en/declarative-dragging/</link>
        <pubDate>Wed, 04 Nov 2026 00:00:00 +0900</pubDate>
        
        <guid>https://visualizing.jp/en/declarative-dragging/</guid>
        <description>&lt;img src="https://visualizing.jp/declarative-dragging/images/how-it-works.png" alt="Featured image of post Don&#39;t Write the Drag, List Its Outcomes: Declarative Dragging" /&gt;&lt;p&gt;Declarative Dragging is a way to write a drag not as coordinate calculations but as a list of the states the display can take as the result of the drag. The system draws each listed state in advance, and from the positions where the dragged element ends up, it assembles the drop targets and the motion in between.&lt;/p&gt;
&lt;p&gt;It was proposed by Joshua Horowitz, Andrew Blinn, and Jeffrey Heer. The paper &amp;ldquo;Declarative Dragging&amp;rdquo; was presented at UIST 2026 (November 2–5, 2026, Detroit) and was chosen as one of six Best Paper Awards. The implementation is Dragology, a TypeScript library released under the MIT license. What follows is based on the paper PDF on the authors&amp;rsquo; site and the project page.&lt;/p&gt;
&lt;h2 id=&#34;instead-of-writing-the-motion-list-the-states&#34;&gt;Instead of Writing the Motion, List the States
&lt;/h2&gt;&lt;p&gt;The paper opens by saying that high-quality drag and drop is hard to build. It needs drop-target calculations, transition animations, and previews during the drag.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In many cases, the complexity of drag-and-drop causes interface developers to forsake it entirely in favor of simpler forms and widgets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In short: the complexity leads developers to give up on dragging and settle for forms and widgets.&lt;/p&gt;
&lt;p&gt;The core of the mechanism is the Scrabble rack example in §3.1. When the state is &lt;code&gt;[A, B, C]&lt;/code&gt;, the states that can result from dragging B are three: &lt;code&gt;[B, A, C]&lt;/code&gt;, &lt;code&gt;[A, B, C]&lt;/code&gt; (unchanged), and &lt;code&gt;[A, C, B]&lt;/code&gt;. Traditionally, you would build a drop target by hand for each one. Here, &lt;strong&gt;the three states go through the render function to draw three racks, and the position where B is drawn is taken from each&lt;/strong&gt;. At the moment of release, the closest position is chosen and the state switches to it.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works.png&#34; width=&#34;1600&#34; height=&#34;596&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works_hu_7f91dd8c045939fc.png 480w, https://visualizing.jp/declarative-dragging/images/how-it-works_hu_9a981885717c7b40.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Diagram of the mechanism: states are drawn to the screen, candidate states are drawn in advance when a drag starts, and the drop target is decided from the element’s positions&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Diagram of the mechanism: states are drawn to the screen, candidate states are drawn in advance when a drag starts, and the drop target is decided from the element’s positions&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / Declarative Dragging project page, &amp;ldquo;How it works&amp;rdquo;&lt;/p&gt;
&lt;p&gt;What the author writes is only a render function that turns a state into a display, and, for each draggable element, a set of candidate states. The paper calls this model-driven dragging, and drawing in advance speculative rendering. The idea is to use a render function such as React&amp;rsquo;s not only for sequential updates but also for branching future states (§2.2).&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Input&lt;/th&gt;
          &lt;th&gt;Maps to&lt;/th&gt;
          &lt;th&gt;Handled by&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;State&lt;/td&gt;
          &lt;td&gt;SVG display&lt;/td&gt;
          &lt;td&gt;Render function&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Candidate states&lt;/td&gt;
          &lt;td&gt;Element positions in the pre-drawn displays&lt;/td&gt;
          &lt;td&gt;Engine&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Distance from pointer to each position&lt;/td&gt;
          &lt;td&gt;State on release&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;closest&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Pointer inside a convex hull&lt;/td&gt;
          &lt;td&gt;Interpolation weights of up to three displays&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;between&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;A number inside the state&lt;/td&gt;
          &lt;td&gt;Value at which the element gets closest to the pointer&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;vary&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DOM &lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Correspondence of elements across displays&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;lerpViews&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;ring-of-beads-and-scheduler-choosing-the-motion-with-operators&#34;&gt;Ring of Beads and Scheduler: Choosing the Motion with Operators
&lt;/h2&gt;&lt;p&gt;Once the drop target is decided, the motion in between is still undecided. The paper lets you choose it by combining operators (§3.2). Each operator builds a function that takes the pointer position and returns the preview for that moment and the state if the pointer were released now.&lt;/p&gt;
&lt;p&gt;The Ring of Beads in §4 imagines a math teacher, Alex, showing how beads arranged in a ring can be reordered. The state is &lt;code&gt;{beads: [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;E&amp;quot;]}&lt;/code&gt;. To the bead&amp;rsquo;s rendering, you add the following attribute.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;dragologyOnDrag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newStates&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;targetIdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;structuredClone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;splice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;splice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;targetIdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;closest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newStates&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The first part builds the states in which the grabbed bead is reinserted at each position, and the last line gathers them with &lt;code&gt;closest&lt;/code&gt;. This is all the code you add.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating.png&#34; width=&#34;1122&#34; height=&#34;569&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating_hu_48efc8c3e7e64c85.png 480w, https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating_hu_6ef05c23e3892425.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Ring of Beads. With d.closest(…) above, A does not move until partway through; with withFloating() below, A follows the pointer&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Ring of Beads. With d.closest(…) above, A does not move until partway through; with withFloating() below, A follows the pointer&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 2 A (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;closest&lt;/code&gt; alone, A jumps to the nearest position and does not move at first. If you change the last line to &lt;code&gt;d.closest(newStates).withFloating()&lt;/code&gt;, A follows the pointer, and the other beads move aside to show where they will land.&lt;/p&gt;
&lt;p&gt;You can check why it moves this way with three visualization tools.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree.png&#34; width=&#34;902&#34; height=&#34;982&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree_hu_46f82c1c7c5e84e9.png 480w, https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree_hu_1b00f2ae992ef317.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Overlay shows the distance from the pointer to each candidate, Drop Zones color-codes the behavior at each pointer position, and Spec Tree shows the tree of operators&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Overlay shows the distance from the pointer to each candidate, Drop Zones color-codes the behavior at each pointer position, and Spec Tree shows the tree of operators&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 3 (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;Scheduler is the problem of assigning meetings to rooms. For a drag that changes the room, you line up states with only the room number changed and pass them to &lt;code&gt;between&lt;/code&gt;, so the meeting bar slides along a vertical line. Start times cannot be listed as continuous values, so you use &lt;code&gt;vary&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;dragologyOnDrag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;meetings&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;constraint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lessThan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lessThan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MIN_LENGTH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]});}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This specification moves only &lt;code&gt;meetings[i].start&lt;/code&gt; within the constraint and keeps searching for the value at which the endpoint gets closest to the pointer. Even if you later change how the endpoint is drawn, the specification stays the same.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is expressed semantically, in terms of control over parameters, not fragile coordinate logic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In short: it is written in terms of what the parameters mean, not fragile coordinate calculations.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track.png&#34; width=&#34;1081&#34; height=&#34;471&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track_hu_8c52e69293cf9c87.png 480w, https://visualizing.jp/declarative-dragging/images/scheduler-between-track_hu_a76d14b08e58fff.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Scheduler. A meeting bar slides between rooms along the vertical line (the magenta frame) built by between&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Scheduler. A meeting bar slides between rooms along the vertical line (the magenta frame) built by between&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 2 B (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;Figure 4 sorts the operators into three kinds.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Kind&lt;/th&gt;
          &lt;th&gt;Operators&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Primitives (basic behaviors)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;state&lt;/code&gt;, &lt;code&gt;d.vary&lt;/code&gt;, &lt;code&gt;d.dropTarget&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Combinators (combining)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;d.closest&lt;/code&gt;, &lt;code&gt;d.between&lt;/code&gt;, &lt;code&gt;spec.whenFar&lt;/code&gt;, &lt;code&gt;d.switchToStateAndFollow&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modifiers (layering features)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;withFloating&lt;/code&gt;, &lt;code&gt;withSnapRadius&lt;/code&gt;, &lt;code&gt;onDrop&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;trees-of-expressions-and-maps-between-trees-grabbing-an-abstraction-and-moving-it&#34;&gt;Trees of Expressions and Maps Between Trees: Grabbing an Abstraction and Moving It
&lt;/h2&gt;&lt;p&gt;The demos in §6 widen the combinations. Animate Algebra rewrites an expression shaped like a tree by dragging, following the commutative and associative laws. For each rewrite it builds a track &lt;code&gt;d.between([state, newState_i])&lt;/code&gt;, and gathers them with &lt;code&gt;d.closest&lt;/code&gt;.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks.png&#34; width=&#34;944&#34; height=&#34;701&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks_hu_1366d975667ae180.png 480w, https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks_hu_d1a79eeaedea3c10.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Animate Algebra. Moving a node up rearranges the expression by the commutative law; moving it left, by the associative law&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Animate Algebra. Moving a node up rearranges the expression by the commutative law; moving it left, by the associative law&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 2 E (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;Twisted Trees is an order-preserving map from one tree to another. It puts all the candidate states into a single &lt;code&gt;between&lt;/code&gt;, so you can move freely inside the convex hull. While you move, gray circles stretch and shrink little by little, showing in advance what would enter or leave if you kept going. The paper calls this feedforward.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward.png&#34; width=&#34;891&#34; height=&#34;578&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward_hu_f1495f3d0e42f7fe.png 480w, https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward_hu_f37dd873ec5e4e6c.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Twisted Trees. While a black node is being moved, the gray circles stretch and shrink&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Twisted Trees. While a black node is being moved, the gray circles stretch and shrink&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 2 F (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;After the paper, the project page added Permutation lab, which shows a permutation in several representations at once. The page says Horowitz is working on new math explorables.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;interacting with any one representation fluidly updates the others, even halfway through a drag&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In short: the other representations update even in the middle of a drag. You can see this in the video on the &lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;project page&lt;/a&gt;, and the paper&amp;rsquo;s examples in the &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=l7v-UwpsEbk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;five-minute introduction video&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab.png&#34; width=&#34;1200&#34; height=&#34;674&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab_hu_46a53d2d5fadf9e6.png 480w, https://visualizing.jp/declarative-dragging/images/permutation-lab_hu_8fcdcd5cbbe354fc.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Permutation lab. Two-line notation, permutation matrix, cycle diagram, wiring diagram, and permutohedron side by side&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Permutation lab. Two-line notation, permutation matrix, cycle diagram, wiring diagram, and permutohedron side by side&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / Declarative Dragging project page, poster image of the video in &amp;ldquo;Since the paper&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;where-13-developers-were-surprised-and-where-they-stumbled&#34;&gt;Where 13 Developers Were Surprised and Where They Stumbled
&lt;/h2&gt;&lt;p&gt;The core of the evaluation is interviews with 13 people who had experience building drag and drop (§7–8). Game developers, data visualization researchers, educators, and others worked through six examples in order, in sessions of 90 to 120 minutes each, and in four of them the participants tried to implement the drag themselves.&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples.png&#34; width=&#34;1023&#34; height=&#34;677&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples_hu_ddb91b7d7eb62acd.png 480w, https://visualizing.jp/declarative-dragging/images/study-six-examples_hu_6d8061ac42f78d47.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;The six examples used in the study: Switch, Three-Way Switch, Reorderable List, Slider, Rotary Dial, Timeline&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;Fig. &#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;The six examples used in the study: Switch, Three-Way Switch, Reorderable List, Slider, Rotary Dial, Timeline&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Source: Horowitz, Blinn, Heer / paper &amp;ldquo;Declarative Dragging,&amp;rdquo; Figure 7 (CC BY 4.0 per Crossref)&lt;/p&gt;
&lt;p&gt;Participants were surprised by how short the code was and by the automatic interpolation of colors and positions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once the states (the what) is defined, playing around with how the drag interaction could be in between was much less of a stressful concern…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is P10&amp;rsquo;s remark: once the states are decided, there is no worry that tinkering with the in-between motion will break the result.&lt;/p&gt;
&lt;p&gt;The stumbling concentrated on the reorderable-list task. The paper writes &amp;ldquo;a sharp cliff&amp;rdquo; and titles a subsection of §8.3 &amp;ldquo;Enumerating states isn&amp;rsquo;t very declarative.&amp;rdquo; P09 said they were used to thinking about a single transition, but not used to thinking about all N states a drag could produce at once.&lt;/p&gt;
&lt;p&gt;There is also a preliminary comparison with LLM coding agents (Appendix C). The same specification was implemented five times each by seven means; Dragology fully satisfied it in 4 of 5 runs, and the others in 0 to 2. Only the Dragology condition was given an AGENTS.md prepared by the authors, and they acknowledge the risk of &amp;ldquo;overfit.&amp;rdquo; They also state that this does not replace evaluation by people.&lt;/p&gt;
&lt;p&gt;The limitations are in §9. The focus is on drags where the element stays where it is dropped (repositional); gestures that draw a shape, for example, are hard or impossible to write. Multi-touch is not supported either. The effort of listing states is called &amp;ldquo;perhaps the biggest conceptual hurdle to adoption.&amp;rdquo; The computational cost grows with the number of states, and at 512 states the initialization at drag start exceeded 1500 ms. The paper also lists bias in the participants as a limitation.&lt;/p&gt;
&lt;h2 id=&#34;how-did-third-parties-see-this-work&#34;&gt;How Did Third Parties See This Work?
&lt;/h2&gt;&lt;p&gt;As of November 4, 2026, almost no independent third-party evaluation can be found. The 13 participants&amp;rsquo; remarks were collected and selected by the authors, so they are not included here.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Kind&lt;/th&gt;
          &lt;th&gt;Content&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Award selection&lt;/td&gt;
          &lt;td&gt;UIST 2026 Best Paper (6 papers). The criteria are &amp;ldquo;originality, research rigor, supporting evidence, clarity, and potential impact.&amp;rdquo; Individual reviews are not public&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PR in a third-party repository (title only checked)&lt;/td&gt;
          &lt;td&gt;Spencer Chang&amp;rsquo;s playhtml has a PR titled &amp;ldquo;website: declarative dragging prototype and examples&amp;rdquo; (#678). The body is unchecked&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Discussion&lt;/td&gt;
          &lt;td&gt;The Hacker News post (2026-11-04) had 0 comments at the time of research&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No independent blog posts, talks, or social media commentary were found.&lt;/p&gt;
&lt;h2 id=&#34;uses&#34;&gt;Uses
&lt;/h2&gt;&lt;p&gt;For visualization work, what can be taken home is the idea that &lt;strong&gt;if you have a render function, the interaction can be built by calling that function many times&lt;/strong&gt;, as I read it. If you already draw SVG from data with D3 or React, what you add may be just a list of states.&lt;/p&gt;
&lt;p&gt;Compared with Vega-Lite, the difference in what is declared becomes visible, as I read it. A Vega-Lite selection mainly connects the result of an interaction to filtering data or to encodings. Declarative Dragging lets you grab a mark directly and switch the very state the chart represents. In the Vega and Vega-Lite references the paper cites, Heer is an author of both.&lt;/p&gt;
&lt;p&gt;A screen like Permutation lab can be read as close to linked views.&lt;/p&gt;
&lt;p&gt;On the other hand, the effort of listing states remains. For operations where combinations multiply, such as reordering, you need to estimate the number of states and the computational cost first, I think. The paper&amp;rsquo;s §8.5 sums up that separating the what from the how reduces the risk of trial and error. Fix the render function and the state design first, then compare the in-between motion by swapping operators. That order is, as I read it, how to use it.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Primary sources&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joshua Horowitz, Andrew Blinn, Jeffrey Heer, &amp;ldquo;Declarative Dragging,&amp;rdquo; &lt;em&gt;Proceedings of the 39th Annual ACM Symposium on User Interface Software and Technology (UIST &amp;lsquo;26)&lt;/em&gt;, 2026, pp. 1–16. &lt;a class=&#34;link&#34; href=&#34;https://doi.org/10.1145/3830398.3830556&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;doi:10.1145/3830398.3830556&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Paper PDF (authors&amp;rsquo; version). &lt;a class=&#34;link&#34; href=&#34;https://andrewblinn.com/papers/D2.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;andrewblinn.com/papers/D2.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Crossref metadata (including license information). &lt;a class=&#34;link&#34; href=&#34;https://api.crossref.org/works/10.1145/3830398.3830556&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;api.crossref.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Declarative Dragging project page. &lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;declarative-dragging.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Interactive supplementary material. &lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/uist26/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;declarative-dragging.github.io/uist26&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Declarative Dragging - UIST 2026 Submission Video&amp;rdquo;. &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=l7v-UwpsEbk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology (GitHub). &lt;a class=&#34;link&#34; href=&#34;https://github.com/declarative-dragging/dragology&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github.com/declarative-dragging/dragology&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/declarative-dragging/dragology/main/LICENSE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LICENSE&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/declarative-dragging/dragology/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology (npm). &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/dragology&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;npmjs.com/package/dragology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology demo gallery. &lt;a class=&#34;link&#34; href=&#34;https://joshuahhh.com/dragology/#/demos&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;joshuahhh.com/dragology/#/demos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UIST 2026 (dates and venue). &lt;a class=&#34;link&#34; href=&#34;https://uist.acm.org/2026/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uist.acm.org/2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Secondary sources&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UIST 2026 Awards. &lt;a class=&#34;link&#34; href=&#34;https://uist.acm.org/2026/awards/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uist.acm.org/2026/awards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;spencerc99/playhtml, PR #678 &amp;ldquo;website: declarative dragging prototype and examples&amp;rdquo; (body unchecked). &lt;a class=&#34;link&#34; href=&#34;https://github.com/spencerc99/playhtml/pull/678&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hacker News post (0 comments at the time of research). &lt;a class=&#34;link&#34; href=&#34;https://news.ycombinator.com/item?id=50361586&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;news.ycombinator.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
        
    </channel>
</rss>
