@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 @@
1
+ export { runCalendarSuite } from './components/calendar/test-suites/LionCalendar.suite.js';
package/collapsible.js CHANGED
@@ -1,2 +1 @@
1
1
  export { LionCollapsible } from './components/collapsible/src/LionCollapsible.js';
2
- // export { DisclosureMixin } from '../components/collapsible/src/DisclosureMixin.js';
@@ -220,8 +220,4 @@ export class LionButton extends DisabledWithTabIndexMixin(LitElement) {
220
220
  this.click();
221
221
  }
222
222
  }
223
-
224
- // we want to be able to identify LionButtons w/o instanceof (for perf (loose dep) and dual version support),
225
- // so we use a static property for that that doesn't get renamed by minifiers
226
- static ['_$isLionButton$'] = true;
227
223
  }
@@ -279,7 +279,6 @@ export function LionButtonSuite({ klass = LionButton } = {}) {
279
279
 
280
280
  sameProperties.forEach(property => {
281
281
  it(`has same value of the property "${property}" as in native button event`, () => {
282
- // @ts-ignore - dynamic property access
283
282
  expect(lionButtonEvent[property]).to.equal(nativeButtonEvent[property]);
284
283
  });
285
284
  });
@@ -298,7 +298,7 @@ export class LionCalendar extends LocalizeMixin(LitElement) {
298
298
  this.__contentWrapperElement.addEventListener('click', this.__boundClickDateDelegation);
299
299
  this.__contentWrapperElement.addEventListener('focus', this.__boundFocusDateDelegation);
300
300
  this.__contentWrapperElement.addEventListener('blur', this.__boundBlurDateDelegation);
301
- this.__contentWrapperElement.addEventListener('keydown', this.__boundKeyboardNavigationEvent);
301
+ this.__contentWrapperElement.addEventListener('keyup', this.__boundKeyboardNavigationEvent);
302
302
  this.__eventsAdded = true;
303
303
  }
304
304
  }
@@ -928,7 +928,6 @@ export class LionCalendar extends LocalizeMixin(LitElement) {
928
928
  if (type !== 'Date') {
929
929
  tmpDate.setDate(1);
930
930
  }
931
- // @ts-ignore - dynamic method access
932
931
  tmpDate[`set${type}`](tmpDate[`get${type}`]() + modify);
933
932
  // if we've reset the day count,
934
933
  // restore day count as best we can
@@ -936,7 +935,6 @@ export class LionCalendar extends LocalizeMixin(LitElement) {
936
935
  const maxDays = new Date(tmpDate.getFullYear(), tmpDate.getMonth() + 1, 0).getDate();
937
936
  tmpDate.setDate(Math.min(this.centralDate.getDate(), maxDays));
938
937
  }
939
- // @ts-ignore - dynamic property access
940
938
  this[dateType] = tmpDate;
941
939
  }
942
940
 
@@ -4,8 +4,10 @@ import { localizeTearDown } from '@lion/ui/localize-test-helpers.js';
4
4
  import { expect, fixture as _fixture } from '@open-wc/testing';
5
5
  import sinon from 'sinon';
6
6
  import '@lion/ui/define/lion-calendar.js';
7
+ import { sendKeys } from '@web/test-runner-commands';
7
8
  import { isSameDate } from '@lion/ui/calendar.js';
8
9
  import { CalendarObject, DayObject } from '@lion/ui/calendar-test-helpers.js';
10
+ import { runCalendarSuite } from '../test-suites/LionCalendar.suite.js';
9
11
 
10
12
  /**
11
13
  * @typedef {import('../src/LionCalendar.js').LionCalendar} LionCalendar
@@ -13,6 +15,16 @@ import { CalendarObject, DayObject } from '@lion/ui/calendar-test-helpers.js';
13
15
  */
14
16
 
15
17
  const fixture = /** @type {(arg: TemplateResult) => Promise<LionCalendar>} */ (_fixture);
18
+ /**
19
+ * @param {HTMLElement} el
20
+ * @returns {HTMLElement | null | undefined}
21
+ */
22
+ const getSelectedDateEl = el => el?.shadowRoot?.querySelector('.calendar__day-button[selected]');
23
+ /**
24
+ * @param {HTMLElement} el
25
+ * @returns {void}
26
+ */
27
+ const focusSelectedDate = el => getSelectedDateEl(el)?.focus();
16
28
 
17
29
  describe('<lion-calendar>', () => {
18
30
  const localizeManager = getLocalizeManager();
@@ -294,13 +306,14 @@ describe('<lion-calendar>', () => {
294
306
  `);
295
307
  const elObj = new CalendarObject(el);
296
308
 
297
- el.__contentWrapperElement?.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft' }));
309
+ focusSelectedDate(el);
310
+ await sendKeys({ press: 'ArrowLeft' });
298
311
  await el.updateComplete;
299
312
  expect(elObj.activeMonth).to.equal('October');
300
313
  expect(elObj.activeYear).to.equal('2000');
301
314
  expect(elObj.focusedDayObj?.monthday).to.equal(11);
302
315
 
303
- el.__contentWrapperElement?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));
316
+ await sendKeys({ press: 'Enter' });
304
317
  await el.updateComplete;
305
318
  expect(isSameDate(/** @type {Date} */ (el.selectedDate), new Date('2000/10/12'))).to.be.true;
306
319
  expect(dateChangedSpy.called).to.equal(false);
@@ -1120,16 +1133,14 @@ describe('<lion-calendar>', () => {
1120
1133
  expect(elObj.activeMonth).to.equal('January');
1121
1134
  expect(elObj.activeYear).to.equal('2001');
1122
1135
 
1123
- el.__contentWrapperElement?.dispatchEvent(
1124
- new KeyboardEvent('keydown', { key: 'PageUp' }),
1125
- );
1136
+ focusSelectedDate(el);
1137
+ await sendKeys({ press: 'PageUp' });
1138
+
1126
1139
  await el.updateComplete;
1127
1140
  expect(elObj.activeMonth).to.equal('December');
1128
1141
  expect(elObj.activeYear).to.equal('2000');
1129
1142
 
1130
- el.__contentWrapperElement?.dispatchEvent(
1131
- new KeyboardEvent('keydown', { key: 'PageDown' }),
1132
- );
1143
+ await sendKeys({ press: 'PageDown' });
1133
1144
  await el.updateComplete;
1134
1145
  expect(elObj.activeMonth).to.equal('January');
1135
1146
  expect(elObj.activeYear).to.equal('2001');
@@ -1139,20 +1150,36 @@ describe('<lion-calendar>', () => {
1139
1150
  const el = await fixture(html`
1140
1151
  <lion-calendar .selectedDate="${new Date('2001/01/02')}"></lion-calendar>
1141
1152
  `);
1153
+ focusSelectedDate(el);
1154
+
1142
1155
  const elObj = new CalendarObject(el);
1143
1156
  expect(elObj.activeMonth).to.equal('January');
1144
1157
  expect(elObj.activeYear).to.equal('2001');
1145
1158
 
1146
- el.__contentWrapperElement?.dispatchEvent(
1147
- new KeyboardEvent('keydown', { key: 'PageDown', altKey: true }),
1148
- );
1159
+ await sendKeys({
1160
+ down: 'Alt',
1161
+ });
1162
+ await sendKeys({
1163
+ press: 'PageDown',
1164
+ });
1165
+ await sendKeys({
1166
+ up: 'Alt',
1167
+ });
1168
+
1149
1169
  await el.updateComplete;
1170
+ focusSelectedDate(el);
1150
1171
  expect(elObj.activeMonth).to.equal('January');
1151
1172
  expect(elObj.activeYear).to.equal('2002');
1152
1173
 
1153
- el.__contentWrapperElement?.dispatchEvent(
1154
- new KeyboardEvent('keydown', { key: 'PageUp', altKey: true }),
1155
- );
1174
+ await sendKeys({
1175
+ down: 'Alt',
1176
+ });
1177
+ await sendKeys({
1178
+ press: 'PageUp',
1179
+ });
1180
+ await sendKeys({
1181
+ up: 'Alt',
1182
+ });
1156
1183
  await el.updateComplete;
1157
1184
  expect(elObj.activeMonth).to.equal('January');
1158
1185
  expect(elObj.activeYear).to.equal('2001');
@@ -1165,9 +1192,8 @@ describe('<lion-calendar>', () => {
1165
1192
  `);
1166
1193
  const elObj = new CalendarObject(el);
1167
1194
 
1168
- el.__contentWrapperElement?.dispatchEvent(
1169
- new KeyboardEvent('keydown', { key: 'ArrowDown' }),
1170
- );
1195
+ focusSelectedDate(el);
1196
+ await sendKeys({ press: 'ArrowDown' });
1171
1197
  await el.updateComplete;
1172
1198
  expect(elObj.focusedDayObj?.monthday).to.equal(2 + 7);
1173
1199
  });
@@ -1178,9 +1204,8 @@ describe('<lion-calendar>', () => {
1178
1204
  `);
1179
1205
  const elObj = new CalendarObject(el);
1180
1206
 
1181
- el.__contentWrapperElement?.dispatchEvent(
1182
- new KeyboardEvent('keydown', { key: 'ArrowUp' }),
1183
- );
1207
+ focusSelectedDate(el);
1208
+ await sendKeys({ press: 'ArrowUp' });
1184
1209
  await el.updateComplete;
1185
1210
  expect(elObj.focusedDayObj?.monthday).to.equal(26); // of month before
1186
1211
  });
@@ -1192,9 +1217,8 @@ describe('<lion-calendar>', () => {
1192
1217
  `);
1193
1218
  const elObj = new CalendarObject(el);
1194
1219
 
1195
- el.__contentWrapperElement?.dispatchEvent(
1196
- new KeyboardEvent('keydown', { key: 'ArrowLeft' }),
1197
- );
1220
+ focusSelectedDate(el);
1221
+ await sendKeys({ press: 'ArrowLeft' });
1198
1222
  await el.updateComplete;
1199
1223
  expect(elObj.focusedDayObj?.monthday).to.equal(12 - 1);
1200
1224
  });
