@vaadin/component-base 23.2.0-alpha3 → 23.2.0-alpha6
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/package.json +2 -2
- package/src/a11y-announcer.d.ts +1 -1
- package/src/active-mixin.d.ts +1 -1
- package/src/active-mixin.js +11 -14
- package/src/controller-mixin.d.ts +1 -1
- package/src/dir-mixin.d.ts +1 -1
- package/src/element-mixin.d.ts +1 -1
- package/src/element-mixin.js +1 -1
- package/src/focus-mixin.d.ts +1 -1
- package/src/focus-trap-controller.js +5 -1
- package/src/gestures.js +1 -1
- package/src/keyboard-mixin.d.ts +1 -1
- package/src/overflow-controller.d.ts +34 -0
- package/src/overflow-controller.js +115 -0
- package/src/polylit-mixin.d.ts +1 -1
- package/src/resize-mixin.d.ts +1 -1
- package/src/slot-mixin.d.ts +1 -1
- package/src/tabindex-mixin.d.ts +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vaadin/component-base",
|
|
3
|
-
"version": "23.2.0-
|
|
3
|
+
"version": "23.2.0-alpha6",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"@vaadin/testing-helpers": "^0.3.2",
|
|
43
43
|
"sinon": "^13.0.2"
|
|
44
44
|
},
|
|
45
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "61f1fb56953434e97d34a8819640064301dd3d8a"
|
|
46
46
|
}
|
package/src/a11y-announcer.d.ts
CHANGED
|
@@ -7,4 +7,4 @@
|
|
|
7
7
|
/**
|
|
8
8
|
* Cause a text string to be announced by screen readers.
|
|
9
9
|
*/
|
|
10
|
-
export function announce(text: string, options?: { mode?: '
|
|
10
|
+
export function announce(text: string, options?: { mode?: 'alert' | 'assertive' | 'polite'; timeout?: number }): void;
|
package/src/active-mixin.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ import type { KeyboardMixinClass } from './keyboard-mixin.js';
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function ActiveMixin<T extends Constructor<HTMLElement>>(
|
|
20
20
|
base: T,
|
|
21
|
-
):
|
|
21
|
+
): Constructor<ActiveMixinClass> & Constructor<DisabledMixinClass> & Constructor<KeyboardMixinClass> & T;
|
|
22
22
|
|
|
23
23
|
export declare class ActiveMixinClass {
|
|
24
24
|
/**
|
package/src/active-mixin.js
CHANGED
|
@@ -79,21 +79,18 @@ export const ActiveMixin = (superclass) =>
|
|
|
79
79
|
|
|
80
80
|
if (this._shouldSetActive(event) && this._activeKeys.includes(event.key)) {
|
|
81
81
|
this._setActive(true);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Removes the `active` attribute from the element if the activation key is released.
|
|
87
|
-
*
|
|
88
|
-
* @param {KeyboardEvent} event
|
|
89
|
-
* @protected
|
|
90
|
-
* @override
|
|
91
|
-
*/
|
|
92
|
-
_onKeyUp(event) {
|
|
93
|
-
super._onKeyUp(event);
|
|
94
82
|
|
|
95
|
-
|
|
96
|
-
|
|
83
|
+
// Element can become hidden before the `keyup` event, e.g. on button click.
|
|
84
|
+
// Use document listener to ensure `active` attribute is removed correctly.
|
|
85
|
+
document.addEventListener(
|
|
86
|
+
'keyup',
|
|
87
|
+
(e) => {
|
|
88
|
+
if (this._activeKeys.includes(e.key)) {
|
|
89
|
+
this._setActive(false);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{ once: true },
|
|
93
|
+
);
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
|
|
@@ -11,7 +11,7 @@ import type { ReactiveController, ReactiveControllerHost } from 'lit';
|
|
|
11
11
|
*/
|
|
12
12
|
export declare function ControllerMixin<T extends Constructor<HTMLElement>>(
|
|
13
13
|
superclass: T,
|
|
14
|
-
):
|
|
14
|
+
): Constructor<ControllerMixinClass> & T;
|
|
15
15
|
|
|
16
16
|
export declare class ControllerMixinClass
|
|
17
17
|
implements Pick<ReactiveControllerHost, 'addController' | 'removeController'>
|
package/src/dir-mixin.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
|
8
8
|
/**
|
|
9
9
|
* A mixin to handle `dir` attribute based on the one set on the `<html>` element.
|
|
10
10
|
*/
|
|
11
|
-
export declare function DirMixin<T extends Constructor<HTMLElement>>(base: T):
|
|
11
|
+
export declare function DirMixin<T extends Constructor<HTMLElement>>(base: T): Constructor<DirMixinClass> & T;
|
|
12
12
|
|
|
13
13
|
export declare class DirMixinClass {
|
|
14
14
|
protected __getNormalizedScrollLeft(element: Element | null): number;
|
package/src/element-mixin.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type { DirMixinClass } from './dir-mixin.js';
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function ElementMixin<T extends Constructor<HTMLElement>>(
|
|
15
15
|
superclass: T,
|
|
16
|
-
):
|
|
16
|
+
): Constructor<DirMixinClass> & Constructor<ElementMixinClass> & T;
|
|
17
17
|
|
|
18
18
|
export declare class ElementMixinClass {
|
|
19
19
|
static version: string;
|
package/src/element-mixin.js
CHANGED
package/src/focus-mixin.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
|
8
8
|
/**
|
|
9
9
|
* A mixin to handle `focused` and `focus-ring` attributes based on focus.
|
|
10
10
|
*/
|
|
11
|
-
export declare function FocusMixin<T extends Constructor<HTMLElement>>(base: T):
|
|
11
|
+
export declare function FocusMixin<T extends Constructor<HTMLElement>>(base: T): Constructor<FocusMixinClass> & T;
|
|
12
12
|
|
|
13
13
|
export declare class FocusMixinClass {
|
|
14
14
|
protected readonly _keyboardActive: boolean;
|
|
@@ -125,7 +125,11 @@ export class FocusTrapController {
|
|
|
125
125
|
const step = backward ? -1 : 1;
|
|
126
126
|
const currentIndex = this.__focusedElementIndex;
|
|
127
127
|
const nextIndex = (focusableElements.length + currentIndex + step) % focusableElements.length;
|
|
128
|
-
focusableElements[nextIndex]
|
|
128
|
+
const element = focusableElements[nextIndex];
|
|
129
|
+
element.focus();
|
|
130
|
+
if (element.localName === 'input') {
|
|
131
|
+
element.select();
|
|
132
|
+
}
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
/**
|
package/src/gestures.js
CHANGED
|
@@ -277,7 +277,7 @@ function _handleNative(ev) {
|
|
|
277
277
|
}
|
|
278
278
|
if (!ev[HANDLED_OBJ]) {
|
|
279
279
|
ev[HANDLED_OBJ] = {};
|
|
280
|
-
if (type.
|
|
280
|
+
if (type.startsWith('touch')) {
|
|
281
281
|
const t = ev.changedTouches[0];
|
|
282
282
|
if (type === 'touchstart') {
|
|
283
283
|
// Only handle the first finger
|
package/src/keyboard-mixin.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
|
10
10
|
* The mixin subscribes to the keyboard events while an actual implementation
|
|
11
11
|
* for the event handlers is left to the client (a component or another mixin).
|
|
12
12
|
*/
|
|
13
|
-
export declare function KeyboardMixin<T extends Constructor<HTMLElement>>(base: T):
|
|
13
|
+
export declare function KeyboardMixin<T extends Constructor<HTMLElement>>(base: T): Constructor<KeyboardMixinClass> & T;
|
|
14
14
|
|
|
15
15
|
export declare class KeyboardMixinClass {
|
|
16
16
|
/**
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) 2021 - 2022 Vaadin Ltd.
|
|
4
|
+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactiveController } from 'lit';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A controller that detects if content inside the element overflows its scrolling viewport,
|
|
10
|
+
* and sets the `overflow` attribute on the host with a value that indicates the directions
|
|
11
|
+
* where content is overflowing. Supported values are: `top`, `bottom`, `start`, `end`.
|
|
12
|
+
*/
|
|
13
|
+
export class OverflowController implements ReactiveController {
|
|
14
|
+
/**
|
|
15
|
+
* The controller host element.
|
|
16
|
+
*/
|
|
17
|
+
host: HTMLElement;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The element that wraps scrollable content.
|
|
21
|
+
* If not set, the host element is used.
|
|
22
|
+
*/
|
|
23
|
+
scrollTarget: HTMLElement;
|
|
24
|
+
|
|
25
|
+
constructor(host: HTMLElement, scrollTarget?: HTMLElement);
|
|
26
|
+
|
|
27
|
+
hostConnected(): void;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Setup a scroll listener and observers to update overflow.
|
|
31
|
+
* Also performs one-time update synchronously when called.
|
|
32
|
+
*/
|
|
33
|
+
protected observe(): void;
|
|
34
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright (c) 2021 - 2022 Vaadin Ltd.
|
|
4
|
+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
|
|
5
|
+
*/
|
|
6
|
+
import { FlattenedNodesObserver } from '@polymer/polymer/lib/utils/flattened-nodes-observer.js';
|
|
7
|
+
import { animationFrame } from './async.js';
|
|
8
|
+
import { Debouncer } from './debounce.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A controller that detects if content inside the element overflows its scrolling viewport,
|
|
12
|
+
* and sets the `overflow` attribute on the host with a value that indicates the directions
|
|
13
|
+
* where content is overflowing. Supported values are: `top`, `bottom`, `start`, `end`.
|
|
14
|
+
*/
|
|
15
|
+
export class OverflowController {
|
|
16
|
+
constructor(host, scrollTarget) {
|
|
17
|
+
/**
|
|
18
|
+
* The controller host element.
|
|
19
|
+
*
|
|
20
|
+
* @type {HTMLElement}
|
|
21
|
+
*/
|
|
22
|
+
this.host = host;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The element that wraps scrollable content.
|
|
26
|
+
* If not set, the host element is used.
|
|
27
|
+
*
|
|
28
|
+
* @type {HTMLElement}
|
|
29
|
+
*/
|
|
30
|
+
this.scrollTarget = scrollTarget || host;
|
|
31
|
+
|
|
32
|
+
/** @private */
|
|
33
|
+
this.__boundOnScroll = this.__onScroll.bind(this);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
hostConnected() {
|
|
37
|
+
if (!this.initialized) {
|
|
38
|
+
this.initialized = true;
|
|
39
|
+
|
|
40
|
+
this.observe();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Setup scroll listener and observers to update overflow.
|
|
46
|
+
* Also performs one-time update synchronously when called.
|
|
47
|
+
* @protected
|
|
48
|
+
*/
|
|
49
|
+
observe() {
|
|
50
|
+
this.__resizeObserver = new ResizeObserver(() => {
|
|
51
|
+
this.__debounceOverflow = Debouncer.debounce(this.__debounceOverflow, animationFrame, () => {
|
|
52
|
+
this.__updateOverflow();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
this.__resizeObserver.observe(this.host);
|
|
57
|
+
|
|
58
|
+
this.__childObserver = new FlattenedNodesObserver(this.host, (info) => {
|
|
59
|
+
info.addedNodes.forEach((node) => {
|
|
60
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
61
|
+
this.__resizeObserver.observe(node);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
info.removedNodes.forEach((node) => {
|
|
66
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
67
|
+
this.__resizeObserver.unobserve(node);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
this.__updateOverflow();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Update overflow attribute on scroll
|
|
75
|
+
this.scrollTarget.addEventListener('scroll', this.__boundOnScroll);
|
|
76
|
+
|
|
77
|
+
this.__updateOverflow();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** @private */
|
|
81
|
+
__onScroll() {
|
|
82
|
+
this.__updateOverflow();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** @private */
|
|
86
|
+
__updateOverflow() {
|
|
87
|
+
const target = this.scrollTarget;
|
|
88
|
+
|
|
89
|
+
let overflow = '';
|
|
90
|
+
|
|
91
|
+
if (target.scrollTop > 0) {
|
|
92
|
+
overflow += ' top';
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (target.scrollTop < target.scrollHeight - target.clientHeight) {
|
|
96
|
+
overflow += ' bottom';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const scrollLeft = Math.abs(target.scrollLeft);
|
|
100
|
+
if (scrollLeft > 0) {
|
|
101
|
+
overflow += ' start';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (scrollLeft < target.scrollWidth - target.clientWidth) {
|
|
105
|
+
overflow += ' end';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
overflow = overflow.trim();
|
|
109
|
+
if (overflow.length > 0 && this.host.getAttribute('overflow') !== overflow) {
|
|
110
|
+
this.host.setAttribute('overflow', overflow);
|
|
111
|
+
} else if (overflow.length === 0 && this.host.hasAttribute('overflow')) {
|
|
112
|
+
this.host.removeAttribute('overflow');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
package/src/polylit-mixin.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
7
7
|
import type { LitElement } from 'lit';
|
|
8
8
|
|
|
9
|
-
export declare function PolylitMixin<T extends Constructor<LitElement>>(base: T):
|
|
9
|
+
export declare function PolylitMixin<T extends Constructor<LitElement>>(base: T): Constructor<PolylitMixinClass> & T;
|
|
10
10
|
|
|
11
11
|
export declare class PolylitMixinClass {
|
|
12
12
|
ready(): void;
|
package/src/resize-mixin.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
|
8
8
|
/**
|
|
9
9
|
* A mixin that uses a ResizeObserver to listen to host size changes.
|
|
10
10
|
*/
|
|
11
|
-
export declare function ResizeMixin<T extends Constructor<HTMLElement>>(base: T):
|
|
11
|
+
export declare function ResizeMixin<T extends Constructor<HTMLElement>>(base: T): Constructor<ResizeMixinClass> & T;
|
|
12
12
|
|
|
13
13
|
export declare class ResizeMixinClass {
|
|
14
14
|
/**
|
package/src/slot-mixin.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { Constructor } from '@open-wc/dedupe-mixin';
|
|
|
8
8
|
/**
|
|
9
9
|
* A mixin to provide content for named slots defined by component.
|
|
10
10
|
*/
|
|
11
|
-
export declare function SlotMixin<T extends Constructor<HTMLElement>>(base: T):
|
|
11
|
+
export declare function SlotMixin<T extends Constructor<HTMLElement>>(base: T): Constructor<SlotMixinClass> & T;
|
|
12
12
|
|
|
13
13
|
export declare class SlotMixinClass {
|
|
14
14
|
/**
|
package/src/tabindex-mixin.d.ts
CHANGED
|
@@ -14,23 +14,23 @@ import type { DisabledMixinClass } from './disabled-mixin.js';
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function TabindexMixin<T extends Constructor<HTMLElement>>(
|
|
16
16
|
base: T,
|
|
17
|
-
):
|
|
17
|
+
): Constructor<DisabledMixinClass> & Constructor<TabindexMixinClass> & T;
|
|
18
18
|
|
|
19
19
|
export declare class TabindexMixinClass {
|
|
20
20
|
/**
|
|
21
21
|
* Indicates whether the element can be focused and where it participates in sequential keyboard navigation.
|
|
22
22
|
*/
|
|
23
|
-
tabindex: number |
|
|
23
|
+
tabindex: number | null | undefined;
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Stores the last known tabindex since the element has been disabled.
|
|
27
27
|
*/
|
|
28
|
-
protected _lastTabIndex: number |
|
|
28
|
+
protected _lastTabIndex: number | null | undefined;
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* When the user has changed tabindex while the element is disabled,
|
|
32
32
|
* the observer reverts tabindex to -1 and rather saves the new tabindex value to apply it later.
|
|
33
33
|
* The new value will be applied as soon as the element becomes enabled.
|
|
34
34
|
*/
|
|
35
|
-
protected _tabindexChanged(tabindex: number |
|
|
35
|
+
protected _tabindexChanged(tabindex: number | null | undefined): void;
|
|
36
36
|
}
|