@lion/ui 0.21.1-menu-system.0 → 0.22.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 (185) hide show
  1. package/components/button/src/LionButton.js +0 -4
  2. package/components/form/test/lion-form.test.js +4 -3
  3. package/components/form-core/src/form-group/FormGroupMixin.js +37 -0
  4. package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +25 -0
  5. package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +2 -2
  6. package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +12 -3
  7. package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +10 -3
  8. package/components/overlays/src/OverlayController.js +111 -296
  9. package/components/overlays/src/OverlayMixin.js +17 -76
  10. package/components/overlays/src/utils/adopt-styles.js +1 -1
  11. package/components/overlays/src/utils/is-equal-config.js +6 -15
  12. package/components/overlays/test/OverlayController.test.js +24 -144
  13. package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
  14. package/components/overlays/types/ArrowMixinTypes.ts +3 -1
  15. package/components/overlays/types/OverlayConfig.ts +5 -20
  16. package/components/overlays/types/OverlayMixinTypes.ts +0 -2
  17. package/custom-elements.json +6260 -13587
  18. package/dist-types/components/button/src/LionButton.d.ts +0 -1
  19. package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
  20. package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
  21. package/dist-types/components/dialog/src/LionDialog.d.ts +2 -6
  22. package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
  23. package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts +1 -0
  24. package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
  25. package/dist-types/components/form-core/test-suites/form-group/FormGroupMixin.suite.d.ts.map +1 -1
  26. package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
  27. package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +1 -1
  28. package/dist-types/components/overlays/src/OverlayController.d.ts +5 -22
  29. package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
  30. package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
  31. package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
  32. package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
  33. package/dist-types/components/overlays/types/OverlayConfig.d.ts +2 -12
  34. package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
  35. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +0 -1
  36. package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
  37. package/dist-types/components/select-rich/src/LionSelectRich.d.ts +2 -6
  38. package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
  39. package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
  40. package/dist-types/exports/overlays.d.ts +0 -6
  41. package/dist-types/exports/overlays.d.ts.map +1 -1
  42. package/dist-types/tsconfig.tsbuildinfo +1 -1
  43. package/docs/components/checkbox-group/overview.md +2 -2
  44. package/docs/components/collapsible/overview.md +1 -1
  45. package/docs/components/combobox/api-table.md +39 -53
  46. package/docs/components/combobox/overview.md +1 -1
  47. package/docs/components/combobox/use-cases.md +1 -1
  48. package/docs/components/dialog/api-table.md +6 -32
  49. package/docs/components/dialog/overview.md +1 -1
  50. package/docs/components/fieldset/overview.md +5 -5
  51. package/docs/components/form/overview.md +3 -3
  52. package/docs/components/form/use-cases.md +2 -2
  53. package/docs/components/icon/use-cases.md +1 -1
  54. package/docs/components/input/overview.md +1 -1
  55. package/docs/components/input-amount/overview.md +3 -3
  56. package/docs/components/input-date/overview.md +3 -3
  57. package/docs/components/input-datepicker/api-table.md +45 -63
  58. package/docs/components/input-datepicker/overview.md +5 -5
  59. package/docs/components/input-email/overview.md +2 -2
  60. package/docs/components/input-file/overview.md +1 -1
  61. package/docs/components/input-iban/overview.md +2 -2
  62. package/docs/components/input-range/overview.md +2 -2
  63. package/docs/components/input-stepper/overview.md +1 -1
  64. package/docs/components/input-tel/overview.md +1 -1
  65. package/docs/components/input-tel/use-cases.md +6 -6
  66. package/docs/components/input-tel-dropdown/overview.md +1 -1
  67. package/docs/components/listbox/use-cases.md +1 -1
  68. package/docs/components/radio-group/overview.md +3 -3
  69. package/docs/components/select/use-cases.md +1 -1
  70. package/docs/components/select-rich/api-table.md +33 -50
  71. package/docs/components/select-rich/use-cases.md +2 -2
  72. package/docs/components/tabs/examples.md +1 -1
  73. package/docs/components/tooltip/api-table.md +7 -33
  74. package/docs/fundamentals/index.md +4 -4
  75. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  76. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  77. package/docs/fundamentals/rationales/accessibility.md +1 -1
  78. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  79. package/docs/fundamentals/systems/core/overview.md +1 -1
  80. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  81. package/docs/fundamentals/systems/form/model-value.md +1 -1
  82. package/docs/fundamentals/systems/form/overview.md +28 -28
  83. package/docs/fundamentals/systems/form/validate.md +2 -2
  84. package/docs/fundamentals/systems/localize/overview.md +4 -4
  85. package/docs/fundamentals/systems/overlays/api-table.md +43 -46
  86. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  87. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  88. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  89. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  90. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  91. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  92. package/docs/guides/how-to/create-a-form.md +4 -4
  93. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  94. package/docs/guides/how-to/index.md +1 -1
  95. package/docs/guides/index.md +8 -8
  96. package/docs/guides/principles/index.md +5 -5
  97. package/docs/guides/principles/styling.md +1 -1
  98. package/exports/overlays.js +0 -6
  99. package/overlays.js +0 -6
  100. package/package.json +6 -2
  101. package/vscode.css-custom-data.json +5 -0
  102. package/vscode.html-custom-data.json +789 -0
  103. package/web-types.json +2016 -0
  104. package/components/menu/CHANGELOG.md +0 -37
  105. package/components/menu/README.md +0 -334
  106. package/components/menu/index.js +0 -2
  107. package/components/menu/lion-menu.js +0 -3
  108. package/components/menu/package.json +0 -46
  109. package/components/menu/requirements.temp.md +0 -12
  110. package/components/menu/src/InteractiveListMixin.js +0 -840
  111. package/components/menu/src/LionMenu.js +0 -421
  112. package/components/menu/src/MoreButtonMenuMixin.js +0 -278
  113. package/components/menu/src/MultiLevelListMixin.js +0 -305
  114. package/components/menu/src/utils/isInView.js +0 -26
  115. package/components/menu/src/utils/listItemInteractions.js +0 -124
  116. package/components/menu/test/InteractiveListMixin.test.js +0 -3
  117. package/components/menu/test/MoreButtonMenuMixin.test.js +0 -4
  118. package/components/menu/test/MultiLevelListMixin.test.js +0 -3
  119. package/components/menu/test/lion-menu-interactions.test.js +0 -3
  120. package/components/menu/test/lion-menu.test.js +0 -14
  121. package/components/menu/test-helpers/mimicKeyPress.js +0 -9
  122. package/components/menu/test-suites/InteractiveListMixin.suite.js +0 -454
  123. package/components/menu/test-suites/LionMenu.suite.js +0 -114
  124. package/components/menu/test-suites/LionMenuInteractions.suite.js +0 -583
  125. package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +0 -372
  126. package/components/menu/test-suites/MultiLevelListMixin.suite.js +0 -303
  127. package/components/menu/types/InteractiveListMixinTypes.d.ts +0 -84
  128. package/components/overlays/NEXT.md +0 -49
  129. package/dist-types/components/menu/index.d.ts +0 -3
  130. package/dist-types/components/menu/index.d.ts.map +0 -1
  131. package/dist-types/components/menu/lion-menu.d.ts +0 -2
  132. package/dist-types/components/menu/lion-menu.d.ts.map +0 -1
  133. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +0 -39
  134. package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +0 -1
  135. package/dist-types/components/menu/src/utils/isInView.d.ts +0 -9
  136. package/dist-types/components/menu/src/utils/isInView.d.ts.map +0 -1
  137. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +0 -48
  138. package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +0 -1
  139. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +0 -2
  140. package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +0 -1
  141. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +0 -2
  142. package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +0 -1
  143. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +0 -2
  144. package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +0 -1
  145. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts +0 -2
  146. package/dist-types/components/menu/test/lion-menu-interactions.test.d.ts.map +0 -1
  147. package/dist-types/components/menu/test/lion-menu.test.d.ts +0 -2
  148. package/dist-types/components/menu/test/lion-menu.test.d.ts.map +0 -1
  149. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +0 -7
  150. package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +0 -1
  151. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +0 -11
  152. package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +0 -1
  153. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +0 -9
  154. package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +0 -1
  155. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts +0 -5
  156. package/dist-types/components/menu/test-suites/LionMenuInteractions.suite.d.ts.map +0 -1
  157. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +0 -11
  158. package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +0 -1
  159. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +0 -11
  160. package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +0 -1
  161. package/dist-types/exports/define/lion-item.d.ts +0 -2
  162. package/dist-types/exports/define/lion-item.d.ts.map +0 -1
  163. package/dist-types/exports/define/lion-menu.d.ts +0 -2
  164. package/dist-types/exports/define/lion-menu.d.ts.map +0 -1
  165. package/dist-types/exports/menu-test-suites.d.ts +0 -4
  166. package/dist-types/exports/menu-test-suites.d.ts.map +0 -1
  167. package/dist-types/exports/menu.d.ts +0 -3
  168. package/dist-types/exports/menu.d.ts.map +0 -1
  169. package/docs/components/menu/api-table.md +0 -121
  170. package/docs/components/menu/applyMenuDemoStyles.js +0 -173
  171. package/docs/components/menu/extensions.md +0 -262
  172. package/docs/components/menu/index.md +0 -13
  173. package/docs/components/menu/overview.md +0 -422
  174. package/docs/components/menu/src/DemoNavigationBar.js +0 -441
  175. package/docs/components/menu/src/DemoSpinButton.js +0 -215
  176. package/docs/components/menu/src/DemoToolbar.js +0 -101
  177. package/docs/components/menu/src/DemoTree.js +0 -55
  178. package/docs/components/menu/src/navigation-bar-types.js +0 -41
  179. package/docs/components/menu/use-cases.md +0 -74
  180. package/exports/define/lion-item.js +0 -3
  181. package/exports/define/lion-menu.js +0 -3
  182. package/exports/menu-test-suites.js +0 -4
  183. package/exports/menu.js +0 -3
  184. package/menu-test-suites.js +0 -4
  185. package/menu.js +0 -3
@@ -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
  }
@@ -222,10 +222,11 @@ describe('<lion-form>', () => {
222
222
  </form>
223
223
  </lion-form>
224
224
  `);
225
+ expect(el.getAttribute('aria-invalid')).to.equal('false');
225
226
  const button = /** @type {HTMLButtonElement} */ (el.querySelector('button'));
226
227
  const dispatchSpy = spy(el, 'dispatchEvent');
227
228
  button.click();
228
- expect(dispatchSpy.args[0][0].type).to.equal('submit');
229
+ expect(dispatchSpy.args.map(args => args[0].type)).to.contain('submit');
229
230
  // @ts-ignore [allow-protected] in test
230
231
  expect(isActiveElement(el.formElements[1]._inputNode)).to.be.true;
231
232
  });
@@ -247,7 +248,7 @@ describe('<lion-form>', () => {
247
248
  const button = /** @type {HTMLButtonElement} */ (el.querySelector('button'));
248
249
  const dispatchSpy = spy(el, 'dispatchEvent');
249
250
  button.click();
250
- expect(dispatchSpy.args[0][0].type).to.equal('submit');
251
+ expect(dispatchSpy.args.map(args => args[0].type)).to.contain('submit');
251
252
  const fieldset = el.formElements[0];
252
253
  // @ts-ignore [allow-protected] in test
253
254
  expect(isActiveElement(fieldset.formElements[1]._inputNode)).to.be.true;
@@ -268,7 +269,7 @@ describe('<lion-form>', () => {
268
269
  const button = /** @type {HTMLButtonElement} */ (el.querySelector('button'));
269
270
  const dispatchSpy = spy(el, 'dispatchEvent');
270
271
  button.click();
271
- expect(dispatchSpy.args[0][0].type).to.equal('submit');
272
+ expect(dispatchSpy.args.map(args => args[0].type)).to.contain('submit');
272
273
  const fieldset = el.formElements[0];
273
274
  expect(isActiveElement(fieldset.formElements[0]._inputNode)).to.be.true;
274
275
  });
@@ -15,6 +15,7 @@ import { FormElementsHaveNoError } from './FormElementsHaveNoError.js';
15
15
  * @typedef {import('../../types/FormControlMixinTypes.js').FormControlHost} FormControlHost
16
16
  * @typedef {import('../../types/registration/FormRegisteringMixinTypes.js').FormRegisteringHost} FormRegisteringHost
17
17
  * @typedef {import('../../types/registration/FormRegistrarMixinTypes.js').ElementWithParentFormGroup} ElementWithParentFormGroup
18
+ * @typedef {import('../../types/InteractionStateMixinTypes.js').InteractionStates} InteractionStates
18
19
  */
19
20
 
20
21
  /**
@@ -322,6 +323,42 @@ const FormGroupMixinImplementation = /** @type {FormGroupMixin} */ (superclass =
322
323
  });
323
324
  }
324
325
 
326
+ /**
327
+ * @override ValidateMixin
328
+ * Show the validity feedback when one of the following conditions is met:
329
+ *
330
+ * - submitted
331
+ * If the form is submitted, always show the error message.
332
+ *
333
+ * - prefilled
334
+ * all form elements already had a value when the group was initially rendered.
335
+ *
336
+ * - touched && dirty
337
+ * When a user has changed the value of (one of) the form elements (making it dirty)
338
+ * and then leaves the group as a whole (making it touched), an error message should
339
+ * be shown. Before that, the group is considered 'invalid, but not yet interacting'.
340
+ * @protected
341
+ * @param {string} type
342
+ * @param {InteractionStates} meta
343
+ */
344
+ // eslint-disable-next-line class-methods-use-this, no-unused-vars
345
+ _showFeedbackConditionFor(type, meta) {
346
+ return (meta.touched && meta.dirty) || meta.prefilled || meta.submitted;
347
+ }
348
+
349
+ /**
350
+ * @enhance ValidateMixin
351
+ */
352
+ get _feedbackConditionMeta() {
353
+ return {
354
+ ...super._feedbackConditionMeta,
355
+ submitted: this.submitted,
356
+ touched: this.touched,
357
+ dirty: this.dirty,
358
+ prefilled: this.prefilled,
359
+ };
360
+ }
361
+
325
362
  /**
326
363
  * A filter function which will exclude a form field when returning false
327
364
  * By default, exclude form fields which are disabled
@@ -596,6 +596,31 @@ export function runFormGroupMixinSuite(cfg = {}) {
596
596
  expect(el.validationStates.error.Required).to.be.true;
597
597
  });
598
598
 
599
+ it('does not show error feedback (nor aria-invalid) for invalid children before interaction', async () => {
600
+ const el = /** @type {FormGroup} */ (
601
+ await fixture(html`
602
+ <${tag}>
603
+ <${childTag} name="myField" .validators=${[new Required()]}></${childTag}>
604
+ </${tag}>
605
+ `)
606
+ );
607
+ await el.updateComplete;
608
+ await el.feedbackComplete;
609
+
610
+ // the group itself is already invalid, but its error feedback should not be
611
+ // visible before the user interacted with the group
612
+ expect(el.hasFeedbackFor).to.deep.equal(['error']);
613
+ expect(el.showsFeedbackFor).to.deep.equal([]);
614
+ expect(el.getAttribute('aria-invalid')).to.equal('false');
615
+
616
+ // after interaction, feedback becomes visible
617
+ el.submitGroup();
618
+ await el.updateComplete;
619
+ await el.feedbackComplete;
620
+ expect(el.showsFeedbackFor).to.deep.equal(['error']);
621
+ expect(el.getAttribute('aria-invalid')).to.equal('true');
622
+ });
623
+
599
624
  it('validates on children (de)registration', async () => {
600
625
  class HasEvenNumberOfChildren extends Validator {
601
626
  static get validatorName() {
@@ -460,9 +460,9 @@ export class LionInputAmountDropdown extends LionInputAmount {
460
460
  */
461
461
  _initModelValueBasedOnDropdown() {
462
462
  const { currency, amount } = this._initialModelValue || {};
463
- if (!currency && !amount && !this.dirty) {
463
+ if (!currency && !this.dirty) {
464
464
  this.__initializedCurrencyCode = this.currency;
465
- this._initialModelValue = { currency: this.currency };
465
+ this._initialModelValue = { currency: this.currency, amount };
466
466
  this.modelValue = this._initialModelValue;
467
467
  this.initInteractionState();
468
468
  }
@@ -15,9 +15,18 @@ describe('<lion-input-amount-dropdown> integrations', () => {
15
15
  }
16
16
  return !toggleValue ? { amount: 123, currency: 'EUR' } : { amount: 456, currency: 'EUR' };
17
17
  },
18
- getExpectedInitialModelValue: el => ({ currency: /** @type {any} */ (el).currency }),
19
- getExpectedInitialFormattedValue: el => ({ currency: /** @type {any} */ (el).currency }),
20
- getExpectedInitialSerializedValue: el => ({ currency: /** @type {any} */ (el).currency }),
18
+ getExpectedInitialModelValue: el => ({
19
+ currency: /** @type {any} */ (el).currency,
20
+ amount: '',
21
+ }),
22
+ getExpectedInitialFormattedValue: el => ({
23
+ currency: /** @type {any} */ (el).currency,
24
+ amount: '',
25
+ }),
26
+ getExpectedInitialSerializedValue: el => ({
27
+ currency: /** @type {any} */ (el).currency,
28
+ amount: '',
29
+ }),
21
30
  getExpectedModelValueForEmptyInputNode: el => ({
22
31
  currency: /** @type {any} */ (el).currency,
23
32
  amount: '',
@@ -53,7 +53,7 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
53
53
  expect(getDropdownValue(/** @type {DropdownElement} */ (el.refs.dropdown.value))).to.equal(
54
54
  'GBP',
55
55
  );
56
- expect(el.modelValue).to.eql({ currency: 'GBP' });
56
+ expect(el.modelValue).to.eql({ currency: 'GBP', amount: '' });
57
57
  });
58
58
 
59
59
  it('syncs value of dropdown on reset if input has no value', async () => {
@@ -62,7 +62,7 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
62
62
  await el.updateComplete;
63
63
  el.reset();
64
64
  await el.updateComplete;
65
- expect(el.modelValue).to.eql({ currency: 'GBP' });
65
+ expect(el.modelValue).to.eql({ currency: 'GBP', amount: '' });
66
66
  expect(el.value).to.equal('');
67
67
  });
68
68
 
@@ -89,7 +89,13 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
89
89
  const el = await fixture(html` <${tag}
90
90
  .preferredCurrencies="${['JPY', 'EUR']}"
91
91
  ></${tag}> `);
92
- expect(el.modelValue).to.eql({ currency: 'JPY' });
92
+ expect(el.modelValue).to.eql({ currency: 'JPY', amount: '' });
93
+ });
94
+
95
+ it('derives currency when modelValue only has an amount', async () => {
96
+ const el = await fixture(html` <${tag} .modelValue="${{ amount: 123 }}" ></${tag}> `);
97
+ expect(el.currency).to.equal('GBP');
98
+ expect(el.modelValue).to.eql({ currency: 'GBP', amount: 123 });
93
99
  });
94
100
 
95
101
  it('sets correct interaction states on init if input has a value', async () => {
@@ -262,6 +268,7 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
262
268
  );
263
269
  expect(el.modelValue).to.eql({
264
270
  currency: 'GBP',
271
+ amount: '',
265
272
  });
266
273
  });
267
274