@lion/ui 0.5.3 → 0.5.5

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 (402) hide show
  1. package/components/checkbox-group/src/LionCheckboxIndeterminate.js +17 -2
  2. package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +3 -0
  3. package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +435 -396
  4. package/components/form-core/src/FormControlMixin.js +17 -1
  5. package/components/form-core/src/choice-group/ChoiceGroupMixin.js +10 -1
  6. package/components/form-core/src/form-group/FormGroupMixin.js +5 -6
  7. package/components/form-core/src/validate/ValidateMixin.js +10 -0
  8. package/components/form-core/src/validate/Validator.js +6 -3
  9. package/components/form-core/test/FormControlMixin.test.js +39 -20
  10. package/components/form-core/test-suites/FormRegistrationMixins.suite.js +7 -7
  11. package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +0 -47
  12. package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +21 -3
  13. package/components/form-core/types/FormControlMixinTypes.ts +2 -0
  14. package/components/form-core/types/validate/ValidateMixinTypes.ts +2 -0
  15. package/components/form-core/types/validate/validate.ts +2 -2
  16. package/components/input-file/src/LionInputFile.js +7 -1
  17. package/components/input-range/src/LionInputRange.js +36 -4
  18. package/components/input-range/src/localizeNamespaceLoader.js +75 -0
  19. package/components/input-range/test/lion-input-range.test.js +6 -6
  20. package/components/input-range/translations/bg-BG.js +5 -0
  21. package/components/input-range/translations/bg.js +4 -0
  22. package/components/input-range/translations/cs-CZ.js +5 -0
  23. package/components/input-range/translations/cs.js +4 -0
  24. package/components/input-range/translations/de-DE.js +5 -0
  25. package/components/input-range/translations/de.js +4 -0
  26. package/components/input-range/translations/en-AU.js +5 -0
  27. package/components/input-range/translations/en-GB.js +5 -0
  28. package/components/input-range/translations/en-PH.js +5 -0
  29. package/components/input-range/translations/en-US.js +5 -0
  30. package/components/input-range/translations/en.js +4 -0
  31. package/components/input-range/translations/es-ES.js +5 -0
  32. package/components/input-range/translations/es.js +4 -0
  33. package/components/input-range/translations/fr-BE.js +5 -0
  34. package/components/input-range/translations/fr-FR.js +5 -0
  35. package/components/input-range/translations/fr.js +4 -0
  36. package/components/input-range/translations/hu-HU.js +5 -0
  37. package/components/input-range/translations/hu.js +4 -0
  38. package/components/input-range/translations/it-IT.js +5 -0
  39. package/components/input-range/translations/it.js +4 -0
  40. package/components/input-range/translations/nl-BE.js +5 -0
  41. package/components/input-range/translations/nl-NL.js +5 -0
  42. package/components/input-range/translations/nl.js +4 -0
  43. package/components/input-range/translations/pl-PL.js +5 -0
  44. package/components/input-range/translations/pl.js +4 -0
  45. package/components/input-range/translations/ro-RO.js +5 -0
  46. package/components/input-range/translations/ro.js +4 -0
  47. package/components/input-range/translations/ru-RU.js +5 -0
  48. package/components/input-range/translations/ru.js +4 -0
  49. package/components/input-range/translations/sk-SK.js +5 -0
  50. package/components/input-range/translations/sk.js +4 -0
  51. package/components/input-range/translations/uk-UA.js +5 -0
  52. package/components/input-range/translations/uk.js +4 -0
  53. package/components/input-range/translations/zh-CN.js +5 -0
  54. package/components/input-range/translations/zh.js +4 -0
  55. package/components/input-stepper/src/LionInputStepper.js +53 -33
  56. package/components/input-stepper/src/localizeNamespaceLoader.js +75 -0
  57. package/components/input-stepper/test/lion-input-stepper.test.js +61 -8
  58. package/components/input-stepper/translations/bg-BG.js +5 -0
  59. package/components/input-stepper/translations/bg.js +4 -0
  60. package/components/input-stepper/translations/cs-CZ.js +5 -0
  61. package/components/input-stepper/translations/cs.js +4 -0
  62. package/components/input-stepper/translations/de-DE.js +5 -0
  63. package/components/input-stepper/translations/de.js +4 -0
  64. package/components/input-stepper/translations/en-AU.js +5 -0
  65. package/components/input-stepper/translations/en-GB.js +5 -0
  66. package/components/input-stepper/translations/en-US.js +5 -0
  67. package/components/input-stepper/translations/en.js +4 -0
  68. package/components/input-stepper/translations/es-ES.js +5 -0
  69. package/components/input-stepper/translations/es.js +4 -0
  70. package/components/input-stepper/translations/fr-BE.js +5 -0
  71. package/components/input-stepper/translations/fr-FR.js +5 -0
  72. package/components/input-stepper/translations/fr.js +4 -0
  73. package/components/input-stepper/translations/hu-HU.js +5 -0
  74. package/components/input-stepper/translations/hu.js +4 -0
  75. package/components/input-stepper/translations/it-IT.js +5 -0
  76. package/components/input-stepper/translations/it.js +4 -0
  77. package/components/input-stepper/translations/nl-BE.js +5 -0
  78. package/components/input-stepper/translations/nl-NL.js +5 -0
  79. package/components/input-stepper/translations/nl.js +4 -0
  80. package/components/input-stepper/translations/pl-PL.js +5 -0
  81. package/components/input-stepper/translations/pl.js +4 -0
  82. package/components/input-stepper/translations/ro-RO.js +5 -0
  83. package/components/input-stepper/translations/ro.js +4 -0
  84. package/components/input-stepper/translations/ru-RU.js +5 -0
  85. package/components/input-stepper/translations/ru.js +4 -0
  86. package/components/input-stepper/translations/sk-SK.js +5 -0
  87. package/components/input-stepper/translations/sk.js +4 -0
  88. package/components/input-stepper/translations/uk-UA.js +5 -0
  89. package/components/input-stepper/translations/uk.js +4 -0
  90. package/components/input-stepper/translations/zh.js +4 -0
  91. package/components/input-tel-dropdown/src/LionInputTelDropdown.js +11 -3
  92. package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +110 -2
  93. package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +22 -0
  94. package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +1 -38
  95. package/components/localize/src/LocalizeMixin.js +2 -2
  96. package/components/overlays/src/OverlayController.js +1 -1
  97. package/components/select/src/LionSelect.js +5 -0
  98. package/components/validate-messages/src/getLocalizedMessage.js +122 -0
  99. package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -179
  100. package/components/validate-messages/src/per-entrypoint/README.md +16 -0
  101. package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +22 -0
  102. package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +77 -0
  103. package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +39 -0
  104. package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +105 -0
  105. package/components/validate-messages/translations/bg.js +4 -0
  106. package/components/validate-messages/translations/cs.js +4 -0
  107. package/components/validate-messages/translations/de.js +4 -0
  108. package/components/validate-messages/translations/en.js +5 -1
  109. package/components/validate-messages/translations/es.js +4 -0
  110. package/components/validate-messages/translations/fr.js +4 -0
  111. package/components/validate-messages/translations/hu.js +4 -0
  112. package/components/validate-messages/translations/it.js +4 -0
  113. package/components/validate-messages/translations/nl.js +4 -0
  114. package/components/validate-messages/translations/pl.js +4 -0
  115. package/components/validate-messages/translations/ro.js +4 -0
  116. package/components/validate-messages/translations/ru.js +4 -0
  117. package/components/validate-messages/translations/sk.js +4 -0
  118. package/components/validate-messages/translations/uk.js +4 -0
  119. package/components/validate-messages/translations/zh.js +4 -0
  120. package/custom-elements.json +6018 -1840
  121. package/dist-types/components/checkbox-group/src/LionCheckboxIndeterminate.d.ts +7 -1
  122. package/dist-types/components/checkbox-group/src/LionCheckboxIndeterminate.d.ts.map +1 -1
  123. package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts.map +1 -1
  124. package/dist-types/components/form-core/src/FormControlMixin.d.ts.map +1 -1
  125. package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts +1 -0
  126. package/dist-types/components/form-core/src/choice-group/ChoiceGroupMixin.d.ts.map +1 -1
  127. package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
  128. package/dist-types/components/form-core/src/validate/ValidateMixin.d.ts +1 -0
  129. package/dist-types/components/form-core/src/validate/ValidateMixin.d.ts.map +1 -1
  130. package/dist-types/components/form-core/src/validate/Validator.d.ts +5 -2
  131. package/dist-types/components/form-core/src/validate/Validator.d.ts.map +1 -1
  132. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.d.ts.map +1 -1
  133. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts.map +1 -1
  134. package/dist-types/components/form-core/types/FormControlMixinTypes.d.ts +1 -0
  135. package/dist-types/components/form-core/types/FormControlMixinTypes.d.ts.map +1 -1
  136. package/dist-types/components/form-core/types/validate/ValidateMixinTypes.d.ts +1 -0
  137. package/dist-types/components/form-core/types/validate/ValidateMixinTypes.d.ts.map +1 -1
  138. package/dist-types/components/form-core/types/validate/validate.d.ts +2 -2
  139. package/dist-types/components/input-file/src/LionInputFile.d.ts.map +1 -1
  140. package/dist-types/components/input-range/src/LionInputRange.d.ts +7 -1
  141. package/dist-types/components/input-range/src/LionInputRange.d.ts.map +1 -1
  142. package/dist-types/components/input-range/src/localizeNamespaceLoader.d.ts +2 -0
  143. package/dist-types/components/input-range/src/localizeNamespaceLoader.d.ts.map +1 -0
  144. package/dist-types/components/input-range/translations/bg-BG.d.ts +6 -0
  145. package/dist-types/components/input-range/translations/bg-BG.d.ts.map +1 -0
  146. package/dist-types/components/input-range/translations/bg.d.ts +6 -0
  147. package/dist-types/components/input-range/translations/bg.d.ts.map +1 -0
  148. package/dist-types/components/input-range/translations/cs-CZ.d.ts +6 -0
  149. package/dist-types/components/input-range/translations/cs-CZ.d.ts.map +1 -0
  150. package/dist-types/components/input-range/translations/cs.d.ts +6 -0
  151. package/dist-types/components/input-range/translations/cs.d.ts.map +1 -0
  152. package/dist-types/components/input-range/translations/de-DE.d.ts +6 -0
  153. package/dist-types/components/input-range/translations/de-DE.d.ts.map +1 -0
  154. package/dist-types/components/input-range/translations/de.d.ts +6 -0
  155. package/dist-types/components/input-range/translations/de.d.ts.map +1 -0
  156. package/dist-types/components/input-range/translations/en-AU.d.ts +6 -0
  157. package/dist-types/components/input-range/translations/en-AU.d.ts.map +1 -0
  158. package/dist-types/components/input-range/translations/en-GB.d.ts +6 -0
  159. package/dist-types/components/input-range/translations/en-GB.d.ts.map +1 -0
  160. package/dist-types/components/input-range/translations/en-PH.d.ts +6 -0
  161. package/dist-types/components/input-range/translations/en-PH.d.ts.map +1 -0
  162. package/dist-types/components/input-range/translations/en-US.d.ts +6 -0
  163. package/dist-types/components/input-range/translations/en-US.d.ts.map +1 -0
  164. package/dist-types/components/input-range/translations/en.d.ts +6 -0
  165. package/dist-types/components/input-range/translations/en.d.ts.map +1 -0
  166. package/dist-types/components/input-range/translations/es-ES.d.ts +6 -0
  167. package/dist-types/components/input-range/translations/es-ES.d.ts.map +1 -0
  168. package/dist-types/components/input-range/translations/es.d.ts +6 -0
  169. package/dist-types/components/input-range/translations/es.d.ts.map +1 -0
  170. package/dist-types/components/input-range/translations/fr-BE.d.ts +6 -0
  171. package/dist-types/components/input-range/translations/fr-BE.d.ts.map +1 -0
  172. package/dist-types/components/input-range/translations/fr-FR.d.ts +6 -0
  173. package/dist-types/components/input-range/translations/fr-FR.d.ts.map +1 -0
  174. package/dist-types/components/input-range/translations/fr.d.ts +6 -0
  175. package/dist-types/components/input-range/translations/fr.d.ts.map +1 -0
  176. package/dist-types/components/input-range/translations/hu-HU.d.ts +6 -0
  177. package/dist-types/components/input-range/translations/hu-HU.d.ts.map +1 -0
  178. package/dist-types/components/input-range/translations/hu.d.ts +6 -0
  179. package/dist-types/components/input-range/translations/hu.d.ts.map +1 -0
  180. package/dist-types/components/input-range/translations/it-IT.d.ts +6 -0
  181. package/dist-types/components/input-range/translations/it-IT.d.ts.map +1 -0
  182. package/dist-types/components/input-range/translations/it.d.ts +6 -0
  183. package/dist-types/components/input-range/translations/it.d.ts.map +1 -0
  184. package/dist-types/components/input-range/translations/nl-BE.d.ts +6 -0
  185. package/dist-types/components/input-range/translations/nl-BE.d.ts.map +1 -0
  186. package/dist-types/components/input-range/translations/nl-NL.d.ts +6 -0
  187. package/dist-types/components/input-range/translations/nl-NL.d.ts.map +1 -0
  188. package/dist-types/components/input-range/translations/nl.d.ts +6 -0
  189. package/dist-types/components/input-range/translations/nl.d.ts.map +1 -0
  190. package/dist-types/components/input-range/translations/pl-PL.d.ts +6 -0
  191. package/dist-types/components/input-range/translations/pl-PL.d.ts.map +1 -0
  192. package/dist-types/components/input-range/translations/pl.d.ts +6 -0
  193. package/dist-types/components/input-range/translations/pl.d.ts.map +1 -0
  194. package/dist-types/components/input-range/translations/ro-RO.d.ts +6 -0
  195. package/dist-types/components/input-range/translations/ro-RO.d.ts.map +1 -0
  196. package/dist-types/components/input-range/translations/ro.d.ts +6 -0
  197. package/dist-types/components/input-range/translations/ro.d.ts.map +1 -0
  198. package/dist-types/components/input-range/translations/ru-RU.d.ts +6 -0
  199. package/dist-types/components/input-range/translations/ru-RU.d.ts.map +1 -0
  200. package/dist-types/components/input-range/translations/ru.d.ts +6 -0
  201. package/dist-types/components/input-range/translations/ru.d.ts.map +1 -0
  202. package/dist-types/components/input-range/translations/sk-SK.d.ts +6 -0
  203. package/dist-types/components/input-range/translations/sk-SK.d.ts.map +1 -0
  204. package/dist-types/components/input-range/translations/sk.d.ts +6 -0
  205. package/dist-types/components/input-range/translations/sk.d.ts.map +1 -0
  206. package/dist-types/components/input-range/translations/uk-UA.d.ts +6 -0
  207. package/dist-types/components/input-range/translations/uk-UA.d.ts.map +1 -0
  208. package/dist-types/components/input-range/translations/uk.d.ts +6 -0
  209. package/dist-types/components/input-range/translations/uk.d.ts.map +1 -0
  210. package/dist-types/components/input-range/translations/zh-CN.d.ts +6 -0
  211. package/dist-types/components/input-range/translations/zh-CN.d.ts.map +1 -0
  212. package/dist-types/components/input-range/translations/zh.d.ts +6 -0
  213. package/dist-types/components/input-range/translations/zh.d.ts.map +1 -0
  214. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts +22 -3
  215. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts.map +1 -1
  216. package/dist-types/components/input-stepper/src/localizeNamespaceLoader.d.ts +2 -0
  217. package/dist-types/components/input-stepper/src/localizeNamespaceLoader.d.ts.map +1 -0
  218. package/dist-types/components/input-stepper/translations/bg-BG.d.ts +6 -0
  219. package/dist-types/components/input-stepper/translations/bg-BG.d.ts.map +1 -0
  220. package/dist-types/components/input-stepper/translations/bg.d.ts +6 -0
  221. package/dist-types/components/input-stepper/translations/bg.d.ts.map +1 -0
  222. package/dist-types/components/input-stepper/translations/cs-CZ.d.ts +6 -0
  223. package/dist-types/components/input-stepper/translations/cs-CZ.d.ts.map +1 -0
  224. package/dist-types/components/input-stepper/translations/cs.d.ts +6 -0
  225. package/dist-types/components/input-stepper/translations/cs.d.ts.map +1 -0
  226. package/dist-types/components/input-stepper/translations/de-DE.d.ts +6 -0
  227. package/dist-types/components/input-stepper/translations/de-DE.d.ts.map +1 -0
  228. package/dist-types/components/input-stepper/translations/de.d.ts +6 -0
  229. package/dist-types/components/input-stepper/translations/de.d.ts.map +1 -0
  230. package/dist-types/components/input-stepper/translations/en-AU.d.ts +6 -0
  231. package/dist-types/components/input-stepper/translations/en-AU.d.ts.map +1 -0
  232. package/dist-types/components/input-stepper/translations/en-GB.d.ts +6 -0
  233. package/dist-types/components/input-stepper/translations/en-GB.d.ts.map +1 -0
  234. package/dist-types/components/input-stepper/translations/en-US.d.ts +6 -0
  235. package/dist-types/components/input-stepper/translations/en-US.d.ts.map +1 -0
  236. package/dist-types/components/input-stepper/translations/en.d.ts +6 -0
  237. package/dist-types/components/input-stepper/translations/en.d.ts.map +1 -0
  238. package/dist-types/components/input-stepper/translations/es-ES.d.ts +6 -0
  239. package/dist-types/components/input-stepper/translations/es-ES.d.ts.map +1 -0
  240. package/dist-types/components/input-stepper/translations/es.d.ts +6 -0
  241. package/dist-types/components/input-stepper/translations/es.d.ts.map +1 -0
  242. package/dist-types/components/input-stepper/translations/fr-BE.d.ts +6 -0
  243. package/dist-types/components/input-stepper/translations/fr-BE.d.ts.map +1 -0
  244. package/dist-types/components/input-stepper/translations/fr-FR.d.ts +6 -0
  245. package/dist-types/components/input-stepper/translations/fr-FR.d.ts.map +1 -0
  246. package/dist-types/components/input-stepper/translations/fr.d.ts +6 -0
  247. package/dist-types/components/input-stepper/translations/fr.d.ts.map +1 -0
  248. package/dist-types/components/input-stepper/translations/hu-HU.d.ts +6 -0
  249. package/dist-types/components/input-stepper/translations/hu-HU.d.ts.map +1 -0
  250. package/dist-types/components/input-stepper/translations/hu.d.ts +6 -0
  251. package/dist-types/components/input-stepper/translations/hu.d.ts.map +1 -0
  252. package/dist-types/components/input-stepper/translations/it-IT.d.ts +6 -0
  253. package/dist-types/components/input-stepper/translations/it-IT.d.ts.map +1 -0
  254. package/dist-types/components/input-stepper/translations/it.d.ts +6 -0
  255. package/dist-types/components/input-stepper/translations/it.d.ts.map +1 -0
  256. package/dist-types/components/input-stepper/translations/nl-BE.d.ts +6 -0
  257. package/dist-types/components/input-stepper/translations/nl-BE.d.ts.map +1 -0
  258. package/dist-types/components/input-stepper/translations/nl-NL.d.ts +6 -0
  259. package/dist-types/components/input-stepper/translations/nl-NL.d.ts.map +1 -0
  260. package/dist-types/components/input-stepper/translations/nl.d.ts +6 -0
  261. package/dist-types/components/input-stepper/translations/nl.d.ts.map +1 -0
  262. package/dist-types/components/input-stepper/translations/pl-PL.d.ts +6 -0
  263. package/dist-types/components/input-stepper/translations/pl-PL.d.ts.map +1 -0
  264. package/dist-types/components/input-stepper/translations/pl.d.ts +6 -0
  265. package/dist-types/components/input-stepper/translations/pl.d.ts.map +1 -0
  266. package/dist-types/components/input-stepper/translations/ro-RO.d.ts +6 -0
  267. package/dist-types/components/input-stepper/translations/ro-RO.d.ts.map +1 -0
  268. package/dist-types/components/input-stepper/translations/ro.d.ts +6 -0
  269. package/dist-types/components/input-stepper/translations/ro.d.ts.map +1 -0
  270. package/dist-types/components/input-stepper/translations/ru-RU.d.ts +6 -0
  271. package/dist-types/components/input-stepper/translations/ru-RU.d.ts.map +1 -0
  272. package/dist-types/components/input-stepper/translations/ru.d.ts +6 -0
  273. package/dist-types/components/input-stepper/translations/ru.d.ts.map +1 -0
  274. package/dist-types/components/input-stepper/translations/sk-SK.d.ts +6 -0
  275. package/dist-types/components/input-stepper/translations/sk-SK.d.ts.map +1 -0
  276. package/dist-types/components/input-stepper/translations/sk.d.ts +6 -0
  277. package/dist-types/components/input-stepper/translations/sk.d.ts.map +1 -0
  278. package/dist-types/components/input-stepper/translations/uk-UA.d.ts +6 -0
  279. package/dist-types/components/input-stepper/translations/uk-UA.d.ts.map +1 -0
  280. package/dist-types/components/input-stepper/translations/uk.d.ts +6 -0
  281. package/dist-types/components/input-stepper/translations/uk.d.ts.map +1 -0
  282. package/dist-types/components/input-stepper/translations/zh.d.ts +6 -0
  283. package/dist-types/components/input-stepper/translations/zh.d.ts.map +1 -0
  284. package/dist-types/components/input-tel-dropdown/src/LionInputTelDropdown.d.ts.map +1 -1
  285. package/dist-types/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.d.ts +12 -0
  286. package/dist-types/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.d.ts.map +1 -0
  287. package/dist-types/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.d.ts.map +1 -1
  288. package/dist-types/components/select/src/LionSelect.d.ts.map +1 -1
  289. package/dist-types/components/validate-messages/src/getLocalizedMessage.d.ts +13 -0
  290. package/dist-types/components/validate-messages/src/getLocalizedMessage.d.ts.map +1 -0
  291. package/dist-types/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.d.ts.map +1 -1
  292. package/dist-types/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.d.ts +9 -0
  293. package/dist-types/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.d.ts.map +1 -0
  294. package/dist-types/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.d.ts +9 -0
  295. package/dist-types/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.d.ts.map +1 -0
  296. package/dist-types/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.d.ts +9 -0
  297. package/dist-types/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.d.ts.map +1 -0
  298. package/dist-types/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.d.ts +4 -0
  299. package/dist-types/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.d.ts.map +1 -0
  300. package/dist-types/components/validate-messages/translations/bg-BG.d.ts +4 -0
  301. package/dist-types/components/validate-messages/translations/bg.d.ts +6 -0
  302. package/dist-types/components/validate-messages/translations/cs-CZ.d.ts +4 -0
  303. package/dist-types/components/validate-messages/translations/cs.d.ts +6 -0
  304. package/dist-types/components/validate-messages/translations/de-DE.d.ts +4 -0
  305. package/dist-types/components/validate-messages/translations/de.d.ts +6 -0
  306. package/dist-types/components/validate-messages/translations/en-AU.d.ts +4 -0
  307. package/dist-types/components/validate-messages/translations/en-GB.d.ts +4 -0
  308. package/dist-types/components/validate-messages/translations/en-PH.d.ts +4 -0
  309. package/dist-types/components/validate-messages/translations/en-US.d.ts +4 -0
  310. package/dist-types/components/validate-messages/translations/en.d.ts +6 -0
  311. package/dist-types/components/validate-messages/translations/es-ES.d.ts +4 -0
  312. package/dist-types/components/validate-messages/translations/es.d.ts +6 -0
  313. package/dist-types/components/validate-messages/translations/fr-BE.d.ts +4 -0
  314. package/dist-types/components/validate-messages/translations/fr-FR.d.ts +4 -0
  315. package/dist-types/components/validate-messages/translations/fr.d.ts +6 -0
  316. package/dist-types/components/validate-messages/translations/hu-HU.d.ts +4 -0
  317. package/dist-types/components/validate-messages/translations/hu.d.ts +6 -0
  318. package/dist-types/components/validate-messages/translations/it-IT.d.ts +4 -0
  319. package/dist-types/components/validate-messages/translations/it.d.ts +6 -0
  320. package/dist-types/components/validate-messages/translations/nl-BE.d.ts +4 -0
  321. package/dist-types/components/validate-messages/translations/nl-NL.d.ts +4 -0
  322. package/dist-types/components/validate-messages/translations/nl.d.ts +6 -0
  323. package/dist-types/components/validate-messages/translations/pl-PL.d.ts +4 -0
  324. package/dist-types/components/validate-messages/translations/pl.d.ts +6 -0
  325. package/dist-types/components/validate-messages/translations/ro-RO.d.ts +4 -0
  326. package/dist-types/components/validate-messages/translations/ro.d.ts +6 -0
  327. package/dist-types/components/validate-messages/translations/ru-RU.d.ts +4 -0
  328. package/dist-types/components/validate-messages/translations/ru.d.ts +6 -0
  329. package/dist-types/components/validate-messages/translations/sk-SK.d.ts +4 -0
  330. package/dist-types/components/validate-messages/translations/sk.d.ts +6 -0
  331. package/dist-types/components/validate-messages/translations/uk-UA.d.ts +4 -0
  332. package/dist-types/components/validate-messages/translations/uk.d.ts +6 -0
  333. package/dist-types/components/validate-messages/translations/zh.d.ts +6 -0
  334. package/dist-types/exports/input-tel-dropdown-test-helpers.d.ts +2 -0
  335. package/dist-types/exports/input-tel-dropdown-test-helpers.d.ts.map +1 -0
  336. package/dist-types/exports/validate-messages-no-side-effects.d.ts +3 -0
  337. package/dist-types/tsconfig.tsbuildinfo +1 -1
  338. package/docs/components/checkbox-group/overview.md +2 -2
  339. package/docs/components/collapsible/overview.md +1 -1
  340. package/docs/components/combobox/overview.md +1 -1
  341. package/docs/components/combobox/use-cases.md +1 -1
  342. package/docs/components/dialog/overview.md +1 -1
  343. package/docs/components/fieldset/overview.md +5 -5
  344. package/docs/components/form/overview.md +3 -3
  345. package/docs/components/icon/use-cases.md +1 -1
  346. package/docs/components/input/overview.md +1 -1
  347. package/docs/components/input-amount/overview.md +3 -3
  348. package/docs/components/input-date/overview.md +3 -3
  349. package/docs/components/input-datepicker/overview.md +5 -5
  350. package/docs/components/input-email/overview.md +2 -2
  351. package/docs/components/input-file/overview.md +1 -1
  352. package/docs/components/input-file/use-cases.md +8 -8
  353. package/docs/components/input-iban/overview.md +2 -2
  354. package/docs/components/input-range/overview.md +4 -6
  355. package/docs/components/input-range/use-cases.md +40 -48
  356. package/docs/components/input-stepper/overview.md +8 -8
  357. package/docs/components/input-stepper/use-cases.md +30 -21
  358. package/docs/components/input-tel/overview.md +1 -1
  359. package/docs/components/input-tel/use-cases.md +6 -6
  360. package/docs/components/input-tel-dropdown/overview.md +1 -1
  361. package/docs/components/listbox/use-cases.md +90 -95
  362. package/docs/components/radio-group/overview.md +3 -3
  363. package/docs/components/select/use-cases.md +34 -33
  364. package/docs/components/select-rich/use-cases.md +1 -1
  365. package/docs/components/tabs/examples.md +1 -1
  366. package/docs/fundamentals/index.md +4 -4
  367. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +1 -1
  368. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +1 -1
  369. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +1 -1
  370. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +1 -1
  371. package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
  372. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  373. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  374. package/docs/fundamentals/rationales/accessibility.md +1 -1
  375. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  376. package/docs/fundamentals/systems/core/overview.md +1 -1
  377. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  378. package/docs/fundamentals/systems/form/model-value.md +1 -1
  379. package/docs/fundamentals/systems/form/overview.md +28 -28
  380. package/docs/fundamentals/systems/form/styling.md +34 -39
  381. package/docs/fundamentals/systems/form/validate.md +7 -4
  382. package/docs/fundamentals/systems/localize/overview.md +4 -4
  383. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  384. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  385. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  386. package/docs/fundamentals/tools/ajax/overview.md +2 -1
  387. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  388. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  389. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  390. package/docs/guides/how-to/create-a-form.md +4 -4
  391. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  392. package/docs/guides/index.md +8 -8
  393. package/docs/guides/principles/index.md +5 -5
  394. package/docs/guides/principles/styling.md +1 -1
  395. package/exports/input-tel-dropdown-test-helpers.js +1 -0
  396. package/exports/validate-messages-no-side-effects.js +3 -0
  397. package/input-tel-dropdown-test-helpers.js +1 -0
  398. package/package.json +3 -1
  399. package/validate-messages-no-side-effects.js +3 -0
  400. package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.js +0 -51
  401. package/dist-types/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.d.ts +0 -2
  402. package/dist-types/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.d.ts.map +0 -1
