nodality 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.md +111 -130
  2. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  3. package/dist/animator.esm.js.LICENSE.txt +1 -1
  4. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  5. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  6. package/dist/base.cjs.js.LICENSE.txt +1 -1
  7. package/dist/base.esm.js.LICENSE.txt +1 -1
  8. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  9. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  10. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  11. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  12. package/dist/bundle.umd.js +1 -1
  13. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  14. package/dist/button.cjs.js.LICENSE.txt +1 -1
  15. package/dist/button.esm.js.LICENSE.txt +1 -1
  16. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  17. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  18. package/dist/center.cjs.js.LICENSE.txt +1 -1
  19. package/dist/center.esm.js.LICENSE.txt +1 -1
  20. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  21. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  22. package/dist/code.cjs.js.LICENSE.txt +1 -1
  23. package/dist/code.esm.js.LICENSE.txt +1 -1
  24. package/dist/container.cjs.js.LICENSE.txt +1 -1
  25. package/dist/container.esm.js.LICENSE.txt +1 -1
  26. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  27. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  28. package/dist/designer.cjs.js +1 -1
  29. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  30. package/dist/designer.esm.js +1 -1
  31. package/dist/designer.esm.js.LICENSE.txt +1 -1
  32. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  33. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  34. package/dist/finalresult.esm.js +1 -1
  35. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  36. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  37. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  38. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  39. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  40. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  41. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  42. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  43. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  44. package/dist/free.cjs.js.LICENSE.txt +1 -1
  45. package/dist/free.esm.js.LICENSE.txt +1 -1
  46. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  47. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  48. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  49. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  50. package/dist/image.cjs.js.LICENSE.txt +1 -1
  51. package/dist/image.esm.js.LICENSE.txt +1 -1
  52. package/dist/index.cjs.js +1 -1
  53. package/dist/index.cjs.js.LICENSE.txt +1 -1
  54. package/dist/index.d.ts +1 -1
  55. package/dist/index.esm.js +1 -1
  56. package/dist/index.esm.js.LICENSE.txt +1 -1
  57. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  58. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  59. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  60. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  61. package/dist/link.cjs.js.LICENSE.txt +1 -1
  62. package/dist/link.esm.js.LICENSE.txt +1 -1
  63. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  64. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  65. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  66. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  67. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  68. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  69. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  70. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  71. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  72. package/dist/picker.esm.js.LICENSE.txt +1 -1
  73. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  74. package/dist/progress.esm.js.LICENSE.txt +1 -1
  75. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  76. package/dist/radio.esm.js.LICENSE.txt +1 -1
  77. package/dist/range.cjs.js.LICENSE.txt +1 -1
  78. package/dist/range.esm.js.LICENSE.txt +1 -1
  79. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  80. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  81. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  82. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  83. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  84. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  85. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  86. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  87. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  88. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  89. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  90. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  91. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  92. package/dist/stack.esm.js.LICENSE.txt +1 -1
  93. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  94. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  95. package/dist/table.cjs.js.LICENSE.txt +1 -1
  96. package/dist/table.esm.js.LICENSE.txt +1 -1
  97. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  98. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  99. package/dist/text.cjs.js.LICENSE.txt +1 -1
  100. package/dist/text.esm.js.LICENSE.txt +1 -1
  101. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  102. package/dist/theme.esm.js.LICENSE.txt +1 -1
  103. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  104. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  105. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  106. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  107. package/dist/video.cjs.js.LICENSE.txt +1 -1
  108. package/dist/video.esm.js.LICENSE.txt +1 -1
  109. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  110. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  111. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  112. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  113. package/layout/animator.js +1 -1
  114. package/layout/audio.js +1 -1
  115. package/layout/audionew.js +1 -1
  116. package/layout/base.js +1 -1
  117. package/layout/beta-desktop-bar.js +1 -1
  118. package/layout/beta-mobile-bar.js +1 -1
  119. package/layout/button.js +1 -1
  120. package/layout/center.js +1 -1
  121. package/layout/checkbox.js +1 -1
  122. package/layout/circle.js +1 -1
  123. package/layout/code.js +1 -1
  124. package/layout/container.js +1 -1
  125. package/layout/dropdown-2025.js +1 -1
  126. package/layout/flex-card.js +1 -1
  127. package/layout/flex-grid.js +1 -1
  128. package/layout/flex-row.js +1 -1
  129. package/layout/form-components/custom.js +1 -1
  130. package/layout/form-components/data-list.js +1 -1
  131. package/layout/form-components/floating-input.js +1 -1
  132. package/layout/form-components/form-all.js +1 -1
  133. package/layout/form-components/form.js +1 -1
  134. package/layout/form-components/image-picker.js +1 -1
  135. package/layout/form-components/picker.js +1 -1
  136. package/layout/form-components/radio.js +1 -1
  137. package/layout/form-components/radiogroup.js +1 -1
  138. package/layout/form-components/range.js +1 -1
  139. package/layout/free.js +1 -1
  140. package/layout/grid-switcher.js +1 -1
  141. package/layout/grid.js +1 -1
  142. package/layout/horizontal-scroller.js +1 -1
  143. package/layout/image.js +1 -1
  144. package/layout/index.js +1 -1
  145. package/layout/link.js +1 -1
  146. package/layout/list.js +1 -1
  147. package/layout/meta-adder.js +1 -1
  148. package/layout/modal-2025.js +1 -1
  149. package/layout/morph.js +1 -1
  150. package/layout/multiswitcher.js +1 -1
  151. package/layout/nav-bar.js +1 -1
  152. package/layout/nav-factor/custom-div.js +1 -1
  153. package/layout/new-nav-bar.js +1 -1
  154. package/layout/polygon.js +1 -1
  155. package/layout/prerender-site.js +1 -1
  156. package/layout/prerender.js +1 -1
  157. package/layout/progress.js +1 -1
  158. package/layout/row.js +1 -1
  159. package/layout/scroll-video.js +1 -1
  160. package/layout/side-bar.js +1 -1
  161. package/layout/side-nav-bar.js +1 -1
  162. package/layout/simple-bar.js +1 -1
  163. package/layout/slider-2025.js +1 -1
  164. package/layout/spacer.js +1 -1
  165. package/layout/stack.js +1 -1
  166. package/layout/svg.js +1 -1
  167. package/layout/switcher.js +1 -1
  168. package/layout/table.js +1 -1
  169. package/layout/text-field.js +1 -1
  170. package/layout/text.js +1 -1
  171. package/layout/ulist.js +1 -1
  172. package/layout/video.js +1 -1
  173. package/layout/wrap.js +1 -1
  174. package/layout/zoom-card.js +1 -1
  175. package/lib/agent-surface.js +1 -1
  176. package/lib/card-getter.js +1 -1
  177. package/lib/codegen.js +1 -1
  178. package/lib/data.js +1 -1
  179. package/lib/designer.js +1 -1
  180. package/lib/element-mapper.js +1 -1
  181. package/lib/keyframe-animation.js +1 -1
  182. package/lib/link-getter.js +1 -1
  183. package/lib/morph-node.js +9 -4
  184. package/lib/raster-inspect.js +1 -1
  185. package/lib/raster-ops.js +1 -1
  186. package/lib/raster-presets.js +1 -1
  187. package/lib/scroll-video.js +1 -1
  188. package/lib/seo.js +1 -1
  189. package/lib/stacker.js +1 -1
  190. package/lib/suggest.js +1 -1
  191. package/lib/theme.js +1 -1
  192. package/lib/transform-anim.js +1 -1
  193. package/lib/transition.js +1 -1
  194. package/lib/validate-nodes.js +1 -1
  195. package/lib/webmcp-adapter.js +1 -1
  196. package/package.json +1 -1
