@dooboostore/simple-web-component 1.0.6 → 1.0.8

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 (346) hide show
  1. package/README.md +161 -84
  2. package/dist/cjs/decorators/addEventListener.js.map +1 -1
  3. package/dist/cjs/decorators/elementDefine.js +78 -44
  4. package/dist/cjs/decorators/elementDefine.js.map +2 -2
  5. package/dist/cjs/decorators/query.js +27 -5
  6. package/dist/cjs/decorators/query.js.map +2 -2
  7. package/dist/cjs/decorators/queryAll.js +27 -5
  8. package/dist/cjs/decorators/queryAll.js.map +2 -2
  9. package/dist/cjs/decorators/state.js.map +1 -1
  10. package/dist/cjs/elements/SwcChoose.js.map +2 -2
  11. package/dist/cjs/elements/SwcForOf.js +3 -1
  12. package/dist/cjs/elements/SwcForOf.js.map +2 -2
  13. package/dist/cjs/elements/SwcObject.js +8 -6
  14. package/dist/cjs/elements/SwcObject.js.map +2 -2
  15. package/dist/cjs/index.js +3 -6
  16. package/dist/cjs/index.js.map +2 -2
  17. package/dist/cjs/is/SwcIfAnchor.js +1 -1
  18. package/dist/cjs/is/SwcIfAnchor.js.map +2 -2
  19. package/dist/cjs/is/SwcIfArea.js +1 -1
  20. package/dist/cjs/is/SwcIfArea.js.map +2 -2
  21. package/dist/cjs/is/SwcIfAudio.js +1 -1
  22. package/dist/cjs/is/SwcIfAudio.js.map +2 -2
  23. package/dist/cjs/is/SwcIfBase.js +1 -1
  24. package/dist/cjs/is/SwcIfBase.js.map +2 -2
  25. package/dist/cjs/is/SwcIfButton.js +1 -1
  26. package/dist/cjs/is/SwcIfButton.js.map +2 -2
  27. package/dist/cjs/is/SwcIfCanvas.js +1 -1
  28. package/dist/cjs/is/SwcIfCanvas.js.map +2 -2
  29. package/dist/cjs/is/SwcIfData.js +1 -1
  30. package/dist/cjs/is/SwcIfData.js.map +2 -2
  31. package/dist/cjs/is/SwcIfDataList.js +1 -1
  32. package/dist/cjs/is/SwcIfDataList.js.map +2 -2
  33. package/dist/cjs/is/SwcIfDetails.js +1 -1
  34. package/dist/cjs/is/SwcIfDetails.js.map +2 -2
  35. package/dist/cjs/is/SwcIfDialog.js +1 -1
  36. package/dist/cjs/is/SwcIfDialog.js.map +2 -2
  37. package/dist/cjs/is/SwcIfDiv.js +1 -1
  38. package/dist/cjs/is/SwcIfDiv.js.map +2 -2
  39. package/dist/cjs/is/SwcIfDl.js +1 -1
  40. package/dist/cjs/is/SwcIfDl.js.map +2 -2
  41. package/dist/cjs/is/SwcIfEmbed.js +1 -1
  42. package/dist/cjs/is/SwcIfEmbed.js.map +2 -2
  43. package/dist/cjs/is/SwcIfFieldSet.js +1 -1
  44. package/dist/cjs/is/SwcIfFieldSet.js.map +2 -2
  45. package/dist/cjs/is/SwcIfForm.js +1 -1
  46. package/dist/cjs/is/SwcIfForm.js.map +2 -2
  47. package/dist/cjs/is/SwcIfHeading.js +1 -1
  48. package/dist/cjs/is/SwcIfHeading.js.map +2 -2
  49. package/dist/cjs/is/SwcIfHr.js +1 -1
  50. package/dist/cjs/is/SwcIfHr.js.map +2 -2
  51. package/dist/cjs/is/SwcIfIFrame.js +1 -1
  52. package/dist/cjs/is/SwcIfIFrame.js.map +2 -2
  53. package/dist/cjs/is/SwcIfImage.js +1 -1
  54. package/dist/cjs/is/SwcIfImage.js.map +2 -2
  55. package/dist/cjs/is/SwcIfInput.js +1 -1
  56. package/dist/cjs/is/SwcIfInput.js.map +2 -2
  57. package/dist/cjs/is/SwcIfLabel.js +1 -1
  58. package/dist/cjs/is/SwcIfLabel.js.map +2 -2
  59. package/dist/cjs/is/SwcIfLegend.js +1 -1
  60. package/dist/cjs/is/SwcIfLegend.js.map +2 -2
  61. package/dist/cjs/is/SwcIfLi.js +1 -1
  62. package/dist/cjs/is/SwcIfLi.js.map +2 -2
  63. package/dist/cjs/is/SwcIfLink.js +1 -1
  64. package/dist/cjs/is/SwcIfLink.js.map +2 -2
  65. package/dist/cjs/is/SwcIfMap.js +1 -1
  66. package/dist/cjs/is/SwcIfMap.js.map +2 -2
  67. package/dist/cjs/is/SwcIfMeta.js +1 -1
  68. package/dist/cjs/is/SwcIfMeta.js.map +2 -2
  69. package/dist/cjs/is/SwcIfMeter.js +1 -1
  70. package/dist/cjs/is/SwcIfMeter.js.map +2 -2
  71. package/dist/cjs/is/SwcIfMod.js +1 -1
  72. package/dist/cjs/is/SwcIfMod.js.map +2 -2
  73. package/dist/cjs/is/SwcIfObject.js +1 -1
  74. package/dist/cjs/is/SwcIfObject.js.map +2 -2
  75. package/dist/cjs/is/SwcIfOl.js +1 -1
  76. package/dist/cjs/is/SwcIfOl.js.map +2 -2
  77. package/dist/cjs/is/SwcIfOptGroup.js +1 -1
  78. package/dist/cjs/is/SwcIfOptGroup.js.map +2 -2
  79. package/dist/cjs/is/SwcIfOption.js +1 -1
  80. package/dist/cjs/is/SwcIfOption.js.map +2 -2
  81. package/dist/cjs/is/SwcIfOutput.js +1 -1
  82. package/dist/cjs/is/SwcIfOutput.js.map +2 -2
  83. package/dist/cjs/is/SwcIfParagraph.js +1 -1
  84. package/dist/cjs/is/SwcIfParagraph.js.map +2 -2
  85. package/dist/cjs/is/SwcIfParam.js +1 -1
  86. package/dist/cjs/is/SwcIfParam.js.map +2 -2
  87. package/dist/cjs/is/SwcIfPicture.js +1 -1
  88. package/dist/cjs/is/SwcIfPicture.js.map +2 -2
  89. package/dist/cjs/is/SwcIfPre.js +1 -1
  90. package/dist/cjs/is/SwcIfPre.js.map +2 -2
  91. package/dist/cjs/is/SwcIfProgress.js +1 -1
  92. package/dist/cjs/is/SwcIfProgress.js.map +2 -2
  93. package/dist/cjs/is/SwcIfQuote.js +1 -1
  94. package/dist/cjs/is/SwcIfQuote.js.map +2 -2
  95. package/dist/cjs/is/SwcIfScript.js +1 -1
  96. package/dist/cjs/is/SwcIfScript.js.map +2 -2
  97. package/dist/cjs/is/SwcIfSelect.js +1 -1
  98. package/dist/cjs/is/SwcIfSelect.js.map +2 -2
  99. package/dist/cjs/is/SwcIfSlot.js +1 -1
  100. package/dist/cjs/is/SwcIfSlot.js.map +2 -2
  101. package/dist/cjs/is/SwcIfSource.js +1 -1
  102. package/dist/cjs/is/SwcIfSource.js.map +2 -2
  103. package/dist/cjs/is/SwcIfSpan.js +1 -1
  104. package/dist/cjs/is/SwcIfSpan.js.map +2 -2
  105. package/dist/cjs/is/SwcIfStyle.js +1 -1
  106. package/dist/cjs/is/SwcIfStyle.js.map +2 -2
  107. package/dist/cjs/is/SwcIfTable.js +1 -1
  108. package/dist/cjs/is/SwcIfTable.js.map +2 -2
  109. package/dist/cjs/is/SwcIfTableCell.js +1 -1
  110. package/dist/cjs/is/SwcIfTableCell.js.map +2 -2
  111. package/dist/cjs/is/SwcIfTableRow.js +1 -1
  112. package/dist/cjs/is/SwcIfTableRow.js.map +2 -2
  113. package/dist/cjs/is/SwcIfTableSection.js +1 -1
  114. package/dist/cjs/is/SwcIfTableSection.js.map +2 -2
  115. package/dist/cjs/is/SwcIfTemplate.js +1 -1
  116. package/dist/cjs/is/SwcIfTemplate.js.map +2 -2
  117. package/dist/cjs/is/SwcIfTextArea.js +1 -1
  118. package/dist/cjs/is/SwcIfTextArea.js.map +2 -2
  119. package/dist/cjs/is/SwcIfTime.js +1 -1
  120. package/dist/cjs/is/SwcIfTime.js.map +2 -2
  121. package/dist/cjs/is/SwcIfTitle.js +1 -1
  122. package/dist/cjs/is/SwcIfTitle.js.map +2 -2
  123. package/dist/cjs/is/SwcIfTrack.js +1 -1
  124. package/dist/cjs/is/SwcIfTrack.js.map +2 -2
  125. package/dist/cjs/is/SwcIfUl.js +1 -1
  126. package/dist/cjs/is/SwcIfUl.js.map +2 -2
  127. package/dist/cjs/is/SwcIfVideo.js +1 -1
  128. package/dist/cjs/is/SwcIfVideo.js.map +2 -2
  129. package/dist/cjs/utils/Utils.js +13 -22
  130. package/dist/cjs/utils/Utils.js.map +2 -2
  131. package/dist/esm/decorators/addEventListener.js.map +1 -1
  132. package/dist/esm/decorators/elementDefine.js +78 -44
  133. package/dist/esm/decorators/elementDefine.js.map +2 -2
  134. package/dist/esm/decorators/query.js +27 -5
  135. package/dist/esm/decorators/query.js.map +2 -2
  136. package/dist/esm/decorators/queryAll.js +27 -5
  137. package/dist/esm/decorators/queryAll.js.map +2 -2
  138. package/dist/esm/decorators/state.js.map +1 -1
  139. package/dist/esm/elements/SwcChoose.js.map +2 -2
  140. package/dist/esm/elements/SwcForOf.js +3 -1
  141. package/dist/esm/elements/SwcForOf.js.map +2 -2
  142. package/dist/esm/elements/SwcObject.js +8 -6
  143. package/dist/esm/elements/SwcObject.js.map +2 -2
  144. package/dist/esm/index.js +3 -6
  145. package/dist/esm/index.js.map +2 -2
  146. package/dist/esm/is/SwcIfAnchor.js +1 -1
  147. package/dist/esm/is/SwcIfAnchor.js.map +2 -2
  148. package/dist/esm/is/SwcIfArea.js +1 -1
  149. package/dist/esm/is/SwcIfArea.js.map +2 -2
  150. package/dist/esm/is/SwcIfAudio.js +1 -1
  151. package/dist/esm/is/SwcIfAudio.js.map +2 -2
  152. package/dist/esm/is/SwcIfBase.js +1 -1
  153. package/dist/esm/is/SwcIfBase.js.map +2 -2
  154. package/dist/esm/is/SwcIfButton.js +1 -1
  155. package/dist/esm/is/SwcIfButton.js.map +2 -2
  156. package/dist/esm/is/SwcIfCanvas.js +1 -1
  157. package/dist/esm/is/SwcIfCanvas.js.map +2 -2
  158. package/dist/esm/is/SwcIfData.js +1 -1
  159. package/dist/esm/is/SwcIfData.js.map +2 -2
  160. package/dist/esm/is/SwcIfDataList.js +1 -1
  161. package/dist/esm/is/SwcIfDataList.js.map +2 -2
  162. package/dist/esm/is/SwcIfDetails.js +1 -1
  163. package/dist/esm/is/SwcIfDetails.js.map +2 -2
  164. package/dist/esm/is/SwcIfDialog.js +1 -1
  165. package/dist/esm/is/SwcIfDialog.js.map +2 -2
  166. package/dist/esm/is/SwcIfDiv.js +1 -1
  167. package/dist/esm/is/SwcIfDiv.js.map +2 -2
  168. package/dist/esm/is/SwcIfDl.js +1 -1
  169. package/dist/esm/is/SwcIfDl.js.map +2 -2
  170. package/dist/esm/is/SwcIfEmbed.js +1 -1
  171. package/dist/esm/is/SwcIfEmbed.js.map +2 -2
  172. package/dist/esm/is/SwcIfFieldSet.js +1 -1
  173. package/dist/esm/is/SwcIfFieldSet.js.map +2 -2
  174. package/dist/esm/is/SwcIfForm.js +1 -1
  175. package/dist/esm/is/SwcIfForm.js.map +2 -2
  176. package/dist/esm/is/SwcIfHeading.js +1 -1
  177. package/dist/esm/is/SwcIfHeading.js.map +2 -2
  178. package/dist/esm/is/SwcIfHr.js +1 -1
  179. package/dist/esm/is/SwcIfHr.js.map +2 -2
  180. package/dist/esm/is/SwcIfIFrame.js +1 -1
  181. package/dist/esm/is/SwcIfIFrame.js.map +2 -2
  182. package/dist/esm/is/SwcIfImage.js +1 -1
  183. package/dist/esm/is/SwcIfImage.js.map +2 -2
  184. package/dist/esm/is/SwcIfInput.js +1 -1
  185. package/dist/esm/is/SwcIfInput.js.map +2 -2
  186. package/dist/esm/is/SwcIfLabel.js +1 -1
  187. package/dist/esm/is/SwcIfLabel.js.map +2 -2
  188. package/dist/esm/is/SwcIfLegend.js +1 -1
  189. package/dist/esm/is/SwcIfLegend.js.map +2 -2
  190. package/dist/esm/is/SwcIfLi.js +1 -1
  191. package/dist/esm/is/SwcIfLi.js.map +2 -2
  192. package/dist/esm/is/SwcIfLink.js +1 -1
  193. package/dist/esm/is/SwcIfLink.js.map +2 -2
  194. package/dist/esm/is/SwcIfMap.js +1 -1
  195. package/dist/esm/is/SwcIfMap.js.map +2 -2
  196. package/dist/esm/is/SwcIfMeta.js +1 -1
  197. package/dist/esm/is/SwcIfMeta.js.map +2 -2
  198. package/dist/esm/is/SwcIfMeter.js +1 -1
  199. package/dist/esm/is/SwcIfMeter.js.map +2 -2
  200. package/dist/esm/is/SwcIfMod.js +1 -1
  201. package/dist/esm/is/SwcIfMod.js.map +2 -2
  202. package/dist/esm/is/SwcIfObject.js +1 -1
  203. package/dist/esm/is/SwcIfObject.js.map +2 -2
  204. package/dist/esm/is/SwcIfOl.js +1 -1
  205. package/dist/esm/is/SwcIfOl.js.map +2 -2
  206. package/dist/esm/is/SwcIfOptGroup.js +1 -1
  207. package/dist/esm/is/SwcIfOptGroup.js.map +2 -2
  208. package/dist/esm/is/SwcIfOption.js +1 -1
  209. package/dist/esm/is/SwcIfOption.js.map +2 -2
  210. package/dist/esm/is/SwcIfOutput.js +1 -1
  211. package/dist/esm/is/SwcIfOutput.js.map +2 -2
  212. package/dist/esm/is/SwcIfParagraph.js +1 -1
  213. package/dist/esm/is/SwcIfParagraph.js.map +2 -2
  214. package/dist/esm/is/SwcIfParam.js +1 -1
  215. package/dist/esm/is/SwcIfParam.js.map +2 -2
  216. package/dist/esm/is/SwcIfPicture.js +1 -1
  217. package/dist/esm/is/SwcIfPicture.js.map +2 -2
  218. package/dist/esm/is/SwcIfPre.js +1 -1
  219. package/dist/esm/is/SwcIfPre.js.map +2 -2
  220. package/dist/esm/is/SwcIfProgress.js +1 -1
  221. package/dist/esm/is/SwcIfProgress.js.map +2 -2
  222. package/dist/esm/is/SwcIfQuote.js +1 -1
  223. package/dist/esm/is/SwcIfQuote.js.map +2 -2
  224. package/dist/esm/is/SwcIfScript.js +1 -1
  225. package/dist/esm/is/SwcIfScript.js.map +2 -2
  226. package/dist/esm/is/SwcIfSelect.js +1 -1
  227. package/dist/esm/is/SwcIfSelect.js.map +2 -2
  228. package/dist/esm/is/SwcIfSlot.js +1 -1
  229. package/dist/esm/is/SwcIfSlot.js.map +2 -2
  230. package/dist/esm/is/SwcIfSource.js +1 -1
  231. package/dist/esm/is/SwcIfSource.js.map +2 -2
  232. package/dist/esm/is/SwcIfSpan.js +1 -1
  233. package/dist/esm/is/SwcIfSpan.js.map +2 -2
  234. package/dist/esm/is/SwcIfStyle.js +1 -1
  235. package/dist/esm/is/SwcIfStyle.js.map +2 -2
  236. package/dist/esm/is/SwcIfTable.js +1 -1
  237. package/dist/esm/is/SwcIfTable.js.map +2 -2
  238. package/dist/esm/is/SwcIfTableCell.js +1 -1
  239. package/dist/esm/is/SwcIfTableCell.js.map +2 -2
  240. package/dist/esm/is/SwcIfTableRow.js +1 -1
  241. package/dist/esm/is/SwcIfTableRow.js.map +2 -2
  242. package/dist/esm/is/SwcIfTableSection.js +1 -1
  243. package/dist/esm/is/SwcIfTableSection.js.map +2 -2
  244. package/dist/esm/is/SwcIfTemplate.js +1 -1
  245. package/dist/esm/is/SwcIfTemplate.js.map +2 -2
  246. package/dist/esm/is/SwcIfTextArea.js +1 -1
  247. package/dist/esm/is/SwcIfTextArea.js.map +2 -2
  248. package/dist/esm/is/SwcIfTime.js +1 -1
  249. package/dist/esm/is/SwcIfTime.js.map +2 -2
  250. package/dist/esm/is/SwcIfTitle.js +1 -1
  251. package/dist/esm/is/SwcIfTitle.js.map +2 -2
  252. package/dist/esm/is/SwcIfTrack.js +1 -1
  253. package/dist/esm/is/SwcIfTrack.js.map +2 -2
  254. package/dist/esm/is/SwcIfUl.js +1 -1
  255. package/dist/esm/is/SwcIfUl.js.map +2 -2
  256. package/dist/esm/is/SwcIfVideo.js +1 -1
  257. package/dist/esm/is/SwcIfVideo.js.map +2 -2
  258. package/dist/esm/utils/Utils.js +13 -22
  259. package/dist/esm/utils/Utils.js.map +2 -2
  260. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js +1970 -2045
  261. package/dist/esm-bundle/dooboostore-simple-web-component.esm.js.map +4 -4
  262. package/dist/types/decorators/addEventListener.d.ts +1 -1
  263. package/dist/types/decorators/addEventListener.d.ts.map +1 -1
  264. package/dist/types/decorators/elementDefine.d.ts.map +1 -1
  265. package/dist/types/decorators/query.d.ts +5 -2
  266. package/dist/types/decorators/query.d.ts.map +1 -1
  267. package/dist/types/decorators/queryAll.d.ts +5 -2
  268. package/dist/types/decorators/queryAll.d.ts.map +1 -1
  269. package/dist/types/decorators/state.d.ts +1 -1
  270. package/dist/types/decorators/state.d.ts.map +1 -1
  271. package/dist/types/elements/SwcChoose.d.ts.map +1 -1
  272. package/dist/types/elements/SwcForOf.d.ts.map +1 -1
  273. package/dist/types/elements/SwcObject.d.ts.map +1 -1
  274. package/dist/types/index.d.ts +3 -6
  275. package/dist/types/index.d.ts.map +1 -1
  276. package/dist/types/utils/Utils.d.ts +1 -1
  277. package/dist/types/utils/Utils.d.ts.map +1 -1
  278. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js +1970 -2045
  279. package/dist/umd-bundle/dooboostore-simple-web-component.umd.js.map +4 -4
  280. package/package.json +4 -4
  281. package/src/decorators/addEventListener.ts +1 -1
  282. package/src/decorators/elementDefine.ts +105 -44
  283. package/src/decorators/query.ts +35 -8
  284. package/src/decorators/queryAll.ts +35 -8
  285. package/src/decorators/state.ts +1 -1
  286. package/src/elements/SwcChoose.ts +1 -5
  287. package/src/elements/SwcForOf.ts +2 -1
  288. package/src/elements/SwcObject.ts +8 -6
  289. package/src/index.ts +3 -6
  290. package/src/is/SwcIfAnchor.ts +1 -1
  291. package/src/is/SwcIfArea.ts +1 -1
  292. package/src/is/SwcIfAudio.ts +1 -1
  293. package/src/is/SwcIfBase.ts +1 -1
  294. package/src/is/SwcIfButton.ts +1 -1
  295. package/src/is/SwcIfCanvas.ts +1 -1
  296. package/src/is/SwcIfData.ts +1 -1
  297. package/src/is/SwcIfDataList.ts +1 -1
  298. package/src/is/SwcIfDetails.ts +1 -1
  299. package/src/is/SwcIfDialog.ts +1 -1
  300. package/src/is/SwcIfDiv.ts +1 -1
  301. package/src/is/SwcIfDl.ts +1 -1
  302. package/src/is/SwcIfEmbed.ts +1 -1
  303. package/src/is/SwcIfFieldSet.ts +1 -1
  304. package/src/is/SwcIfForm.ts +1 -1
  305. package/src/is/SwcIfHeading.ts +1 -1
  306. package/src/is/SwcIfHr.ts +1 -1
  307. package/src/is/SwcIfIFrame.ts +1 -1
  308. package/src/is/SwcIfImage.ts +1 -1
  309. package/src/is/SwcIfInput.ts +1 -1
  310. package/src/is/SwcIfLabel.ts +1 -1
  311. package/src/is/SwcIfLegend.ts +1 -1
  312. package/src/is/SwcIfLi.ts +1 -1
  313. package/src/is/SwcIfLink.ts +1 -1
  314. package/src/is/SwcIfMap.ts +1 -1
  315. package/src/is/SwcIfMeta.ts +1 -1
  316. package/src/is/SwcIfMeter.ts +1 -1
  317. package/src/is/SwcIfMod.ts +1 -1
  318. package/src/is/SwcIfObject.ts +1 -1
  319. package/src/is/SwcIfOl.ts +1 -1
  320. package/src/is/SwcIfOptGroup.ts +1 -1
  321. package/src/is/SwcIfOption.ts +1 -1
  322. package/src/is/SwcIfOutput.ts +1 -1
  323. package/src/is/SwcIfParagraph.ts +1 -1
  324. package/src/is/SwcIfParam.ts +1 -1
  325. package/src/is/SwcIfPicture.ts +1 -1
  326. package/src/is/SwcIfPre.ts +1 -1
  327. package/src/is/SwcIfProgress.ts +1 -1
  328. package/src/is/SwcIfQuote.ts +1 -1
  329. package/src/is/SwcIfScript.ts +1 -1
  330. package/src/is/SwcIfSelect.ts +1 -1
  331. package/src/is/SwcIfSlot.ts +1 -1
  332. package/src/is/SwcIfSource.ts +1 -1
  333. package/src/is/SwcIfSpan.ts +1 -1
  334. package/src/is/SwcIfStyle.ts +1 -1
  335. package/src/is/SwcIfTable.ts +1 -1
  336. package/src/is/SwcIfTableCell.ts +1 -1
  337. package/src/is/SwcIfTableRow.ts +1 -1
  338. package/src/is/SwcIfTableSection.ts +1 -1
  339. package/src/is/SwcIfTemplate.ts +1 -1
  340. package/src/is/SwcIfTextArea.ts +1 -1
  341. package/src/is/SwcIfTime.ts +1 -1
  342. package/src/is/SwcIfTitle.ts +1 -1
  343. package/src/is/SwcIfTrack.ts +1 -1
  344. package/src/is/SwcIfUl.ts +1 -1
  345. package/src/is/SwcIfVideo.ts +1 -1
  346. package/src/utils/Utils.ts +18 -32
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # @dooboostore/simple-web-component
2
2
 
