nodality 1.3.10 → 1.3.12

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 (285) hide show
  1. package/dist/animator.cjs.js +1 -1
  2. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  3. package/dist/animator.esm.js +1 -1
  4. package/dist/animator.esm.js.LICENSE.txt +1 -1
  5. package/dist/audionew.cjs.js +1 -1
  6. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  7. package/dist/audionew.esm.js +1 -1
  8. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  9. package/dist/base.cjs.js +1 -1
  10. package/dist/base.cjs.js.LICENSE.txt +1 -1
  11. package/dist/base.esm.js +1 -1
  12. package/dist/base.esm.js.LICENSE.txt +1 -1
  13. package/dist/beta-desktop-bar.cjs.js +1 -1
  14. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  15. package/dist/beta-desktop-bar.esm.js +1 -1
  16. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  17. package/dist/beta-mobile-bar.cjs.js +1 -1
  18. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  19. package/dist/beta-mobile-bar.esm.js +1 -1
  20. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  21. package/dist/bundle.umd.js +1 -1
  22. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  23. package/dist/button.cjs.js +1 -1
  24. package/dist/button.cjs.js.LICENSE.txt +1 -1
  25. package/dist/button.esm.js +1 -1
  26. package/dist/button.esm.js.LICENSE.txt +1 -1
  27. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  28. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  29. package/dist/center.cjs.js +1 -1
  30. package/dist/center.cjs.js.LICENSE.txt +1 -1
  31. package/dist/center.esm.js +1 -1
  32. package/dist/center.esm.js.LICENSE.txt +1 -1
  33. package/dist/checkbox.cjs.js +1 -1
  34. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  35. package/dist/checkbox.esm.js +1 -1
  36. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  37. package/dist/code.cjs.js +1 -1
  38. package/dist/code.cjs.js.LICENSE.txt +1 -1
  39. package/dist/code.esm.js +1 -1
  40. package/dist/code.esm.js.LICENSE.txt +1 -1
  41. package/dist/container.cjs.js +1 -1
  42. package/dist/container.cjs.js.LICENSE.txt +1 -1
  43. package/dist/container.esm.js +1 -1
  44. package/dist/container.esm.js.LICENSE.txt +1 -1
  45. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  46. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  47. package/dist/designer.cjs.js +1 -1
  48. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  49. package/dist/designer.esm.js +1 -1
  50. package/dist/designer.esm.js.LICENSE.txt +1 -1
  51. package/dist/element-mapper.cjs.js +1 -1
  52. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  53. package/dist/element-mapper.esm.js +1 -1
  54. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  55. package/dist/finalresult.esm.js +1 -1
  56. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  57. package/dist/flex-card.cjs.js +1 -1
  58. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  59. package/dist/flex-card.esm.js +1 -1
  60. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  61. package/dist/flex-grid.cjs.js +1 -1
  62. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  63. package/dist/flex-grid.esm.js +1 -1
  64. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  65. package/dist/flex-row.cjs.js +1 -1
  66. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  67. package/dist/flex-row.esm.js +1 -1
  68. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  69. package/dist/floating-input.cjs.js +1 -1
  70. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  71. package/dist/floating-input.esm.js +1 -1
  72. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  73. package/dist/free.cjs.js +1 -1
  74. package/dist/free.cjs.js.LICENSE.txt +1 -1
  75. package/dist/free.esm.js +1 -1
  76. package/dist/free.esm.js.LICENSE.txt +1 -1
  77. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  78. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  79. package/dist/image-picker.cjs.js +1 -1
  80. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  81. package/dist/image-picker.esm.js +1 -1
  82. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  83. package/dist/image.cjs.js +1 -1
  84. package/dist/image.cjs.js.LICENSE.txt +1 -1
  85. package/dist/image.esm.js +1 -1
  86. package/dist/image.esm.js.LICENSE.txt +1 -1
  87. package/dist/index.cjs.js +1 -1
  88. package/dist/index.cjs.js.LICENSE.txt +1 -1
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.esm.js +1 -1
  91. package/dist/index.esm.js.LICENSE.txt +1 -1
  92. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  93. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  94. package/dist/link-getter.cjs.js +1 -1
  95. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  96. package/dist/link-getter.esm.js +1 -1
  97. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  98. package/dist/link.cjs.js +1 -1
  99. package/dist/link.cjs.js.LICENSE.txt +1 -1
  100. package/dist/link.esm.js +1 -1
  101. package/dist/link.esm.js.LICENSE.txt +1 -1
  102. package/dist/meta-adder.cjs.js +1 -1
  103. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  104. package/dist/meta-adder.esm.js +1 -1
  105. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  106. package/dist/modal-2025.cjs.js +1 -1
  107. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  108. package/dist/modal-2025.esm.js +1 -1
  109. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  110. package/dist/multiswitcher.cjs.js +1 -1
  111. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  112. package/dist/multiswitcher.esm.js +1 -1
  113. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  114. package/dist/new-nav-bar.cjs.js +1 -1
  115. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  116. package/dist/new-nav-bar.esm.js +1 -1
  117. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  118. package/dist/picker.cjs.js +1 -1
  119. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  120. package/dist/picker.esm.js +1 -1
  121. package/dist/picker.esm.js.LICENSE.txt +1 -1
  122. package/dist/progress.cjs.js +1 -1
  123. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  124. package/dist/progress.esm.js +1 -1
  125. package/dist/progress.esm.js.LICENSE.txt +1 -1
  126. package/dist/radio.cjs.js +1 -1
  127. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  128. package/dist/radio.esm.js +1 -1
  129. package/dist/radio.esm.js.LICENSE.txt +1 -1
  130. package/dist/range.cjs.js.LICENSE.txt +1 -1
  131. package/dist/range.esm.js.LICENSE.txt +1 -1
  132. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  133. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  134. package/dist/side-bar.cjs.js +1 -1
  135. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  136. package/dist/side-bar.esm.js +1 -1
  137. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  138. package/dist/side-nav-bar.cjs.js +1 -1
  139. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  140. package/dist/side-nav-bar.esm.js +1 -1
  141. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  142. package/dist/simple-bar.cjs.js +1 -1
  143. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  144. package/dist/simple-bar.esm.js +1 -1
  145. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  146. package/dist/slider-2025.cjs.js +1 -1
  147. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  148. package/dist/slider-2025.esm.js +1 -1
  149. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  150. package/dist/spacer.cjs.js +1 -1
  151. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  152. package/dist/spacer.esm.js +1 -1
  153. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  154. package/dist/stack.cjs.js +1 -1
  155. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  156. package/dist/stack.esm.js +1 -1
  157. package/dist/stack.esm.js.LICENSE.txt +1 -1
  158. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  159. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  160. package/dist/table.cjs.js +1 -1
  161. package/dist/table.cjs.js.LICENSE.txt +1 -1
  162. package/dist/table.esm.js +1 -1
  163. package/dist/table.esm.js.LICENSE.txt +1 -1
  164. package/dist/text-field.cjs.js +1 -1
  165. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  166. package/dist/text-field.esm.js +1 -1
  167. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  168. package/dist/text.cjs.js +1 -1
  169. package/dist/text.cjs.js.LICENSE.txt +1 -1
  170. package/dist/text.esm.js +1 -1
  171. package/dist/text.esm.js.LICENSE.txt +1 -1
  172. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  173. package/dist/theme.esm.js.LICENSE.txt +1 -1
  174. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  175. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  176. package/dist/ulist.cjs.js +1 -1
  177. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  178. package/dist/ulist.esm.js +1 -1
  179. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  180. package/dist/video.cjs.js +1 -1
  181. package/dist/video.cjs.js.LICENSE.txt +1 -1
  182. package/dist/video.esm.js +1 -1
  183. package/dist/video.esm.js.LICENSE.txt +1 -1
  184. package/dist/wrap.cjs.js +1 -1
  185. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  186. package/dist/wrap.esm.js +1 -1
  187. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  188. package/dist/zoom-card.cjs.js +1 -1
  189. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  190. package/dist/zoom-card.esm.js +1 -1
  191. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  192. package/layout/animator.js +85 -23
  193. package/layout/audio.js +21 -1
  194. package/layout/audionew.js +1 -1
  195. package/layout/base.js +1 -1
  196. package/layout/beta-desktop-bar.js +1 -1
  197. package/layout/beta-mobile-bar.js +1 -1
  198. package/layout/button.js +4 -2
  199. package/layout/center.js +1 -1
  200. package/layout/checkbox.js +1 -1
  201. package/layout/circle.js +1 -1
  202. package/layout/code.js +2 -2
  203. package/layout/container.js +2 -2
  204. package/layout/dropdown-2025.js +1 -1
  205. package/layout/flex-card.js +1 -1
  206. package/layout/flex-grid.js +1 -1
  207. package/layout/flex-row.js +1 -1
  208. package/layout/form-components/custom.js +1 -1
  209. package/layout/form-components/data-list.js +1 -1
  210. package/layout/form-components/floating-input.js +1 -1
  211. package/layout/form-components/form-all.js +1 -1
  212. package/layout/form-components/form.js +1 -1
  213. package/layout/form-components/image-picker.js +1 -1
  214. package/layout/form-components/picker.js +1 -1
  215. package/layout/form-components/radio.js +6 -1
  216. package/layout/form-components/radiogroup.js +1 -1
  217. package/layout/form-components/range.js +1 -1
  218. package/layout/free.js +1 -1
  219. package/layout/grid-overlay.js +19 -19
  220. package/layout/grid-switcher.js +3 -1
  221. package/layout/grid.js +1 -1
  222. package/layout/horizontal-scroller.js +1 -1
  223. package/layout/image.js +2 -2
  224. package/layout/index.js +1 -1
  225. package/layout/link.js +1 -1
  226. package/layout/list.js +1 -1
  227. package/layout/meta-adder.js +1 -1
  228. package/layout/modal-2025.js +1 -1
  229. package/layout/morph.js +1 -1
  230. package/layout/multiswitcher.js +6 -2
  231. package/layout/nav-bar.js +1 -1
  232. package/layout/nav-factor/custom-div.js +1 -1
  233. package/layout/new-nav-bar.js +1 -1
  234. package/layout/polygon.js +1 -1
  235. package/layout/prerender-site.js +1 -1
  236. package/layout/prerender.js +1 -1
  237. package/layout/progress.js +1 -1
  238. package/layout/row.js +1 -1
  239. package/layout/scroll-video.js +1 -1
  240. package/layout/side-bar.js +1 -1
  241. package/layout/side-nav-bar.js +6 -1
  242. package/layout/simple-bar.js +1 -1
  243. package/layout/slider-2025.js +1 -1
  244. package/layout/spacer.js +1 -1
  245. package/layout/stack.js +5 -2
  246. package/layout/svg.js +1 -1
  247. package/layout/switcher.js +1 -1
  248. package/layout/table.js +1 -1
  249. package/layout/text-field.js +1 -1
  250. package/layout/text.js +1 -1
  251. package/layout/ulist.js +1 -1
  252. package/layout/video.js +22 -22
  253. package/layout/wrap.js +1 -1
  254. package/layout/zoom-card.js +1 -1
  255. package/lib/agent-surface.js +1 -1
  256. package/lib/card-getter.js +1 -1
  257. package/lib/check-page.js +1 -1
  258. package/lib/codegen.js +1 -1
  259. package/lib/data.js +1 -1
  260. package/lib/designer.js +1 -1
  261. package/lib/element-mapper.js +103 -15
  262. package/lib/element-params.generated.js +13 -2
  263. package/lib/grid-geometry.js +1 -1
  264. package/lib/keyframe-animation.js +1 -1
  265. package/lib/link-getter.js +1 -1
  266. package/lib/morph-node.js +1 -1
  267. package/lib/normalize-spec.js +1 -1
  268. package/lib/parse-html.js +1 -1
  269. package/lib/raster-inspect.js +1 -1
  270. package/lib/raster-ops.js +1 -1
  271. package/lib/raster-presets.js +1 -1
  272. package/lib/resolve-refs.js +1 -1
  273. package/lib/scroll-video.js +1 -1
  274. package/lib/seo.js +1 -1
  275. package/lib/stacker.js +1 -1
  276. package/lib/suggest.js +1 -1
  277. package/lib/theme.js +1 -1
  278. package/lib/transform-anim.js +1 -1
  279. package/lib/transition.js +1 -1
  280. package/lib/validate-nodes.js +146 -4
  281. package/lib/webmcp-adapter.js +1 -1
  282. package/package.json +1 -1
  283. package/schema.json +1391 -2263
  284. package/scripts/generate-schema.mjs +135 -15
  285. package/skills/nodality/SKILL.md +15 -0
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -97,6 +97,11 @@ class RadioGroup /*extends Animator*/ {
97
97
  }
