glass-easel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,370 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ /* global window, document */
3
+
4
+ import {
5
+ EventOptions,
6
+ EventBubbleStatus,
7
+ } from '../event'
8
+ import {
9
+ safeCallback,
10
+ } from '../func_arr'
11
+ import {
12
+ BackendMode,
13
+ BoundingClientRect,
14
+ } from './mode'
15
+
16
+ export interface Context {
17
+ mode: BackendMode.Domlike
18
+ destroy(): void
19
+ getWindowWidth(): number
20
+ getWindowHeight(): number
21
+ getDevicePixelRatio(): number
22
+ getTheme(): string
23
+ registerStyleSheetContent(path: string, content: unknown): void
24
+ appendStyleSheetPath(path: string, styleScope?: number): number
25
+ disableStyleSheet(index: number): void
26
+ render(cb: (err: Error | null) => void): void
27
+ getRootNode(): Element
28
+ document: {
29
+ createElement(tagName: string): Element
30
+ createTextNode(content: string): Element
31
+ createDocumentFragment(): Element
32
+ }
33
+ onEvent(listener: (
34
+ target: unknown,
35
+ type: string,
36
+ detail: unknown,
37
+ options: EventOptions,
38
+ ) => EventBubbleStatus): void
39
+ setElementEventDefaultPrevented(element: Element, type: string, enabled: boolean): void
40
+ }
41
+
42
+ export interface Element {
43
+ appendChild(child: Element): void
44
+ removeChild(child: Element, index?: number): void
45
+ insertBefore(child: Element, before?: Element, index?: number): void
46
+ replaceChild(child: Element, oldChild?: Element, index?: number): void
47
+ id: string
48
+ classList: {
49
+ add(elementClass: string): void
50
+ remove(elementClass: string): void
51
+ }
52
+ setAttribute(name: string, value: unknown): void
53
+ removeAttribute(name: string): void
54
+ textContent: string
55
+ nextSibling: Element | undefined
56
+ childNodes: Element[]
57
+ getBoundingClientRect(): BoundingClientRect
58
+ scrollLeft: number
59
+ scrollTop: number
60
+ scrollWidth: number
61
+ scrollHeight: number
62
+ __wxElement?: unknown
63
+ addEventListener<K extends keyof HTMLElementEventMap>(
64
+ type: K,
65
+ listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => unknown,
66
+ options?: boolean | AddEventListenerOptions,
67
+ ): void;
68
+ addEventListener(
69
+ type: string,
70
+ listener: EventListenerOrEventListenerObject,
71
+ options?: boolean | AddEventListenerOptions,
72
+ ): void;
73
+ }
74
+
75
+ const DELEGATE_EVENTS = [
76
+ 'touchstart',
77
+ 'touchmove',
78
+ 'touchend',
79
+ 'touchcancel',
80
+ 'mousedown',
81
+ 'mousemove',
82
+ 'mouseout',
83
+ 'mouseover',
84
+ 'mouseup',
85
+ 'click',
86
+ ]
87
+
88
+ export class CurrentWindowBackendContext implements Context {
89
+ mode: BackendMode.Domlike = BackendMode.Domlike
90
+ document = document as unknown as {
91
+ createElement(tagName: string): Element
92
+ createTextNode(content: string): Element
93
+ createDocumentFragment(): Element
94
+ }
95
+ private _$styleSheets: HTMLElement[] = []
96
+ private _$styleSheetRegistry = Object.create(null) as { [path: string]: string }
97
+ private _$delegatedEventListeners = Object.create(null) as Record<string, true>
98
+ private _$elementEventListeners = new WeakMap<Element, Record<string, true>>()
99
+ private _$triggedEvents = new WeakSet<Event>()
100
+ private _$eventListener?: (
101
+ target: any,
102
+ type: string,
103
+ detail: any,
104
+ options: EventOptions,
105
+ ) => EventBubbleStatus | void
106
+
107
+ destroy() {
108
+ /* empty */
109
+ }
110
+
111
+ getWindowWidth(): number {
112
+ return document.documentElement.clientWidth
113
+ }
114
+
115
+ getWindowHeight(): number {
116
+ return document.documentElement.clientHeight
117
+ }
118
+
119
+ getDevicePixelRatio(): number {
120
+ return window.devicePixelRatio
121
+ }
122
+
123
+ getTheme(): string {
124
+ return 'light'
125
+ }
126
+
127
+ registerStyleSheetContent(path: string, content: unknown): void {
128
+ this._$styleSheetRegistry[path] = String(content)
129
+ }
130
+
131
+ appendStyleSheetPath(path: string, styleScope?: number): number {
132
+ const styleText = this._$styleSheetRegistry[path]
133
+ if (styleText === undefined) throw new Error(`No style sheet registry "${path}"`)
134
+ const s = document.createElement('style')
135
+ s.innerText = styleText
136
+ if (styleScope !== undefined) s.setAttribute('wx-style-scope', String(styleScope))
137
+ document.head.appendChild(s)
138
+ const id = this._$styleSheets.length
139
+ this._$styleSheets.push(s)
140
+ return id
141
+ }
142
+
143
+ disableStyleSheet(index: number) {
144
+ const ss = this._$styleSheets[index]
145
+ if (ss) document.head.removeChild(ss)
146
+ }
147
+
148
+ render(cb: (err: Error | null) => void) {
149
+ window.requestAnimationFrame(() => {
150
+ safeCallback(
151
+ 'Render Callback',
152
+ cb,
153
+ this,
154
+ [null],
155
+ )
156
+ })
157
+ }
158
+
159
+ getRootNode(): Element {
160
+ return document.body as unknown as Element
161
+ }
162
+
163
+ onEvent(listener: (
164
+ target: any,
165
+ type: string,
166
+ detail: any,
167
+ options: EventOptions,
168
+ ) => EventBubbleStatus | void) {
169
+ if (!this._$eventListener) {
170
+ this._$initEvent()
171
+ }
172
+ this._$eventListener = listener
173
+ }
174
+
175
+ private _$getEventDetail(ev: Event) {
176
+ const detail: { [key: string]: unknown } = {}
177
+ let e: Event = ev
178
+ while (Object.getPrototypeOf(e) !== Event.prototype) {
179
+ const keys = Object.keys(e)
180
+ for (let i = 0; i < keys.length; i += 1) {
181
+ const key = keys[i]!
182
+ if (typeof (ev as unknown as { [key: string]: unknown })[key] === 'function') continue
183
+ detail[key] = (ev as unknown as { [key: string]: unknown })[key]
184
+ }
185
+ e = Object.getPrototypeOf(e) as Event
186
+ }
187
+ return detail
188
+ }
189
+
190
+ private _$trigger(
191
+ ev: Event,
192
+ type: string,
193
+ detail: unknown,
194
+ bubbles: boolean,
195
+ composed: boolean,
196
+ ) {
197
+ if (!this._$eventListener) return
198
+ const target = ev.target
199
+ const bubbleStatus = this._$eventListener(target, type, detail, {
200
+ originalEvent: ev,
201
+ bubbles,
202
+ composed,
203
+ })
204
+ if (bubbleStatus === EventBubbleStatus.NoDefault) {
205
+ ev.preventDefault()
206
+ }
207
+ }
208
+
209
+ private _$initEvent() {
210
+ const TAP_DIST = 10
211
+
212
+ const possibleTaps = Object.create(null) as { [id: number]: { x: number, y: number } }
213
+ const SIMULATED_MOUSE_ID = -1
214
+ let disableMouseEvents = false
215
+
216
+ const handleTapStart = (
217
+ _ev: Event,
218
+ t: { identifier: number, clientX: number, clientY: number },
219
+ ) => {
220
+ possibleTaps[t.identifier] = {
221
+ x: t.clientX,
222
+ y: t.clientY,
223
+ }
224
+ }
225
+
226
+ const handleTapMove = (
227
+ ev: Event,
228
+ t: { identifier: number, clientX: number, clientY: number },
229
+ ) => {
230
+ const id = t.identifier
231
+ if (possibleTaps[id]) {
232
+ const u = possibleTaps[id]!
233
+ if (
234
+ Math.abs(u.x - t.clientX) > TAP_DIST
235
+ || Math.abs(u.y - t.clientY) > TAP_DIST
236
+ ) {
237
+ delete possibleTaps[id]
238
+ this._$trigger(ev, 'canceltap', u, true, true)
239
+ }
240
+ }
241
+ }
242
+
243
+ const handleTapEnd = (
244
+ ev: Event,
245
+ t: { identifier: number, clientX: number, clientY: number },
246
+ ) => {
247
+ const id = t.identifier
248
+ if (possibleTaps[id]) {
249
+ const u = possibleTaps[id]!
250
+ delete possibleTaps[id]
251
+ if (
252
+ Math.abs(u.x - t.clientX) > TAP_DIST
253
+ || Math.abs(u.y - t.clientY) > TAP_DIST
254
+ ) {
255
+ this._$trigger(ev, 'canceltap', u, true, true)
256
+ } else {
257
+ this._$trigger(ev, 'tap', u, true, true)
258
+ }
259
+ }
260
+ }
261
+
262
+ const handleTapCancel = (
263
+ ev: Event,
264
+ t: { identifier: number, clientX: number, clientY: number },
265
+ ) => {
266
+ const id = t.identifier
267
+ if (possibleTaps[id]) {
268
+ const u = possibleTaps[id]!
269
+ delete possibleTaps[id]
270
+ this._$trigger(ev, 'canceltap', u, true, true)
271
+ }
272
+ }
273
+
274
+ document.body.addEventListener('touchstart', (ev) => {
275
+ this._$trigger(ev, 'touchstart', this._$getEventDetail(ev), ev.bubbles, ev.composed)
276
+ disableMouseEvents = true
277
+ const changedTouches = ev.changedTouches
278
+ for (let i = 0; i < changedTouches.length; i += 1) {
279
+ handleTapStart(ev, changedTouches[i]!)
280
+ }
281
+ }, { capture: true })
282
+ document.body.addEventListener('touchmove', (ev) => {
283
+ this._$trigger(ev, 'touchmove', this._$getEventDetail(ev), ev.bubbles, ev.composed)
284
+ const changedTouches = ev.changedTouches
285
+ for (let i = 0; i < changedTouches.length; i += 1) {
286
+ handleTapMove(ev, changedTouches[i]!)
287
+ }
288
+ }, { capture: true })
289
+ document.body.addEventListener('touchend', (ev) => {
290
+ this._$trigger(ev, 'touchend', this._$getEventDetail(ev), ev.bubbles, ev.composed)
291
+ const changedTouches = ev.changedTouches
292
+ for (let i = 0; i < changedTouches.length; i += 1) {
293
+ handleTapEnd(ev, changedTouches[i]!)
294
+ }
295
+ }, { capture: true })
296
+ document.body.addEventListener('touchcancel', (ev) => {
297
+ this._$trigger(ev, 'touchcancel', this._$getEventDetail(ev), ev.bubbles, ev.composed)
298
+ const changedTouches = ev.changedTouches
299
+ for (let i = 0; i < changedTouches.length; i += 1) {
300
+ handleTapCancel(ev, changedTouches[i]!)
301
+ }
302
+ }, { capture: true })
303
+ document.body.addEventListener('mousedown', (ev) => {
304
+ this._$trigger(ev, 'mousedown', this._$getEventDetail(ev), ev.bubbles, ev.composed)
305
+ if (disableMouseEvents) return
306
+ handleTapStart(ev, {
307
+ identifier: SIMULATED_MOUSE_ID,
308
+ clientX: ev.clientX,
309
+ clientY: ev.clientY,
310
+ })
311
+ }, { capture: true })
312
+ document.body.addEventListener('mousemove', (ev) => {
313
+ this._$trigger(ev, 'mousemove', this._$getEventDetail(ev), ev.bubbles, ev.composed)
314
+ if (disableMouseEvents) return
315
+ handleTapMove(ev, {
316
+ identifier: SIMULATED_MOUSE_ID,
317
+ clientX: ev.clientX,
318
+ clientY: ev.clientY,
319
+ })
320
+ }, { capture: true })
321
+ document.body.addEventListener('mouseup', (ev) => {
322
+ this._$trigger(ev, 'mouseup', this._$getEventDetail(ev), ev.bubbles, ev.composed)
323
+ if (disableMouseEvents) return
324
+ handleTapEnd(ev, {
325
+ identifier: SIMULATED_MOUSE_ID,
326
+ clientX: ev.clientX,
327
+ clientY: ev.clientY,
328
+ })
329
+ }, { capture: true })
330
+ const listeners = this._$delegatedEventListeners
331
+ listeners.touchstart = true
332
+ listeners.touchmove = true
333
+ listeners.touchend = true
334
+ listeners.mousedown = true
335
+ listeners.mousemove = true
336
+ listeners.mouseup = true
337
+ }
338
+
339
+ setElementEventDefaultPrevented(element: Element, type: string, _enabled: boolean): void {
340
+ // for non-passive events,
341
+ // the default-prevented status can also be found in `EventBubbleStatus` ,
342
+ // so there is nothing to do with non-passive events.
343
+ if (!element) return
344
+
345
+ const shouldDelegate = DELEGATE_EVENTS.includes(type)
346
+
347
+ if (shouldDelegate) {
348
+ if (this._$delegatedEventListeners[type]) return
349
+ this._$delegatedEventListeners[type] = true
350
+
351
+ document.body.addEventListener(type, (ev) => {
352
+ this._$trigger(ev, type, this._$getEventDetail(ev), ev.bubbles, ev.composed)
353
+ }, { capture: true })
354
+ return
355
+ }
356
+
357
+ if (!this._$elementEventListeners.has(element)) {
358
+ this._$elementEventListeners.set(element, Object.create(null))
359
+ }
360
+ const listeners = this._$elementEventListeners.get(element)!
361
+ if (listeners[type]) return
362
+ listeners[type] = true
363
+
364
+ element.addEventListener(type, (ev) => {
365
+ if (this._$triggedEvents.has(ev)) return
366
+ this._$triggedEvents.add(ev)
367
+ this._$trigger(ev, type, this._$getEventDetail(ev), ev.bubbles, ev.composed)
368
+ })
369
+ }
370
+ }
@@ -0,0 +1,51 @@
1
+ export const BM = {
2
+ DYNAMIC: true,
3
+ SHADOW: false,
4
+ COMPOSED: false,
5
+ DOMLIKE: false,
6
+ }
7
+
8
+ export const enum BackendMode {
9
+ Shadow = 1,
10
+ Composed = 2,
11
+ Domlike = 3,
12
+ }
13
+
14
+ export type BoundingClientRect = {
15
+ left: number
16
+ top: number
17
+ width: number
18
+ height: number
19
+ }
20
+
21
+ export type ScrollOffset = {
22
+ scrollLeft: number
23
+ scrollTop: number
24
+ scrollWidth: number
25
+ scrollHeight: number
26
+ }
27
+
28
+ export type CSSProperty = {
29
+ name: string
30
+ value: string
31
+ disabled: boolean
32
+ invalid: boolean
33
+ }
34
+ export type CSSRule = {
35
+ sheetIndex: number
36
+ ruleIndex: number
37
+ mediaQueries: string[]
38
+ selector: string
39
+ properties: CSSProperty[]
40
+ weightHighBits: number
41
+ weightLowBits: number
42
+ }
43
+
44
+ export type GetMatchedRulesResponese = {
45
+ inline: CSSProperty[]
46
+ rules: CSSRule[]
47
+ }
48
+
49
+ export type GetAllComputedStylesResponese = {
50
+ properties: CSSProperty[]
51
+ }
@@ -0,0 +1,83 @@
1
+ import { GeneralBackendContext, Node } from '../node'
2
+ import {
3
+ BoundingClientRect,
4
+ GetAllComputedStylesResponese,
5
+ GetMatchedRulesResponese,
6
+ ScrollOffset,
7
+ } from './mode'
8
+
9
+ interface GetWrapper<T> {
10
+ get(): T
11
+ }
12
+
13
+ export interface Element {
14
+ getAllComputedStyles(cb: (res: GetAllComputedStylesResponese) => void): void
15
+ getBoundingClientRect(cb: (res: BoundingClientRect) => void): void
16
+ getMatchedRules(cb: (res: GetMatchedRulesResponese) => void): void
17
+ replaceStyleSheetInlineStyle(inlineStyle: string): void
18
+ getScrollOffset(cb: (res: ScrollOffset) => void): void
19
+ setScrollPosition(scrollLeft: number, scrollTop: number, duration: number): void
20
+ }
21
+
22
+ export interface Context {
23
+ createContext(
24
+ options: unknown,
25
+ cb: (ContextWrapper: GetWrapper<Partial<Context> & GeneralBackendContext>) => void
26
+ ): void
27
+
28
+ setFocusedNode(target: Node): void
29
+ getFocusedNode(): Node | undefined
30
+
31
+ elementFromPoint(left: number, top: number, cb: (node: Node) => void): void
32
+
33
+ // StyleSheet related
34
+ addStyleSheetRule(
35
+ mediaQueryStr: string,
36
+ selector: string,
37
+ callback: (ruleIndex: number | null) => void
38
+ ): void
39
+ getStyleSheetIndexForNewRules(callback: (sheetIndex: number) => void): void
40
+ resetStyleSheetRule(
41
+ sheetIndex: number,
42
+ ruleIndex: number,
43
+ callback: (ruleIndex: number | null) => void
44
+ ): void
45
+ modifyStyleSheetRuleSelector(
46
+ sheetIndex: number,
47
+ ruleIndex: number,
48
+ selector: string,
49
+ callback: (ruleIndex: number | null) => void
50
+ ): void
51
+ addStyleSheetProperty(
52
+ sheetIndex: number,
53
+ ruleIndex: number,
54
+ inlineStyle: string,
55
+ callback: (propertyIndex: number | null) => void
56
+ ): void
57
+ replaceStyleSheetAllProperties(
58
+ sheetIndex: number,
59
+ ruleIndex: number,
60
+ inlineStyle: string,
61
+ callback: (propertyIndex: number | null) => void
62
+ ): void
63
+ setStyleSheetPropertyDisabled(
64
+ sheetIndex: number,
65
+ ruleIndex: number,
66
+ propertyIndex: number,
67
+ disabled: boolean,
68
+ callback: (propertyIndex: number | null) => void
69
+ ): void
70
+ removeStyleSheetProperty(
71
+ sheetIndex: number,
72
+ ruleIndex: number,
73
+ propertyIndex: number,
74
+ callback: (propertyIndex: number | null) => void
75
+ ): void
76
+ replaceStyleSheetProperty(
77
+ sheetIndex: number,
78
+ ruleIndex: number,
79
+ propertyIndex: number,
80
+ inlineStyle: string,
81
+ callback: (propertyIndex: number | null) => void
82
+ ): void
83
+ }