@lion/ui 0.16.1 → 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.
- package/collapsible.js +1 -0
- package/components/button/src/LionButton.js +5 -0
- package/components/button/test-suites/LionButton.suite.js +1 -0
- package/components/calendar/src/LionCalendar.js +2 -0
- package/components/collapsible/src/DisclosureMixin.js +313 -0
- package/components/collapsible/types/DisclosureMixinTypes.ts +48 -0
- package/components/combobox/src/utils/makeMatchingTextBold.js +3 -1
- package/components/combobox/test/lion-combobox.test.js +105 -0
- package/components/form-core/src/form-group/FormGroupMixin.js +7 -0
- package/components/form-core/src/registration/FormRegistrarMixin.js +11 -0
- package/components/form-core/test/FormControlMixin.test.js +1 -0
- package/components/form-core/test/validate/Validator.test.js +2 -0
- package/components/form-core/test-suites/ValidateMixin.suite.js +2 -0
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +1 -0
- package/components/input-datepicker/src/LionInputDatepicker.js +6 -2
- package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -0
- package/components/input-datepicker/test/lion-input-datepicker.test.js +17 -2
- package/components/input-datepicker/translations/bg.js +1 -1
- package/components/input-datepicker/translations/cs.js +1 -1
- package/components/input-datepicker/translations/de.js +1 -1
- package/components/input-datepicker/translations/en.js +1 -1
- package/components/input-datepicker/translations/es.js +1 -1
- package/components/input-datepicker/translations/fr.js +1 -1
- package/components/input-datepicker/translations/hu.js +1 -1
- package/components/input-datepicker/translations/it.js +1 -1
- package/components/input-datepicker/translations/nl.js +1 -1
- package/components/input-datepicker/translations/pl.js +1 -1
- package/components/input-datepicker/translations/ro.js +1 -1
- package/components/input-datepicker/translations/ru.js +1 -1
- package/components/input-datepicker/translations/sk.js +1 -1
- package/components/input-datepicker/translations/tr.js +1 -1
- package/components/input-datepicker/translations/uk.js +1 -1
- package/components/input-datepicker/translations/zh.js +1 -1
- package/components/input-stepper/src/LionInputStepper.js +15 -7
- package/components/input-stepper/test-suites/lion-input-stepper.suite.js +28 -4
- package/components/localize/test/date/formatDate.test.js +1 -0
- package/components/menu/CHANGELOG.md +37 -0
- package/components/menu/README.md +335 -0
- package/components/menu/index.js +2 -0
- package/components/menu/lion-menu-overlay.js +3 -0
- package/components/menu/lion-menu.js +3 -0
- package/components/menu/lion-spinbutton.js +3 -0
- package/components/menu/lion-toolbar.js +3 -0
- package/components/menu/lion-tree.js +3 -0
- package/components/menu/package.json +46 -0
- package/components/menu/requirements.temp.md +12 -0
- package/components/menu/src/InteractiveListMixin.js +796 -0
- package/components/menu/src/LionMenu.js +250 -0
- package/components/menu/src/LionMenuHybrid.js +46 -0
- package/components/menu/src/LionMenuOverlay.js +155 -0
- package/components/menu/src/LionSpinbutton.js +213 -0
- package/components/menu/src/LionToolbar.js +94 -0
- package/components/menu/src/LionTree.js +52 -0
- package/components/menu/src/MultiLevelListMixin.js +275 -0
- package/components/menu/src/utils/isInView.js +26 -0
- package/components/menu/src/utils/listItemInteractions.js +104 -0
- package/components/menu/src/utils/uuid.js +3 -0
- package/components/menu/test/lion-menu.test.js +3 -0
- package/components/menu/test-suites/InteractiveListMixin.suite.js +142 -0
- package/components/menu/types/InteractiveListMixinTypes.d.ts +82 -0
- package/components/navigation-bar/README.md +1 -0
- package/components/navigation-bar/src/LionNavigationBar.js +449 -0
- package/components/navigation-bar/src/types.js +41 -0
- package/components/overlays/NEXT.md +49 -0
- package/components/overlays/src/OverlayController.js +165 -115
- package/components/overlays/src/OverlayMixin.js +75 -12
- package/components/overlays/src/OverlaysManager.js +98 -0
- package/components/overlays/src/overlayShadowDomStyle.js +2 -2
- package/components/overlays/src/utils/adopt-styles.js +2 -1
- package/components/overlays/src/utils/get-focusable-elements.js +4 -0
- package/components/overlays/src/utils/is-equal-config.js +4 -1
- package/components/overlays/test/OverlayController.test.js +117 -6
- package/components/overlays/types/OverlayConfig.ts +19 -4
- package/components/select-rich/test/lion-select-rich.test.js +3 -0
- package/custom-elements.json +15785 -5337
- package/dist-types/components/button/src/LionButton.d.ts +1 -0
- package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +3 -0
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +1 -0
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +24 -0
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +1 -0
- package/dist-types/components/combobox/src/utils/makeMatchingTextBold.d.ts.map +1 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts +2 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/src/registration/FormRegistrarMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/input-stepper/src/LionInputStepper.d.ts +4 -2
- package/dist-types/components/input-stepper/src/LionInputStepper.d.ts.map +1 -1
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -1
- package/dist-types/components/menu/index.d.ts +3 -0
- package/dist-types/components/menu/index.d.ts.map +1 -0
- package/dist-types/components/menu/lion-menu-overlay.d.ts +2 -0
- package/dist-types/components/menu/lion-menu-overlay.d.ts.map +1 -0
- package/dist-types/components/menu/lion-menu.d.ts +2 -0
- package/dist-types/components/menu/lion-menu.d.ts.map +1 -0
- package/dist-types/components/menu/lion-spinbutton.d.ts +2 -0
- package/dist-types/components/menu/lion-spinbutton.d.ts.map +1 -0
- package/dist-types/components/menu/lion-toolbar.d.ts +2 -0
- package/dist-types/components/menu/lion-toolbar.d.ts.map +1 -0
- package/dist-types/components/menu/lion-tree.d.ts +2 -0
- package/dist-types/components/menu/lion-tree.d.ts.map +1 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +611 -0
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenu.d.ts +563 -0
- package/dist-types/components/menu/src/LionMenu.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts +19 -0
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts +1006 -0
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionSpinbutton.d.ts +58 -0
- package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionToolbar.d.ts +8 -0
- package/dist-types/components/menu/src/LionToolbar.d.ts.map +1 -0
- package/dist-types/components/menu/src/LionTree.d.ts +445 -0
- package/dist-types/components/menu/src/LionTree.d.ts.map +1 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +493 -0
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts +9 -0
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +42 -0
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +1 -0
- package/dist-types/components/menu/src/utils/uuid.d.ts +2 -0
- package/dist-types/components/menu/src/utils/uuid.d.ts.map +1 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts +2 -0
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +1 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +13 -0
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +1 -0
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +226 -0
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +1 -0
- package/dist-types/components/navigation-bar/src/types.d.ts +85 -0
- package/dist-types/components/navigation-bar/src/types.d.ts.map +1 -0
- package/dist-types/components/overlays/src/OverlayController.d.ts +7 -13
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayMixin.d.ts +3 -0
- package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlaysManager.d.ts +31 -0
- package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/get-focusable-elements.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayConfig.d.ts +6 -2
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +11 -2
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/exports/define/lion-item.d.ts +2 -0
- package/dist-types/exports/define/lion-item.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menu-overlay.d.ts +2 -0
- package/dist-types/exports/define/lion-menu-overlay.d.ts.map +1 -0
- package/dist-types/exports/define/lion-menu.d.ts +2 -0
- package/dist-types/exports/define/lion-menu.d.ts.map +1 -0
- package/dist-types/exports/define/lion-navigation-bar.d.ts +2 -0
- package/dist-types/exports/define/lion-navigation-bar.d.ts.map +1 -0
- package/dist-types/exports/define/lion-toolbar.d.ts +2 -0
- package/dist-types/exports/define/lion-toolbar.d.ts.map +1 -0
- package/dist-types/exports/define/lion-tree.d.ts +2 -0
- package/dist-types/exports/define/lion-tree.d.ts.map +1 -0
- package/dist-types/exports/menu.d.ts +7 -0
- package/dist-types/exports/menu.d.ts.map +1 -0
- package/dist-types/exports/navigation-bar.d.ts +2 -0
- package/dist-types/exports/navigation-bar.d.ts.map +1 -0
- package/dist-types/exports/overlays.d.ts +2 -0
- package/dist-types/exports/types/overlays.d.ts +1 -0
- package/dist-types/exports/types/overlays.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/checkbox-group/overview.md +2 -2
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/overview.md +1 -1
- package/docs/components/fieldset/overview.md +5 -5
- package/docs/components/form/overview.md +3 -3
- package/docs/components/form/use-cases.md +2 -2
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/index.md +1 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-datepicker/use-cases.md +16 -1
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-range/api-table.md +1 -1
- package/docs/components/input-range/overview.md +2 -2
- package/docs/components/input-stepper/api-table.md +2 -2
- package/docs/components/input-stepper/overview.md +1 -1
- package/docs/components/input-stepper/use-cases.md +26 -0
- package/docs/components/input-tel/overview.md +1 -1
- package/docs/components/input-tel/use-cases.md +6 -6
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/listbox/use-cases.md +1 -1
- package/docs/components/menu/api-table.md +450 -0
- package/docs/components/menu/applyMenuDemoStyles.js +173 -0
- package/docs/components/menu/extensions.md +216 -0
- package/docs/components/menu/index.md +13 -0
- package/docs/components/menu/overview.md +422 -0
- package/docs/components/radio-group/overview.md +3 -3
- package/docs/components/select/use-cases.md +1 -1
- package/docs/components/select-rich/api-table.md +1 -1
- package/docs/components/select-rich/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +1 -1
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
- package/docs/fundamentals/rationales/accessibility.md +1 -1
- package/docs/fundamentals/systems/core/SlotMixin.md +18 -18
- package/docs/fundamentals/systems/core/overview.md +1 -1
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
- package/docs/fundamentals/systems/form/interaction-states.md +0 -1
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/validate.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/localize/text.md +1 -1
- package/docs/fundamentals/systems/overlays/api-table.md +92 -45
- package/docs/fundamentals/systems/overlays/configuration.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +5 -5
- package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +5 -5
- package/docs/guides/how-to/create-a-form.md +4 -4
- package/docs/guides/how-to/extend-a-native-input.md +2 -2
- package/docs/guides/how-to/index.md +14 -0
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/styling.md +1 -2
- package/exports/collapsible.js +1 -0
- package/exports/define/lion-item.js +3 -0
- package/exports/define/lion-menu-overlay.js +3 -0
- package/exports/define/lion-menu.js +3 -0
- package/exports/define/lion-navigation-bar.js +3 -0
- package/exports/define/lion-toolbar.js +3 -0
- package/exports/define/lion-tree.js +3 -0
- package/exports/menu.js +6 -0
- package/exports/navigation-bar.js +1 -0
- package/exports/overlays.js +2 -0
- package/exports/types/overlays.ts +1 -0
- package/menu.js +6 -0
- package/navigation-bar.js +1 -0
- package/overlays.js +2 -0
- 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
|
-
|
|
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,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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
|
+
```
|