@lion/ui 0.20.0-menu-system.0 → 0.21.0

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 (414) hide show
  1. package/calendar-suites.js +1 -0
  2. package/collapsible.js +0 -1
  3. package/components/button/src/LionButton.js +0 -4
  4. package/components/button/test-suites/LionButton.suite.js +0 -1
  5. package/components/calendar/src/LionCalendar.js +1 -3
  6. package/components/calendar/test/lion-calendar.test.js +67 -47
  7. package/components/calendar/test-suites/LionCalendar.suite.js +79 -0
  8. package/components/combobox/test/lion-combobox.test.js +0 -1
  9. package/components/form-core/src/FormatMixin.js +17 -7
  10. package/components/form-core/src/form-group/FormGroupMixin.js +0 -7
  11. package/components/form-core/src/registration/FormRegistrarMixin.js +0 -11
  12. package/components/form-core/test/FormControlMixin.test.js +0 -1
  13. package/components/form-core/test/FormatMixin.test.js +4 -1
  14. package/components/form-core/test/validate/Validator.test.js +0 -2
  15. package/components/form-core/test-helpers/mimicUserInput.js +1 -0
  16. package/components/form-core/test-suites/FormatMixin.suite.js +273 -79
  17. package/components/form-core/test-suites/ValidateMixin.suite.js +0 -2
  18. package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +0 -1
  19. package/components/input/test/input-integrations.test.js +3 -2
  20. package/components/input/test/lion-input-integrations.test.js +2 -1
  21. package/components/input-amount/test/lion-input-amount-integrations.test.js +1 -1
  22. package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +72 -11
  23. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +27 -0
  24. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +60 -3
  25. package/components/input-date/test/lion-input-date-integrations.test.js +1 -1
  26. package/components/input-datepicker/src/LionInputDatepicker.js +4 -0
  27. package/components/input-datepicker/src/localizeNamespaceLoader.js +0 -1
  28. package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +1 -1
  29. package/components/input-datepicker/test/lion-input-datepicker.test.js +74 -9
  30. package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +35 -0
  31. package/components/input-email/src/LionInputEmail.js +2 -0
  32. package/components/input-email/test/lion-input-email-integrations.test.js +1 -1
  33. package/components/input-email/test/lion-input-email.test.js +6 -0
  34. package/components/input-file/src/validators.js +31 -1
  35. package/components/input-file/test/FileValidators.test.js +31 -0
  36. package/components/input-file/translations/bg.js +1 -0
  37. package/components/input-file/translations/cs.js +1 -0
  38. package/components/input-file/translations/de.js +2 -0
  39. package/components/input-file/translations/en.js +1 -0
  40. package/components/input-file/translations/es.js +1 -0
  41. package/components/input-file/translations/fr.js +1 -0
  42. package/components/input-file/translations/hu.js +1 -0
  43. package/components/input-file/translations/id.js +1 -0
  44. package/components/input-file/translations/it.js +1 -0
  45. package/components/input-file/translations/nl.js +1 -0
  46. package/components/input-file/translations/pl.js +1 -0
  47. package/components/input-file/translations/ro.js +1 -0
  48. package/components/input-file/translations/ru.js +1 -0
  49. package/components/input-file/translations/sk.js +1 -0
  50. package/components/input-file/translations/uk.js +1 -0
  51. package/components/input-file/translations/zh.js +1 -0
  52. package/components/input-iban/test/lion-input-iban-integrations.test.js +1 -1
  53. package/components/input-range/src/LionInputRange.js +51 -8
  54. package/components/input-range/test/lion-input-range.test.js +114 -0
  55. package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +2 -2
  56. package/components/input-tel/src/LionInputTel.js +1 -1
  57. package/components/input-tel/test-suites/LionInputTel.suite.js +7 -0
  58. package/components/localize/test/date/formatDate.test.js +0 -1
  59. package/components/overlays/src/OverlayController.js +110 -278
  60. package/components/overlays/src/OverlayMixin.js +11 -58
  61. package/components/overlays/src/OverlaysManager.js +2 -2
  62. package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +41 -9
  63. package/components/overlays/src/utils/adopt-styles.js +2 -3
  64. package/components/overlays/src/utils/get-focusable-elements.js +0 -4
  65. package/components/overlays/src/utils/is-equal-config.js +6 -10
  66. package/components/overlays/test/OverlayController.test.js +14 -127
  67. package/components/overlays/test/utils-tests/is-equal-config.test.js +1 -1
  68. package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
  69. package/components/overlays/test-suites/WithHoverInteraction.suite.js +212 -0
  70. package/components/overlays/types/ArrowMixinTypes.ts +1 -3
  71. package/components/overlays/types/OverlayConfig.ts +5 -20
  72. package/components/overlays/types/OverlayMixinTypes.ts +0 -2
  73. package/components/select-rich/test/lion-select-rich.test.js +0 -3
  74. package/components/textarea/test/lion-textarea-integrations.test.js +2 -1
  75. package/components/tooltip/test/lion-tooltip.test.js +9 -1
  76. package/custom-elements.json +20629 -32907
  77. package/dist-types/components/button/src/LionButton.d.ts +0 -1
  78. package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
  79. package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
  80. package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
  81. package/dist-types/components/calendar/test/lion-calendar.test.d.ts.map +1 -1
  82. package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts +5 -0
  83. package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts.map +1 -0
  84. package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
  85. package/dist-types/components/dialog/src/LionDialog.d.ts +2 -6
  86. package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
  87. package/dist-types/components/form-core/src/FormatMixin.d.ts.map +1 -1
  88. package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
  89. package/dist-types/components/form-core/src/registration/FormRegistrarMixin.d.ts.map +1 -1
  90. package/dist-types/components/form-core/test-helpers/mimicUserInput.d.ts.map +1 -1
  91. package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts +58 -5
  92. package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts.map +1 -1
  93. package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
  94. package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
  95. package/dist-types/components/icon/src/LionIcon.d.ts +2 -2
  96. package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts +24 -6
  97. package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts.map +1 -1
  98. package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts +2 -0
  99. package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts.map +1 -0
  100. package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
  101. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +2 -1
  102. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
  103. package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
  104. package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
  105. package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +7 -0
  106. package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +1 -0
  107. package/dist-types/components/input-email/src/LionInputEmail.d.ts.map +1 -1
  108. package/dist-types/components/input-file/src/validators.d.ts +11 -0
  109. package/dist-types/components/input-file/src/validators.d.ts.map +1 -1
  110. package/dist-types/components/input-file/translations/bg-BG.d.ts +1 -0
  111. package/dist-types/components/input-file/translations/bg.d.ts +1 -0
  112. package/dist-types/components/input-file/translations/cs-CZ.d.ts +1 -0
  113. package/dist-types/components/input-file/translations/cs.d.ts +1 -0
  114. package/dist-types/components/input-file/translations/de-DE.d.ts +1 -0
  115. package/dist-types/components/input-file/translations/de.d.ts +1 -0
  116. package/dist-types/components/input-file/translations/en-AU.d.ts +1 -0
  117. package/dist-types/components/input-file/translations/en-GB.d.ts +1 -0
  118. package/dist-types/components/input-file/translations/en-PH.d.ts +1 -0
  119. package/dist-types/components/input-file/translations/en-US.d.ts +1 -0
  120. package/dist-types/components/input-file/translations/en.d.ts +1 -0
  121. package/dist-types/components/input-file/translations/es-ES.d.ts +1 -0
  122. package/dist-types/components/input-file/translations/es.d.ts +1 -0
  123. package/dist-types/components/input-file/translations/fr-BE.d.ts +1 -0
  124. package/dist-types/components/input-file/translations/fr-FR.d.ts +1 -0
  125. package/dist-types/components/input-file/translations/fr.d.ts +1 -0
  126. package/dist-types/components/input-file/translations/hu-HU.d.ts +1 -0
  127. package/dist-types/components/input-file/translations/hu.d.ts +1 -0
  128. package/dist-types/components/input-file/translations/id-ID.d.ts +1 -0
  129. package/dist-types/components/input-file/translations/id.d.ts +1 -0
  130. package/dist-types/components/input-file/translations/it-IT.d.ts +1 -0
  131. package/dist-types/components/input-file/translations/it.d.ts +1 -0
  132. package/dist-types/components/input-file/translations/nl-BE.d.ts +1 -0
  133. package/dist-types/components/input-file/translations/nl-NL.d.ts +1 -0
  134. package/dist-types/components/input-file/translations/nl.d.ts +1 -0
  135. package/dist-types/components/input-file/translations/pl-PL.d.ts +1 -0
  136. package/dist-types/components/input-file/translations/pl.d.ts +1 -0
  137. package/dist-types/components/input-file/translations/ro-RO.d.ts +1 -0
  138. package/dist-types/components/input-file/translations/ro.d.ts +1 -0
  139. package/dist-types/components/input-file/translations/ru-RU.d.ts +1 -0
  140. package/dist-types/components/input-file/translations/ru.d.ts +1 -0
  141. package/dist-types/components/input-file/translations/sk-SK.d.ts +1 -0
  142. package/dist-types/components/input-file/translations/sk.d.ts +1 -0
  143. package/dist-types/components/input-file/translations/uk-UA.d.ts +1 -0
  144. package/dist-types/components/input-file/translations/uk.d.ts +1 -0
  145. package/dist-types/components/input-file/translations/zh-CN.d.ts +1 -0
  146. package/dist-types/components/input-file/translations/zh.d.ts +1 -0
  147. package/dist-types/components/input-range/src/LionInputRange.d.ts +11 -0
  148. package/dist-types/components/input-range/src/LionInputRange.d.ts.map +1 -1
  149. package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
  150. package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts.map +1 -1
  151. package/dist-types/components/overlays/src/OverlayController.d.ts +12 -24
  152. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  153. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  154. package/dist-types/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.d.ts.map +1 -1
  155. package/dist-types/components/overlays/src/utils/get-focusable-elements.d.ts.map +1 -1
  156. package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
  157. package/dist-types/components/overlays/test-suites/WithHoverInteraction.suite.d.ts +17 -0
  158. package/dist-types/components/overlays/test-suites/WithHoverInteraction.suite.d.ts.map +1 -0
  159. package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
  160. package/dist-types/components/overlays/types/OverlayConfig.d.ts +2 -12
  161. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  162. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +0 -1
  163. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
  164. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +3 -11
  165. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  166. package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
  167. package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts.map +1 -1
  168. package/dist-types/exports/calendar-suites.d.ts +2 -0
  169. package/dist-types/exports/calendar-suites.d.ts.map +1 -0
  170. package/dist-types/exports/input-datepicker-suites.d.ts +2 -0
  171. package/dist-types/exports/input-datepicker-suites.d.ts.map +1 -0
  172. package/dist-types/exports/input-file.d.ts +1 -1
  173. package/dist-types/exports/overlays-test-suites.d.ts +1 -0
  174. package/dist-types/exports/overlays.d.ts +0 -3
  175. package/dist-types/exports/overlays.d.ts.map +1 -1
  176. package/dist-types/tsconfig.tsbuildinfo +1 -1
  177. package/docs/components/checkbox-group/api-table.md +4 -2
  178. package/docs/components/checkbox-group/overview.md +2 -2
  179. package/docs/components/collapsible/overview.md +1 -1
  180. package/docs/components/combobox/api-table.md +8 -21
  181. package/docs/components/combobox/overview.md +1 -1
  182. package/docs/components/combobox/use-cases.md +1 -1
  183. package/docs/components/dialog/api-table.md +6 -31
  184. package/docs/components/dialog/overview.md +1 -1
  185. package/docs/components/fieldset/overview.md +5 -5
  186. package/docs/components/form/overview.md +3 -3
  187. package/docs/components/form/use-cases.md +2 -2
  188. package/docs/components/icon/use-cases.md +1 -1
  189. package/docs/components/input/api-table.md +2 -1
  190. package/docs/components/input/overview.md +1 -1
  191. package/docs/components/input-amount/api-table.md +2 -1
  192. package/docs/components/input-amount/overview.md +3 -3
  193. package/docs/components/input-amount-dropdown/api-table.md +3 -2
  194. package/docs/components/input-date/api-table.md +2 -1
  195. package/docs/components/input-date/overview.md +3 -3
  196. package/docs/components/input-datepicker/api-table.md +6 -22
  197. package/docs/components/input-datepicker/overview.md +5 -5
  198. package/docs/components/input-email/api-table.md +3 -2
  199. package/docs/components/input-email/overview.md +2 -2
  200. package/docs/components/input-file/api-table.md +2 -1
  201. package/docs/components/input-file/overview.md +1 -1
  202. package/docs/components/input-file/use-cases.md +18 -0
  203. package/docs/components/input-iban/api-table.md +2 -1
  204. package/docs/components/input-iban/overview.md +2 -2
  205. package/docs/components/input-range/api-table.md +7 -1
  206. package/docs/components/input-range/overview.md +2 -2
  207. package/docs/components/input-range/use-cases.md +14 -0
  208. package/docs/components/input-stepper/api-table.md +2 -1
  209. package/docs/components/input-stepper/overview.md +1 -1
  210. package/docs/components/input-tel/api-table.md +3 -2
  211. package/docs/components/input-tel/overview.md +1 -1
  212. package/docs/components/input-tel/use-cases.md +6 -6
  213. package/docs/components/input-tel-dropdown/api-table.md +3 -2
  214. package/docs/components/input-tel-dropdown/overview.md +1 -1
  215. package/docs/components/listbox/api-table.md +2 -1
  216. package/docs/components/listbox/use-cases.md +1 -1
  217. package/docs/components/radio-group/api-table.md +2 -1
  218. package/docs/components/radio-group/overview.md +3 -3
  219. package/docs/components/select/api-table.md +2 -1
  220. package/docs/components/select/use-cases.md +1 -1
  221. package/docs/components/select-rich/api-table.md +5 -21
  222. package/docs/components/select-rich/use-cases.md +2 -2
  223. package/docs/components/switch/api-table.md +2 -1
  224. package/docs/components/tabs/examples.md +1 -1
  225. package/docs/components/textarea/api-table.md +2 -1
  226. package/docs/components/tooltip/api-table.md +11 -36
  227. package/docs/components/tooltip/use-cases.md +34 -1
  228. package/docs/fundamentals/index.md +4 -4
  229. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  230. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  231. package/docs/fundamentals/rationales/accessibility.md +1 -1
  232. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  233. package/docs/fundamentals/systems/core/overview.md +1 -1
  234. package/docs/fundamentals/systems/form/api-table.md +2 -1
  235. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  236. package/docs/fundamentals/systems/form/model-value.md +1 -1
  237. package/docs/fundamentals/systems/form/overview.md +28 -28
  238. package/docs/fundamentals/systems/form/validate.md +2 -2
  239. package/docs/fundamentals/systems/localize/overview.md +4 -4
  240. package/docs/fundamentals/systems/overlays/api-table.md +34 -36
  241. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  242. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  243. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  244. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  245. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  246. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  247. package/docs/guides/how-to/create-a-form.md +4 -4
  248. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  249. package/docs/guides/how-to/index.md +1 -1
  250. package/docs/guides/index.md +8 -8
  251. package/docs/guides/principles/index.md +5 -5
  252. package/docs/guides/principles/styling.md +1 -1
  253. package/exports/calendar-suites.js +1 -0
  254. package/exports/collapsible.js +0 -1
  255. package/exports/input-datepicker-suites.js +1 -0
  256. package/exports/input-file.js +5 -1
  257. package/exports/overlays-test-suites.js +1 -0
  258. package/exports/overlays.js +0 -6
  259. package/input-datepicker-suites.js +1 -0
  260. package/input-file.js +5 -1
  261. package/overlays-test-suites.js +1 -0
  262. package/overlays.js +0 -6
  263. package/package.json +2 -2
  264. package/components/collapsible/src/DisclosureMixin.js +0 -313
  265. package/components/collapsible/test-suites/DisclosureMixin.suite.js +0 -30
  266. package/components/collapsible/types/DisclosureMixinTypes.ts +0 -48
  267. package/components/menu/CHANGELOG.md +0 -37
  268. package/components/menu/README.md +0 -335
  269. package/components/menu/index.js +0 -2
  270. package/components/menu/lion-menu-overlay.js +0 -3
  271. package/components/menu/lion-menu.js +0 -3
  272. package/components/menu/lion-spinbutton.js +0 -3
  273. package/components/menu/lion-toolbar.js +0 -3
  274. package/components/menu/lion-tree.js +0 -3
  275. package/components/menu/package.json +0 -46
  276. package/components/menu/requirements.temp.md +0 -12
  277. package/components/menu/src/InteractiveListMixin.js +0 -840
  278. package/components/menu/src/LionMenu.js +0 -250
  279. package/components/menu/src/LionMenuHybrid.js +0 -46
  280. package/components/menu/src/LionMenuOverlay.js +0 -155
  281. package/components/menu/src/LionSpinbutton.js +0 -213
  282. package/components/menu/src/LionToolbar.js +0 -94
  283. package/components/menu/src/LionTree.js +0 -52
  284. package/components/menu/src/MoreButtonMenuMixin.js +0 -278
  285. package/components/menu/src/MultiLevelListMixin.js +0 -311
  286. package/components/menu/src/utils/isInView.js +0 -26
  287. package/components/menu/src/utils/listItemInteractions.js +0 -124
  288. package/components/menu/test/InteractiveListMixin.test.js +0 -3
  289. package/components/menu/test/MoreButtonMenuMixin.test.js +0 -4
  290. package/components/menu/test/MultiLevelListMixin.test.js +0 -3
  291. package/components/menu/test/lion-menu-hybrid.test.js +0 -3
  292. package/components/menu/test/lion-menu.test.js +0 -11
  293. package/components/menu/test/lion-toolbar.test.js +0 -8
  294. package/components/menu/test/lion-tree.test.js +0 -7
  295. package/components/menu/test-helpers/mimicKeyPress.js +0 -9
  296. package/components/menu/test-suites/InteractiveListMixin.suite.js +0 -454
  297. package/components/menu/test-suites/LionMenu.suite.js +0 -113
  298. package/components/menu/test-suites/LionMenuHybrid.suite.js +0 -583
  299. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +0 -372
  300. package/components/menu/test-suites/MultiLevelListMixin.suite.js +0 -303
  301. package/components/menu/types/InteractiveListMixinTypes.d.ts +0 -84
  302. package/components/navigation-bar/README.md +0 -1
  303. package/components/navigation-bar/src/LionNavigationBar.js +0 -439
  304. package/components/navigation-bar/src/types.js +0 -41
  305. package/components/overlays/NEXT.md +0 -49
  306. package/components/overlays/test/withHoverInteraction.test.js +0 -90
  307. package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +0 -3
  308. package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +0 -1
  309. package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts +0 -2
  310. package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts.map +0 -1
  311. package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +0 -24
  312. package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +0 -1
  313. package/dist-types/components/menu/index.d.ts +0 -3
  314. package/dist-types/components/menu/index.d.ts.map +0 -1
  315. package/dist-types/components/menu/lion-menu-overlay.d.ts +0 -2
  316. package/dist-types/components/menu/lion-menu-overlay.d.ts.map +0 -1
  317. package/dist-types/components/menu/lion-menu.d.ts +0 -2
  318. package/dist-types/components/menu/lion-menu.d.ts.map +0 -1
  319. package/dist-types/components/menu/lion-spinbutton.d.ts +0 -2
  320. package/dist-types/components/menu/lion-spinbutton.d.ts.map +0 -1
  321. package/dist-types/components/menu/lion-toolbar.d.ts +0 -2
  322. package/dist-types/components/menu/lion-toolbar.d.ts.map +0 -1
  323. package/dist-types/components/menu/lion-tree.d.ts +0 -2
  324. package/dist-types/components/menu/lion-tree.d.ts.map +0 -1
  325. package/dist-types/components/menu/src/InteractiveListMixin.d.ts +0 -617
  326. package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +0 -1
  327. package/dist-types/components/menu/src/LionMenu.d.ts +0 -635
  328. package/dist-types/components/menu/src/LionMenu.d.ts.map +0 -1
  329. package/dist-types/components/menu/src/LionMenuHybrid.d.ts +0 -19
  330. package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +0 -1
  331. package/dist-types/components/menu/src/LionMenuOverlay.d.ts +0 -1015
  332. package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +0 -1
  333. package/dist-types/components/menu/src/LionSpinbutton.d.ts +0 -58
  334. package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +0 -1
  335. package/dist-types/components/menu/src/LionToolbar.d.ts +0 -8
  336. package/dist-types/components/menu/src/LionToolbar.d.ts.map +0 -1
  337. package/dist-types/components/menu/src/LionTree.d.ts +0 -447
  338. package/dist-types/components/menu/src/LionTree.d.ts.map +0 -1
  339. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +0 -39
  340. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +0 -1
  341. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +0 -503
  342. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +0 -1
  343. package/dist-types/components/menu/src/utils/isInView.d.ts +0 -9
  344. package/dist-types/components/menu/src/utils/isInView.d.ts.map +0 -1
  345. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +0 -48
  346. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +0 -1
  347. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +0 -2
  348. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +0 -1
  349. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +0 -2
  350. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +0 -1
  351. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +0 -2
  352. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +0 -1
  353. package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts +0 -2
  354. package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts.map +0 -1
  355. package/dist-types/components/menu/test/lion-menu.test.d.ts +0 -2
  356. package/dist-types/components/menu/test/lion-menu.test.d.ts.map +0 -1
  357. package/dist-types/components/menu/test/lion-toolbar.test.d.ts +0 -2
  358. package/dist-types/components/menu/test/lion-toolbar.test.d.ts.map +0 -1
  359. package/dist-types/components/menu/test/lion-tree.test.d.ts +0 -2
  360. package/dist-types/components/menu/test/lion-tree.test.d.ts.map +0 -1
  361. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +0 -7
  362. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +0 -1
  363. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +0 -14
  364. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +0 -1
  365. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +0 -9
  366. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +0 -1
  367. package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts +0 -5
  368. package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts.map +0 -1
  369. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +0 -14
  370. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +0 -1
  371. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +0 -11
  372. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +0 -1
  373. package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +0 -238
  374. package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +0 -1
  375. package/dist-types/components/navigation-bar/src/types.d.ts +0 -85
  376. package/dist-types/components/navigation-bar/src/types.d.ts.map +0 -1
  377. package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts +0 -2
  378. package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts.map +0 -1
  379. package/dist-types/exports/define/lion-item.d.ts +0 -2
  380. package/dist-types/exports/define/lion-item.d.ts.map +0 -1
  381. package/dist-types/exports/define/lion-menu-overlay.d.ts +0 -2
  382. package/dist-types/exports/define/lion-menu-overlay.d.ts.map +0 -1
  383. package/dist-types/exports/define/lion-menu.d.ts +0 -2
  384. package/dist-types/exports/define/lion-menu.d.ts.map +0 -1
  385. package/dist-types/exports/define/lion-navigation-bar.d.ts +0 -2
  386. package/dist-types/exports/define/lion-navigation-bar.d.ts.map +0 -1
  387. package/dist-types/exports/define/lion-toolbar.d.ts +0 -2
  388. package/dist-types/exports/define/lion-toolbar.d.ts.map +0 -1
  389. package/dist-types/exports/define/lion-tree.d.ts +0 -2
  390. package/dist-types/exports/define/lion-tree.d.ts.map +0 -1
  391. package/dist-types/exports/menu-test-suites.d.ts +0 -4
  392. package/dist-types/exports/menu-test-suites.d.ts.map +0 -1
  393. package/dist-types/exports/menu.d.ts +0 -7
  394. package/dist-types/exports/menu.d.ts.map +0 -1
  395. package/dist-types/exports/navigation-bar.d.ts +0 -2
  396. package/dist-types/exports/navigation-bar.d.ts.map +0 -1
  397. package/docs/components/menu/api-table.md +0 -460
  398. package/docs/components/menu/applyMenuDemoStyles.js +0 -173
  399. package/docs/components/menu/extensions.md +0 -262
  400. package/docs/components/menu/index.md +0 -13
  401. package/docs/components/menu/overview.md +0 -422
  402. package/docs/components/menu/use-cases.md +0 -77
  403. package/exports/define/lion-item.js +0 -3
  404. package/exports/define/lion-menu-overlay.js +0 -3
  405. package/exports/define/lion-menu.js +0 -3
  406. package/exports/define/lion-navigation-bar.js +0 -3
  407. package/exports/define/lion-toolbar.js +0 -3
  408. package/exports/define/lion-tree.js +0 -3
  409. package/exports/menu-test-suites.js +0 -4
  410. package/exports/menu.js +0 -7
  411. package/exports/navigation-bar.js +0 -1
  412. package/menu-test-suites.js +0 -4
  413. package/menu.js +0 -7
  414. package/navigation-bar.js +0 -1
