glass-easel 0.2.0 → 0.3.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 (197) hide show
  1. package/.eslintignore +4 -0
  2. package/dist/glass_easel.all.js +2 -2
  3. package/dist/glass_easel.all.js.map +1 -1
  4. package/dist/glass_easel.d.ts +2546 -0
  5. package/dist/glass_easel.domlike.global.js +2 -2
  6. package/dist/glass_easel.domlike.global.js.map +1 -1
  7. package/guide/zh_CN/appendix/backend_protocol.md +164 -74
  8. package/jest.unit.config.js +7 -4
  9. package/package.json +7 -5
  10. package/rollup.config.ts +101 -0
  11. package/src/backend/backend_protocol.ts +26 -345
  12. package/src/backend/composed_backend_protocol.ts +10 -264
  13. package/src/backend/current_window_backend_context.ts +478 -0
  14. package/src/backend/domlike_backend_protocol.ts +9 -498
  15. package/src/backend/empty_backend.ts +265 -0
  16. package/src/backend/empty_composed_backend.ts +245 -0
  17. package/src/backend/index.ts +18 -0
  18. package/src/backend/suggested_backend_protocol.ts +62 -11
  19. package/src/behavior.ts +131 -442
  20. package/src/class_list.ts +328 -222
  21. package/src/component.ts +349 -184
  22. package/src/component_params.ts +54 -25
  23. package/src/component_space.ts +36 -15
  24. package/src/data_path.ts +22 -34
  25. package/src/data_proxy.ts +334 -27
  26. package/src/devtool.ts +89 -0
  27. package/src/element.ts +667 -285
  28. package/src/element_iterator.ts +9 -4
  29. package/src/event.ts +39 -20
  30. package/src/external_shadow_tree.ts +2 -2
  31. package/src/func_arr.ts +55 -101
  32. package/src/global_options.ts +18 -42
  33. package/src/index.ts +72 -73
  34. package/src/mutation_observer.ts +10 -7
  35. package/src/native_node.ts +79 -35
  36. package/src/node.ts +23 -30
  37. package/src/relation.ts +101 -12
  38. package/src/render.ts +5 -3
  39. package/src/selector.ts +9 -7
  40. package/src/shadow_root.ts +96 -240
  41. package/src/template_engine.ts +10 -7
  42. package/src/text_node.ts +43 -19
  43. package/src/tmpl/index.ts +38 -30
  44. package/src/tmpl/native_rendering.ts +14 -21
  45. package/src/tmpl/proc_gen_wrapper.ts +189 -151
  46. package/src/tmpl/proc_gen_wrapper_dom.ts +10 -8
  47. package/src/tmpl/range_list_diff.ts +30 -9
  48. package/src/trait_behaviors.ts +1 -1
  49. package/src/type_symbol.ts +36 -0
  50. package/src/virtual_node.ts +26 -13
  51. package/src/warning.ts +119 -0
  52. package/tests/base/composed_backend.ts +143 -142
  53. package/tests/base/env.ts +76 -3
  54. package/tests/base/match.ts +24 -22
  55. package/tests/base/shadow_backend.ts +917 -0
  56. package/tests/core/backend.test.ts +53 -1
  57. package/tests/core/behavior.test.ts +1 -1
  58. package/tests/core/data_update.test.ts +135 -0
  59. package/tests/core/misc.test.ts +91 -21
  60. package/tests/core/placeholder.test.ts +66 -25
  61. package/tests/core/slot.test.ts +161 -23
  62. package/tests/legacy/component.test.js +152 -78
  63. package/tests/legacy/data_path.test.js +19 -19
  64. package/tests/legacy/data_proxy.test.js +14 -7
  65. package/tests/legacy/external.test.js +8 -8
  66. package/tests/legacy/mutation_observer.test.js +7 -5
  67. package/tests/legacy/slot.test.js +2 -3
  68. package/tests/legacy/virtual.test.js +258 -25
  69. package/tests/tmpl/binding_map.test.ts +201 -195
  70. package/tests/tmpl/event.test.ts +138 -23
  71. package/tests/tmpl/expression.test.ts +15 -15
  72. package/tests/tmpl/lvalue.test.ts +101 -0
  73. package/tests/tmpl/structure.test.ts +486 -43
  74. package/tests/types/chaining.test.ts +27 -30
  75. package/tests/types/createElement.test.ts +5 -4
  76. package/tests/types/definition.test.ts +11 -14
  77. package/tsconfig.json +1 -3
  78. package/dist/glass_easel.all.d.ts +0 -1
  79. package/dist/glass_easel.domlike.global.d.ts +0 -1
  80. package/dist/index.d.ts +0 -1
  81. package/dist/index.js +0 -1
  82. package/dist/types/src/backend/backend_protocol.d.ts +0 -141
  83. package/dist/types/src/backend/backend_protocol.d.ts.map +0 -1
  84. package/dist/types/src/backend/composed_backend_protocol.d.ts +0 -102
  85. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +0 -1
  86. package/dist/types/src/backend/domlike_backend_protocol.d.ts +0 -100
  87. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +0 -1
  88. package/dist/types/src/backend/mode.d.ts +0 -65
  89. package/dist/types/src/backend/mode.d.ts.map +0 -1
  90. package/dist/types/src/backend/suggested_backend_protocol.d.ts +0 -30
  91. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +0 -1
  92. package/dist/types/src/behavior.d.ts +0 -434
  93. package/dist/types/src/behavior.d.ts.map +0 -1
  94. package/dist/types/src/class_list.d.ts +0 -83
  95. package/dist/types/src/class_list.d.ts.map +0 -1
  96. package/dist/types/src/component.d.ts +0 -325
  97. package/dist/types/src/component.d.ts.map +0 -1
  98. package/dist/types/src/component_params.d.ts +0 -236
  99. package/dist/types/src/component_params.d.ts.map +0 -1
  100. package/dist/types/src/component_space.d.ts +0 -211
  101. package/dist/types/src/component_space.d.ts.map +0 -1
  102. package/dist/types/src/data_path.d.ts +0 -5
  103. package/dist/types/src/data_path.d.ts.map +0 -1
  104. package/dist/types/src/data_proxy.d.ts +0 -107
  105. package/dist/types/src/data_proxy.d.ts.map +0 -1
  106. package/dist/types/src/data_utils.d.ts +0 -3
  107. package/dist/types/src/data_utils.d.ts.map +0 -1
  108. package/dist/types/src/element.d.ts +0 -365
  109. package/dist/types/src/element.d.ts.map +0 -1
  110. package/dist/types/src/element_iterator.d.ts +0 -43
  111. package/dist/types/src/element_iterator.d.ts.map +0 -1
  112. package/dist/types/src/event.d.ts +0 -105
  113. package/dist/types/src/event.d.ts.map +0 -1
  114. package/dist/types/src/external_shadow_tree.d.ts +0 -20
  115. package/dist/types/src/external_shadow_tree.d.ts.map +0 -1
  116. package/dist/types/src/func_arr.d.ts +0 -39
  117. package/dist/types/src/func_arr.d.ts.map +0 -1
  118. package/dist/types/src/global_options.d.ts +0 -120
  119. package/dist/types/src/global_options.d.ts.map +0 -1
  120. package/dist/types/src/index.d.ts +0 -43
  121. package/dist/types/src/index.d.ts.map +0 -1
  122. package/dist/types/src/mutation_observer.d.ts +0 -79
  123. package/dist/types/src/mutation_observer.d.ts.map +0 -1
  124. package/dist/types/src/native_node.d.ts +0 -11
  125. package/dist/types/src/native_node.d.ts.map +0 -1
  126. package/dist/types/src/node.d.ts +0 -48
  127. package/dist/types/src/node.d.ts.map +0 -1
  128. package/dist/types/src/relation.d.ts +0 -46
  129. package/dist/types/src/relation.d.ts.map +0 -1
  130. package/dist/types/src/render.d.ts +0 -3
  131. package/dist/types/src/render.d.ts.map +0 -1
  132. package/dist/types/src/selector.d.ts +0 -32
  133. package/dist/types/src/selector.d.ts.map +0 -1
  134. package/dist/types/src/shadow_root.d.ts +0 -174
  135. package/dist/types/src/shadow_root.d.ts.map +0 -1
  136. package/dist/types/src/template_engine.d.ts +0 -56
  137. package/dist/types/src/template_engine.d.ts.map +0 -1
  138. package/dist/types/src/text_node.d.ts +0 -44
  139. package/dist/types/src/text_node.d.ts.map +0 -1
  140. package/dist/types/src/tmpl/index.d.ts +0 -19
  141. package/dist/types/src/tmpl/index.d.ts.map +0 -1
  142. package/dist/types/src/tmpl/native_rendering.d.ts +0 -45
  143. package/dist/types/src/tmpl/native_rendering.d.ts.map +0 -1
  144. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +0 -89
  145. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +0 -1
  146. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +0 -50
  147. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +0 -1
  148. package/dist/types/src/tmpl/range_list_diff.d.ts +0 -19
  149. package/dist/types/src/tmpl/range_list_diff.d.ts.map +0 -1
  150. package/dist/types/src/trait_behaviors.d.ts +0 -38
  151. package/dist/types/src/trait_behaviors.d.ts.map +0 -1
  152. package/dist/types/src/virtual_node.d.ts +0 -10
  153. package/dist/types/src/virtual_node.d.ts.map +0 -1
  154. package/dist/types/tests/backend/domlike.test.d.ts +0 -2
  155. package/dist/types/tests/backend/domlike.test.d.ts.map +0 -1
  156. package/dist/types/tests/base/composed_backend.d.ts +0 -123
  157. package/dist/types/tests/base/composed_backend.d.ts.map +0 -1
  158. package/dist/types/tests/base/env.d.ts +0 -30
  159. package/dist/types/tests/base/env.d.ts.map +0 -1
  160. package/dist/types/tests/base/match.d.ts +0 -9
  161. package/dist/types/tests/base/match.d.ts.map +0 -1
  162. package/dist/types/tests/core/backend.test.d.ts +0 -2
  163. package/dist/types/tests/core/backend.test.d.ts.map +0 -1
  164. package/dist/types/tests/core/behavior.test.d.ts +0 -2
  165. package/dist/types/tests/core/behavior.test.d.ts.map +0 -1
  166. package/dist/types/tests/core/component_space.test.d.ts +0 -2
  167. package/dist/types/tests/core/component_space.test.d.ts.map +0 -1
  168. package/dist/types/tests/core/data_update.test.d.ts +0 -2
  169. package/dist/types/tests/core/data_update.test.d.ts.map +0 -1
  170. package/dist/types/tests/core/misc.test.d.ts +0 -2
  171. package/dist/types/tests/core/misc.test.d.ts.map +0 -1
  172. package/dist/types/tests/core/placeholder.test.d.ts +0 -2
  173. package/dist/types/tests/core/placeholder.test.d.ts.map +0 -1
  174. package/dist/types/tests/core/slot.test.d.ts +0 -2
  175. package/dist/types/tests/core/slot.test.d.ts.map +0 -1
  176. package/dist/types/tests/core/trait_behaviors.test.d.ts +0 -2
  177. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +0 -1
  178. package/dist/types/tests/tmpl/binding_map.test.d.ts +0 -2
  179. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +0 -1
  180. package/dist/types/tests/tmpl/event.test.d.ts +0 -2
  181. package/dist/types/tests/tmpl/event.test.d.ts.map +0 -1
  182. package/dist/types/tests/tmpl/expression.test.d.ts +0 -2
  183. package/dist/types/tests/tmpl/expression.test.d.ts.map +0 -1
  184. package/dist/types/tests/tmpl/lvalue.test.d.ts +0 -2
  185. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +0 -1
  186. package/dist/types/tests/tmpl/native_rendering.test.d.ts +0 -2
  187. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +0 -1
  188. package/dist/types/tests/tmpl/structure.test.d.ts +0 -2
  189. package/dist/types/tests/tmpl/structure.test.d.ts.map +0 -1
  190. package/dist/types/tests/types/chaining.test.d.ts +0 -2
  191. package/dist/types/tests/types/chaining.test.d.ts.map +0 -1
  192. package/dist/types/tests/types/createElement.test.d.ts +0 -2
  193. package/dist/types/tests/types/createElement.test.d.ts.map +0 -1
  194. package/dist/types/tests/types/definition.test.d.ts +0 -2
  195. package/dist/types/tests/types/definition.test.d.ts.map +0 -1
  196. package/webpack.config.js +0 -275
  197. /package/src/backend/{mode.ts → shared.ts} +0 -0
