@vielzeug/craftit 2.0.1 → 3.0.1

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 (432) hide show
  1. package/README.md +60 -108
  2. package/dist/controls/a11y-control.cjs +2 -0
  3. package/dist/controls/a11y-control.cjs.map +1 -0
  4. package/dist/controls/a11y-control.d.ts +16 -0
  5. package/dist/controls/a11y-control.d.ts.map +1 -0
  6. package/dist/controls/a11y-control.js +2 -0
  7. package/dist/controls/a11y-control.js.map +1 -0
  8. package/dist/controls/checkable-control.cjs +2 -0
  9. package/dist/controls/checkable-control.cjs.map +1 -0
  10. package/dist/controls/checkable-control.d.ts +15 -0
  11. package/dist/controls/checkable-control.d.ts.map +1 -0
  12. package/dist/controls/checkable-control.js +2 -0
  13. package/dist/controls/checkable-control.js.map +1 -0
  14. package/dist/controls/choice-field-control.cjs +2 -0
  15. package/dist/controls/choice-field-control.cjs.map +1 -0
  16. package/dist/controls/choice-field-control.d.ts +3 -0
  17. package/dist/controls/choice-field-control.d.ts.map +1 -0
  18. package/dist/controls/choice-field-control.js +2 -0
  19. package/dist/controls/choice-field-control.js.map +1 -0
  20. package/dist/controls/field-control.cjs +2 -0
  21. package/dist/controls/field-control.cjs.map +1 -0
  22. package/dist/controls/field-control.d.ts +111 -0
  23. package/dist/controls/field-control.d.ts.map +1 -0
  24. package/dist/controls/field-control.js +2 -0
  25. package/dist/controls/field-control.js.map +1 -0
  26. package/dist/controls/index.d.ts +12 -0
  27. package/dist/controls/index.d.ts.map +1 -0
  28. package/dist/controls/internal/control-state.cjs +2 -0
  29. package/dist/controls/internal/control-state.cjs.map +1 -0
  30. package/dist/controls/internal/control-state.d.ts +21 -0
  31. package/dist/controls/internal/control-state.d.ts.map +1 -0
  32. package/dist/controls/internal/control-state.js +2 -0
  33. package/dist/controls/internal/control-state.js.map +1 -0
  34. package/dist/controls/internal/keyboard-utils.cjs +2 -0
  35. package/dist/controls/internal/keyboard-utils.cjs.map +1 -0
  36. package/dist/controls/internal/keyboard-utils.d.ts +7 -0
  37. package/dist/controls/internal/keyboard-utils.d.ts.map +1 -0
  38. package/dist/controls/internal/keyboard-utils.js +2 -0
  39. package/dist/controls/internal/keyboard-utils.js.map +1 -0
  40. package/dist/controls/internal/number-utils.cjs +2 -0
  41. package/dist/controls/internal/number-utils.cjs.map +1 -0
  42. package/dist/controls/internal/number-utils.d.ts +6 -0
  43. package/dist/controls/internal/number-utils.d.ts.map +1 -0
  44. package/dist/controls/internal/number-utils.js +2 -0
  45. package/dist/controls/internal/number-utils.js.map +1 -0
  46. package/dist/controls/internal/validation-utils.cjs +2 -0
  47. package/dist/controls/internal/validation-utils.cjs.map +1 -0
  48. package/dist/controls/internal/validation-utils.d.ts +13 -0
  49. package/dist/controls/internal/validation-utils.d.ts.map +1 -0
  50. package/dist/controls/internal/validation-utils.js +2 -0
  51. package/dist/controls/internal/validation-utils.js.map +1 -0
  52. package/dist/controls/list-control.cjs +2 -0
  53. package/dist/controls/list-control.cjs.map +1 -0
  54. package/dist/controls/list-control.d.ts +23 -0
  55. package/dist/controls/list-control.d.ts.map +1 -0
  56. package/dist/controls/list-control.js +2 -0
  57. package/dist/controls/list-control.js.map +1 -0
  58. package/dist/controls/overlay-control.cjs +2 -0
  59. package/dist/controls/overlay-control.cjs.map +1 -0
  60. package/dist/{labs/overlay.d.ts → controls/overlay-control.d.ts} +19 -14
  61. package/dist/controls/overlay-control.d.ts.map +1 -0
  62. package/dist/controls/overlay-control.js +2 -0
  63. package/dist/controls/overlay-control.js.map +1 -0
  64. package/dist/controls/popup-list-control.cjs +2 -0
  65. package/dist/controls/popup-list-control.cjs.map +1 -0
  66. package/dist/controls/popup-list-control.d.ts +160 -0
  67. package/dist/controls/popup-list-control.d.ts.map +1 -0
  68. package/dist/controls/popup-list-control.js +2 -0
  69. package/dist/controls/popup-list-control.js.map +1 -0
  70. package/dist/controls/press-control.cjs +2 -0
  71. package/dist/controls/press-control.cjs.map +1 -0
  72. package/dist/controls/press-control.d.ts +12 -0
  73. package/dist/controls/press-control.d.ts.map +1 -0
  74. package/dist/controls/press-control.js +2 -0
  75. package/dist/controls/press-control.js.map +1 -0
  76. package/dist/controls/slider-control.cjs +2 -0
  77. package/dist/controls/slider-control.cjs.map +1 -0
  78. package/dist/controls/slider-control.d.ts +19 -0
  79. package/dist/controls/slider-control.d.ts.map +1 -0
  80. package/dist/controls/slider-control.js +2 -0
  81. package/dist/controls/slider-control.js.map +1 -0
  82. package/dist/controls/spinner-control.cjs +2 -0
  83. package/dist/controls/spinner-control.cjs.map +1 -0
  84. package/dist/controls/spinner-control.d.ts +18 -0
  85. package/dist/controls/spinner-control.d.ts.map +1 -0
  86. package/dist/controls/spinner-control.js +2 -0
  87. package/dist/controls/spinner-control.js.map +1 -0
  88. package/dist/controls/swipe-control.cjs +2 -0
  89. package/dist/controls/swipe-control.cjs.map +1 -0
  90. package/dist/controls/swipe-control.d.ts +32 -0
  91. package/dist/controls/swipe-control.d.ts.map +1 -0
  92. package/dist/controls/swipe-control.js +2 -0
  93. package/dist/controls/swipe-control.js.map +1 -0
  94. package/dist/controls/text-field-control.cjs +2 -0
  95. package/dist/controls/text-field-control.cjs.map +1 -0
  96. package/dist/controls/text-field-control.d.ts +3 -0
  97. package/dist/controls/text-field-control.d.ts.map +1 -0
  98. package/dist/controls/text-field-control.js +2 -0
  99. package/dist/controls/text-field-control.js.map +1 -0
  100. package/dist/controls.cjs +1 -0
  101. package/dist/controls.js +1 -0
  102. package/dist/craftit.cjs +1 -1
  103. package/dist/craftit.cjs.map +1 -1
  104. package/dist/craftit.js +1 -1
  105. package/dist/craftit.js.map +1 -1
  106. package/dist/directives/classMap.cjs +2 -0
  107. package/dist/directives/classMap.cjs.map +1 -0
  108. package/dist/directives/classMap.d.ts +19 -0
  109. package/dist/directives/classMap.d.ts.map +1 -0
  110. package/dist/directives/classMap.js +2 -0
  111. package/dist/directives/classMap.js.map +1 -0
  112. package/dist/directives/each.cjs +1 -1
  113. package/dist/directives/each.cjs.map +1 -1
  114. package/dist/directives/each.d.ts +12 -49
  115. package/dist/directives/each.d.ts.map +1 -1
  116. package/dist/directives/each.js +1 -1
  117. package/dist/directives/each.js.map +1 -1
  118. package/dist/directives/guard.cjs +2 -0
  119. package/dist/directives/guard.cjs.map +1 -0
  120. package/dist/directives/guard.d.ts +10 -0
  121. package/dist/directives/guard.d.ts.map +1 -0
  122. package/dist/directives/guard.js +2 -0
  123. package/dist/directives/guard.js.map +1 -0
  124. package/dist/directives/live.cjs +2 -0
  125. package/dist/directives/live.cjs.map +1 -0
  126. package/dist/directives/live.d.ts +23 -0
  127. package/dist/directives/live.d.ts.map +1 -0
  128. package/dist/directives/live.js +2 -0
  129. package/dist/directives/live.js.map +1 -0
  130. package/dist/directives/raw.cjs +1 -1
  131. package/dist/directives/raw.cjs.map +1 -1
  132. package/dist/directives/raw.d.ts +4 -6
  133. package/dist/directives/raw.d.ts.map +1 -1
  134. package/dist/directives/raw.js +1 -1
  135. package/dist/directives/raw.js.map +1 -1
  136. package/dist/directives/resource.cjs +2 -0
  137. package/dist/directives/resource.cjs.map +1 -0
  138. package/dist/directives/resource.d.ts +32 -0
  139. package/dist/directives/resource.d.ts.map +1 -0
  140. package/dist/directives/resource.js +2 -0
  141. package/dist/directives/resource.js.map +1 -0
  142. package/dist/directives/styleMap.cjs +2 -0
  143. package/dist/directives/styleMap.cjs.map +1 -0
  144. package/dist/directives/styleMap.d.ts +11 -0
  145. package/dist/directives/styleMap.d.ts.map +1 -0
  146. package/dist/directives/styleMap.js +2 -0
  147. package/dist/directives/styleMap.js.map +1 -0
  148. package/dist/directives/when.cjs +1 -1
  149. package/dist/directives/when.cjs.map +1 -1
  150. package/dist/directives/when.d.ts +7 -14
  151. package/dist/directives/when.d.ts.map +1 -1
  152. package/dist/directives/when.js +1 -1
  153. package/dist/directives/when.js.map +1 -1
  154. package/dist/errors.cjs +2 -0
  155. package/dist/errors.cjs.map +1 -0
  156. package/dist/errors.d.ts +12 -0
  157. package/dist/errors.d.ts.map +1 -0
  158. package/dist/errors.js +2 -0
  159. package/dist/errors.js.map +1 -0
  160. package/dist/form.cjs +2 -0
  161. package/dist/form.cjs.map +1 -0
  162. package/dist/form.d.ts +15 -0
  163. package/dist/form.d.ts.map +1 -0
  164. package/dist/form.js +2 -0
  165. package/dist/form.js.map +1 -0
  166. package/dist/host.cjs +2 -0
  167. package/dist/host.cjs.map +1 -0
  168. package/dist/host.d.ts +78 -0
  169. package/dist/host.d.ts.map +1 -0
  170. package/dist/host.js +2 -0
  171. package/dist/host.js.map +1 -0
  172. package/dist/index.cjs +1 -1
  173. package/dist/index.d.ts +16 -9
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +1 -1
  176. package/dist/internal.cjs +2 -0
  177. package/dist/internal.cjs.map +1 -0
  178. package/dist/internal.d.ts +111 -0
  179. package/dist/internal.d.ts.map +1 -0
  180. package/dist/internal.js +2 -0
  181. package/dist/internal.js.map +1 -0
  182. package/dist/observers/index.d.ts +5 -0
  183. package/dist/observers/index.d.ts.map +1 -0
  184. package/dist/observers/intersection-observe.cjs +2 -0
  185. package/dist/observers/intersection-observe.cjs.map +1 -0
  186. package/dist/observers/intersection-observe.d.ts +9 -0
  187. package/dist/observers/intersection-observe.d.ts.map +1 -0
  188. package/dist/observers/intersection-observe.js +2 -0
  189. package/dist/observers/intersection-observe.js.map +1 -0
  190. package/dist/observers/media-observe.cjs +2 -0
  191. package/dist/observers/media-observe.cjs.map +1 -0
  192. package/dist/observers/media-observe.d.ts +8 -0
  193. package/dist/observers/media-observe.d.ts.map +1 -0
  194. package/dist/observers/media-observe.js +2 -0
  195. package/dist/observers/media-observe.js.map +1 -0
  196. package/dist/observers/mutation-observe.cjs +2 -0
  197. package/dist/observers/mutation-observe.cjs.map +1 -0
  198. package/dist/observers/mutation-observe.d.ts +10 -0
  199. package/dist/observers/mutation-observe.d.ts.map +1 -0
  200. package/dist/observers/mutation-observe.js +2 -0
  201. package/dist/observers/mutation-observe.js.map +1 -0
  202. package/dist/observers/resize-observe.cjs +2 -0
  203. package/dist/observers/resize-observe.cjs.map +1 -0
  204. package/dist/observers/resize-observe.d.ts +11 -0
  205. package/dist/observers/resize-observe.d.ts.map +1 -0
  206. package/dist/observers/resize-observe.js +2 -0
  207. package/dist/observers/resize-observe.js.map +1 -0
  208. package/dist/observers.cjs +1 -0
  209. package/dist/observers.js +1 -0
  210. package/dist/props.cjs +2 -0
  211. package/dist/props.cjs.map +1 -0
  212. package/dist/props.d.ts +39 -0
  213. package/dist/props.d.ts.map +1 -0
  214. package/dist/props.js +2 -0
  215. package/dist/props.js.map +1 -0
  216. package/dist/registration.cjs +2 -0
  217. package/dist/registration.cjs.map +1 -0
  218. package/dist/registration.d.ts +38 -0
  219. package/dist/registration.d.ts.map +1 -0
  220. package/dist/registration.js +2 -0
  221. package/dist/registration.js.map +1 -0
  222. package/dist/runtime.cjs +2 -0
  223. package/dist/runtime.cjs.map +1 -0
  224. package/dist/runtime.d.ts +33 -0
  225. package/dist/runtime.d.ts.map +1 -0
  226. package/dist/runtime.js +2 -0
  227. package/dist/runtime.js.map +1 -0
  228. package/dist/template-bindings.cjs +2 -0
  229. package/dist/template-bindings.cjs.map +1 -0
  230. package/dist/template-bindings.d.ts +25 -0
  231. package/dist/template-bindings.d.ts.map +1 -0
  232. package/dist/template-bindings.js +2 -0
  233. package/dist/template-bindings.js.map +1 -0
  234. package/dist/template-compiler.cjs +2 -0
  235. package/dist/template-compiler.cjs.map +1 -0
  236. package/dist/template-compiler.d.ts +4 -0
  237. package/dist/template-compiler.d.ts.map +1 -0
  238. package/dist/template-compiler.js +2 -0
  239. package/dist/template-compiler.js.map +1 -0
  240. package/dist/testing/index.d.ts +2 -0
  241. package/dist/testing/index.d.ts.map +1 -0
  242. package/dist/testing/testing.cjs +2 -0
  243. package/dist/testing/testing.cjs.map +1 -0
  244. package/dist/{test/test.d.ts → testing/testing.d.ts} +18 -11
  245. package/dist/testing/testing.d.ts.map +1 -0
  246. package/dist/testing/testing.js +2 -0
  247. package/dist/testing/testing.js.map +1 -0
  248. package/dist/testing.cjs +1 -0
  249. package/dist/testing.js +1 -0
  250. package/package.json +21 -22
  251. package/dist/core/component.cjs +0 -2
  252. package/dist/core/component.cjs.map +0 -1
  253. package/dist/core/component.d.ts +0 -172
  254. package/dist/core/component.d.ts.map +0 -1
  255. package/dist/core/component.js +0 -2
  256. package/dist/core/component.js.map +0 -1
  257. package/dist/core/host.cjs +0 -2
  258. package/dist/core/host.cjs.map +0 -1
  259. package/dist/core/host.d.ts +0 -77
  260. package/dist/core/host.d.ts.map +0 -1
  261. package/dist/core/host.js +0 -2
  262. package/dist/core/host.js.map +0 -1
  263. package/dist/core/internal.cjs +0 -2
  264. package/dist/core/internal.cjs.map +0 -1
  265. package/dist/core/internal.d.ts +0 -107
  266. package/dist/core/internal.d.ts.map +0 -1
  267. package/dist/core/internal.js +0 -2
  268. package/dist/core/internal.js.map +0 -1
  269. package/dist/core/runtime-bindings.cjs +0 -2
  270. package/dist/core/runtime-bindings.cjs.map +0 -1
  271. package/dist/core/runtime-bindings.d.ts +0 -6
  272. package/dist/core/runtime-bindings.d.ts.map +0 -1
  273. package/dist/core/runtime-bindings.js +0 -2
  274. package/dist/core/runtime-bindings.js.map +0 -1
  275. package/dist/core/runtime-lifecycle.cjs +0 -2
  276. package/dist/core/runtime-lifecycle.cjs.map +0 -1
  277. package/dist/core/runtime-lifecycle.d.ts +0 -116
  278. package/dist/core/runtime-lifecycle.d.ts.map +0 -1
  279. package/dist/core/runtime-lifecycle.js +0 -2
  280. package/dist/core/runtime-lifecycle.js.map +0 -1
  281. package/dist/core/runtime.cjs +0 -1
  282. package/dist/core/runtime.d.ts +0 -3
  283. package/dist/core/runtime.d.ts.map +0 -1
  284. package/dist/core/runtime.js +0 -1
  285. package/dist/core/template-bindings.cjs +0 -2
  286. package/dist/core/template-bindings.cjs.map +0 -1
  287. package/dist/core/template-bindings.d.ts +0 -59
  288. package/dist/core/template-bindings.d.ts.map +0 -1
  289. package/dist/core/template-bindings.js +0 -2
  290. package/dist/core/template-bindings.js.map +0 -1
  291. package/dist/core/template-compiler.cjs +0 -2
  292. package/dist/core/template-compiler.cjs.map +0 -1
  293. package/dist/core/template-compiler.d.ts +0 -25
  294. package/dist/core/template-compiler.d.ts.map +0 -1
  295. package/dist/core/template-compiler.js +0 -2
  296. package/dist/core/template-compiler.js.map +0 -1
  297. package/dist/core/template-dom.cjs +0 -2
  298. package/dist/core/template-dom.cjs.map +0 -1
  299. package/dist/core/template-dom.d.ts +0 -13
  300. package/dist/core/template-dom.d.ts.map +0 -1
  301. package/dist/core/template-dom.js +0 -2
  302. package/dist/core/template-dom.js.map +0 -1
  303. package/dist/core/template-html.cjs +0 -2
  304. package/dist/core/template-html.cjs.map +0 -1
  305. package/dist/core/template-html.d.ts +0 -26
  306. package/dist/core/template-html.d.ts.map +0 -1
  307. package/dist/core/template-html.js +0 -2
  308. package/dist/core/template-html.js.map +0 -1
  309. package/dist/core/template.cjs +0 -2
  310. package/dist/core/template.cjs.map +0 -1
  311. package/dist/core/template.d.ts +0 -11
  312. package/dist/core/template.d.ts.map +0 -1
  313. package/dist/core/template.js +0 -2
  314. package/dist/core/template.js.map +0 -1
  315. package/dist/core/utilities.cjs +0 -2
  316. package/dist/core/utilities.cjs.map +0 -1
  317. package/dist/core/utilities.d.ts +0 -68
  318. package/dist/core/utilities.d.ts.map +0 -1
  319. package/dist/core/utilities.js +0 -2
  320. package/dist/core/utilities.js.map +0 -1
  321. package/dist/directives/attr.cjs +0 -2
  322. package/dist/directives/attr.cjs.map +0 -1
  323. package/dist/directives/attr.d.ts +0 -14
  324. package/dist/directives/attr.d.ts.map +0 -1
  325. package/dist/directives/attr.js +0 -2
  326. package/dist/directives/attr.js.map +0 -1
  327. package/dist/directives/bind.cjs +0 -2
  328. package/dist/directives/bind.cjs.map +0 -1
  329. package/dist/directives/bind.d.ts +0 -30
  330. package/dist/directives/bind.d.ts.map +0 -1
  331. package/dist/directives/bind.js +0 -2
  332. package/dist/directives/bind.js.map +0 -1
  333. package/dist/directives/choose.cjs +0 -2
  334. package/dist/directives/choose.cjs.map +0 -1
  335. package/dist/directives/choose.d.ts +0 -34
  336. package/dist/directives/choose.d.ts.map +0 -1
  337. package/dist/directives/choose.js +0 -2
  338. package/dist/directives/choose.js.map +0 -1
  339. package/dist/directives/classes.cjs +0 -2
  340. package/dist/directives/classes.cjs.map +0 -1
  341. package/dist/directives/classes.d.ts +0 -20
  342. package/dist/directives/classes.d.ts.map +0 -1
  343. package/dist/directives/classes.js +0 -2
  344. package/dist/directives/classes.js.map +0 -1
  345. package/dist/directives/index.cjs +0 -1
  346. package/dist/directives/index.d.ts +0 -14
  347. package/dist/directives/index.d.ts.map +0 -1
  348. package/dist/directives/index.js +0 -1
  349. package/dist/directives/match.cjs +0 -2
  350. package/dist/directives/match.cjs.map +0 -1
  351. package/dist/directives/match.d.ts +0 -31
  352. package/dist/directives/match.d.ts.map +0 -1
  353. package/dist/directives/match.js +0 -2
  354. package/dist/directives/match.js.map +0 -1
  355. package/dist/directives/memo.cjs +0 -2
  356. package/dist/directives/memo.cjs.map +0 -1
  357. package/dist/directives/memo.d.ts +0 -23
  358. package/dist/directives/memo.d.ts.map +0 -1
  359. package/dist/directives/memo.js +0 -2
  360. package/dist/directives/memo.js.map +0 -1
  361. package/dist/directives/on.cjs +0 -2
  362. package/dist/directives/on.cjs.map +0 -1
  363. package/dist/directives/on.d.ts +0 -25
  364. package/dist/directives/on.d.ts.map +0 -1
  365. package/dist/directives/on.js +0 -2
  366. package/dist/directives/on.js.map +0 -1
  367. package/dist/directives/spread.cjs +0 -2
  368. package/dist/directives/spread.cjs.map +0 -1
  369. package/dist/directives/spread.d.ts +0 -14
  370. package/dist/directives/spread.d.ts.map +0 -1
  371. package/dist/directives/spread.js +0 -2
  372. package/dist/directives/spread.js.map +0 -1
  373. package/dist/directives/style.cjs +0 -2
  374. package/dist/directives/style.cjs.map +0 -1
  375. package/dist/directives/style.d.ts +0 -22
  376. package/dist/directives/style.d.ts.map +0 -1
  377. package/dist/directives/style.js +0 -2
  378. package/dist/directives/style.js.map +0 -1
  379. package/dist/directives/until.cjs +0 -2
  380. package/dist/directives/until.cjs.map +0 -1
  381. package/dist/directives/until.d.ts +0 -26
  382. package/dist/directives/until.d.ts.map +0 -1
  383. package/dist/directives/until.js +0 -2
  384. package/dist/directives/until.js.map +0 -1
  385. package/dist/labs/a11y.cjs +0 -2
  386. package/dist/labs/a11y.cjs.map +0 -1
  387. package/dist/labs/a11y.d.ts +0 -61
  388. package/dist/labs/a11y.d.ts.map +0 -1
  389. package/dist/labs/a11y.js +0 -2
  390. package/dist/labs/a11y.js.map +0 -1
  391. package/dist/labs/index.d.ts +0 -8
  392. package/dist/labs/index.d.ts.map +0 -1
  393. package/dist/labs/list.cjs +0 -2
  394. package/dist/labs/list.cjs.map +0 -1
  395. package/dist/labs/list.d.ts +0 -26
  396. package/dist/labs/list.d.ts.map +0 -1
  397. package/dist/labs/list.js +0 -2
  398. package/dist/labs/list.js.map +0 -1
  399. package/dist/labs/observers.cjs +0 -2
  400. package/dist/labs/observers.cjs.map +0 -1
  401. package/dist/labs/observers.d.ts +0 -42
  402. package/dist/labs/observers.d.ts.map +0 -1
  403. package/dist/labs/observers.js +0 -2
  404. package/dist/labs/observers.js.map +0 -1
  405. package/dist/labs/overlay.cjs +0 -2
  406. package/dist/labs/overlay.cjs.map +0 -1
  407. package/dist/labs/overlay.d.ts.map +0 -1
  408. package/dist/labs/overlay.js +0 -2
  409. package/dist/labs/overlay.js.map +0 -1
  410. package/dist/labs/selectable.cjs +0 -2
  411. package/dist/labs/selectable.cjs.map +0 -1
  412. package/dist/labs/selectable.d.ts +0 -70
  413. package/dist/labs/selectable.d.ts.map +0 -1
  414. package/dist/labs/selectable.js +0 -2
  415. package/dist/labs/selectable.js.map +0 -1
  416. package/dist/labs/selection.cjs +0 -2
  417. package/dist/labs/selection.cjs.map +0 -1
  418. package/dist/labs/selection.d.ts +0 -68
  419. package/dist/labs/selection.d.ts.map +0 -1
  420. package/dist/labs/selection.js +0 -2
  421. package/dist/labs/selection.js.map +0 -1
  422. package/dist/labs.cjs +0 -1
  423. package/dist/labs.js +0 -1
  424. package/dist/test/index.d.ts +0 -2
  425. package/dist/test/index.d.ts.map +0 -1
  426. package/dist/test/test.cjs +0 -2
  427. package/dist/test/test.cjs.map +0 -1
  428. package/dist/test/test.d.ts.map +0 -1
  429. package/dist/test/test.js +0 -2
  430. package/dist/test/test.js.map +0 -1
  431. package/dist/test.cjs +0 -1
  432. package/dist/test.js +0 -1