@@ -1206,9 +1230,8 @@ describe('<lion-calendar>', () => {
1206
1230
  `);
1207
1231
  const elObj = new CalendarObject(el);
1208
1232
 
1209
- el.__contentWrapperElement?.dispatchEvent(
1210
- new KeyboardEvent('keydown', { key: 'ArrowRight' }),
1211
- );
1233
+ focusSelectedDate(el);
1234
+ await sendKeys({ press: 'ArrowRight' });
1212
1235
  await el.updateComplete;
1213
1236
  expect(elObj.focusedDayObj?.monthday).to.equal(12 + 1);
1214
1237
  });
@@ -1224,9 +1247,8 @@ describe('<lion-calendar>', () => {
1224
1247
  `);
1225
1248
  const elObj = new CalendarObject(el);
1226
1249
 
1227
- el.__contentWrapperElement?.dispatchEvent(
1228
- new KeyboardEvent('keydown', { key: 'ArrowRight' }),
1229
- );
1250
+ focusSelectedDate(el);
1251
+ await sendKeys({ press: 'ArrowRight' });
1230
1252
  await el.updateComplete;
1231
1253
  expect(elObj.focusedDayObj?.monthday).to.equal(3);
1232
1254
  });
@@ -1238,9 +1260,8 @@ describe('<lion-calendar>', () => {
1238
1260
  const elObj = new CalendarObject(el);
1239
1261
  expect(elObj.centralDayObj?.weekdayNameShort).to.equal('Sat');
1240
1262
 
1241
- el.__contentWrapperElement?.dispatchEvent(
1242
- new KeyboardEvent('keydown', { key: 'ArrowRight' }),
1243
- );
1263
+ focusSelectedDate(el);
1264
+ await sendKeys({ press: 'ArrowRight' });
1244
1265
  await el.updateComplete;
1245
1266
  expect(elObj.focusedDayObj?.monthday).to.equal(6);
1246
1267
  expect(elObj.focusedDayObj?.weekdayNameShort).to.equal('Sun');
@@ -1253,9 +1274,8 @@ describe('<lion-calendar>', () => {
1253
1274
  const elObj = new CalendarObject(el);
1254
1275
  expect(elObj.centralDayObj?.weekdayNameShort).to.equal('Sun');
1255
1276
 
1256
- el.__contentWrapperElement?.dispatchEvent(
1257
- new KeyboardEvent('keydown', { key: 'ArrowLeft' }),
1258
- );
1277
+ focusSelectedDate(el);
1278
+ await sendKeys({ press: 'ArrowLeft' });
1259
1279
  await el.updateComplete;
1260
1280
  expect(elObj.focusedDayObj?.monthday).to.equal(5);
1261
1281
  expect(elObj.focusedDayObj?.weekdayNameShort).to.equal('Sat');
@@ -1269,9 +1289,8 @@ describe('<lion-calendar>', () => {
1269
1289
  expect(elObj.activeMonth).to.equal('December');
1270
1290
  expect(elObj.activeYear).to.equal('2000');
1271
1291
 
1272
- el.__contentWrapperElement?.dispatchEvent(
1273
- new KeyboardEvent('keydown', { key: 'ArrowRight' }),
1274
- );
1292
+ focusSelectedDate(el);
1293
+ await sendKeys({ press: 'ArrowRight' });
1275
1294
  await el.updateComplete;
1276
1295
  expect(elObj.activeMonth).to.equal('January');
1277
1296
  expect(elObj.activeYear).to.equal('2001');
@@ -1286,9 +1305,8 @@ describe('<lion-calendar>', () => {
1286
1305
  expect(elObj.activeMonth).to.equal('January');
1287
1306
  expect(elObj.activeYear).to.equal('2001');
1288
1307
 
1289
- el.__contentWrapperElement?.dispatchEvent(
1290
- new KeyboardEvent('keydown', { key: 'ArrowLeft' }),
1291
- );
1308
+ focusSelectedDate(el);
1309
+ await sendKeys({ press: 'ArrowLeft' });
1292
1310
  await el.updateComplete;
1293
1311
  expect(elObj.activeMonth).to.equal('December');
1294
1312
  expect(elObj.activeYear).to.equal('2000');
@@ -1303,9 +1321,8 @@ describe('<lion-calendar>', () => {
1303
1321
  expect(elObj.activeMonth).to.equal('December');
1304
1322
  expect(elObj.activeYear).to.equal('2000');
1305
1323
 
1306
- el.__contentWrapperElement?.dispatchEvent(
1307
- new KeyboardEvent('keydown', { key: 'ArrowDown' }),
1308
- );
1324
+ focusSelectedDate(el);
1325
+ await sendKeys({ press: 'ArrowDown' });
1309
1326
  await el.updateComplete;
1310
1327
  expect(elObj.activeMonth).to.equal('January');
1311
1328
  expect(elObj.activeYear).to.equal('2001');
@@ -1320,9 +1337,8 @@ describe('<lion-calendar>', () => {
1320
1337
  expect(elObj.activeMonth).to.equal('January');
1321
1338
  expect(elObj.activeYear).to.equal('2001');
1322
1339
 
1323
- el.__contentWrapperElement?.dispatchEvent(
1324
- new KeyboardEvent('keydown', { key: 'ArrowUp' }),
1325
- );
1340
+ focusSelectedDate(el);
1341
+ await sendKeys({ press: 'ArrowUp' });
1326
1342
  await el.updateComplete;
1327
1343
  expect(elObj.activeMonth).to.equal('December');
1328
1344
  expect(elObj.activeYear).to.equal('2000');
@@ -1659,4 +1675,8 @@ describe('<lion-calendar>', () => {
1659
1675
  expect(el).not.to.be.displayed;
1660
1676
  });
1661
1677
  });
1678
+
1679
+ describe('Run suite', () => {
1680
+ runCalendarSuite();
1681
+ });
1662
1682
  });
@@ -0,0 +1,79 @@
1
+ import { LionCalendar } from '@lion/ui/calendar.js';
2
+ import { expect, html, fixture, waitUntil, unsafeStatic, defineCE } from '@open-wc/testing';
3
+ import sinon from 'sinon';
4
+ import '@lion/ui/define/lion-calendar.js';
5
+ import { sendKeys } from '@web/test-runner-commands';
6
+
7
+ export function runCalendarSuite({ klass = LionCalendar } = {}) {
8
+ const tagStringCalendar = defineCE(class extends klass {});
9
+ const tagCalendar = unsafeStatic(tagStringCalendar);
10
+
11
+ it('should fire keyboard press events on keyup and not on keydown', async () => {
12
+ /**
13
+ * This test covers a corner case where `keydown`, `keyup`, and `focus` events happen across different elements.
14
+ *
15
+ * Setup:
16
+ * - There is a dialog invoker button that has a keyup handler.
17
+ * - The dialog invoker button gets focused (important!) and then opens the dialog on click.
18
+ * - The dialog contains lion-calendar.
19
+ * - When a date is selected, the dialog closes.
20
+ *
21
+ * Expected behavior:
22
+ * - The dialog invoker button's `keyup` handler should not run when a date is selected in the calendar.
23
+ *
24
+ * The problem:
25
+ * - Pressing Enter on a date is handled by `keydown` inside `lion-calendar`.
26
+ * - The dialog then closes on `user-selected-date-changed` event.
27
+ * - The browser automatically returns focus to the previously focused element (the dialog invoker button).
28
+ * - The keyup event then fires on the now-focused dialog invoker button, triggering its keyup
29
+ * handler unexpectedly.
30
+ *
31
+ * Fix being verified:
32
+ * - Fire `user-selected-date-changed` on `keyup` instead of `keydown`.
33
+ * - This prevents the dialog invoker button from receiving and handling that `keyup` after the dialog closes.
34
+ */
35
+
36
+ /** @type {HTMLElement} */
37
+ let el;
38
+ const keyUpSpy = sinon.spy();
39
+ const getDialogEl = () => el.querySelector('dialog');
40
+ const openDialogButtonClickHandler = () => getDialogEl()?.showModal();
41
+ const userSelectedDateChangedHandler = () => getDialogEl()?.close();
42
+
43
+ el = await fixture(html`
44
+ <div>
45
+ <button
46
+ @keyup="${keyUpSpy}"
47
+ @click="${openDialogButtonClickHandler}"
48
+ >
49
+ Open Dialog
50
+ </button>
51
+ <dialog>
52
+ <${tagCalendar}
53
+ .selectedDate="${new Date('2000/10/12')}"
54
+ @user-selected-date-changed="${userSelectedDateChangedHandler}"
55
+ >
56
+ </${tagCalendar}>
57
+ </dialog>
58
+ </div>
59
+ `);
60
+
61
+ const openDialogButton = el.querySelector('button');
62
+ const calendarEl = /** @type {LionCalendar} */ (el.querySelector(tagStringCalendar));
63
+ await calendarEl?.updateComplete;
64
+
65
+ openDialogButton?.focus();
66
+ openDialogButton?.click();
67
+ /**
68
+ * @returns {HTMLElement | null | undefined}
69
+ */
70
+ const getSelectedDateEl = () =>
71
+ calendarEl?.shadowRoot?.querySelector('.calendar__day-button[selected]');
72
+ await waitUntil(getSelectedDateEl);
73
+ getSelectedDateEl()?.focus();
74
+ await sendKeys({ press: 'ArrowLeft' });
75
+ await sendKeys({ press: 'Enter' });
76
+
77
+ expect(keyUpSpy.called).to.equal(false);
78
+ });
79
+ }
@@ -3227,7 +3227,6 @@ describe('lion-combobox', () => {
3227
3227
  const [el, options] = await fruitFixture({ autocomplete: 'both', matchMode: 'all' });
3228
3228
  await mimicUserTyping(/** @type {LionCombobox} */ (el), 'choke');
3229
3229
  await el.updateComplete;
3230
- // @ts-ignore - array index access
3231
3230
  const labelledElement = options[0].querySelector('span[aria-label="Artichoke"]');
3232
3231
  expect(labelledElement).to.not.be.null;
3233
3232
  expect(labelledElement.innerText).to.equal('Artichoke');
@@ -2,9 +2,9 @@
2
2
 
3
3
  import { dedupeMixin } from '@open-wc/dedupe-mixin';
4
4
 
5
- import { ValidateMixin } from './validate/ValidateMixin.js';
6
5
  import { FormControlMixin } from './FormControlMixin.js';
7
6
  import { Unparseable } from './validate/Unparseable.js';
7
+ import { ValidateMixin } from './validate/ValidateMixin.js';
8
8
 
9
9
  /**
10
10
  * @typedef {import('../types/FormControlMixinTypes.js').ModelValueEventDetails} ModelValueEventDetails
@@ -73,7 +73,7 @@ const FormatMixinImplementation = superclass =>
73
73
  /**
74
74
  * During format/parse, we sometimes need to know how the current viewValue the user
75
75
  * interacts with "came to be". Was it already formatted before for instance?
76
- * If so, in case of an amount input, we might want to stick to the curent interpretation of separators.
76
+ * If so, in case of an amount input, we might want to stick to the current interpretation of separators.
77
77
  */
78
78
  #viewValueState = {
79
79
  didFormatterOutputSyncToView: false,
@@ -89,7 +89,12 @@ const FormatMixinImplementation = superclass =>
89
89
  requestUpdate(name, oldValue, options) {
90
90
  super.requestUpdate(name, oldValue, options);
91
91
 
92
- if (name === 'modelValue' && this.modelValue !== oldValue) {
92
+ const didModelValueChange = () =>
93
+ options?.hasChanged
94
+ ? options.hasChanged(this.modelValue, oldValue)
95
+ : this.modelValue !== oldValue;
96
+
97
+ if (name === 'modelValue' && didModelValueChange()) {
93
98
  this._onModelValueChanged({ modelValue: this.modelValue }, { modelValue: oldValue });
94
99
  }
95
100
  if (name === 'serializedValue' && this.serializedValue !== oldValue) {
@@ -119,13 +124,19 @@ const FormatMixinImplementation = superclass =>
119
124
  }
120
125
  }
121
126
 
127
+ get _isEditingTextField() {
128
+ // For backward compatibility. Ideally we check whether the input is focused,
129
+ // like we do in "hybrid" (picker + textbox) components like datepicker
130
+ return this._isHandlingUserInput;
131
+ }
132
+
122
133
  /**
123
134
  * Preprocessors could be considered 'live formatters'. Their result is shown to the user
124
135
  * on keyup instead of after blurring the field. The biggest difference between preprocessors
125
136
  * and formatters is their moment of execution: preprocessors are run before modelValue is
126
137
  * computed (and work based on view value), whereas formatters are run after the parser (and
127
138
  * are based on modelValue)
128
- * Automatically formats code while typing. It depends on a preprocessro that smartly
139
+ * Automatically formats code while typing. It depends on a preprocessor that smartly
129
140
  * updates the viewValue and caret position for best UX.
130
141
  * @example
131
142
  * ```js
@@ -278,15 +289,14 @@ const FormatMixinImplementation = superclass =>
278
289
  // - Why check for this.hasError?
279
290
  // We only want to format values that are considered valid. For best UX,
280
291
  // we only 'reward' valid inputs.
281
- // - Why check for _isHandlingUserInput?
292
+ // - Why check for _isEditingTextField?
282
293
  // Downwards sync is prevented whenever we are in an `@user-input-changed` flow, [2].
283
294
  // If we are in a 'imperatively set `.modelValue`' flow, [1], we want to reflect back
284
295
  // the value, no matter what.
285
296
  // This means, whenever we are in hasError and modelValue is set
286
297
  // imperatively, we DO want to format a value (it is the only way to get meaningful
287
298
  // input into `._inputNode` with modelValue as input)
288
-
289
- if (this._isHandlingUserInput && this.hasFeedbackFor?.includes('error') && this._inputNode) {
299
+ if (this._isEditingTextField && this.hasFeedbackFor?.includes('error') && this._inputNode) {
290
300
  return this.value;
291
301
  }
292
302
 
@@ -352,14 +352,11 @@ const FormGroupMixinImplementation = superclass =>
352
352
  this.formElements._keys().forEach(name => {
353
353
  const elem = this.formElements[name];
354
354
  if (elem instanceof FormControlsCollection) {
355
- // @ts-ignore - dynamic property access
356
355
  result[name] = elem.filter(el => _filterFn(el, property)).map(el => el[property]);
357
356
  } else if (_filterFn(elem, property)) {
358
357
  if (typeof elem._getFromAllFormElements === 'function') {
359
- // @ts-ignore - dynamic property access
360
358
  result[name] = elem._getFromAllFormElements(property);
361
359
  } else {
362
- // @ts-ignore - dynamic property access
363
360
  result[name] = elem[property];
364
361
  }
365
362
  }
@@ -389,7 +386,6 @@ const FormGroupMixinImplementation = superclass =>
389
386
  if (Array.isArray(this.formElements[name])) {
390
387
  this.formElements[name].forEach(
391
388
  (/** @type {FormControl} */ el, /** @type {number} */ index) => {
392
- // @ts-ignore - dynamic property access
393
389
  el[property] = values[name][index]; // eslint-disable-line no-param-reassign
394
390
  },
395
391
  );
@@ -397,7 +393,6 @@ const FormGroupMixinImplementation = superclass =>
397
393
  if (this.formElements[name]) {
398
394
  this.formElements[name][property] = values[name];
399
395
  } else {
400
- // @ts-ignore - dynamic property access
401
396
  this.__pendingValues[property][name] = values[name];
402
397
  }
403
398
  });
@@ -411,7 +406,6 @@ const FormGroupMixinImplementation = superclass =>
411
406
  _anyFormElementHas(property) {
412
407
  return Object.keys(this.formElements).some(name => {
413
408
  if (Array.isArray(this.formElements[name])) {
414
- // @ts-ignore - dynamic property access
415
409
  return this.formElements[name].some((/** @type {FormControl} */ el) => !!el[property]);
416
410
  }
417
411
  return !!this.formElements[name][property];
@@ -442,7 +436,6 @@ const FormGroupMixinImplementation = superclass =>
442
436
  _everyFormElementHas(property) {
443
437
  return Object.keys(this.formElements).every(name => {
444
438
  if (Array.isArray(this.formElements[name])) {
445
- // @ts-ignore - dynamic property access
446
439
  return this.formElements[name].every((/** @type {FormControl} */ el) => !!el[property]);
447
440
  }
448
441
  return !!this.formElements[name][property];
@@ -162,21 +162,15 @@ const FormRegistrarMixinImplementation = superclass =>
162
162
  }
163
163
 
164
164
  if (name.substr(-2) === '[]') {
165
- // @ts-ignore - dynamic named access to form elements
166
165
  if (!Array.isArray(this.formElements[name])) {
167
- // @ts-ignore
168
166
  this.formElements[name] = new FormControlsCollection();
169
167
  }
170
168
  if (indexToInsertAt > 0) {
171
- // @ts-ignore
172
169
  this.formElements[name].splice(indexToInsertAt, 0, child);
173
170
  } else {
174
- // @ts-ignore
175
171
  this.formElements[name].push(child);
176
172
  }
177
- // @ts-ignore
178
173
  } else if (!this.formElements[name]) {
179
- // @ts-ignore
180
174
  this.formElements[name] = child;
181
175
  } else {
182
176
  console.info('Error Node:', child); // eslint-disable-line no-console
@@ -200,17 +194,12 @@ const FormRegistrarMixinImplementation = superclass =>
200
194
  // 2. Handle name based object keys
201
195
  if (this._isFormOrFieldset) {
202
196
  const { name } = child; // FIXME: <-- ElementWithParentFormGroup should become LionFieldWithParentFormGroup so that "name" exists
203
- // @ts-ignore - dynamic named access to form elements
204
197
  if (name.substr(-2) === '[]' && this.formElements[name]) {
205
- // @ts-ignore
206
198
  const idx = this.formElements[name].indexOf(child);
207
199
  if (idx > -1) {
208
- // @ts-ignore
209
200
  this.formElements[name].splice(idx, 1);
210
201
  }
211
- // @ts-ignore
212
202
  } else if (this.formElements[name]) {
213
- // @ts-ignore
214
203
  delete this.formElements[name];
215
204
  }
216
205
  }
@@ -153,7 +153,6 @@ describe('FormControlMixin', () => {
153
153
  el.shadowRoot?.querySelector('.form-field__label'),
154
154
  );
155
155
  Object.entries(expectedValues).forEach(([key, val]) => {
156
- // @ts-ignore - dynamic style property access
157
156
  expect(labelStyle[key]).to.equal(val);
158
157
  });
159
158
  });
@@ -1,3 +1,6 @@
1
1
  import { runFormatMixinSuite } from '../test-suites/FormatMixin.suite.js';
2
2
 
3
- runFormatMixinSuite();
3
+ runFormatMixinSuite({
4
+ tagString: null,
5
+ modelValueType: String,
6
+ });
@@ -191,9 +191,7 @@ describe('Validator', () => {
191
191
  it('adds static ["_$isValidator$"] property as a marker to identify the Validator class across different lion versions (as instanceof cannot be used)', async () => {
192
192
  const myValidator = new Validator();
193
193
 
194
- // @ts-ignore - static property access
195
194
  expect(myValidator.constructor['_$isValidator$']).to.exist;
196
- // @ts-ignore - static property access
197
195
  expect(myValidator.constructor['_$isValidator$']).to.be.true;
198
196
  });
199
197
 
@@ -12,5 +12,6 @@ export function mimicUserInput(formControl, newViewValue, { caretIndex } = {}) {
12
12
  // eslint-disable-next-line no-param-reassign
13
13
  formControl._inputNode.selectionEnd = caretIndex;
14
14
  }
15
+ formControl._inputNode.focus();
15
16
  formControl._inputNode.dispatchEvent(new Event('input', { bubbles: true }));
16
17
  }