@lynx-js/web-elements 0.2.4

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 (204) hide show
  1. package/CHANGELOG.md +323 -0
  2. package/LICENSE.txt +202 -0
  3. package/Notice.txt +1 -0
  4. package/README.md +47 -0
  5. package/dist/LynxWrapper/LynxWrapper.d.ts +2 -0
  6. package/dist/LynxWrapper/LynxWrapper.js +27 -0
  7. package/dist/LynxWrapper/index.d.ts +1 -0
  8. package/dist/LynxWrapper/index.js +2 -0
  9. package/dist/ScrollView/FadeEdgeLengthAttribute.d.ts +10 -0
  10. package/dist/ScrollView/FadeEdgeLengthAttribute.js +43 -0
  11. package/dist/ScrollView/ScrollAttributes.d.ts +8 -0
  12. package/dist/ScrollView/ScrollAttributes.js +83 -0
  13. package/dist/ScrollView/ScrollIntoView.d.ts +9 -0
  14. package/dist/ScrollView/ScrollIntoView.js +71 -0
  15. package/dist/ScrollView/ScrollView.d.ts +31 -0
  16. package/dist/ScrollView/ScrollView.js +185 -0
  17. package/dist/ScrollView/ScrollViewEvents.d.ts +9 -0
  18. package/dist/ScrollView/ScrollViewEvents.js +146 -0
  19. package/dist/ScrollView/index.d.ts +1 -0
  20. package/dist/ScrollView/index.js +2 -0
  21. package/dist/XAudioTT/XAudioAttribute.d.ts +7 -0
  22. package/dist/XAudioTT/XAudioAttribute.js +93 -0
  23. package/dist/XAudioTT/XAudioEvents.d.ts +8 -0
  24. package/dist/XAudioTT/XAudioEvents.js +116 -0
  25. package/dist/XAudioTT/XAudioTT.d.ts +46 -0
  26. package/dist/XAudioTT/XAudioTT.js +183 -0
  27. package/dist/XAudioTT/index.d.ts +1 -0
  28. package/dist/XAudioTT/index.js +2 -0
  29. package/dist/XAudioTT/utils.d.ts +19 -0
  30. package/dist/XAudioTT/utils.js +66 -0
  31. package/dist/XCanvas/CanvasAttributes.d.ts +12 -0
  32. package/dist/XCanvas/CanvasAttributes.js +78 -0
  33. package/dist/XCanvas/XCanvas.d.ts +5 -0
  34. package/dist/XCanvas/XCanvas.js +32 -0
  35. package/dist/XCanvas/index.d.ts +1 -0
  36. package/dist/XCanvas/index.js +2 -0
  37. package/dist/XFoldViewNg/XFoldviewHeaderNg.d.ts +2 -0
  38. package/dist/XFoldViewNg/XFoldviewHeaderNg.js +32 -0
  39. package/dist/XFoldViewNg/XFoldviewHeaderNgFeatures.d.ts +9 -0
  40. package/dist/XFoldViewNg/XFoldviewHeaderNgFeatures.js +32 -0
  41. package/dist/XFoldViewNg/XFoldviewNg.d.ts +11 -0
  42. package/dist/XFoldViewNg/XFoldviewNg.js +52 -0
  43. package/dist/XFoldViewNg/XFoldviewNgEvents.d.ts +7 -0
  44. package/dist/XFoldViewNg/XFoldviewNgEvents.js +55 -0
  45. package/dist/XFoldViewNg/XFoldviewSlotDragNg.d.ts +2 -0
  46. package/dist/XFoldViewNg/XFoldviewSlotDragNg.js +30 -0
  47. package/dist/XFoldViewNg/XFoldviewSlotNg.d.ts +2 -0
  48. package/dist/XFoldViewNg/XFoldviewSlotNg.js +32 -0
  49. package/dist/XFoldViewNg/XFoldviewSlotNgTouchEventsHandler.d.ts +7 -0
  50. package/dist/XFoldViewNg/XFoldviewSlotNgTouchEventsHandler.js +105 -0
  51. package/dist/XFoldViewNg/XFoldviewToolbarNg.d.ts +2 -0
  52. package/dist/XFoldViewNg/XFoldviewToolbarNg.js +30 -0
  53. package/dist/XFoldViewNg/index.d.ts +5 -0
  54. package/dist/XFoldViewNg/index.js +6 -0
  55. package/dist/XImage/DropShadow.d.ts +6 -0
  56. package/dist/XImage/DropShadow.js +30 -0
  57. package/dist/XImage/FilterImage.d.ts +2 -0
  58. package/dist/XImage/FilterImage.js +31 -0
  59. package/dist/XImage/ImageEvents.d.ts +6 -0
  60. package/dist/XImage/ImageEvents.js +68 -0
  61. package/dist/XImage/ImageSrc.d.ts +7 -0
  62. package/dist/XImage/ImageSrc.js +61 -0
  63. package/dist/XImage/XImage.d.ts +2 -0
  64. package/dist/XImage/XImage.js +30 -0
  65. package/dist/XImage/index.d.ts +2 -0
  66. package/dist/XImage/index.js +3 -0
  67. package/dist/XInput/InputBaseAttributes.d.ts +9 -0
  68. package/dist/XInput/InputBaseAttributes.js +99 -0
  69. package/dist/XInput/Placeholder.d.ts +6 -0
  70. package/dist/XInput/Placeholder.js +60 -0
  71. package/dist/XInput/XInput.d.ts +28 -0
  72. package/dist/XInput/XInput.js +129 -0
  73. package/dist/XInput/XInputAttribute.d.ts +9 -0
  74. package/dist/XInput/XInputAttribute.js +52 -0
  75. package/dist/XInput/XInputEvents.d.ts +6 -0
  76. package/dist/XInput/XInputEvents.js +111 -0
  77. package/dist/XInput/index.d.ts +1 -0
  78. package/dist/XInput/index.js +2 -0
  79. package/dist/XList/ListItem.d.ts +2 -0
  80. package/dist/XList/ListItem.js +28 -0
  81. package/dist/XList/XList.d.ts +52 -0
  82. package/dist/XList/XList.js +257 -0
  83. package/dist/XList/XListAttributes.d.ts +8 -0
  84. package/dist/XList/XListAttributes.js +50 -0
  85. package/dist/XList/XListEvents.d.ts +7 -0
  86. package/dist/XList/XListEvents.js +356 -0
  87. package/dist/XList/index.d.ts +2 -0
  88. package/dist/XList/index.js +3 -0
  89. package/dist/XOverlayNg/XOverlayAttributes.d.ts +8 -0
  90. package/dist/XOverlayNg/XOverlayAttributes.js +80 -0
  91. package/dist/XOverlayNg/XOverlayNg.d.ts +2 -0
  92. package/dist/XOverlayNg/XOverlayNg.js +45 -0
  93. package/dist/XOverlayNg/index.d.ts +1 -0
  94. package/dist/XOverlayNg/index.js +2 -0
  95. package/dist/XRefreshView/XRefreshFooter.d.ts +3 -0
  96. package/dist/XRefreshView/XRefreshFooter.js +35 -0
  97. package/dist/XRefreshView/XRefreshHeader.d.ts +3 -0
  98. package/dist/XRefreshView/XRefreshHeader.js +35 -0
  99. package/dist/XRefreshView/XRefreshSubElementIntersectionObserver.d.ts +16 -0
  100. package/dist/XRefreshView/XRefreshSubElementIntersectionObserver.js +52 -0
  101. package/dist/XRefreshView/XRefreshView.d.ts +13 -0
  102. package/dist/XRefreshView/XRefreshView.js +125 -0
  103. package/dist/XRefreshView/XRefreshViewEventsEmitter.d.ts +8 -0
  104. package/dist/XRefreshView/XRefreshViewEventsEmitter.js +246 -0
  105. package/dist/XRefreshView/index.d.ts +3 -0
  106. package/dist/XRefreshView/index.js +4 -0
  107. package/dist/XSvg/XSvg.d.ts +8 -0
  108. package/dist/XSvg/XSvg.js +80 -0
  109. package/dist/XSvg/index.d.ts +1 -0
  110. package/dist/XSvg/index.js +2 -0
  111. package/dist/XSwiper/SwiperItem.d.ts +2 -0
  112. package/dist/XSwiper/SwiperItem.js +28 -0
  113. package/dist/XSwiper/XSwiper.d.ts +14 -0
  114. package/dist/XSwiper/XSwiper.js +231 -0
  115. package/dist/XSwiper/XSwiperAutoScroll.d.ts +8 -0
  116. package/dist/XSwiper/XSwiperAutoScroll.js +63 -0
  117. package/dist/XSwiper/XSwiperCircular.d.ts +8 -0
  118. package/dist/XSwiper/XSwiperCircular.js +191 -0
  119. package/dist/XSwiper/XSwiperEvents.d.ts +8 -0
  120. package/dist/XSwiper/XSwiperEvents.js +144 -0
  121. package/dist/XSwiper/XSwiperIndicator.d.ts +9 -0
  122. package/dist/XSwiper/XSwiperIndicator.js +118 -0
  123. package/dist/XSwiper/index.d.ts +2 -0
  124. package/dist/XSwiper/index.js +3 -0
  125. package/dist/XText/InlineImage.d.ts +11 -0
  126. package/dist/XText/InlineImage.js +56 -0
  127. package/dist/XText/InlineText.d.ts +5 -0
  128. package/dist/XText/InlineText.js +30 -0
  129. package/dist/XText/InlineTruncation.d.ts +5 -0
  130. package/dist/XText/InlineTruncation.js +42 -0
  131. package/dist/XText/RawText.d.ts +7 -0
  132. package/dist/XText/RawText.js +54 -0
  133. package/dist/XText/XText.d.ts +5 -0
  134. package/dist/XText/XText.js +49 -0
  135. package/dist/XText/XTextTruncation.d.ts +11 -0
  136. package/dist/XText/XTextTruncation.js +604 -0
  137. package/dist/XText/index.d.ts +5 -0
  138. package/dist/XText/index.js +6 -0
  139. package/dist/XTextarea/Placeholder.d.ts +7 -0
  140. package/dist/XTextarea/Placeholder.js +59 -0
  141. package/dist/XTextarea/TextareaBaseAttributes.d.ts +6 -0
  142. package/dist/XTextarea/TextareaBaseAttributes.js +70 -0
  143. package/dist/XTextarea/XTextarea.d.ts +21 -0
  144. package/dist/XTextarea/XTextarea.js +101 -0
  145. package/dist/XTextarea/XTextareaAttributes.d.ts +6 -0
  146. package/dist/XTextarea/XTextareaAttributes.js +81 -0
  147. package/dist/XTextarea/XTextareaEvents.d.ts +6 -0
  148. package/dist/XTextarea/XTextareaEvents.js +111 -0
  149. package/dist/XTextarea/index.d.ts +1 -0
  150. package/dist/XTextarea/index.js +2 -0
  151. package/dist/XView/BlurRadius.d.ts +7 -0
  152. package/dist/XView/BlurRadius.js +38 -0
  153. package/dist/XView/XBlurView.d.ts +2 -0
  154. package/dist/XView/XBlurView.js +29 -0
  155. package/dist/XView/XView.d.ts +4 -0
  156. package/dist/XView/XView.js +45 -0
  157. package/dist/XView/index.d.ts +2 -0
  158. package/dist/XView/index.js +3 -0
  159. package/dist/XViewpagerNg/XViewpagerItemNg.d.ts +2 -0
  160. package/dist/XViewpagerNg/XViewpagerItemNg.js +30 -0
  161. package/dist/XViewpagerNg/XViewpagerNg.d.ts +10 -0
  162. package/dist/XViewpagerNg/XViewpagerNg.js +98 -0
  163. package/dist/XViewpagerNg/XViewpagerNgEvents.d.ts +9 -0
  164. package/dist/XViewpagerNg/XViewpagerNgEvents.js +118 -0
  165. package/dist/XViewpagerNg/index.d.ts +2 -0
  166. package/dist/XViewpagerNg/index.js +3 -0
  167. package/dist/all.d.ts +16 -0
  168. package/dist/all.js +17 -0
  169. package/dist/common/Exposure.d.ts +28 -0
  170. package/dist/common/Exposure.js +193 -0
  171. package/dist/common/bindToIntersectionObserver.d.ts +1 -0
  172. package/dist/common/bindToIntersectionObserver.js +23 -0
  173. package/dist/common/commonEventInitConfiguration.d.ts +5 -0
  174. package/dist/common/commonEventInitConfiguration.js +9 -0
  175. package/dist/common/constants.d.ts +4 -0
  176. package/dist/common/constants.js +14 -0
  177. package/dist/common/convertLengthToPx.d.ts +1 -0
  178. package/dist/common/convertLengthToPx.js +25 -0
  179. package/dist/common/renameEvent.d.ts +1 -0
  180. package/dist/common/renameEvent.js +6 -0
  181. package/dist/common/throttle.d.ts +4 -0
  182. package/dist/common/throttle.js +40 -0
  183. package/dist/index.d.ts +4 -0
  184. package/dist/index.js +8 -0
  185. package/dist/lazy.d.ts +1 -0
  186. package/dist/lazy.js +106 -0
  187. package/index.css +19 -0
  188. package/package.json +110 -0
  189. package/src/LynxWrapper/lynx-wrapper.css +12 -0
  190. package/src/ScrollView/scroll-view.css +121 -0
  191. package/src/XAudioTT/x-audio-tt.css +3 -0
  192. package/src/XCanvas/x-canvas.css +16 -0
  193. package/src/XFoldViewNg/x-foldview-ng.css +80 -0
  194. package/src/XImage/x-image.css +82 -0
  195. package/src/XInput/x-input.css +48 -0
  196. package/src/XList/x-list.css +147 -0
  197. package/src/XOverlayNg/x-overlay-ng.css +56 -0
  198. package/src/XRefreshView/x-refresh-view.css +61 -0
  199. package/src/XSvg/x-svg.css +10 -0
  200. package/src/XSwiper/x-swiper.css +319 -0
  201. package/src/XText/x-text.css +272 -0
  202. package/src/XTextarea/x-textarea.css +49 -0
  203. package/src/XViewpagerNg/x-viewpager-ng.css +68 -0
  204. package/src/common-css/linear.css +386 -0