3
- A ultra-lightweight, high-performance Web Component library that brings **Modern Reactivity** to **Standard Web Technologies**. Build complex, nested UIs using native Shadow DOM, Slots, and MutationObservers without the overhead of a Virtual DOM.
3
+ An ultra-lightweight, high-performance Web Component library that brings **Modern Reactivity** to **Standard Web Technologies**. Build complex, high-performance UIs using native Shadow DOM, Slots, and MutationObservers without the overhead of a Virtual DOM.
4
4
 
5
- ## 🚀 Key Features
5
+ ## 🚀 Key Advantages
6
6
 
7
- - **Standard-First**: Uses the native `is` attribute to enhance standard HTML tags (`ul`, `table`, `div`, etc.). Your markup stays clean and semantic.
8
7
  - **Surgical Updates**: Powered by Proxy-based reactivity. It updates only the specific **Text Nodes or Attributes** bound to data—no full-tree diffing.
9
- - **Deep Reactivity**: The `@state` decorator detects changes deep inside objects and arrays automatically.
10
- - **Hybrid Rendering**: Seamlessly combine **Shadow DOM** (for encapsulation) and **Light DOM** (for slotting and SEO) in a single component.
11
- - **Scoped Context (`as`)**: Perfectly isolate data between parent and child components using explicit aliases.
8
+ - **Standard-First**: Keep your HTML semantic. Use the native `is` attribute to enhance standard tags (`ul`, `table`, `div`, etc.).
9
+ - **Zero Boilerplate**: Define queries, events, and lifecycles declaratively using decorators.
10
+ - **Scoped Context (`as`)**: Effortlessly isolate and share data between parent and child components using explicit aliases.
11
+ - **Hybrid Rendering**: Seamlessly combine **Shadow DOM** and **Light DOM** in a single component.
12
12
 