@@ -0,0 +1,111 @@
1
+ import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
2
+ export type Ref<T extends Element> = Signal<T | null>;
3
+ export declare function ref<T extends Element>(): Ref<T>;
4
+ export type Refs<T extends Element> = T[];
5
+ export declare function refs<T extends Element>(): Refs<T>;
6
+ export type RefCallback<T extends Element> = (el: T | null) => void;
7
+ export type TextBinding = {
8
+ signal: ReadonlySignal<unknown>;
9
+ type: 'text';
10
+ uid: string;
11
+ };
12
+ export type AttrBinding = {
13
+ /** When true the binding uses live-write semantics: stale app-state writes are
14
+ * skipped if the DOM value has diverged from the last programmatic write. */
15
+ live?: true;
16
+ mode: 'bool' | 'attr';
17
+ name: string;
18
+ signal?: ReadonlySignal<unknown>;
19
+ type: 'attr';
20
+ uid: string;
21
+ value?: unknown;
22
+ };
23
+ export type EventBinding = {
24
+ handler: (e: Event) => void;
25
+ name: string;
26
+ options?: AddEventListenerOptions;
27
+ type: 'event';
28
+ uid: string;
29
+ };
30
+ export type RefBinding = {
31
+ ref: Ref<Element> | Refs<Element> | RefCallback<Element>;
32
+ type: 'ref';
33
+ uid: string;
34
+ };
35
+ export type HtmlBindingPayload = {
36
+ bindings: Binding[];
37
+ html: string;
38
+ };
39
+ export type RuntimeDirective = {
40
+ __craftitDirective: true;
41
+ mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;
42
+ };
43
+ export type DirectiveResult = RuntimeDirective;
44
+ export declare const isDirectiveResult: (value: unknown) => value is DirectiveResult;
45
+ export type HtmlBinding = {
46
+ signal: ReadonlySignal<HtmlBindingPayload>;
47
+ type: 'html';
48
+ uid: string;
49
+ };
50
+ export type DirectiveBinding = {
51
+ directive: RuntimeDirective;
52
+ type: 'directive';
53
+ uid: string;
54
+ };
55
+ export type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;
56
+ export interface HTMLResult {
57
+ __bindings: Binding[];
58
+ __craftitHtmlResult: true;
59
+ __html: string;
60
+ toString(): string;
61
+ }
62
+ export declare function htmlResult(html: string, bindings?: Binding[]): HTMLResult;
63
+ export declare const isHtmlResult: (value: unknown) => value is HTMLResult;
64
+ export declare function extractResult(v: string | HTMLResult): {
65
+ bindings: Binding[];
66
+ html: string;
67
+ };
68
+ export type CSSResult = {
69
+ __craftitCssResult: true;
70
+ content: string;
71
+ toString(): string;
72
+ };
73
+ export declare const isCssResult: (value: unknown) => value is CSSResult;
74
+ export declare const runAll: (fns: (() => void)[]) => void;
75
+ export declare const removeNodes: (nodes: Node[]) => void;
76
+ export declare const setAttr: (el: Element, name: string, val: unknown) => void;
77
+ export declare const listen: (el: EventTarget | null | undefined, name: string, handler: (e: any) => void, options?: AddEventListenerOptions) => (() => void);
78
+ export declare const toKebab: (str: string) => string;
79
+ export declare const escapeHtml: (value: unknown) => string;
80
+ type NoDetail = void | undefined | never;
81
+ type KeysWithoutDetail<T extends Record<string, unknown>> = {
82
+ [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;
83
+ }[keyof T];
84
+ type StrictEmitFn<T extends Record<string, unknown>> = {
85
+ <K extends KeysWithoutDetail<T>>(event: K): void;
86
+ <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;
87
+ };
88
+ type LooseEmitFn = (event: string, detail?: unknown) => void;
89
+ export type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;
90
+ export declare const createEmitFn: <T extends Record<string, unknown>>() => EmitFn<T>;
91
+ export type FireApi = {
92
+ custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;
93
+ event(target: EventTarget, event: Event): boolean;
94
+ focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;
95
+ keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;
96
+ mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;
97
+ touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;
98
+ };
99
+ export declare const fire: FireApi;
100
+ export declare const _resetIdCounter: () => void;
101
+ export declare const createId: (prefix?: string) => string;
102
+ export declare const CF_ID_ATTR = "u";
103
+ export declare const createMarkerIdFactory: () => (() => string);
104
+ export declare const rekeyHtmlResult: (result: HTMLResult, getNextId: () => string) => {
105
+ bindings: Binding[];
106
+ html: string;
107
+ };
108
+ export declare const css: (strings: TemplateStringsArray, ...values: unknown[]) => CSSResult;
109
+ export declare const loadStylesheet: (style: string | CSSStyleSheet | CSSResult) => CSSStyleSheet;
110
+ export {};
111
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{CRAFTIT_ERRORS as e}from"./errors.js";import{currentElementOrThrow as t}from"./runtime.js";import{signal as n}from"@vielzeug/stateit";function r(){return n(null)}function i(){return[]}var a=e=>typeof e==`object`&&!!e&&e.__craftitDirective===!0&&typeof e.mount==`function`;function o(e,t=[]){return{__bindings:t,__craftitHtmlResult:!0,__html:e,toString(){return e}}}var s=e=>typeof e==`object`&&!!e&&e.__craftitHtmlResult===!0;function c(e){return typeof e==`string`?{bindings:[],html:e}:{bindings:e.__bindings,html:e.__html}}var l=e=>typeof e==`object`&&!!e&&e.__craftitCssResult===!0,u=t=>{let n=[];for(let e=t.length-1;e>=0;e--)try{t[e]()}catch(e){n.push(e)}if(n.length>0)throw AggregateError(n,e.cleanupFailed)},d=e=>{for(let t of e)t.remove()},f=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):e.setAttribute(t,n===!0?`true`:String(n))},p=(e,t,n,r)=>{if(!e)return()=>{};let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},m=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),h={"'":`&#39;`,'"':`&quot;`,"&":`&amp;`,"<":`&lt;`,">":`&gt;`},g=e=>String(e).replace(/[&<>"']/g,e=>h[e]),_=()=>{let e=t();return((t,...n)=>{y.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},v={bubbles:!0,cancelable:!0,composed:!0},y={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...v,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...v,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...v,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...v,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...v,...n})):e.dispatchEvent(new CustomEvent(t,{...v,...n}))}},b=0,x=()=>{b=0},S=e=>`${e?`${e}-`:`cft-`}${++b}`,C=RegExp(`u="([^"]+)"`,`g`),w=()=>{let e=0;return()=>String(e++)},T=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(C,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},E=function(){return this.content},D=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=l(e)?e.content:e??``}return{__craftitCssResult:!0,content:n.trim(),toString:E}},O=new Map,k=t=>{if(t instanceof CSSStyleSheet)return t;let n=typeof t==`string`?t:t.content,r=O.get(n);if(r)return r;let i=new CSSStyleSheet;try{i.replaceSync(n)}catch(t){console.error(e.styleReplaceFailed,t)}return O.set(n,i),i};export{x as _resetIdCounter,_ as createEmitFn,S as createId,w as createMarkerIdFactory,D as css,g as escapeHtml,c as extractResult,y as fire,o as htmlResult,a as isDirectiveResult,s as isHtmlResult,p as listen,k as loadStylesheet,r as ref,i as refs,T as rekeyHtmlResult,d as removeNodes,u as runAll,f as setAttr,m as toKebab};
2
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","names":[],"sources":["../src/internal.ts"],"sourcesContent":["import { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { currentElementOrThrow } from './runtime';\n\nexport type Ref<T extends Element> = Signal<T | null>;\n\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(null);\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n /** When true the binding uses live-write semantics: stale app-state writes are\n * skipped if the DOM value has diverged from the last programmatic write. */\n live?: true;\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n name: string;\n options?: AddEventListenerOptions;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type HtmlBindingPayload = {\n bindings: Binding[];\n html: string;\n};\n\nexport type RuntimeDirective = {\n __craftitDirective: true;\n mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;\n};\n\nexport type DirectiveResult = RuntimeDirective;\n\nexport const isDirectiveResult = (value: unknown): value is DirectiveResult =>\n typeof value === 'object' &&\n value !== null &&\n (value as RuntimeDirective).__craftitDirective === true &&\n typeof (value as RuntimeDirective).mount === 'function';\n\nexport type HtmlBinding = {\n signal: ReadonlySignal<HtmlBindingPayload>;\n type: 'html';\n uid: string;\n};\n\nexport type DirectiveBinding = {\n directive: RuntimeDirective;\n type: 'directive';\n uid: string;\n};\n\nexport type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __craftitHtmlResult: true;\n __html: string;\n toString(): string;\n}\n\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n return {\n __bindings: bindings,\n __craftitHtmlResult: true,\n __html: html,\n toString() {\n return html;\n },\n };\n}\n\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && value !== null && (value as HTMLResult).__craftitHtmlResult === true;\n\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\nexport type CSSResult = {\n __craftitCssResult: true;\n content: string;\n toString(): string;\n};\n\nexport const isCssResult = (value: unknown): value is CSSResult =>\n typeof value === 'object' && !!value && (value as CSSResult).__craftitCssResult === true;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DOM UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const runAll = (fns: (() => void)[]): void => {\n const errors: unknown[] = [];\n\n for (let i = fns.length - 1; i >= 0; i--) {\n try {\n fns[i]();\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, CRAFTIT_ERRORS.cleanupFailed);\n }\n};\n\nexport const removeNodes = (nodes: Node[]): void => {\n for (const node of nodes) {\n (node as ChildNode).remove();\n }\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else {\n el.setAttribute(name, val === true ? 'true' : String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": '&#39;', '\"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' };\n\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\ntype StrictEmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\ntype LooseEmitFn = (event: string, detail?: unknown) => void;\n\nexport type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentElementOrThrow();\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FIRE UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\nexport const fire: FireApi = {\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ID UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _idCounter = 0;\n\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\nexport const CF_ID_ATTR = 'u';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nexport const createMarkerIdFactory = (): (() => string) => {\n let n = 0;\n\n return () => String(n++);\n};\n\nexport const rekeyHtmlResult = (result: HTMLResult, getNextId: () => string): { bindings: Binding[]; html: string } => {\n const idMap = new Map<string, string>();\n const getMappedId = (id: string): string => {\n const mapped = idMap.get(id);\n\n if (mapped) return mapped;\n\n const next = getNextId();\n\n idMap.set(id, next);\n\n return next;\n };\n\n return {\n bindings: result.__bindings.map((binding) => ({ ...binding, uid: getMappedId(binding.uid) }) as Binding),\n html: result.__html\n .replace(ATTR_ID_RE, (_, id: string) => `${CF_ID_ATTR}=\"${getMappedId(id)}\"`)\n .replace(/<!--(\\d+)-->/g, (_, id: string) => `<!--${getMappedId(id)}-->`),\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += isCssResult(v) ? v.content : (v ?? '');\n }\n }\n\n return { __craftitCssResult: true as const, content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n } catch (err) {\n console.error(CRAFTIT_ERRORS.styleReplaceFailed, err);\n }\n\n stylesheetStringCache.set(cssText, sheet);\n\n return sheet;\n};\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { intersectionObserver } from './intersection-observe';
2
+ export { mediaObserver } from './media-observe';
3
+ export { mutationObserver } from './mutation-observe';
4
+ export { resizeObserver } from './resize-observe';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=(n,r)=>{let i=(0,t.signal)(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e.onCleanup(()=>a.disconnect()),i};exports.intersectionObserver=n;
2
+ //# sourceMappingURL=intersection-observe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersection-observe.cjs","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside a `mount()` callback.\n */\nexport const intersectionObserver = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([nextEntry]) => {\n if (nextEntry) entry.value = nextEntry;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n"],"mappings":"qEAUA,IAAa,GACX,EACA,IACqD,CACrD,IAAM,GAAA,EAAA,EAAA,QAAiD,IAAI,EACrD,EAAK,IAAI,sBAAsB,CAAC,KAAe,CAC/C,IAAW,EAAM,MAAQ,EAC/B,EAAG,CAAO,EAKV,OAHA,EAAG,QAAQ,CAAE,EACb,EAAA,cAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
@@ -0,0 +1,9 @@
1
+ import { type ReadonlySignal } from '@vielzeug/stateit';
2
+ /**
3
+ * Observes an element's intersection with the viewport (or a given root) via
4
+ * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the
5
+ * intersection ratio changes.
6
+ * Must be called inside a `mount()` callback.
7
+ */
8
+ export declare const intersectionObserver: (el: Element, options?: IntersectionObserverInit) => ReadonlySignal<IntersectionObserverEntry | null>;
9
+ //# sourceMappingURL=intersection-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersection-observe.d.ts","sourceRoot":"","sources":["../../src/observers/intersection-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,IAAI,OAAO,EACX,UAAU,wBAAwB,KACjC,cAAc,CAAC,yBAAyB,GAAG,IAAI,CAUjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{onCleanup as e}from"../runtime.js";import{signal as t}from"@vielzeug/stateit";var n=(n,r)=>{let i=t(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e(()=>a.disconnect()),i};export{n as intersectionObserver};
2
+ //# sourceMappingURL=intersection-observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intersection-observe.js","names":[],"sources":["../../src/observers/intersection-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside a `mount()` callback.\n */\nexport const intersectionObserver = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([nextEntry]) => {\n if (nextEntry) entry.value = nextEntry;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n"],"mappings":"qFAUA,IAAa,GACX,EACA,IACqD,CACrD,IAAM,EAAQ,EAAyC,IAAI,EACrD,EAAK,IAAI,sBAAsB,CAAC,KAAe,CAC/C,IAAW,EAAM,MAAQ,EAC/B,EAAG,CAAO,EAKV,OAHA,EAAG,QAAQ,CAAE,EACb,MAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=window.matchMedia(n),i=(0,t.signal)(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e.onCleanup(()=>r.removeEventListener(`change`,a)),i};exports.mediaObserver=n;
2
+ //# sourceMappingURL=media-observe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-observe.cjs","names":[],"sources":["../../src/observers/media-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside a `mount()` callback.\n */\nexport const mediaObserver = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"qEASA,IAAa,EAAiB,GAA2C,CACvE,IAAM,EAAM,OAAO,WAAW,CAAK,EAC7B,GAAA,EAAA,EAAA,QAAiB,EAAI,OAAO,EAC5B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,OACpB,EAKA,OAHA,EAAI,iBAAiB,SAAU,CAAO,EACtC,EAAA,cAAgB,EAAI,oBAAoB,SAAU,CAAO,CAAC,EAEnD,CACT"}
@@ -0,0 +1,8 @@
1
+ import { type ReadonlySignal } from '@vielzeug/stateit';
2
+ /**
3
+ * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`
4
+ * that is `true` when the query matches and `false` when it does not.
5
+ * Must be called inside a `mount()` callback.
6
+ */
7
+ export declare const mediaObserver: (query: string) => ReadonlySignal<boolean>;
8
+ //# sourceMappingURL=media-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-observe.d.ts","sourceRoot":"","sources":["../../src/observers/media-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,cAAc,CAAC,OAAO,CAWnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{onCleanup as e}from"../runtime.js";import{signal as t}from"@vielzeug/stateit";var n=n=>{let r=window.matchMedia(n),i=t(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e(()=>r.removeEventListener(`change`,a)),i};export{n as mediaObserver};
2
+ //# sourceMappingURL=media-observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-observe.js","names":[],"sources":["../../src/observers/media-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside a `mount()` callback.\n */\nexport const mediaObserver = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"qFASA,IAAa,EAAiB,GAA2C,CACvE,IAAM,EAAM,OAAO,WAAW,CAAK,EAC7B,EAAU,EAAO,EAAI,OAAO,EAC5B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,OACpB,EAKA,OAHA,EAAI,iBAAiB,SAAU,CAAO,EACtC,MAAgB,EAAI,oBAAoB,SAAU,CAAO,CAAC,EAEnD,CACT"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=(n,r={attributes:!0,characterData:!0,childList:!0,subtree:!0})=>{let i=(0,t.signal)({entries:[],latest:null}),a=new MutationObserver(e=>{i.value={entries:e,latest:e.length>0?e[e.length-1]:null}});return a.observe(n,r),e.onCleanup(()=>a.disconnect()),i};exports.mutationObserver=n;
2
+ //# sourceMappingURL=mutation-observe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-observe.cjs","names":[],"sources":["../../src/observers/mutation-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\nexport type MutationObserverValue = {\n entries: MutationRecord[];\n latest: MutationRecord | null;\n};\n\n/**\n * Observes DOM mutations on an element and exposes the latest mutation batch.\n */\nexport const mutationObserver = (\n el: Element,\n options: MutationObserverInit = {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n },\n): ReadonlySignal<MutationObserverValue> => {\n const value = signal<MutationObserverValue>({ entries: [], latest: null });\n const observer = new MutationObserver((entries) => {\n value.value = {\n entries,\n latest: entries.length > 0 ? entries[entries.length - 1] : null,\n };\n });\n\n observer.observe(el, options);\n onCleanup(() => observer.disconnect());\n\n return value;\n};\n"],"mappings":"qEAYA,IAAa,GACX,EACA,EAAgC,CAC9B,WAAY,GACZ,cAAe,GACf,UAAW,GACX,QAAS,EACX,IAC0C,CAC1C,IAAM,GAAA,EAAA,EAAA,QAAsC,CAAE,QAAS,CAAC,EAAG,OAAQ,IAAK,CAAC,EACnE,EAAW,IAAI,iBAAkB,GAAY,CACjD,EAAM,MAAQ,CACZ,UACA,OAAQ,EAAQ,OAAS,EAAI,EAAQ,EAAQ,OAAS,GAAK,IAC7D,CACF,CAAC,EAKD,OAHA,EAAS,QAAQ,EAAI,CAAO,EAC5B,EAAA,cAAgB,EAAS,WAAW,CAAC,EAE9B,CACT"}
@@ -0,0 +1,10 @@
1
+ import { type ReadonlySignal } from '@vielzeug/stateit';
2
+ export type MutationObserverValue = {
3
+ entries: MutationRecord[];
4
+ latest: MutationRecord | null;
5
+ };
6
+ /**
7
+ * Observes DOM mutations on an element and exposes the latest mutation batch.
8
+ */
9
+ export declare const mutationObserver: (el: Element, options?: MutationObserverInit) => ReadonlySignal<MutationObserverValue>;
10
+ //# sourceMappingURL=mutation-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-observe.d.ts","sourceRoot":"","sources":["../../src/observers/mutation-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,IAAI,OAAO,EACX,UAAS,oBAKR,KACA,cAAc,CAAC,qBAAqB,CAatC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{onCleanup as e}from"../runtime.js";import{signal as t}from"@vielzeug/stateit";var n=(n,r={attributes:!0,characterData:!0,childList:!0,subtree:!0})=>{let i=t({entries:[],latest:null}),a=new MutationObserver(e=>{i.value={entries:e,latest:e.length>0?e[e.length-1]:null}});return a.observe(n,r),e(()=>a.disconnect()),i};export{n as mutationObserver};
2
+ //# sourceMappingURL=mutation-observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-observe.js","names":[],"sources":["../../src/observers/mutation-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\nexport type MutationObserverValue = {\n entries: MutationRecord[];\n latest: MutationRecord | null;\n};\n\n/**\n * Observes DOM mutations on an element and exposes the latest mutation batch.\n */\nexport const mutationObserver = (\n el: Element,\n options: MutationObserverInit = {\n attributes: true,\n characterData: true,\n childList: true,\n subtree: true,\n },\n): ReadonlySignal<MutationObserverValue> => {\n const value = signal<MutationObserverValue>({ entries: [], latest: null });\n const observer = new MutationObserver((entries) => {\n value.value = {\n entries,\n latest: entries.length > 0 ? entries[entries.length - 1] : null,\n };\n });\n\n observer.observe(el, options);\n onCleanup(() => observer.disconnect());\n\n return value;\n};\n"],"mappings":"qFAYA,IAAa,GACX,EACA,EAAgC,CAC9B,WAAY,GACZ,cAAe,GACf,UAAW,GACX,QAAS,EACX,IAC0C,CAC1C,IAAM,EAAQ,EAA8B,CAAE,QAAS,CAAC,EAAG,OAAQ,IAAK,CAAC,EACnE,EAAW,IAAI,iBAAkB,GAAY,CACjD,EAAM,MAAQ,CACZ,UACA,OAAQ,EAAQ,OAAS,EAAI,EAAQ,EAAQ,OAAS,GAAK,IAC7D,CACF,CAAC,EAKD,OAHA,EAAS,QAAQ,EAAI,CAAO,EAC5B,MAAgB,EAAS,WAAW,CAAC,EAE9B,CACT"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=(0,t.signal)({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e.onCleanup(()=>i.disconnect()),r};exports.resizeObserver=n;
2
+ //# sourceMappingURL=resize-observe.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-observe.cjs","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside a `mount()` callback.\n */\nexport const resizeObserver = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"qEASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,GAAA,EAAA,EAAA,QAAc,CAAE,OAAQ,EAAG,MAAO,CAAE,CAAC,EACrC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,UAAW,EACvE,CAAC,EAKD,OAHA,EAAG,QAAQ,CAAE,EACb,EAAA,cAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
@@ -0,0 +1,11 @@
1
+ import { type ReadonlySignal } from '@vielzeug/stateit';
2
+ /**
3
+ * Observes an element's content-box size via `ResizeObserver`.
4
+ * Returns a `ReadonlySignal` that updates whenever the dimensions change.
5
+ * Must be called inside a `mount()` callback.
6
+ */
7
+ export declare const resizeObserver: (el: Element) => ReadonlySignal<{
8
+ height: number;
9
+ width: number;
10
+ }>;
11
+ //# sourceMappingURL=resize-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-observe.d.ts","sourceRoot":"","sources":["../../src/observers/resize-observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,OAAO,KAAG,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAc5F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{onCleanup as e}from"../runtime.js";import{signal as t}from"@vielzeug/stateit";var n=n=>{let r=t({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e(()=>i.disconnect()),r};export{n as resizeObserver};
2
+ //# sourceMappingURL=resize-observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-observe.js","names":[],"sources":["../../src/observers/resize-observe.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside a `mount()` callback.\n */\nexport const resizeObserver = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n"],"mappings":"qFASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,EAAO,EAAO,CAAE,OAAQ,EAAG,MAAO,CAAE,CAAC,EACrC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,UAAW,EACvE,CAAC,EAKD,OAHA,EAAG,QAAQ,CAAE,EACb,MAAgB,EAAG,WAAW,CAAC,EAExB,CACT"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./observers/intersection-observe.cjs`),t=require(`./observers/media-observe.cjs`),n=require(`./observers/mutation-observe.cjs`),r=require(`./observers/resize-observe.cjs`);exports.intersectionObserver=e.intersectionObserver,exports.mediaObserver=t.mediaObserver,exports.mutationObserver=n.mutationObserver,exports.resizeObserver=r.resizeObserver;
@@ -0,0 +1 @@
1
+ import{intersectionObserver as e}from"./observers/intersection-observe.js";import{mediaObserver as t}from"./observers/media-observe.js";import{mutationObserver as n}from"./observers/mutation-observe.js";import{resizeObserver as r}from"./observers/resize-observe.js";export{e as intersectionObserver,t as mediaObserver,n as mutationObserver,r as resizeObserver};
package/dist/props.cjs ADDED
@@ -0,0 +1,2 @@
1
+ const e=require(`./runtime.cjs`),t=require(`./internal.cjs`);let n=require(`@vielzeug/stateit`);var r={bool(e=!1){return{default:e,parse:e=>e===``||e===`true`,reflect:!0}},json(e){return{default:e,parse:t=>{if(t==null||t===``)return e;try{return JSON.parse(t)}catch{return e}},reflect:!1}},number(e=0){return{default:e,parse:t=>t==null?e:Number(t),reflect:!0}},oneOf(e,t){return{default:t,parse:n=>n!=null&&e.includes(n)?n:t,reflect:!0}},string(e){return{default:e,parse:t=>t??e,reflect:!0}}},i=e=>typeof e==`object`&&!!e&&`default`in e,a=e=>Array.isArray(e)||typeof e==`object`&&!!e;function o(e){if(i(e)){let t=e,n=t.reflect??!0;if(n&&a(t.default))throw Error(`Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.`);return{...t,reflect:n}}return a(e)?{default:e,reflect:!1}:{default:e,reflect:!0}}var s=new WeakMap,c=new WeakMap,l=(e,t)=>{let n=c.get(e);n||(n=new Set,c.set(e,n)),n.add(t)},u=(e,t)=>{let n=c.get(e);n&&(n.delete(t),n.size===0&&c.delete(e))},d=(e,t)=>c.get(e)?.has(t)??!1,f={boolean:e=>e===``||e===`true`,number:e=>Number(e),string:e=>e},p=e=>t=>{if(t==null)return e;let n=f[typeof e];return n?n(t):t},m=(r,i,a,o)=>{let c=e.currentElementOrThrow();s.has(c)||s.set(c,new Map);let d=o?.parse??p(a),f=(0,n.signal)(a),m=Object.prototype.hasOwnProperty.call(c,r),h=m?c[r]:void 0,g={parse:d,reflect:o?.reflect??!0,signal:f};return m?(delete c[r],f.value=h):c.hasAttribute(i)&&(f.value=d(c.getAttribute(i))),s.get(c).set(i,g),Object.defineProperty(c,r,{configurable:!0,enumerable:!0,get:()=>f.value,set:e=>{f.value=e}}),(o?.reflect??!0)&&e.effect(()=>{let e=f.value;l(c,i);try{e==null?c.removeAttribute(i):typeof e==`boolean`?c.toggleAttribute(i,e):t.setAttr(c,i,e)}finally{u(c,i)}}),f};function h(e){let n={};for(let[r,i]of Object.entries(e)){let e=typeof i==`object`&&i&&`default`in i?i:o(i);n[r]=m(r,t.toKebab(r),e.default,e)}return n}exports.createProps=h,exports.isReflecting=d,exports.normalizePropDefinition=o,exports.prop=r,exports.propRegistry=s;
2
+ //# sourceMappingURL=props.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.cjs","names":[],"sources":["../src/props.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentElementOrThrow, effect } from './runtime';\n\nexport type PropOptions<T> = {\n parse?: (value: string | null) => T;\n /** Whether to reflect prop changes to HTML attributes. Default: true.\n * Set to false only when host.bind() manages the same attribute with derived/computed state. */\n reflect?: boolean;\n};\n\nexport type PropsDef<T extends Record<string, unknown>> = {\n // Keep default authoring ergonomic: plain `undefined` is a valid default for any prop.\n [K in keyof Required<T>]: T[K] | undefined | PropDef<T[K] | undefined>;\n};\n\nexport type PropDef<T> = PropOptions<T> & { readonly default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\nexport const prop = {\n bool(defaultValue = false): PropDef<boolean> {\n return {\n default: defaultValue,\n parse: (value) => value === '' || value === 'true',\n reflect: true,\n };\n },\n json<T>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => {\n if (value == null || value === '') return defaultValue;\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n },\n reflect: false,\n };\n },\n number(defaultValue = 0): PropDef<number> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : Number(value)),\n reflect: true,\n };\n },\n oneOf<T extends string>(allowed: readonly T[], defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value != null && allowed.includes(value as T) ? (value as T) : defaultValue),\n reflect: true,\n };\n },\n string<T extends string>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : (value as T)),\n reflect: true,\n };\n },\n};\n\n/**\n * Explicit prop definition factory. Plain objects with `{ default: ... }` are duck-typed as PropDef.\n * @example\n * props: {\n * label: 'Default Label',\n * disabled: { default: false, reflect: true },\n * }\n */\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> =>\n typeof value === 'object' && value !== null && 'default' in value;\n\nconst isStructuredValue = (value: unknown): boolean =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\nexport function normalizePropDefinition<T>(value: T | PropDef<T>): PropDef<T> {\n if (isPropDef(value)) {\n const descriptor = value as PropDef<T>;\n const reflect = descriptor.reflect ?? true;\n\n if (reflect && isStructuredValue(descriptor.default)) {\n throw new Error('Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.');\n }\n\n return {\n ...descriptor,\n reflect,\n };\n }\n\n if (isStructuredValue(value)) {\n return {\n default: value as T,\n reflect: false,\n };\n }\n\n return {\n default: value as T,\n reflect: true,\n };\n}\n\nexport const propRegistry = new WeakMap<HTMLElement, Map<string, PropMeta<unknown>>>();\n\nconst reflectingAttrs = new WeakMap<HTMLElement, Set<string>>();\n\nconst markReflecting = (el: HTMLElement, name: string): void => {\n let names = reflectingAttrs.get(el);\n\n if (!names) {\n names = new Set<string>();\n reflectingAttrs.set(el, names);\n }\n\n names.add(name);\n};\n\nconst unmarkReflecting = (el: HTMLElement, name: string): void => {\n const names = reflectingAttrs.get(el);\n\n if (!names) return;\n\n names.delete(name);\n\n if (names.size === 0) reflectingAttrs.delete(el);\n};\n\nexport const isReflecting = (el: HTMLElement, name: string): boolean => reflectingAttrs.get(el)?.has(name) ?? false;\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nconst parseBoolean = <T>(value: string | null): T => (value === '' || value === 'true') as T;\nconst parseNumber = <T>(value: string | null): T => Number(value) as T;\nconst parseString = <T>(value: string | null): T => value as unknown as T;\n\nconst PARSER_BY_TYPE: Record<string, <T>(value: string | null) => T> = {\n boolean: parseBoolean,\n number: parseNumber,\n string: parseString,\n};\n\n/** Infer attribute parser from default value type. */\nconst inferParserFromValue = <T>(defaultValue: T): ((value: string | null) => T) => {\n return (value: string | null): T => {\n if (value == null) return defaultValue;\n\n const parser = PARSER_BY_TYPE[typeof defaultValue];\n\n return parser ? (parser(value) as T) : (value as unknown as T);\n };\n};\n\n/** @internal Runtime prop registration (called by createProps) */\nconst registerProp = <T>(propName: string, attrName: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const el = currentElementOrThrow();\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n // Infer parser from default value type if not explicitly provided\n const parse = options?.parse ?? inferParserFromValue<T>(defaultValue);\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, propName);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[propName] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[propName];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(attrName)) {\n s.value = parse(el.getAttribute(attrName)) as T;\n }\n\n propRegistry.get(el)!.set(attrName, meta);\n\n Object.defineProperty(el, propName, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n effect(() => {\n const v = s.value;\n\n markReflecting(el, attrName);\n\n try {\n if (v == null) {\n el.removeAttribute(attrName);\n } else if (typeof v === 'boolean') {\n el.toggleAttribute(attrName, v);\n } else {\n setAttr(el, attrName, v);\n }\n } finally {\n unmarkReflecting(el, attrName);\n }\n });\n }\n\n return s;\n};\n\nexport type InferPropValue<T> = T extends PropDef<infer U> ? U : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n readonly [K in keyof T]-?: Signal<T[K]>;\n};\n\nexport function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n\n for (const [name, def] of Object.entries(defs)) {\n // Ensure definition is normalized (should have been done at define-time, but this is a safety measure)\n const descriptor =\n typeof def === 'object' && def !== null && 'default' in def\n ? (def as PropDef<unknown>)\n : normalizePropDefinition(def);\n const attrName = toKebab(name);\n\n props[name] = registerProp(name, attrName, descriptor.default, descriptor);\n }\n\n return props as InferPropsSignals<InferPropsFromDefs<D>>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type Signal } from '@vielzeug/stateit';
2
+ export type PropOptions<T> = {
3
+ parse?: (value: string | null) => T;
4
+ /** Whether to reflect prop changes to HTML attributes. Default: true.
5
+ * Set to false only when host.bind() manages the same attribute with derived/computed state. */
6
+ reflect?: boolean;
7
+ };
8
+ export type PropsDef<T extends Record<string, unknown>> = {
9
+ [K in keyof Required<T>]: T[K] | undefined | PropDef<T[K] | undefined>;
10
+ };
11
+ export type PropDef<T> = PropOptions<T> & {
12
+ readonly default: T;
13
+ };
14
+ export type PropInputDefs = Record<string, unknown | PropDef<unknown>>;
15
+ export declare const prop: {
16
+ bool(defaultValue?: boolean): PropDef<boolean>;
17
+ json<T>(defaultValue: T): PropDef<T>;
18
+ number(defaultValue?: number): PropDef<number>;
19
+ oneOf<T extends string>(allowed: readonly T[], defaultValue: T): PropDef<T>;
20
+ string<T extends string>(defaultValue: T): PropDef<T>;
21
+ };
22
+ export declare function normalizePropDefinition<T>(value: T | PropDef<T>): PropDef<T>;
23
+ export declare const propRegistry: WeakMap<HTMLElement, Map<string, PropMeta<unknown>>>;
24
+ export declare const isReflecting: (el: HTMLElement, name: string) => boolean;
25
+ type PropMeta<T = unknown> = {
26
+ parse: (value: string | null) => T;
27
+ reflect: boolean;
28
+ signal: Signal<T>;
29
+ };
30
+ export type InferPropValue<T> = T extends PropDef<infer U> ? U : T;
31
+ export type InferPropsFromDefs<T extends PropInputDefs> = {
32
+ [K in keyof T]: InferPropValue<T[K]>;
33
+ };
34
+ export type InferPropsSignals<T extends Record<string, unknown>> = {
35
+ readonly [K in keyof T]-?: Signal<T[K]>;
36
+ };
37
+ export declare function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<InferPropsFromDefs<D>>;
38
+ export {};
39
+ //# sourceMappingURL=props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAKxD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC;IACpC;oGACgG;IAChG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;KAEvD,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAEvE,eAAO,MAAM,IAAI;kCACa,OAAO,CAAC,OAAO,CAAC;SAOvC,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;mCAeV,OAAO,CAAC,MAAM,CAAC;UAOnC,CAAC,SAAS,MAAM,WAAW,SAAS,CAAC,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;WAOpE,CAAC,SAAS,MAAM,gBAAgB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAOtD,CAAC;AAiBF,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA0B5E;AAED,eAAO,MAAM,YAAY,sDAA6D,CAAC;AAyBvF,eAAO,MAAM,YAAY,GAAI,IAAI,WAAW,EAAE,MAAM,MAAM,KAAG,OAAsD,CAAC;AAEpH,KAAK,QAAQ,CAAC,CAAC,GAAG,OAAO,IAAI;IAC3B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACnB,CAAC;AAmFF,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEnE,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,aAAa,IAAI;KACvD,CAAC,IAAI,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACjE,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAetG"}
package/dist/props.js ADDED
@@ -0,0 +1,2 @@
1
+ import{currentElementOrThrow as e,effect as t}from"./runtime.js";import{setAttr as n,toKebab as r}from"./internal.js";import{signal as i}from"@vielzeug/stateit";var a={bool(e=!1){return{default:e,parse:e=>e===``||e===`true`,reflect:!0}},json(e){return{default:e,parse:t=>{if(t==null||t===``)return e;try{return JSON.parse(t)}catch{return e}},reflect:!1}},number(e=0){return{default:e,parse:t=>t==null?e:Number(t),reflect:!0}},oneOf(e,t){return{default:t,parse:n=>n!=null&&e.includes(n)?n:t,reflect:!0}},string(e){return{default:e,parse:t=>t??e,reflect:!0}}},o=e=>typeof e==`object`&&!!e&&`default`in e,s=e=>Array.isArray(e)||typeof e==`object`&&!!e;function c(e){if(o(e)){let t=e,n=t.reflect??!0;if(n&&s(t.default))throw Error(`Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.`);return{...t,reflect:n}}return s(e)?{default:e,reflect:!1}:{default:e,reflect:!0}}var l=new WeakMap,u=new WeakMap,d=(e,t)=>{let n=u.get(e);n||(n=new Set,u.set(e,n)),n.add(t)},f=(e,t)=>{let n=u.get(e);n&&(n.delete(t),n.size===0&&u.delete(e))},p=(e,t)=>u.get(e)?.has(t)??!1,m={boolean:e=>e===``||e===`true`,number:e=>Number(e),string:e=>e},h=e=>t=>{if(t==null)return e;let n=m[typeof e];return n?n(t):t},g=(r,a,o,s)=>{let c=e();l.has(c)||l.set(c,new Map);let u=s?.parse??h(o),p=i(o),m=Object.prototype.hasOwnProperty.call(c,r),g=m?c[r]:void 0,_={parse:u,reflect:s?.reflect??!0,signal:p};return m?(delete c[r],p.value=g):c.hasAttribute(a)&&(p.value=u(c.getAttribute(a))),l.get(c).set(a,_),Object.defineProperty(c,r,{configurable:!0,enumerable:!0,get:()=>p.value,set:e=>{p.value=e}}),(s?.reflect??!0)&&t(()=>{let e=p.value;d(c,a);try{e==null?c.removeAttribute(a):typeof e==`boolean`?c.toggleAttribute(a,e):n(c,a,e)}finally{f(c,a)}}),p};function _(e){let t={};for(let[n,i]of Object.entries(e)){let e=typeof i==`object`&&i&&`default`in i?i:c(i);t[n]=g(n,r(n),e.default,e)}return t}export{_ as createProps,p as isReflecting,c as normalizePropDefinition,a as prop,l as propRegistry};
2
+ //# sourceMappingURL=props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"props.js","names":[],"sources":["../src/props.ts"],"sourcesContent":["import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentElementOrThrow, effect } from './runtime';\n\nexport type PropOptions<T> = {\n parse?: (value: string | null) => T;\n /** Whether to reflect prop changes to HTML attributes. Default: true.\n * Set to false only when host.bind() manages the same attribute with derived/computed state. */\n reflect?: boolean;\n};\n\nexport type PropsDef<T extends Record<string, unknown>> = {\n // Keep default authoring ergonomic: plain `undefined` is a valid default for any prop.\n [K in keyof Required<T>]: T[K] | undefined | PropDef<T[K] | undefined>;\n};\n\nexport type PropDef<T> = PropOptions<T> & { readonly default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\nexport const prop = {\n bool(defaultValue = false): PropDef<boolean> {\n return {\n default: defaultValue,\n parse: (value) => value === '' || value === 'true',\n reflect: true,\n };\n },\n json<T>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => {\n if (value == null || value === '') return defaultValue;\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n },\n reflect: false,\n };\n },\n number(defaultValue = 0): PropDef<number> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : Number(value)),\n reflect: true,\n };\n },\n oneOf<T extends string>(allowed: readonly T[], defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value != null && allowed.includes(value as T) ? (value as T) : defaultValue),\n reflect: true,\n };\n },\n string<T extends string>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : (value as T)),\n reflect: true,\n };\n },\n};\n\n/**\n * Explicit prop definition factory. Plain objects with `{ default: ... }` are duck-typed as PropDef.\n * @example\n * props: {\n * label: 'Default Label',\n * disabled: { default: false, reflect: true },\n * }\n */\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> =>\n typeof value === 'object' && value !== null && 'default' in value;\n\nconst isStructuredValue = (value: unknown): boolean =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\nexport function normalizePropDefinition<T>(value: T | PropDef<T>): PropDef<T> {\n if (isPropDef(value)) {\n const descriptor = value as PropDef<T>;\n const reflect = descriptor.reflect ?? true;\n\n if (reflect && isStructuredValue(descriptor.default)) {\n throw new Error('Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.');\n }\n\n return {\n ...descriptor,\n reflect,\n };\n }\n\n if (isStructuredValue(value)) {\n return {\n default: value as T,\n reflect: false,\n };\n }\n\n return {\n default: value as T,\n reflect: true,\n };\n}\n\nexport const propRegistry = new WeakMap<HTMLElement, Map<string, PropMeta<unknown>>>();\n\nconst reflectingAttrs = new WeakMap<HTMLElement, Set<string>>();\n\nconst markReflecting = (el: HTMLElement, name: string): void => {\n let names = reflectingAttrs.get(el);\n\n if (!names) {\n names = new Set<string>();\n reflectingAttrs.set(el, names);\n }\n\n names.add(name);\n};\n\nconst unmarkReflecting = (el: HTMLElement, name: string): void => {\n const names = reflectingAttrs.get(el);\n\n if (!names) return;\n\n names.delete(name);\n\n if (names.size === 0) reflectingAttrs.delete(el);\n};\n\nexport const isReflecting = (el: HTMLElement, name: string): boolean => reflectingAttrs.get(el)?.has(name) ?? false;\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nconst parseBoolean = <T>(value: string | null): T => (value === '' || value === 'true') as T;\nconst parseNumber = <T>(value: string | null): T => Number(value) as T;\nconst parseString = <T>(value: string | null): T => value as unknown as T;\n\nconst PARSER_BY_TYPE: Record<string, <T>(value: string | null) => T> = {\n boolean: parseBoolean,\n number: parseNumber,\n string: parseString,\n};\n\n/** Infer attribute parser from default value type. */\nconst inferParserFromValue = <T>(defaultValue: T): ((value: string | null) => T) => {\n return (value: string | null): T => {\n if (value == null) return defaultValue;\n\n const parser = PARSER_BY_TYPE[typeof defaultValue];\n\n return parser ? (parser(value) as T) : (value as unknown as T);\n };\n};\n\n/** @internal Runtime prop registration (called by createProps) */\nconst registerProp = <T>(propName: string, attrName: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const el = currentElementOrThrow();\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n // Infer parser from default value type if not explicitly provided\n const parse = options?.parse ?? inferParserFromValue<T>(defaultValue);\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, propName);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[propName] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[propName];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(attrName)) {\n s.value = parse(el.getAttribute(attrName)) as T;\n }\n\n propRegistry.get(el)!.set(attrName, meta);\n\n Object.defineProperty(el, propName, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n effect(() => {\n const v = s.value;\n\n markReflecting(el, attrName);\n\n try {\n if (v == null) {\n el.removeAttribute(attrName);\n } else if (typeof v === 'boolean') {\n el.toggleAttribute(attrName, v);\n } else {\n setAttr(el, attrName, v);\n }\n } finally {\n unmarkReflecting(el, attrName);\n }\n });\n }\n\n return s;\n};\n\nexport type InferPropValue<T> = T extends PropDef<infer U> ? U : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n readonly [K in keyof T]-?: Signal<T[K]>;\n};\n\nexport function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n\n for (const [name, def] of Object.entries(defs)) {\n // Ensure definition is normalized (should have been done at define-time, but this is a safety measure)\n const descriptor =\n typeof def === 'object' && def !== null && 'default' in def\n ? (def as PropDef<unknown>)\n : normalizePropDefinition(def);\n const attrName = toKebab(name);\n\n props[name] = registerProp(name, attrName, descriptor.default, descriptor);\n }\n\n return props as InferPropsSignals<InferPropsFromDefs<D>>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./errors.cjs`),t=require(`./runtime.cjs`),n=require(`./internal.cjs`),r=require(`./host.cjs`),i=require(`./props.cjs`),a=require(`./template-bindings.cjs`);let o=require(`@vielzeug/stateit`);var s=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_component;constructor(){super();let e=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...e?.shadow}),this._component={mountCallbacks:[],mountedCallbacksRan:!1,mountToken:0,scope:(0,o.scope)(),setupDone:!1,styles:e?.styles,templateMounted:!1,templateResult:null}}connectedCallback(){(0,o.untrack)(()=>{this._component.setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n||i.isReflecting(this,e))return;let r=i.propRegistry.get(this)?.get(e);if(!r)return;let a=r.parse(n);Object.is((0,o.untrack)(()=>r.signal.value),a)||(r.signal.value=a)}disconnectedCallback(){this._component.mountToken++,this._component.scope.dispose(),this._component.scope=(0,o.scope)(),this._component.mountCallbacks=[],this._component.mountedCallbacksRan=!1,this._component.templateMounted=!1,this._component.templateResult=null,this._component.setupDone=!1}_handleError(t){throw console.error(e.CRAFTIT_ERRORS.unhandledComponentError(this.localName),t),t instanceof Error?t:Error(String(t))}_runSetup(){let e={element:this,mountCallbacks:[]};try{this._component.scope.run(()=>{let n=t.withRuntimeScope(e,()=>t.withCurrentElement(this,()=>this.constructor._setup()));this._component.templateResult=t.withRuntimeScope(e,()=>t.withCurrentElement(this,()=>n()))}),this._component.mountCallbacks.push(...e.mountCallbacks),this._component.setupDone=!0}catch(e){this._handleError(e)}}_init(){let{styles:e}=this._component;if(e?.length&&(this.shadow.adoptedStyleSheets=e.map(n.loadStylesheet)),!this._component.templateMounted&&this._component.templateResult!=null){let{bindings:e,html:t}=n.extractResult(this._component.templateResult);this.shadow.replaceChildren(a.parseHTML(t)),this._component.templateMounted=!0,e.length&&this._component.scope.run(()=>{a.applyBindingsInContainer(this.shadow,e,o.onCleanup,{onHtml:e=>a.applyHtmlBinding(this.shadow,e,o.onCleanup)})})}if(!this._component.mountedCallbacksRan&&this._component.mountCallbacks.length>0){this._component.mountedCallbacksRan=!0;let e=++this._component.mountToken;queueMicrotask(()=>{if(!(!this.isConnected||e!==this._component.mountToken))try{for(let e of this._component.mountCallbacks)this._component.scope.run(()=>{t.withRuntimeScope({element:this,mountCallbacks:[]},()=>t.withCurrentElement(this,()=>{let t=e();typeof t==`function`&&(0,o.onCleanup)(t)}))})}catch(e){this._handleError(e)}})}}},c=(t,n,r={})=>{if(!t)throw Error(e.CRAFTIT_ERRORS.defineRequiresTag);if(customElements.get(t))throw Error(e.CRAFTIT_ERRORS.defineDuplicate(t));class i extends s{static _options=r;static _setup=n;static formAssociated=r.formAssociated??!1;static observedAttributes=r.observedAttrs??[]}return customElements.define(t,i),t},l=e=>e?i.createProps(e):{};function u(e,t){let{formAssociated:a,props:o,setup:s,shadow:u,styles:d}=t,f=(()=>{if(!o)return;let e={};for(let[t,n]of Object.entries(o))e[t]=i.normalizePropDefinition(n);return e})();return c(e,()=>{let e=l(f),t=r.createHost();return s(e,{emit:n.createEmitFn(),host:t,slots:r.createSlots()})},{formAssociated:a,observedAttrs:f?Object.keys(f).map(n.toKebab):[],shadow:u,styles:d})}exports.define=u;
2
+ //# sourceMappingURL=registration.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.cjs","names":[],"sources":["../src/registration.ts"],"sourcesContent":["import { onCleanup as _onCleanup, scope as _scope, type Scope, untrack } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { createHost, createSlots, type ComponentHost, type ComponentSlots } from './host';\nimport {\n createEmitFn,\n type CSSResult,\n type EmitFn,\n extractResult,\n type HTMLResult,\n loadStylesheet,\n toKebab,\n} from './internal';\nimport {\n createProps,\n isReflecting,\n normalizePropDefinition,\n prop,\n propRegistry,\n type InferPropsFromDefs,\n type InferPropsSignals,\n type PropDef,\n type PropInputDefs,\n type PropOptions,\n type PropsDef,\n} from './props';\nimport { type OnMountedCallback, type RuntimeScope, withCurrentElement, withRuntimeScope } from './runtime';\nimport { applyBindingsInContainer, applyHtmlBinding, parseHTML } from './template-bindings';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** @internal — list of attribute names to observe via attributeChangedCallback */\n observedAttrs?: string[];\n /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport type ComponentTemplate = () => HTMLResult;\n\ntype ComponentState = {\n mountCallbacks: OnMountedCallback[];\n mountedCallbacksRan: boolean;\n mountToken: number;\n scope: Scope;\n setupDone: boolean;\n styles?: (string | CSSStyleSheet | CSSResult)[];\n templateMounted: boolean;\n templateResult: HTMLResult | null;\n};\n\nclass BaseElement extends HTMLElement {\n // Lifecycle: setup() runs on first connect (initializes scope + calls user setup).\n // _init() runs on every connect (applies initial attributes to reset prop state).\n // disconnectedCallback() disposes scope to run effect cleanups, then recreates it.\n // This means setup() re-runs on reconnect. Future optimization: track \"mounted\" state\n // separately to avoid re-running setup() on reconnect while still running cleanups.\n // On disconnect: cleanups run; on reconnect, styles and bindings are re-applied.\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentTemplate;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _component: ComponentState;\n\n constructor() {\n super();\n\n const options = (this.constructor as typeof BaseElement)._options;\n\n this.shadow = this.attachShadow({ mode: 'open', ...options?.shadow });\n this._component = {\n mountCallbacks: [],\n mountedCallbacksRan: false,\n mountToken: 0,\n scope: _scope(),\n setupDone: false,\n styles: options?.styles,\n templateMounted: false,\n templateResult: null,\n };\n }\n\n connectedCallback(): void {\n untrack(() => {\n if (!this._component.setupDone) this._runSetup();\n\n this._init();\n });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (isReflecting(this, name)) return;\n\n const propMeta = propRegistry.get(this)?.get(name);\n\n if (!propMeta) return;\n\n const parsed = propMeta.parse(newValue);\n\n if (\n !Object.is(\n untrack(() => propMeta.signal.value),\n parsed,\n )\n ) {\n propMeta.signal.value = parsed as never;\n }\n }\n\n disconnectedCallback(): void {\n this._component.mountToken++;\n // Dispose and recreate scope to run all effect cleanups\n this._component.scope.dispose();\n this._component.scope = _scope();\n // Reset mount state for fresh mount callbacks on reconnect\n this._component.mountCallbacks = [];\n this._component.mountedCallbacksRan = false;\n this._component.templateMounted = false;\n this._component.templateResult = null;\n // Reset setupDone to re-run setup() on reconnect, ensuring effects are re-registered\n this._component.setupDone = false;\n }\n\n private _handleError(err: unknown): void {\n console.error(CRAFTIT_ERRORS.unhandledComponentError(this.localName), err);\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n private _runSetup(): void {\n const setupScope: RuntimeScope = {\n element: this,\n mountCallbacks: [],\n };\n\n try {\n this._component.scope.run(() => {\n const template = withRuntimeScope(setupScope, () =>\n withCurrentElement(this, () => (this.constructor as typeof BaseElement)._setup()),\n );\n\n this._component.templateResult = withRuntimeScope(setupScope, () => withCurrentElement(this, () => template()));\n });\n\n this._component.mountCallbacks.push(...setupScope.mountCallbacks);\n this._component.setupDone = true;\n } catch (err) {\n this._handleError(err);\n }\n }\n\n private _init(): void {\n const { styles } = this._component;\n\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (!this._component.templateMounted && this._component.templateResult != null) {\n const { bindings, html: htmlString } = extractResult(this._component.templateResult);\n\n this.shadow.replaceChildren(parseHTML(htmlString));\n this._component.templateMounted = true;\n\n if (bindings.length) {\n this._component.scope.run(() => {\n applyBindingsInContainer(this.shadow, bindings, _onCleanup, {\n onHtml: (binding) => applyHtmlBinding(this.shadow, binding, _onCleanup),\n });\n });\n }\n }\n\n if (!this._component.mountedCallbacksRan && this._component.mountCallbacks.length > 0) {\n this._component.mountedCallbacksRan = true;\n\n const token = ++this._component.mountToken;\n\n queueMicrotask(() => {\n if (!this.isConnected || token !== this._component.mountToken) return;\n\n try {\n for (const callback of this._component.mountCallbacks) {\n this._component.scope.run(() => {\n withRuntimeScope(\n {\n element: this,\n mountCallbacks: [],\n },\n () =>\n withCurrentElement(this, () => {\n const cleanup = callback();\n\n if (typeof cleanup === 'function') _onCleanup(cleanup);\n }),\n );\n });\n }\n } catch (err) {\n this._handleError(err);\n }\n });\n }\n }\n}\n\nconst defineComponent = (\n tag: string,\n setup: () => ComponentTemplate,\n options: ComponentRegistrationOptions = {},\n): string => {\n if (!tag) throw new Error(CRAFTIT_ERRORS.defineRequiresTag);\n\n if (customElements.get(tag)) {\n throw new Error(CRAFTIT_ERRORS.defineDuplicate(tag));\n }\n\n class Element extends BaseElement {\n static override _options = options;\n static override _setup = setup;\n static override formAssociated = options.formAssociated ?? false;\n static override observedAttributes = options.observedAttrs ?? [];\n }\n\n customElements.define(tag, Element);\n\n return tag;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PUBLIC COMPONENT AUTHORING API (absorbed from component.ts)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { prop };\nexport type { InferPropsFromDefs, InferPropsSignals, PropDef, PropInputDefs, PropOptions, PropsDef };\n\n/**\n * Setup context passed as the second argument to the component setup function.\n */\nexport type SetupContextBag<Emits extends Record<string, unknown> = Record<string, unknown>> = {\n emit: EmitFn<Emits>;\n host: ComponentHost;\n slots: ComponentSlots;\n};\n\nexport type ComponentDefinition<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Enable form association for the custom element */\n formAssociated?: boolean;\n /** Component properties and their metadata */\n props?: PropsDef<Props>;\n /** Main setup function. Props are the first positional parameter, context bag is second. Returns a template function. */\n setup: (props: InferPropsSignals<Props>, ctx: SetupContextBag<Emits>) => ComponentTemplate;\n /** Shadow DOM configuration (mode is always 'open') */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component-specific styles */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nconst createSetupProps = <Props extends Record<string, unknown>>(\n defs: PropsDef<Props> | undefined,\n): InferPropsSignals<Props> => {\n if (!defs) return {} as InferPropsSignals<Props>;\n\n return createProps(defs) as InferPropsSignals<Props>;\n};\n\nexport function define<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n>(tag: string, definition: ComponentDefinition<Props, Emits>): string {\n const { formAssociated, props: propDefs, setup, shadow: shadowOptions, styles } = definition;\n\n // Normalize props at define-time for early error feedback\n const normalizedPropDefs: PropsDef<Props> | undefined = (() => {\n if (!propDefs) return undefined;\n\n const normalized: PropInputDefs = {};\n\n for (const [key, def] of Object.entries(propDefs)) {\n normalized[key] = normalizePropDefinition(def);\n }\n\n return normalized as PropsDef<Props>;\n })();\n\n const observedAttrs = normalizedPropDefs ? Object.keys(normalizedPropDefs).map(toKebab) : [];\n\n return defineComponent(\n tag,\n () => {\n const props = createSetupProps(normalizedPropDefs);\n const host = createHost();\n const emit = createEmitFn<Emits>();\n const slots = createSlots();\n\n return setup(props, { emit, host, slots });\n },\n { formAssociated, observedAttrs, shadow: shadowOptions, styles },\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type ComponentHost, type ComponentSlots } from './host';
2
+ import { type CSSResult, type EmitFn, type HTMLResult } from './internal';
3
+ import { prop, type InferPropsFromDefs, type InferPropsSignals, type PropDef, type PropInputDefs, type PropOptions, type PropsDef } from './props';
4
+ export type ComponentRegistrationOptions = {
5
+ /** Indicates if this should be a form-associated element */
6
+ formAssociated?: boolean;
7
+ /** @internal — list of attribute names to observe via attributeChangedCallback */
8
+ observedAttrs?: string[];
9
+ /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */
10
+ shadow?: Omit<ShadowRootInit, 'mode'>;
11
+ /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */
12
+ styles?: (string | CSSStyleSheet | CSSResult)[];
13
+ };
14
+ export type ComponentTemplate = () => HTMLResult;
15
+ export { prop };
16
+ export type { InferPropsFromDefs, InferPropsSignals, PropDef, PropInputDefs, PropOptions, PropsDef };
17
+ /**
18
+ * Setup context passed as the second argument to the component setup function.
19
+ */
20
+ export type SetupContextBag<Emits extends Record<string, unknown> = Record<string, unknown>> = {
21
+ emit: EmitFn<Emits>;
22
+ host: ComponentHost;
23
+ slots: ComponentSlots;
24
+ };
25
+ export type ComponentDefinition<Props extends Record<string, unknown> = Record<never, never>, Emits extends Record<string, unknown> = Record<string, never>> = {
26
+ /** Enable form association for the custom element */
27
+ formAssociated?: boolean;
28
+ /** Component properties and their metadata */
29
+ props?: PropsDef<Props>;
30
+ /** Main setup function. Props are the first positional parameter, context bag is second. Returns a template function. */
31
+ setup: (props: InferPropsSignals<Props>, ctx: SetupContextBag<Emits>) => ComponentTemplate;
32
+ /** Shadow DOM configuration (mode is always 'open') */
33
+ shadow?: Omit<ShadowRootInit, 'mode'>;
34
+ /** Component-specific styles */
35
+ styles?: (string | CSSStyleSheet | CSSResult)[];
36
+ };
37
+ export declare function define<Props extends Record<string, unknown> = Record<never, never>, Emits extends Record<string, unknown> = Record<string, never>>(tag: string, definition: ComponentDefinition<Props, Emits>): string;
38
+ //# sourceMappingURL=registration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC1F,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,MAAM,EAEX,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,IAAI,EAEJ,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAIjB,MAAM,MAAM,4BAA4B,GAAG;IACzC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,+GAA+G;IAC/G,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtC,oGAAoG;IACpG,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,UAAU,CAAC;AAqMjD,OAAO,EAAE,IAAI,EAAE,CAAC;AAChB,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAErG;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC7F,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAC7B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC5D,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAC3D;IACF,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxB,yHAAyH;IACzH,KAAK,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAC;IAC3F,uDAAuD;IACvD,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtC,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC,EAAE,CAAC;CACjD,CAAC;AAUF,wBAAgB,MAAM,CACpB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC5D,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC7D,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CA8BpE"}
@@ -0,0 +1,2 @@
1
+ import{CRAFTIT_ERRORS as e}from"./errors.js";import{withCurrentElement as t,withRuntimeScope as n}from"./runtime.js";import{createEmitFn as r,extractResult as i,loadStylesheet as a,toKebab as o}from"./internal.js";import{createHost as s,createSlots as c}from"./host.js";import{createProps as l,isReflecting as u,normalizePropDefinition as d,propRegistry as f}from"./props.js";import{applyBindingsInContainer as p,applyHtmlBinding as m,parseHTML as h}from"./template-bindings.js";import{onCleanup as g,scope as _,untrack as v}from"@vielzeug/stateit";var y=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_component;constructor(){super();let e=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...e?.shadow}),this._component={mountCallbacks:[],mountedCallbacksRan:!1,mountToken:0,scope:_(),setupDone:!1,styles:e?.styles,templateMounted:!1,templateResult:null}}connectedCallback(){v(()=>{this._component.setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n||u(this,e))return;let r=f.get(this)?.get(e);if(!r)return;let i=r.parse(n);Object.is(v(()=>r.signal.value),i)||(r.signal.value=i)}disconnectedCallback(){this._component.mountToken++,this._component.scope.dispose(),this._component.scope=_(),this._component.mountCallbacks=[],this._component.mountedCallbacksRan=!1,this._component.templateMounted=!1,this._component.templateResult=null,this._component.setupDone=!1}_handleError(t){throw console.error(e.unhandledComponentError(this.localName),t),t instanceof Error?t:Error(String(t))}_runSetup(){let e={element:this,mountCallbacks:[]};try{this._component.scope.run(()=>{let r=n(e,()=>t(this,()=>this.constructor._setup()));this._component.templateResult=n(e,()=>t(this,()=>r()))}),this._component.mountCallbacks.push(...e.mountCallbacks),this._component.setupDone=!0}catch(e){this._handleError(e)}}_init(){let{styles:e}=this._component;if(e?.length&&(this.shadow.adoptedStyleSheets=e.map(a)),!this._component.templateMounted&&this._component.templateResult!=null){let{bindings:e,html:t}=i(this._component.templateResult);this.shadow.replaceChildren(h(t)),this._component.templateMounted=!0,e.length&&this._component.scope.run(()=>{p(this.shadow,e,g,{onHtml:e=>m(this.shadow,e,g)})})}if(!this._component.mountedCallbacksRan&&this._component.mountCallbacks.length>0){this._component.mountedCallbacksRan=!0;let e=++this._component.mountToken;queueMicrotask(()=>{if(!(!this.isConnected||e!==this._component.mountToken))try{for(let e of this._component.mountCallbacks)this._component.scope.run(()=>{n({element:this,mountCallbacks:[]},()=>t(this,()=>{let t=e();typeof t==`function`&&g(t)}))})}catch(e){this._handleError(e)}})}}},b=(t,n,r={})=>{if(!t)throw Error(e.defineRequiresTag);if(customElements.get(t))throw Error(e.defineDuplicate(t));class i extends y{static _options=r;static _setup=n;static formAssociated=r.formAssociated??!1;static observedAttributes=r.observedAttrs??[]}return customElements.define(t,i),t},x=e=>e?l(e):{};function S(e,t){let{formAssociated:n,props:i,setup:a,shadow:l,styles:u}=t,f=(()=>{if(!i)return;let e={};for(let[t,n]of Object.entries(i))e[t]=d(n);return e})();return b(e,()=>{let e=x(f),t=s();return a(e,{emit:r(),host:t,slots:c()})},{formAssociated:n,observedAttrs:f?Object.keys(f).map(o):[],shadow:l,styles:u})}export{S as define};
2
+ //# sourceMappingURL=registration.js.map