@lion/ui 0.16.0 → 0.17.0-menu-system.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 (248) hide show
  1. package/collapsible.js +1 -0
  2. package/components/button/src/LionButton.js +5 -0
  3. package/components/button/test-suites/LionButton.suite.js +1 -0
  4. package/components/calendar/src/LionCalendar.js +2 -0
  5. package/components/collapsible/src/DisclosureMixin.js +313 -0
  6. package/components/collapsible/types/DisclosureMixinTypes.ts +48 -0
  7. package/components/combobox/src/utils/makeMatchingTextBold.js +3 -1
  8. package/components/combobox/test/lion-combobox.test.js +105 -0
  9. package/components/form-core/src/form-group/FormGroupMixin.js +7 -0
  10. package/components/form-core/src/registration/FormRegistrarMixin.js +11 -0
  11. package/components/form-core/test/FormControlMixin.test.js +1 -0
  12. package/components/form-core/test/validate/Validator.test.js +2 -0
  13. package/components/form-core/test-suites/ValidateMixin.suite.js +2 -0
  14. package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +1 -0
  15. package/components/input-datepicker/src/LionInputDatepicker.js +6 -2
  16. package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -0
  17. package/components/input-datepicker/test/lion-input-datepicker.test.js +17 -2
  18. package/components/input-datepicker/translations/bg.js +1 -1
  19. package/components/input-datepicker/translations/cs.js +1 -1
  20. package/components/input-datepicker/translations/de.js +1 -1
  21. package/components/input-datepicker/translations/en.js +1 -1
  22. package/components/input-datepicker/translations/es.js +1 -1
  23. package/components/input-datepicker/translations/fr.js +1 -1
  24. package/components/input-datepicker/translations/hu.js +1 -1
  25. package/components/input-datepicker/translations/it.js +1 -1
  26. package/components/input-datepicker/translations/nl.js +1 -1
  27. package/components/input-datepicker/translations/pl.js +1 -1
  28. package/components/input-datepicker/translations/ro.js +1 -1
  29. package/components/input-datepicker/translations/ru.js +1 -1
  30. package/components/input-datepicker/translations/sk.js +1 -1
  31. package/components/input-datepicker/translations/tr.js +1 -1
  32. package/components/input-datepicker/translations/uk.js +1 -1
  33. package/components/input-datepicker/translations/zh.js +1 -1
  34. package/components/input-stepper/src/LionInputStepper.js +15 -7
  35. package/components/input-stepper/test-suites/lion-input-stepper.suite.js +28 -4
  36. package/components/localize/test/date/formatDate.test.js +1 -0
  37. package/components/menu/CHANGELOG.md +37 -0
  38. package/components/menu/README.md +335 -0
  39. package/components/menu/index.js +2 -0
  40. package/components/menu/lion-menu-overlay.js +3 -0
  41. package/components/menu/lion-menu.js +3 -0
  42. package/components/menu/lion-spinbutton.js +3 -0
  43. package/components/menu/lion-toolbar.js +3 -0
  44. package/components/menu/lion-tree.js +3 -0
  45. package/components/menu/package.json +46 -0
  46. package/components/menu/requirements.temp.md +12 -0
  47. package/components/menu/src/InteractiveListMixin.js +796 -0
  48. package/components/menu/src/LionMenu.js +250 -0
  49. package/components/menu/src/LionMenuHybrid.js +46 -0
  50. package/components/menu/src/LionMenuOverlay.js +155 -0
  51. package/components/menu/src/LionSpinbutton.js +213 -0
  52. package/components/menu/src/LionToolbar.js +94 -0
  53. package/components/menu/src/LionTree.js +52 -0
  54. package/components/menu/src/MultiLevelListMixin.js +275 -0
  55. package/components/menu/src/utils/isInView.js +26 -0
  56. package/components/menu/src/utils/listItemInteractions.js +104 -0
  57. package/components/menu/src/utils/uuid.js +3 -0
  58. package/components/menu/test/lion-menu.test.js +3 -0
  59. package/components/menu/test-suites/InteractiveListMixin.suite.js +142 -0
  60. package/components/menu/types/InteractiveListMixinTypes.d.ts +82 -0
  61. package/components/navigation-bar/README.md +1 -0
  62. package/components/navigation-bar/src/LionNavigationBar.js +449 -0
  63. package/components/navigation-bar/src/types.js +41 -0
  64. package/components/overlays/NEXT.md +49 -0
  65. package/components/overlays/src/OverlayController.js +165 -115
  66. package/components/overlays/src/OverlayMixin.js +75 -12
  67. package/components/overlays/src/OverlaysManager.js +102 -4
  68. package/components/overlays/src/overlayShadowDomStyle.js +2 -2
  69. package/components/overlays/src/utils/adopt-styles.js +2 -1
  70. package/components/overlays/src/utils/get-focusable-elements.js +4 -0
  71. package/components/overlays/src/utils/is-equal-config.js +4 -1
  72. package/components/overlays/test/OverlayController.test.js +117 -6
  73. package/components/overlays/test/OverlaysManager.test.js +1 -1
  74. package/components/overlays/types/OverlayConfig.ts +19 -4
  75. package/components/select-rich/test/lion-select-rich.test.js +3 -0
  76. package/custom-elements.json +12958 -2510
  77. package/dist-types/components/button/src/LionButton.d.ts +1 -0
  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/collapsible/src/DisclosureMixin.d.ts +3 -0
  82. package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +1 -0
  83. package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +24 -0
  84. package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +1 -0
  85. package/dist-types/components/combobox/src/utils/makeMatchingTextBold.d.ts.map +1 -1
  86. package/dist-types/components/dialog/src/LionDialog.d.ts +2 -1
  87. package/dist-types/components/dialog/src/LionDialog.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-suites/ValidateMixin.suite.d.ts.map +1 -1
  91. package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
  92. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
  93. package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
  94. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts +4 -2
  95. package/dist-types/components/input-stepper/src/LionInputStepper.d.ts.map +1 -1
  96. package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -1
  97. package/dist-types/components/menu/index.d.ts +3 -0
  98. package/dist-types/components/menu/index.d.ts.map +1 -0
  99. package/dist-types/components/menu/lion-menu-overlay.d.ts +2 -0
  100. package/dist-types/components/menu/lion-menu-overlay.d.ts.map +1 -0
  101. package/dist-types/components/menu/lion-menu.d.ts +2 -0
  102. package/dist-types/components/menu/lion-menu.d.ts.map +1 -0
  103. package/dist-types/components/menu/lion-spinbutton.d.ts +2 -0
  104. package/dist-types/components/menu/lion-spinbutton.d.ts.map +1 -0
  105. package/dist-types/components/menu/lion-toolbar.d.ts +2 -0
  106. package/dist-types/components/menu/lion-toolbar.d.ts.map +1 -0
  107. package/dist-types/components/menu/lion-tree.d.ts +2 -0
  108. package/dist-types/components/menu/lion-tree.d.ts.map +1 -0
  109. package/dist-types/components/menu/src/InteractiveListMixin.d.ts +611 -0
  110. package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
  111. package/dist-types/components/menu/src/LionMenu.d.ts +563 -0
  112. package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
  113. package/dist-types/components/menu/src/LionMenuHybrid.d.ts +19 -0
  114. package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +1 -0
  115. package/dist-types/components/menu/src/LionMenuOverlay.d.ts +1006 -0
  116. package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +1 -0
  117. package/dist-types/components/menu/src/LionSpinbutton.d.ts +58 -0
  118. package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +1 -0
  119. package/dist-types/components/menu/src/LionToolbar.d.ts +8 -0
  120. package/dist-types/components/menu/src/LionToolbar.d.ts.map +1 -0
  121. package/dist-types/components/menu/src/LionTree.d.ts +445 -0
  122. package/dist-types/components/menu/src/LionTree.d.ts.map +1 -0
  123. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +493 -0
  124. package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
  125. package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
  126. package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
  127. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +42 -0
  128. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
  129. package/dist-types/components/menu/src/utils/uuid.d.ts +2 -0
  130. package/dist-types/components/menu/src/utils/uuid.d.ts.map +1 -0
  131. package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
  132. package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
  133. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +13 -0
  134. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
  135. package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +226 -0
  136. package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +1 -0
  137. package/dist-types/components/navigation-bar/src/types.d.ts +85 -0
  138. package/dist-types/components/navigation-bar/src/types.d.ts.map +1 -0
  139. package/dist-types/components/overlays/src/OverlayController.d.ts +7 -13
  140. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  141. package/dist-types/components/overlays/src/OverlayMixin.d.ts +3 -0
  142. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  143. package/dist-types/components/overlays/src/OverlaysManager.d.ts +33 -2
  144. package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
  145. package/dist-types/components/overlays/src/utils/get-focusable-elements.d.ts.map +1 -1
  146. package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
  147. package/dist-types/components/overlays/types/OverlayConfig.d.ts +6 -2
  148. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  149. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +11 -2
  150. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  151. package/dist-types/exports/define/lion-item.d.ts +2 -0
  152. package/dist-types/exports/define/lion-item.d.ts.map +1 -0
  153. package/dist-types/exports/define/lion-menu-overlay.d.ts +2 -0
  154. package/dist-types/exports/define/lion-menu-overlay.d.ts.map +1 -0
  155. package/dist-types/exports/define/lion-menu.d.ts +2 -0
  156. package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
  157. package/dist-types/exports/define/lion-navigation-bar.d.ts +2 -0
  158. package/dist-types/exports/define/lion-navigation-bar.d.ts.map +1 -0
  159. package/dist-types/exports/define/lion-toolbar.d.ts +2 -0
  160. package/dist-types/exports/define/lion-toolbar.d.ts.map +1 -0
  161. package/dist-types/exports/define/lion-tree.d.ts +2 -0
  162. package/dist-types/exports/define/lion-tree.d.ts.map +1 -0
  163. package/dist-types/exports/menu.d.ts +7 -0
  164. package/dist-types/exports/menu.d.ts.map +1 -0
  165. package/dist-types/exports/navigation-bar.d.ts +2 -0
  166. package/dist-types/exports/navigation-bar.d.ts.map +1 -0
  167. package/dist-types/exports/overlays.d.ts +2 -0
  168. package/dist-types/exports/types/overlays.d.ts +1 -0
  169. package/dist-types/exports/types/overlays.d.ts.map +1 -1
  170. package/dist-types/tsconfig.tsbuildinfo +1 -1
  171. package/docs/components/checkbox-group/overview.md +2 -2
  172. package/docs/components/collapsible/overview.md +1 -1
  173. package/docs/components/combobox/overview.md +1 -1
  174. package/docs/components/combobox/use-cases.md +1 -1
  175. package/docs/components/dialog/overview.md +1 -1
  176. package/docs/components/fieldset/overview.md +5 -5
  177. package/docs/components/form/overview.md +3 -3
  178. package/docs/components/form/use-cases.md +2 -2
  179. package/docs/components/icon/use-cases.md +1 -1
  180. package/docs/components/index.md +1 -1
  181. package/docs/components/input/overview.md +1 -1
  182. package/docs/components/input-amount/overview.md +3 -3
  183. package/docs/components/input-date/overview.md +3 -3
  184. package/docs/components/input-datepicker/overview.md +5 -5
  185. package/docs/components/input-datepicker/use-cases.md +16 -1
  186. package/docs/components/input-email/overview.md +2 -2
  187. package/docs/components/input-file/overview.md +1 -1
  188. package/docs/components/input-iban/overview.md +2 -2
  189. package/docs/components/input-range/api-table.md +1 -1
  190. package/docs/components/input-range/overview.md +2 -2
  191. package/docs/components/input-stepper/api-table.md +2 -2
  192. package/docs/components/input-stepper/overview.md +1 -1
  193. package/docs/components/input-stepper/use-cases.md +26 -0
  194. package/docs/components/input-tel/overview.md +1 -1
  195. package/docs/components/input-tel/use-cases.md +6 -6
  196. package/docs/components/input-tel-dropdown/overview.md +1 -1
  197. package/docs/components/listbox/use-cases.md +1 -1
  198. package/docs/components/menu/api-table.md +450 -0
  199. package/docs/components/menu/applyMenuDemoStyles.js +173 -0
  200. package/docs/components/menu/extensions.md +216 -0
  201. package/docs/components/menu/index.md +13 -0
  202. package/docs/components/menu/overview.md +422 -0
  203. package/docs/components/radio-group/overview.md +3 -3
  204. package/docs/components/select/use-cases.md +1 -1
  205. package/docs/components/select-rich/api-table.md +1 -1
  206. package/docs/components/select-rich/use-cases.md +2 -2
  207. package/docs/components/tabs/examples.md +1 -1
  208. package/docs/fundamentals/index.md +4 -4
  209. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  210. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  211. package/docs/fundamentals/rationales/accessibility.md +1 -1
  212. package/docs/fundamentals/systems/core/SlotMixin.md +18 -18
  213. package/docs/fundamentals/systems/core/overview.md +1 -1
  214. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  215. package/docs/fundamentals/systems/form/interaction-states.md +0 -1
  216. package/docs/fundamentals/systems/form/model-value.md +1 -1
  217. package/docs/fundamentals/systems/form/overview.md +28 -28
  218. package/docs/fundamentals/systems/form/validate.md +2 -2
  219. package/docs/fundamentals/systems/localize/overview.md +4 -4
  220. package/docs/fundamentals/systems/localize/text.md +1 -1
  221. package/docs/fundamentals/systems/overlays/api-table.md +98 -50
  222. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  223. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  224. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  225. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  226. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  227. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  228. package/docs/guides/how-to/create-a-form.md +4 -4
  229. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  230. package/docs/guides/how-to/index.md +14 -0
  231. package/docs/guides/index.md +8 -8
  232. package/docs/guides/principles/index.md +5 -5
  233. package/docs/guides/principles/styling.md +1 -2
  234. package/exports/collapsible.js +1 -0
  235. package/exports/define/lion-item.js +3 -0
  236. package/exports/define/lion-menu-overlay.js +3 -0
  237. package/exports/define/lion-menu.js +3 -0
  238. package/exports/define/lion-navigation-bar.js +3 -0
  239. package/exports/define/lion-toolbar.js +3 -0
  240. package/exports/define/lion-tree.js +3 -0
  241. package/exports/menu.js +6 -0
  242. package/exports/navigation-bar.js +1 -0
  243. package/exports/overlays.js +2 -0
  244. package/exports/types/overlays.ts +1 -0
  245. package/menu.js +6 -0
  246. package/navigation-bar.js +1 -0
  247. package/overlays.js +2 -0
  248. package/package.json +1 -1