13
13
  ---
14
14
 
@@ -18,132 +18,209 @@ A ultra-lightweight, high-performance Web Component library that brings **Modern
18
18
  pnpm add @dooboostore/simple-web-component
19
19
  ```
20
20
 
21
- ### Safari Support (Essential)
22
- Safari does not natively support "Customized Built-in Elements". You **must** include the polyfill at the top of your entry point:
23
-
21
+ ### Safari Support (Required)
22
+ Include this polyfill at the very top of your entry point to support the `is` attribute in Safari:
24
23
  ```javascript
25
24
  import '@ungap/custom-elements';
25
+ import 'reflect-metadata';
26
26
  ```
27
27
 
28
28
  ---
29
29
 
30
- ## 💡 Practical Examples
30
+ ## 💡 Practical Showcase
31
31
 
32
- ### 1. Complex Nesting & Scoped Context (`as`)
33
- Avoid naming collisions by aliasing your components. Access parent data from children using the same alias.
32
+ ### 1. Basic Reactive Component
33
+ A counter where only the number part is updated in the DOM when you click.
34
34
 
35
35
  ```typescript
36
- @elementDefine({ name: 'parent-comp' })
37
- class Parent extends HTMLElement {
38
- @state count = 10;
36
+ import { elementDefine, innerHtml, state, addEventListener } from '@dooboostore/simple-web-component';
37
+
38
+ @elementDefine('my-counter')
39
+ class MyCounter extends HTMLElement {
40
+ @state count = 0;
41
+
39
42
  @innerHtml({ useShadow: true })
40
43
  render() {
41
44
  return `
42
- <div>Parent Count: {{t1.count}}</div>
43
- <slot></slot>
45
+ <p>Count: <strong>{{count}}</strong></p>
46
+ <button id="inc"> +1 </button>
44
47
  `;
45
48
  }
49
+
50
+ @addEventListener({ type: 'click', query: '#inc' })
51
+ onInc() {
52
+ this.count++; // 👈 Surgical Update!
53
+ }
54
+ }
55
+ ```
56
+
57
+ ### 2. Nested Scopes with `as="alias"`
58
+ Access parent data from deeply nested children without naming collisions.
59
+
60
+ ```typescript
61
+ @elementDefine({ name: 'parent-comp' })
62
+ class Parent extends HTMLElement {
63
+ @state user = { name: 'Alice', score: 100 };
64
+ @innerHtml({ useShadow: true })
65
+ render() { return `<h3>User: {{p.user.name}}</h3><slot></slot>`; }
46
66
  }
47
67
 
48
68
  @elementDefine({ name: 'child-comp' })
49
69
  class Child extends HTMLElement {
50
- @state count = 0;
70
+ @state score = 0;
51
71
  @innerHtml({ useShadow: true })
52
72
  render() {
53
73
  return `
54
- <div>Child Count: {{t2.count}}</div>
55
- <div>Parent's Count via Alias: {{t1.count}}</div>
74
+ <div>Child Score: {{c.score}}</div>
75
+ <div>Parent's Score: {{p.user.score}}</div> <!-- 👈 Scoped Access -->
56
76
  `;
57
77
  }
58
78
  }
59
79
  ```
60
-
61
80
  ```html
62
- <parent-comp as="t1">
63
- <child-comp as="t2"></child-comp>
81
+ <!-- HTML Usage -->
82
+ <parent-comp as="p">
83
+ <child-comp as="c"></child-comp>
64
84
  </parent-comp>
65
85
  ```
66
86
 
67
- ### 2. High-Performance Looping (`swc-for-of`)
68
- Render thousands of items efficiently. Keeps your native `ul > li` or `tbody > tr` structure intact.
87
+ ### 3. Mixed Shadow & Light DOM Rendering
88
+ You can distribute templates across both Shadow and Light DOM in a single component.
69
89
 
70
- ```html
71
- <ul is="swc-for-of-ul" id="my-list" as="item" as-index="i">
72
- <li class="user-row">
73
- <strong>#{{i}}</strong>: {{item.name}}
74
- <button onbtn-click="alert($data.id)">Select</button>
75
- </li>
76
- </ul>
90
+ ```typescript
91
+ @elementDefine({ name: 'hybrid-comp' })
92
+ class HybridComp extends HTMLElement {
93
+ @innerHtml({ useShadow: true })
94
+ renderShadow() {
95
+ return `<div style="border: 1px solid blue;"><slot></slot></div>`;
96
+ }
77
97
 
78
- <script>
79
- const list = document.querySelector('#my-list');
80
- list.swcValue = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
81
-
82
- // Surgical Update: only the 3rd row is created and appended.
83
- list.swcValue.push({ id: 3, name: 'Charlie' });
84
- </script>
98
+ @innerHtml
99
+ renderLight() {
100
+ return `<p>I am in the Light DOM!</p>`;
101
+ }
102
+ }
85
103
  ```
86
104
 
87
- ### 3. Surgical Object Binding (`swc-object`)
88
- Bind a complex object to a template. Updates happen instantly when properties change.
105
+ ---
89
106
 
90
- ```html
91
- <div is="swc-object-div" id="profile" as="u">
92
- <img src="{{u.avatarUrl}}" alt="{{u.name}}'s avatar">
93
- <h3>{{u.name}}</h3>
94
- <p>Status: {{u.status}}</p>
95
- </div>
107
+ ## 📑 Decorator Deep Dive
108
+
109
+ ### `@elementDefine(config)`
110
+ Registers the class as a Custom Element.
111
+ - `name`: (Required) Tag name.
112
+ - `extends`: (Optional) Native tag to extend (e.g., `'ul'`).
113
+ - `autoRemoveEventListeners`: (Optional) Auto-cleanup on disconnect.
114
+
115
+ ### `@innerHtml(options?)`
116
+ Defines markup. Supports **Async (Promises)**.
117
+ - `root`: `'shadow'` (Shadow DOM) or `'light'` (Light DOM). Default depends on `useShadow`.
118
+ - `useShadow`: Shortcut to set `root: 'shadow'`.
119
+
120
+ ### `@state(alias?)`
121
+ Declares a property as reactive. Tracks changes in nested objects/arrays.
122
+ - `alias`: Custom name for templates (e.g. `{{alias.path}}`).
123
+
124
+ ### `@attribute(options?)`
125
+ Syncs property with HTML attribute.
126
+ - `name`: HTML attribute name.
127
+ - `type`: `String`, `Number`, `Boolean`, `Object`.
128
+ - `disableReflect`: If `true`, stops JS -> HTML sync. Default is `false`.
129
+
130
+ ### `@query(selector?, options?)`
131
+ Lazy-loads elements from the DOM.
132
+ - `selector`: CSS selector. If omitted, targets the **Host**.
133
+ - `root`: `'shadow' | 'light' | 'all' | 'auto'` (Default: `'auto'`).
134
+
135
+ ### `@addEventListener(options)`
136
+ Declarative event binding. Method receives `(event, targetElement)`.
137
+ - `type`: Event type.
138
+ - `query`: CSS selector. Omit to bind to **Host**.
139
+ - `root`: `'shadow' | 'light' | 'all' | 'auto'`.
140
+ - `stopPropagation`, `preventDefault`, `stopImmediatePropagation`: Event modifiers.
96
141
 
97
- <script>
98
- const el = document.querySelector('#profile');
99
- el.swcValue = { name: 'Dev', status: 'Online', avatarUrl: '...' };
100
-
101
- // Surgical Update: Only the <p> text changes.
102
- el.swcValue.status = 'Busy';
103
- </script>
104
- ```
142
+ ---
143
+
144
+ ## Lifecycle Hooks
145
+ Provides 6-stage hooks for precise control. Multiple methods per hook are supported.
146
+
147
+ | Hook | Timing |
148
+ | :--- | :--- |
149
+ | **`@onBeforeConnected`** | Before template injection. |
150
+ | **`@onAfterConnected`** | After injection (Alias: **`@onConnected`**). |
151
+ | **`@onBeforeDisconnected`**| Before element removal. |
152
+ | **`@onAfterDisconnected`** | After removal and cleanup (Alias: **`@onDisconnected`**). |
153
+ | **`@onAttributeChanged(key)`**| When an attribute (or `*` wildcard) changes. |
154
+ | **`@onAddEventListener`** | Called when a listener is attached via `@addEventListener`. |
105
155
 
106
156
  ---
107
157
 
108
- ## 📑 API Reference
158
+ ## 🛠 Built-in Logic Components (`is` Variants)
109
159
 
110
- ### Core Decorators
160
+ Enhance any standard HTML tag with logic using the `is` attribute. Use **`swcValue`** to bind data.
111
161
 
112
- | Decorator | Target | Description |
113
- | :--- | :--- | :--- |
114
- | `@elementDefine(config)` | Class | Registers the component. `config: { name, extends, autoRemoveEventListeners }`. |
115
- | `@innerHtml(options)` | Method | Defines HTML content. `options: { useShadow }`. Can be used multiple times to combine templates. |
116
- | `@state` | Field | Declares a reactive property. Triggers surgical updates on change. Supports `@state('alias')`. |
117
- | `@attribute(options)` | Field | Syncs class property with HTML attribute. `options: { name, type, disableReflect }`. |
118
- | `@query(selector)` | Field/Method | Lazy-loads an element. Can be used as a property or a callback method. |
119
- | `@addEventListener(opts)`| Method | Declarative event binding. Automatically re-binds if DOM changes. |
120
- | `@emitCustomEvent(type)` | Method | Dispatches a `CustomEvent`. 리턴값은 부모 템플릿의 `$data`로 전달됩니다. |
162
+ ### 1. Looping (`swc-for-of-[tag]`)
163
+ High-performance rendering that keeps your markup structure.
164
+ ```html
165
+ <ul is="swc-for-of-ul" swcValue="{{items}}" as="item" as-index="i">
166
+ <li>{{i}}. {{item.name}}</li>
167
+ </ul>
168
+ ```
121
169
 
122
- ### Lifecycle Hooks
170
+ ### 2. Conditionals (`swc-if-[tag]`)
171
+ Elements are physically added/removed from the DOM tree.
172
+ ```html
173
+ <div is="swc-if-div" swcValue="{{isVisible}}">
174
+ <p>Now you see me!</p>
175
+ </div>
176
+ ```
123
177
 
124
- Every hook supports **multiple methods** per component.
178
+ ### 3. Branching (`swc-choose-[tag]`)
179
+ Switch-case style logic with physical element swapping.
180
+ ```html
181
+ <div is="swc-choose-div" swcValue="{{status}}">
182
+ <span is="swc-when-span" test="loading">Loading...</span>
183
+ <span is="swc-when-span" test="error">Error!</span>
184
+ <div is="swc-other-div">Success!</div>
185
+ </div>
186
+ ```
125
187
 
126
- | Hook | Timing |
127
- | :--- | :--- |
128
- | `@onBeforeConnected` | Before content is injected. |
129
- | `@onAfterConnected` | After content injection and binding (Alias: `@onConnected`). |
130
- | `@onBeforeDisconnected`| Before the element is removed. |
131
- | `@onAfterDisconnected` | After removal and auto-cleanup (Alias: `@onDisconnected`). |
132
- | `@onAttributeChanged(key)`| When a specific (or wildcard `*`) attribute changes. |
133
- | `@onAddEventListener` | Callback when any `@addEventListener` is triggered. |
188
+ ### 4. Object Binding (`swc-object-[tag]`)
189
+ Binds a single object surgically to any tag.
190
+ ```html
191
+ <div is="swc-object-div" swcValue="{{user}}" as="u">
192
+ <h3>{{u.name}}</h3>
193
+ </div>
194
+ ```
134
195
 
135
196
  ---
136
197
 
137
- ## 🛠 Built-in Logic Components (`is` variants)
198
+ ## 📜 Full Feature Integration Example
138
199
 
139
- Every standard HTML tag has logic variants. The naming pattern is `swc-[logic]-[tag]`.
200
+ ```typescript
201
+ @elementDefine('app-root')
202
+ class AppRoot extends HTMLElement {
203
+ @state profile = { name: 'John', loggedIn: true };
140
204
 
141
- - **ForOf**: `swc-for-of-ul`, `swc-for-of-tbody`, `swc-for-of-div` ...
142
- - **If**: `swc-if-div`, `swc-if-span`, `swc-if-section` ...
143
- - **Choose**: `swc-choose-div`, `swc-choose-section` ...
144
- - **Object**: `swc-object-div`, `swc-object-article` ...
205
+ @onConnected
206
+ init() { console.log('App Started'); }
145
207
 
146
- ---
208
+ @innerHtml({ useShadow: true })
209
+ render() {
210
+ return `
211
+ <div is="swc-if-div" swcValue="{{profile.loggedIn}}">
212
+ <h1>Welcome, {{profile.name}}!</h1>
213
+ <button id="logout">Logout</button>
214
+ </div>
215
+ `;
216
+ }
217
+
218
+ @addEventListener({ type: 'click', query: '#logout' })
219
+ onLogout() {
220
+ this.profile.loggedIn = false; // Surgical UI disappearance
221
+ }
222
+ }
223
+ ```
147
224
 
148
- ## 📜 License
225
+ ## License
149
226
  MIT
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/addEventListener.ts"],
4
- "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n query?: string;\n type: string;\n useShadow?: boolean;\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n}\n\nexport interface AddEventListenerMetadata {\n options: AddEventListenerOptions;\n propertyKey: string | symbol;\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol('simple-web-component:add-event-listener');\n\nexport function addEventListener(type: string, query?: string): MethodDecorator;\nexport function addEventListener(options: AddEventListenerOptions): MethodDecorator;\nexport function addEventListener(arg1: string | AddEventListenerOptions, arg2?: string): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n const options: AddEventListenerOptions = typeof arg1 === 'string' ? { type: arg1, query: arg2 } : arg1;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n listeners.push({ options, propertyKey });\n };\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
4
+ "sourcesContent": ["import { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n query?: string;\n type: string;\n root?: 'light' | 'shadow' | 'all' | 'auto';\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n preventDefault?: boolean;\n}\n\nexport interface AddEventListenerMetadata {\n options: AddEventListenerOptions;\n propertyKey: string | symbol;\n}\n\nexport const ADD_EVENT_LISTENER_METADATA_KEY = Symbol('simple-web-component:add-event-listener');\n\nexport function addEventListener(type: string, query?: string): MethodDecorator;\nexport function addEventListener(options: AddEventListenerOptions): MethodDecorator;\nexport function addEventListener(arg1: string | AddEventListenerOptions, arg2?: string): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n const options: AddEventListenerOptions = typeof arg1 === 'string' ? { type: arg1, query: arg2 } : arg1;\n\n let listeners = ReflectUtils.getMetadata<AddEventListenerMetadata[]>(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n if (!listeners) {\n listeners = [];\n ReflectUtils.defineMetadata(ADD_EVENT_LISTENER_METADATA_KEY, listeners, constructor);\n }\n listeners.push({ options, propertyKey });\n };\n}\n\nexport const getAddEventListenerMetadata = (target: any): AddEventListenerMetadata[] | undefined => {\n const constructor = target instanceof Function ? target : target.constructor;\n return ReflectUtils.getMetadata(ADD_EVENT_LISTENER_METADATA_KEY, constructor);\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA6B;AAmBtB,MAAM,kCAAkC,OAAO,yCAAyC;AAIxF,SAAS,iBAAiB,MAAwC,MAAgC;AACvG,SAAO,CAAC,QAAgB,aAA8B,eAAmC;AACvF,UAAM,cAAc,OAAO;AAC3B,UAAM,UAAmC,OAAO,SAAS,WAAW,EAAE,MAAM,MAAM,OAAO,KAAK,IAAI;AAElG,QAAI,YAAY,iCAAa,YAAwC,iCAAiC,WAAW;AACjH,QAAI,CAAC,WAAW;AACd,kBAAY,CAAC;AACb,uCAAa,eAAe,iCAAiC,WAAW,WAAW;AAAA,IACrF;AACA,cAAU,KAAK,EAAE,SAAS,YAAY,CAAC;AAAA,EACzC;AACF;AAEO,MAAM,8BAA8B,CAAC,WAAwD;AAClG,QAAM,cAAc,kBAAkB,WAAW,SAAS,OAAO;AACjE,SAAO,iCAAa,YAAY,iCAAiC,WAAW;AAC9E;",
6
6
  "names": []
7
7
  }
@@ -161,19 +161,37 @@ const elementDefine = (inConfig) => (constructor) => {
161
161
  }
162
162
  _syncDecorators() {
163
163
  this._buildStateMap();
164
+ const getSearchRoots = (rootOption) => {
165
+ const roots = [];
166
+ if (rootOption === "shadow") {
167
+ if (this.shadowRoot) roots.push(this.shadowRoot);
168
+ } else if (rootOption === "light") {
169
+ roots.push(this);
170
+ } else if (rootOption === "all") {
171
+ if (this.shadowRoot) roots.push(this.shadowRoot);
172
+ roots.push(this);
173
+ } else {
174
+ roots.push(this.shadowRoot || this);
175
+ }
176
+ return roots;
177
+ };
164
178
  const queryMetadata = (0, import_query.getQueryMetadata)(this);
165
179
  if (queryMetadata) {
166
180
  queryMetadata.filter((it) => it.isMethod).forEach((it) => {
167
- const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
168
- const element = root.querySelector(it.selector);
169
- if (element) {
170
- let bound = this._boundElements.get(element);
181
+ const searchRoots = getSearchRoots(it.options.root);
182
+ let foundEl = null;
183
+ for (const root of searchRoots) {
184
+ foundEl = it.selector ? root.querySelector(it.selector) : this;
185
+ if (foundEl) break;
186
+ }
187
+ if (foundEl) {
188
+ let bound = this._boundElements.get(foundEl);
171
189
  if (!bound) {
172
190
  bound = /* @__PURE__ */ new Set();
173
- this._boundElements.set(element, bound);
191
+ this._boundElements.set(foundEl, bound);
174
192
  }
175
193
  if (!bound.has(it.propertyKey)) {
176
- this[it.propertyKey](element);
194
+ this[it.propertyKey](foundEl);
177
195
  bound.add(it.propertyKey);
178
196
  }
179
197
  }
@@ -182,48 +200,52 @@ const elementDefine = (inConfig) => (constructor) => {
182
200
  const queryAllMetadata = (0, import_queryAll.getQueryAllMetadata)(this);
183
201
  if (queryAllMetadata) {
184
202
  queryAllMetadata.filter((it) => it.isMethod).forEach((it) => {
185
- const root = it.options.useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
186
- const elements = root.querySelectorAll(it.selector);
187
- this[it.propertyKey](elements);
203
+ const searchRoots = getSearchRoots(it.options.root);
204
+ const allElements = [];
205
+ searchRoots.forEach((root) => {
206
+ const found = it.selector ? root.querySelectorAll(it.selector) : [this];
207
+ allElements.push(...Array.from(found));
208
+ });
209
+ this[it.propertyKey](allElements);
188
210
  });
189
211
  }
190
212
  const eventListeners = (0, import_addEventListener.getAddEventListenerMetadata)(this);
191
213
  if (eventListeners) {
192
214
  eventListeners.forEach((it) => {
193
- const { query, type, useShadow, ...options } = it.options;
194
- const root = useShadow !== false && this.shadowRoot ? this.shadowRoot : this;
195
- const targetElements = query ? root.querySelectorAll(query) : [this];
196
- targetElements.forEach((targetElement) => {
197
- if (targetElement) {
198
- let bound = this._boundElements.get(targetElement);
199
- if (!bound) {
200
- bound = /* @__PURE__ */ new Set();
201
- this._boundElements.set(targetElement, bound);
215
+ const { query, type, root: rootOption, ...options } = it.options;
216
+ const searchRoots = getSearchRoots(rootOption);
217
+ searchRoots.forEach((root) => {
218
+ const targetElements = query ? root.querySelectorAll(query) : [this];
219
+ targetElements.forEach((targetElement) => {
220
+ if (targetElement) {
221
+ let bound = this._boundElements.get(targetElement);
222
+ if (!bound) {
223
+ bound = /* @__PURE__ */ new Set();
224
+ this._boundElements.set(targetElement, bound);
225
+ }
226
+ const eventKey = `event:${String(it.propertyKey)}:${type}`;
227
+ if (!bound.has(eventKey)) {
228
+ const handler = (event) => {
229
+ if (it.options.stopImmediatePropagation) event.stopImmediatePropagation();
230
+ if (it.options.stopPropagation) event.stopPropagation();
231
+ if (it.options.preventDefault) event.preventDefault();
232
+ this[it.propertyKey](event, targetElement);
233
+ };
234
+ targetElement.addEventListener(type, handler, options);
235
+ bound.add(eventKey);
236
+ if (config.autoRemoveEventListeners) this._activeListeners.push({ el: targetElement, type, handler, options });
237
+ const addEventMethods = (0, import_lifecycles.getLifecycleMetadata)(this, import_lifecycles.ON_ADD_EVENT_LISTENER_METADATA_KEY);
238
+ addEventMethods?.forEach((m) => {
239
+ if (typeof this[m] === "function") this[m](targetElement, type, handler);
240
+ });
241
+ }
202
242
  }
203
- const eventKey = `event:${String(it.propertyKey)}:${type}`;
204
- if (!bound.has(eventKey)) {
205
- const handler = (event) => {
206
- if (it.options.stopImmediatePropagation) event.stopImmediatePropagation();
207
- if (it.options.stopPropagation) event.stopPropagation();
208
- if (it.options.preventDefault) event.preventDefault();
209
- this[it.propertyKey](event, targetElement);
210
- };
211
- targetElement.addEventListener(type, handler, options);
212
- bound.add(eventKey);
213
- if (config.autoRemoveEventListeners) this._activeListeners.push({ el: targetElement, type, handler, options });
214
- const addEventMethods = (0, import_lifecycles.getLifecycleMetadata)(this, import_lifecycles.ON_ADD_EVENT_LISTENER_METADATA_KEY);
215
- addEventMethods?.forEach((m) => {
216
- if (typeof this[m] === "function") this[m](targetElement, type, handler);
217
- });
218
- }
219
- }
243
+ });
220
244
  });
221
245
  });
222
246
  }
223
247
  }
224
248
  _buildStateMap() {
225
- this._stateBindings.clear();
226
- this._externalSources.clear();
227
249
  const scan = (root) => {
228
250
  const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);
229
251
  let node = null;
@@ -232,7 +254,7 @@ const elementDefine = (inConfig) => (constructor) => {
232
254
  else if (node.nodeType === Node.ELEMENT_NODE) {
233
255
  const el = node;
234
256
  const alias = el.getAttribute("as");
235
- if (alias) {
257
+ if (alias && !this._externalSources.has(alias)) {
236
258
  this._externalSources.set(alias, el);
237
259
  el.addEventListener(STATE_CHANGE_EVENT, () => this._updateState(alias));
238
260
  }
@@ -244,9 +266,12 @@ const elementDefine = (inConfig) => (constructor) => {
244
266
  scan(this);
245
267
  }
246
268
  _parseAndBind(node, type, owner) {
247
- const content = node.textContent || "";
269
+ const tplKey = `__swc_original_${this._swcId}`;
270
+ const isAlreadyBound = node.__swc_bound_ids?.has(this._swcId);
271
+ const content = node[tplKey] || node.textContent || "";
248
272
  const matches = Array.from(content.matchAll(/{{(.*?)}}/g));
249
273
  if (matches.length === 0) return;
274
+ if (isAlreadyBound) return;
250
275
  matches.forEach((match) => {
251
276
  const fullPath = match[1].trim();
252
277
  const rootName = fullPath.split(".")[0];
@@ -256,8 +281,9 @@ const elementDefine = (inConfig) => (constructor) => {
256
281
  const isSelfAlias = this.getAttribute("as") === rootName;
257
282
  if (!isState && !isLogicKey && !isExternal && !isSelfAlias) return;
258
283
  if (!this._stateBindings.has(rootName)) this._stateBindings.set(rootName, []);
259
- const tplKey = `__swc_original_${this._swcId}`;
260
284
  if (!node[tplKey]) node[tplKey] = content;
285
+ if (!node.__swc_bound_ids) node.__swc_bound_ids = /* @__PURE__ */ new Set();
286
+ node.__swc_bound_ids.add(this._swcId);
261
287
  this._stateBindings.get(rootName).push({ node, type, owner, path: fullPath });
262
288
  this._updateState(rootName);
263
289
  });
@@ -275,7 +301,9 @@ const elementDefine = (inConfig) => (constructor) => {
275
301
  const tplKey = `__swc_original_${this._swcId}`;
276
302
  bindings.forEach((bin) => {
277
303
  let text = bin.node[tplKey];
304
+ if (!text) return;
278
305
  const matches = Array.from(text.matchAll(/{{(.*?)}}/g));
306
+ let updatedText = text;
279
307
  for (const match of matches) {
280
308
  const path = match[1].trim();
281
309
  const root = path.split(".")[0];
@@ -307,14 +335,20 @@ const elementDefine = (inConfig) => (constructor) => {
307
335
  }
308
336
  if (val !== void 0) {
309
337
  const strVal = val === null || val === void 0 ? "" : typeof val === "object" ? "[Object]" : String(val);
310
- text = text.replace(match[0], strVal);
338
+ updatedText = updatedText.replace(match[0], strVal);
311
339
  if (bin.type === "attribute" && bin.owner) {
312
- if (val === null || val === void 0) bin.owner.removeAttribute(bin.attrName);
313
- else bin.owner.setAttribute(bin.attrName, text);
340
+ const attrName = bin.node.name;
341
+ if (val === null || val === void 0) bin.owner.removeAttribute(attrName);
342
+ else {
343
+ bin.owner.setAttribute(attrName, updatedText);
344
+ if ((attrName === "value" || attrName === "checked") && bin.owner.tagName.match(/INPUT|TEXTAREA|SELECT/)) {
345
+ bin.owner[attrName] = updatedText;
346
+ }
347
+ }
314
348
  }
315
349
  }
316
350
  }
317
- if (bin.type === "text") bin.node.textContent = text;
351
+ if (bin.type === "text") bin.node.textContent = updatedText;
318
352
  });
319
353
  }
320
354
  disconnectedCallback() {