@@ -0,0 +1,30 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ /*
3
+ // Copyright 2024 The Lynx Authors. All rights reserved.
4
+ // Licensed under the Apache License Version 2.0 that can be found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { Component } from '@lynx-js/web-elements-reactive';
8
+ import { LynxExposure } from '../common/Exposure.js';
9
+ let XViewpagerItemNg = (() => {
10
+ let _classDecorators = [Component('x-viewpager-item-ng', [
11
+ LynxExposure,
12
+ ])];
13
+ let _classDescriptor;
14
+ let _classExtraInitializers = [];
15
+ let _classThis;
16
+ let _classSuper = HTMLElement;
17
+ var XViewpagerItemNg = class extends _classSuper {
18
+ static { _classThis = this; }
19
+ static {
20
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
21
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
22
+ XViewpagerItemNg = _classThis = _classDescriptor.value;
23
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
24
+ __runInitializers(_classThis, _classExtraInitializers);
25
+ }
26
+ };
27
+ return XViewpagerItemNg = _classThis;
28
+ })();
29
+ export { XViewpagerItemNg };
30
+ //# sourceMappingURL=XViewpagerItemNg.js.map
@@ -0,0 +1,10 @@
1
+ import { scrollContainerDom } from '../common/constants.js';
2
+ export declare class XViewpagerNg extends HTMLElement {
3
+ static notToFilterFalseAttributes: Set<string>;
4
+ selectTab(params: {
5
+ index: number;
6
+ smooth?: boolean;
7
+ }): void;
8
+ connectedCallback(): void;
9
+ get [scrollContainerDom](): this;
10
+ }
@@ -0,0 +1,98 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ /*
3
+ // Copyright 2024 The Lynx Authors. All rights reserved.
4
+ // Licensed under the Apache License Version 2.0 that can be found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { boostedQueueMicrotask, Component, html, } from '@lynx-js/web-elements-reactive';
8
+ import { LynxExposure } from '../common/Exposure.js';
9
+ import { XViewpagerNgEvents } from './XViewpagerNgEvents.js';
10
+ import { scrollContainerDom } from '../common/constants.js';
11
+ let XViewpagerNg = (() => {
12
+ let _classDecorators = [Component('x-viewpager-ng', [LynxExposure, XViewpagerNgEvents], html `
13
+ <style>
14
+ #bounce-padding {
15
+ display: none;
16
+ flex: 0 0 0;
17
+ align-self: stretch;
18
+ scroll-snap-align: none;
19
+ flex-basis: 100%;
20
+ }
21
+ #content {
22
+ flex: 0 0 100%;
23
+ flex-direction: row;
24
+ align-self: stretch;
25
+ display: inherit;
26
+ justify-content: inherit;
27
+ align-items: inherit;
28
+ overflow: inherit;
29
+ scrollbar-width: none;
30
+ scroll-snap-type: inherit;
31
+ }
32
+ #content::-webkit-scrollbar {
33
+ display: none;
34
+ }
35
+ </style>
36
+ <div id="bounce-padding" part="bounce-padding"></div>
37
+ <div id="content" part="content">
38
+ <slot></slot>
39
+ </div>
40
+ `)];
41
+ let _classDescriptor;
42
+ let _classExtraInitializers = [];
43
+ let _classThis;
44
+ let _classSuper = HTMLElement;
45
+ var XViewpagerNg = class extends _classSuper {
46
+ static { _classThis = this; }
47
+ static {
48
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
49
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
50
+ XViewpagerNg = _classThis = _classDescriptor.value;
51
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
52
+ }
53
+ static notToFilterFalseAttributes = new Set([
54
+ 'allow-horizontal-gesture',
55
+ 'enable-scroll',
56
+ ]);
57
+ selectTab(params) {
58
+ let { index, smooth } = params;
59
+ if (typeof smooth === 'undefined')
60
+ smooth = true;
61
+ const scrollContainer = this.shadowRoot.children.item(2);
62
+ const scrollLeft = scrollContainer.clientWidth * index;
63
+ scrollContainer.scrollTo({
64
+ left: scrollLeft,
65
+ behavior: smooth ? 'smooth' : 'instant',
66
+ });
67
+ }
68
+ connectedCallback() {
69
+ const initialSelectIndex = this.getAttribute('select-index')
70
+ || this.getAttribute('initial-select-index');
71
+ if (initialSelectIndex !== null) {
72
+ const selectIndex = Number(initialSelectIndex);
73
+ const scrollContainer = this.shadowRoot.children.item(2);
74
+ const scrollToInitialIndex = () => {
75
+ if (scrollContainer.clientWidth === 0) {
76
+ // In Safari, there is the potential race condition between the browser's layout and clientWidth calculate.
77
+ // So, we have to use requestAnimationFrame to ensure that the code runs after the browser's layout.
78
+ requestAnimationFrame(scrollToInitialIndex);
79
+ }
80
+ else {
81
+ this.selectTab({ index: selectIndex, smooth: false });
82
+ }
83
+ };
84
+ // The reason for using microtasks is that the width and height of the child element may not be rendered at this time, so it will not be able to scroll.
85
+ boostedQueueMicrotask(scrollToInitialIndex);
86
+ }
87
+ }
88
+ get [scrollContainerDom]() {
89
+ return this;
90
+ }
91
+ static {
92
+ __runInitializers(_classThis, _classExtraInitializers);
93
+ }
94
+ };
95
+ return XViewpagerNg = _classThis;
96
+ })();
97
+ export { XViewpagerNg };
98
+ //# sourceMappingURL=XViewpagerNg.js.map
@@ -0,0 +1,9 @@
1
+ import { type AttributeReactiveClass } from '@lynx-js/web-elements-reactive';
2
+ import { XViewpagerNg } from './XViewpagerNg.js';
3
+ export declare class XViewpagerNgEvents implements InstanceType<AttributeReactiveClass<typeof XViewpagerNg>> {
4
+ #private;
5
+ static observedAttributes: string[];
6
+ constructor(dom: XViewpagerNg);
7
+ connectedCallback(): void;
8
+ dispose(): void;
9
+ }
@@ -0,0 +1,118 @@
1
+ import { __esDecorate, __runInitializers, __setFunctionName } from "tslib";
2
+ /*
3
+ // Copyright 2024 The Lynx Authors. All rights reserved.
4
+ // Licensed under the Apache License Version 2.0 that can be found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { genDomGetter, registerAttributeHandler, } from '@lynx-js/web-elements-reactive';
8
+ import { commonComponentEventSetting } from '../common/commonEventInitConfiguration.js';
9
+ import { useScrollEnd } from '../common/constants.js';
10
+ let XViewpagerNgEvents = (() => {
11
+ let _instanceExtraInitializers = [];
12
+ let _private_enableScrollEventListener_decorators;
13
+ let _private_enableScrollEventListener_descriptor;
14
+ return class XViewpagerNgEvents {
15
+ static {
16
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
17
+ _private_enableScrollEventListener_decorators = [registerAttributeHandler('x-enable-change-event', true), registerAttributeHandler('x-enable-offsetchange-event', true)];
18
+ __esDecorate(this, _private_enableScrollEventListener_descriptor = { value: __setFunctionName(function () {
19
+ this.#enableChange =
20
+ this.#dom.getAttribute('x-enable-change-event') !== null;
21
+ const enableOffsetChange = this.#dom.getAttribute('x-enable-offsetchange-event') !== null;
22
+ const scrollContainer = this.#getScrollContainer();
23
+ if (enableOffsetChange !== null || this.#enableChange) {
24
+ scrollContainer.addEventListener('scroll', this.#scrollHandler, {
25
+ passive: true,
26
+ });
27
+ }
28
+ else {
29
+ scrollContainer.removeEventListener('scroll', this.#scrollHandler);
30
+ }
31
+ if (useScrollEnd && this.#enableChange) {
32
+ scrollContainer.addEventListener('scrollend', this.#scrollEndHandler, {
33
+ passive: true,
34
+ });
35
+ }
36
+ else {
37
+ scrollContainer.removeEventListener('scrollend', this.#scrollEndHandler);
38
+ }
39
+ }, "#enableScrollEventListener") }, _private_enableScrollEventListener_decorators, { kind: "method", name: "#enableScrollEventListener", static: false, private: true, access: { has: obj => #enableScrollEventListener in obj, get: obj => obj.#enableScrollEventListener }, metadata: _metadata }, null, _instanceExtraInitializers);
40
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
41
+ }
42
+ static observedAttributes = [
43
+ 'x-enable-change-event',
44
+ 'x-enable-offsetchange-event',
45
+ ];
46
+ #dom = __runInitializers(this, _instanceExtraInitializers);
47
+ #isDragging = false;
48
+ #connected = false;
49
+ #currentIndex = 0;
50
+ #enableChange = false;
51
+ #debounceScrollForMockingScrollEnd;
52
+ constructor(dom) {
53
+ this.#dom = dom;
54
+ }
55
+ #getScrollContainer = genDomGetter(() => this.#dom.shadowRoot, '#content');
56
+ #scrollHandler = () => {
57
+ if (!this.#connected)
58
+ return;
59
+ const scrollContainer = this.#getScrollContainer();
60
+ const oneItemWidth = this.#dom.clientWidth;
61
+ const scrollLeft = scrollContainer.scrollLeft;
62
+ const innerOffset = scrollLeft / oneItemWidth;
63
+ if (this.#enableChange && !useScrollEnd) {
64
+ // debounce
65
+ clearTimeout(this.#debounceScrollForMockingScrollEnd);
66
+ this.#debounceScrollForMockingScrollEnd = setTimeout(() => {
67
+ this.#scrollEndHandler();
68
+ }, 100);
69
+ }
70
+ this.#dom.dispatchEvent(new CustomEvent('offsetchange', {
71
+ ...commonComponentEventSetting,
72
+ detail: { offset: innerOffset },
73
+ }));
74
+ };
75
+ #scrollEndHandler = () => {
76
+ if (this.#connected) {
77
+ const scrollContainer = this.#getScrollContainer();
78
+ const oneItemWidth = this.#dom.clientWidth;
79
+ const scrollLeft = scrollContainer.scrollLeft;
80
+ const currentIndex = Math.floor(scrollLeft / oneItemWidth);
81
+ if (currentIndex !== this.#currentIndex) {
82
+ this.#dom.dispatchEvent(new CustomEvent('change', {
83
+ ...commonComponentEventSetting,
84
+ detail: { index: currentIndex, isDragged: this.#isDragging },
85
+ }));
86
+ this.#currentIndex = currentIndex;
87
+ }
88
+ }
89
+ };
90
+ #touchStartHandler = () => {
91
+ this.#isDragging = true;
92
+ };
93
+ #touchEndHandler = () => {
94
+ this.#isDragging = false;
95
+ };
96
+ get #enableScrollEventListener() { return _private_enableScrollEventListener_descriptor.value; }
97
+ connectedCallback() {
98
+ this.#connected = true;
99
+ const scrollContainer = this.#getScrollContainer();
100
+ this.#dom.addEventListener('touchstart', this.#touchStartHandler, {
101
+ passive: true,
102
+ });
103
+ scrollContainer.addEventListener('touchend', this.#touchEndHandler, {
104
+ passive: true,
105
+ });
106
+ scrollContainer.addEventListener('touchcancel', this.#touchEndHandler, {
107
+ passive: true,
108
+ });
109
+ }
110
+ dispose() {
111
+ const scrollContainer = this.#getScrollContainer();
112
+ scrollContainer.removeEventListener('scroll', this.#scrollHandler);
113
+ scrollContainer.removeEventListener('scrollend', this.#scrollEndHandler);
114
+ }
115
+ };
116
+ })();
117
+ export { XViewpagerNgEvents };
118
+ //# sourceMappingURL=XViewpagerNgEvents.js.map
@@ -0,0 +1,2 @@
1
+ export { XViewpagerNg } from './XViewpagerNg.js';
2
+ export { XViewpagerItemNg } from './XViewpagerItemNg.js';
@@ -0,0 +1,3 @@
1
+ export { XViewpagerNg } from './XViewpagerNg.js';
2
+ export { XViewpagerItemNg } from './XViewpagerItemNg.js';
3
+ //# sourceMappingURL=index.js.map
package/dist/all.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import './LynxWrapper/index.js';
2
+ import './ScrollView/index.js';
3
+ import './XAudioTT/index.js';
4
+ import './XCanvas/XCanvas.js';
5
+ import './XFoldViewNg/index.js';
6
+ import './XImage/index.js';
7
+ import './XInput/index.js';
8
+ import './XOverlayNg/index.js';
9
+ import './XRefreshView/index.js';
10
+ import './XSvg/index.js';
11
+ import './XSwiper/index.js';
12
+ import './XText/index.js';
13
+ import './XTextarea/index.js';
14
+ import './XView/index.js';
15
+ import './XViewpagerNg/index.js';
16
+ import './XList/index.js';
package/dist/all.js ADDED
@@ -0,0 +1,17 @@
1
+ import './LynxWrapper/index.js';
2
+ import './ScrollView/index.js';
3
+ import './XAudioTT/index.js';
4
+ import './XCanvas/XCanvas.js';
5
+ import './XFoldViewNg/index.js';
6
+ import './XImage/index.js';
7
+ import './XInput/index.js';
8
+ import './XOverlayNg/index.js';
9
+ import './XRefreshView/index.js';
10
+ import './XSvg/index.js';
11
+ import './XSwiper/index.js';
12
+ import './XText/index.js';
13
+ import './XTextarea/index.js';
14
+ import './XView/index.js';
15
+ import './XViewpagerNg/index.js';
16
+ import './XList/index.js';
17
+ //# sourceMappingURL=all.js.map
@@ -0,0 +1,28 @@
1
+ export interface ExposureParameters {
2
+ exposureID: string | null;
3
+ exposureArea: string | null;
4
+ exposureScene: string | null;
5
+ exposureScreenMarginTop: string | null;
6
+ exposureScreenMarginRight: string | null;
7
+ exposureScreenMarginBottom: string | null;
8
+ exposureScreenMarginLeft: string | null;
9
+ exposureUIMarginTop: string | null;
10
+ exposureUIMarginRight: string | null;
11
+ exposureUIMarginBottom: string | null;
12
+ exposureUIMarginLeft: string | null;
13
+ }
14
+ export interface ExposureEvent {
15
+ 'exposure-id': string;
16
+ 'exposure-scene': string;
17
+ exposureID: string;
18
+ exposureScene: string;
19
+ }
20
+ export declare class LynxExposure {
21
+ #private;
22
+ static readonly observedAttributes: string[];
23
+ constructor(currentElement: HTMLElement);
24
+ onExposureParamsChanged: () => void;
25
+ onExposureIdChanged(_: string | null, oldValue: string | null): void;
26
+ attributeChangedHandler: this;
27
+ disableExposure(): void;
28
+ }
@@ -0,0 +1,193 @@
1
+ // Copyright 2024 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ import { convertLengthToPx } from './convertLengthToPx.js';
5
+ import { commonComponentEventSetting } from './commonEventInitConfiguration.js';
6
+ import { scrollContainerDom } from './constants.js';
7
+ export class LynxExposure {
8
+ static observedAttributes = [
9
+ 'x-enable-uiappear-event',
10
+ 'x-enable-uidisappear-event',
11
+ 'exposure-id',
12
+ 'exposure-area',
13
+ 'exposure-screen-margin-top',
14
+ 'exposure-screen-margin-right',
15
+ 'exposure-screen-margin-bottom',
16
+ 'exposure-screen-margin-left',
17
+ 'exposure-ui-margin-top',
18
+ 'exposure-ui-margin-right',
19
+ 'exposure-ui-margin-bottom',
20
+ 'exposure-ui-margin-left',
21
+ ];
22
+ #currentElement;
23
+ /**
24
+ * Stores a promise. We will handler the exposure attribute change after all related life-cycle events has been fired by browser.
25
+ */
26
+ #afterAttributeChanged;
27
+ /**
28
+ * If this dom is already exposured
29
+ */
30
+ #exposureTriggerd = false;
31
+ /**
32
+ * keeps the observer of current dom
33
+ */
34
+ #exposureObserver;
35
+ get #exposureEnabled() {
36
+ return (this.#currentElement.getAttribute('x-enable-uiappear-event') !== null
37
+ || this.#currentElement.getAttribute('x-enable-uidisappear-event')
38
+ !== null
39
+ || this.#currentElement.getAttribute('exposure-id') !== null);
40
+ }
41
+ constructor(currentElement) {
42
+ this.#currentElement = currentElement;
43
+ }
44
+ onExposureParamsChanged = () => {
45
+ if (!this.#afterAttributeChanged) {
46
+ this.#afterAttributeChanged = Promise.resolve().then(() => {
47
+ this.#updateExposure();
48
+ this.#afterAttributeChanged = undefined;
49
+ });
50
+ }
51
+ };
52
+ onExposureIdChanged(_, oldValue) {
53
+ if (oldValue) {
54
+ if (this.#exposureEnabled) {
55
+ this.#sendOneExposureEvent({ isIntersecting: false }, oldValue);
56
+ }
57
+ }
58
+ this.onExposureParamsChanged();
59
+ }
60
+ attributeChangedHandler = new Proxy(this, {
61
+ get(target, attribute) {
62
+ if (LynxExposure.observedAttributes.includes(attribute)) {
63
+ if (attribute === 'exposure-id') {
64
+ return { handler: target.onExposureIdChanged, noDomMeasure: true };
65
+ }
66
+ else {
67
+ return {
68
+ handler: target.onExposureParamsChanged,
69
+ noDomMeasure: true,
70
+ };
71
+ }
72
+ }
73
+ return;
74
+ },
75
+ });
76
+ #updateExposure() {
77
+ const newParams = {
78
+ exposureID: this.#currentElement.getAttribute('exposure-id'),
79
+ exposureArea: this.#currentElement.getAttribute('exposure-area'),
80
+ exposureScene: this.#currentElement.getAttribute('exposure-scene'),
81
+ exposureScreenMarginTop: this.#currentElement.getAttribute('exposure-screen-margin-top'),
82
+ exposureScreenMarginRight: this.#currentElement.getAttribute('exposure-screen-margin-right'),
83
+ exposureScreenMarginBottom: this.#currentElement.getAttribute('exposure-screen-margin-bottom'),
84
+ exposureScreenMarginLeft: this.#currentElement.getAttribute('exposure-screen-margin-left'),
85
+ exposureUIMarginTop: this.#currentElement.getAttribute('exposure-ui-margin-top'),
86
+ exposureUIMarginRight: this.#currentElement.getAttribute('exposure-ui-margin-right'),
87
+ exposureUIMarginBottom: this.#currentElement.getAttribute('exposure-ui-margin-bottom'),
88
+ exposureUIMarginLeft: this.#currentElement.getAttribute('exposure-ui-margin-left'),
89
+ };
90
+ if (this.#exposureEnabled) {
91
+ if (IntersectionObserver) {
92
+ const uiMargin = {
93
+ top: convertLengthToPx(this.#currentElement, newParams.exposureUIMarginTop),
94
+ right: convertLengthToPx(this.#currentElement, newParams.exposureUIMarginRight, true),
95
+ bottom: convertLengthToPx(this.#currentElement, newParams.exposureUIMarginBottom),
96
+ left: convertLengthToPx(this.#currentElement, newParams.exposureUIMarginLeft, true),
97
+ };
98
+ const screenMargin = {
99
+ top: convertLengthToPx(this.#currentElement, newParams.exposureScreenMarginTop),
100
+ right: convertLengthToPx(this.#currentElement, newParams.exposureScreenMarginRight, true),
101
+ bottom: convertLengthToPx(this.#currentElement, newParams.exposureScreenMarginBottom),
102
+ left: convertLengthToPx(this.#currentElement, newParams.exposureScreenMarginLeft, true),
103
+ };
104
+ /**
105
+ * TODO: @haoyang.wang support the switch `enableExposureUIMargin`
106
+ */
107
+ const calcedRootMargin = {
108
+ top: (uiMargin.bottom ? -1 : 1)
109
+ * (screenMargin.top - uiMargin.bottom),
110
+ right: (uiMargin.left ? -1 : 1)
111
+ * (screenMargin.right - uiMargin.left),
112
+ bottom: (uiMargin.top ? -1 : 1)
113
+ * (screenMargin.bottom - uiMargin.top),
114
+ left: (uiMargin.right ? -1 : 1)
115
+ * (screenMargin.left - uiMargin.right),
116
+ };
117
+ const exposureArea = this.#currentElement.getAttribute('exposure-area');
118
+ const rootMargin = `${calcedRootMargin.top}px ${calcedRootMargin.right}px ${calcedRootMargin.bottom}px ${calcedRootMargin.left}px`;
119
+ const threshold = exposureArea ? parseFloat(exposureArea) / 100 : 0;
120
+ if (this.#exposureObserver) {
121
+ this.#exposureObserver.disconnect();
122
+ }
123
+ /**
124
+ * Get the closest scrollable ancestor
125
+ */
126
+ let root = this.#currentElement.parentElement;
127
+ while (root) {
128
+ // @ts-expect-error
129
+ if (root[scrollContainerDom]) {
130
+ // @ts-expect-error
131
+ root = root[scrollContainerDom];
132
+ break;
133
+ }
134
+ else {
135
+ root = root.parentElement;
136
+ }
137
+ }
138
+ this.#exposureTriggerd = false;
139
+ this.#exposureObserver = new IntersectionObserver(([entry]) => {
140
+ if (entry) {
141
+ if (entry.isIntersecting) {
142
+ this.#exposureTriggerd = true;
143
+ }
144
+ this.#sendOneExposureEvent(entry);
145
+ }
146
+ }, {
147
+ rootMargin,
148
+ threshold,
149
+ root,
150
+ });
151
+ this.#exposureObserver.observe(this.#currentElement);
152
+ }
153
+ }
154
+ else {
155
+ this.disableExposure();
156
+ }
157
+ }
158
+ #sendOneExposureEvent(entry, overrideExposureId) {
159
+ if (!this.#exposureTriggerd) {
160
+ return;
161
+ }
162
+ const exposureID = overrideExposureId
163
+ ?? this.#currentElement.getAttribute('exposure-id') ?? '';
164
+ const exposureScene = this.#currentElement.getAttribute('exposure-scene')
165
+ ?? '';
166
+ const detail = {
167
+ 'exposure-id': exposureID,
168
+ 'exposure-scene': exposureScene,
169
+ exposureID,
170
+ exposureScene,
171
+ };
172
+ const appearEvent = new CustomEvent(entry.isIntersecting ? 'uiappear' : 'uidisappear', {
173
+ ...commonComponentEventSetting,
174
+ detail,
175
+ });
176
+ const exposureEvent = new CustomEvent(entry.isIntersecting ? 'exposure' : 'disexposure', {
177
+ bubbles: true,
178
+ composed: false,
179
+ cancelable: false,
180
+ detail,
181
+ });
182
+ Object.assign(appearEvent, detail);
183
+ this.#currentElement.dispatchEvent(appearEvent);
184
+ this.#currentElement.dispatchEvent(exposureEvent);
185
+ }
186
+ disableExposure() {
187
+ if (this.#exposureObserver) {
188
+ this.#exposureObserver.disconnect();
189
+ this.#exposureObserver = undefined;
190
+ }
191
+ }
192
+ }
193
+ //# sourceMappingURL=Exposure.js.map
@@ -0,0 +1 @@
1
+ export declare function bindToIntersectionObserver(rootGetter: () => HTMLElement, targetGetter: () => HTMLElement, callback: IntersectionObserverCallback): (newVal: string | null) => void;
@@ -0,0 +1,23 @@
1
+ // Copyright 2024 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ export function bindToIntersectionObserver(rootGetter, targetGetter, callback) {
5
+ let observer;
6
+ return (newVal) => {
7
+ if (newVal !== null) {
8
+ if (!observer) {
9
+ observer = new IntersectionObserver(callback, {
10
+ root: rootGetter(),
11
+ });
12
+ observer.observe(targetGetter());
13
+ }
14
+ }
15
+ else {
16
+ if (observer) {
17
+ observer.disconnect();
18
+ observer = undefined;
19
+ }
20
+ }
21
+ };
22
+ }
23
+ //# sourceMappingURL=bindToIntersectionObserver.js.map
@@ -0,0 +1,5 @@
1
+ export declare const commonComponentEventSetting: {
2
+ readonly bubbles: false;
3
+ readonly composed: false;
4
+ readonly cancelable: true;
5
+ };
@@ -0,0 +1,9 @@
1
+ // Copyright 2024 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ export const commonComponentEventSetting = {
5
+ bubbles: false,
6
+ composed: false,
7
+ cancelable: true,
8
+ };
9
+ //# sourceMappingURL=commonEventInitConfiguration.js.map
@@ -0,0 +1,4 @@
1
+ export declare const useScrollEnd: boolean;
2
+ export declare const isChromium: boolean;
3
+ export declare const isWebkit: boolean;
4
+ export declare const scrollContainerDom: unique symbol;
@@ -0,0 +1,14 @@
1
+ // Copyright 2024 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ // safari cannot use scrollend event
5
+ export const useScrollEnd = 'onscrollend' in document;
6
+ const UA = window.navigator.userAgent;
7
+ export const isChromium = UA.includes('Chrome');
8
+ export const isWebkit = /\b(iPad|iPhone|iPod|OS X)\b/.test(UA)
9
+ && !/Edge/.test(UA)
10
+ && /WebKit/.test(UA)
11
+ // @ts-expect-error
12
+ && !window.MSStream;
13
+ export const scrollContainerDom = Symbol();
14
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ export declare function convertLengthToPx(targetElement: HTMLElement, str: string | null, isWidth?: boolean): number;
@@ -0,0 +1,25 @@
1
+ // Copyright 2024 The Lynx Authors. All rights reserved.
2
+ // Licensed under the Apache License Version 2.0 that can be found in the
3
+ // LICENSE file in the root directory of this source tree.
4
+ export function convertLengthToPx(targetElement, str, isWidth) {
5
+ if (str) {
6
+ str = str.trim();
7
+ if (str.endsWith('px')) {
8
+ return Number(str.substring(0, str.length - 2));
9
+ }
10
+ else if (str.endsWith('%')) {
11
+ const pct = Number(str.substring(0, str.length - 1));
12
+ const { width, height } = targetElement.getBoundingClientRect();
13
+ const base = isWidth ? width : height;
14
+ return (base * pct) / 100;
15
+ }
16
+ else {
17
+ /**
18
+ * TODO (haoyang.wang): support rpx
19
+ */
20
+ return 0;
21
+ }
22
+ }
23
+ return 0;
24
+ }
25
+ //# sourceMappingURL=convertLengthToPx.js.map
@@ -0,0 +1 @@
1
+ export declare const renameEvent: Record<string, string>;
@@ -0,0 +1,6 @@
1
+ export const renameEvent = {
2
+ 'submit': 'confirm',
3
+ 'blur': 'lynxblur',
4
+ 'focus': 'lynxfocus',
5
+ };
6
+ //# sourceMappingURL=renameEvent.js.map
@@ -0,0 +1,4 @@
1
+ export declare const throttle: (func: () => unknown, wait: number, options?: {
2
+ leading: boolean;
3
+ trailing: boolean;
4
+ }) => (this: unknown) => any;