@@ -274,8 +274,12 @@ export class LionInputDatepicker extends ScopedElementsMixin(
274
274
  type="button"
275
275
  @click="${this.__openCalendarOverlay}"
276
276
  id="${this.__invokerId}"
277
- aria-label="${this.msgLit('lion-input-datepicker:openDatepickerLabel')}"
278
- title="${this.msgLit('lion-input-datepicker:openDatepickerLabel')}"
277
+ aria-label="${this.msgLit('lion-input-datepicker:openDatepickerLabel', {
278
+ fieldName: this.fieldName || 'date',
279
+ })}"
280
+ title="${this.msgLit('lion-input-datepicker:openDatepickerLabel', {
281
+ fieldName: this.fieldName || 'date',
282
+ })}"
279
283
  >
280
284
  ${this._invokerIconTemplate()}
281
285
  </button>
@@ -6,6 +6,7 @@ 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
9
10
  combinedResult.default[key] = val;
10
11
  });
11
12
  }
@@ -538,8 +538,8 @@ describe('<lion-input-datepicker>', () => {
538
538
  const elObj = new DatepickerInputObject(el);
539
539
  await elObj.openCalendar();
540
540
 
541
- expect(elObj.invokerEl.getAttribute('title')).to.equal('Open date picker');
542
- expect(elObj.invokerEl.getAttribute('aria-label')).to.equal('Open date picker');
541
+ expect(elObj.invokerEl.getAttribute('title')).to.equal('Open "date" picker');
542
+ expect(elObj.invokerEl.getAttribute('aria-label')).to.equal('Open "date" picker');
543
543
  });