package/README.md CHANGED
@@ -1,183 +1,164 @@
1
- # Nodality
1
+ <h1 align="center">Nodality</h1>
2
2
 
3
- This library works with elements represented as an array of HTML entities, and nodes that control the behavior of elements.
4
- *Elements* is an array of objects. This array produces the code of elements you can use in your website.
5
- *Nodes* is another array containing nodes that change the look and behavior of the generated elements.
3
+ <p align="center">
4
+ <strong>A user interface is two arrays: what exists, and what is done to it.</strong><br>
5
+ Both are plain data so the pipeline that builds your page is inspectable,
6
+ diffable, and executable at build time <em>and</em> in the browser.
7
+ </p>
6
8
 
7
-
8
-
9
- ## Installation
10
-
11
- The easiest way to get up and running is to use **npm**:
12
-
13
- ```bash
14
- npm create nodality@latest my-app
15
- ```
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/nodality"><img alt="npm" src="https://img.shields.io/npm/v/nodality?color=0f53a8"></a>
11
+ <img alt="dependencies" src="https://img.shields.io/badge/dependencies-0-0f53a8">
12
+ <a href="https://github.com/nodalityjs/nodality/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/npm/l/nodality?color=0f53a8"></a>
13
+ <a href="https://nodalityjs.github.io/"><img alt="docs" src="https://img.shields.io/badge/docs-nodalityjs.github.io-0f53a8"></a>
14
+ </p>
16
15
 