@@ -1,27 +1,13 @@
1
1
  /* eslint-disable class-methods-use-this */
2
2
 
3
- import { EventBubbleStatus, EventOptions, MutLevel } from '../event'
4
- import { safeCallback } from '../func_arr'
5
- import {
6
- BackendMode,
7
- BoundingClientRect,
8
- IntersectionStatus,
9
- MediaQueryStatus,
10
- Observer,
11
- ScrollOffset,
12
- } from './mode'
13
- import * as suggestedBackend from './suggested_backend_protocol'
3
+ import { type Element as GlassEaselElement } from '../element'
4
+ import { type Event, type EventBubbleStatus, type EventOptions, type MutLevel } from '../event'
5
+ import { type BackendMode } from './shared'
6
+ import type * as suggestedBackend from './suggested_backend_protocol'
14
7
 
15
- export {
16
- BackendMode,
17
- BoundingClientRect,
18
- IntersectionStatus,
19
- MediaQueryStatus,
20
- Observer,
21
- ScrollOffset,
22
- } from './mode'
8
+ export * from './shared'
23
9
 
24
- export interface Context extends Partial<suggestedBackend.Context> {
10
+ export interface Context extends Partial<suggestedBackend.Context<Context>> {
25
11
  mode: BackendMode.Shadow
26
12
  destroy(): void
27
13
  getWindowWidth(): number
@@ -35,22 +21,20 @@ export interface Context extends Partial<suggestedBackend.Context> {
35
21
  getRootNode(): ShadowRootContext
36
22
  createFragment(): Element
37
23
  onEvent(
24
+ createEvent: (type: string, detail: unknown, options: EventOptions) => Event<unknown>,
38
25
  listener: (
39
- target: unknown,
40
- type: string,
41
- detail: unknown,
42
- options: EventOptions,
43
- ) => EventBubbleStatus,
26
+ event: Event<unknown>,
27
+ currentTarget: GlassEaselElement,
28
+ mark: Record<string, unknown> | null,
29
+ target: GlassEaselElement,
30
+ isCapture: boolean,
31
+ ) => EventBubbleStatus | void,
44
32
  ): void
45
- createMediaQueryObserver(
46
- status: MediaQueryStatus,
47
- listener: (res: { matches: boolean }) => void,
48
- ): Observer
49
33
  }
50
34
 
51
- export interface Element extends Partial<suggestedBackend.Element> {
35
+ export interface Element extends Partial<suggestedBackend.Element<Element>> {
52
36
  release(): void
53
- associateValue(v: unknown): void
37
+ associateValue(v: GlassEaselElement): void
54
38
  getShadowRoot(): ShadowRootContext | undefined
55
39
  appendChild(child: Element): void
56
40
  removeChild(child: Element, index?: number): void
@@ -67,332 +51,29 @@ export interface Element extends Partial<suggestedBackend.Element> {
67
51
  spliceAppendSlotNodes(list: Element): void
68
52
  spliceRemoveSlotNodes(before: number, deleteCount: number): void
69
53
  setInheritSlots(): void
70
- setVirtualHost(): void
71
- setStyleScope(styleScope: number, hostStyleScope?: number): void
72
54
  setStyle(styleText: string): void
73
- addClass(elementClass: string, styleScope?: number): void
74
- removeClass(elementClass: string, styleScope?: number): void
55
+ addClass(className: string): void
56
+ removeClass(className: string): void
75
57
  clearClasses(): void
58
+ setClassAlias(className: string, targets: string[]): void
76
59
  setAttribute(name: string, value: unknown): void
77
60
  removeAttribute(name: string): void
78
61
  setDataset(name: string, value: unknown): void
79
62
  setText(content: string): void
80
- getBoundingClientRect(cb: (res: BoundingClientRect) => void): void
81
- getScrollOffset(cb: (res: ScrollOffset) => void): void
82
63
  setModelBindingStat(attributeName: string, listener: ((newValue: unknown) => void) | null): void
83
64
  setListenerStats(type: string, capture: boolean, mutLevel: MutLevel): void
84
- createIntersectionObserver(
85
- relativeElement: Element | null,
86
- relativeElementMargin: string,
87
- thresholds: number[],
88
- listener: (res: IntersectionStatus) => void,
89
- ): Observer
90
- getContext(cb: (res: unknown) => void): void
91
65
  }
92
66
 
93
67
  export interface ShadowRootContext extends Element {
94
68
  createElement(logicalName: string, stylingName: string): Element
95
69
  createTextNode(content: string): Element
96
- createComponent(tagName: string): Element
70
+ createComponent(
71
+ tagName: string,
72
+ external: boolean,
73
+ virtualHost: boolean,
74
+ styleScope: number,
75
+ extraStyleScope: number | null,
76
+ externalClasses: string[] | undefined,
77
+ ): Element
97
78
  createVirtualNode(virtualName: string): Element
98
79
  }
99
-
100
- export const enum EmptyBackendElementType {
101
- Fragment,
102
- Element,
103
- TextNode,
104
- Component,
105
- VirtualNode,
106
- }
107
-
108
- /** An empty backend implementation */
109
- export class EmptyBackendContext implements Context {
110
- mode: BackendMode.Shadow = BackendMode.Shadow
111
- private _$styleSheetIdInc = 1
112
- private _$renderCallbacks: ((err: Error) => void)[] | null = null
113
- private _$shadowRoot: EmptyBackendShadowRootContext = new EmptyBackendShadowRootContext()
114
-
115
- destroy(): void {
116
- // empty
117
- }
118
-
119
- getWindowWidth(): number {
120
- return 1
121
- }
122
-
123
- getWindowHeight(): number {
124
- return 1
125
- }
126
-
127
- getDevicePixelRatio(): number {
128
- return 1
129
- }
130
-
131
- getTheme(): string {
132
- return 'light'
133
- }
134
-
135
- registerStyleSheetContent(_path: string, _content: unknown): void {
136
- // empty
137
- }
138
-
139
- appendStyleSheetPath(_path: string, _styleScope?: number): number {
140
- const id = this._$styleSheetIdInc
141
- this._$styleSheetIdInc += 1
142
- return id
143
- }
144
-
145
- disableStyleSheet(_index: number): void {
146
- // empty
147
- }
148
-
149
- render(cb: (err: Error | null) => void): void {
150
- if (this._$renderCallbacks) {
151
- this._$renderCallbacks.push(cb)
152
- } else {
153
- const callbacks = (this._$renderCallbacks = [cb])
154
- setTimeout(() => {
155
- this._$renderCallbacks = null
156
- callbacks.forEach((cb) => {
157
- safeCallback('Render Callback', cb, this, [null])
158
- })
159
- }, 16)
160
- }
161
- }
162
-
163
- getRootNode(): EmptyBackendShadowRootContext {
164
- return this._$shadowRoot
165
- }
166
-
167
- createFragment(): EmptyBackendElement {
168
- return new EmptyBackendElement(EmptyBackendElementType.Fragment)
169
- }
170
-
171
- onEvent(
172
- _listener: (
173
- target: unknown,
174
- type: string,
175
- detail: unknown,
176
- options: EventOptions,
177
- ) => EventBubbleStatus,
178
- ): void {
179
- // empty
180
- }
181
-
182
- createMediaQueryObserver(
183
- _status: MediaQueryStatus,
184
- _listener: (res: { matches: boolean }) => void,
185
- ): Observer {
186
- return {
187
- disconnect: () => {
188
- /* empty */
189
- },
190
- }
191
- }
192
- }
193
-
194
- /** An element for empty backend implementation */
195
- export class EmptyBackendElement implements Element {
196
- private _$shadowRoot: EmptyBackendShadowRootContext | null
197
-
198
- constructor(type: EmptyBackendElementType) {
199
- if (type === EmptyBackendElementType.Component) {
200
- this._$shadowRoot = new EmptyBackendShadowRootContext()
201
- } else {
202
- this._$shadowRoot = null
203
- }
204
- }
205
-
206
- release(): void {
207
- // empty
208
- }
209
-
210
- associateValue(_v: unknown): void {
211
- // empty
212
- }
213
-
214
- getShadowRoot(): EmptyBackendShadowRootContext | undefined {
215
- return this._$shadowRoot || undefined
216
- }
217
-
218
- appendChild(_child: EmptyBackendElement): void {
219
- // empty
220
- }
221
-
222
- removeChild(_child: EmptyBackendElement, _index: number): void {
223
- // empty
224
- }
225
-
226
- insertBefore(_child: EmptyBackendElement, _before: EmptyBackendElement, _index: number): void {
227
- // empty
228
- }
229
-
230
- replaceChild(_child: EmptyBackendElement, _oldChild: EmptyBackendElement, _index?: number): void {
231
- // empty
232
- }
233
-
234
- spliceBefore(
235
- _before: EmptyBackendElement,
236
- _deleteCount: number,
237
- _list: EmptyBackendElement,
238
- ): void {
239
- // empty
240
- }
241
-
242
- spliceAppend(_list: EmptyBackendElement): void {
243
- // empty
244
- }
245
-
246
- spliceRemove(_before: EmptyBackendElement, _deleteCount: number): void {
247
- // empty
248
- }
249
-
250
- setId(_id: string): void {
251
- // empty
252
- }
253
-
254
- setSlotName(_name: string): void {
255
- // empty
256
- }
257
-
258
- setContainingSlot(_slot: EmptyBackendElement): void {
259
- // empty
260
- }
261
-
262
- reassignContainingSlot(_oldSlot: Element | null, _newSlot: Element | null): void {
263
- // empty
264
- }
265
-
266
- spliceBeforeSlotNodes(_before: number, _deleteCount: number, _list: Element): void {
267
- // empty
268
- }
269
-
270
- spliceRemoveSlotNodes(_before: number, _deleteCount: number): void {
271
- // empty
272
- }
273
-
274
- spliceAppendSlotNodes(_list: Element): void {
275
- // empty
276
- }
277
-
278
- setInheritSlots(): void {
279
- // empty
280
- }
281
-
282
- setVirtualHost(): void {
283
- // empty
284
- }
285
-
286
- setStyleScope(_styleScope: number): void {
287
- // empty
288
- }
289
-
290
- setStyle(_styleText: string): void {
291
- // empty
292
- }
293
-
294
- addClass(_elementClass: string, _styleScope?: number): void {
295
- // empty
296
- }
297
-
298
- removeClass(_elementClass: string, _styleScope?: number): void {
299
- // empty
300
- }
301
-
302
- clearClasses(): void {
303
- // empty
304
- }
305
-
306
- setAttribute(_name: string, _value: unknown): void {
307
- // empty
308
- }
309
-
310
- removeAttribute(_name: string): void {
311
- // empty
312
- }
313
-
314
- setDataset(_name: string, _value: unknown): void {
315
- // empty
316
- }
317
-
318
- setText(_content: string): void {
319
- // empty
320
- }
321
-
322
- getBoundingClientRect(cb: (res: BoundingClientRect) => void): void {
323
- setTimeout(() => {
324
- cb({
325
- left: 0,
326
- top: 0,
327
- width: 0,
328
- height: 0,
329
- })
330
- }, 0)
331
- }
332
-
333
- getScrollOffset(cb: (res: ScrollOffset) => void): void {
334
- setTimeout(() => {
335
- cb({
336
- scrollLeft: 0,
337
- scrollTop: 0,
338
- scrollWidth: 0,
339
- scrollHeight: 0,
340
- })
341
- }, 0)
342
- }
343
-
344
- setListenerStats(_type: string, _capture: boolean, _mutLevel: MutLevel): void {
345
- // empty
346
- }
347
-
348
- setModelBindingStat(
349
- _attributeName: string,
350
- _listener: ((newValue: unknown) => void) | null,
351
- ): void {
352
- // empty
353
- }
354
-
355
- createIntersectionObserver(
356
- _relativeElement: Element | null,
357
- _relativeElementMargin: string,
358
- _thresholds: number[],
359
- _listener: (res: IntersectionStatus) => void,
360
- ): Observer {
361
- return {
362
- disconnect: () => {
363
- /* empty */
364
- },
365
- }
366
- }
367
-
368
- getContext(cb: (res: unknown) => void): void {
369
- cb(null)
370
- }
371
- }
372
-
373
- /** A shadow root for empty backend implementation */
374
- export class EmptyBackendShadowRootContext
375
- extends EmptyBackendElement
376
- implements ShadowRootContext
377
- {
378
- // eslint-disable-next-line no-useless-constructor
379
- constructor() {
380
- super(EmptyBackendElementType.VirtualNode)
381
- }
382
-
383
- createElement(_tagName: string, _stylingName: string): EmptyBackendElement {
384
- return new EmptyBackendElement(EmptyBackendElementType.Element)
385
- }
386
-
387
- createTextNode(_content: string): EmptyBackendElement {
388
- return new EmptyBackendElement(EmptyBackendElementType.TextNode)
389
- }
390
-
391
- createComponent(_tagName: string): EmptyBackendElement {
392
- return new EmptyBackendElement(EmptyBackendElementType.Component)
393
- }
394
-
395
- createVirtualNode(_virtualName: string): EmptyBackendElement {
396
- return new EmptyBackendElement(EmptyBackendElementType.VirtualNode)
397
- }
398
- }
@@ -1,19 +1,9 @@
1
- /* eslint-disable class-methods-use-this */
1
+ import { type Element as GlassEaselElement } from '../element'
2
+ import { type EventBubbleStatus, type EventOptions, type MutLevel } from '../event'
3
+ import { type BackendMode } from './shared'
4
+ import type * as suggestedBackend from './suggested_backend_protocol'
2
5
 
3
- import { EventOptions, EventBubbleStatus, MutLevel } from '../event'
4
- import { safeCallback } from '../func_arr'
5
- import {
6
- BackendMode,
7
- BoundingClientRect,
8
- ScrollOffset,
9
- Observer,
10
- MediaQueryStatus,
11
- IntersectionStatus,
12
- } from './mode'
13
- import { Element as GlassEaselElement } from '../element'
14
- import * as suggestedBackend from './suggested_backend_protocol'
15
-
16
- export interface Context extends Partial<suggestedBackend.Context> {
6
+ export interface Context extends Partial<suggestedBackend.Context<Context>> {
17
7
  mode: BackendMode.Composed
18
8
  destroy(): void
19
9
  getWindowWidth(): number
@@ -30,21 +20,17 @@ export interface Context extends Partial<suggestedBackend.Context> {
30
20
  createFragment(): Element
31
21
  onEvent(
32
22
  listener: (
33
- target: unknown,
23
+ target: GlassEaselElement,
34
24
  type: string,
35
25
  detail: unknown,
36
26
  options: EventOptions,
37
- ) => EventBubbleStatus,
27
+ ) => EventBubbleStatus | void,
38
28
  ): void
39
- createMediaQueryObserver(
40
- status: MediaQueryStatus,
41
- listener: (res: { matches: boolean }) => void,
42
- ): Observer
43
29
  }
44
30
 
45
- export interface Element extends Partial<suggestedBackend.Element> {
31
+ export interface Element extends Partial<suggestedBackend.Element<Element>> {
46
32
  release(): void
47
- associateValue(v: unknown): void
33
+ associateValue(v: GlassEaselElement): void
48
34
  appendChild(child: Element): void
49
35
  removeChild(child: Element, index?: number): void
50
36
  insertBefore(child: Element, before: Element, index?: number): void
@@ -53,7 +39,7 @@ export interface Element extends Partial<suggestedBackend.Element> {
53
39
  spliceAppend(list: Element): void
54
40
  spliceRemove(before: Element, deleteCount: number): void
55
41
  setId(id: string): void
56
- setStyleScope(styleScope: number, hostStyleScope?: number): void
42
+ setStyleScope(styleScope: number, extraStyleScope?: number, hostStyleScope?: number): void
57
43
  setStyle(styleText: string): void
58
44
  addClass(elementClass: string, styleScope?: number): void
59
45
  removeClass(elementClass: string, styleScope?: number): void
@@ -61,246 +47,6 @@ export interface Element extends Partial<suggestedBackend.Element> {
61
47
  setAttribute(name: string, value: unknown): void
62
48
  removeAttribute(name: string): void
63
49
  setText(content: string): void
64
- getBoundingClientRect(cb: (res: BoundingClientRect) => void): void
65
- getScrollOffset(cb: (res: ScrollOffset) => void): void
66
50
  setModelBindingStat(attributeName: string, listener: ((newValue: unknown) => void) | null): void
67
51
  setListenerStats(type: string, capture: boolean, mutLevel: MutLevel): void
68
- createIntersectionObserver(
69
- relativeElement: Element | null,
70
- relativeElementMargin: string,
71
- thresholds: number[],
72
- listener: (res: IntersectionStatus) => void,
73
- ): Observer
74
- getContext(cb: (res: unknown) => void): void
75
- }
76
-
77
- /** An empty backend implementation */
78
- export class EmptyComposedBackendContext implements Context {
79
- mode: BackendMode.Composed = BackendMode.Composed
80
- private _$styleSheetIdInc = 1
81
- private _$renderCallbacks: ((err: Error) => void)[] | null = null
82
- private _$rootNode: EmptyComposedBackendElement = new EmptyComposedBackendElement()
83
-
84
- destroy(): void {
85
- // empty
86
- }
87
-
88
- getWindowWidth(): number {
89
- return 1
90
- }
91
-
92
- getWindowHeight(): number {
93
- return 1
94
- }
95
-
96
- getDevicePixelRatio(): number {
97
- return 1
98
- }
99
-
100
- getTheme(): string {
101
- return 'light'
102
- }
103
-
104
- registerStyleSheetContent(_path: string, _content: unknown): void {
105
- // empty
106
- }
107
-
108
- appendStyleSheetPath(_path: string, _styleScope?: number): number {
109
- const id = this._$styleSheetIdInc
110
- this._$styleSheetIdInc += 1
111
- return id
112
- }
113
-
114
- disableStyleSheet(_index: number): void {
115
- // empty
116
- }
117
-
118
- render(cb: (err: Error | null) => void): void {
119
- if (this._$renderCallbacks) {
120
- this._$renderCallbacks.push(cb)
121
- } else {
122
- const callbacks = (this._$renderCallbacks = [cb])
123
- setTimeout(() => {
124
- this._$renderCallbacks = null
125
- callbacks.forEach((cb) => {
126
- safeCallback('Render Callback', cb, this, [null])
127
- })
128
- }, 16)
129
- }
130
- }
131
-
132
- getRootNode(): EmptyComposedBackendElement {
133
- return this._$rootNode
134
- }
135
-
136
- createElement(_tagName: string, _stylingName: string): EmptyComposedBackendElement {
137
- return new EmptyComposedBackendElement()
138
- }
139
-
140
- createTextNode(_tagName: string): EmptyComposedBackendElement {
141
- return new EmptyComposedBackendElement()
142
- }
143
-
144
- createFragment(): EmptyComposedBackendElement {
145
- return new EmptyComposedBackendElement()
146
- }
147
-
148
- onEvent(
149
- _listener: (
150
- target: GlassEaselElement,
151
- type: string,
152
- detail: unknown,
153
- options: EventOptions,
154
- ) => EventBubbleStatus,
155
- ): void {
156
- // empty
157
- }
158
-
159
- createMediaQueryObserver(
160
- _status: MediaQueryStatus,
161
- _listener: (res: { matches: boolean }) => void,
162
- ): Observer {
163
- return {
164
- disconnect: () => {
165
- /* empty */
166
- },
167
- }
168
- }
169
- }
170
-
171
- /** An element for empty backend implementation */
172
- export class EmptyComposedBackendElement implements Element {
173
- release(): void {
174
- // empty
175
- }
176
-
177
- associateValue(_v: unknown): void {
178
- // empty
179
- }
180
-
181
- appendChild(_child: EmptyComposedBackendElement): void {
182
- // empty
183
- }
184
-
185
- removeChild(_child: EmptyComposedBackendElement, _index?: number): void {
186
- // empty
187
- }
188
-
189
- insertBefore(
190
- _child: EmptyComposedBackendElement,
191
- _before: EmptyComposedBackendElement,
192
- _index?: number,
193
- ): void {
194
- // empty
195
- }
196
-
197
- replaceChild(
198
- _child: EmptyComposedBackendElement,
199
- _oldChild: EmptyComposedBackendElement,
200
- _index?: number,
201
- ): void {
202
- // empty
203
- }
204
-
205
- spliceBefore(
206
- _before: EmptyComposedBackendElement,
207
- _deleteCount: number,
208
- _list: EmptyComposedBackendElement,
209
- ): void {
210
- // empty
211
- }
212
-
213
- spliceAppend(_list: EmptyComposedBackendElement): void {
214
- // empty
215
- }
216
-
217
- spliceRemove(_before: EmptyComposedBackendElement, _deleteCount: number): void {
218
- // empty
219
- }
220
-
221
- setId(_id: string): void {
222
- // empty
223
- }
224
-
225
- setStyleScope(_styleScope: number): void {
226
- // empty
227
- }
228
-
229
- setStyle(_styleText: string): void {
230
- // empty
231
- }
232
-
233
- addClass(_elementClass: string, _styleScope?: number): void {
234
- // empty
235
- }
236
-
237
- removeClass(_elementClass: string, _styleScope?: number): void {
238
- // empty
239
- }
240
-
241
- clearClasses(): void {
242
- // empty
243
- }
244
-
245
- setAttribute(_name: string, _value: unknown): void {
246
- // empty
247
- }
248
-
249
- removeAttribute(_name: string): void {
250
- // empty
251
- }
252
-
253
- setText(_content: string): void {
254
- // empty
255
- }
256
-
257
- getBoundingClientRect(cb: (res: BoundingClientRect) => void): void {
258
- setTimeout(() => {
259
- cb({
260
- left: 0,
261
- top: 0,
262
- width: 0,
263
- height: 0,
264
- })
265
- }, 0)
266
- }
267
-
268
- getScrollOffset(cb: (res: ScrollOffset) => void): void {
269
- setTimeout(() => {
270
- cb({
271
- scrollLeft: 0,
272
- scrollTop: 0,
273
- scrollWidth: 0,
274
- scrollHeight: 0,
275
- })
276
- }, 0)
277
- }
278
-
279
- setListenerStats(_type: string, _capture: boolean, _mutLevel: MutLevel): void {
280
- // empty
281
- }
282
-
283
- setModelBindingStat(
284
- _attributeName: string,
285
- _listener: ((newValue: unknown) => void) | null,
286
- ): void {
287
- // empty
288
- }
289
-
290
- createIntersectionObserver(
291
- _relativeElement: EmptyComposedBackendElement | null,
292
- _relativeElementMargin: string,
293
- _thresholds: number[],
294
- _listener: (res: IntersectionStatus) => void,
295
- ): Observer {
296
- return {
297
- disconnect: () => {
298
- /* empty */
299
- },
300
- }
301
- }
302
-
303
- getContext(cb: (res: unknown) => void): void {
304
- cb(null)
305
- }
306
52
  }