@@ -0,0 +1,27 @@
1
+ import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
2
+
3
+ import '@lion/ui/define/lion-input-amount-dropdown.js';
4
+
5
+ const tagString = 'lion-input-amount-dropdown';
6
+
7
+ describe('<lion-input-amount-dropdown> integrations', () => {
8
+ runFormatMixinSuite({
9
+ tagString,
10
+ modelValueType: Object,
11
+ parser: value => value.replace('foo: ', ''),
12
+ valueToggler: ({ toggleValue, viewValue }) => {
13
+ if (viewValue) {
14
+ return !toggleValue ? '123' : '456';
15
+ }
16
+ return !toggleValue ? { amount: 123, currency: 'EUR' } : { amount: 456, currency: 'EUR' };
17
+ },
18
+ getExpectedInitialModelValue: el => ({ currency: /** @type {any} */ (el).currency }),
19
+ getExpectedInitialFormattedValue: el => ({ currency: /** @type {any} */ (el).currency }),
20
+ getExpectedInitialSerializedValue: el => ({ currency: /** @type {any} */ (el).currency }),
21
+ getExpectedModelValueForEmptyInputNode: el => ({
22
+ currency: /** @type {any} */ (el).currency,
23
+ amount: '',
24
+ }),
25
+ valueChangeCounterOffset: 0,
26
+ });
27
+ });
@@ -1,14 +1,14 @@
1
1
  import { LionInputAmountDropdown } from '@lion/ui/input-amount-dropdown.js';