@@ -276,6 +276,10 @@ const FormControlMixinImplementation = superclass =>
276
276
  updated(changedProperties) {
277
277
  super.updated(changedProperties);
278
278
 
279
+ if (changedProperties.has('disabled')) {
280
+ this._inputNode?.setAttribute('aria-disabled', this.disabled.toString());
281
+ }
282
+
279
283
  if (changedProperties.has('_ariaLabelledNodes')) {
280
284
  this.__reflectAriaAttr(
281
285
  'aria-labelledby',
@@ -390,8 +394,20 @@ const FormControlMixinImplementation = superclass =>
390
394
  const insideNodes = nodes.filter(n => this.contains(n));
391
395
  const outsideNodes = nodes.filter(n => !this.contains(n));
392
396
 
397
+ const insideSlots = insideNodes.map(n => n.assignedSlot || n);
398
+ const orderedInsideSlots = [...getAriaElementsInRightDomOrder(insideSlots)];
399
+ /** @type {Element[]} */
400
+ const orderedInsideNodes = [];
401
+ orderedInsideSlots.forEach(assignedNode => {
402
+ insideNodes.forEach(node => {
403
+ // @ts-ignore
404
+ if (assignedNode.name === node.slot) {
405
+ orderedInsideNodes.push(node);
406
+ }
407
+ });
408
+ });
393
409
  // eslint-disable-next-line no-param-reassign
394
- nodes = [...getAriaElementsInRightDomOrder(insideNodes), ...outsideNodes];
410
+ nodes = [...orderedInsideNodes, ...outsideNodes];
395
411
  }
396
412
  const string = nodes.map(n => n.id).join(' ');
397
413
  this._inputNode.setAttribute(attrName, string);
@@ -1,6 +1,7 @@
1
1
  import { dedupeMixin } from '@open-wc/dedupe-mixin';
2
2
  import { FormRegistrarMixin } from '../registration/FormRegistrarMixin.js';
3
3
  import { InteractionStateMixin } from '../InteractionStateMixin.js';
4
+ import { ValidateMixin } from '../validate/ValidateMixin.js';
4
5
 
5
6
  /**
6
7
  * @typedef {import('../../types/choice-group/ChoiceGroupMixinTypes.js').ChoiceGroupMixin} ChoiceGroupMixin
@@ -8,6 +9,7 @@ import { InteractionStateMixin } from '../InteractionStateMixin.js';
8
9
  * @typedef {import('../../types/registration/FormRegistrarMixinTypes.js').ElementWithParentFormGroup} ElementWithParentFormGroup
9
10
  * @typedef {import('../../types/form-group/FormGroupMixinTypes.js').FormControl} FormControl
10
11
  * @typedef {import('../../types/choice-group/ChoiceInputMixinTypes.js').ChoiceInputHost} ChoiceInputHost
12
+ * @typedef {import('../validate/Validator.js').Validator} Validator
11
13
  */
12
14
 
13
15
  /**
@@ -22,7 +24,9 @@ import { InteractionStateMixin } from '../InteractionStateMixin.js';
22
24
  */
23
25
  const ChoiceGroupMixinImplementation = superclass =>
24
26
  // @ts-ignore https://github.com/microsoft/TypeScript/issues/36821#issuecomment-588375051
25
- class ChoiceGroupMixin extends FormRegistrarMixin(InteractionStateMixin(superclass)) {
27
+ class ChoiceGroupMixin extends FormRegistrarMixin(
28
+ ValidateMixin(InteractionStateMixin(superclass)),
29
+ ) {
26
30
  /** @type {any} */
27
31
  static get properties() {
28
32
  return {
@@ -123,6 +127,11 @@ const ChoiceGroupMixinImplementation = superclass =>
123
127
  }
124
128
  }
125
129
 
130
+ get operationMode() {
131
+ // @ts-ignore
132
+ return this._repropagationRole === 'choice-group' ? 'select' : 'enter';
133
+ }
134
+
126
135
  constructor() {
127
136
  super();
128
137
 
@@ -46,7 +46,7 @@ const FormGroupMixinImplementation = superclass =>
46
46
  }
47
47
 
48
48
  /**
49
- * The host element with role group (or radigroup or form) containing neccessary aria attributes
49
+ * The host element with role group (or radio-group or form) containing necessary aria attributes
50
50
  * @protected
51
51
  */
52
52
  get _inputNode() {
@@ -478,7 +478,7 @@ const FormGroupMixinImplementation = superclass =>
478
478
 
479
479
  /**
480
480
  * Traverses the _parentFormGroup tree, and gathers all aria description elements
481
- * (feedback and helptext) that should be provided to children.
481
+ * (feedback) that should be provided to children.
482
482
  *
483
483
  * In the example below, when the input for 'street' has focus, a screenreader user
484
484
  * would hear the #group-error.
@@ -503,7 +503,9 @@ const FormGroupMixinImplementation = superclass =>
503
503
  const descriptionElements = parent._getAriaDescriptionElements();
504
504
  const orderedEls = getAriaElementsInRightDomOrder(descriptionElements, { reverse: true });
505
505
  orderedEls.forEach(el => {
506
- this.__descriptionElementsInParentChain.add(el);
506
+ if (el.getAttribute('slot') === 'feedback') {
507
+ this.__descriptionElementsInParentChain.add(el);
508
+ }
507
509
  });
508
510
  // Also check if the newly added child needs to refer grandparents
509
511
  parent = parent._parentFormGroup;
@@ -549,9 +551,6 @@ const FormGroupMixinImplementation = superclass =>
549
551
  this.__linkParentMessages(child);
550
552
  this.validate({ clearCurrentResult: true });
551
553
 
552
- if (typeof child.addToAriaLabelledBy === 'function' && this._labelNode) {
553
- child.addToAriaLabelledBy(this._labelNode, { reorder: false });
554
- }
555
554
  if (!child.modelValue) {
556
555
  const pVals = this.__pendingValues;
557
556
  if (pVals.modelValue && pVals.modelValue[child.name]) {
@@ -20,6 +20,7 @@ import { FormControlMixin } from '../FormControlMixin.js';
20
20
  * @typedef {import('../../types/validate/ValidateMixinTypes.js').ValidateMixin} ValidateMixin
21
21
  * @typedef {import('../../types/validate/ValidateMixinTypes.js').ValidationType} ValidationType
22
22
  * @typedef {import('../../types/validate/ValidateMixinTypes.js').ValidateHost} ValidateHost
23
+ * @typedef {import('../../types/validate/ValidateMixinTypes.js').OperationMode} OperationMode
23
24
  * @typedef {import('../../types/validate/index.js').ValidatorOutcome} ValidatorOutcome
24
25
  * @typedef {typeof import('../../types/validate/ValidateMixinTypes.js').ValidateHost} ValidateHostConstructor
25
26
  * @typedef {{validator:Validator; outcome:boolean|string}} ValidationResultEntry
@@ -98,6 +99,15 @@ export const ValidateMixinImplementation = superclass =>
98
99
  return ['error'];
99
100
  }
100
101
 
102
+ /**
103
+ * Types of input interaction of the FormControl (for instance 'enter'|'select'|'upload')
104
+ * @overridable
105
+ * @type {OperationMode}
106
+ */
107
+ get operationMode() {
108
+ return 'enter';
109
+ }
110
+
101
111
  /**
102
112
  * Adds "._feedbackNode" as described below
103
113
  * @public
@@ -27,12 +27,15 @@ export class Validator extends EventTarget {
27
27
  this.__param = param;
28
28
  /** @type {ValidatorConfig} */
29
29
  this.__config = config || {};
30
- /** @type {ValidationType} */
31
- this.type = config?.type || 'error'; // Default type supported by ValidateMixin
30
+ /**
31
+ * Default type supported by ValidateMixin
32
+ * @type {ValidationType}
33
+ */
34
+ this.type = config?.type || 'error';
32
35
  }
33
36
 
34
37
  /**
35
- * The name under which validation results get registered. For convience and predictability, this
38
+ * The name under which validation results get registered. For convenience and predictability, this
36
39
  * should always be the same as the constructor name (since it will be obfuscated in js builds,
37
40
  * we need to provide it separately).
38
41
  * @type {ValidatorName}
@@ -198,6 +198,21 @@ describe('FormControlMixin', () => {
198
198
  expect(descriptionIdsBefore).to.equal(descriptionIdsAfter);
199
199
  });
200
200
 
201
+ it('sets aria-disabled on inputNode based on disabled property', async () => {
202
+ const el = /** @type {FormControlMixinClass} */ (
203
+ await fixture(html`
204
+ <${tag}>${inputSlot}</${tag}>
205
+ `)
206
+ );
207
+ const { _inputNode } = getFormControlMembers(el);
208
+ expect(_inputNode.hasAttribute('aria-disabled')).to.be.true;
209
+ expect(_inputNode.getAttribute('aria-disabled')).to.equal('false');
210
+
211
+ el.disabled = true;
212
+
213
+ expect(_inputNode.getAttribute('aria-disabled')).to.equal('false');
214
+ });
215
+
201
216
  it('clicking the label should call `_onLabelClick`', async () => {
202
217
  const spy = sinon.spy();
203
218
  const el = /** @type {FormControlMixinClass} */ (
@@ -349,19 +364,18 @@ describe('FormControlMixin', () => {
349
364
  );
350
365
  });
351
366
 
352
- it('sorts internal elements, and allows opt-out', async () => {
367
+ it('sorts internal elements based on assigned slots, and allows opt-out', async () => {
353
368
  const wrapper = await fixture(html`
354
- <div id="wrapper">
355
- <${tag}>
356
- <input slot="input" id="myInput" />
357
- <label slot="label" id="internalLabel">Added to label by default</label>
358
- <div slot="help-text" id="internalDescription">
359
- Added to description by default
360
- </div>
361
- </${tag}>
362
- <div id="externalLabelB">should go after input internals</div>
363
- <div id="externalDescriptionB">should go after input internals</div>
364
- </div>`);
369
+ <div id="wrapper">
370
+ <${tag}>
371
+ <input slot="input" id="myInput" />
372
+ <label slot="label" id="internalLabel">Added to label by default</label>
373
+ <div slot="help-text" id="internalDescription">
374
+ Added to description by default
375
+ </div>
376
+ </${tag}>
377
+ </div>
378
+ `);
365
379
  const el = /** @type {FormControlMixinClass} */ (wrapper.querySelector(tagString));
366
380
  const { _inputNode } = getFormControlMembers(el);
367
381
 
@@ -370,6 +384,11 @@ describe('FormControlMixin', () => {
370
384
  // A real life scenario would be for instance when
371
385
  // a Field or FormGroup would be extended and an extra slot would be added in the template
372
386
  const myInput = /** @type {HTMLElement} */ (wrapper.querySelector('#myInput'));
387
+ const internalLabel = /** @type {HTMLElement} */ (wrapper.querySelector('#internalLabel'));
388
+ const internalDescription = /** @type {HTMLElement} */ (
389
+ wrapper.querySelector('#internalDescription')
390
+ );
391
+
373
392
  el.addToAriaLabelledBy(myInput);
374
393
  await el.updateComplete;
375
394
  el.addToAriaDescribedBy(myInput);
@@ -377,29 +396,29 @@ describe('FormControlMixin', () => {
377
396
 
378
397
  expect(
379
398
  /** @type {string} */ (_inputNode.getAttribute('aria-labelledby')).split(' '),
380
- ).to.eql(['myInput', 'internalLabel']);
399
+ ).to.eql(['internalLabel', 'myInput']);
381
400
  expect(
382
401
  /** @type {string} */ (_inputNode.getAttribute('aria-describedby')).split(' '),
383
- ).to.eql(['myInput', 'internalDescription']);
402
+ ).to.eql(['internalDescription', 'myInput']);
384
403
 
385
404
  // cleanup
386
- el.removeFromAriaLabelledBy(myInput);
405
+ el.removeFromAriaLabelledBy(internalLabel);
387
406
  await el.updateComplete;
388
- el.removeFromAriaDescribedBy(myInput);
407
+ el.removeFromAriaDescribedBy(internalDescription);
389
408
  await el.updateComplete;
390
409
 
391
410
  // opt-out of reorder
392
- el.addToAriaLabelledBy(myInput, { reorder: false });
411
+ el.addToAriaLabelledBy(internalLabel, { reorder: false });
393
412
  await el.updateComplete;
394
- el.addToAriaDescribedBy(myInput, { reorder: false });
413
+ el.addToAriaDescribedBy(internalDescription, { reorder: false });
395
414
  await el.updateComplete;
396
415
 
397
416
  expect(
398
417
  /** @type {string} */ (_inputNode.getAttribute('aria-labelledby')).split(' '),
399
- ).to.eql(['internalLabel', 'myInput']);
418
+ ).to.eql(['myInput', 'internalLabel']);
400
419
  expect(
401
420
  /** @type {string} */ (_inputNode.getAttribute('aria-describedby')).split(' '),
402
- ).to.eql(['internalDescription', 'myInput']);
421
+ ).to.eql(['myInput', 'internalDescription']);
403
422
  });
404
423
 
405
424
  it('respects provided order for external elements', async () => {
@@ -163,20 +163,20 @@ export const runRegistrationSuite = customConfig => {
163
163
  });
164
164
 
165
165
  it('works for components that have a delayed render', async () => {
166
- class PerformUpdate extends FormRegistrarMixin(LitElement) {
167
- async performUpdate() {
166
+ class ScheduleUpdate extends FormRegistrarMixin(LitElement) {
167
+ async scheduleUpdate() {
168
168
  // eslint-disable-next-line no-promise-executor-return
169
169
  await new Promise(resolve => setTimeout(() => resolve(undefined), 10));
170
- await super.performUpdate();
170
+ await super.scheduleUpdate();
171
171
  }
172
172
 
173
173
  render() {
174
174
  return html`<slot></slot>`;
175
175
  }
176
176
  }
177
- const tagWrapperString = defineCE(PerformUpdate);
177
+ const tagWrapperString = defineCE(ScheduleUpdate);
178
178
  const tagWrapper = unsafeStatic(tagWrapperString);
179
- const el = /** @type {PerformUpdate} */ (
179
+ const el = /** @type {ScheduleUpdate} */ (
180
180
  await fixture(html`
181
181
  <${tagWrapper}>
182
182
  <${childTag}></${childTag}>
@@ -359,10 +359,10 @@ export const runRegistrationSuite = customConfig => {
359
359
  it('works for portals that have a delayed render', async () => {
360
360
  const delayedPortalString = defineCE(
361
361
  class extends FormRegistrarPortalMixin(LitElement) {
362
- async performUpdate() {
362
+ async scheduleUpdate() {
363
363
  // eslint-disable-next-line no-promise-executor-return
364
364
  await new Promise(resolve => setTimeout(() => resolve(undefined), 10));
365
- await super.performUpdate();
365
+ await super.scheduleUpdate();
366
366
  }
367
367
 
368
368
  render() {
@@ -1,7 +1,6 @@
1
1
  import { LitElement } from 'lit';
2
2
  import '@lion/ui/define/lion-field.js';
3
3
  import '@lion/ui/define/lion-validation-feedback.js';
4
- import { getFormControlMembers } from '@lion/ui/form-core-test-helpers.js';
5
4
  import { LionInput } from '@lion/ui/input.js';
6
5
  import { localizeTearDown } from '@lion/ui/localize-test-helpers.js';
7
6
  import { defineCE, expect, fixture, html, unsafeStatic } from '@open-wc/testing';
@@ -63,41 +62,6 @@ export function runFormGroupMixinInputSuite(cfg = {}) {
63
62
  'custom[]': ['custom 1', ''],
64
63
  });
65
64
  });
66
-
67
- it('suffixes child labels with group label, just like in <fieldset>', async () => {
68
- const el = /** @type {FormGroup} */ (
69
- await fixture(html`
70
- <${tag} label="set">
71
- <${childTag} name="A" label="fieldA"></${childTag}>
72
- <${childTag} name="B" label="fieldB"></${childTag}>
73
- </${tag}>
74
- `)
75
- );
76
- const { _labelNode } = getFormControlMembers(el);
77
-
78
- /**
79
- * @param {LionInput} formControl
80
- */
81
- function getLabels(formControl) {
82
- const control = getFormControlMembers(formControl);
83
-
84
- return /** @type {string} */ (control._inputNode.getAttribute('aria-labelledby')).split(
85
- ' ',
86
- );
87
- }
88
- const field1 = el.formElements[0];
89
- const field2 = el.formElements[1];
90
-
91
- expect(getLabels(field1)).to.eql([field1._labelNode.id, _labelNode.id]);
92
- expect(getLabels(field2)).to.eql([field2._labelNode.id, _labelNode.id]);
93
-
94
- // Test the cleanup on disconnected
95
- el.removeChild(field1);
96
-
97
- // TODO: wait for updated on disconnected to be fixed: https://github.com/lit/lit/issues/1901
98
- // await field1.updateComplete;
99
- // expect(getLabels(field1)).to.eql([field1._labelNode.id]);
100
- });
101
65
  });
102
66
 
103
67
  describe('Screen reader relations (aria-describedby) for child inputs and fieldsets', () => {
@@ -307,21 +271,10 @@ export function runFormGroupMixinInputSuite(cfg = {}) {
307
271
  await childAriaTest(await childAriaFixture('feedback'));
308
272
  });
309
273
 
310
- it(`reads help-text message belonging to fieldset when child input is focused
311
- (via aria-describedby)`, async () => {
312
- await childAriaTest(await childAriaFixture('help-text'));
313
- });
314
-
315
274
  // TODO: wait for updated on disconnected to be fixed: https://github.com/lit/lit/issues/1901
316
275
  it.skip(`cleans up feedback message belonging to fieldset on disconnect`, async () => {
317
276
  const el = await childAriaFixture('feedback');
318
277
  await childAriaTest(el, { cleanupPhase: true });
319
278
  });
320
-
321
- // TODO: wait for updated on disconnected to be fixed: https://github.com/lit/lit/issues/1901
322
- it.skip(`cleans up help-text message belonging to fieldset on disconnect`, async () => {
323
- const el = await childAriaFixture('help-text');
324
- await childAriaTest(el, { cleanupPhase: true });
325
- });
326
279
  });
327
280
  }
@@ -1356,6 +1356,24 @@ export function runFormGroupMixinSuite(cfg = {}) {
1356
1356
  expect(el.hasAttribute('aria-labelledby')).to.equal(true);
1357
1357
  expect(el.getAttribute('aria-labelledby')).contains(label.id);
1358
1358
  });
1359
+
1360
+ it('sets an aria-describedby to its children from element with slot="feedback"', async () => {
1361
+ const el = /** @type {FormGroup} */ (
1362
+ await fixture(html`
1363
+ <${tag}>
1364
+ <label slot="label">My Label</label>
1365
+ <div slot="feedback">My Feedback</div>
1366
+ ${inputSlots}
1367
+ </${tag}>
1368
+ `)
1369
+ );
1370
+ const feedback = /** @type {HTMLElement} */ (
1371
+ Array.from(el.children).find(child => child.slot === 'feedback')
1372
+ );
1373
+ expect(el.formElements[0]._inputNode.getAttribute('aria-describedby')).contains(
1374
+ feedback.id,
1375
+ );
1376
+ });
1359
1377
  });
1360
1378
 
1361
1379
  describe('Dynamically rendered children', () => {
@@ -1395,7 +1413,7 @@ export function runFormGroupMixinSuite(cfg = {}) {
1395
1413
  const dynamicChildrenTag = unsafeStatic(dynamicChildrenTagString);
1396
1414
 
1397
1415
  it(`when rendering children right from the start, sets their values correctly
1398
- based on prefilled model/seriazedValue`, async () => {
1416
+ based on prefilled model/serializedValue`, async () => {
1399
1417
  const el = /** @type {DynamicCWrapper} */ (
1400
1418
  await fixture(html`
1401
1419
  <${dynamicChildrenTag}
@@ -1430,7 +1448,7 @@ export function runFormGroupMixinSuite(cfg = {}) {
1430
1448
  });
1431
1449
 
1432
1450
  it(`when rendering children delayed, sets their values
1433
- correctly based on prefilled model/seriazedValue`, async () => {
1451
+ correctly based on prefilled model/serializedValue`, async () => {
1434
1452
  const el = /** @type {DynamicCWrapper} */ (
1435
1453
  await fixture(html`
1436
1454
  <${dynamicChildrenTag} .modelValue="${{ firstName: 'foo', lastName: 'bar' }}">
@@ -1463,7 +1481,7 @@ export function runFormGroupMixinSuite(cfg = {}) {
1463
1481
  });
1464
1482
 
1465
1483
  it(`when rendering children partly delayed, sets their values correctly based on
1466
- prefilled model/seriazedValue`, async () => {
1484
+ prefilled model/serializedValue`, async () => {
1467
1485
  const el = /** @type {DynamicCWrapper} */ (
1468
1486
  await fixture(html`
1469
1487
  <${dynamicChildrenTag} .fields="${['firstName']}" .modelValue="${{
@@ -115,6 +115,8 @@ export declare class FormControlHost {
115
115
  set fieldName(arg: string);
116
116
  get fieldName(): string;
117
117
 
118
+ get operationMode(): string;
119
+
118
120
  /**
119
121
  * Allows to add extra element references to aria-labelledby attribute.
120
122
  */
@@ -17,6 +17,8 @@ export type FeedbackMessage = {
17
17
 
18
18
  export type ValidationType = 'error' | 'warning' | 'info' | 'success' | string;
19
19
 
20
+ export type OperationMode = 'enter' | 'select' | 'upload';
21
+
20
22
  export declare class ValidateHost {
21
23
  /**
22
24
  * Used by Application Developers to add Validators to a FormControl.
@@ -2,7 +2,7 @@ import { FormControlHost } from '../../src/FormControlMixin.js';
2
2
  import { ValidationType } from './ValidateMixinTypes.js';
3
3
 
4
4
  /**
5
- * The name under which validation results get registered. For convience and predictability, this
5
+ * The name under which validation results get registered. For convenience and predictability, this
6
6
  * should always be the same as the constructor name (since it will be obfuscated in js builds,
7
7
  * we need to provide it separately).
8
8
  * @example
@@ -34,7 +34,7 @@ export type ValidatorConfig = {
34
34
  };
35
35
 
36
36
  /**
37
- * Output of the `execute` function that returns a validity outcome. When we need to shpw feedback,
37
+ * Output of the `execute` function that returns a validity outcome. When we need to show feedback,
38
38
  * it should return true, otherwise false. So when an error\info|warning|success message
39
39
  * needs to be shown, return true.
40
40
  * It's also possible to return an enum. Let's say that a phone number can have multiple
@@ -215,6 +215,11 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
215
215
  }
216
216
  }
217
217
 
218
+ // eslint-disable-next-line class-methods-use-this
219
+ get operationMode() {
220
+ return 'upload';
221
+ }
222
+
218
223
  get _acceptCriteria() {
219
224
  /** @type {string[]} */
220
225
  let allowedFileTypes = [];
@@ -433,7 +438,8 @@ export class LionInputFile extends ScopedElementsMixin(LocalizeMixin(LionField))
433
438
  ];
434
439
  }
435
440
  });
436
- // this._selectedFilesMetaData = [...this._selectedFilesMetaData];
441
+ // TODO: add a unit test for this
442
+ this._selectedFilesMetaData = [...this._selectedFilesMetaData];
437
443
  }
438
444
  });
439
445
  }
@@ -1,8 +1,9 @@
1
1
  /* eslint-disable import/no-extraneous-dependencies */
2
2
  import { css, html } from 'lit';
3
+ import { LocalizeMixin, formatNumber } from '@lion/ui/localize-no-side-effects.js';
3
4
  import { ScopedStylesController } from '@lion/ui/core.js';
4
5
  import { LionInput } from '@lion/ui/input.js';
5
- import { formatNumber } from '@lion/ui/localize-no-side-effects.js';
6
+ import { localizeNamespaceLoader } from './localizeNamespaceLoader.js';
6
7
 
7
8
  /**
8
9
  * @typedef {import('lit').CSSResult} CSSResult
@@ -13,7 +14,7 @@ import { formatNumber } from '@lion/ui/localize-no-side-effects.js';
13
14
  *
14
15
  * @customElement `lion-input-range`
15
16
  */
16
- export class LionInputRange extends LionInput {
17
+ export class LionInputRange extends LocalizeMixin(LionInput) {
17
18
  /** @type {any} */
18
19
  static get properties() {
19
20
  return {
@@ -40,6 +41,11 @@ export class LionInputRange extends LionInput {
40
41
  };
41
42
  }
42
43
 
44
+ static localizeNamespaces = [
45
+ { 'lion-input-range': localizeNamespaceLoader },
46
+ ...super.localizeNamespaces,
47
+ ];
48
+
43
49
  /**
44
50
  * @param {CSSResult} scope
45
51
  */
@@ -54,6 +60,26 @@ export class LionInputRange extends LionInput {
54
60
  `;
55
61
  }
56
62
 
63
+ static get styles() {
64
+ return [
65
+ super.styles,
66
+ css`
67
+ .sr-only {
68
+ position: absolute;
69
+ width: 1px;
70
+ height: 1px;
71
+ overflow: hidden;
72
+ clip-path: inset(100%);
73
+ clip: rect(1px, 1px, 1px, 1px);
74
+ white-space: nowrap;
75
+ border: 0;
76
+ margin: 0;
77
+ padding: 0;
78
+ }
79
+ `,
80
+ ];
81
+ }
82
+
57
83
  get _inputNode() {
58
84
  return /** @type {HTMLInputElement} */ (super._inputNode);
59
85
  }
@@ -130,8 +156,14 @@ export class LionInputRange extends LionInput {
130
156
  ${!this.noMinMaxLabels
131
157
  ? html`
132
158
  <div class="input-range__limits">
133
- <span>${formatNumber(this.min)}</span>
134
- <span>${formatNumber(this.max)}</span>
159
+ <div>
160
+ <span class="sr-only">${this.msgLit('lion-input-range:minimum')} </span
161
+ >${formatNumber(this.min)}
162
+ </div>
163
+ <div>
164
+ <span class="sr-only">${this.msgLit('lion-input-range:maximum')} </span
165
+ >${formatNumber(this.max)}
166
+ </div>
135
167
  </div>
136
168
  `
137
169
  : ''}
@@ -0,0 +1,75 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ export const localizeNamespaceLoader = /** @param {string} locale */ locale => {
3
+ switch (locale) {
4
+ case 'bg-BG':
5
+ return import('@lion/ui/input-range-translations/bg-BG.js');
6
+ case 'bg':
7
+ return import('@lion/ui/input-range-translations/bg.js');
8
+ case 'cs-CZ':
9
+ return import('@lion/ui/input-range-translations/cs-CZ.js');
10
+ case 'cs':
11
+ return import('@lion/ui/input-range-translations/cs.js');
12
+ case 'de-DE':
13
+ return import('@lion/ui/input-range-translations/de-DE.js');
14
+ case 'de':
15
+ return import('@lion/ui/input-range-translations/de.js');
16
+ case 'en-AU':
17
+ return import('@lion/ui/input-range-translations/en-AU.js');
18
+ case 'en-GB':
19
+ return import('@lion/ui/input-range-translations/en-GB.js');
20
+ case 'en-US':
21
+ return import('@lion/ui/input-range-translations/en-US.js');
22
+ case 'en-PH':
23
+ case 'en':
24
+ return import('@lion/ui/input-range-translations/en.js');
25
+ case 'es-ES':
26
+ return import('@lion/ui/input-range-translations/es-ES.js');
27
+ case 'es':
28
+ return import('@lion/ui/input-range-translations/es.js');
29
+ case 'fr-FR':
30
+ return import('@lion/ui/input-range-translations/fr-FR.js');
31
+ case 'fr-BE':
32
+ return import('@lion/ui/input-range-translations/fr-BE.js');
33
+ case 'fr':
34
+ return import('@lion/ui/input-range-translations/fr.js');
35
+ case 'hu-HU':
36
+ return import('@lion/ui/input-range-translations/hu-HU.js');
37
+ case 'hu':
38
+ return import('@lion/ui/input-range-translations/hu.js');
39
+ case 'it-IT':
40
+ return import('@lion/ui/input-range-translations/it-IT.js');
41
+ case 'it':
42
+ return import('@lion/ui/input-range-translations/it.js');
43
+ case 'nl-BE':
44
+ return import('@lion/ui/input-range-translations/nl-BE.js');
45
+ case 'nl-NL':
46
+ return import('@lion/ui/input-range-translations/nl-NL.js');
47
+ case 'nl':
48
+ return import('@lion/ui/input-range-translations/nl.js');
49
+ case 'pl-PL':
50
+ return import('@lion/ui/input-range-translations/pl-PL.js');
51
+ case 'pl':
52
+ return import('@lion/ui/input-range-translations/pl.js');
53
+ case 'ro-RO':
54
+ return import('@lion/ui/input-range-translations/ro-RO.js');
55
+ case 'ro':
56
+ return import('@lion/ui/input-range-translations/ro.js');
57
+ case 'ru-RU':
58
+ return import('@lion/ui/input-range-translations/ru-RU.js');
59
+ case 'ru':
60
+ return import('@lion/ui/input-range-translations/ru.js');
61
+ case 'sk-SK':
62
+ return import('@lion/ui/input-range-translations/sk-SK.js');
63
+ case 'sk':
64
+ return import('@lion/ui/input-range-translations/sk.js');
65
+ case 'uk-UA':
66
+ return import('@lion/ui/input-range-translations/uk-UA.js');
67
+ case 'uk':
68
+ return import('@lion/ui/input-range-translations/uk.js');
69
+ case 'zh-CN':
70
+ case 'zh':
71
+ return import('@lion/ui/input-range-translations/zh.js');
72
+ default:
73
+ return import('@lion/ui/input-range-translations/en.js');
74
+ }
75
+ };
@@ -35,14 +35,14 @@ describe('<lion-input-range>', () => {
35
35
  expect(el.shadowRoot?.querySelectorAll('.input-range__limits span').length).to.equal(2);
36
36
  expect(
37
37
  /** @type {HTMLElement} */ (
38
- /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('.input-range__limits span')[0]
39
- ).innerText,
40
- ).to.equal(el.min.toString());
38
+ /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('.input-range__limits > div')[0]
39
+ ).textContent?.trim(),
40
+ ).to.equal(`Minimum ${el.min.toString()}`);
41
41
  expect(
42
42
  /** @type {HTMLElement} */ (
43
- /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('.input-range__limits span')[1]
44
- ).innerText,
45
- ).to.equal(el.max.toString());
43
+ /** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('.input-range__limits > div')[1]
44
+ ).textContent?.trim(),
45
+ ).to.equal(`Maximum ${el.max.toString()}`);
46
46
  });
47
47
 
48
48
  it('update min and max attributes when min and max property change', async () => {