@dooboostore/simple-web-component 1.0.47 → 1.0.49

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 (233) hide show
  1. package/README.md +223 -27
  2. package/dist/cjs/config/config.js +1 -1
  3. package/dist/cjs/config/config.js.map +2 -2
  4. package/dist/cjs/decorators/addEventListener.js +412 -16
  5. package/dist/cjs/decorators/addEventListener.js.map +3 -3
  6. package/dist/cjs/decorators/applyAttribute.js +25 -0
  7. package/dist/cjs/decorators/applyAttribute.js.map +2 -2
  8. package/dist/cjs/decorators/applyClass.js +49 -18
  9. package/dist/cjs/decorators/applyClass.js.map +3 -3
  10. package/dist/cjs/decorators/applyNode.js +67 -1
  11. package/dist/cjs/decorators/applyNode.js.map +3 -3
  12. package/dist/cjs/decorators/applyProperty.js +101 -3
  13. package/dist/cjs/decorators/applyProperty.js.map +2 -2
  14. package/dist/cjs/decorators/applyStyle.js +36 -5
  15. package/dist/cjs/decorators/applyStyle.js.map +2 -2
  16. package/dist/cjs/decorators/changedAttribute.js +39 -0
  17. package/dist/cjs/decorators/changedAttribute.js.map +2 -2
  18. package/dist/cjs/decorators/elementDefine.js +244 -225
  19. package/dist/cjs/decorators/elementDefine.js.map +3 -3
  20. package/dist/cjs/decorators/emitCustomEvent.js +55 -0
  21. package/dist/cjs/decorators/emitCustomEvent.js.map +2 -2
  22. package/dist/cjs/decorators/index.js +5 -1
  23. package/dist/cjs/decorators/index.js.map +2 -2
  24. package/dist/cjs/decorators/intersectionObserver.js +209 -0
  25. package/dist/cjs/decorators/intersectionObserver.js.map +7 -0
  26. package/dist/cjs/decorators/mutationObserver.js +244 -0
  27. package/dist/cjs/decorators/mutationObserver.js.map +7 -0
  28. package/dist/cjs/decorators/query.js +129 -102
  29. package/dist/cjs/decorators/query.js.map +2 -2
  30. package/dist/cjs/decorators/resizeObserver.js +191 -0
  31. package/dist/cjs/decorators/resizeObserver.js.map +7 -0
  32. package/dist/cjs/decorators/setInterval.js +82 -0
  33. package/dist/cjs/decorators/setInterval.js.map +7 -0
  34. package/dist/cjs/decorators/setTimeout.js +82 -0
  35. package/dist/cjs/decorators/setTimeout.js.map +7 -0
  36. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js +9 -0
  37. package/dist/cjs/decorators/subscribeSwcAppMessageWhileConnected.js.map +2 -2
  38. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js +9 -0
  39. package/dist/cjs/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +2 -2
  40. package/dist/cjs/examples/RxJSOperatorsExample.js +285 -0
  41. package/dist/cjs/examples/RxJSOperatorsExample.js.map +7 -0
  42. package/dist/cjs/types/index.js.map +1 -1
  43. package/dist/esm/config/config.js +1 -1
  44. package/dist/esm/config/config.js.map +2 -2
  45. package/dist/esm/decorators/addEventListener.js +413 -16
  46. package/dist/esm/decorators/addEventListener.js.map +3 -3
  47. package/dist/esm/decorators/applyAttribute.js +25 -0
  48. package/dist/esm/decorators/applyAttribute.js.map +2 -2
  49. package/dist/esm/decorators/applyClass.js +49 -18
  50. package/dist/esm/decorators/applyClass.js.map +3 -3
  51. package/dist/esm/decorators/applyNode.js +67 -1
  52. package/dist/esm/decorators/applyNode.js.map +3 -3
  53. package/dist/esm/decorators/applyProperty.js +101 -3
  54. package/dist/esm/decorators/applyProperty.js.map +2 -2
  55. package/dist/esm/decorators/applyStyle.js +36 -5
  56. package/dist/esm/decorators/applyStyle.js.map +2 -2
  57. package/dist/esm/decorators/changedAttribute.js +40 -0
  58. package/dist/esm/decorators/changedAttribute.js.map +2 -2
  59. package/dist/esm/decorators/elementDefine.js +249 -230
  60. package/dist/esm/decorators/elementDefine.js.map +3 -3
  61. package/dist/esm/decorators/emitCustomEvent.js +55 -0
  62. package/dist/esm/decorators/emitCustomEvent.js.map +2 -2
  63. package/dist/esm/decorators/index.js +5 -1
  64. package/dist/esm/decorators/index.js.map +2 -2
  65. package/dist/esm/decorators/intersectionObserver.js +191 -0
  66. package/dist/esm/decorators/intersectionObserver.js.map +7 -0
  67. package/dist/esm/decorators/mutationObserver.js +226 -0
  68. package/dist/esm/decorators/mutationObserver.js.map +7 -0
  69. package/dist/esm/decorators/query.js +129 -102
  70. package/dist/esm/decorators/query.js.map +2 -2
  71. package/dist/esm/decorators/resizeObserver.js +173 -0
  72. package/dist/esm/decorators/resizeObserver.js.map +7 -0
  73. package/dist/esm/decorators/setInterval.js +64 -0
  74. package/dist/esm/decorators/setInterval.js.map +7 -0
  75. package/dist/esm/decorators/setTimeout.js +64 -0
  76. package/dist/esm/decorators/setTimeout.js.map +7 -0
  77. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js +9 -0
  78. package/dist/esm/decorators/subscribeSwcAppMessageWhileConnected.js.map +2 -2
  79. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js +9 -0
  80. package/dist/esm/decorators/subscribeSwcAppRouteChangeWhileConnected.js.map +2 -2
  81. package/dist/esm/examples/RxJSOperatorsExample.js +266 -0
  82. package/dist/esm/examples/RxJSOperatorsExample.js.map +7 -0
  83. package/dist/esm/types/index.js.map +1 -1
  84. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +2413 -889
  85. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  86. package/dist/types/config/config.d.ts.map +1 -1
  87. package/dist/types/decorators/addEventListener.d.ts +93 -23
  88. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  89. package/dist/types/decorators/applyAttribute.d.ts +22 -34
  90. package/dist/types/decorators/applyAttribute.d.ts.map +1 -1
  91. package/dist/types/decorators/applyClass.d.ts +34 -34
  92. package/dist/types/decorators/applyClass.d.ts.map +1 -1
  93. package/dist/types/decorators/applyNode.d.ts +30 -20
  94. package/dist/types/decorators/applyNode.d.ts.map +1 -1
  95. package/dist/types/decorators/applyProperty.d.ts +57 -34
  96. package/dist/types/decorators/applyProperty.d.ts.map +1 -1
  97. package/dist/types/decorators/applyStyle.d.ts +25 -12
  98. package/dist/types/decorators/applyStyle.d.ts.map +1 -1
  99. package/dist/types/decorators/changedAttribute.d.ts +11 -0
  100. package/dist/types/decorators/changedAttribute.d.ts.map +1 -1
  101. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  102. package/dist/types/decorators/emitCustomEvent.d.ts +28 -4
  103. package/dist/types/decorators/emitCustomEvent.d.ts.map +1 -1
  104. package/dist/types/decorators/index.d.ts +5 -1
  105. package/dist/types/decorators/index.d.ts.map +1 -1
  106. package/dist/types/decorators/intersectionObserver.d.ts +49 -0
  107. package/dist/types/decorators/intersectionObserver.d.ts.map +1 -0
  108. package/dist/types/decorators/mutationObserver.d.ts +46 -0
  109. package/dist/types/decorators/mutationObserver.d.ts.map +1 -0
  110. package/dist/types/decorators/query.d.ts +63 -8
  111. package/dist/types/decorators/query.d.ts.map +1 -1
  112. package/dist/types/decorators/resizeObserver.d.ts +48 -0
  113. package/dist/types/decorators/resizeObserver.d.ts.map +1 -0
  114. package/dist/types/decorators/setInterval.d.ts +29 -0
  115. package/dist/types/decorators/setInterval.d.ts.map +1 -0
  116. package/dist/types/decorators/setTimeout.d.ts +29 -0
  117. package/dist/types/decorators/setTimeout.d.ts.map +1 -0
  118. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts +7 -1
  119. package/dist/types/decorators/subscribeSwcAppMessageWhileConnected.d.ts.map +1 -1
  120. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts +6 -0
  121. package/dist/types/decorators/subscribeSwcAppRouteChangeWhileConnected.d.ts.map +1 -1
  122. package/dist/types/examples/RxJSOperatorsExample.d.ts +94 -0
  123. package/dist/types/examples/RxJSOperatorsExample.d.ts.map +1 -0
  124. package/dist/types/types/index.d.ts +104 -0
  125. package/dist/types/types/index.d.ts.map +1 -1
  126. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +2413 -889
  127. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  128. package/package.json +8 -6
  129. package/src/config/config.ts +1 -1
  130. package/src/decorators/addEventListener.ts +426 -23
  131. package/src/decorators/applyAttribute.ts +50 -36
  132. package/src/decorators/applyClass.ts +76 -26
  133. package/src/decorators/applyNode.ts +114 -36
  134. package/src/decorators/applyProperty.ts +152 -40
  135. package/src/decorators/applyStyle.ts +64 -17
  136. package/src/decorators/changedAttribute.ts +46 -0
  137. package/src/decorators/elementDefine.ts +301 -317
  138. package/src/decorators/emitCustomEvent.ts +73 -5
  139. package/src/decorators/index.ts +5 -1
  140. package/src/decorators/intersectionObserver.ts +259 -0
  141. package/src/decorators/mutationObserver.ts +304 -0
  142. package/src/decorators/query.ts +182 -117
  143. package/src/decorators/resizeObserver.ts +235 -0
  144. package/src/decorators/setInterval.ts +80 -0
  145. package/src/decorators/setTimeout.ts +80 -0
  146. package/src/decorators/subscribeSwcAppMessageWhileConnected.ts +17 -0
  147. package/src/decorators/subscribeSwcAppRouteChangeWhileConnected.ts +19 -0
  148. package/src/examples/RxJSOperatorsExample.ts +279 -0
  149. package/src/types/index.ts +141 -0
  150. package/dist/cjs/decorators/queryAll.js +0 -181
  151. package/dist/cjs/decorators/queryAll.js.map +0 -7
  152. package/dist/cjs/elements/tt/SwcAppMixin.js +0 -1
  153. package/dist/cjs/elements/tt/SwcAppMixin.js.map +0 -7
  154. package/dist/cjs/elements/tt/SwcAsync.js +0 -1
  155. package/dist/cjs/elements/tt/SwcAsync.js.map +0 -7
  156. package/dist/cjs/elements/tt/SwcAsyncTemplate.js +0 -1
  157. package/dist/cjs/elements/tt/SwcAsyncTemplate.js.map +0 -7
  158. package/dist/cjs/elements/tt/SwcChoose.js +0 -1
  159. package/dist/cjs/elements/tt/SwcChoose.js.map +0 -7
  160. package/dist/cjs/elements/tt/SwcChooseTemplate.js +0 -1
  161. package/dist/cjs/elements/tt/SwcChooseTemplate.js.map +0 -7
  162. package/dist/cjs/elements/tt/SwcIf.js +0 -1
  163. package/dist/cjs/elements/tt/SwcIf.js.map +0 -7
  164. package/dist/cjs/elements/tt/SwcIfTemplate.js +0 -1
  165. package/dist/cjs/elements/tt/SwcIfTemplate.js.map +0 -7
  166. package/dist/cjs/elements/tt/SwcLoop.js +0 -1
  167. package/dist/cjs/elements/tt/SwcLoop.js.map +0 -7
  168. package/dist/cjs/elements/tt/SwcLoopTemplate.js +0 -1
  169. package/dist/cjs/elements/tt/SwcLoopTemplate.js.map +0 -7
  170. package/dist/cjs/elements/tt/SwcSubTemplates.js +0 -1
  171. package/dist/cjs/elements/tt/SwcSubTemplates.js.map +0 -7
  172. package/dist/cjs/elements/tt/register.js +0 -1
  173. package/dist/cjs/elements/tt/register.js.map +0 -7
  174. package/dist/esm/decorators/queryAll.js +0 -162
  175. package/dist/esm/decorators/queryAll.js.map +0 -7
  176. package/dist/esm/elements/tt/SwcAppMixin.js +0 -1
  177. package/dist/esm/elements/tt/SwcAppMixin.js.map +0 -7
  178. package/dist/esm/elements/tt/SwcAsync.js +0 -1
  179. package/dist/esm/elements/tt/SwcAsync.js.map +0 -7
  180. package/dist/esm/elements/tt/SwcAsyncTemplate.js +0 -1
  181. package/dist/esm/elements/tt/SwcAsyncTemplate.js.map +0 -7
  182. package/dist/esm/elements/tt/SwcChoose.js +0 -1
  183. package/dist/esm/elements/tt/SwcChoose.js.map +0 -7
  184. package/dist/esm/elements/tt/SwcChooseTemplate.js +0 -1
  185. package/dist/esm/elements/tt/SwcChooseTemplate.js.map +0 -7
  186. package/dist/esm/elements/tt/SwcIf.js +0 -1
  187. package/dist/esm/elements/tt/SwcIf.js.map +0 -7
  188. package/dist/esm/elements/tt/SwcIfTemplate.js +0 -1
  189. package/dist/esm/elements/tt/SwcIfTemplate.js.map +0 -7
  190. package/dist/esm/elements/tt/SwcLoop.js +0 -1
  191. package/dist/esm/elements/tt/SwcLoop.js.map +0 -7
  192. package/dist/esm/elements/tt/SwcLoopTemplate.js +0 -1
  193. package/dist/esm/elements/tt/SwcLoopTemplate.js.map +0 -7
  194. package/dist/esm/elements/tt/SwcSubTemplates.js +0 -1
  195. package/dist/esm/elements/tt/SwcSubTemplates.js.map +0 -7
  196. package/dist/esm/elements/tt/register.js +0 -1
  197. package/dist/esm/elements/tt/register.js.map +0 -7
  198. package/dist/types/decorators/queryAll.d.ts +0 -22
  199. package/dist/types/decorators/queryAll.d.ts.map +0 -1
  200. package/dist/types/elements/tt/SwcAppMixin.d.ts +0 -1
  201. package/dist/types/elements/tt/SwcAppMixin.d.ts.map +0 -1
  202. package/dist/types/elements/tt/SwcAsync.d.ts +0 -1
  203. package/dist/types/elements/tt/SwcAsync.d.ts.map +0 -1
  204. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts +0 -1
  205. package/dist/types/elements/tt/SwcAsyncTemplate.d.ts.map +0 -1
  206. package/dist/types/elements/tt/SwcChoose.d.ts +0 -1
  207. package/dist/types/elements/tt/SwcChoose.d.ts.map +0 -1
  208. package/dist/types/elements/tt/SwcChooseTemplate.d.ts +0 -1
  209. package/dist/types/elements/tt/SwcChooseTemplate.d.ts.map +0 -1
  210. package/dist/types/elements/tt/SwcIf.d.ts +0 -1
  211. package/dist/types/elements/tt/SwcIf.d.ts.map +0 -1
  212. package/dist/types/elements/tt/SwcIfTemplate.d.ts +0 -1
  213. package/dist/types/elements/tt/SwcIfTemplate.d.ts.map +0 -1
  214. package/dist/types/elements/tt/SwcLoop.d.ts +0 -1
  215. package/dist/types/elements/tt/SwcLoop.d.ts.map +0 -1
  216. package/dist/types/elements/tt/SwcLoopTemplate.d.ts +0 -1
  217. package/dist/types/elements/tt/SwcLoopTemplate.d.ts.map +0 -1
  218. package/dist/types/elements/tt/SwcSubTemplates.d.ts +0 -1
  219. package/dist/types/elements/tt/SwcSubTemplates.d.ts.map +0 -1
  220. package/dist/types/elements/tt/register.d.ts +0 -1
  221. package/dist/types/elements/tt/register.d.ts.map +0 -1
  222. package/src/decorators/queryAll.ts +0 -186
  223. package/src/elements/tt/SwcAppMixin.ts +0 -13
  224. package/src/elements/tt/SwcAsync.ts +0 -139
  225. package/src/elements/tt/SwcAsyncTemplate.ts +0 -126
  226. package/src/elements/tt/SwcChoose.ts +0 -182
  227. package/src/elements/tt/SwcChooseTemplate.ts +0 -229
  228. package/src/elements/tt/SwcIf.ts +0 -145
  229. package/src/elements/tt/SwcIfTemplate.ts +0 -158
  230. package/src/elements/tt/SwcLoop.ts +0 -222
  231. package/src/elements/tt/SwcLoopTemplate.ts +0 -255
  232. package/src/elements/tt/SwcSubTemplates.ts +0 -6
  233. package/src/elements/tt/register.ts +0 -720
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Example: Using RxJS-like Operators with @addEventListener
3
+ *
4
+ * This example demonstrates how to use debounceTime, throttleTime, and distinctUntilChanged
5
+ * operators with the @addEventListener decorator.
6
+ */
7
+
8
+ import { elementDefine, addEventListener } from '../decorators';
9
+
10
+ /**
11
+ * Example 1: Search Component with Debounce
12
+ *
13
+ * Waits 1 second after user stops typing before performing search.
14
+ * Prevents excessive API calls during typing.
15
+ */
16
+ @elementDefine('search-component')
17
+ export class SearchComponent extends HTMLElement {
18
+ private results: any[] = [];
19
+
20
+ @addEventListener('$this', 'input', { debounceTime: 1000 })
21
+ async onSearchInput(event: Event) {
22
+ const input = event.target as HTMLInputElement;
23
+ const query = input.value.trim();
24
+
25
+ if (query.length > 2) {
26
+ try {
27
+ // Simulate API call
28
+ const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`);
29
+ this.results = await response.json();
30
+ this.renderResults();
31
+ } catch (error) {
32
+ console.error('Search failed:', error);
33
+ }
34
+ } else {
35
+ this.results = [];
36
+ this.renderResults();
37
+ }
38
+ }
39
+
40
+ private renderResults() {
41
+ // Render search results
42
+ console.log('Rendering results:', this.results);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Example 2: Window Resize Handler with Throttle
48
+ *
49
+ * Recalculates layout at most 4 times per second (every 250ms).
50
+ * Prevents performance issues from excessive resize calculations.
51
+ */
52
+ @elementDefine('responsive-layout')
53
+ export class ResponsiveLayout extends HTMLElement {
54
+ @addEventListener('$window', 'resize', { throttleTime: 250 })
55
+ onWindowResize(event: Event) {
56
+ const width = window.innerWidth;
57
+ const height = window.innerHeight;
58
+
59
+ console.log(`Window resized to: ${width}x${height}`);
60
+ this.updateLayout(width, height);
61
+ }
62
+
63
+ private updateLayout(width: number, height: number) {
64
+ // Update layout based on new dimensions
65
+ if (width < 768) {
66
+ this.classList.add('mobile');
67
+ this.classList.remove('desktop');
68
+ } else {
69
+ this.classList.add('desktop');
70
+ this.classList.remove('mobile');
71
+ }
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Example 3: Form Input with Debounce + Distinct
77
+ *
78
+ * Validates field only when:
79
+ * 1. User stops typing (debounce 300ms)
80
+ * 2. AND the value actually changed (distinct)
81
+ */
82
+ @elementDefine('form-input')
83
+ export class FormInput extends HTMLElement {
84
+ @addEventListener('$this', 'input', {
85
+ debounceTime: 300,
86
+ distinctUntilChanged: true
87
+ })
88
+ onFormInput(event: Event) {
89
+ const input = event.target as HTMLInputElement;
90
+ const fieldName = input.name;
91
+ const value = input.value;
92
+
93
+ console.log(`Validating ${fieldName}: ${value}`);
94
+ this.validateField(fieldName, value);
95
+ }
96
+
97
+ private validateField(name: string, value: string) {
98
+ // Perform validation
99
+ const isValid = value.length > 0;
100
+ console.log(`Field ${name} is ${isValid ? 'valid' : 'invalid'}`);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Example 4: Scroll Event with Throttle
106
+ *
107
+ * Checks if user scrolled to bottom at most 10 times per second.
108
+ * Prevents excessive "load more" API calls.
109
+ */
110
+ @elementDefine('infinite-scroll')
111
+ export class InfiniteScroll extends HTMLElement {
112
+ private isLoading = false;
113
+
114
+ @addEventListener('$window', 'scroll', { throttleTime: 100 })
115
+ onScroll(event: Event) {
116
+ if (this.isLoading) return;
117
+
118
+ if (this.isNearBottom()) {
119
+ console.log('Near bottom, loading more content...');
120
+ this.loadMoreContent();
121
+ }
122
+ }
123
+
124
+ private isNearBottom(): boolean {
125
+ const scrollTop = window.scrollY;
126
+ const windowHeight = window.innerHeight;
127
+ const documentHeight = document.documentElement.scrollHeight;
128
+
129
+ return scrollTop + windowHeight >= documentHeight - 500;
130
+ }
131
+
132
+ private async loadMoreContent() {
133
+ this.isLoading = true;
134
+ try {
135
+ // Simulate API call
136
+ await new Promise(resolve => setTimeout(resolve, 1000));
137
+ console.log('Content loaded');
138
+ } finally {
139
+ this.isLoading = false;
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Example 5: Custom Comparison with Distinct
146
+ *
147
+ * Only fires when the input value length changes.
148
+ * Ignores changes that don't affect the length.
149
+ */
150
+ @elementDefine('length-tracker')
151
+ export class LengthTracker extends HTMLElement {
152
+ @addEventListener('$this', 'input', {
153
+ distinctUntilChanged: (prev: any, curr: any) => {
154
+ // Only consider it changed if the length differs
155
+ return prev?.length === curr?.length;
156
+ }
157
+ })
158
+ onInputChange(event: Event) {
159
+ const input = event.target as HTMLInputElement;
160
+ const length = input.value.length;
161
+
162
+ console.log(`Input length changed to: ${length}`);
163
+ this.updateLengthDisplay(length);
164
+ }
165
+
166
+ private updateLengthDisplay(length: number) {
167
+ // Update UI with new length
168
+ const display = this.querySelector('.length-display');
169
+ if (display) {
170
+ display.textContent = `${length} characters`;
171
+ }
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Example 6: Complex Scenario - Auto-save with Multiple Operators
177
+ *
178
+ * Combines debounce and distinct for intelligent auto-save:
179
+ * - Waits 2 seconds after user stops typing
180
+ * - Only saves if content actually changed
181
+ * - Prevents unnecessary save operations
182
+ */
183
+ @elementDefine('auto-save-editor')
184
+ export class AutoSaveEditor extends HTMLElement {
185
+ private lastSavedContent = '';
186
+
187
+ @addEventListener('$this', 'input', {
188
+ debounceTime: 2000,
189
+ distinctUntilChanged: (prev: any, curr: any) => {
190
+ // Consider changed if the content is different
191
+ return prev === curr;
192
+ }
193
+ })
194
+ async onContentChange(event: Event) {
195
+ const textarea = event.target as HTMLTextAreaElement;
196
+ const content = textarea.value;
197
+
198
+ if (content !== this.lastSavedContent) {
199
+ console.log('Auto-saving content...');
200
+ await this.saveContent(content);
201
+ this.lastSavedContent = content;
202
+ }
203
+ }
204
+
205
+ private async saveContent(content: string) {
206
+ try {
207
+ // Simulate API call
208
+ const response = await fetch('/api/save', {
209
+ method: 'POST',
210
+ headers: { 'Content-Type': 'application/json' },
211
+ body: JSON.stringify({ content })
212
+ });
213
+
214
+ if (response.ok) {
215
+ console.log('Content saved successfully');
216
+ this.showSaveIndicator();
217
+ }
218
+ } catch (error) {
219
+ console.error('Save failed:', error);
220
+ }
221
+ }
222
+
223
+ private showSaveIndicator() {
224
+ const indicator = this.querySelector('.save-indicator');
225
+ if (indicator) {
226
+ indicator.classList.add('show');
227
+ setTimeout(() => indicator.classList.remove('show'), 2000);
228
+ }
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Example 7: Keyboard Shortcut Handler with Throttle
234
+ *
235
+ * Prevents rapid repeated execution of keyboard shortcuts.
236
+ */
237
+ @elementDefine('keyboard-handler')
238
+ export class KeyboardHandler extends HTMLElement {
239
+ @addEventListener('$document', 'keydown', {
240
+ throttleTime: 500,
241
+ filter: (event: KeyboardEvent) => {
242
+ // Only handle Ctrl+S or Cmd+S
243
+ return (event.ctrlKey || event.metaKey) && event.key === 's';
244
+ }
245
+ })
246
+ onSaveShortcut(event: KeyboardEvent) {
247
+ event.preventDefault();
248
+ console.log('Save shortcut triggered');
249
+ this.handleSave();
250
+ }
251
+
252
+ private handleSave() {
253
+ // Handle save operation
254
+ console.log('Saving...');
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Example 8: Mouse Move Tracking with Throttle
260
+ *
261
+ * Tracks mouse position at most 10 times per second.
262
+ * Useful for analytics or interactive features.
263
+ */
264
+ @elementDefine('mouse-tracker')
265
+ export class MouseTracker extends HTMLElement {
266
+ @addEventListener('$document', 'mousemove', { throttleTime: 100 })
267
+ onMouseMove(event: MouseEvent) {
268
+ const x = event.clientX;
269
+ const y = event.clientY;
270
+
271
+ // Update cursor position indicator
272
+ this.updateCursorPosition(x, y);
273
+ }
274
+
275
+ private updateCursorPosition(x: number, y: number) {
276
+ // Update UI with cursor position
277
+ console.log(`Cursor at: ${x}, ${y}`);
278
+ }
279
+ }
@@ -44,6 +44,11 @@ export type HostSet = {
44
44
 
45
45
  export type HelperHostSet = HelperSet & HostSet & {$this: any};
46
46
 
47
+ // 공통 셀렉터 함수 — 요소/노드를 직접 반환하는 함수 셀렉터 (query는 Node까지 반환 가능)
48
+ export type SwcFnSelector = (currentThis: any, helper: HelperHostSet) => Node | NodeList | Element | Element[] | null;
49
+ // 공통 셀렉터 — 문자열(CSS/특수) 또는 함수
50
+ export type SwcSelector = string | SwcFnSelector;
51
+
47
52
  export type SwcAppMessage<T = any> = {
48
53
  publisher?: any;
49
54
  data?: T;
@@ -71,4 +76,140 @@ export interface SwcElement {
71
76
  // createEaAttribute(id: string, attributeName: string): string
72
77
  // createEaEvent(id: string, eventName: string): string
73
78
  // createEaProperty(id: string, propertyName: string): string
79
+ }
80
+
81
+ // ─────────────────────────────────────────────────────────────────────────────
82
+ // ElementDefineLifeCycler
83
+ //
84
+ // 각 데코레이터 파일(addEventListener, mutationObserver, …)이 이 interface를
85
+ // 구현해 export 하고, elementDefine.ts는 cyclers 배열로 관리하며 위임만 한다.
86
+ //
87
+ // 시클러는 생성자에서 아무 인자도 받지 않는다. 상태는 인스턴스별로 관리해야 하므로,
88
+ // 각 라이프사이클 훅(onConnected 등)의 첫 번째 인자로 HelperHostSet 을 받아
89
+ // 그 안의 $this(현재 엘리먼트 인스턴스) / $w(window) 로 처리한다.
90
+ // elementDefine 은 elementDefine 시점에 시클러를 1회 생성하고 계속 재사용한다.
91
+ // 모든 메서드는 optional — 관심 있는 훅만 구현하면 된다.
92
+ // ─────────────────────────────────────────────────────────────────────────────
93
+
94
+ // ─────────────────────────────────────────────────────────────────────────────
95
+ // onConnected 반환 타입
96
+ //
97
+ // 각 cycler 가 "필요한 observer 정보"를 선언하면,
98
+ // elementDefine 이 수집해서 필요한 경우에만 observer 인스턴스를 생성한다.
99
+ // ─────────────────────────────────────────────────────────────────────────────
100
+
101
+ /** observer observe 대상 엔트리. delegate:true 이면 target 은 셀렉터 문자열이며, 실제 요소는 동적 추적으로 observe/unobserve 된다. */
102
+ export interface ObserverObserveTarget<TOptions> {
103
+ target: Element | ShadowRoot | string;
104
+ options?: TOptions;
105
+ delegate?: boolean;
106
+ /** delegate 동적 추적 시 observe/unobserve 를 실행할 루트(스코프). delegate:true 일 때만 의미 있다. */
107
+ delegateRoot?: SwcRootType;
108
+ }
109
+
110
+ /** MutationObserver observe 대상 하나. 동일 루트의 여러 대상은 같은 callback 을 공유한다. */
111
+ export interface MutationObserverSetEntry {
112
+ target: Element | ShadowRoot | string;
113
+ options?: MutationObserverInit;
114
+ delegate?: boolean;
115
+ delegateRoot?: SwcRootType;
116
+ callback: (mutations: MutationRecord[], observer: MutationObserver) => void;
117
+ }
118
+
119
+ /** observe 할 대상 목록 (엔트리별 콜백 포함). elementDefine 이 하나의 MutationObserver 로 모두 observe 한다. */
120
+ export type MutationObserverSet = MutationObserverSetEntry[];
121
+
122
+ /** ResizeObserver observe 대상 하나. 동일 셀렉터의 여러 대상은 같은 callback 을 공유한다. */
123
+ export interface ResizeObserverSetEntry {
124
+ target: Element | ShadowRoot | string;
125
+ options?: ResizeObserverOptions;
126
+ delegate?: boolean;
127
+ delegateRoot?: SwcRootType;
128
+ callback: (entries: ResizeObserverEntry[], observer: ResizeObserver) => void;
129
+ }
130
+
131
+ /** observe 할 대상 목록 (엔트리별 콜백 포함). elementDefine 이 하나의 ResizeObserver 로 모두 observe 한다. */
132
+ export type ResizeObserverSet = ResizeObserverSetEntry[];
133
+
134
+ /** IntersectionObserver observe 대상 하나. 같은 옵션 그룹의 여러 대상은 같은 callback 을 공유한다. */
135
+ export interface IntersectionObserverSetEntry {
136
+ target: Element | ShadowRoot | string;
137
+ delegate?: boolean;
138
+ delegateRoot?: SwcRootType;
139
+ callback: (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => void;
140
+ }
141
+
142
+ /** IntersectionObserver 그룹. observer 는 생성 시점에 옵션이 고정되므로 옵션별로 1개씩 생성된다. */
143
+ export interface IntersectionObserverGroup {
144
+ /** observer 생성 옵션 (threshold/rootMargin/root). 이 값이 같으면 같은 observer 를 공유한다. */
145
+ options: IntersectionObserverInit;
146
+ observeTargets: IntersectionObserverSetEntry[];
147
+ }
148
+
149
+ /** observe 할 옵션 그룹 목록. elementDefine 이 그룹마다 IntersectionObserver 를 생성한다. */
150
+ export type IntersectionObserverSet = IntersectionObserverGroup[];
151
+
152
+ /**
153
+ * onConnected 의 반환 타입.
154
+ * observer 가 필요 없는 cycler 는 undefined 를 반환해도 된다.
155
+ */
156
+ export interface OnConnectedResult {
157
+ mutationObserverSet?: MutationObserverSet;
158
+ resizeObserverSet?: ResizeObserverSet;
159
+ intersectionObserverSet?: IntersectionObserverSet;
160
+ }
161
+
162
+ /**
163
+ * 각 데코레이터 파일이 구현하는 라이프사이클 위임 interface.
164
+ *
165
+ * 구현체는 상태를 갖지 않고, 각 훅의 첫 번째 인자로 HelperHostSet 을 받는다.
166
+ * 관심 있는 훅만 구현하면 된다 (전부 optional).
167
+ *
168
+ * ```ts
169
+ * const eventCycler = new EventListenerLifeCycler();
170
+ * const cyclers: ElementDefineLifeCycler[] = [eventCycler, ...]; // elementDefine 시 1회 생성
171
+ *
172
+ * proto.connectedCallback = async function () {
173
+ * const helperHostSet = SwcUtils.getHelperAndHostSet(win, this);
174
+ * const results = await Promise.all(cyclers.map(c => c.onConnected?.(helperHostSet)));
175
+ * // results 에서 mutationObserverSet / resizeObserverSet 수집
176
+ * // → 필요한 경우에만 MutationObserver / ResizeObserver 생성
177
+ * };
178
+ * proto.disconnectedCallback = function () {
179
+ * for (const c of cyclers) c.onDisconnected?.(helperHostSet);
180
+ * };
181
+ * ```
182
+ */
183
+ export interface ElementDefineLifeCycler {
184
+ /**
185
+ * connectedCallback 시 호출.
186
+ * observer 가 필요하면 OnConnectedResult 를 반환하고,
187
+ * 필요 없으면 void / undefined 를 반환한다.
188
+ * @param helperHostSet 현재 엘리먼트 인스턴스($this)를 포함한 컨텍스트
189
+ * @param resizeObserverSet 이전 시클러가 반환한 resize observer set (mutation 시클러가 주입받아 사용)
190
+ */
191
+ onConnected?(helperHostSet: HelperHostSet, resizeObserverSet?: ResizeObserverSet): OnConnectedResult | void | Promise<OnConnectedResult | void>;
192
+
193
+ /** disconnectedCallback 시 호출. 등록한 리소스를 해제한다. */
194
+ onDisconnected?(helperHostSet: HelperHostSet): void;
195
+
196
+ /** adoptedCallback 시 호출 (선택적). */
197
+ onAdopted?(helperHostSet: HelperHostSet): void;
198
+
199
+ /**
200
+ * attributeChangedCallback 시 호출 (선택적).
201
+ * @param helperHostSet 현재 엘리먼트 인스턴스($this)를 포함한 컨텍스트
202
+ * @param name 변경된 attribute 이름
203
+ * @param oldVal 이전 값
204
+ * @param newVal 새 값 (ActionExpression 처리 후)
205
+ */
206
+ onAttributeChanged?(helperHostSet: HelperHostSet, name: string, oldVal: string | null, newVal: any): void;
207
+
208
+ /**
209
+ * observedAttributes 에 포함해야 하는 attribute 이름 목록을 반환한다.
210
+ * elementDefine 이 define-time(constructor)에 호출해 수집한다.
211
+ * 관심 없으면 구현하지 않거나 빈 배열을 반환한다.
212
+ * @param target constructor 또는 element 인스턴스 (메타데이터 조회용)
213
+ */
214
+ getObservedAttributeNames?(target: any): string[];
74
215
  }
@@ -1,181 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
- var queryAll_exports = {};
19
- __export(queryAll_exports, {
20
- QUERY_ALL_METADATA_KEY: () => QUERY_ALL_METADATA_KEY,
21
- getQueryAllMetadata: () => getQueryAllMetadata,
22
- queryAll: () => queryAll
23
- });
24
- module.exports = __toCommonJS(queryAll_exports);
25
- var import_core = require("@dooboostore/core");
26
- var import_elementDefine = require("./elementDefine");
27
- var import_Utils = require("../utils/Utils");
28
- const QUERY_ALL_METADATA_KEY = Symbol.for("simple-web-component:query-all");
29
- function queryAll(selectorOrTarget, optionsOrPropertyKey, descriptor) {
30
- if (descriptor !== void 0 && (typeof optionsOrPropertyKey === "string" || typeof optionsOrPropertyKey === "symbol")) {
31
- throw new Error(`@queryAll decorator cannot be used on methods. (Method: ${String(optionsOrPropertyKey)})`);
32
- }
33
- if (typeof selectorOrTarget === "string" || typeof selectorOrTarget === "function") {
34
- return (targetObj, propertyKey, descriptor2) => {
35
- if (descriptor2 !== void 0) {
36
- throw new Error(`@queryAll decorator cannot be used on methods. (Method: ${String(propertyKey)})`);
37
- }
38
- const constructor = targetObj.constructor;
39
- let queries = import_core.ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);
40
- if (!queries) {
41
- queries = [];
42
- import_core.ReflectUtils.defineMetadata(QUERY_ALL_METADATA_KEY, queries, constructor);
43
- }
44
- queries.push({ propertyKey, selector: selectorOrTarget, options: optionsOrPropertyKey || {} });
45
- Object.defineProperty(targetObj, propertyKey, {
46
- get() {
47
- (0, import_elementDefine.ensureInit)(this);
48
- const config = (0, import_elementDefine.getElementConfig)(this);
49
- const win = config?.window || window;
50
- const hostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, this);
51
- let resolvedSelector;
52
- let resolvedElements = [];
53
- if (typeof selectorOrTarget === "function") {
54
- const result = selectorOrTarget(this, hostSet);
55
- if (result instanceof win.NodeList) {
56
- resolvedElements = Array.from(result).filter((el) => el instanceof win.HTMLElement);
57
- } else if (Array.isArray(result)) {
58
- resolvedElements = result.filter((el) => el instanceof win.HTMLElement);
59
- }
60
- } else {
61
- resolvedSelector = selectorOrTarget;
62
- const r = optionsOrPropertyKey?.root || "auto";
63
- const applyRoot = (t) => {
64
- if (!t)
65
- return [];
66
- const items = Array.isArray(t) ? t : [t];
67
- const results = [];
68
- items.forEach((it) => {
69
- if (!(it instanceof HTMLElement)) {
70
- results.push(it);
71
- return;
72
- }
73
- if (r === "auto")
74
- results.push(it.shadowRoot || it);
75
- else {
76
- if (r === "light" || r === "all")
77
- results.push(it);
78
- if ((r === "shadow" || r === "all") && it.shadowRoot)
79
- results.push(it.shadowRoot);
80
- }
81
- });
82
- return results;
83
- };
84
- if (resolvedSelector === "$hosts")
85
- resolvedElements = applyRoot(hostSet.$hosts).filter((el) => el instanceof HTMLElement);
86
- else if (resolvedSelector === "$appHosts")
87
- resolvedElements = applyRoot(hostSet.$appHosts).filter((el) => el instanceof HTMLElement);
88
- else if (resolvedSelector === "$host")
89
- resolvedElements = applyRoot(hostSet.$host).filter((el) => el instanceof HTMLElement);
90
- else if (resolvedSelector === "$parentHost")
91
- resolvedElements = applyRoot(hostSet.$parentHost).filter((el) => el instanceof HTMLElement);
92
- else if (resolvedSelector === "$appHost")
93
- resolvedElements = applyRoot(hostSet.$appHost).filter((el) => el instanceof HTMLElement);
94
- else if (resolvedSelector === "$firstHost")
95
- resolvedElements = applyRoot(hostSet.$firstHost).filter((el) => el instanceof HTMLElement);
96
- else if (resolvedSelector === "$lastHost")
97
- resolvedElements = applyRoot(hostSet.$lastHost).filter((el) => el instanceof HTMLElement);
98
- else if (resolvedSelector === "$firstAppHost")
99
- resolvedElements = applyRoot(hostSet.$firstAppHost).filter((el) => el instanceof HTMLElement);
100
- else if (resolvedSelector === "$lastAppHost")
101
- resolvedElements = applyRoot(hostSet.$lastAppHost).filter((el) => el instanceof HTMLElement);
102
- else if (resolvedSelector === "$window")
103
- return [win];
104
- else if (resolvedSelector === "$document")
105
- return [win.document];
106
- else if (resolvedSelector === "$this")
107
- resolvedElements = applyRoot(this).filter((el) => el instanceof HTMLElement);
108
- else {
109
- if (r === "shadow")
110
- resolvedElements = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];
111
- else if (r === "light")
112
- resolvedElements = Array.from(this.querySelectorAll(resolvedSelector));
113
- else if (r === "all") {
114
- const sNodes = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];
115
- const lNodes = Array.from(this.querySelectorAll(resolvedSelector));
116
- resolvedElements = [...sNodes, ...lNodes];
117
- } else
118
- resolvedElements = Array.from((this.shadowRoot || this).querySelectorAll(resolvedSelector));
119
- }
120
- }
121
- if (optionsOrPropertyKey?.filter) {
122
- resolvedElements = resolvedElements.filter((el) => {
123
- if (!(el instanceof win.HTMLElement))
124
- return true;
125
- return optionsOrPropertyKey.filter(el, { currentThis: this, helper: hostSet });
126
- });
127
- }
128
- return resolvedElements;
129
- },
130
- set(nv) {
131
- (0, import_elementDefine.ensureInit)(this);
132
- if (nv === null || nv === void 0 || Array.isArray(nv) && nv.length === 0) {
133
- const config = (0, import_elementDefine.getElementConfig)(this);
134
- const win = config?.window || window;
135
- const hostSet = import_Utils.SwcUtils.getHelperAndHostSet(win, this);
136
- if (typeof selectorOrTarget === "function") {
137
- const result = selectorOrTarget(this, hostSet);
138
- if (result instanceof win.NodeList) {
139
- Array.from(result).forEach((el) => {
140
- if (el instanceof win.Element)
141
- el.remove();
142
- });
143
- } else if (Array.isArray(result)) {
144
- result.forEach((el) => {
145
- if (el instanceof win.Element)
146
- el.remove();
147
- });
148
- }
149
- return;
150
- }
151
- const resolvedSelector = selectorOrTarget;
152
- if (resolvedSelector.startsWith("$") && resolvedSelector !== "$this")
153
- return;
154
- const r = optionsOrPropertyKey?.root || "auto";
155
- let targets = [];
156
- if (r === "shadow")
157
- targets = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];
158
- else if (r === "light")
159
- targets = Array.from(this.querySelectorAll(resolvedSelector));
160
- else if (r === "all") {
161
- const sNodes = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];
162
- const lNodes = Array.from(this.querySelectorAll(resolvedSelector));
163
- targets = [...sNodes, ...lNodes];
164
- } else {
165
- targets = Array.from((this.shadowRoot || this).querySelectorAll(resolvedSelector));
166
- }
167
- targets.forEach((t) => t.remove());
168
- }
169
- },
170
- enumerable: true,
171
- configurable: true
172
- });
173
- };
174
- }
175
- return queryAll("$this", selectorOrTarget);
176
- }
177
- const getQueryAllMetadata = (target) => {
178
- const constructor = target instanceof Function ? target : target.constructor;
179
- return import_core.ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);
180
- };
181
- //# sourceMappingURL=queryAll.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/decorators/queryAll.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core';\nimport { getElementConfig, ensureInit } from './elementDefine';\nimport { SwcUtils } from '../utils/Utils';\nimport { SwcQueryOptions, HelperHostSet } from '../types';\n\nexport interface QueryAllOptions extends SwcQueryOptions {\n /**\n * Filter function to determine whether to include the element.\n * If it returns false, the element is skipped.\n */\n filter?: (target: HTMLElement, meta: { currentThis: any, helper: HelperHostSet }) => boolean;\n}\n\nexport interface QueryAllMetadata {\n propertyKey: string | symbol;\n selector: string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null);\n options: QueryAllOptions;\n}\n\nexport const QUERY_ALL_METADATA_KEY = Symbol.for('simple-web-component:query-all');\n\nexport function queryAll(target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor): PropertyDescriptor | void;\nexport function queryAll(selector: string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null), options?: QueryAllOptions): PropertyDecorator;\nexport function queryAll(options?: QueryAllOptions): PropertyDecorator;\n/**\n * @queryAll decorator to inject a list of elements into a class property.\n * \n * Supports both string selectors and function-based selectors:\n * - String selector: @queryAll('.item')\n * - Function selector: @queryAll((currentThis, helper) => currentThis.shadowRoot?.querySelectorAll('.item'))\n * \n * Supports filtering:\n * - @queryAll('.item', { filter: (target, meta) => target.hasAttribute('active') })\n */\nexport function queryAll(selectorOrTarget?: string | ((currentThis: any, helper: HelperHostSet) => NodeList | Element | Element[] | null) | Object, optionsOrPropertyKey?: QueryAllOptions | string | symbol, descriptor?: PropertyDescriptor): any {\n // Bare decorator: @queryAll\n if (descriptor !== undefined && (typeof optionsOrPropertyKey === 'string' || typeof optionsOrPropertyKey === 'symbol')) {\n throw new Error(`@queryAll decorator cannot be used on methods. (Method: ${String(optionsOrPropertyKey)})`);\n }\n // With selector\n if (typeof selectorOrTarget === 'string' || typeof selectorOrTarget === 'function') {\n return (targetObj: Object, propertyKey: string | symbol, descriptor?: never): void => {\n if (descriptor !== undefined) {\n throw new Error(`@queryAll decorator cannot be used on methods. (Method: ${String(propertyKey)})`);\n }\n\n const constructor = targetObj.constructor;\n let queries = ReflectUtils.getMetadata<QueryAllMetadata[]>(QUERY_ALL_METADATA_KEY, constructor);\n if (!queries) {\n queries = [];\n ReflectUtils.defineMetadata(QUERY_ALL_METADATA_KEY, queries, constructor);\n }\n queries.push({ propertyKey, selector: selectorOrTarget as any, options: optionsOrPropertyKey as QueryAllOptions || {} });\n\n Object.defineProperty(targetObj, propertyKey, {\n get(this: HTMLElement) {\n ensureInit(this);\n const config = getElementConfig(this);\n const win = config?.window || window;\n const hostSet = SwcUtils.getHelperAndHostSet(win, this);\n \n // Resolve selector - can be string or function\n let resolvedSelector: string;\n let resolvedElements: HTMLElement[] = [];\n \n if (typeof selectorOrTarget === 'function') {\n const result = (selectorOrTarget as any)(this, hostSet);\n // If function returns NodeList or Element[], convert to array\n if (result instanceof win.NodeList) {\n resolvedElements = Array.from(result).filter(el => el instanceof win.HTMLElement) as HTMLElement[];\n } else if (Array.isArray(result)) {\n resolvedElements = result.filter(el => el instanceof win.HTMLElement) as HTMLElement[];\n }\n } else {\n resolvedSelector = selectorOrTarget;\n\n const r = (optionsOrPropertyKey as QueryAllOptions)?.root || 'auto';\n const applyRoot = (t: any): any[] => {\n if (!t) return [];\n const items = Array.isArray(t) ? t : [t];\n const results: any[] = [];\n items.forEach(it => {\n if (!(it instanceof HTMLElement)) {\n results.push(it);\n return;\n }\n if (r === 'auto') results.push(it.shadowRoot || it);\n else {\n if (r === 'light' || r === 'all') results.push(it);\n if ((r === 'shadow' || r === 'all') && it.shadowRoot) results.push(it.shadowRoot);\n }\n });\n return results;\n };\n\n // --- Special Selectors: HostSet ---\n if (resolvedSelector === '$hosts') resolvedElements = applyRoot(hostSet.$hosts).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$appHosts') resolvedElements = applyRoot(hostSet.$appHosts).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$host') resolvedElements = applyRoot(hostSet.$host).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$parentHost') resolvedElements = applyRoot(hostSet.$parentHost).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$appHost') resolvedElements = applyRoot(hostSet.$appHost).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$firstHost') resolvedElements = applyRoot(hostSet.$firstHost).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$lastHost') resolvedElements = applyRoot(hostSet.$lastHost).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$firstAppHost') resolvedElements = applyRoot(hostSet.$firstAppHost).filter(el => el instanceof HTMLElement);\n else if (resolvedSelector === '$lastAppHost') resolvedElements = applyRoot(hostSet.$lastAppHost).filter(el => el instanceof HTMLElement);\n // --- Special Selectors: Env ---\n else if (resolvedSelector === '$window') return [win];\n else if (resolvedSelector === '$document') return [win.document];\n else if (resolvedSelector === '$this') resolvedElements = applyRoot(this).filter(el => el instanceof HTMLElement);\n // --- Standard Selectors ---\n else {\n if (r === 'shadow') resolvedElements = this.shadowRoot ? (Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) as HTMLElement[]) : [];\n else if (r === 'light') resolvedElements = Array.from(this.querySelectorAll(resolvedSelector)) as HTMLElement[];\n else if (r === 'all') {\n const sNodes = this.shadowRoot ? (Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) as HTMLElement[]) : [];\n const lNodes = Array.from(this.querySelectorAll(resolvedSelector)) as HTMLElement[];\n resolvedElements = [...sNodes, ...lNodes];\n }\n else resolvedElements = (Array.from((this.shadowRoot || this).querySelectorAll(resolvedSelector)) as HTMLElement[]);\n }\n }\n\n // Apply filter if provided\n if ((optionsOrPropertyKey as QueryAllOptions)?.filter) {\n resolvedElements = resolvedElements.filter(el => {\n if (!(el instanceof win.HTMLElement)) return true;\n return (optionsOrPropertyKey as QueryAllOptions).filter!(el, { currentThis: this, helper: hostSet });\n });\n }\n\n return resolvedElements;\n },\n set(this: HTMLElement, nv: any) {\n ensureInit(this);\n if (nv === null || nv === undefined || (Array.isArray(nv) && nv.length === 0)) {\n const config = getElementConfig(this);\n const win = config?.window || window;\n const hostSet = SwcUtils.getHelperAndHostSet(win, this);\n \n // Resolve selector - can be string or function\n if (typeof selectorOrTarget === 'function') {\n // Get elements from function and remove them\n const result = (selectorOrTarget as any)(this, hostSet);\n if (result instanceof win.NodeList) {\n Array.from(result).forEach(el => {\n if (el instanceof win.Element) (el as Element).remove();\n });\n } else if (Array.isArray(result)) {\n result.forEach(el => {\n if (el instanceof win.Element) (el as Element).remove();\n });\n }\n return;\n }\n \n const resolvedSelector = selectorOrTarget;\n \n if (resolvedSelector.startsWith('$') && resolvedSelector !== '$this') return;\n\n const r = (optionsOrPropertyKey as SwcQueryOptions)?.root || 'auto';\n let targets: (Element | Node)[] = [];\n if (r === 'shadow') targets = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];\n else if (r === 'light') targets = Array.from(this.querySelectorAll(resolvedSelector));\n else if (r === 'all') {\n const sNodes = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(resolvedSelector)) : [];\n const lNodes = Array.from(this.querySelectorAll(resolvedSelector));\n targets = [...sNodes, ...lNodes];\n } else {\n targets = Array.from((this.shadowRoot || this).querySelectorAll(resolvedSelector));\n }\n targets.forEach(t => (t as Element).remove());\n }\n },\n enumerable: true,\n configurable: true\n });\n };\n }\n // Without selector (defaults to $this)\n return queryAll('$this', selectorOrTarget as SwcQueryOptions);\n}\n\nexport const getQueryAllMetadata = (target: any): QueryAllMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(QUERY_ALL_METADATA_KEY, constructor);\n};\n"],
5
- "mappings": "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",
6
- "names": ["descriptor"]
7
- }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=SwcAppMixin.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=SwcAsync.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=SwcAsyncTemplate.js.map