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.
- package/README.md +111 -130
- package/dist/animator.cjs.js.LICENSE.txt +1 -1
- package/dist/animator.esm.js.LICENSE.txt +1 -1
- package/dist/audionew.cjs.js.LICENSE.txt +1 -1
- package/dist/audionew.esm.js.LICENSE.txt +1 -1
- package/dist/base.cjs.js.LICENSE.txt +1 -1
- package/dist/base.esm.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
- package/dist/bundle.umd.js +1 -1
- package/dist/bundle.umd.js.LICENSE.txt +1 -1
- package/dist/button.cjs.js.LICENSE.txt +1 -1
- package/dist/button.esm.js.LICENSE.txt +1 -1
- package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/card-getter.esm.js.LICENSE.txt +1 -1
- package/dist/center.cjs.js.LICENSE.txt +1 -1
- package/dist/center.esm.js.LICENSE.txt +1 -1
- package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
- package/dist/checkbox.esm.js.LICENSE.txt +1 -1
- package/dist/code.cjs.js.LICENSE.txt +1 -1
- package/dist/code.esm.js.LICENSE.txt +1 -1
- package/dist/container.cjs.js.LICENSE.txt +1 -1
- package/dist/container.esm.js.LICENSE.txt +1 -1
- package/dist/data-list.cjs.js.LICENSE.txt +1 -1
- package/dist/data-list.esm.js.LICENSE.txt +1 -1
- package/dist/designer.cjs.js +1 -1
- package/dist/designer.cjs.js.LICENSE.txt +1 -1
- package/dist/designer.esm.js +1 -1
- package/dist/designer.esm.js.LICENSE.txt +1 -1
- package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
- package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
- package/dist/finalresult.esm.js +1 -1
- package/dist/finalresult.esm.js.LICENSE.txt +1 -1
- package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-card.esm.js.LICENSE.txt +1 -1
- package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
- package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
- package/dist/flex-row.esm.js.LICENSE.txt +1 -1
- package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
- package/dist/floating-input.esm.js.LICENSE.txt +1 -1
- package/dist/free.cjs.js.LICENSE.txt +1 -1
- package/dist/free.esm.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
- package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
- package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
- package/dist/image-picker.esm.js.LICENSE.txt +1 -1
- package/dist/image.cjs.js.LICENSE.txt +1 -1
- package/dist/image.esm.js.LICENSE.txt +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.LICENSE.txt +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
- package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
- package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
- package/dist/link-getter.esm.js.LICENSE.txt +1 -1
- package/dist/link.cjs.js.LICENSE.txt +1 -1
- package/dist/link.esm.js.LICENSE.txt +1 -1
- package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
- package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
- package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
- package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/picker.cjs.js.LICENSE.txt +1 -1
- package/dist/picker.esm.js.LICENSE.txt +1 -1
- package/dist/progress.cjs.js.LICENSE.txt +1 -1
- package/dist/progress.esm.js.LICENSE.txt +1 -1
- package/dist/radio.cjs.js.LICENSE.txt +1 -1
- package/dist/radio.esm.js.LICENSE.txt +1 -1
- package/dist/range.cjs.js.LICENSE.txt +1 -1
- package/dist/range.esm.js.LICENSE.txt +1 -1
- package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
- package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
- package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-bar.esm.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
- package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
- package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
- package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
- package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
- package/dist/spacer.cjs.js.LICENSE.txt +1 -1
- package/dist/spacer.esm.js.LICENSE.txt +1 -1
- package/dist/stack.cjs.js.LICENSE.txt +1 -1
- package/dist/stack.esm.js.LICENSE.txt +1 -1
- package/dist/stacker.cjs.js.LICENSE.txt +1 -1
- package/dist/stacker.esm.js.LICENSE.txt +1 -1
- package/dist/table.cjs.js.LICENSE.txt +1 -1
- package/dist/table.esm.js.LICENSE.txt +1 -1
- package/dist/text-field.cjs.js.LICENSE.txt +1 -1
- package/dist/text-field.esm.js.LICENSE.txt +1 -1
- package/dist/text.cjs.js.LICENSE.txt +1 -1
- package/dist/text.esm.js.LICENSE.txt +1 -1
- package/dist/theme.cjs.js.LICENSE.txt +1 -1
- package/dist/theme.esm.js.LICENSE.txt +1 -1
- package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
- package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
- package/dist/ulist.cjs.js.LICENSE.txt +1 -1
- package/dist/ulist.esm.js.LICENSE.txt +1 -1
- package/dist/video.cjs.js.LICENSE.txt +1 -1
- package/dist/video.esm.js.LICENSE.txt +1 -1
- package/dist/wrap.cjs.js.LICENSE.txt +1 -1
- package/dist/wrap.esm.js.LICENSE.txt +1 -1
- package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
- package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
- package/layout/animator.js +1 -1
- package/layout/audio.js +1 -1
- package/layout/audionew.js +1 -1
- package/layout/base.js +1 -1
- package/layout/beta-desktop-bar.js +1 -1
- package/layout/beta-mobile-bar.js +1 -1
- package/layout/button.js +1 -1
- package/layout/center.js +1 -1
- package/layout/checkbox.js +1 -1
- package/layout/circle.js +1 -1
- package/layout/code.js +1 -1
- package/layout/container.js +1 -1
- package/layout/dropdown-2025.js +1 -1
- package/layout/flex-card.js +1 -1
- package/layout/flex-grid.js +1 -1
- package/layout/flex-row.js +1 -1
- package/layout/form-components/custom.js +1 -1
- package/layout/form-components/data-list.js +1 -1
- package/layout/form-components/floating-input.js +1 -1
- package/layout/form-components/form-all.js +1 -1
- package/layout/form-components/form.js +1 -1
- package/layout/form-components/image-picker.js +1 -1
- package/layout/form-components/picker.js +1 -1
- package/layout/form-components/radio.js +1 -1
- package/layout/form-components/radiogroup.js +1 -1
- package/layout/form-components/range.js +1 -1
- package/layout/free.js +1 -1
- package/layout/grid-switcher.js +1 -1
- package/layout/grid.js +1 -1
- package/layout/horizontal-scroller.js +1 -1
- package/layout/image.js +1 -1
- package/layout/index.js +1 -1
- package/layout/link.js +1 -1
- package/layout/list.js +1 -1
- package/layout/meta-adder.js +1 -1
- package/layout/modal-2025.js +1 -1
- package/layout/morph.js +1 -1
- package/layout/multiswitcher.js +1 -1
- package/layout/nav-bar.js +1 -1
- package/layout/nav-factor/custom-div.js +1 -1
- package/layout/new-nav-bar.js +1 -1
- package/layout/polygon.js +1 -1
- package/layout/prerender-site.js +1 -1
- package/layout/prerender.js +1 -1
- package/layout/progress.js +1 -1
- package/layout/row.js +1 -1
- package/layout/scroll-video.js +1 -1
- package/layout/side-bar.js +1 -1
- package/layout/side-nav-bar.js +1 -1
- package/layout/simple-bar.js +1 -1
- package/layout/slider-2025.js +1 -1
- package/layout/spacer.js +1 -1
- package/layout/stack.js +1 -1
- package/layout/svg.js +1 -1
- package/layout/switcher.js +1 -1
- package/layout/table.js +1 -1
- package/layout/text-field.js +1 -1
- package/layout/text.js +1 -1
- package/layout/ulist.js +1 -1
- package/layout/video.js +1 -1
- package/layout/wrap.js +1 -1
- package/layout/zoom-card.js +1 -1
- package/lib/agent-surface.js +1 -1
- package/lib/card-getter.js +1 -1
- package/lib/codegen.js +1 -1
- package/lib/data.js +1 -1
- package/lib/designer.js +1 -1
- package/lib/element-mapper.js +1 -1
- package/lib/keyframe-animation.js +1 -1
- package/lib/link-getter.js +1 -1
- package/lib/morph-node.js +9 -4
- package/lib/raster-inspect.js +1 -1
- package/lib/raster-ops.js +1 -1
- package/lib/raster-presets.js +1 -1
- package/lib/scroll-video.js +1 -1
- package/lib/seo.js +1 -1
- package/lib/stacker.js +1 -1
- package/lib/suggest.js +1 -1
- package/lib/theme.js +1 -1
- package/lib/transform-anim.js +1 -1
- package/lib/transition.js +1 -1
- package/lib/validate-nodes.js +1 -1
- package/lib/webmcp-adapter.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,183 +1,164 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align="center">Nodality</h1>
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
##
|
|
20
|
-
## Step 1
|
|
18
|
+
## A whole navigation graph is one node
|
|
21
19
|
|
|
22
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
##
|
|
40
|
+
## Effects run on live DOM, and the DOM stays clickable
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
42
|
-
{
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
53
|
-
Use the `code: true` option to also display the source code of the elements:
|
|
62
|
+
## Install
|
|
54
63
|
|
|
55
|
-
```
|
|
56
|
-
|
|
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
|
-
|
|
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://
|
|
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
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
163
|
-
|
|
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
|
|
171
|
-
its stage, parameters, units
|
|
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
|
|
175
|
-
`(E, N)` pair to a self-contained HTML file
|
|
176
|
-
|
|
177
|
-
|
|
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
|
|
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
|