nodality 1.3.16 → 1.3.17

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 +3 -2
  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.LICENSE.txt +1 -1
  127. package/dist/radio.esm.js.LICENSE.txt +1 -1
  128. package/dist/range.cjs.js.LICENSE.txt +1 -1
  129. package/dist/range.esm.js.LICENSE.txt +1 -1
  130. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  131. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  132. package/dist/side-bar.cjs.js +1 -1
  133. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  134. package/dist/side-bar.esm.js +1 -1
  135. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  136. package/dist/side-nav-bar.cjs.js +1 -1
  137. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  138. package/dist/side-nav-bar.esm.js +1 -1
  139. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  140. package/dist/simple-bar.cjs.js +1 -1
  141. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  142. package/dist/simple-bar.esm.js +1 -1
  143. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  144. package/dist/slider-2025.cjs.js +1 -1
  145. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  146. package/dist/slider-2025.esm.js +1 -1
  147. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  148. package/dist/spacer.cjs.js +1 -1
  149. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  150. package/dist/spacer.esm.js +1 -1
  151. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  152. package/dist/stack.cjs.js +1 -1
  153. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  154. package/dist/stack.esm.js +1 -1
  155. package/dist/stack.esm.js.LICENSE.txt +1 -1
  156. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  157. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  158. package/dist/table.cjs.js +1 -1
  159. package/dist/table.cjs.js.LICENSE.txt +1 -1
  160. package/dist/table.esm.js +1 -1
  161. package/dist/table.esm.js.LICENSE.txt +1 -1
  162. package/dist/text-field.cjs.js +1 -1
  163. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  164. package/dist/text-field.esm.js +1 -1
  165. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  166. package/dist/text.cjs.js +1 -1
  167. package/dist/text.cjs.js.LICENSE.txt +1 -1
  168. package/dist/text.esm.js +1 -1
  169. package/dist/text.esm.js.LICENSE.txt +1 -1
  170. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  171. package/dist/theme.esm.js.LICENSE.txt +1 -1
  172. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  173. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  174. package/dist/ulist.cjs.js +1 -1
  175. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  176. package/dist/ulist.esm.js +1 -1
  177. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  178. package/dist/video.cjs.js +1 -1
  179. package/dist/video.cjs.js.LICENSE.txt +1 -1
  180. package/dist/video.esm.js +1 -1
  181. package/dist/video.esm.js.LICENSE.txt +1 -1
  182. package/dist/wrap.cjs.js +1 -1
  183. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  184. package/dist/wrap.esm.js +1 -1
  185. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  186. package/dist/zoom-card.cjs.js +1 -1
  187. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  188. package/dist/zoom-card.esm.js +1 -1
  189. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  190. package/layout/animator.js +38 -1
  191. package/layout/audio.js +1 -1
  192. package/layout/audionew.js +1 -1
  193. package/layout/base.js +1 -1
  194. package/layout/beta-desktop-bar.js +1 -1
  195. package/layout/beta-mobile-bar.js +1 -1
  196. package/layout/button.js +1 -1
  197. package/layout/center.js +1 -1
  198. package/layout/checkbox.js +1 -1
  199. package/layout/circle.js +1 -1
  200. package/layout/code.js +1 -1
  201. package/layout/container.js +1 -1
  202. package/layout/dropdown-2025.js +1 -1
  203. package/layout/flex-card.js +1 -1
  204. package/layout/flex-grid.js +1 -1
  205. package/layout/flex-row.js +1 -1
  206. package/layout/form-components/custom.js +1 -1
  207. package/layout/form-components/data-list.js +1 -1
  208. package/layout/form-components/floating-input.js +1 -1
  209. package/layout/form-components/form-all.js +1 -1
  210. package/layout/form-components/form.js +1 -1
  211. package/layout/form-components/image-picker.js +1 -1
  212. package/layout/form-components/picker.js +1 -1
  213. package/layout/form-components/radio.js +1 -1
  214. package/layout/form-components/radiogroup.js +1 -1
  215. package/layout/form-components/range.js +1 -1
  216. package/layout/free.js +1 -1
  217. package/layout/grid-overlay.js +1 -1
  218. package/layout/grid-switcher.js +1 -1
  219. package/layout/grid.js +1 -1
  220. package/layout/horizontal-scroller.js +1 -1
  221. package/layout/image.js +1 -1
  222. package/layout/index.js +1 -1
  223. package/layout/link.js +1 -1
  224. package/layout/list.js +1 -1
  225. package/layout/meta-adder.js +1 -1
  226. package/layout/modal-2025.js +1 -1
  227. package/layout/morph.js +1 -1
  228. package/layout/multiswitcher.js +1 -1
  229. package/layout/nav-bar.js +1 -1
  230. package/layout/nav-factor/custom-div.js +1 -1
  231. package/layout/new-nav-bar.js +1 -1
  232. package/layout/polygon.js +1 -1
  233. package/layout/prerender-site.js +1 -1
  234. package/layout/prerender.js +1 -1
  235. package/layout/progress.js +1 -1
  236. package/layout/row.js +1 -1
  237. package/layout/scroll-video.js +1 -1
  238. package/layout/shop.js +1 -1
  239. package/layout/side-bar.js +1 -1
  240. package/layout/side-nav-bar.js +1 -1
  241. package/layout/simple-bar.js +1 -1
  242. package/layout/slider-2025.js +1 -1
  243. package/layout/spacer.js +1 -1
  244. package/layout/stack.js +1 -1
  245. package/layout/svg.js +1 -1
  246. package/layout/switcher.js +1 -1
  247. package/layout/table.js +1 -1
  248. package/layout/text-field.js +1 -1
  249. package/layout/text.js +1 -1
  250. package/layout/ulist.js +1 -1
  251. package/layout/video.js +1 -1
  252. package/layout/wrap.js +1 -1
  253. package/layout/zoom-card.js +1 -1
  254. package/lib/agent-surface.js +1 -1
  255. package/lib/card-getter.js +1 -1
  256. package/lib/check-page.js +1 -1
  257. package/lib/codegen.js +1 -1
  258. package/lib/data.js +1 -1
  259. package/lib/designer.js +1 -1
  260. package/lib/element-mapper.js +1 -1
  261. package/lib/element-params.generated.js +3 -3
  262. package/lib/grid-geometry.js +1 -1
  263. package/lib/keyframe-animation.js +1 -1
  264. package/lib/known-inert.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 +1 -1
  281. package/lib/webmcp-adapter.js +1 -1
  282. package/package.json +1 -1
  283. package/schema.json +144 -0
  284. package/scripts/generate-schema.mjs +9 -0
  285. package/skills/nodality/SKILL.md +5 -0
package/lib/transition.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.16
2
+ * nodality v1.3.17
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.16
2
+ * nodality v1.3.17
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.16
2
+ * nodality v1.3.17
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodality",
3
- "version": "1.3.16",
3
+ "version": "1.3.17",
4
4
  "description": "A lightweight library for declarative UI elements.",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
package/schema.json CHANGED
@@ -161,6 +161,12 @@
161
161
  "name": "left",
162
162
  "via": "component"
163
163
  },
164
+ {
165
+ "name": "loop",
166
+ "via": "component",
167
+ "unit": "object",
168
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
169
+ },
164
170
  {
165
171
  "name": "mar",
166
172
  "via": "component",
@@ -433,6 +439,12 @@
433
439
  "name": "left",
434
440
  "via": "component"
435
441
  },
442
+ {
443
+ "name": "loop",
444
+ "via": "component",
445
+ "unit": "object",
446
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
447
+ },
436
448
  {
437
449
  "name": "mar",
438
450
  "via": "component",
@@ -705,6 +717,12 @@
705
717
  "name": "left",
706
718
  "via": "component"
707
719
  },
720
+ {
721
+ "name": "loop",
722
+ "via": "component",
723
+ "unit": "object",
724
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
725
+ },
708
726
  {
709
727
  "name": "mar",
710
728
  "via": "component",
@@ -977,6 +995,12 @@
977
995
  "name": "left",
978
996
  "via": "component"
979
997
  },
998
+ {
999
+ "name": "loop",
1000
+ "via": "component",
1001
+ "unit": "object",
1002
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
1003
+ },
980
1004
  {
981
1005
  "name": "mar",
982
1006
  "via": "component",
@@ -1249,6 +1273,12 @@
1249
1273
  "name": "left",
1250
1274
  "via": "component"
1251
1275
  },
1276
+ {
1277
+ "name": "loop",
1278
+ "via": "component",
1279
+ "unit": "object",
1280
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
1281
+ },
1252
1282
  {
1253
1283
  "name": "mar",
1254
1284
  "via": "component",
@@ -1521,6 +1551,12 @@
1521
1551
  "name": "left",
1522
1552
  "via": "component"
1523
1553
  },
1554
+ {
1555
+ "name": "loop",
1556
+ "via": "component",
1557
+ "unit": "object",
1558
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
1559
+ },
1524
1560
  {
1525
1561
  "name": "mar",
1526
1562
  "via": "component",
@@ -1793,6 +1829,12 @@
1793
1829
  "name": "left",
1794
1830
  "via": "component"
1795
1831
  },
1832
+ {
1833
+ "name": "loop",
1834
+ "via": "component",
1835
+ "unit": "object",
1836
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
1837
+ },
1796
1838
  {
1797
1839
  "name": "mar",
1798
1840
  "via": "component",
@@ -2020,6 +2062,12 @@
2020
2062
  "name": "loading",
2021
2063
  "via": "component"
2022
2064
  },
2065
+ {
2066
+ "name": "loop",
2067
+ "via": "component",
2068
+ "unit": "object",
2069
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
2070
+ },
2023
2071
  {
2024
2072
  "name": "marginOp",
2025
2073
  "via": "component"
@@ -2249,6 +2297,12 @@
2249
2297
  "name": "link",
2250
2298
  "via": "mapper"
2251
2299
  },
2300
+ {
2301
+ "name": "loop",
2302
+ "via": "component",
2303
+ "unit": "object",
2304
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
2305
+ },
2252
2306
  {
2253
2307
  "name": "mar",
2254
2308
  "via": "component",
@@ -2712,6 +2766,12 @@
2712
2766
  "name": "loading",
2713
2767
  "via": "component"
2714
2768
  },
2769
+ {
2770
+ "name": "loop",
2771
+ "via": "component",
2772
+ "unit": "object",
2773
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
2774
+ },
2715
2775
  {
2716
2776
  "name": "map",
2717
2777
  "via": "component"
@@ -3497,6 +3557,12 @@
3497
3557
  "name": "loading",
3498
3558
  "via": "component"
3499
3559
  },
3560
+ {
3561
+ "name": "loop",
3562
+ "via": "component",
3563
+ "unit": "object",
3564
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
3565
+ },
3500
3566
  {
3501
3567
  "name": "map",
3502
3568
  "via": "component"
@@ -4242,6 +4308,12 @@
4242
4308
  "name": "loading",
4243
4309
  "via": "component"
4244
4310
  },
4311
+ {
4312
+ "name": "loop",
4313
+ "via": "component",
4314
+ "unit": "object",
4315
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
4316
+ },
4245
4317
  {
4246
4318
  "name": "map",
4247
4319
  "via": "component"
@@ -4754,6 +4826,12 @@
4754
4826
  "name": "left",
4755
4827
  "via": "component"
4756
4828
  },
4829
+ {
4830
+ "name": "loop",
4831
+ "via": "component",
4832
+ "unit": "object",
4833
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
4834
+ },
4757
4835
  {
4758
4836
  "name": "mar",
4759
4837
  "via": "component",
@@ -4958,6 +5036,12 @@
4958
5036
  "name": "length",
4959
5037
  "via": "component"
4960
5038
  },
5039
+ {
5040
+ "name": "loop",
5041
+ "via": "component",
5042
+ "unit": "object",
5043
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5044
+ },
4961
5045
  {
4962
5046
  "name": "multiple",
4963
5047
  "via": "mapper"
@@ -5022,6 +5106,12 @@
5022
5106
  "via": "component",
5023
5107
  "description": "Accessible name for the field."
5024
5108
  },
5109
+ {
5110
+ "name": "loop",
5111
+ "via": "component",
5112
+ "unit": "object",
5113
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5114
+ },
5025
5115
  {
5026
5116
  "name": "mar",
5027
5117
  "via": "component",
@@ -5121,6 +5211,12 @@
5121
5211
  "via": "mapper",
5122
5212
  "description": "Accessible name for the field."
5123
5213
  },
5214
+ {
5215
+ "name": "loop",
5216
+ "via": "component",
5217
+ "unit": "object",
5218
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5219
+ },
5124
5220
  {
5125
5221
  "name": "mar",
5126
5222
  "via": "component",
@@ -5195,6 +5291,12 @@
5195
5291
  "name": "index",
5196
5292
  "via": "component"
5197
5293
  },
5294
+ {
5295
+ "name": "loop",
5296
+ "via": "component",
5297
+ "unit": "object",
5298
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5299
+ },
5198
5300
  {
5199
5301
  "name": "name",
5200
5302
  "via": "component",
@@ -5263,6 +5365,12 @@
5263
5365
  "via": "component",
5264
5366
  "description": "Accessible name for the control, written to `aria-label`; a select with no adjacent text has none otherwise."
5265
5367
  },
5368
+ {
5369
+ "name": "loop",
5370
+ "via": "component",
5371
+ "unit": "object",
5372
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5373
+ },
5266
5374
  {
5267
5375
  "name": "mar",
5268
5376
  "via": "component",
@@ -5577,6 +5685,12 @@
5577
5685
  "unit": "keyset",
5578
5686
  "description": "Escape hatch — {key, value} written straight to element.style, or an array of them."
5579
5687
  },
5688
+ {
5689
+ "name": "loop",
5690
+ "via": "component",
5691
+ "unit": "object",
5692
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5693
+ },
5580
5694
  {
5581
5695
  "name": "margin",
5582
5696
  "via": "component"
@@ -5856,6 +5970,12 @@
5856
5970
  "name": "left",
5857
5971
  "via": "component"
5858
5972
  },
5973
+ {
5974
+ "name": "loop",
5975
+ "via": "component",
5976
+ "unit": "object",
5977
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
5978
+ },
5859
5979
  {
5860
5980
  "name": "mar",
5861
5981
  "via": "component",
@@ -6005,6 +6125,12 @@
6005
6125
  "via": "mapper",
6006
6126
  "description": "This element's DOM id. Also what a design node's `target` names, and what `parse` recovers an element by."
6007
6127
  },
6128
+ {
6129
+ "name": "loop",
6130
+ "via": "component",
6131
+ "unit": "object",
6132
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
6133
+ },
6008
6134
  {
6009
6135
  "name": "sticky",
6010
6136
  "via": "component",
@@ -6324,6 +6450,12 @@
6324
6450
  "name": "left",
6325
6451
  "via": "component"
6326
6452
  },
6453
+ {
6454
+ "name": "loop",
6455
+ "via": "component",
6456
+ "unit": "object",
6457
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
6458
+ },
6327
6459
  {
6328
6460
  "name": "mar",
6329
6461
  "via": "component",
@@ -6798,6 +6930,12 @@
6798
6930
  "name": "left",
6799
6931
  "via": "component"
6800
6932
  },
6933
+ {
6934
+ "name": "loop",
6935
+ "via": "component",
6936
+ "unit": "object",
6937
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
6938
+ },
6801
6939
  {
6802
6940
  "name": "mar",
6803
6941
  "via": "component",
@@ -7574,6 +7712,12 @@
7574
7712
  "name": "loading",
7575
7713
  "via": "component"
7576
7714
  },
7715
+ {
7716
+ "name": "loop",
7717
+ "via": "component",
7718
+ "unit": "object",
7719
+ "description": "Animate the element forever, with no stylesheet: {keyframes: [{…css}, {…css}], duration: ms, easing, direction, delay}. Keyframes are CSS properties in camelCase, e.g. [{backgroundPosition: \"0px 0\"}, {backgroundPosition: \"99px 0\"}]. Skipped for prefers-reduced-motion and where the browser has no Web Animations (the prerender)."
7720
+ },
7577
7721
  {
7578
7722
  "name": "map",
7579
7723
  "via": "component"
@@ -361,6 +361,15 @@ for (const type of TYPES) {
361
361
  // Read off the element by every mapper regardless of component.
362
362
  for (const p of ["type", "id"]) contributed(p, MAPPER);
363
363
 
364
+ // Options the BASE CLASS applies to every component built on it, after the
365
+ // component's own set() — currently `loop`. Component scans never see them,
366
+ // because they are read in animator.js. Credited only where the type has no
367
+ // parameter of that name already: `video` has its own boolean `loop`.
368
+ const ANIMATOR = join(ROOT, "layout", "animator.js");
369
+ const onAnimator = files.some((f) => { try { return /extends\s+Animator\b/.test(readFileSync(f, "utf8")); } catch { return false; } });
370
+ // And only where the element's options reach the component at all.
371
+ if (onAnimator && forwardsElement) for (const p of ["loop"]) if (!params.has(p)) contributed(p, ANIMATOR);
372
+
364
373
  // NOTE. A `settable` flag was attempted here and removed. The question it
365
374
  // was meant to answer -- which of these parameters an AUTHOR can set on the
366
375
  // element, as opposed to which the components READ -- is real and still
@@ -205,6 +205,11 @@ A complete navigation graph is one node:
205
205
  element/op (extend the library), or the `keySet` option on an element
206
206
  (`keySet: { key, value }`) for one custom CSS property. Note the
207
207
  spelling: `keySet`, capital S.
208
+ - **No CSS in the page either.** No `<style>` rules, no `@keyframes`, no
209
+ stylesheet files. Anything that moves on its own takes `loop` on the element —
210
+ `loop: { keyframes: [{…}, {…}], duration }` runs forever through the Web
211
+ Animations API and holds still for reduced motion. If something cannot be
212
+ expressed, extend the library.
208
213
  - **Elements take `text`, never `value`.**
209
214
  - **Every element that a node targets needs an `id`.** Short and stable
210
215
  (`"hero"`, `"topnav"`); ids are the joint between the two arrays and