@lynx-js/web-elements 0.11.0 → 0.11.2
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/CHANGELOG.md +18 -0
- package/dist/elements/XFoldViewNg/XFoldviewSlotNgTouchEventsHandler.js +57 -27
- package/dist/elements/XInput/XInputEvents.js +14 -8
- package/dist/elements/XList/XList.d.ts +2 -0
- package/dist/elements/XList/XList.js +6 -0
- package/dist/elements/htmlTemplates.js +1 -1
- package/package.json +4 -4
- package/src/elements/XInput/x-input.css +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @lynx-js/web-elements
|
|
2
2
|
|
|
3
|
+
## 0.11.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Add scrollHeight/scrollWidth getters to XList. ([#2156](https://github.com/lynx-family/lynx-stack/pull/2156))
|
|
8
|
+
|
|
9
|
+
- Inherit padding styles for x-input elements. ([#2199](https://github.com/lynx-family/lynx-stack/pull/2199))
|
|
10
|
+
|
|
11
|
+
- Remove the default lazy-loading attribute from x-image elements. ([#2186](https://github.com/lynx-family/lynx-stack/pull/2186))
|
|
12
|
+
|
|
13
|
+
- Fix x-input number type forwarding to the inner input element. ([#2193](https://github.com/lynx-family/lynx-stack/pull/2193))
|
|
14
|
+
|
|
15
|
+
## 0.11.1
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- feat: add wheel event handling and corresponding tests for x-foldview-ng ([#2145](https://github.com/lynx-family/lynx-stack/pull/2145))
|
|
20
|
+
|
|
3
21
|
## 0.11.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
|
@@ -12,7 +12,7 @@ export class XFoldviewSlotNgTouchEventsHandler {
|
|
|
12
12
|
static observedAttributes = [];
|
|
13
13
|
constructor(dom) {
|
|
14
14
|
this.#dom = dom;
|
|
15
|
-
this.#dom.addEventListener('touchmove', this.#
|
|
15
|
+
this.#dom.addEventListener('touchmove', this.#handleTouch, {
|
|
16
16
|
passive: false,
|
|
17
17
|
});
|
|
18
18
|
this.#dom.addEventListener('touchstart', this.#touchStart, {
|
|
@@ -21,6 +21,9 @@ export class XFoldviewSlotNgTouchEventsHandler {
|
|
|
21
21
|
this.#dom.addEventListener('touchend', this.#touchEnd, {
|
|
22
22
|
passive: true,
|
|
23
23
|
});
|
|
24
|
+
this.#dom.addEventListener('wheel', this.#handleWheel, {
|
|
25
|
+
passive: false,
|
|
26
|
+
});
|
|
24
27
|
}
|
|
25
28
|
#getTheMostScrollableKid(delta) {
|
|
26
29
|
const scrollableKid = this.#elements?.find((element) => {
|
|
@@ -42,8 +45,11 @@ export class XFoldviewSlotNgTouchEventsHandler {
|
|
|
42
45
|
this.#childrenElemsntsScrollTop.set(scrollableKid, targetKidScrollDistance);
|
|
43
46
|
scrollableKid.scrollTop = targetKidScrollDistance;
|
|
44
47
|
}
|
|
45
|
-
#
|
|
48
|
+
#handleTouch = (event) => {
|
|
46
49
|
const parentElement = this.#getParentElement();
|
|
50
|
+
if (!parentElement) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
47
53
|
const touch = event.touches.item(0);
|
|
48
54
|
const { pageY, pageX } = touch;
|
|
49
55
|
const deltaY = this.#previousPageY - pageY;
|
|
@@ -54,33 +60,34 @@ export class XFoldviewSlotNgTouchEventsHandler {
|
|
|
54
60
|
if (this.#scrollingVertically === false) {
|
|
55
61
|
return;
|
|
56
62
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (event.cancelable) {
|
|
60
|
-
event.preventDefault();
|
|
61
|
-
}
|
|
62
|
-
if ((parentElement[isHeaderShowing] && deltaY > 0
|
|
63
|
-
|| (deltaY < 0 && !scrollableKidY))
|
|
64
|
-
// deltaY > 0: swipe up (folding header)
|
|
65
|
-
// scroll the foldview if its scrollable
|
|
66
|
-
|| (!parentElement[isHeaderShowing] && !scrollableKidY)
|
|
67
|
-
// all sub doms are scrolled
|
|
68
|
-
) {
|
|
69
|
-
parentElement.scrollBy({
|
|
70
|
-
top: deltaY,
|
|
71
|
-
behavior: 'smooth',
|
|
72
|
-
});
|
|
73
|
-
this.#parentScrollTop += deltaY;
|
|
74
|
-
parentElement.scrollTop = this.#parentScrollTop;
|
|
75
|
-
this.#currentScrollingElement = parentElement;
|
|
76
|
-
}
|
|
77
|
-
else if (scrollableKidY) {
|
|
78
|
-
this.#currentScrollingElement = scrollableKidY;
|
|
79
|
-
this.#scrollKid(scrollableKidY, deltaY);
|
|
80
|
-
}
|
|
63
|
+
if (event.cancelable) {
|
|
64
|
+
event.preventDefault();
|
|
81
65
|
}
|
|
66
|
+
this.#handleScrollDelta(deltaY, parentElement);
|
|
82
67
|
this.#previousPageY = pageY;
|
|
83
|
-
|
|
68
|
+
};
|
|
69
|
+
#handleWheel = (event) => {
|
|
70
|
+
const parentElement = this.#getParentElement();
|
|
71
|
+
if (!parentElement) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (Math.abs(event.deltaY) <= Math.abs(event.deltaX)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const pathElements = event.composedPath().filter((element) => element instanceof Element && this.#dom.contains(element));
|
|
78
|
+
const { clientX, clientY } = event;
|
|
79
|
+
const pointElements = document.elementsFromPoint(clientX, clientY).filter(e => this.#dom.contains(e));
|
|
80
|
+
this.#elements = [...new Set([...pathElements, ...pointElements])];
|
|
81
|
+
this.#parentScrollTop = parentElement.scrollTop;
|
|
82
|
+
if (this.#elements) {
|
|
83
|
+
for (const element of this.#elements) {
|
|
84
|
+
this.#childrenElemsntsScrollTop.set(element, element.scrollTop);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (event.cancelable) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
}
|
|
90
|
+
this.#handleScrollDelta(event.deltaY, parentElement);
|
|
84
91
|
};
|
|
85
92
|
#getParentElement() {
|
|
86
93
|
const parentElement = this.#dom.parentElement;
|
|
@@ -114,5 +121,28 @@ export class XFoldviewSlotNgTouchEventsHandler {
|
|
|
114
121
|
});
|
|
115
122
|
}
|
|
116
123
|
};
|
|
124
|
+
#handleScrollDelta(deltaY, parentElement) {
|
|
125
|
+
const scrollableKidY = this.#getTheMostScrollableKid(deltaY);
|
|
126
|
+
if ((parentElement[isHeaderShowing] && deltaY > 0
|
|
127
|
+
|| (deltaY < 0 && !scrollableKidY))
|
|
128
|
+
// deltaY > 0: swipe up (folding header)
|
|
129
|
+
// scroll the foldview if its scrollable
|
|
130
|
+
|| (!parentElement[isHeaderShowing] && !scrollableKidY)
|
|
131
|
+
// all sub doms are scrolled
|
|
132
|
+
) {
|
|
133
|
+
parentElement.scrollBy({
|
|
134
|
+
top: deltaY,
|
|
135
|
+
behavior: 'smooth',
|
|
136
|
+
});
|
|
137
|
+
this.#parentScrollTop += deltaY;
|
|
138
|
+
parentElement.scrollTop = this.#parentScrollTop;
|
|
139
|
+
this.#currentScrollingElement = parentElement;
|
|
140
|
+
}
|
|
141
|
+
else if (scrollableKidY) {
|
|
142
|
+
this.#currentScrollingElement = scrollableKidY;
|
|
143
|
+
this.#scrollKid(scrollableKidY, deltaY);
|
|
144
|
+
}
|
|
145
|
+
this.#deltaY = deltaY;
|
|
146
|
+
}
|
|
117
147
|
}
|
|
118
148
|
//# sourceMappingURL=XFoldviewSlotNgTouchEventsHandler.js.map
|
|
@@ -27,6 +27,7 @@ let XInputEvents = (() => {
|
|
|
27
27
|
static observedAttributes = ['send-composing-input', 'input-filter'];
|
|
28
28
|
#dom = __runInitializers(this, _instanceExtraInitializers);
|
|
29
29
|
#sendComposingInput = false;
|
|
30
|
+
#numberInputFilter = /[^0-9.]|\.(?=.*\.)/g;
|
|
30
31
|
#getInputElement = genDomGetter(() => this.#dom.shadowRoot, '#input');
|
|
31
32
|
#getFormElement = genDomGetter(() => this.#dom.shadowRoot, '#form');
|
|
32
33
|
_handleEnableInputEvent(status) {
|
|
@@ -54,10 +55,7 @@ let XInputEvents = (() => {
|
|
|
54
55
|
};
|
|
55
56
|
#teleportInput = (event) => {
|
|
56
57
|
const input = this.#getInputElement();
|
|
57
|
-
const
|
|
58
|
-
const filterValue = inputFilter
|
|
59
|
-
? input.value.replace(new RegExp(inputFilter, 'g'), '')
|
|
60
|
-
: input.value;
|
|
58
|
+
const filterValue = this.#filterInputValue(input.value);
|
|
61
59
|
const isComposing = event.isComposing;
|
|
62
60
|
input.value = filterValue;
|
|
63
61
|
if (isComposing && !this.#sendComposingInput)
|
|
@@ -78,10 +76,7 @@ let XInputEvents = (() => {
|
|
|
78
76
|
};
|
|
79
77
|
#teleportCompositionendInput = () => {
|
|
80
78
|
const input = this.#getInputElement();
|
|
81
|
-
const
|
|
82
|
-
const filterValue = inputFilter
|
|
83
|
-
? input.value.replace(new RegExp(inputFilter, 'g'), '')
|
|
84
|
-
: input.value;
|
|
79
|
+
const filterValue = this.#filterInputValue(input.value);
|
|
85
80
|
input.value = filterValue;
|
|
86
81
|
// if #sendComposingInput set true, #teleportInput will send detail
|
|
87
82
|
if (!this.#sendComposingInput) {
|
|
@@ -100,6 +95,17 @@ let XInputEvents = (() => {
|
|
|
100
95
|
}));
|
|
101
96
|
}
|
|
102
97
|
};
|
|
98
|
+
#filterInputValue(value) {
|
|
99
|
+
let filterValue = value;
|
|
100
|
+
if (this.#dom.getAttribute('type') === 'number') {
|
|
101
|
+
filterValue = filterValue.replace(this.#numberInputFilter, '');
|
|
102
|
+
}
|
|
103
|
+
const inputFilter = this.#dom.getAttribute('input-filter');
|
|
104
|
+
if (inputFilter) {
|
|
105
|
+
filterValue = filterValue.replace(new RegExp(inputFilter, 'g'), '');
|
|
106
|
+
}
|
|
107
|
+
return filterValue;
|
|
108
|
+
}
|
|
103
109
|
_handleEnableSelectionEvent(status) {
|
|
104
110
|
if (status) {
|
|
105
111
|
this.#getInputElement().addEventListener('select', this.#selectEvent, {
|
|
@@ -5,6 +5,8 @@ export declare class XList extends HTMLElement {
|
|
|
5
5
|
set scrollTop(val: number);
|
|
6
6
|
get scrollLeft(): number;
|
|
7
7
|
set scrollLeft(val: number);
|
|
8
|
+
get scrollHeight(): number;
|
|
9
|
+
get scrollWidth(): number;
|
|
8
10
|
get __scrollTop(): number;
|
|
9
11
|
get __scrollLeft(): number;
|
|
10
12
|
scrollToPosition(params: {
|
|
@@ -46,6 +46,12 @@ let XList = (() => {
|
|
|
46
46
|
set scrollLeft(val) {
|
|
47
47
|
this.#getListContainer().scrollLeft = val;
|
|
48
48
|
}
|
|
49
|
+
get scrollHeight() {
|
|
50
|
+
return this.#getListContainer().scrollHeight;
|
|
51
|
+
}
|
|
52
|
+
get scrollWidth() {
|
|
53
|
+
return this.#getListContainer().scrollWidth;
|
|
54
|
+
}
|
|
49
55
|
get __scrollTop() {
|
|
50
56
|
return super.scrollTop;
|
|
51
57
|
}
|
|
@@ -91,7 +91,7 @@ export const templateXImage = (attributes) => {
|
|
|
91
91
|
if (src && XSSDetector.test(src)) {
|
|
92
92
|
throw new Error('detected <script, this is a potential XSS attack, please check your src');
|
|
93
93
|
}
|
|
94
|
-
return `<img part="img" alt=""
|
|
94
|
+
return `<img part="img" alt="" id="img" ${src ? `src="${src}"` : ''}/> `;
|
|
95
95
|
};
|
|
96
96
|
export const templateFilterImage = templateXImage;
|
|
97
97
|
export const templateXInput = `<style>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lynx-js/web-elements",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -127,9 +127,9 @@
|
|
|
127
127
|
"**/*.css"
|
|
128
128
|
],
|
|
129
129
|
"devDependencies": {
|
|
130
|
-
"@playwright/test": "^1.
|
|
131
|
-
"@rsbuild/core": "1.7.
|
|
132
|
-
"@rsbuild/plugin-source-build": "
|
|
130
|
+
"@playwright/test": "^1.58.2",
|
|
131
|
+
"@rsbuild/core": "1.7.3",
|
|
132
|
+
"@rsbuild/plugin-source-build": "1.0.4",
|
|
133
133
|
"nyc": "^17.1.0",
|
|
134
134
|
"tslib": "^2.8.1",
|
|
135
135
|
"@lynx-js/playwright-fixtures": "0.0.0"
|