17
16
  ---
18
17
 
19
- ## Tutorial
20
- ## Step 1
18
+ ## A whole navigation graph is one node
21
19
 
22
- Define an array of elements you want to display in your user interface:
20
+ <p align="center">
21
+ <img src="https://raw.githubusercontent.com/nodalityjs/nodality/main/media/nodality-chain.gif"
22
+ alt="Three views transitioning into one another, each hop running a different shader effect" width="640">
23
+ </p>
23
24
 
24
25
  ```js
25
- let elements = [
26
- {
27
- type: "h1",
28
- text: "Hello"
29
- }
30
- ];
26
+ { op: "morph", effect: "t-vhs", duration: 620, back: true,
27
+ chain: [
28
+ { from: "home", to: { Work: "work", Contact: "contact" } },
29
+ { from: "work", to: { Aurora: "aurora" }, effect: "t-split" },
30
+ { from: "aurora", to: { Contact: "contact" }, effect: "t-bloom" },
31
+ ] }
31
32
  ```
32
33
 
33
- ---
34
+ That is the entire source of the transitions above. The entries are
35
+ **edges, not keyframes** — edge two is reachable *from* the state edge one
36
+ lands on, so a landed view becomes a source in its turn. Settings on the
37
+ node are defaults each edge may override, and `back` unwinds the path the
38
+ user actually took rather than looking up an edge.
34
39
 
35
- ## Step 2
40
+ ## Effects run on live DOM, and the DOM stays clickable
36
41
 
37
- Define an array of nodes that will adjust the behaviour of the element.
38
- This particular node will add the **stroked text** effect:
42
+ <p align="center">
43
+ <img src="https://raw.githubusercontent.com/nodalityjs/nodality/main/media/nodality-effect.gif"
44
+ alt="A warp effect following the pointer across a bar of links, then a link being clicked through it" width="640">
45
+ </p>
39
46
 
40
47
  ```js
41
- let nodes = [
42
- {
43
- op: "blast"
44
- }
48
+ const nodes = [
49
+ { op: "flow", target: ["bar"], by: "mouse", amount: 0.32 },
50
+ { op: "dither", target: ["bar"], levels: 10, size: 2, amount: 0.14 },
45
51
  ];
46
52
  ```
47
53
 
48
- ---
49
-
50
- ## Step 3
54
+ Two raster nodes aimed at one element compose into a **single** shader
55
+ pass, in array order. The source is your live DOM, not an image you
56
+ exported and the links underneath still work: pointer input is inverted
57
+ through the compiled transformation and re-dispatched, so a click lands
58
+ where the user aimed rather than where the layout still thinks the link
59
+ is. In the recording above, the pointer drives the warp and then clicks
60
+ *through* it; the view that follows is the morph firing.
51
61
 
52
- Add the `nodes` array using the `.nodes()` modifier, and use the `.set()` method to mount the result of the code to the website.
53
- Use the `code: true` option to also display the source code of the elements:
62
+ ## Install
54
63
 
55
- ```js
56
- new Des()
57
- .nodes(nodes)
58
- .add(elements)
59
- .set({
60
- mount: "#mount",
61
- code: true
62
- });
64
+ ```bash
65
+ npm create nodality@latest my-app
63
66
  ```
64
67
 
65
- Also define a `<div>` with `id="#mount"` that will serve as a root element to render the UI.
66
-
67
- ---
68
-
69
- ## Everything Together
70
-
71
- Here is the complete working code which uses CDN for convenient testing.
68
+ Or drop it into a page no build step, no dependencies:
72
69
 
73
70
  ```html