2
- import sinon from 'sinon';
3
2
  import {
4
- fixtureSync as _fixtureSync,
5
3
  fixture as _fixture,
6
- unsafeStatic,
4
+ fixtureSync as _fixtureSync,
7
5
  aTimeout,
8
6
  defineCE,
9
7
  expect,
10
8
  html,
9
+ unsafeStatic,
11
10
  } from '@open-wc/testing';
11
+ import sinon from 'sinon';
12
12
 
13
13
  import { isActiveElement } from '../../core/test-helpers/isActiveElement.js';
14
14
  import { mimicUserChangingDropdown } from '../test-helpers/mimicUserChangingDropdown.js';
@@ -100,6 +100,62 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
100
100
  expect(el.prefilled).to.be.true;
101
101
  });
102
102
 
103
+ it('does not fire model-value-changed for semantically equal modelValue objects', async () => {
104
+ const el = await fixture(
105
+ html` <${tag} .modelValue="${{ currency: 'EUR', amount: 123 }}"></${tag}> `,
106
+ );
107
+
108
+ const spy = sinon.spy();
109
+ el.addEventListener('model-value-changed', spy);
110
+
111
+ el.modelValue = { currency: 'EUR', amount: 123 };
112
+ await el.updateComplete;
113
+
114
+ expect(spy.callCount).to.equal(0);
115
+ });
116
+
117
+ it('does fire model-value-changed when amount is updated', async () => {
118
+ const el = await fixture(
119
+ html` <${tag} .modelValue="${{ currency: 'EUR', amount: 126 }}"></${tag}> `,
120
+ );
121
+
122
+ const spy = sinon.spy();
123
+ el.addEventListener('model-value-changed', spy);
124
+
125
+ el.modelValue = { currency: 'EUR', amount: 123 };
126
+ await el.updateComplete;
127
+
128
+ expect(spy.callCount).to.equal(1);
129
+ });
130
+
131
+ it('does fire model-value-changed when currency is updated', async () => {
132
+ const el = await fixture(
133
+ html` <${tag} .modelValue="${{ currency: 'GBP', amount: 123 }}"></${tag}> `,
134
+ );
135
+
136
+ const spy = sinon.spy();
137
+ el.addEventListener('model-value-changed', spy);
138
+
139
+ el.modelValue = { currency: 'EUR', amount: 123 };
140
+ await el.updateComplete;
141
+
142
+ expect(spy.callCount).to.equal(1);
143
+ });
144
+
145
+ it('does fire model-value-changed when currency & amount are updated', async () => {
146
+ const el = await fixture(
147
+ html` <${tag} .modelValue="${{ currency: 'GBP', amount: 100 }}"></${tag}> `,
148
+ );
149
+
150
+ const spy = sinon.spy();
151
+ el.addEventListener('model-value-changed', spy);
152
+
153
+ el.modelValue = { currency: 'EUR', amount: 123 };
154
+ await el.updateComplete;
155
+
156
+ expect(spy.callCount).to.equal(1);
157
+ });
158
+
103
159
  describe('Dropdown display', () => {
104
160
  it('calls `templates.dropdown` with TemplateDataForDropdownInputAmount object', async () => {
105
161
  const modelValue = { currency: 'EUR', amount: 123 };
@@ -336,6 +392,7 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
336
392
  // @ts-ignore
337
393
  expect(el._isEmpty(), 'missing amount property').to.be.true;
338
394
 
395
+ // @ts-ignore
339
396
  el.modelValue = null;
340
397
  await el.updateComplete;
341
398
  // @ts-ignore
@@ -1,6 +1,6 @@
1
1
  import {
2
- runInteractionStateMixinSuite,
3
2
  runFormatMixinSuite,
3
+ runInteractionStateMixinSuite,
4
4
  } from '@lion/ui/form-core-test-suites.js';
5
5
 
6
6
  import '@lion/ui/define/lion-input-date.js';
@@ -130,6 +130,10 @@ export class LionInputDatepicker extends ScopedElementsMixin(
130
130
  );
131
131
  }
132
132
 
133
+ get _isEditingTextField() {
134
+ return this.focused && this._isHandlingUserInput;
135
+ }
136
+
133
137
  constructor() {
134
138
  super();
135
139
  /** @private */
@@ -6,7 +6,6 @@ async function combineLocalizeImports(importPromises) {
6
6
  const combinedResult = localizeObjects[0];
7
7
  for (const localizeObject of localizeObjects.slice(1)) {
8
8
  Object.entries(localizeObject.default).forEach(([key, val]) => {
9
- // @ts-ignore - dynamic property access
10
9
  combinedResult.default[key] = val;
11
10
  });
12
11
  }
@@ -1,6 +1,6 @@
1
1
  import {
2
- runInteractionStateMixinSuite,
3
2
  runFormatMixinSuite,
3
+ runInteractionStateMixinSuite,
4
4
  } from '@lion/ui/form-core-test-suites.js';
5
5
 
6
6
  import '@lion/ui/define/lion-input-datepicker.js';
@@ -3,12 +3,15 @@ import { html, LitElement } from 'lit';
3
3
  import { IsDateDisabled, MaxDate, MinDate, MinMaxDate } from '@lion/ui/form-core.js';
4
4
  import { aTimeout, defineCE, expect, fixture as _fixture, nextFrame } from '@open-wc/testing';
5
5
  import { mimicClick } from '@lion/ui/overlays-test-helpers.js';
6
+ import { parseDate } from '@lion/ui/localize.js';
6
7
  import sinon from 'sinon';
7
- import { setViewport } from '@web/test-runner-commands';
8
+ import { sendKeys, setViewport } from '@web/test-runner-commands';
9
+ import { AlwaysInvalid } from '@lion/ui/form-core-test-helpers.js';
8
10
  import { DatepickerInputObject } from '@lion/ui/input-datepicker-test-helpers.js';
9
11
  import { LionInputDatepicker } from '@lion/ui/input-datepicker.js';
10
12
 
11
13
  import '@lion/ui/define/lion-input-datepicker.js';
14
+ import { runDatepickerSuite } from '../test-suites/LionInputDatepicker.suite.js';
12
15
 
13
16
  /**
14
17
  * @typedef {import('lit').TemplateResult} TemplateResult
@@ -454,6 +457,59 @@ describe('<lion-input-datepicker>', () => {
454
457
  expect(el.validationStates.error).to.have.property('IsDate');
455
458
  });
456
459
 
460
+ it('syncs view value from calendar if custom validator is in error state', async () => {
461
+ const el = await fixture(html`
462
+ <lion-input-datepicker .validators=${[new AlwaysInvalid()]}></lion-input-datepicker>
463
+ `);
464
+
465
+ const elObj = new DatepickerInputObject(el);
466
+ await elObj.openCalendar();
467
+ await elObj.selectMonthDay(12);
468
+ await el.updateComplete; // safari take a little longer
469
+
470
+ expect(el.hasFeedbackFor).to.include('error');
471
+ expect(el.validationStates).to.have.property('error');
472
+ expect(el.validationStates.error).to.have.property('AlwaysInvalid');
473
+ expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), elObj.calendarEl.selectedDate))
474
+ .to.be.true;
475
+ expect(
476
+ isSameDate(
477
+ // @ts-ignore [allow-protected] in test
478
+ /** @type {Date} */ (parseDate(el._inputNode.value)),
479
+ elObj.calendarEl.selectedDate,
480
+ ),
481
+ ).to.be.true;
482
+ });
483
+
484
+ it('syncs view value from calendar if custom validator is in error state, when there was a previous modelValue', async () => {
485
+ const modelValue = new Date('2022/12/30');
486
+ const el = await fixture(html`
487
+ <lion-input-datepicker
488
+ .modelValue="${modelValue}"
489
+ .validators=${[new AlwaysInvalid()]}
490
+ ></lion-input-datepicker>
491
+ `);
492
+ expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), modelValue)).to.be.true;
493
+
494
+ const elObj = new DatepickerInputObject(el);
495
+ await elObj.openCalendar();
496
+ await elObj.selectMonthDay(12);
497
+ await el.updateComplete; // safari take a little longer
498
+
499
+ expect(el.hasFeedbackFor).to.include('error');
500
+ expect(el.validationStates).to.have.property('error');
501
+ expect(el.validationStates.error).to.have.property('AlwaysInvalid');
502
+ expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), elObj.calendarEl.selectedDate))
503
+ .to.be.true;
504
+ expect(
505
+ isSameDate(
506
+ // @ts-ignore [allow-protected] in test
507
+ /** @type {Date} */ (parseDate(el._inputNode.value)),
508
+ elObj.calendarEl.selectedDate,
509
+ ),
510
+ ).to.be.true;
511
+ });
512
+
457
513
  /**
458
514
  * Not in scope:
459
515
  * - min/max attr (like platform has): could be added in future if observers needed
@@ -479,10 +535,14 @@ describe('<lion-input-datepicker>', () => {
479
535
  // Open the calendar
480
536
  await elObj.openCalendar();
481
537
 
538
+ const selectedDateEl = calendarEl?.shadowRoot?.querySelector(
539
+ '.calendar__day-button[selected]',
540
+ );
541
+ // @ts-ignore
542
+ selectedDateEl?.focus();
543
+
482
544
  // Move focus to 18th of December
483
- calendarEl.shadowRoot
484
- ?.querySelector('#js-content-wrapper')
485
- ?.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }));
545
+ await sendKeys({ press: 'ArrowRight' });
486
546
 
487
547
  expect(/** @type {Date} */ (calendarEl.focusedDate).getTime()).to.equal(
488
548
  new Date('December 18, 2020 03:24:00 GMT+0000').getTime(),
@@ -597,11 +657,12 @@ describe('<lion-input-datepicker>', () => {
597
657
  <lion-input-datepicker label="End date" name="endDate"></lion-input-datepicker>
598
658
  `);
599
659
 
600
- const elements = el.parentElement?.children;
601
- // @ts-ignore - accessing by name property
602
- const startLabel = elements?.startDate?.querySelector('button')?.ariaLabel;
603
- // @ts-ignore - accessing by name property
604
- const endLabel = elements?.endDate?.querySelector('button')?.ariaLabel;
660
+ // @ts-expect-error
661
+ const elements = el.parentElement.children;
662
+ // @ts-expect-error
663
+ const startLabel = elements.startDate.querySelector('button').ariaLabel;
664
+ // @ts-expect-error
665
+ const endLabel = elements.endDate.querySelector('button').ariaLabel;
605
666
 
606
667
  expect(startLabel).to.not.equal(endLabel);
607
668
  });
@@ -833,4 +894,8 @@ describe('<lion-input-datepicker>', () => {
833
894
  ).to.be.true;
834
895
  });
835
896
  });
897
+
898
+ describe('Run suite', () => {
899
+ runDatepickerSuite();
900
+ });
836
901
  });
@@ -0,0 +1,35 @@
1
+ import { expect, html, fixture, waitUntil, unsafeStatic } from '@open-wc/testing';
2
+ import { sendKeys } from '@web/test-runner-commands';
3
+
4
+ /** @typedef {import('@lion/ui/input-datepicker.js').LionInputDatepicker} LionInputDatepicker */
5
+
6
+ export function runDatepickerSuite({
7
+ datepickerTagName = 'lion-input-datepicker',
8
+ calendarTagName = 'lion-calendar',
9
+ } = {}) {
10
+ const tag = unsafeStatic(datepickerTagName);
11
+
12
+ it('should not reopen the datepicker popup when the date is selected by keyboard', async () => {
13
+ /** @type {LionInputDatepicker} */
14
+ const el = await fixture(html`<${tag} .modelValue="${new Date('2018/05/30')}"></${tag}>`);
15
+ await el.updateComplete;
16
+
17
+ // @ts-ignore
18
+ const openDatepickerButton = el._invokerNode;
19
+ openDatepickerButton?.focus();
20
+ openDatepickerButton?.click();
21
+ /**
22
+ * @returns {HTMLElement | null | undefined}
23
+ */
24
+ const getSelectedDateEl = () =>
25
+ el?.shadowRoot
26
+ ?.querySelector(calendarTagName)
27
+ ?.shadowRoot?.querySelector('.calendar__day-button[selected]');
28
+ await waitUntil(getSelectedDateEl);
29
+ getSelectedDateEl()?.focus();
30
+ await sendKeys({ press: 'ArrowLeft' });
31
+ await sendKeys({ press: 'Enter' });
32
+
33
+ expect(el.opened).to.be.false;
34
+ });
35
+ }
@@ -10,6 +10,8 @@ import { LocalizeMixin } from '@lion/ui/localize-no-side-effects.js';
10
10
  export class LionInputEmail extends LocalizeMixin(LionInput) {
11
11
  constructor() {
12
12
  super();
13
+ this.autocomplete = 'email';
14
+
13
15
  // local-part@domain where the local part may be up to 64 characters long
14
16
  // and the domain may have a maximum of 255 characters.
15
17
  // @see https://www.wikiwand.com/en/Email_address
@@ -1,5 +1,5 @@
1
- import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
2
1
  import '@lion/ui/define/lion-input-email.js';
2
+ import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
3
3
 
4
4
  const tagString = 'lion-input-email';
5
5
 
@@ -15,6 +15,12 @@ describe('<lion-input-email>', () => {
15
15
  expect(_inputNode.type).to.equal('text');
16
16
  });
17
17
 
18
+ it('sets autocomplete to "email"', async () => {
19
+ const el = await fixture(`<lion-input-email></lion-input-email>`);
20
+ // @ts-expect-error [allow-protected] inside tests
21
+ expect(el._inputNode.getAttribute('autocomplete')).to.equal('email');
22
+ });
23
+
18
24
  it('has validator "IsEmail" applied by default', async () => {
19
25
  // More elaborate tests can be found in lion-validate/test/StringValidators.test.js
20
26
  const el = await fixture(`<lion-input-email></lion-input-email>`);
@@ -2,13 +2,14 @@ import { Validator } from '@lion/ui/form-core.js';
2
2
  import { getLocalizeManager } from '@lion/ui/localize-no-side-effects.js';
3
3
 
4
4
  /**
5
+ * @typedef {import('../../form-core/types/validate/index.js').FeedbackMessageData} FeedbackMessageData
5
6
  * @typedef {import('../../form-core/types/validate/validate.js').ValidatorConfig} ValidatorConfig
6
7
  * @typedef {import('../../form-core/types/validate/validate.js').ValidatorParam} ValidatorParam
7
8
  * @typedef {import('../../form-core/types/validate/validate.js').ValidatorOutcome} ValidatorOutcome
8
9
  * @typedef {import('../types/input-file.js').InputFile} InputFile
9
10
  */
10
11
 
11
- /* eslint max-classes-per-file: ["error", 2] */
12
+ /* eslint max-classes-per-file: ["error", 3] */
12
13
  export class IsAcceptedFile extends Validator {
13
14
  static validatorName = 'IsAcceptedFile';
14
15
 
@@ -112,3 +113,32 @@ export class DuplicateFileNames extends Validator {
112
113
  return localizeManager.msg('lion-input-file:uploadTextDuplicateFileName');
113
114
  }
114
115
  }
116
+
117
+ export class MaxFileCount extends Validator {
118
+ static get validatorName() {
119
+ return 'MaxFileCount';
120
+ }
121
+
122
+ /**
123
+ * @param {Partial<FeedbackMessageData>} [data]
124
+ * @returns {Promise<string|Element>}
125
+ */
126
+ static async getMessage(data) {
127
+ const localizeManager = getLocalizeManager();
128
+ if (!data?.params || typeof data.params !== 'number' || data.params <= 0) {
129
+ return 'Invalid MaxFileCount parameter. Please provide a valid number greater than 0.';
130
+ }
131
+ return localizeManager.msg('lion-input-file:maxFileCountExceeded', {
132
+ maxFileCount: data.params,
133
+ });
134
+ }
135
+
136
+ /**
137
+ * @param {File[]} value
138
+ * @param {number} maxFiles
139
+ * @returns {boolean}
140
+ */
141
+ execute(value, maxFiles = this.param || 0) {
142
+ return maxFiles > 0 && value.length > maxFiles;
143
+ }
144
+ }
@@ -1,4 +1,5 @@
1
1
  import { expect } from '@open-wc/testing';
2
+ import { MaxFileCount } from '@lion/ui/input-file.js';
2
3
  import { IsAcceptedFile } from '../src/validators.js';
3
4
 
4
5
  describe('lion-input-file: IsAcceptedFile', () => {
@@ -167,4 +168,34 @@ describe('lion-input-file: IsAcceptedFile', () => {
167
168
  expect(returnVal).to.be.true;
168
169
  });
169
170
  });
171
+
172
+ describe('Max File Count', () => {
173
+ /**
174
+ *
175
+ * @param {string} filename
176
+ * @returns {File}
177
+ */
178
+ const newFile = filename => new File([], filename);
179
+
180
+ it('Allow up to 2 files', () => {
181
+ const validator = new MaxFileCount(2);
182
+ expect(MaxFileCount.validatorName).to.equal('MaxFileCount');
183
+
184
+ let isEnabled = validator.execute([newFile('file1.txt'), newFile('file2.txt')]);
185
+ expect(isEnabled).to.be.false;
186
+
187
+ isEnabled = validator.execute([
188
+ newFile('file1.txt'),
189
+ newFile('file2.txt'),
190
+ newFile('file3.txt'),
191
+ ]);
192
+ expect(isEnabled).to.be.true;
193
+ });
194
+
195
+ it('Allow any number of files with empty param', () => {
196
+ const validator = new MaxFileCount();
197
+ const isEnabled = validator.execute([newFile('file1.txt'), newFile('file2.txt')]);
198
+ expect(isEnabled).to.be.false;
199
+ });
200
+ });
170
201
  });
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Файл със същото име на файл вече е налице.',
18
18
  selectTextMultipleFile: 'Избор на файлове',
19
19
  selectTextSingleFile: 'Избор на файл',
20
+ maxFileCountExceeded: 'Броят на качените файлове не може да надвишава {maxFileCount}.',
20
21
  };
@@ -18,4 +18,5 @@ export default {
18
18
  selectTextDuplicateFileName: 'Soubor se stejným názvem byl již přítomen.',
19
19
  selectTextMultipleFile: 'Vybrat soubory',
20
20
  selectTextSingleFile: 'Vybrat soubor',
21
+ maxFileCountExceeded: 'Počet nahraných souborů nesmí překročit {maxFileCount}.',
21
22
  };
@@ -17,4 +17,6 @@ export default {
17
17
  selectTextDuplicateFileName: 'Eine Datei mit demselben Dateinamen war bereits vorhanden.',
18
18
  selectTextMultipleFile: 'Dateien auswählen',
19
19
  selectTextSingleFile: 'Datei auswählen',
20
+ maxFileCountExceeded:
21
+ 'Die Anzahl der hochgeladenen Dateien darf {maxFileCount} nicht überschreiten.',
20
22
  };
@@ -16,4 +16,5 @@ export default {
16
16
  selectTextDuplicateFileName: 'A file with same filename was already present.',
17
17
  selectTextMultipleFile: 'Select files',
18
18
  selectTextSingleFile: 'Select file',
19
+ maxFileCountExceeded: 'The number of uploaded files must not exceed {maxFileCount}.',
19
20
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Ya había un archivo con el mismo nombre de archivo.',
18
18
  selectTextMultipleFile: 'Seleccionar archivos',
19
19
  selectTextSingleFile: 'Seleccionar archivo',
20
+ maxFileCountExceeded: 'El número de archivos cargados no puede superar {maxFileCount}.',
20
21
  };
@@ -18,4 +18,5 @@ export default {
18
18
  selectTextDuplicateFileName: 'Un fichier portant le même nom de fichier était déjà présent.',
19
19
  selectTextMultipleFile: 'Sélectionnez des fichiers',
20
20
  selectTextSingleFile: 'Sélectionnez un fichier',
21
+ maxFileCountExceeded: 'Le nombre de fichiers téléchargés ne peut pas dépasser {maxFileCount}.',
21
22
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Már volt ilyen nevű fájl.',
18
18
  selectTextMultipleFile: 'Fájl(ok) kiválasztása',
19
19
  selectTextSingleFile: 'Fájl kiválasztása',
20
+ maxFileCountExceeded: 'A feltöltött fájlok száma nem haladhatja meg a {maxFileCount}-ot.',
20
21
  };
@@ -16,4 +16,5 @@ export default {
16
16
  selectTextDuplicateFileName: 'File dengan nama file yang sama sudah ada.',
17
17
  selectTextMultipleFile: 'Pilih beberapa file',
18
18
  selectTextSingleFile: 'Pilih berkas',
19
+ maxFileCountExceeded: 'Jumlah file yang diunggah tidak boleh melebihi {maxFileCount}.',
19
20
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Un file con lo stesso nome file era già presente.',
18
18
  selectTextMultipleFile: 'Seleziona file',
19
19
  selectTextSingleFile: 'Seleziona file',
20
+ maxFileCountExceeded: 'Il numero di file caricati non può superare {maxFileCount}.',
20
21
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Er bestaat al een bestand met dezelfde bestandsnaam.',
18
18
  selectTextMultipleFile: 'Selecteer bestanden',
19
19
  selectTextSingleFile: 'Selecteer bestand',
20
+ maxFileCountExceeded: 'Het aantal geüploade bestanden mag niet meer dan {maxFileCount} zijn.',
20
21
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Plik o tej samej nazwie już istnieje.',
18
18
  selectTextMultipleFile: 'Wybierz pliki',
19
19
  selectTextSingleFile: 'Wybierz plik',
20
+ maxFileCountExceeded: 'Liczba przesłanych plików nie może przekraczać {maxFileCount}.',
20
21
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Există deja un fişier cu acelaşi nume de fişier.',
18
18
  selectTextMultipleFile: 'Selectare fișiere',
19
19
  selectTextSingleFile: 'Selectare fișier',
20
+ maxFileCountExceeded: 'Numărul de fișiere încărcate nu poate depăși {maxFileCount}.',
20
21
  };
@@ -16,4 +16,5 @@ export default {
16
16
  selectTextDuplicateFileName: 'Файл с таким названием уже существует.',
17
17
  selectTextMultipleFile: 'Выберите файлы',
18
18
  selectTextSingleFile: 'Выберите файл',
19
+ maxFileCountExceeded: 'Количество загруженных файлов не может превышать {maxFileCount}.',
19
20
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Súbor s rovnakým názvom súboru už existoval.',
18
18
  selectTextMultipleFile: 'Vybrať súbory',
19
19
  selectTextSingleFile: 'Vybrať súbor',
20
+ maxFileCountExceeded: 'Počet nahratých súborov nesmie prekročiť {maxFileCount}.',
20
21
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: 'Файл із такою назвою вже існував.',
18
18
  selectTextMultipleFile: 'Виберіть файли',
19
19
  selectTextSingleFile: 'Виберіть файл',
20
+ maxFileCountExceeded: 'Кількість завантажених файлів не може перевищувати {maxFileCount}.',
20
21
  };
@@ -17,4 +17,5 @@ export default {
17
17
  selectTextDuplicateFileName: '已存在具有相同文件名的文件。',
18
18
  selectTextMultipleFile: '选择多个文件',
19
19
  selectTextSingleFile: '选择文件',
20
+ maxFileCountExceeded: '上传的文件数量不能超过 {maxFileCount} 个。',
20
21
  };
@@ -1,5 +1,5 @@
1
- import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
2
1
  import '@lion/ui/define/lion-input-iban.js';
2
+ import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
3
3
 
4
4
  const tagString = 'lion-input-iban';
5
5