98
98
 
99
99
  this.el = wrap;
100
+ // RadioGroup is not an Animator, so the base class that applies an
101
+ // element's id after set() never sees it. It applies its own.
102
+ if (objects && objects.id != null && objects.id !== "") {
103
+ this.el.setAttribute("id", String(objects.id));
104
+ }
100
105
 
101
106
  this.responsive();
102
107
  return this;
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/free.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -93,39 +93,39 @@ class GridOverlay extends Animator {
93
93
  // or a destructure here would hide them from `get_schema` and make the
94
94
  // validator reject valid specs.
95
95
  this.config = {
96
- //@ gridOverlay.columns: Columns, counted as cells (N cells draw N+1 lines). 0 draws no vertical lines. Default 4. Named `columns`, not `cols`: the library's shared `cols` means grid-template-columns verbatim.
96
+ //@ gridOverlay.columns {count}: Columns, counted as cells (N cells draw N+1 lines). 0 draws no vertical lines. Default 4. Named `columns`, not `cols`: the library's shared `cols` means grid-template-columns verbatim.
97
97
  columns: obj.columns ?? DEFAULTS.columns,
98
- //@ gridOverlay.rows: Rows across the overlay's height, counted as cells. 0 draws no horizontal lines. Default 2.
98
+ //@ gridOverlay.rows {count}: Rows across the overlay's height, counted as cells. 0 draws no horizontal lines. Default 2.
99
99
  rows: obj.rows ?? DEFAULTS.rows,
100
- //@ gridOverlay.inset: Distance of the outermost lines from the edge in px. A number, or {x, y}. Default 16.
100
+ //@ gridOverlay.inset {px-number}: Distance of the outermost lines from the edge in px. A number, or {x, y}. Default 16.
101
101
  inset: obj.inset ?? DEFAULTS.inset,
102
- //@ gridOverlay.color: Colour of lines, marks and readouts (drawn with currentColor). Falls back to the Theme text colour.
102
+ //@ gridOverlay.color {color}: Colour of lines, marks and readouts (drawn with currentColor). Falls back to the Theme text colour.
103
103
  color: obj.color,
104
- //@ gridOverlay.lineWidth: Stroke width of the grid lines in px. Default 1.
104
+ //@ gridOverlay.lineWidth {px-number}: Stroke width of the grid lines in px. Default 1.
105
105
  lineWidth: obj.lineWidth ?? DEFAULTS.lineWidth,
106
- //@ gridOverlay.lineOpacity: Opacity of the lines only; marks and readouts stay opaque. 0–1, default 0.35.
106
+ //@ gridOverlay.lineOpacity {ratio}: Opacity of the lines only; marks and readouts stay opaque. 0–1, default 0.35.
107
107
  lineOpacity: obj.lineOpacity ?? DEFAULTS.lineOpacity,
108
- //@ gridOverlay.marks: Registration mark at each intersection: "square" (default), "cross" or "none".
108
+ //@ gridOverlay.marks {enum(square|cross|none)}: Registration mark at each intersection: "square" (default), "cross" or "none".
109
109
  marks: obj.marks ?? DEFAULTS.marks,
110
- //@ gridOverlay.markSize: Size of each registration mark in px. Default 8.
110
+ //@ gridOverlay.markSize {px-number}: Size of each registration mark in px. Default 8.
111
111
  markSize: obj.markSize ?? DEFAULTS.markSize,
112
- //@ gridOverlay.position: "fixed" (default) pins the grid to the viewport; "absolute" fills the nearest positioned ancestor.
112
+ //@ gridOverlay.position {enum(fixed|absolute)}: "fixed" (default) pins the grid to the viewport; "absolute" fills the nearest positioned ancestor.
113
113
  position: obj.position ?? DEFAULTS.position,
114
- //@ gridOverlay.zIndex: Stacking order of the overlay. Default 2 — keep navigation above it.
114
+ //@ gridOverlay.zIndex {count}: Stacking order of the overlay. Default 2 — keep navigation above it.
115
115
  zIndex: obj.zIndex ?? DEFAULTS.zIndex,
116
- //@ gridOverlay.font: Font family of the readouts. Default a monospace stack.
116
+ //@ gridOverlay.font {text}: Font family of the readouts. Default a monospace stack.
117
117
  font: obj.font ?? DEFAULTS.font,
118
- //@ gridOverlay.fontSize: Readout font size in px. Default 11.
118
+ //@ gridOverlay.fontSize {px-number}: Readout font size in px. Default 11.
119
119
  fontSize: obj.fontSize ?? DEFAULTS.fontSize,
120
- //@ gridOverlay.letterSpacing: Readout letter spacing, any CSS length. Default "0.04em".
120
+ //@ gridOverlay.letterSpacing {text}: Readout letter spacing, any CSS length. Default "0.04em".
121
121
  letterSpacing: obj.letterSpacing ?? DEFAULTS.letterSpacing,
122
- //@ gridOverlay.uppercase: Uppercase the readout text. Default true.
122
+ //@ gridOverlay.uppercase {bool}: Uppercase the readout text. Default true.
123
123
  uppercase: obj.uppercase ?? DEFAULTS.uppercase,
124
- //@ gridOverlay.breakpoint: Viewport width in px below which `mobile` applies. Default 768.
124
+ //@ gridOverlay.breakpoint {px-number}: Viewport width in px below which `mobile` applies. Default 768.
125
125
  breakpoint: obj.breakpoint ?? DEFAULTS.breakpoint,
126
- //@ gridOverlay.mobile: Options that replace their desktop values below `breakpoint`, e.g. {columns: 1, rows: 4}.
126
+ //@ gridOverlay.mobile {object}: Options that replace their desktop values below `breakpoint`, e.g. {columns: 1, rows: 4}.
127
127
  mobile: obj.mobile,
128
- //@ gridOverlay.readouts: Labels beside intersections: [{id, col, row, text, anchor}]. col/row index lines from 0; anchor "br" (default), "bl", "tr" or "tl", flipped automatically when the label would fall outside. Decorative — say the same thing in real page text.
128
+ //@ gridOverlay.readouts {array}: Labels beside intersections: [{id, col, row, text, anchor}]. col/row index lines from 0; anchor "br" (default), "bl", "tr" or "tl", flipped automatically when the label would fall outside. Decorative — say the same thing in real page text.
129
129
  readouts: obj.readouts ?? DEFAULTS.readouts,
130
130
  };
131
131
 
@@ -138,7 +138,7 @@ class GridOverlay extends Animator {
138
138
  this._watchSize();
139
139
  this.draw();
140
140
 
141
- //@ gridOverlay.raster: Raster op nodes for the overlay, e.g. an offset driven by hover to bend the lines near the cursor.
141
+ //@ gridOverlay.raster {nodes}: Raster op nodes for the overlay, e.g. an offset driven by hover to bend the lines near the cursor.
142
142
  obj.raster && this.rasterize(obj.raster);
143
143
  return this;
144
144
  }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -18,6 +18,8 @@ class AreaSwitcher extends Animator{
18
18
  }
19
19
 
20
20
  set(obj){
21
+ // The node is `gridContainer`, not `res`, so the id is applied here.
22
+ if (obj && obj.id != null && obj.id !== "") this.gridContainer.setAttribute("id", String(obj.id));
21
23
  obj.gap && (this.gridContainer.style.gap = obj.gap);
22
24
  obj.height && (this.gridContainer.style.height = obj.height);
23
25
  obj.width && (this.gridContainer.style.width = obj.width);
package/layout/grid.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/image.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -154,7 +154,7 @@ let obj = options;
154
154
  options.index && (this.index = options.index);
155
155
  options.index && (stra += `\n index: "${options.index}",`);
156
156
 
157
- options.resprop && this.resprop(options.resprop);
157
+ options.resprop && this.resprop(options.resprop, options);
158
158
 
159
159
  if (options.centerSelf){
160
160
  this.res.style.marginRight = "auto";
package/layout/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/link.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/list.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/morph.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -57,7 +57,11 @@ str += `{ at: "${this.options.breakpoints[i].at}", view: ${this.options.breakpoi
57
57
 
58
58
  // console.log(str);
59
59
 
60
- return [`new Switcher().set({
60
+ // The id is applied in render(), but only if the generated code carries
61
+ // it — and this used to leave it out, so every nav, sideNav and
62
+ // multiswitcher rendered without the id its element declared.
63
+ const idLine = this._id ? `\n id: ${JSON.stringify(String(this._id))},` : "";
64
+ return [`new Switcher().set({${idLine}
61
65
  breakpoints: [
62
66
  ${str}
63
67
  ]
package/layout/nav-bar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/polygon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/row.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -16,6 +16,11 @@ class SideNav extends Animator {
16
16
  this.setTags(this.obj.tags);
17
17
  this.animate = this.obj.animate !== undefined ? this.obj.animate : true; // could be never false
18
18
  this.res = this.createSideNav(obj);
19
+ // SideNav is configured through setup(), not set(), so the base
20
+ // class that applies an element's id after set() never runs here.
21
+ if (obj && obj.id != null && obj.id !== "" && this.res && this.res.setAttribute) {
22
+ this.res.setAttribute("id", String(obj.id));
23
+ }
19
24
  this.res.style.position = "relative";
20
25
  this.res.style.zIndex = 3;
21
26
  this.closed = true; // Set to true initially, so it's closed by default
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/spacer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/stack.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -30,6 +30,7 @@ class Stack extends Animator {
30
30
  }
31
31
 
32
32
  set(obj){
33
+ this.options = obj || {};
33
34
  this.setup();
34
35
  obj.height && (this.res.style.height = obj.height);
35
36
  obj.sticky && this.sticky();
@@ -57,7 +58,9 @@ class Stack extends Animator {
57
58
 
58
59
  toCode() {
59
60
  // Initialize the code string with the Stack setup
60
- let code = `new Stack().set({})`;
61
+ // Was a hardcoded `set({})`, which dropped the element's id.
62
+ const id = this.options && this.options.id;
63
+ let code = `new Stack().set(${id ? `{ id: ${JSON.stringify(String(id))} }` : "{}"})`;
61
64
 
62
65
  // Add child elements
63
66
  if (this.children.length > 0) {
package/layout/svg.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/table.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/text.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/ulist.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/video.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -74,7 +74,7 @@ class Video extends Animator {
74
74
  this.options = obj;
75
75
  const v = this.res;
76
76
 
77
- //@ video.sources: Several encodings of the same clip: [{url, type}] or plain url strings. The browser picks the first it can play, so order best-first (AV1, then HEVC, then H.264). `type` is inferred from the extension when omitted.
77
+ //@ video.sources {array}: Several encodings of the same clip: [{url, type}] or plain url strings. The browser picks the first it can play, so order best-first (AV1, then HEVC, then H.264). `type` is inferred from the extension when omitted.
78
78
  if (Array.isArray(obj.sources) && obj.sources.length) {
79
79
  // A `src` attribute wins over <source> children, so it has to go.
80
80
  v.removeAttribute("src");
@@ -93,27 +93,27 @@ class Video extends Animator {
93
93
  }
94
94
  }
95
95
 
96
- //@ video.poster: Image shown before the first frame decodes. Give one on any autoplaying clip: it is what holds the layout still and what reduced-motion visitors see instead of the video.
96
+ //@ video.poster {url}: Image shown before the first frame decodes. Give one on any autoplaying clip: it is what holds the layout still and what reduced-motion visitors see instead of the video.
97
97
  obj.poster && v.setAttribute("poster", obj.poster);
98
98
 
99
- //@ video.preload: "none", "metadata" (a good default for a loop) or "auto".
99
+ //@ video.preload {enum(none|metadata|auto)}: "none", "metadata" (a good default for a loop) or "auto".
100
100
  obj.preload && v.setAttribute("preload", obj.preload);
101
101
 
102
- //@ video.controls: Show the browser's playback controls. Default true — pass false for an ambient loop.
102
+ //@ video.controls {bool}: Show the browser's playback controls. Default true — pass false for an ambient loop.
103
103
  if (obj.controls === false) v.removeAttribute("controls");
104
104
  else if (obj.controls === true) v.setAttribute("controls", "controls");
105
105
 
106
- //@ video.loop: Restart when the clip ends.
106
+ //@ video.loop {bool}: Restart when the clip ends.
107
107
  obj.loop && (v.loop = true, v.setAttribute("loop", "loop"));
108
108
 
109
- //@ video.playsinline: Play in place on iPhone instead of taking over the screen. Implied by `autoplay`; there is no reason to refuse it on a background loop.
109
+ //@ video.playsinline {bool}: Play in place on iPhone instead of taking over the screen. Implied by `autoplay`; there is no reason to refuse it on a background loop.
110
110
  const playsinline = obj.playsinline ?? obj.autoplay;
111
111
  if (playsinline) {
112
112
  v.setAttribute("playsinline", "");
113
113
  v.setAttribute("webkit-playsinline", "");
114
114
  }
115
115
 
116
- //@ video.muted: Mute the audio track. Forced on by `autoplay`, because browsers block an unmuted autoplay; pass false only if you mean to accept that.
116
+ //@ video.muted {bool}: Mute the audio track. Forced on by `autoplay`, because browsers block an unmuted autoplay; pass false only if you mean to accept that.
117
117
  const muted = obj.muted ?? (obj.autoplay ? true : undefined);
118
118
  if (muted === true) {
119
119
  v.muted = true;
@@ -123,39 +123,39 @@ class Video extends Animator {
123
123
  v.removeAttribute("muted");
124
124
  }
125
125
 
126
- //@ video.autoplay: Start on its own. Implies muted and playsinline, pauses off screen and in a hidden tab, and is cancelled by prefers-reduced-motion (the poster stays).
127
- //@ video.lazy: Only play while on screen. On by default whenever `autoplay` is set; pass false to keep an autoplaying clip running off screen.
126
+ //@ video.autoplay {bool}: Start on its own. Implies muted and playsinline, pauses off screen and in a hidden tab, and is cancelled by prefers-reduced-motion (the poster stays).
127
+ //@ video.lazy {bool}: Only play while on screen. On by default whenever `autoplay` is set; pass false to keep an autoplaying clip running off screen.
128
128
  if (obj.autoplay) this._autoplay(obj.lazy !== false);
129
129
 
130
- //@ video.objectFit: How the frame fills the element box: "cover", "contain", "fill", "none".
130
+ //@ video.objectFit {enum(cover|contain|fill|none|scale-down)}: How the frame fills the element box: "cover", "contain", "fill", "none".
131
131
  obj.objectFit && (v.style.objectFit = obj.objectFit);
132
132
 
133
- //@ video.aspectRatio: Box proportion held before the video loads, e.g. "16 / 9". Prevents the page shifting when the first frame arrives.
133
+ //@ video.aspectRatio {css-aspect-ratio}: Box proportion held before the video loads, e.g. "16 / 9". Prevents the page shifting when the first frame arrives.
134
134
  obj.aspectRatio && (v.style.aspectRatio = obj.aspectRatio);
135
135
 
136
- //@ video.id: DOM id. Also what a node's `target` names, so a clip carrying a raster op needs one.
136
+ //@ video.id {text}: DOM id. Also what a node's `target` names, so a clip carrying a raster op needs one.
137
137
  obj.id && v.setAttribute("id", obj.id);
138
138
 
139
- //@ video.label: Accessible name, for a clip that carries meaning.
139
+ //@ video.label {text}: Accessible name, for a clip that carries meaning.
140
140
  obj.label && v.setAttribute("aria-label", obj.label);
141
141
 
142
- //@ video.decorative: Hide from assistive technology. For an ambient loop that repeats what the page already says in text.
142
+ //@ video.decorative {bool}: Hide from assistive technology. For an ambient loop that repeats what the page already says in text.
143
143
  if (obj.decorative) v.setAttribute("aria-hidden", "true");
144
144
 
145
- //@ video.background: CSS background behind the frame — visible while the poster loads.
145
+ //@ video.background {color}: CSS background behind the frame — visible while the poster loads.
146
146
  obj.background && (v.style.background = obj.background);
147
- //@ video.height: CSS height of the element.
147
+ //@ video.height {css-length}: CSS height of the element.
148
148
  obj.height && (v.style.height = obj.height);
149
- //@ video.maxWidth: CSS max-width of the element.
149
+ //@ video.maxWidth {css-length}: CSS max-width of the element.
150
150
  obj.maxWidth && (v.style.maxWidth = obj.maxWidth);
151
- //@ video.radius: Corner radius. A CSS length; a bare number is read as pixels.
151
+ //@ video.radius {px-or-length}: Corner radius. A CSS length; a bare number is read as pixels.
152
152
  obj.radius && (v.style.borderRadius = typeof obj.radius === "number" ? `${obj.radius}px` : obj.radius);
153
- //@ video.width: CSS width of the element.
153
+ //@ video.width {css-length}: CSS width of the element.
154
154
  obj.width && (v.style.width = `${obj.width}`);
155
- //@ video.opacity: 0–1.
155
+ //@ video.opacity {ratio}: 0–1.
156
156
  obj.opacity && (v.style.opacity = obj.opacity);
157
157
 
158
- //@ video.raster: Raster op nodes to run over this element.
158
+ //@ video.raster {nodes}: Raster op nodes to run over this element.
159
159
  obj.raster && this.rasterize(obj.raster);
160
160
 
161
161
  return this;
package/layout/wrap.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/check-page.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/codegen.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/data.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/designer.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.10
2
+ * nodality v1.3.12
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */