@easemate/web-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +824 -0
  2. package/build/components/code/index.cjs +152 -0
  3. package/build/components/code/index.d.cts +11 -0
  4. package/build/components/code/index.d.ts +11 -0
  5. package/build/components/code/index.js +148 -0
  6. package/build/components/code/utils/highlight-api.cjs +18 -0
  7. package/build/components/code/utils/highlight-api.d.cts +7 -0
  8. package/build/components/code/utils/highlight-api.d.ts +7 -0
  9. package/build/components/code/utils/highlight-api.js +14 -0
  10. package/build/components/code/utils/syntax-grammars.cjs +62 -0
  11. package/build/components/code/utils/syntax-grammars.d.cts +7 -0
  12. package/build/components/code/utils/syntax-grammars.d.ts +7 -0
  13. package/build/components/code/utils/syntax-grammars.js +59 -0
  14. package/build/components/code/utils/syntax-highlighter-theme.cjs +27 -0
  15. package/build/components/code/utils/syntax-highlighter-theme.d.cts +3 -0
  16. package/build/components/code/utils/syntax-highlighter-theme.d.ts +3 -0
  17. package/build/components/code/utils/syntax-highlighter-theme.js +23 -0
  18. package/build/components/code/utils/syntax-highlighter-types.cjs +2 -0
  19. package/build/components/code/utils/syntax-highlighter-types.d.cts +12 -0
  20. package/build/components/code/utils/syntax-highlighter-types.d.ts +12 -0
  21. package/build/components/code/utils/syntax-highlighter-types.js +1 -0
  22. package/build/components/code/utils/syntax-tokenizer.cjs +63 -0
  23. package/build/components/code/utils/syntax-tokenizer.d.cts +3 -0
  24. package/build/components/code/utils/syntax-tokenizer.d.ts +3 -0
  25. package/build/components/code/utils/syntax-tokenizer.js +58 -0
  26. package/build/components/curve/bezier-conversion.cjs +23 -0
  27. package/build/components/curve/bezier-conversion.d.cts +2 -0
  28. package/build/components/curve/bezier-conversion.d.ts +2 -0
  29. package/build/components/curve/bezier-conversion.js +19 -0
  30. package/build/components/curve/canvas-controls.cjs +300 -0
  31. package/build/components/curve/canvas-controls.d.cts +12 -0
  32. package/build/components/curve/canvas-controls.d.ts +12 -0
  33. package/build/components/curve/canvas-controls.js +296 -0
  34. package/build/components/curve/canvas.cjs +1208 -0
  35. package/build/components/curve/canvas.d.cts +24 -0
  36. package/build/components/curve/canvas.d.ts +24 -0
  37. package/build/components/curve/canvas.js +1204 -0
  38. package/build/components/curve/constants.cjs +203 -0
  39. package/build/components/curve/constants.d.cts +23 -0
  40. package/build/components/curve/constants.d.ts +23 -0
  41. package/build/components/curve/constants.js +200 -0
  42. package/build/components/curve/controls.cjs +942 -0
  43. package/build/components/curve/controls.d.cts +37 -0
  44. package/build/components/curve/controls.d.ts +37 -0
  45. package/build/components/curve/controls.js +938 -0
  46. package/build/components/curve/index.cjs +335 -0
  47. package/build/components/curve/index.d.cts +31 -0
  48. package/build/components/curve/index.d.ts +31 -0
  49. package/build/components/curve/index.js +330 -0
  50. package/build/components/curve/output.cjs +141 -0
  51. package/build/components/curve/output.d.cts +19 -0
  52. package/build/components/curve/output.d.ts +19 -0
  53. package/build/components/curve/output.js +137 -0
  54. package/build/components/curve/styles.cjs +493 -0
  55. package/build/components/curve/styles.d.cts +6 -0
  56. package/build/components/curve/styles.d.ts +6 -0
  57. package/build/components/curve/styles.js +490 -0
  58. package/build/components/curve/svg-renderer.cjs +185 -0
  59. package/build/components/curve/svg-renderer.d.cts +9 -0
  60. package/build/components/curve/svg-renderer.d.ts +9 -0
  61. package/build/components/curve/svg-renderer.js +175 -0
  62. package/build/components/curve/toolbar.cjs +368 -0
  63. package/build/components/curve/toolbar.d.cts +26 -0
  64. package/build/components/curve/toolbar.d.ts +26 -0
  65. package/build/components/curve/toolbar.js +364 -0
  66. package/build/components/curve/types.cjs +10 -0
  67. package/build/components/curve/types.d.cts +33 -0
  68. package/build/components/curve/types.d.ts +33 -0
  69. package/build/components/curve/types.js +7 -0
  70. package/build/components/curve/utils.cjs +541 -0
  71. package/build/components/curve/utils.d.cts +33 -0
  72. package/build/components/curve/utils.d.ts +33 -0
  73. package/build/components/curve/utils.js +521 -0
  74. package/build/components/index.cjs +18 -0
  75. package/build/components/index.d.cts +2 -0
  76. package/build/components/index.d.ts +2 -0
  77. package/build/components/index.js +2 -0
  78. package/build/decorators/Component.cjs +127 -0
  79. package/build/decorators/Component.d.cts +28 -0
  80. package/build/decorators/Component.d.ts +28 -0
  81. package/build/decorators/Component.js +123 -0
  82. package/build/decorators/Listen.cjs +154 -0
  83. package/build/decorators/Listen.d.cts +18 -0
  84. package/build/decorators/Listen.d.ts +18 -0
  85. package/build/decorators/Listen.js +151 -0
  86. package/build/decorators/OutsideClick.cjs +64 -0
  87. package/build/decorators/OutsideClick.d.cts +16 -0
  88. package/build/decorators/OutsideClick.d.ts +16 -0
  89. package/build/decorators/OutsideClick.js +59 -0
  90. package/build/decorators/Prop.cjs +273 -0
  91. package/build/decorators/Prop.d.cts +22 -0
  92. package/build/decorators/Prop.d.ts +22 -0
  93. package/build/decorators/Prop.js +270 -0
  94. package/build/decorators/Query.cjs +79 -0
  95. package/build/decorators/Query.d.cts +27 -0
  96. package/build/decorators/Query.d.ts +27 -0
  97. package/build/decorators/Query.js +76 -0
  98. package/build/decorators/Watch.cjs +52 -0
  99. package/build/decorators/Watch.d.cts +11 -0
  100. package/build/decorators/Watch.d.ts +11 -0
  101. package/build/decorators/Watch.js +49 -0
  102. package/build/decorators/index.cjs +15 -0
  103. package/build/decorators/index.d.cts +6 -0
  104. package/build/decorators/index.d.ts +6 -0
  105. package/build/decorators/index.js +6 -0
  106. package/build/elements/button/index.cjs +214 -0
  107. package/build/elements/button/index.d.cts +11 -0
  108. package/build/elements/button/index.d.ts +11 -0
  109. package/build/elements/button/index.js +210 -0
  110. package/build/elements/checkbox/index.cjs +316 -0
  111. package/build/elements/checkbox/index.d.cts +14 -0
  112. package/build/elements/checkbox/index.d.ts +14 -0
  113. package/build/elements/checkbox/index.js +312 -0
  114. package/build/elements/color/index.cjs +154 -0
  115. package/build/elements/color/index.d.cts +18 -0
  116. package/build/elements/color/index.d.ts +18 -0
  117. package/build/elements/color/index.js +150 -0
  118. package/build/elements/color/picker.cjs +544 -0
  119. package/build/elements/color/picker.d.cts +37 -0
  120. package/build/elements/color/picker.d.ts +37 -0
  121. package/build/elements/color/picker.js +540 -0
  122. package/build/elements/color/utils.cjs +235 -0
  123. package/build/elements/color/utils.d.cts +37 -0
  124. package/build/elements/color/utils.d.ts +37 -0
  125. package/build/elements/color/utils.js +218 -0
  126. package/build/elements/dropdown/index.cjs +875 -0
  127. package/build/elements/dropdown/index.d.cts +30 -0
  128. package/build/elements/dropdown/index.d.ts +30 -0
  129. package/build/elements/dropdown/index.js +871 -0
  130. package/build/elements/field/index.cjs +82 -0
  131. package/build/elements/field/index.d.cts +4 -0
  132. package/build/elements/field/index.d.ts +4 -0
  133. package/build/elements/field/index.js +78 -0
  134. package/build/elements/icons/animation/chevron.cjs +57 -0
  135. package/build/elements/icons/animation/chevron.d.cts +10 -0
  136. package/build/elements/icons/animation/chevron.d.ts +10 -0
  137. package/build/elements/icons/animation/chevron.js +53 -0
  138. package/build/elements/icons/animation/clear.cjs +74 -0
  139. package/build/elements/icons/animation/clear.d.cts +3 -0
  140. package/build/elements/icons/animation/clear.d.ts +3 -0
  141. package/build/elements/icons/animation/clear.js +70 -0
  142. package/build/elements/icons/animation/grid.cjs +77 -0
  143. package/build/elements/icons/animation/grid.d.cts +8 -0
  144. package/build/elements/icons/animation/grid.d.ts +8 -0
  145. package/build/elements/icons/animation/grid.js +73 -0
  146. package/build/elements/icons/animation/loading.cjs +68 -0
  147. package/build/elements/icons/animation/loading.d.cts +3 -0
  148. package/build/elements/icons/animation/loading.d.ts +3 -0
  149. package/build/elements/icons/animation/loading.js +64 -0
  150. package/build/elements/icons/animation/snap.cjs +133 -0
  151. package/build/elements/icons/animation/snap.d.cts +8 -0
  152. package/build/elements/icons/animation/snap.d.ts +8 -0
  153. package/build/elements/icons/animation/snap.js +129 -0
  154. package/build/elements/icons/index.cjs +40 -0
  155. package/build/elements/icons/index.d.cts +24 -0
  156. package/build/elements/icons/index.d.ts +24 -0
  157. package/build/elements/icons/index.js +24 -0
  158. package/build/elements/icons/interface/anchor-add.cjs +35 -0
  159. package/build/elements/icons/interface/anchor-add.d.cts +3 -0
  160. package/build/elements/icons/interface/anchor-add.d.ts +3 -0
  161. package/build/elements/icons/interface/anchor-add.js +31 -0
  162. package/build/elements/icons/interface/anchor-remove.cjs +34 -0
  163. package/build/elements/icons/interface/anchor-remove.d.cts +3 -0
  164. package/build/elements/icons/interface/anchor-remove.d.ts +3 -0
  165. package/build/elements/icons/interface/anchor-remove.js +30 -0
  166. package/build/elements/icons/interface/arrow-up.cjs +30 -0
  167. package/build/elements/icons/interface/arrow-up.d.cts +3 -0
  168. package/build/elements/icons/interface/arrow-up.d.ts +3 -0
  169. package/build/elements/icons/interface/arrow-up.js +26 -0
  170. package/build/elements/icons/interface/arrows-vertical.cjs +30 -0
  171. package/build/elements/icons/interface/arrows-vertical.d.cts +3 -0
  172. package/build/elements/icons/interface/arrows-vertical.d.ts +3 -0
  173. package/build/elements/icons/interface/arrows-vertical.js +26 -0
  174. package/build/elements/icons/interface/bezier-angle.cjs +33 -0
  175. package/build/elements/icons/interface/bezier-angle.d.cts +3 -0
  176. package/build/elements/icons/interface/bezier-angle.d.ts +3 -0
  177. package/build/elements/icons/interface/bezier-angle.js +29 -0
  178. package/build/elements/icons/interface/bezier-distribute.cjs +34 -0
  179. package/build/elements/icons/interface/bezier-distribute.d.cts +3 -0
  180. package/build/elements/icons/interface/bezier-distribute.d.ts +3 -0
  181. package/build/elements/icons/interface/bezier-distribute.js +30 -0
  182. package/build/elements/icons/interface/bezier-length.cjs +31 -0
  183. package/build/elements/icons/interface/bezier-length.d.cts +3 -0
  184. package/build/elements/icons/interface/bezier-length.d.ts +3 -0
  185. package/build/elements/icons/interface/bezier-length.js +27 -0
  186. package/build/elements/icons/interface/bezier-mirror.cjs +31 -0
  187. package/build/elements/icons/interface/bezier-mirror.d.cts +3 -0
  188. package/build/elements/icons/interface/bezier-mirror.d.ts +3 -0
  189. package/build/elements/icons/interface/bezier-mirror.js +27 -0
  190. package/build/elements/icons/interface/bezier.cjs +26 -0
  191. package/build/elements/icons/interface/bezier.d.cts +3 -0
  192. package/build/elements/icons/interface/bezier.d.ts +3 -0
  193. package/build/elements/icons/interface/bezier.js +22 -0
  194. package/build/elements/icons/interface/check.cjs +30 -0
  195. package/build/elements/icons/interface/check.d.cts +3 -0
  196. package/build/elements/icons/interface/check.d.ts +3 -0
  197. package/build/elements/icons/interface/check.js +26 -0
  198. package/build/elements/icons/interface/circle-arrow-left.cjs +30 -0
  199. package/build/elements/icons/interface/circle-arrow-left.d.cts +3 -0
  200. package/build/elements/icons/interface/circle-arrow-left.d.ts +3 -0
  201. package/build/elements/icons/interface/circle-arrow-left.js +26 -0
  202. package/build/elements/icons/interface/circle-arrow-right.cjs +30 -0
  203. package/build/elements/icons/interface/circle-arrow-right.d.cts +3 -0
  204. package/build/elements/icons/interface/circle-arrow-right.d.ts +3 -0
  205. package/build/elements/icons/interface/circle-arrow-right.js +26 -0
  206. package/build/elements/icons/interface/code.cjs +30 -0
  207. package/build/elements/icons/interface/code.d.cts +3 -0
  208. package/build/elements/icons/interface/code.d.ts +3 -0
  209. package/build/elements/icons/interface/code.js +26 -0
  210. package/build/elements/icons/interface/dots.cjs +32 -0
  211. package/build/elements/icons/interface/dots.d.cts +3 -0
  212. package/build/elements/icons/interface/dots.d.ts +3 -0
  213. package/build/elements/icons/interface/dots.js +28 -0
  214. package/build/elements/icons/interface/mention.cjs +30 -0
  215. package/build/elements/icons/interface/mention.d.cts +3 -0
  216. package/build/elements/icons/interface/mention.d.ts +3 -0
  217. package/build/elements/icons/interface/mention.js +26 -0
  218. package/build/elements/icons/interface/minus.cjs +30 -0
  219. package/build/elements/icons/interface/minus.d.cts +3 -0
  220. package/build/elements/icons/interface/minus.d.ts +3 -0
  221. package/build/elements/icons/interface/minus.js +26 -0
  222. package/build/elements/icons/interface/picker.cjs +34 -0
  223. package/build/elements/icons/interface/picker.d.cts +3 -0
  224. package/build/elements/icons/interface/picker.d.ts +3 -0
  225. package/build/elements/icons/interface/picker.js +30 -0
  226. package/build/elements/icons/interface/plus.cjs +30 -0
  227. package/build/elements/icons/interface/plus.d.cts +3 -0
  228. package/build/elements/icons/interface/plus.d.ts +3 -0
  229. package/build/elements/icons/interface/plus.js +26 -0
  230. package/build/elements/icons/interface/settings.cjs +30 -0
  231. package/build/elements/icons/interface/settings.d.cts +3 -0
  232. package/build/elements/icons/interface/settings.d.ts +3 -0
  233. package/build/elements/icons/interface/settings.js +26 -0
  234. package/build/elements/index.cjs +62 -0
  235. package/build/elements/index.d.cts +22 -0
  236. package/build/elements/index.d.ts +22 -0
  237. package/build/elements/index.js +22 -0
  238. package/build/elements/input/index.cjs +273 -0
  239. package/build/elements/input/index.d.cts +17 -0
  240. package/build/elements/input/index.d.ts +17 -0
  241. package/build/elements/input/index.js +269 -0
  242. package/build/elements/logo/index.cjs +732 -0
  243. package/build/elements/logo/index.d.cts +17 -0
  244. package/build/elements/logo/index.d.ts +17 -0
  245. package/build/elements/logo/index.js +728 -0
  246. package/build/elements/monitor/fps.cjs +432 -0
  247. package/build/elements/monitor/fps.d.cts +21 -0
  248. package/build/elements/monitor/fps.d.ts +21 -0
  249. package/build/elements/monitor/fps.js +428 -0
  250. package/build/elements/monitor/index.cjs +670 -0
  251. package/build/elements/monitor/index.d.cts +112 -0
  252. package/build/elements/monitor/index.d.ts +112 -0
  253. package/build/elements/monitor/index.js +666 -0
  254. package/build/elements/number/index.cjs +173 -0
  255. package/build/elements/number/index.d.cts +19 -0
  256. package/build/elements/number/index.d.ts +19 -0
  257. package/build/elements/number/index.js +169 -0
  258. package/build/elements/origin/index.cjs +169 -0
  259. package/build/elements/origin/index.d.cts +12 -0
  260. package/build/elements/origin/index.d.ts +12 -0
  261. package/build/elements/origin/index.js +165 -0
  262. package/build/elements/popover/index.cjs +209 -0
  263. package/build/elements/popover/index.d.cts +19 -0
  264. package/build/elements/popover/index.d.ts +19 -0
  265. package/build/elements/popover/index.js +205 -0
  266. package/build/elements/radio/index.cjs +301 -0
  267. package/build/elements/radio/index.d.cts +13 -0
  268. package/build/elements/radio/index.d.ts +13 -0
  269. package/build/elements/radio/index.js +283 -0
  270. package/build/elements/radio/input.cjs +329 -0
  271. package/build/elements/radio/input.d.cts +15 -0
  272. package/build/elements/radio/input.d.ts +15 -0
  273. package/build/elements/radio/input.js +325 -0
  274. package/build/elements/radio/option.cjs +15 -0
  275. package/build/elements/radio/option.d.cts +3 -0
  276. package/build/elements/radio/option.d.ts +3 -0
  277. package/build/elements/radio/option.js +11 -0
  278. package/build/elements/shared.cjs +66 -0
  279. package/build/elements/shared.d.cts +40 -0
  280. package/build/elements/shared.d.ts +40 -0
  281. package/build/elements/shared.js +59 -0
  282. package/build/elements/slider/index.cjs +232 -0
  283. package/build/elements/slider/index.d.cts +20 -0
  284. package/build/elements/slider/index.d.ts +20 -0
  285. package/build/elements/slider/index.js +228 -0
  286. package/build/elements/state/index.cjs +681 -0
  287. package/build/elements/state/index.d.cts +86 -0
  288. package/build/elements/state/index.d.ts +86 -0
  289. package/build/elements/state/index.js +677 -0
  290. package/build/elements/toggle/index.cjs +151 -0
  291. package/build/elements/toggle/index.d.cts +9 -0
  292. package/build/elements/toggle/index.d.ts +9 -0
  293. package/build/elements/toggle/index.js +147 -0
  294. package/build/elements/tooltip/index.cjs +187 -0
  295. package/build/elements/tooltip/index.d.cts +17 -0
  296. package/build/elements/tooltip/index.d.ts +17 -0
  297. package/build/elements/tooltip/index.js +183 -0
  298. package/build/index.cjs +40 -0
  299. package/build/index.d.cts +6 -0
  300. package/build/index.d.ts +6 -0
  301. package/build/index.js +12 -0
  302. package/build/init.cjs +325 -0
  303. package/build/init.d.cts +157 -0
  304. package/build/init.d.ts +157 -0
  305. package/build/init.js +289 -0
  306. package/build/internal/component-loaders.cjs +206 -0
  307. package/build/internal/component-loaders.d.cts +52 -0
  308. package/build/internal/component-loaders.d.ts +52 -0
  309. package/build/internal/component-loaders.js +167 -0
  310. package/build/internal/fonts.cjs +128 -0
  311. package/build/internal/fonts.d.cts +32 -0
  312. package/build/internal/fonts.d.ts +32 -0
  313. package/build/internal/fonts.js +123 -0
  314. package/build/internal/lazy-load.cjs +89 -0
  315. package/build/internal/lazy-load.d.cts +32 -0
  316. package/build/internal/lazy-load.d.ts +32 -0
  317. package/build/internal/lazy-load.js +86 -0
  318. package/build/internal/style-inject.cjs +236 -0
  319. package/build/internal/style-inject.d.cts +44 -0
  320. package/build/internal/style-inject.d.ts +44 -0
  321. package/build/internal/style-inject.js +226 -0
  322. package/build/register.cjs +36 -0
  323. package/build/register.d.cts +32 -0
  324. package/build/register.d.ts +32 -0
  325. package/build/register.js +34 -0
  326. package/build/theme/index.cjs +452 -0
  327. package/build/theme/index.d.cts +146 -0
  328. package/build/theme/index.d.ts +146 -0
  329. package/build/theme/index.js +423 -0
  330. package/build/theme/presets.cjs +54 -0
  331. package/build/theme/presets.d.cts +19 -0
  332. package/build/theme/presets.d.ts +19 -0
  333. package/build/theme/presets.js +51 -0
  334. package/build/theme/registry.cjs +204 -0
  335. package/build/theme/registry.d.cts +99 -0
  336. package/build/theme/registry.d.ts +99 -0
  337. package/build/theme/registry.js +194 -0
  338. package/build/theme/tokens.cjs +148 -0
  339. package/build/theme/tokens.d.cts +163 -0
  340. package/build/theme/tokens.d.ts +163 -0
  341. package/build/theme/tokens.js +145 -0
  342. package/build/utils/dismiss-controller.cjs +77 -0
  343. package/build/utils/dismiss-controller.d.cts +14 -0
  344. package/build/utils/dismiss-controller.d.ts +14 -0
  345. package/build/utils/dismiss-controller.js +73 -0
  346. package/build/utils/index.cjs +18 -0
  347. package/build/utils/index.d.cts +3 -0
  348. package/build/utils/index.d.ts +3 -0
  349. package/build/utils/index.js +3 -0
  350. package/build/utils/outside-click.cjs +82 -0
  351. package/build/utils/outside-click.d.cts +18 -0
  352. package/build/utils/outside-click.d.ts +18 -0
  353. package/build/utils/outside-click.js +74 -0
  354. package/build/utils/template-helpers.cjs +39 -0
  355. package/build/utils/template-helpers.d.cts +13 -0
  356. package/build/utils/template-helpers.d.ts +13 -0
  357. package/build/utils/template-helpers.js +28 -0
  358. package/package.json +96 -0
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Prop = Prop;
4
+ const renderQueue = new WeakMap();
5
+ const cleanupRegistry = new WeakMap();
6
+ const observerRegistry = new WeakMap();
7
+ const internalMutations = new WeakMap();
8
+ const scheduleRender = (instance) => {
9
+ if (typeof instance.requestRender === 'function') {
10
+ instance.requestRender();
11
+ return;
12
+ }
13
+ if (typeof instance.render !== 'function') {
14
+ return;
15
+ }
16
+ if (renderQueue.get(instance)) {
17
+ return;
18
+ }
19
+ renderQueue.set(instance, true);
20
+ requestAnimationFrame(() => {
21
+ renderQueue.delete(instance);
22
+ instance.render?.();
23
+ });
24
+ };
25
+ const toKebabCase = (value) => String(value)
26
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
27
+ .replace(/[_\s]+/g, '-')
28
+ .toLowerCase();
29
+ const registerCleanup = (instance, cleanup) => {
30
+ let callbacks = cleanupRegistry.get(instance);
31
+ if (!callbacks) {
32
+ callbacks = new Set();
33
+ cleanupRegistry.set(instance, callbacks);
34
+ const original = instance.disconnectedCallback;
35
+ instance.disconnectedCallback = function (...args) {
36
+ const registered = cleanupRegistry.get(this);
37
+ registered?.forEach((callback) => {
38
+ try {
39
+ callback();
40
+ }
41
+ catch (error) {
42
+ console.error('[Prop] cleanup failed', error);
43
+ }
44
+ });
45
+ cleanupRegistry.delete(this);
46
+ if (typeof original === 'function') {
47
+ return original.apply(this, args);
48
+ }
49
+ return undefined;
50
+ };
51
+ }
52
+ callbacks.add(cleanup);
53
+ };
54
+ const markInternalMutation = (host, attribute) => {
55
+ let attributes = internalMutations.get(host);
56
+ if (!attributes) {
57
+ attributes = new Set();
58
+ internalMutations.set(host, attributes);
59
+ }
60
+ attributes.add(attribute);
61
+ };
62
+ const isInternalMutation = (host, attribute) => {
63
+ const attributes = internalMutations.get(host);
64
+ if (!attributes) {
65
+ return false;
66
+ }
67
+ const hasAttribute = attributes.has(attribute);
68
+ if (hasAttribute) {
69
+ attributes.delete(attribute);
70
+ if (attributes.size === 0) {
71
+ internalMutations.delete(host);
72
+ }
73
+ }
74
+ return hasAttribute;
75
+ };
76
+ const observeAttribute = (host, attribute, handler) => {
77
+ let entry = observerRegistry.get(host);
78
+ if (!entry) {
79
+ const callbacks = new Map();
80
+ const observer = new MutationObserver((records) => {
81
+ records.forEach((record) => {
82
+ const attributeName = record.attributeName;
83
+ if (!attributeName) {
84
+ return;
85
+ }
86
+ if (isInternalMutation(host, attributeName)) {
87
+ return;
88
+ }
89
+ const listeners = callbacks.get(attributeName);
90
+ if (!listeners) {
91
+ return;
92
+ }
93
+ const currentValue = record.target.getAttribute(attributeName);
94
+ for (const listener of listeners) {
95
+ listener(currentValue);
96
+ }
97
+ });
98
+ });
99
+ observer.observe(host, { attributes: true });
100
+ entry = { observer, callbacks };
101
+ observerRegistry.set(host, entry);
102
+ registerCleanup(host, () => {
103
+ observer.disconnect();
104
+ observerRegistry.delete(host);
105
+ });
106
+ }
107
+ let listeners = entry.callbacks.get(attribute);
108
+ if (!listeners) {
109
+ listeners = new Set();
110
+ entry.callbacks.set(attribute, listeners);
111
+ }
112
+ listeners.add(handler);
113
+ };
114
+ const updateAttribute = (host, attribute, value) => {
115
+ markInternalMutation(host, attribute);
116
+ if (value === undefined || value === null || value === false) {
117
+ host.removeAttribute(attribute);
118
+ return;
119
+ }
120
+ if (value === true) {
121
+ host.setAttribute(attribute, '');
122
+ return;
123
+ }
124
+ host.setAttribute(attribute, String(value));
125
+ };
126
+ const resolveType = (type) => {
127
+ if (!type) {
128
+ return null;
129
+ }
130
+ if (type === Boolean || type === 'boolean') {
131
+ return 'boolean';
132
+ }
133
+ if (type === Number || type === 'number') {
134
+ return 'number';
135
+ }
136
+ if (type === Object || type === Array || type === 'json') {
137
+ return 'json';
138
+ }
139
+ return 'string';
140
+ };
141
+ const typeParsers = {
142
+ boolean(value) {
143
+ return value !== null;
144
+ },
145
+ number(value) {
146
+ if (value === null || value === '') {
147
+ return null;
148
+ }
149
+ const parsed = Number(value);
150
+ return Number.isNaN(parsed) ? null : parsed;
151
+ },
152
+ json(value) {
153
+ if (!value) {
154
+ return null;
155
+ }
156
+ try {
157
+ return JSON.parse(value);
158
+ }
159
+ catch (error) {
160
+ console.warn('[Prop] failed to parse JSON attribute', error);
161
+ return null;
162
+ }
163
+ },
164
+ string(value) {
165
+ return value;
166
+ }
167
+ };
168
+ const typeFormatters = {
169
+ boolean(value) {
170
+ return value ? '' : null;
171
+ },
172
+ number(value) {
173
+ if (value === null || value === undefined || value === '') {
174
+ return null;
175
+ }
176
+ return String(value);
177
+ },
178
+ json(value) {
179
+ if (value === null || value === undefined) {
180
+ return null;
181
+ }
182
+ try {
183
+ return JSON.stringify(value);
184
+ }
185
+ catch {
186
+ return null;
187
+ }
188
+ },
189
+ string(value) {
190
+ if (value === null || value === undefined) {
191
+ return null;
192
+ }
193
+ return String(value);
194
+ }
195
+ };
196
+ const defaultCompare = (previous, next) => previous === next;
197
+ function Prop(options = {}) {
198
+ const { attribute, reflect = true, type, parse, format, defaultValue, compare = defaultCompare, onChange, onAttributeChange } = options;
199
+ const resolvedType = resolveType(type);
200
+ const parseValue = parse
201
+ ? parse
202
+ : function (value) {
203
+ if (!resolvedType) {
204
+ return value;
205
+ }
206
+ return typeParsers[resolvedType].call(this, value);
207
+ };
208
+ const formatValue = format
209
+ ? format
210
+ : function (value) {
211
+ if (!resolvedType) {
212
+ return value ?? null;
213
+ }
214
+ return typeFormatters[resolvedType].call(this, value);
215
+ };
216
+ return (accessor, context) => {
217
+ if (context.kind !== 'accessor') {
218
+ throw new Error('@Prop requires the "accessor" keyword on the property.');
219
+ }
220
+ const attributeName = attribute ?? toKebabCase(context.name);
221
+ context.addInitializer(function () {
222
+ if (!reflect) {
223
+ return;
224
+ }
225
+ observeAttribute(this, attributeName, (rawValue) => {
226
+ if (isInternalMutation(this, attributeName)) {
227
+ return;
228
+ }
229
+ const parsed = parseValue.call(this, rawValue);
230
+ const previous = accessor.get.call(this);
231
+ if (compare(previous, parsed)) {
232
+ return;
233
+ }
234
+ accessor.set.call(this, parsed);
235
+ onAttributeChange?.call(this, parsed, previous);
236
+ scheduleRender(this);
237
+ });
238
+ });
239
+ return {
240
+ get() {
241
+ return accessor.get.call(this);
242
+ },
243
+ set(value) {
244
+ const previous = accessor.get.call(this);
245
+ if (compare(previous, value)) {
246
+ return;
247
+ }
248
+ accessor.set.call(this, value);
249
+ if (reflect) {
250
+ const formatted = formatValue.call(this, value);
251
+ updateAttribute(this, attributeName, formatted);
252
+ }
253
+ onChange?.call(this, value, previous);
254
+ scheduleRender(this);
255
+ },
256
+ init(initialValue) {
257
+ let value = initialValue;
258
+ if (this.hasAttribute(attributeName)) {
259
+ value = parseValue.call(this, this.getAttribute(attributeName));
260
+ }
261
+ else if (value === undefined && defaultValue !== undefined) {
262
+ value =
263
+ typeof defaultValue === 'function' ? defaultValue.call(this) : defaultValue;
264
+ }
265
+ if (reflect) {
266
+ const formatted = formatValue.call(this, value);
267
+ updateAttribute(this, attributeName, formatted);
268
+ }
269
+ return value;
270
+ }
271
+ };
272
+ };
273
+ }
@@ -0,0 +1,22 @@
1
+ type RenderHost = HTMLElement & {
2
+ requestRender?(): void;
3
+ render?(): void;
4
+ connectedCallback?(): void;
5
+ disconnectedCallback?(...args: unknown[]): void;
6
+ };
7
+ type PropTypeDescriptor = BooleanConstructor | NumberConstructor | StringConstructor | ObjectConstructor | ArrayConstructor | 'boolean' | 'number' | 'string' | 'json';
8
+ type Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;
9
+ type Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;
10
+ interface PropOptions<TValue, THost extends RenderHost> {
11
+ attribute?: string;
12
+ reflect?: boolean;
13
+ type?: PropTypeDescriptor;
14
+ parse?: Parser<TValue, THost>;
15
+ format?: Formatter<TValue, THost>;
16
+ defaultValue?: TValue | ((this: THost) => TValue);
17
+ compare?: (previous: TValue, next: TValue) => boolean;
18
+ onChange?: (this: THost, next: TValue, previous: TValue) => void;
19
+ onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;
20
+ }
21
+ export declare function Prop<TValue, THost extends RenderHost = RenderHost>(options?: PropOptions<TValue, THost>): (accessor: ClassAccessorDecoratorTarget<THost, TValue>, context: ClassAccessorDecoratorContext<THost, TValue>) => ClassAccessorDecoratorResult<THost, TValue>;
22
+ export {};
@@ -0,0 +1,22 @@
1
+ type RenderHost = HTMLElement & {
2
+ requestRender?(): void;
3
+ render?(): void;
4
+ connectedCallback?(): void;
5
+ disconnectedCallback?(...args: unknown[]): void;
6
+ };
7
+ type PropTypeDescriptor = BooleanConstructor | NumberConstructor | StringConstructor | ObjectConstructor | ArrayConstructor | 'boolean' | 'number' | 'string' | 'json';
8
+ type Formatter<TValue, THost extends RenderHost> = (this: THost, value: TValue) => string | null | undefined;
9
+ type Parser<TValue, THost extends RenderHost> = (this: THost, value: string | null) => TValue;
10
+ interface PropOptions<TValue, THost extends RenderHost> {
11
+ attribute?: string;
12
+ reflect?: boolean;
13
+ type?: PropTypeDescriptor;
14
+ parse?: Parser<TValue, THost>;
15
+ format?: Formatter<TValue, THost>;
16
+ defaultValue?: TValue | ((this: THost) => TValue);
17
+ compare?: (previous: TValue, next: TValue) => boolean;
18
+ onChange?: (this: THost, next: TValue, previous: TValue) => void;
19
+ onAttributeChange?: (this: THost, next: TValue, previous: TValue) => void;
20
+ }
21
+ export declare function Prop<TValue, THost extends RenderHost = RenderHost>(options?: PropOptions<TValue, THost>): (accessor: ClassAccessorDecoratorTarget<THost, TValue>, context: ClassAccessorDecoratorContext<THost, TValue>) => ClassAccessorDecoratorResult<THost, TValue>;
22
+ export {};
@@ -0,0 +1,270 @@
1
+ const renderQueue = new WeakMap();
2
+ const cleanupRegistry = new WeakMap();
3
+ const observerRegistry = new WeakMap();
4
+ const internalMutations = new WeakMap();
5
+ const scheduleRender = (instance) => {
6
+ if (typeof instance.requestRender === 'function') {
7
+ instance.requestRender();
8
+ return;
9
+ }
10
+ if (typeof instance.render !== 'function') {
11
+ return;
12
+ }
13
+ if (renderQueue.get(instance)) {
14
+ return;
15
+ }
16
+ renderQueue.set(instance, true);
17
+ requestAnimationFrame(() => {
18
+ renderQueue.delete(instance);
19
+ instance.render?.();
20
+ });
21
+ };
22
+ const toKebabCase = (value) => String(value)
23
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
24
+ .replace(/[_\s]+/g, '-')
25
+ .toLowerCase();
26
+ const registerCleanup = (instance, cleanup) => {
27
+ let callbacks = cleanupRegistry.get(instance);
28
+ if (!callbacks) {
29
+ callbacks = new Set();
30
+ cleanupRegistry.set(instance, callbacks);
31
+ const original = instance.disconnectedCallback;
32
+ instance.disconnectedCallback = function (...args) {
33
+ const registered = cleanupRegistry.get(this);
34
+ registered?.forEach((callback) => {
35
+ try {
36
+ callback();
37
+ }
38
+ catch (error) {
39
+ console.error('[Prop] cleanup failed', error);
40
+ }
41
+ });
42
+ cleanupRegistry.delete(this);
43
+ if (typeof original === 'function') {
44
+ return original.apply(this, args);
45
+ }
46
+ return undefined;
47
+ };
48
+ }
49
+ callbacks.add(cleanup);
50
+ };
51
+ const markInternalMutation = (host, attribute) => {
52
+ let attributes = internalMutations.get(host);
53
+ if (!attributes) {
54
+ attributes = new Set();
55
+ internalMutations.set(host, attributes);
56
+ }
57
+ attributes.add(attribute);
58
+ };
59
+ const isInternalMutation = (host, attribute) => {
60
+ const attributes = internalMutations.get(host);
61
+ if (!attributes) {
62
+ return false;
63
+ }
64
+ const hasAttribute = attributes.has(attribute);
65
+ if (hasAttribute) {
66
+ attributes.delete(attribute);
67
+ if (attributes.size === 0) {
68
+ internalMutations.delete(host);
69
+ }
70
+ }
71
+ return hasAttribute;
72
+ };
73
+ const observeAttribute = (host, attribute, handler) => {
74
+ let entry = observerRegistry.get(host);
75
+ if (!entry) {
76
+ const callbacks = new Map();
77
+ const observer = new MutationObserver((records) => {
78
+ records.forEach((record) => {
79
+ const attributeName = record.attributeName;
80
+ if (!attributeName) {
81
+ return;
82
+ }
83
+ if (isInternalMutation(host, attributeName)) {
84
+ return;
85
+ }
86
+ const listeners = callbacks.get(attributeName);
87
+ if (!listeners) {
88
+ return;
89
+ }
90
+ const currentValue = record.target.getAttribute(attributeName);
91
+ for (const listener of listeners) {
92
+ listener(currentValue);
93
+ }
94
+ });
95
+ });
96
+ observer.observe(host, { attributes: true });
97
+ entry = { observer, callbacks };
98
+ observerRegistry.set(host, entry);
99
+ registerCleanup(host, () => {
100
+ observer.disconnect();
101
+ observerRegistry.delete(host);
102
+ });
103
+ }
104
+ let listeners = entry.callbacks.get(attribute);
105
+ if (!listeners) {
106
+ listeners = new Set();
107
+ entry.callbacks.set(attribute, listeners);
108
+ }
109
+ listeners.add(handler);
110
+ };
111
+ const updateAttribute = (host, attribute, value) => {
112
+ markInternalMutation(host, attribute);
113
+ if (value === undefined || value === null || value === false) {
114
+ host.removeAttribute(attribute);
115
+ return;
116
+ }
117
+ if (value === true) {
118
+ host.setAttribute(attribute, '');
119
+ return;
120
+ }
121
+ host.setAttribute(attribute, String(value));
122
+ };
123
+ const resolveType = (type) => {
124
+ if (!type) {
125
+ return null;
126
+ }
127
+ if (type === Boolean || type === 'boolean') {
128
+ return 'boolean';
129
+ }
130
+ if (type === Number || type === 'number') {
131
+ return 'number';
132
+ }
133
+ if (type === Object || type === Array || type === 'json') {
134
+ return 'json';
135
+ }
136
+ return 'string';
137
+ };
138
+ const typeParsers = {
139
+ boolean(value) {
140
+ return value !== null;
141
+ },
142
+ number(value) {
143
+ if (value === null || value === '') {
144
+ return null;
145
+ }
146
+ const parsed = Number(value);
147
+ return Number.isNaN(parsed) ? null : parsed;
148
+ },
149
+ json(value) {
150
+ if (!value) {
151
+ return null;
152
+ }
153
+ try {
154
+ return JSON.parse(value);
155
+ }
156
+ catch (error) {
157
+ console.warn('[Prop] failed to parse JSON attribute', error);
158
+ return null;
159
+ }
160
+ },
161
+ string(value) {
162
+ return value;
163
+ }
164
+ };
165
+ const typeFormatters = {
166
+ boolean(value) {
167
+ return value ? '' : null;
168
+ },
169
+ number(value) {
170
+ if (value === null || value === undefined || value === '') {
171
+ return null;
172
+ }
173
+ return String(value);
174
+ },
175
+ json(value) {
176
+ if (value === null || value === undefined) {
177
+ return null;
178
+ }
179
+ try {
180
+ return JSON.stringify(value);
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ },
186
+ string(value) {
187
+ if (value === null || value === undefined) {
188
+ return null;
189
+ }
190
+ return String(value);
191
+ }
192
+ };
193
+ const defaultCompare = (previous, next) => previous === next;
194
+ export function Prop(options = {}) {
195
+ const { attribute, reflect = true, type, parse, format, defaultValue, compare = defaultCompare, onChange, onAttributeChange } = options;
196
+ const resolvedType = resolveType(type);
197
+ const parseValue = parse
198
+ ? parse
199
+ : function (value) {
200
+ if (!resolvedType) {
201
+ return value;
202
+ }
203
+ return typeParsers[resolvedType].call(this, value);
204
+ };
205
+ const formatValue = format
206
+ ? format
207
+ : function (value) {
208
+ if (!resolvedType) {
209
+ return value ?? null;
210
+ }
211
+ return typeFormatters[resolvedType].call(this, value);
212
+ };
213
+ return (accessor, context) => {
214
+ if (context.kind !== 'accessor') {
215
+ throw new Error('@Prop requires the "accessor" keyword on the property.');
216
+ }
217
+ const attributeName = attribute ?? toKebabCase(context.name);
218
+ context.addInitializer(function () {
219
+ if (!reflect) {
220
+ return;
221
+ }
222
+ observeAttribute(this, attributeName, (rawValue) => {
223
+ if (isInternalMutation(this, attributeName)) {
224
+ return;
225
+ }
226
+ const parsed = parseValue.call(this, rawValue);
227
+ const previous = accessor.get.call(this);
228
+ if (compare(previous, parsed)) {
229
+ return;
230
+ }
231
+ accessor.set.call(this, parsed);
232
+ onAttributeChange?.call(this, parsed, previous);
233
+ scheduleRender(this);
234
+ });
235
+ });
236
+ return {
237
+ get() {
238
+ return accessor.get.call(this);
239
+ },
240
+ set(value) {
241
+ const previous = accessor.get.call(this);
242
+ if (compare(previous, value)) {
243
+ return;
244
+ }
245
+ accessor.set.call(this, value);
246
+ if (reflect) {
247
+ const formatted = formatValue.call(this, value);
248
+ updateAttribute(this, attributeName, formatted);
249
+ }
250
+ onChange?.call(this, value, previous);
251
+ scheduleRender(this);
252
+ },
253
+ init(initialValue) {
254
+ let value = initialValue;
255
+ if (this.hasAttribute(attributeName)) {
256
+ value = parseValue.call(this, this.getAttribute(attributeName));
257
+ }
258
+ else if (value === undefined && defaultValue !== undefined) {
259
+ value =
260
+ typeof defaultValue === 'function' ? defaultValue.call(this) : defaultValue;
261
+ }
262
+ if (reflect) {
263
+ const formatted = formatValue.call(this, value);
264
+ updateAttribute(this, attributeName, formatted);
265
+ }
266
+ return value;
267
+ }
268
+ };
269
+ };
270
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Query = Query;
4
+ const defaultOptions = {
5
+ all: false,
6
+ closest: false,
7
+ from: 'shadow',
8
+ fallback: null
9
+ };
10
+ const resolveFallback = (fallback, host) => {
11
+ if (typeof fallback === 'function') {
12
+ return fallback(host);
13
+ }
14
+ return fallback;
15
+ };
16
+ const resolveRoot = (host, option) => {
17
+ switch (option) {
18
+ case 'document':
19
+ return document;
20
+ case 'light':
21
+ return host;
22
+ default:
23
+ return host.renderRoot ?? host.shadowRoot ?? host;
24
+ }
25
+ };
26
+ const resolveQuery = (host, selector, options) => {
27
+ if (options.closest) {
28
+ const result = host.closest(selector);
29
+ return result ?? resolveFallback(options.fallback, host) ?? null;
30
+ }
31
+ const root = resolveRoot(host, options.from);
32
+ if (!root) {
33
+ return options.all
34
+ ? (resolveFallback(options.fallback, host) ?? [])
35
+ : (resolveFallback(options.fallback, host) ?? null);
36
+ }
37
+ if (options.all) {
38
+ const elements = Array.from(root.querySelectorAll(selector));
39
+ return elements.length > 0
40
+ ? elements
41
+ : (resolveFallback(options.fallback, host) ?? []);
42
+ }
43
+ const match = root.querySelector(selector);
44
+ return match ?? resolveFallback(options.fallback, host) ?? null;
45
+ };
46
+ const createQueryDecorator = (selector, options) => {
47
+ return (_target, context) => {
48
+ if (context.kind === 'accessor') {
49
+ const descriptor = {
50
+ get() {
51
+ return resolveQuery(this, selector, options);
52
+ },
53
+ set(_value) {
54
+ // Readonly accessor
55
+ }
56
+ };
57
+ return descriptor;
58
+ }
59
+ context.addInitializer(function () {
60
+ Object.defineProperty(this, context.name, {
61
+ configurable: true,
62
+ enumerable: true,
63
+ get: () => resolveQuery(this, selector, options)
64
+ });
65
+ });
66
+ return;
67
+ };
68
+ };
69
+ function Query(selector, userOptions) {
70
+ if (!selector) {
71
+ throw new Error('@Query requires a selector.');
72
+ }
73
+ if (userOptions) {
74
+ const merged = { ...defaultOptions, ...userOptions };
75
+ return createQueryDecorator(selector, merged);
76
+ }
77
+ const merged = defaultOptions;
78
+ return createQueryDecorator(selector, merged);
79
+ }
@@ -0,0 +1,27 @@
1
+ type QueryRoot = 'shadow' | 'light' | 'document';
2
+ type QueryHost = HTMLElement & {
3
+ renderRoot?: ShadowRoot | DocumentFragment | HTMLElement;
4
+ };
5
+ type QueryFallback<TResult, THost extends QueryHost> = TResult | ((host: THost) => TResult);
6
+ interface BaseQueryOptions<TResult, THost extends QueryHost> {
7
+ from?: QueryRoot;
8
+ fallback?: QueryFallback<TResult, THost>;
9
+ }
10
+ interface QueryAllOptions<TElement extends Element, THost extends QueryHost> extends BaseQueryOptions<TElement[], THost> {
11
+ all: true;
12
+ closest?: false;
13
+ }
14
+ interface QueryClosestOptions<THost extends QueryHost> extends BaseQueryOptions<Element | null, THost> {
15
+ closest: true;
16
+ all?: false;
17
+ }
18
+ interface QuerySingleOptions<TElement extends Element, THost extends QueryHost> extends BaseQueryOptions<TElement | null, THost> {
19
+ all?: false;
20
+ closest?: false;
21
+ }
22
+ type QueryOptions<TElement extends Element, THost extends QueryHost> = QueryAllOptions<TElement, THost> | QueryClosestOptions<THost> | QuerySingleOptions<TElement, THost>;
23
+ type QueryReturnType<TElement extends Element, THost extends QueryHost, TOptions extends QueryOptions<TElement, THost>> = TOptions extends QueryAllOptions<TElement, THost> ? TElement[] : TOptions extends QueryClosestOptions<THost> ? Element | null : TElement | null;
24
+ type QueryDecorator<TElement extends Element, THost extends QueryHost, TOptions extends QueryOptions<TElement, THost>> = (target: ClassAccessorDecoratorTarget<THost, QueryReturnType<TElement, THost, TOptions>> | undefined, context: ClassFieldDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>> | ClassAccessorDecoratorContext<THost, QueryReturnType<TElement, THost, TOptions>>) => ClassAccessorDecoratorResult<THost, QueryReturnType<TElement, THost, TOptions>> | undefined;
25
+ export declare function Query<TElement extends Element, THost extends QueryHost, TOptions extends QueryOptions<TElement, THost>>(selector: string, userOptions: TOptions): QueryDecorator<TElement, THost, TOptions>;
26
+ export declare function Query<TElement extends Element = Element, THost extends QueryHost = QueryHost>(selector: string): QueryDecorator<TElement, THost, QuerySingleOptions<TElement, THost>>;
27
+ export {};