544
544
 
545
545
  it('adds [aria-expanded] to invoker button', async () => {
@@ -590,6 +590,21 @@ describe('<lion-input-datepicker>', () => {
590
590
  await expect(elObj.calendarEl).to.be.accessible();
591
591
  elObj.overlayCloseButtonEl.click();
592
592
  });
593
+
594
+ it('have different aria-label when multiple invoker', async () => {
595
+ const el = await fixture(html`
596
+ <lion-input-datepicker label="Start date" name="startDate"></lion-input-datepicker>
597
+ <lion-input-datepicker label="End date" name="endDate"></lion-input-datepicker>
598
+ `);
599
+
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;
605
+
606
+ expect(startLabel).to.not.equal(endLabel);
607
+ });
593
608
  });
594
609
 
595
610
  describe.skip('Subclassers', () => {
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Избор на отворена дата',
2
+ openDatepickerLabel: 'Отворете "{fieldName}" избор',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Otevřete pro výběr data',
2
+ openDatepickerLabel: 'Otevřít výběr "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Datumswähler öffnen',
2
+ openDatepickerLabel: '"{fieldName}"-Wähler öffnen',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Open date picker',
2
+ openDatepickerLabel: 'Open "{fieldName}" picker',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Abrir selector de fecha',
2
+ openDatepickerLabel: 'Abrir selector "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Ouvrir le sélecteur de dates',
2
+ openDatepickerLabel: 'Ouvrir le sélecteur "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Dátumválasztó megnyitása',
2
+ openDatepickerLabel: 'Megnyitás "{fieldName}" választóhoz',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Raccoglitore di data aperta',
2
+ openDatepickerLabel: 'Apri il selettore "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Open kalender',
2
+ openDatepickerLabel: 'Open "{fieldName}" kiezer',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Otwórz pole daty',
2
+ openDatepickerLabel: 'Otwórz selektor "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Deschidere selector dată',
2
+ openDatepickerLabel: 'Deschideți selectorul "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Открыть модуль выбора даты',
2
+ openDatepickerLabel: 'Открыть выбор "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Otvoriť nástroj na výber dátumu',
2
+ openDatepickerLabel: 'Otvoriť výber "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Tarih seçimini aç',
2
+ openDatepickerLabel: '"{fieldName}" seçiciyi açın',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: 'Відкрити модуль вибору дати',
2
+ openDatepickerLabel: 'Відкрити вибір "{fieldName}"',
3
3
  };
@@ -1,3 +1,3 @@
1
1
  export default {
2
- openDatepickerLabel: '打开日期选择器',
2
+ openDatepickerLabel: '打开"{fieldName}"选择器',
3
3
  };
@@ -1,7 +1,7 @@
1
- import { html, css, render, nothing } from 'lit';
2
- import { formatNumber, LocalizeMixin, parseNumber } from '@lion/ui/localize-no-side-effects.js';
1
+ import { IsNumber, MaxNumber, MinNumber } from '@lion/ui/form-core.js';
3
2
  import { LionInput } from '@lion/ui/input.js';
4
- import { IsNumber, MinNumber, MaxNumber } from '@lion/ui/form-core.js';
3
+ import { formatNumber, LocalizeMixin, parseNumber } from '@lion/ui/localize-no-side-effects.js';
4
+ import { css, html, nothing, render } from 'lit';
5
5
  import { localizeNamespaceLoader } from './localizeNamespaceLoader.js';
6
6
 
7
7
  /**
@@ -280,9 +280,14 @@ export class LionInputStepper extends LocalizeMixin(LionInput) {
280
280
 
281
281
  /**
282
282
  * Increment the value based on given step or default step value is 1
283
+ * @param {Event} [ev] - Click event
283
284
  * @protected
284
285
  */
285
- _increment() {
286
+ _increment(ev) {
287
+ if (this.disabled || this.readOnly) {
288
+ ev?.preventDefault();
289
+ return;
290
+ }
286
291
  const { step, min, max } = this.values;
287
292
  const stepMin = min !== Infinity ? min : 0;
288
293
  const epsilon = 1e-10; // Tolerance for floating-point comparison
@@ -309,9 +314,14 @@ export class LionInputStepper extends LocalizeMixin(LionInput) {
309
314
 
310
315
  /**
311
316
  * Decrement the value based on given step or default step value is 1
317
+ * @param {Event} [ev] - Click event
312
318
  * @protected
313
319
  */
314
- _decrement() {
320
+ _decrement(ev) {
321
+ if (this.disabled || this.readOnly) {
322
+ ev?.preventDefault();
323
+ return;
324
+ }
315
325
  const { step, max, min } = this.values;
316
326
  const stepMin = min !== Infinity ? min : 0;
317
327
  const epsilon = 1e-10; // Tolerance for floating-point comparison
@@ -410,7 +420,6 @@ export class LionInputStepper extends LocalizeMixin(LionInput) {
410
420
  _decrementorTemplate() {
411
421
  return html`
412
422
  <button
413
- ?disabled=${this.disabled || this.readOnly}
414
423
  @click=${this._decrement}
415
424
  type="button"
416
425
  aria-label="${this.msgLit('lion-input-stepper:decrease')} ${this.fieldName}"
@@ -428,7 +437,6 @@ export class LionInputStepper extends LocalizeMixin(LionInput) {
428
437
  _incrementorTemplate() {
429
438
  return html`
430
439
  <button
431
- ?disabled=${this.disabled || this.readOnly}
432
440
  @click=${this._increment}
433
441
  type="button"
434
442
  aria-label="${this.msgLit('lion-input-stepper:increase')} ${this.fieldName}"
@@ -1,14 +1,14 @@
1
+ import { formatNumber } from '@lion/ui/localize-no-side-effects.js';
1
2
  import {
2
- expect,
3
- defineCE,
4
3
  fixture as _fixture,
4
+ defineCE,
5
+ expect,
6
+ html,
5
7
  nextFrame,
6
8
  unsafeStatic,
7
- html,
8
9
  } from '@open-wc/testing';
9
10
  import { nothing } from 'lit';
10
11
  import sinon from 'sinon';
11
- import { formatNumber } from '@lion/ui/localize-no-side-effects.js';
12
12
  import { LionInputStepper } from '../src/LionInputStepper.js';
13
13
 
14
14
  /**
@@ -29,6 +29,14 @@ export function runInputStepperSuite(klass = LionInputStepper) {
29
29
  max="200"
30
30
  label="Label"
31
31
  ></${tag}>`;
32
+ const inputStepperReadOnly = html`<${tag}
33
+ step="10"
34
+ min="100"
35
+ max="200"
36
+ label="Label"
37
+ value="1"
38
+ readonly
39
+ ></${tag}>`;
32
40
 
33
41
  describe('InputStepper', async () => {
34
42
  describe('Stepper', () => {
@@ -104,6 +112,22 @@ export function runInputStepperSuite(klass = LionInputStepper) {
104
112
  });
105
113
 
106
114
  describe('User interaction', () => {
115
+ it('should NOT increment the value to 1 on [ArrowUp] when is readonly', async () => {
116
+ const el = await fixture(inputStepperReadOnly);
117
+ expect(el.value).to.equal('1');
118
+ el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp' }));
119
+ await el.updateComplete;
120
+ expect(el.value).to.equal('1');
121
+ });
122
+
123
+ it('should NOT decrement the value to -1 on [ArrowDown] when is readonly', async () => {
124
+ const el = await fixture(inputStepperReadOnly);
125
+ expect(el.value).to.equal('1');
126
+ el.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown' }));
127
+ await el.updateComplete;
128
+ expect(el.value).to.equal('1');
129
+ });
130
+
107
131
  it('should increment the value to 1 on [ArrowUp]', async () => {
108
132
  const el = await fixture(defaultInputStepper);
109
133
  expect(el.value).to.equal('');
@@ -210,6 +210,7 @@ describe('formatDate', () => {
210
210
  locale,
211
211
  };
212
212
  const parsedDate = /** @type {Date} */ (parseDate('12.10.2019'));
213
+ // @ts-ignore - dynamic locale key access
213
214
  expect(formatDate(parsedDate, options)).to.equal(LOCALE_FORMATTED_DATE_MAP[locale]);
214
215
  });
215
216
  });
@@ -0,0 +1,37 @@
1
+ Allow advanced preprocessing
2
+
3
+ - Turn '1' into '01-__-____'
4
+ - Turn ’20’ into ’20-’, -> ’20-4’ into ’20-04’ etc…
5
+
6
+ See: https://nosir.github.io/cleave.js/(But we should enhance the UX when editing the middle of a date)So:
7
+
8
+ ```js
9
+ /** * @returns {string | { viewValue:string, caretIndex:number } } */
10
+ preprocessor(viewValue, { previousViewValue = ‘’, currentCaretIndex }) {
11
+ const diff = viewValue.length - previousViewValue.length;
12
+ if (diff === -1) && !isNaN(Number(previousViewValue[currentCaretIndex]))) {
13
+ // don’t respond to delete actions
14
+ return viewValue;
15
+ }
16
+
17
+ let newValue = '';
18
+ const strippedVal = viewValue.replace('-', '');
19
+ let dashesPlaced = 0;
20
+ let newCaretIndex;
21
+ for (let i = 0; i < 10; i+= 1) {
22
+ if (i === 2 || i === 4) {
23
+ newValue += ‘-’;
24
+ dashesPlaced += 1;
25
+ }
26
+ else if (i < strippedVal.length + dashesPlaced) {
27
+ newValue += strippedVal[i];
28
+ } else {
29
+ newValue += ‘_’;
30
+ if (newCaretIndex === undefined) {
31
+ newCaretIndex = i;
32
+ }
33
+ }
34
+ }
35
+ return { viewValue: newValue, caretIndex: newCaretIndex };
36
+ }
37
+ ```
@@ -0,0 +1,335 @@
1
+ # Menu
2
+
3
+ A menu is a widget that offers a list of choices to the user, such as a set of actions or functions. A menu is usually opened, or made visible, by activating a menu button, choosing an item in a menu that opens a sub menu, or by invoking a command, such as Shift + F10 in Windows, that opens a context specific menu. When a user activates a choice in a menu, the menu usually closes unless the choice opened a submenu.
4
+
5
+ A menu that is visually persistent is a menubar. A menubar is typically horizontal and is often used to create a menu bar similar to those found near the top of the window in many desktop applications, offering the user quick access to a consistent set of commands.
6
+
7
+ A common convention for indicating that a menu item launches a dialog box is to append "…" (ellipsis) to the menu item label, e.g., "Save as …".
8
+
9
+ > From [menu wai-aria best practices](https://www.w3.org/TR/wai-aria-practices/#menu)
10
+
11
+ ```js script
12
+ import { html } from 'lit-html';
13
+ import './lion-menu.js';
14
+ import './lion-menu-overlay.js';
15
+ import './lion-tree.js';
16
+ import './lion-toolbar.js';
17
+ import './lion-spinbutton.js';
18
+ import { applyMenuDemoStyles } from './applyMenuDemoStyles.js';
19
+
20
+ applyMenuDemoStyles();
21
+
22
+ export default {
23
+ title: 'Navigation/Menu',
24
+ };
25
+ ```
26
+
27
+ ```js preview-story
28
+ export const menuButton = () => html`
29
+ <nav>
30
+ <button data-invoker>Open menu</button>
31
+ <lion-menu>
32
+ <div role="menuitem">Go to Definition</div>
33
+ <div role="menuitem">Go to Type Definition</div>
34
+ <div>
35
+ <div role="menuitem" data-invoker>Peek</div>
36
+ <lion-menu>
37
+ <div role="menuitem">Peek Call Hierarchy</div>
38
+ <div role="separator"></div>
39
+ <div role="menuitem">Peek Definition</div>
40
+ </lion-menu>
41
+ </div>
42
+ <div role="separator"></div>
43
+ <div role="menuitem">Find all References</div>
44
+ </lion-menu>
45
+ </nav>
46
+ `;
47
+ ```
48
+
49
+ ```js preview-story
50
+ export const menuButtonZ = () => html`
51
+ <nav>
52
+ <button data-invoker for="menu">Open menu</button>
53
+ <lion-menu id="menu">
54
+ <lion-menuitem> Go to Definition </lion-menuitem>
55
+ <lion-menuitem> Go to Type Definition </lion-menuitem>
56
+ <lion-menuitem>
57
+ <button slot="invoker">Peek</button>
58
+ <lion-menu>
59
+ <lion-menuitem type="radio"> Peek Call Hierarchy </lion-menuitem>
60
+ <div role="separator"></div>
61
+ <lion-menuitem type="radio"> Peek Definition </lion-menuitem>
62
+ </lion-menu>
63
+ </lion-menuitem>
64
+ <div role="separator"></div>
65
+ <lion-menuitem type="checkbox"> Find all References </lion-menuitem>
66
+ </lion-menu>
67
+ </nav>
68
+ `;
69
+ ```
70
+
71
+ ## Groups, menuitemradios and menuitemcheckboxes
72
+
73
+ From [wai aria menu fragment](https://www.w3.org/TR/wai-aria-practices-1.1/examples/menubar/menubar-2/menubar-2.html)
74
+
75
+ ```js preview-story
76
+ export const groups = () => html`
77
+ <lion-menu bar invoker-interaction="hover">
78
+ <div>
79
+ <div role="menuitem">Font</div>
80
+ <lion-menu-overlay aria-label="Font">
81
+ <div role="menuitemradio">Sans-serif</div>
82
+ <div role="menuitemradio">Serif</div>
83
+ <div role="menuitemradio">Monospace</div>
84
+ <div role="menuitemradio">Fantasy</div>
85
+ </lion-menu-overlay>
86
+ </div>
87
+ <div>
88
+ <div role="menuitem">Style/Color</div>
89
+ <lion-menu-overlay aria-label="Style/Color">
90
+ <div role="menuitemcheckbox" aria-checked="true">Bold</div>
91
+ <div role="menuitemcheckbox" aria-checked="true">Italic</div>
92
+ <div role="separator"></div>
93
+ <div role="group" aria-label="Text Color">
94
+ <div role="menuitemradio" aria-checked="false">Black</div>
95
+ <div role="menuitemradio" aria-checked="false">Blue</div>
96
+ <div role="menuitemradio" aria-checked="true">Red</div>
97
+ <div role="menuitemradio" aria-checked="false">Green</div>
98
+ </div>
99
+ <div role="separator"></div>
100
+ <div role="group" aria-label="Text Decoration">
101
+ <div role="menuitemradio" aria-checked="true">None</div>
102
+ <div role="menuitemradio" aria-checked="false">Overline</div>
103
+ <div role="menuitemradio" aria-checked="false">Line-through</div>
104
+ <div role="menuitemradio" aria-checked="false">Underline</div>
105
+ </div>
106
+ </lion-menu-overlay>
107
+ </div>
108
+ </lion-menu>
109
+ `;
110
+ ```
111
+
112
+ ## Tree
113
+
114
+ ```js preview-story
115
+ export const tree = () => html`
116
+ <lion-tree>
117
+ <div>
118
+ <div role="treeitem">Fruits</div>
119
+ <lion-tree>
120
+ <div role="treeitem">Peek Call Hierarchy</div>
121
+ <div role="treeitem">Peek Definition</div>
122
+ </lion-tree>
123
+ </div>
124
+ <div>
125
+ <div role="treeitem">Vegetables</div>
126
+ <lion-tree>
127
+ <div role="treeitem">Peek Call Hierarchy</div>
128
+ <div>
129
+ <div role="treeitem">Peek</div>
130
+ <lion-tree>
131
+ <div role="treeitem">Peek Call Hierarchy</div>
132
+ <div role="treeitem">Peek Definition</div>
133
+ </lion-tree>
134
+ </div>
135
+ </lion-tree>
136
+ </div>
137
+ <div>
138
+ <div role="treeitem">Grains</div>
139
+ <lion-tree>
140
+ <div role="treeitem">Peek Call Hierarchy</div>
141
+ <div role="treeitem">Peek Definition</div>
142
+ </lion-tree>
143
+ </div>
144
+ </lion-tree>
145
+ `;
146
+ ```
147
+
148
+ ## Disclosure menu
149
+
150
+ See https://www.w3.org/TR/wai-aria-practices-1.1/examples/disclosure/disclosure-navigation.html
151
+
152
+ ```js preview-story
153
+ export const disclosureMenu = () => html`
154
+ <nav aria-label="Mythical University">
155
+ <lion-menu bar>
156
+ <div role="listitem">
157
+ <button data-invoker>About</button>
158
+ <lion-menu>
159
+ <div role="listitem">
160
+ <a href="#mythical-page-content">Overview</a>
161
+ </div>
162
+ <div role="listitem">
163
+ <a href="#mythical-page-content">Administration</a>
164
+ </div>
165
+ <div role="listitem">
166
+ <a href="#mythical-page-content">Facts</a>
167
+ </div>
168
+ <div role="listitem">
169
+ <a href="#mythical-page-content">Campus Tours</a>
170
+ </div>
171
+ </ul>
172
+ </div>
173
+ <div role="listitem">
174
+ <button data-invoker>
175
+ Admissions
176
+ </button>
177
+ <lion-menu id="id_admissions_menu">
178
+ <div role="listitem">
179
+ <a href="#mythical-page-content">Apply</a>
180
+ </div>
181
+ <div role="listitem">
182
+ <a href="#mythical-page-content">Tuition</a>
183
+ </div>
184
+ <div role="listitem">
185
+ <a href="#mythical-page-content">Sign Up</a>
186
+ </div>
187
+ <div role="listitem">
188
+ <a href="#mythical-page-content">Visit</a>
189
+ </div>
190
+ <div role="listitem">
191
+ <a href="#mythical-page-content">Photo Tour</a>
192
+ </div>
193
+ <div role="listitem">
194
+ <a href="#mythical-page-content">Connect</a>
195
+ </div>
196
+ </ul>
197
+ </div>
198
+ <div role="listitem">
199
+ <button data-invoker>Academics</button>
200
+ <lion-menu>
201
+ <div role="listitem">
202
+ <a href="#mythical-page-content">Colleges & Schools</a>
203
+ </div>
204
+ <div role="listitem">
205
+ <a href="#mythical-page-content">Programs of Study</a>
206
+ </div>
207
+ <div role="listitem">
208
+ <a href="#mythical-page-content">Honors Programs</a>
209
+ </div>
210
+ <div role="listitem">
211
+ <a href="#mythical-page-content">Online Courses</a>
212
+ </div>
213
+ <div role="listitem">
214
+ <a href="#mythical-page-content">Course Explorer</a>
215
+ </div>
216
+ <div role="listitem">
217
+ <a href="#mythical-page-content">Register for Class</a>
218
+ </div>
219
+ <div role="listitem">
220
+ <a href="#mythical-page-content">Academic Calendar</a>
221
+ </div>
222
+ <div role="listitem">
223
+ <a href="#mythical-page-content">Transcripts</a>
224
+ </div>
225
+ </ul>
226
+ </div>
227
+ </ul>
228
+ </nav>
229
+ `;
230
+ ```
231
+
232
+ ## Toolbar
233
+
234
+ From [wai aria toolbar](https://www.w3.org/TR/wai-aria-practices-1.2/examples/toolbar/toolbar.html)
235
+
236
+ ```js preview-story
237
+ export const toolbar = () => html`
238
+ <lion-toolbar>
239
+ <div>
240
+ <button data-item title="bold" aria-label="Bold">
241
+ <span class="fas fa-bold" aria-hidden="true"></span>
242
+ </button>
243
+ <button data-item title="italic" aria-label="Italic">
244
+ <span class="fas fa-italic" aria-hidden="true"></span>
245
+ </button>
246
+ <button data-item title="underline" aria-label="Underline">
247
+ <span class="fas fa-underline" aria-hidden="true"></span>
248
+ </button>
249
+ </div>
250
+ <div role="separator"></div>
251
+ <div role="radiogroup" aria-label="Text Alignment">
252
+ <button data-item role="radio" aria-label="Text Align Left">
253
+ <span class="fas fa-align-left" aria-hidden="true"></span>
254
+ </button>
255
+ <button data-item role="radio" aria-label="Text Align Center">
256
+ <span class="fas fa-align-center" aria-hidden="true"></span>
257
+ </button>
258
+ <button data-item role="radio" aria-label="Text Align Right">
259
+ <span class="fas fa-align-right" aria-hidden="true"></span>
260
+ </button>
261
+ </div>
262
+ <div role="separator"></div>
263
+
264
+ <lion-spinbutton data-item now="20" min="12" max="40" unit="px"></lion-spinbutton>
265
+ <div role="separator"></div>
266
+
267
+ <div>
268
+ <div role="menuitem">Font</div>
269
+ <lion-menu-overlay aria-label="Font">
270
+ <div role="menuitemradio">Sans-serif</div>
271
+ <div role="menuitemradio">Serif</div>
272
+ <div role="menuitemradio">Monospace</div>
273
+ <div role="menuitemradio">Fantasy</div>
274
+ </lion-menu-overlay>
275
+ </div>
276
+ <div>
277
+ <div role="menuitem">Style/Color</div>
278
+ <lion-menu-overlay aria-label="Style/Color">
279
+ <div role="menuitemcheckbox" aria-checked="true">Bold</div>
280
+ <div role="menuitemcheckbox" aria-checked="true">Italic</div>
281
+ <div role="separator"></div>
282
+ <div role="group" aria-label="Text Color">
283
+ <div role="menuitemradio" aria-checked="false">Black</div>
284
+ <div role="menuitemradio" aria-checked="false">Blue</div>
285
+ <div role="menuitemradio" aria-checked="true">Red</div>
286
+ <div role="menuitemradio" aria-checked="false">Green</div>
287
+ </div>
288
+ <div role="separator"></div>
289
+ <div role="group" aria-label="Text Decoration">
290
+ <div role="menuitemradio" aria-checked="true">None</div>
291
+ <div role="menuitemradio" aria-checked="false">Overline</div>
292
+ <div role="menuitemradio" aria-checked="false">Line-through</div>
293
+ <div role="menuitemradio" aria-checked="false">Underline</div>
294
+ </div>
295
+ </lion-menu-overlay>
296
+ </div>
297
+ </lion-toolbar>
298
+ `;
299
+ ```
300
+
301
+ ## Tree lion-item
302
+
303
+ ```js preview-storyb
304
+ export const tree = () => html`
305
+ <lion-tree>
306
+ <lion-item>
307
+ <div>Fruits</div>
308
+ <lion-tree>
309
+ <lion-item>Peek Call Hierarchy</lion-item>
310
+ <lion-item>Peek Definition</lion-item>
311
+ </lion-tree>
312
+ </lion-item>
313
+ <lion-item>
314
+ <div>Vegetables</div>
315
+ <lion-tree>
316
+ <lion-item>Peek Call Hierarchy</lion-item>
317
+ <lion-item>
318
+ <div>Peek</div>
319
+ <lion-tree>
320
+ <lion-item>Peek Call Hierarchy</lion-item>
321
+ <lion-item>Peek Definition</lion-item>
322
+ </lion-tree>
323
+ </lion-item>
324
+ </lion-tree>
325
+ </lion-item>
326
+ <lion-item>
327
+ <div>Grains</div>
328
+ <lion-tree>
329
+ <lion-item>Peek Call Hierarchy</lion-item>
330
+ <lion-item>Peek Definition</lion-item>
331
+ </lion-tree>
332
+ </lion-item>
333
+ </lion-tree>
334
+ `;
335
+ ```
@@ -0,0 +1,2 @@
1
+ export { LionMenu } from './src/LionMenu.js';
2
+ export { InteractiveListMixin } from './src/InteractiveListMixin.js';
@@ -0,0 +1,3 @@
1
+ import { LionMenuOverlay } from './src/LionMenuOverlay.js';
2
+
3
+ customElements.define('lion-menu-overlay', LionMenuOverlay);