74
-
75
- <!-- div for mounting the result -->
76
- <div id="#mount"></div>
71
+ <div id="mount"></div>
77
72
 
78
73
  <script type="module">
79
- import {Des} from "https://www.unpkg.com/nodality@1.1.10/dist/index.esm.js";
80
-
81
- let elements = [
82
- {
83
- type: "h1",
84
- text: "Hello"
85
- }
86
- ];
74
+ import { Des } from "https://unpkg.com/nodality/dist/index.esm.js";
87
75
 
88
- let nodes = [
89
- {
90
- op: "blast"
91
- }
76
+ const elements = [
77
+ { id: "hero", type: "h1", text: "Hello" },
92
78
  ];
93
79
 
94
- new Des()
95
- .nodes(nodes)
96
- .add(elements)
97
- .set({
98
- mount: "#mount",
99
- code: true
100
- });
101
- </script>
102
- ```
103
-
104
- ---
105
-
106
- ## Result
107
- <img src="https://nodalityjs.github.io/assets/images/image-2601c982f747c8e3977a2d588f61e040.png">
108
-
109
- After running this code:
110
-
111
- - You will see an `<h1>` element on the screen.
112
- - When the user resizes the window and hits the **400–600px** breakpoint, a **stroke effect** will appear on the text, thanks to the `blast` modifier.
113
- - The **resulting code** of the UI will also be displayed below the rendered element.
114
-
115
- ---
116
-
117
- ## Effects on live elements
118
-
119
- Nodes are not limited to design changes. A raster node compiles to a GPU
120
- shader pass over the element it targets, and several nodes aimed at one
121
- element compose into a **single** pass, in array order:
122
-
123
- ```js
124
80
  const nodes = [
81
+ { op: { name: "gradient" }, target: ["hero"], colors: ["#1d6fe0", "#7fd1ff"] },
125
82
  { op: "dither", target: ["hero"], levels: 6, size: 2 },
126
- { op: "flow", target: ["hero"], by: "mouse" },
127
83
  ];
84
+
85
+ new Des().nodes(nodes).add(elements).set({ mount: "#mount" });
86
+ </script>
128
87
  ```
129
88
 
130
- The source is your live DOM, not an image you exported. Two capture
131
- backends sit underneath: a snapshot path that works in any WebGL browser,
132
- and an HTML-in-Canvas path that samples the running element directly
133
- where the browser supports it. The choice is automatic — if the newer API
134
- is absent the pipeline falls back rather than failing.
89
+ `elements` says what exists. `nodes` says what is done to it. Nothing in
90
+ `elements` names an effect and nothing in `nodes` names a component — the
91
+ two meet only through `target`, so either can be written, stored or
92
+ generated without the other.
135
93
 
136
- Effects do not cost you interaction. Pointer input is resolved through
137
- the inverse of the compiled transformation and re-dispatched, so links
138
- and buttons under an effect still work — including where the content is
139
- hosted inside the canvas and the browser's own hit testing cannot reach
140
- it.
94
+ ## What else it does
141
95
 
142
- ## Transitions as data
96
+ **Static site generation.** The same pair is interpreted at build time in
97
+ a simulated DOM, so `npx nodality prerender` emits crawlable HTML that a
98
+ consumer running no JavaScript can read, plus a sitemap, `hreflang`
99
+ alternates and JSON-LD. The browser then re-reads the same pair and
100
+ rebuilds on top — the pair is shipped, not consumed.
101
+ [Docs →](https://nodalityjs.github.io/docs/ssg/prerender/)
143
102
 
144
- A `morph` node says which element becomes which, and on what interaction.
145
- There is no timeline to drive and no capture to manage:
103
+ **Transitions and navigation graphs.** `{ op: "morph" }` in one hop or a
104
+ whole chain, with per-edge effects, history-based `back`, and two capture
105
+ backends chosen automatically.
106
+ [Docs →](https://nodalityjs.github.io/docs/raster/morph/)
146
107
 
147
- ```js
148
- const nodes = [
149
- { op: "morph", from: "topnav",
150
- to: { About: "about", Services: "offer", Contact: "contact" },
151
- effect: "t-vhs", duration: 900, back: true },
152
- ];
153
- ```
108
+ **Composable GPU effects.** Fifteen first-party raster ops, driveable by
109
+ pointer, scroll or time, composed into one pass.
110
+ [Docs →](https://nodalityjs.github.io/docs/raster/ops/)
154
111
 
155
- `from` and `to` name ids in your elements array; `back: true` wires the
156
- destination's own button to return. Mapping is by link label rather than
157
- position, because a responsive nav renders a different set of links per
158
- breakpoint.
112
+ **An agent-operable surface, derived.** One node exposes your page to an
113
+ AI agent as callable tools traversing views, submitting a form you
114
+ allowed, reading what is on screen derived from the graph you already
115
+ wrote rather than authored a second time, and also written into the
116
+ prerendered HTML as a static manifest.
117
+ [Docs →](https://nodalityjs.github.io/docs/raster/agent-surface/)
159
118
 
160
119
  ## For AI agents
161
120
 
162
- `nodality mcp` runs a Model Context Protocol server over stdio, so an
163
- agent can write interfaces against the real vocabulary instead of
164
- guessing at it:
121
+ `nodality mcp` runs a Model Context Protocol server over stdio, so a
122
+ generator writes against the real vocabulary instead of guessing at it:
165
123
 
166
124
  ```json
167
125
  { "mcpServers": { "nodality": { "command": "npx", "args": ["nodality", "mcp"] } } }
168
126
  ```
169
127
 
170
- Three tools: `list_ops` returns the op registry as data — every op with
171
- its stage, parameters, units, defaults; `validate_nodes` checks a node
128
+ Three tools. `list_ops` returns the op registry as data — every op with
129
+ its stage, parameters, units and defaults. `validate_nodes` checks a node
172
130
  array and returns a machine-readable report with did-you-mean
173
131
  suggestions, so `{ op: "dithr" }` comes back as `UNKNOWN_OP` suggesting
174
- `dither` rather than rendering nothing at all; `preview` renders an
175
- `(E, N)` pair to a self-contained HTML file. `preview` needs `jsdom` in
176
- your project (`npm i -D jsdom`) — it is required only for prerendering,
177
- so the library does not bundle it.
132
+ `dither` rather than rendering nothing at all. `preview` renders an
133
+ `(E, N)` pair to a self-contained HTML file (needs `jsdom` in your
134
+ project; it is required only for prerendering, so the library does not
135
+ bundle it).
178
136
 
179
- The same validator is available directly:
137
+ The validator is available directly too:
180
138
 
181
139
  ```js
182
140
  import { validateNodes, describeOps } from "nodality/validate";
183
141
  ```
142
+
143
+ ## What this is not
144
+
145
+ Nodality targets **static, content-shaped sites** — marketing pages,
146
+ storefronts, documentation, brochure sites. It is not a replacement for a
147
+ component framework with client-side state management, and it does not
148
+ try to be one.
149
+
150
+ Two honest caveats. The HTML-in-Canvas capture backend is **experimental
151
+ and flag-gated**: where it is unavailable the pipeline falls back to
152
+ snapshot capture on its own, so a page authored against it degrades to
153
+ stills rather than breaking. And determinism is a property of the
154
+ compiled artefact — the same pair always produces the same output — not
155
+ of the pixels a particular GPU eventually paints.
156
+
157
+ ## Links
158
+
159
+ - **Docs** — [nodalityjs.github.io](https://nodalityjs.github.io/)
160
+ - **Live demos** — [a navigation graph](http://www.gesos.cz/chain-demo.html) · [a morph in production](http://www.gesos.cz/morph.html)
161
+ - **Built with it** — [blue70.cz](https://www.blue70.cz) · [sls3.cz](https://www.sls3.cz) · [gesos.cz](http://www.gesos.cz) · [relays.app](https://relays.app)
162
+ - **Releases** — [changelog and release notes](https://github.com/nodalityjs/nodality/releases)
163
+
164
+ MIT © Filip Vabroušek
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.2.0
2
+ * nodality v1.2.1
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */