nodality 1.3.1 → 1.3.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 (205) hide show
  1. package/dist/animator.cjs.js.LICENSE.txt +1 -1
  2. package/dist/animator.esm.js.LICENSE.txt +1 -1
  3. package/dist/audionew.cjs.js.LICENSE.txt +1 -1
  4. package/dist/audionew.esm.js.LICENSE.txt +1 -1
  5. package/dist/base.cjs.js.LICENSE.txt +1 -1
  6. package/dist/base.esm.js.LICENSE.txt +1 -1
  7. package/dist/beta-desktop-bar.cjs.js.LICENSE.txt +1 -1
  8. package/dist/beta-desktop-bar.esm.js.LICENSE.txt +1 -1
  9. package/dist/beta-mobile-bar.cjs.js.LICENSE.txt +1 -1
  10. package/dist/beta-mobile-bar.esm.js.LICENSE.txt +1 -1
  11. package/dist/bundle.umd.js +1 -1
  12. package/dist/bundle.umd.js.LICENSE.txt +1 -1
  13. package/dist/button.cjs.js.LICENSE.txt +1 -1
  14. package/dist/button.esm.js.LICENSE.txt +1 -1
  15. package/dist/card-getter.cjs.js.LICENSE.txt +1 -1
  16. package/dist/card-getter.esm.js.LICENSE.txt +1 -1
  17. package/dist/center.cjs.js.LICENSE.txt +1 -1
  18. package/dist/center.esm.js.LICENSE.txt +1 -1
  19. package/dist/checkbox.cjs.js.LICENSE.txt +1 -1
  20. package/dist/checkbox.esm.js.LICENSE.txt +1 -1
  21. package/dist/code.cjs.js.LICENSE.txt +1 -1
  22. package/dist/code.esm.js.LICENSE.txt +1 -1
  23. package/dist/container.cjs.js.LICENSE.txt +1 -1
  24. package/dist/container.esm.js.LICENSE.txt +1 -1
  25. package/dist/data-list.cjs.js.LICENSE.txt +1 -1
  26. package/dist/data-list.esm.js.LICENSE.txt +1 -1
  27. package/dist/designer.cjs.js +1 -1
  28. package/dist/designer.cjs.js.LICENSE.txt +1 -1
  29. package/dist/designer.esm.js +1 -1
  30. package/dist/designer.esm.js.LICENSE.txt +1 -1
  31. package/dist/element-mapper.cjs.js +1 -1
  32. package/dist/element-mapper.cjs.js.LICENSE.txt +1 -1
  33. package/dist/element-mapper.esm.js +1 -1
  34. package/dist/element-mapper.esm.js.LICENSE.txt +1 -1
  35. package/dist/finalresult.esm.js +1 -1
  36. package/dist/finalresult.esm.js.LICENSE.txt +1 -1
  37. package/dist/flex-card.cjs.js.LICENSE.txt +1 -1
  38. package/dist/flex-card.esm.js.LICENSE.txt +1 -1
  39. package/dist/flex-grid.cjs.js.LICENSE.txt +1 -1
  40. package/dist/flex-grid.esm.js.LICENSE.txt +1 -1
  41. package/dist/flex-row.cjs.js.LICENSE.txt +1 -1
  42. package/dist/flex-row.esm.js.LICENSE.txt +1 -1
  43. package/dist/floating-input.cjs.js.LICENSE.txt +1 -1
  44. package/dist/floating-input.esm.js.LICENSE.txt +1 -1
  45. package/dist/free.cjs.js.LICENSE.txt +1 -1
  46. package/dist/free.esm.js.LICENSE.txt +1 -1
  47. package/dist/horizontal-scroller.cjs.js.LICENSE.txt +1 -1
  48. package/dist/horizontal-scroller.esm.js.LICENSE.txt +1 -1
  49. package/dist/image-picker.cjs.js.LICENSE.txt +1 -1
  50. package/dist/image-picker.esm.js.LICENSE.txt +1 -1
  51. package/dist/image.cjs.js.LICENSE.txt +1 -1
  52. package/dist/image.esm.js.LICENSE.txt +1 -1
  53. package/dist/index.cjs.js +1 -1
  54. package/dist/index.cjs.js.LICENSE.txt +1 -1
  55. package/dist/index.d.ts +1 -1
  56. package/dist/index.esm.js +1 -1
  57. package/dist/index.esm.js.LICENSE.txt +1 -1
  58. package/dist/keyframe-animation.cjs.js.LICENSE.txt +1 -1
  59. package/dist/keyframe-animation.esm.js.LICENSE.txt +1 -1
  60. package/dist/link-getter.cjs.js.LICENSE.txt +1 -1
  61. package/dist/link-getter.esm.js.LICENSE.txt +1 -1
  62. package/dist/link.cjs.js.LICENSE.txt +1 -1
  63. package/dist/link.esm.js.LICENSE.txt +1 -1
  64. package/dist/meta-adder.cjs.js.LICENSE.txt +1 -1
  65. package/dist/meta-adder.esm.js.LICENSE.txt +1 -1
  66. package/dist/modal-2025.cjs.js.LICENSE.txt +1 -1
  67. package/dist/modal-2025.esm.js.LICENSE.txt +1 -1
  68. package/dist/multiswitcher.cjs.js.LICENSE.txt +1 -1
  69. package/dist/multiswitcher.esm.js.LICENSE.txt +1 -1
  70. package/dist/new-nav-bar.cjs.js.LICENSE.txt +1 -1
  71. package/dist/new-nav-bar.esm.js.LICENSE.txt +1 -1
  72. package/dist/picker.cjs.js +1 -1
  73. package/dist/picker.cjs.js.LICENSE.txt +1 -1
  74. package/dist/picker.esm.js +1 -1
  75. package/dist/picker.esm.js.LICENSE.txt +1 -1
  76. package/dist/progress.cjs.js.LICENSE.txt +1 -1
  77. package/dist/progress.esm.js.LICENSE.txt +1 -1
  78. package/dist/radio.cjs.js.LICENSE.txt +1 -1
  79. package/dist/radio.esm.js.LICENSE.txt +1 -1
  80. package/dist/range.cjs.js.LICENSE.txt +1 -1
  81. package/dist/range.esm.js.LICENSE.txt +1 -1
  82. package/dist/scroll-video.cjs.js.LICENSE.txt +1 -1
  83. package/dist/scroll-video.esm.js.LICENSE.txt +1 -1
  84. package/dist/side-bar.cjs.js.LICENSE.txt +1 -1
  85. package/dist/side-bar.esm.js.LICENSE.txt +1 -1
  86. package/dist/side-nav-bar.cjs.js.LICENSE.txt +1 -1
  87. package/dist/side-nav-bar.esm.js.LICENSE.txt +1 -1
  88. package/dist/simple-bar.cjs.js.LICENSE.txt +1 -1
  89. package/dist/simple-bar.esm.js.LICENSE.txt +1 -1
  90. package/dist/slider-2025.cjs.js.LICENSE.txt +1 -1
  91. package/dist/slider-2025.esm.js.LICENSE.txt +1 -1
  92. package/dist/spacer.cjs.js.LICENSE.txt +1 -1
  93. package/dist/spacer.esm.js.LICENSE.txt +1 -1
  94. package/dist/stack.cjs.js.LICENSE.txt +1 -1
  95. package/dist/stack.esm.js.LICENSE.txt +1 -1
  96. package/dist/stacker.cjs.js.LICENSE.txt +1 -1
  97. package/dist/stacker.esm.js.LICENSE.txt +1 -1
  98. package/dist/table.cjs.js.LICENSE.txt +1 -1
  99. package/dist/table.esm.js.LICENSE.txt +1 -1
  100. package/dist/text-field.cjs.js.LICENSE.txt +1 -1
  101. package/dist/text-field.esm.js.LICENSE.txt +1 -1
  102. package/dist/text.cjs.js.LICENSE.txt +1 -1
  103. package/dist/text.esm.js.LICENSE.txt +1 -1
  104. package/dist/theme.cjs.js.LICENSE.txt +1 -1
  105. package/dist/theme.esm.js.LICENSE.txt +1 -1
  106. package/dist/transform-anim.cjs.js.LICENSE.txt +1 -1
  107. package/dist/transform-anim.esm.js.LICENSE.txt +1 -1
  108. package/dist/ulist.cjs.js.LICENSE.txt +1 -1
  109. package/dist/ulist.esm.js.LICENSE.txt +1 -1
  110. package/dist/video.cjs.js.LICENSE.txt +1 -1
  111. package/dist/video.esm.js.LICENSE.txt +1 -1
  112. package/dist/wrap.cjs.js.LICENSE.txt +1 -1
  113. package/dist/wrap.esm.js.LICENSE.txt +1 -1
  114. package/dist/zoom-card.cjs.js.LICENSE.txt +1 -1
  115. package/dist/zoom-card.esm.js.LICENSE.txt +1 -1
  116. package/layout/animator.js +1 -1
  117. package/layout/audio.js +1 -1
  118. package/layout/audionew.js +1 -1
  119. package/layout/base.js +1 -1
  120. package/layout/beta-desktop-bar.js +1 -1
  121. package/layout/beta-mobile-bar.js +1 -1
  122. package/layout/button.js +1 -1
  123. package/layout/center.js +1 -1
  124. package/layout/checkbox.js +1 -1
  125. package/layout/circle.js +1 -1
  126. package/layout/code.js +1 -1
  127. package/layout/container.js +1 -1
  128. package/layout/dropdown-2025.js +1 -1
  129. package/layout/flex-card.js +1 -1
  130. package/layout/flex-grid.js +1 -1
  131. package/layout/flex-row.js +1 -1
  132. package/layout/form-components/custom.js +1 -1
  133. package/layout/form-components/data-list.js +1 -1
  134. package/layout/form-components/floating-input.js +1 -1
  135. package/layout/form-components/form-all.js +1 -1
  136. package/layout/form-components/form.js +1 -1
  137. package/layout/form-components/image-picker.js +1 -1
  138. package/layout/form-components/picker.js +37 -2
  139. package/layout/form-components/radio.js +1 -1
  140. package/layout/form-components/radiogroup.js +1 -1
  141. package/layout/form-components/range.js +1 -1
  142. package/layout/free.js +1 -1
  143. package/layout/grid-switcher.js +1 -1
  144. package/layout/grid.js +1 -1
  145. package/layout/horizontal-scroller.js +1 -1
  146. package/layout/image.js +1 -1
  147. package/layout/index.js +1 -1
  148. package/layout/link.js +1 -1
  149. package/layout/list.js +1 -1
  150. package/layout/meta-adder.js +1 -1
  151. package/layout/modal-2025.js +1 -1
  152. package/layout/morph.js +1 -1
  153. package/layout/multiswitcher.js +1 -1
  154. package/layout/nav-bar.js +1 -1
  155. package/layout/nav-factor/custom-div.js +1 -1
  156. package/layout/new-nav-bar.js +1 -1
  157. package/layout/polygon.js +1 -1
  158. package/layout/prerender-site.js +1 -1
  159. package/layout/prerender.js +1 -1
  160. package/layout/progress.js +1 -1
  161. package/layout/row.js +1 -1
  162. package/layout/scroll-video.js +1 -1
  163. package/layout/side-bar.js +1 -1
  164. package/layout/side-nav-bar.js +1 -1
  165. package/layout/simple-bar.js +1 -1
  166. package/layout/slider-2025.js +1 -1
  167. package/layout/spacer.js +1 -1
  168. package/layout/stack.js +1 -1
  169. package/layout/svg.js +1 -1
  170. package/layout/switcher.js +1 -1
  171. package/layout/table.js +1 -1
  172. package/layout/text-field.js +1 -1
  173. package/layout/text.js +1 -1
  174. package/layout/ulist.js +1 -1
  175. package/layout/video.js +1 -1
  176. package/layout/wrap.js +1 -1
  177. package/layout/zoom-card.js +1 -1
  178. package/lib/agent-surface.js +1 -1
  179. package/lib/card-getter.js +1 -1
  180. package/lib/check-page.js +45 -5
  181. package/lib/codegen.js +1 -1
  182. package/lib/data.js +1 -1
  183. package/lib/designer.js +1 -1
  184. package/lib/element-mapper.js +1 -1
  185. package/lib/element-params.generated.js +1 -1
  186. package/lib/keyframe-animation.js +1 -1
  187. package/lib/link-getter.js +1 -1
  188. package/lib/morph-node.js +1 -1
  189. package/lib/normalize-spec.js +1 -1
  190. package/lib/parse-html.js +1 -1
  191. package/lib/raster-inspect.js +1 -1
  192. package/lib/raster-ops.js +1 -1
  193. package/lib/raster-presets.js +1 -1
  194. package/lib/resolve-refs.js +1 -1
  195. package/lib/scroll-video.js +1 -1
  196. package/lib/seo.js +1 -1
  197. package/lib/stacker.js +1 -1
  198. package/lib/suggest.js +1 -1
  199. package/lib/theme.js +1 -1
  200. package/lib/transform-anim.js +1 -1
  201. package/lib/transition.js +1 -1
  202. package/lib/validate-nodes.js +1 -1
  203. package/lib/webmcp-adapter.js +71 -6
  204. package/package.json +1 -1
  205. package/schema.json +7 -0
package/layout/circle.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/code.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -52,7 +52,26 @@ class Picker extends Animator {
52
52
 
53
53
 
54
54
  for (var i = 0; i < obj.length; i++){
55
- card.appendChild(this.addNode(obj[i][0], obj[i][1]));
55
+ // An item is a [value, text] PAIR, or a plain string that is
56
+ // both. The string form was not handled and did not fail: a
57
+ // string is indexable, so `obj[i][0]` and `obj[i][1]` were its
58
+ // first two CHARACTERS. `items: ["Sales", "Support"]` rendered
59
+ // two options both valued "S", reading "a" and "u".
60
+ //
61
+ // It stayed hidden because the two halves of the library
62
+ // disagreed in opposite directions. `deriveSurface` builds a
63
+ // picker's enum from `items.filter(i => typeof i === "string")`
64
+ // — it requires the STRING form, and a unit test pins it — while
65
+ // this loop required the PAIR form, so no value of `items`
66
+ // satisfied both. The agent-facing manifest therefore advertised
67
+ // `enum: ["Sales", "Support"]` over a control whose only
68
+ // selectable values were "S" and "S", and an agent submitting
69
+ // "Sales" had the field silently dropped from the payload.
70
+ const it = obj[i];
71
+ const pair = (typeof it === "string" || typeof it === "number")
72
+ ? [String(it), String(it)]
73
+ : [it && it[0], it && it[1]];
74
+ card.appendChild(this.addNode(pair[0], pair[1]));
56
75
  }
57
76
 
58
77
  /*card.appendChild(this.addNode("audi", "Audi"));
@@ -80,6 +99,22 @@ class Picker extends Animator {
80
99
  obj.radius && (this.el.style.borderRadius = obj.radius);
81
100
  obj.background && (this.el.style.background = obj.background);
82
101
 
102
+ // A <select> with no adjacent text has no accessible name, and this
103
+ // component had no way to be given one. `label` already reached here
104
+ // — `elOpts` forwards it — and nothing read it, so every picker on
105
+ // every page reported CONTROL_WITHOUT_LABEL from `check_page` and the
106
+ // finding was UNREPAIRABLE through the descriptor vocabulary: there
107
+ // was no spelling of the fix. Declared and ignored, which is the
108
+ // failure this library spent six stages removing.
109
+ //
110
+ // `label` is the accessible name here, as it is on `input`; `title`
111
+ // is accepted too, since FloatingInput calls it that and a caller
112
+ // moving between the two form types should not have to notice.
113
+ const named = obj.label !== undefined ? obj.label : obj.title;
114
+ if (named !== undefined && named !== null && !this.el.getAttribute("aria-label")) {
115
+ this.el.setAttribute("aria-label", String(named));
116
+ }
117
+
83
118
  // Same dispatch Text and Wrapper use, so a Picker can be given a
84
119
  // border, height, font size or cursor through set() instead of the
85
120
  // caller styling the <select> by hand.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/grid.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/nav-bar.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/svg.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/layout/wrap.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -100,6 +100,32 @@ const IN_PAGE = () => {
100
100
  });
101
101
  };
102
102
 
103
+ /**
104
+ * A name assistive technology can announce.
105
+ *
106
+ * Was `aria-label` alone, which is only one of the four ways to give one
107
+ * and the least used. A control correctly labelled by a `<label for>` —
108
+ * the ordinary HTML way — was reported as unnamed, and a false finding
109
+ * sends a repair at something that was never broken, which this file
110
+ * argues elsewhere is worse than a miss.
111
+ */
112
+ const hasName = (el) => {
113
+ if ((el.getAttribute("aria-label") || "").trim()) return true;
114
+ if ((el.getAttribute("title") || "").trim()) return true;
115
+ const by = (el.getAttribute("aria-labelledby") || "").trim();
116
+ if (by && by.split(/\s+/).some((id) => {
117
+ const t = document.getElementById(id);
118
+ return t && (t.textContent || "").trim();
119
+ })) return true;
120
+ if (el.id) {
121
+ const l = document.querySelector(`label[for="${CSS.escape(el.id)}"]`);
122
+ if (l && (l.textContent || "").trim()) return true;
123
+ }
124
+ const wrap = el.closest && el.closest("label");
125
+ if (wrap && (wrap.textContent || "").trim()) return true;
126
+ return false;
127
+ };
128
+
103
129
  const all = [...document.body.querySelectorAll("*")];
104
130
  const vw = window.innerWidth;
105
131
 
@@ -143,16 +169,30 @@ const IN_PAGE = () => {
143
169
  }
144
170
 
145
171
  // 5. A target too small to hit. 24px is the WCAG 2.2 AA minimum.
172
+ //
173
+ // `select` and `textarea` were both missing from this set, so neither
174
+ // check below ever ran on one. A picker could not be given an
175
+ // accessible name at all — `label` reached the component and nothing
176
+ // read it — and no report said so, because the checker was not
177
+ // looking. Two blind spots that hid each other.
146
178
  const interactive = tag === "a" || tag === "button" ||
147
- (tag === "input" && el.type !== "hidden") || el.getAttribute("role") === "button";
179
+ (tag === "input" && el.type !== "hidden") ||
180
+ tag === "select" || tag === "textarea" ||
181
+ el.getAttribute("role") === "button";
148
182
  if (interactive && r.width > 0 && (r.width < 24 || r.height < 24)) {
149
183
  add("TAP_TARGET_TOO_SMALL", el, `${Math.round(r.width)}x${Math.round(r.height)}`,
150
184
  "below the 24x24 minimum");
151
185
  }
152
186
 
153
187
  // 6. A control with nothing to announce.
154
- if (interactive && !(el.textContent || "").trim() &&
155
- !el.getAttribute("aria-label") && !el.querySelector("img[alt]:not([alt=''])")) {
188
+ //
189
+ // A <select>'s own text is its OPTIONS and a <textarea>'s is its
190
+ // VALUE. Neither names the control, so the textContent shortcut that
191
+ // clears a button by its caption must not clear these.
192
+ const ownText = (tag === "select" || tag === "textarea")
193
+ ? "" : (el.textContent || "").trim();
194
+ if (interactive && !ownText && !hasName(el) &&
195
+ !el.querySelector("img[alt]:not([alt=''])")) {
156
196
  add("CONTROL_WITHOUT_LABEL", el, tag, "no text and no accessible name");
157
197
  }
158
198
  }
@@ -235,7 +275,7 @@ const REPAIRS = {
235
275
  valid: ["at least 24x24 CSS pixels, per WCAG 2.2 AA target size (minimum)"],
236
276
  },
237
277
  CONTROL_WITHOUT_LABEL: {
238
- suggestions: [`label: "<what the field is for>" (labelInput)`,
278
+ suggestions: [`label: "<what the field is for>" (input, labelInput, picker)`,
239
279
  `text: "<what the control does>" (button, a)`],
240
280
  valid: ["every control needs a name assistive technology can announce; " +
241
281
  "a placeholder is not one"],
package/lib/codegen.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
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.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */
package/lib/morph-node.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * nodality v1.3.1
2
+ * nodality v1.3.2
3
3
  * (c) 2026 Filip Vabrousek
4
4
  * License: MIT
5
5
  */