@vielzeug/craftit 2.1.0 → 3.0.3

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 (325) hide show
  1. package/README.md +58 -124
  2. package/dist/controls/a11y-control.cjs +1 -1
  3. package/dist/controls/a11y-control.cjs.map +1 -1
  4. package/dist/controls/a11y-control.d.ts +1 -1
  5. package/dist/controls/a11y-control.d.ts.map +1 -1
  6. package/dist/controls/a11y-control.js +1 -1
  7. package/dist/controls/a11y-control.js.map +1 -1
  8. package/dist/controls/checkable-control.cjs +1 -1
  9. package/dist/controls/checkable-control.cjs.map +1 -1
  10. package/dist/controls/checkable-control.d.ts +7 -7
  11. package/dist/controls/checkable-control.d.ts.map +1 -1
  12. package/dist/controls/checkable-control.js +1 -1
  13. package/dist/controls/checkable-control.js.map +1 -1
  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 +1 -1
  21. package/dist/controls/field-control.cjs.map +1 -1
  22. package/dist/controls/field-control.d.ts +28 -73
  23. package/dist/controls/field-control.d.ts.map +1 -1
  24. package/dist/controls/field-control.js +1 -1
  25. package/dist/controls/field-control.js.map +1 -1
  26. package/dist/controls/index.d.ts +11 -9
  27. package/dist/controls/index.d.ts.map +1 -1
  28. package/dist/controls/internal/control-state.cjs +1 -1
  29. package/dist/controls/internal/control-state.cjs.map +1 -1
  30. package/dist/controls/internal/control-state.d.ts +6 -4
  31. package/dist/controls/internal/control-state.d.ts.map +1 -1
  32. package/dist/controls/internal/control-state.js +1 -1
  33. package/dist/controls/internal/control-state.js.map +1 -1
  34. package/dist/controls/internal/keyboard-utils.cjs.map +1 -1
  35. package/dist/controls/internal/keyboard-utils.js.map +1 -1
  36. package/dist/controls/internal/number-utils.cjs.map +1 -1
  37. package/dist/controls/internal/number-utils.js.map +1 -1
  38. package/dist/controls/internal/validation-utils.cjs.map +1 -1
  39. package/dist/controls/internal/validation-utils.js.map +1 -1
  40. package/dist/controls/list-control.cjs +1 -1
  41. package/dist/controls/list-control.cjs.map +1 -1
  42. package/dist/controls/list-control.d.ts +10 -8
  43. package/dist/controls/list-control.d.ts.map +1 -1
  44. package/dist/controls/list-control.js +1 -1
  45. package/dist/controls/list-control.js.map +1 -1
  46. package/dist/controls/overlay-control.cjs +1 -1
  47. package/dist/controls/overlay-control.cjs.map +1 -1
  48. package/dist/controls/overlay-control.d.ts +17 -14
  49. package/dist/controls/overlay-control.d.ts.map +1 -1
  50. package/dist/controls/overlay-control.js +1 -1
  51. package/dist/controls/overlay-control.js.map +1 -1
  52. package/dist/controls/popup-list-control.cjs +2 -0
  53. package/dist/controls/popup-list-control.cjs.map +1 -0
  54. package/dist/controls/popup-list-control.d.ts +160 -0
  55. package/dist/controls/popup-list-control.d.ts.map +1 -0
  56. package/dist/controls/popup-list-control.js +2 -0
  57. package/dist/controls/popup-list-control.js.map +1 -0
  58. package/dist/controls/press-control.cjs.map +1 -1
  59. package/dist/controls/press-control.js.map +1 -1
  60. package/dist/controls/slider-control.cjs.map +1 -1
  61. package/dist/controls/slider-control.js.map +1 -1
  62. package/dist/controls/spinner-control.cjs.map +1 -1
  63. package/dist/controls/spinner-control.js.map +1 -1
  64. package/dist/controls/swipe-control.cjs +2 -0
  65. package/dist/controls/swipe-control.cjs.map +1 -0
  66. package/dist/controls/swipe-control.d.ts +32 -0
  67. package/dist/controls/swipe-control.d.ts.map +1 -0
  68. package/dist/controls/swipe-control.js +2 -0
  69. package/dist/controls/swipe-control.js.map +1 -0
  70. package/dist/controls/text-field-control.cjs +2 -0
  71. package/dist/controls/text-field-control.cjs.map +1 -0
  72. package/dist/controls/text-field-control.d.ts +3 -0
  73. package/dist/controls/text-field-control.d.ts.map +1 -0
  74. package/dist/controls/text-field-control.js +2 -0
  75. package/dist/controls/text-field-control.js.map +1 -0
  76. package/dist/controls.cjs +1 -1
  77. package/dist/controls.js +1 -1
  78. package/dist/craftit.cjs +1 -1
  79. package/dist/craftit.cjs.map +1 -1
  80. package/dist/craftit.js +1 -1
  81. package/dist/craftit.js.map +1 -1
  82. package/dist/directives/classMap.cjs +2 -0
  83. package/dist/directives/classMap.cjs.map +1 -0
  84. package/dist/directives/classMap.d.ts +19 -0
  85. package/dist/directives/classMap.d.ts.map +1 -0
  86. package/dist/directives/classMap.js +2 -0
  87. package/dist/directives/classMap.js.map +1 -0
  88. package/dist/directives/each.cjs +1 -1
  89. package/dist/directives/each.cjs.map +1 -1
  90. package/dist/directives/each.d.ts +5 -30
  91. package/dist/directives/each.d.ts.map +1 -1
  92. package/dist/directives/each.js +1 -1
  93. package/dist/directives/each.js.map +1 -1
  94. package/dist/directives/guard.cjs +2 -0
  95. package/dist/directives/guard.cjs.map +1 -0
  96. package/dist/directives/guard.d.ts +10 -0
  97. package/dist/directives/guard.d.ts.map +1 -0
  98. package/dist/directives/guard.js +2 -0
  99. package/dist/directives/guard.js.map +1 -0
  100. package/dist/directives/live.cjs +2 -0
  101. package/dist/directives/live.cjs.map +1 -0
  102. package/dist/directives/live.d.ts +23 -0
  103. package/dist/directives/live.d.ts.map +1 -0
  104. package/dist/directives/live.js +2 -0
  105. package/dist/directives/live.js.map +1 -0
  106. package/dist/directives/raw.cjs +1 -1
  107. package/dist/directives/raw.cjs.map +1 -1
  108. package/dist/directives/raw.d.ts +3 -5
  109. package/dist/directives/raw.d.ts.map +1 -1
  110. package/dist/directives/raw.js +1 -1
  111. package/dist/directives/raw.js.map +1 -1
  112. package/dist/directives/resource.cjs +2 -0
  113. package/dist/directives/resource.cjs.map +1 -0
  114. package/dist/directives/resource.d.ts +32 -0
  115. package/dist/directives/resource.d.ts.map +1 -0
  116. package/dist/directives/resource.js +2 -0
  117. package/dist/directives/resource.js.map +1 -0
  118. package/dist/directives/styleMap.cjs +2 -0
  119. package/dist/directives/styleMap.cjs.map +1 -0
  120. package/dist/directives/styleMap.d.ts +11 -0
  121. package/dist/directives/styleMap.d.ts.map +1 -0
  122. package/dist/directives/styleMap.js +2 -0
  123. package/dist/directives/styleMap.js.map +1 -0
  124. package/dist/directives/when.cjs +1 -1
  125. package/dist/directives/when.cjs.map +1 -1
  126. package/dist/directives/when.d.ts +6 -19
  127. package/dist/directives/when.d.ts.map +1 -1
  128. package/dist/directives/when.js +1 -1
  129. package/dist/directives/when.js.map +1 -1
  130. package/dist/errors.cjs +2 -0
  131. package/dist/errors.cjs.map +1 -0
  132. package/dist/errors.d.ts +12 -0
  133. package/dist/errors.d.ts.map +1 -0
  134. package/dist/errors.js +2 -0
  135. package/dist/errors.js.map +1 -0
  136. package/dist/form.cjs +1 -1
  137. package/dist/form.cjs.map +1 -1
  138. package/dist/form.d.ts +3 -17
  139. package/dist/form.d.ts.map +1 -1
  140. package/dist/form.js +1 -1
  141. package/dist/form.js.map +1 -1
  142. package/dist/host.cjs +1 -1
  143. package/dist/host.cjs.map +1 -1
  144. package/dist/host.d.ts +40 -37
  145. package/dist/host.d.ts.map +1 -1
  146. package/dist/host.js +1 -1
  147. package/dist/host.js.map +1 -1
  148. package/dist/index.cjs +1 -1
  149. package/dist/index.d.ts +16 -8
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +1 -1
  152. package/dist/internal.cjs +1 -1
  153. package/dist/internal.cjs.map +1 -1
  154. package/dist/internal.d.ts +60 -120
  155. package/dist/internal.d.ts.map +1 -1
  156. package/dist/internal.js +1 -1
  157. package/dist/internal.js.map +1 -1
  158. package/dist/observers/index.d.ts +1 -0
  159. package/dist/observers/index.d.ts.map +1 -1
  160. package/dist/observers/intersection-observe.cjs +1 -1
  161. package/dist/observers/intersection-observe.cjs.map +1 -1
  162. package/dist/observers/intersection-observe.d.ts +1 -1
  163. package/dist/observers/intersection-observe.js +1 -1
  164. package/dist/observers/intersection-observe.js.map +1 -1
  165. package/dist/observers/media-observe.cjs +1 -1
  166. package/dist/observers/media-observe.cjs.map +1 -1
  167. package/dist/observers/media-observe.d.ts +1 -1
  168. package/dist/observers/media-observe.js +1 -1
  169. package/dist/observers/media-observe.js.map +1 -1
  170. package/dist/observers/mutation-observe.cjs +2 -0
  171. package/dist/observers/mutation-observe.cjs.map +1 -0
  172. package/dist/observers/mutation-observe.d.ts +10 -0
  173. package/dist/observers/mutation-observe.d.ts.map +1 -0
  174. package/dist/observers/mutation-observe.js +2 -0
  175. package/dist/observers/mutation-observe.js.map +1 -0
  176. package/dist/observers/resize-observe.cjs +1 -1
  177. package/dist/observers/resize-observe.cjs.map +1 -1
  178. package/dist/observers/resize-observe.d.ts +1 -1
  179. package/dist/observers/resize-observe.js +1 -1
  180. package/dist/observers/resize-observe.js.map +1 -1
  181. package/dist/observers.cjs +1 -1
  182. package/dist/observers.js +1 -1
  183. package/dist/props.cjs +1 -1
  184. package/dist/props.cjs.map +1 -1
  185. package/dist/props.d.ts +18 -31
  186. package/dist/props.d.ts.map +1 -1
  187. package/dist/props.js +1 -1
  188. package/dist/props.js.map +1 -1
  189. package/dist/registration.cjs +1 -1
  190. package/dist/registration.cjs.map +1 -1
  191. package/dist/registration.d.ts +27 -7
  192. package/dist/registration.d.ts.map +1 -1
  193. package/dist/registration.js +1 -1
  194. package/dist/registration.js.map +1 -1
  195. package/dist/runtime.cjs +1 -1
  196. package/dist/runtime.cjs.map +1 -1
  197. package/dist/runtime.d.ts +29 -17
  198. package/dist/runtime.d.ts.map +1 -1
  199. package/dist/runtime.js +1 -1
  200. package/dist/runtime.js.map +1 -1
  201. package/dist/template-bindings.cjs +1 -1
  202. package/dist/template-bindings.cjs.map +1 -1
  203. package/dist/template-bindings.d.ts +10 -47
  204. package/dist/template-bindings.d.ts.map +1 -1
  205. package/dist/template-bindings.js +1 -1
  206. package/dist/template-bindings.js.map +1 -1
  207. package/dist/template-compiler.cjs +1 -1
  208. package/dist/template-compiler.cjs.map +1 -1
  209. package/dist/template-compiler.d.ts +1 -21
  210. package/dist/template-compiler.d.ts.map +1 -1
  211. package/dist/template-compiler.js +1 -1
  212. package/dist/template-compiler.js.map +1 -1
  213. package/dist/testing/testing.cjs +1 -1
  214. package/dist/testing/testing.cjs.map +1 -1
  215. package/dist/testing/testing.d.ts +12 -5
  216. package/dist/testing/testing.d.ts.map +1 -1
  217. package/dist/testing/testing.js +1 -1
  218. package/dist/testing/testing.js.map +1 -1
  219. package/package.json +6 -12
  220. package/dist/component.cjs +0 -2
  221. package/dist/component.cjs.map +0 -1
  222. package/dist/component.d.ts +0 -39
  223. package/dist/component.d.ts.map +0 -1
  224. package/dist/component.js +0 -2
  225. package/dist/component.js.map +0 -1
  226. package/dist/controls/list-key-control.cjs +0 -2
  227. package/dist/controls/list-key-control.cjs.map +0 -1
  228. package/dist/controls/list-key-control.d.ts +0 -14
  229. package/dist/controls/list-key-control.d.ts.map +0 -1
  230. package/dist/controls/list-key-control.js +0 -2
  231. package/dist/controls/list-key-control.js.map +0 -1
  232. package/dist/directives/attr.cjs +0 -2
  233. package/dist/directives/attr.cjs.map +0 -1
  234. package/dist/directives/attr.d.ts +0 -12
  235. package/dist/directives/attr.d.ts.map +0 -1
  236. package/dist/directives/attr.js +0 -2
  237. package/dist/directives/attr.js.map +0 -1
  238. package/dist/directives/bind.cjs +0 -2
  239. package/dist/directives/bind.cjs.map +0 -1
  240. package/dist/directives/bind.d.ts +0 -38
  241. package/dist/directives/bind.d.ts.map +0 -1
  242. package/dist/directives/bind.js +0 -2
  243. package/dist/directives/bind.js.map +0 -1
  244. package/dist/directives/choose.cjs +0 -2
  245. package/dist/directives/choose.cjs.map +0 -1
  246. package/dist/directives/choose.d.ts +0 -39
  247. package/dist/directives/choose.d.ts.map +0 -1
  248. package/dist/directives/choose.js +0 -2
  249. package/dist/directives/choose.js.map +0 -1
  250. package/dist/directives/classes.cjs +0 -2
  251. package/dist/directives/classes.cjs.map +0 -1
  252. package/dist/directives/classes.d.ts +0 -20
  253. package/dist/directives/classes.d.ts.map +0 -1
  254. package/dist/directives/classes.js +0 -2
  255. package/dist/directives/classes.js.map +0 -1
  256. package/dist/directives/index.d.ts +0 -13
  257. package/dist/directives/index.d.ts.map +0 -1
  258. package/dist/directives/memo.cjs +0 -2
  259. package/dist/directives/memo.cjs.map +0 -1
  260. package/dist/directives/memo.d.ts +0 -27
  261. package/dist/directives/memo.d.ts.map +0 -1
  262. package/dist/directives/memo.js +0 -2
  263. package/dist/directives/memo.js.map +0 -1
  264. package/dist/directives/on.cjs +0 -2
  265. package/dist/directives/on.cjs.map +0 -1
  266. package/dist/directives/on.d.ts +0 -25
  267. package/dist/directives/on.d.ts.map +0 -1
  268. package/dist/directives/on.js +0 -2
  269. package/dist/directives/on.js.map +0 -1
  270. package/dist/directives/spread.cjs +0 -2
  271. package/dist/directives/spread.cjs.map +0 -1
  272. package/dist/directives/spread.d.ts +0 -14
  273. package/dist/directives/spread.d.ts.map +0 -1
  274. package/dist/directives/spread.js +0 -2
  275. package/dist/directives/spread.js.map +0 -1
  276. package/dist/directives/style.cjs +0 -2
  277. package/dist/directives/style.cjs.map +0 -1
  278. package/dist/directives/style.d.ts +0 -22
  279. package/dist/directives/style.d.ts.map +0 -1
  280. package/dist/directives/style.js +0 -2
  281. package/dist/directives/style.js.map +0 -1
  282. package/dist/directives/until.cjs +0 -2
  283. package/dist/directives/until.cjs.map +0 -1
  284. package/dist/directives/until.d.ts +0 -26
  285. package/dist/directives/until.d.ts.map +0 -1
  286. package/dist/directives/until.js +0 -2
  287. package/dist/directives/until.js.map +0 -1
  288. package/dist/directives.cjs +0 -1
  289. package/dist/directives.js +0 -1
  290. package/dist/runtime-bindings.cjs +0 -2
  291. package/dist/runtime-bindings.cjs.map +0 -1
  292. package/dist/runtime-bindings.d.ts +0 -6
  293. package/dist/runtime-bindings.d.ts.map +0 -1
  294. package/dist/runtime-bindings.js +0 -2
  295. package/dist/runtime-bindings.js.map +0 -1
  296. package/dist/runtime-core.cjs +0 -2
  297. package/dist/runtime-core.cjs.map +0 -1
  298. package/dist/runtime-core.d.ts +0 -21
  299. package/dist/runtime-core.d.ts.map +0 -1
  300. package/dist/runtime-core.js +0 -2
  301. package/dist/runtime-core.js.map +0 -1
  302. package/dist/runtime-lifecycle.cjs +0 -2
  303. package/dist/runtime-lifecycle.cjs.map +0 -1
  304. package/dist/runtime-lifecycle.d.ts +0 -24
  305. package/dist/runtime-lifecycle.d.ts.map +0 -1
  306. package/dist/runtime-lifecycle.js +0 -2
  307. package/dist/runtime-lifecycle.js.map +0 -1
  308. package/dist/template-dom.cjs +0 -2
  309. package/dist/template-dom.cjs.map +0 -1
  310. package/dist/template-dom.d.ts +0 -13
  311. package/dist/template-dom.d.ts.map +0 -1
  312. package/dist/template-dom.js +0 -2
  313. package/dist/template-dom.js.map +0 -1
  314. package/dist/template-html.cjs +0 -2
  315. package/dist/template-html.cjs.map +0 -1
  316. package/dist/template-html.d.ts +0 -23
  317. package/dist/template-html.d.ts.map +0 -1
  318. package/dist/template-html.js +0 -2
  319. package/dist/template-html.js.map +0 -1
  320. package/dist/template.cjs +0 -2
  321. package/dist/template.cjs.map +0 -1
  322. package/dist/template.d.ts +0 -10
  323. package/dist/template.d.ts.map +0 -1
  324. package/dist/template.js +0 -2
  325. package/dist/template.js.map +0 -1
@@ -1 +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-lifecycle';\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 an {@link onMount} 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":"+EASA,IAAa,EAAiB,GAA2C,CACvE,IAAM,EAAM,OAAO,WAAW,EAAM,CAC9B,GAAA,EAAA,EAAA,QAAiB,EAAI,QAAQ,CAC7B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,SAMpB,OAHA,EAAI,iBAAiB,SAAU,EAAQ,CACvC,EAAA,cAAgB,EAAI,oBAAoB,SAAU,EAAQ,CAAC,CAEpD"}
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"}
@@ -2,7 +2,7 @@ import { type ReadonlySignal } from '@vielzeug/stateit';
2
2
  /**
3
3
  * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`
4
4
  * that is `true` when the query matches and `false` when it does not.
5
- * Must be called inside an {@link onMount} callback.
5
+ * Must be called inside a `mount()` callback.
6
6
  */
7
7
  export declare const mediaObserver: (query: string) => ReadonlySignal<boolean>;
8
8
  //# sourceMappingURL=media-observe.d.ts.map
@@ -1,2 +1,2 @@
1
- import{onCleanup as e}from"../runtime-lifecycle.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};
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
2
  //# sourceMappingURL=media-observe.js.map
@@ -1 +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-lifecycle';\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 an {@link onMount} 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":"+FASA,IAAa,EAAiB,GAA2C,CACvE,IAAM,EAAM,OAAO,WAAW,EAAM,CAC9B,EAAU,EAAO,EAAI,QAAQ,CAC7B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,SAMpB,OAHA,EAAI,iBAAiB,SAAU,EAAQ,CACvC,MAAgB,EAAI,oBAAoB,SAAU,EAAQ,CAAC,CAEpD"}
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"}
@@ -1,2 +1,2 @@
1
- const e=require(`../runtime-lifecycle.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;
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
2
  //# sourceMappingURL=resize-observe.cjs.map
@@ -1 +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-lifecycle';\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 an {@link onMount} 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":"+EASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,GAAA,EAAA,EAAA,QAAc,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,EAAA,cAAgB,EAAG,YAAY,CAAC,CAEzB"}
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"}
@@ -2,7 +2,7 @@ import { type ReadonlySignal } from '@vielzeug/stateit';
2
2
  /**
3
3
  * Observes an element's content-box size via `ResizeObserver`.
4
4
  * Returns a `ReadonlySignal` that updates whenever the dimensions change.
5
- * Must be called inside an {@link onMount} callback.
5
+ * Must be called inside a `mount()` callback.
6
6
  */
7
7
  export declare const resizeObserver: (el: Element) => ReadonlySignal<{
8
8
  height: number;
@@ -1,2 +1,2 @@
1
- import{onCleanup as e}from"../runtime-lifecycle.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};
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
2
  //# sourceMappingURL=resize-observe.js.map
@@ -1 +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-lifecycle';\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 an {@link onMount} 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":"+FASA,IAAa,EAAkB,GAAmE,CAChG,IAAM,EAAO,EAAO,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,MAAgB,EAAG,YAAY,CAAC,CAEzB"}
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"}
@@ -1 +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/resize-observe.cjs`);exports.intersectionObserver=e.intersectionObserver,exports.mediaObserver=t.mediaObserver,exports.resizeObserver=n.resizeObserver;
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;
package/dist/observers.js CHANGED
@@ -1 +1 @@
1
- import{intersectionObserver as e}from"./observers/intersection-observe.js";import{mediaObserver as t}from"./observers/media-observe.js";import{resizeObserver as n}from"./observers/resize-observe.js";export{e as intersectionObserver,t as mediaObserver,n as resizeObserver};
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 CHANGED
@@ -1,2 +1,2 @@
1
- const e=require(`./runtime-core.cjs`),t=require(`./runtime-lifecycle.cjs`),n=require(`./internal.cjs`);let r=require(`@vielzeug/stateit`);var i=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),a=new Set,o=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>i.has(e)),s=new WeakMap,c=(i,a,o)=>{let c=e.currentRuntime().el;s.has(c)||s.set(c,new Map);let l=o?.parse??(e=>o?.type===Boolean?e===``||e===`true`:typeof a==`boolean`?e!==null&&e!==`false`:e==null?a:o?.type===Number||typeof a==`number`?Number(e):e),u=(0,r.signal)(a),d=Object.prototype.hasOwnProperty.call(c,i),f=d?c[i]:void 0,p={parse:l,reflect:o?.reflect??!0,signal:u};if(d?(delete c[i],u.value=f):c.hasAttribute(i)&&(u.value=l(c.getAttribute(i))),s.get(c).set(i,p),Object.defineProperty(c,i,{configurable:!0,enumerable:!0,get:()=>u.value,set:e=>{u.value=e}}),o?.reflect??!0){let e=o?.omit??!1;t.effect(()=>{let t=u.value;t==null||t===!1||e&&t===``?c.removeAttribute(i):n.setAttr(c,i,t)})}return u};function l(t){let r={},i=e.currentRuntime().el.localName;for(let[e,s]of Object.entries(t)){let t=o(s)?s:{default:s},l=typeof t.default==`object`&&t.default!==null||Array.isArray(t.default);if(t.reflect===!0&&l){let t=`${i}:${String(e)}`;a.has(t)||(a.add(t),console.warn(`[craftit] props.${t} requested reflect: true for a structured default; reflection is disabled.`))}let u={reflect:!l,...t};r[e]=c(n.toKebab(e),t.default,u)}return r}exports.createProps=l,exports.propRegistry=s;
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
2
  //# sourceMappingURL=props.cjs.map
@@ -1 +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 { currentRuntime } from './runtime-core';\nimport { effect } from './runtime-lifecycle';\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type OptionalKeys<T extends Record<string, unknown>> = {\n [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;\n}[keyof T];\n\nexport type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\nexport type PropsInput<T extends Record<string, unknown>> = {\n [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;\n} & {\n [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst warnedStructuredReflectProps = new Set<string>();\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : 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>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\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 const omit = options?.omit ?? false;\n\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\ntype RefineOptionalPropFromDefault<Value, Def> = undefined extends Value\n ? undefined extends InferDefaultFromDef<Def>\n ? Value\n : Exclude<Value, undefined>\n : Value;\n\ntype InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props\n ? RefineOptionalPropFromDefault<Props[Key], Def>\n : InferDefaultFromDef<Def>;\n\ntype ResolvePropValue<\n Props extends Record<string, unknown>,\n PropDefs extends Record<string, unknown>,\n Key extends PropertyKey,\n> = Key extends keyof PropDefs\n ? InferPropSignalValue<Props, Key, PropDefs[Key]>\n : Key extends keyof Props\n ? Props[Key]\n : never;\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n [K in keyof T]: Signal<T[K]>;\n};\n\nexport type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;\n\nexport function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n const tag = currentRuntime().el.localName;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n\n if (descriptor.reflect === true && hasStructuredDefault) {\n const warningKey = `${tag}:${String(name)}`;\n\n if (!warnedStructuredReflectProps.has(warningKey)) {\n warnedStructuredReflectProps.add(warningKey);\n console.warn(\n `[craftit] props.${warningKey} requested reflect: true for a structured default; reflection is disabled.`,\n );\n }\n }\n\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n const signalRef = prop(toKebab(name), descriptor.default, propDef);\n\n props[name] = signalRef;\n }\n\n return props as ComponentProps<InferPropsFromDefs<D>>;\n}\n\ntype InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;\n\nexport type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {\n [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;\n};\n\nexport type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [\n keyof Props,\n] extends [never]\n ? InferPropsFromDefs<PropDefs>\n : {\n [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;\n };\n"],"mappings":"0IAuCA,IAAM,EAAgB,IAAI,IAAI,CAAC,UAAW,OAAQ,QAAS,UAAW,OAAO,CAAC,CACxE,EAA+B,IAAI,IAEnC,EAAa,GACb,OAAO,GAAU,WAAY,GAAkB,EAAE,YAAa,GAAe,GAE1E,OAAO,KAAK,EAAM,CAAC,MAAO,GAAQ,EAAc,IAAI,EAAI,CAAC,CAGrD,EAAe,IAAI,QAQnB,GAAW,EAAc,EAAiB,IAAwC,CAE7F,IAAM,EADK,EAAA,gBAAgB,CACb,GAET,EAAa,IAAI,EAAG,EAAE,EAAa,IAAI,EAAI,IAAI,IAAM,CAE1D,IAAM,EACJ,GAAS,QACP,GACI,GAAS,OAAS,QAAiB,IAAM,IAAM,IAAM,OAErD,OAAO,GAAiB,UAAmB,IAAM,MAAQ,IAAM,QAE/D,GAAK,KAAa,EAElB,GAAS,OAAS,QAAU,OAAO,GAAiB,SAAiB,OAAO,EAAE,CAE3E,GAGL,GAAA,EAAA,EAAA,QAAc,EAAa,CAC3B,EAAwB,OAAO,UAAU,eAAe,KAAK,EAAI,EAAK,CACtE,EAAkB,EAAyB,EAA0C,GAAQ,IAAA,GAE7F,EAAO,CACX,QACA,QAAS,GAAS,SAAW,GAC7B,OAAQ,EACT,CAoBD,GAlBI,GACF,OAAQ,EAA0C,GAClD,EAAE,MAAQ,GACD,EAAG,aAAa,EAAK,GAC9B,EAAE,MAAQ,EAAM,EAAG,aAAa,EAAK,CAAC,EAGxC,EAAa,IAAI,EAAG,CAAE,IAAI,EAAM,EAAK,CAErC,OAAO,eAAe,EAAI,EAAM,CAC9B,aAAc,GACd,WAAY,GACZ,QAAW,EAAE,MACb,IAAM,GAAa,CACjB,EAAE,MAAQ,GAEb,CAAC,CAEE,GAAS,SAAW,GAAM,CAC5B,IAAM,EAAO,GAAS,MAAQ,GAE9B,EAAA,WAAa,CACX,IAAM,EAAI,EAAE,MAER,GAAK,MAAQ,IAAM,IAAU,GAAQ,IAAM,GAC7C,EAAG,gBAAgB,EAAK,CAExB,EAAA,QAAQ,EAAI,EAAM,EAAE,EAEtB,CAGJ,OAAO,GAyCT,SAAgB,EAAqC,EAAgD,CACnG,IAAM,EAAQ,EAAE,CACV,EAAM,EAAA,gBAAgB,CAAC,GAAG,UAEhC,IAAK,GAAM,CAAC,EAAM,KAAQ,OAAO,QAAQ,EAAK,CAAE,CAC9C,IAAM,EAAa,EAAU,EAAI,CAAI,EAA2B,CAAE,QAAS,EAAK,CAC1E,EACH,OAAO,EAAW,SAAY,UAAY,EAAW,UAAY,MAAS,MAAM,QAAQ,EAAW,QAAQ,CAE9G,GAAI,EAAW,UAAY,IAAQ,EAAsB,CACvD,IAAM,EAAa,GAAG,EAAI,GAAG,OAAO,EAAK,GAEpC,EAA6B,IAAI,EAAW,GAC/C,EAA6B,IAAI,EAAW,CAC5C,QAAQ,KACN,mBAAmB,EAAW,4EAC/B,EAIL,IAAM,EAAgC,CAAE,QAAS,CAAC,EAAsB,GAAG,EAAY,CAIvF,EAAM,GAFY,EAAK,EAAA,QAAQ,EAAK,CAAE,EAAW,QAAS,EAAQ,CAKpE,OAAO"}
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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"}
package/dist/props.d.ts CHANGED
@@ -1,52 +1,39 @@
1
1
  import { type Signal } from '@vielzeug/stateit';
2
2
  export type PropOptions<T> = {
3
- /** When `true`, removes the host attribute instead of setting it to `""` when value is an empty string. */
4
- omit?: boolean;
5
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
6
  reflect?: boolean;
7
- type?: PropType<T>;
8
7
  };
9
- export type OptionalKeys<T extends Record<string, unknown>> = {
10
- [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;
11
- }[keyof T];
12
- export type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;
13
- export type PropsInput<T extends Record<string, unknown>> = {
14
- [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;
15
- } & {
16
- [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;
8
+ export type PropsDef<T extends Record<string, unknown>> = {
9
+ [K in keyof Required<T>]: T[K] | undefined | PropDef<T[K] | undefined>;
17
10
  };
18
11
  export type PropDef<T> = PropOptions<T> & {
19
- default: T;
12
+ readonly default: T;
20
13
  };
21
14
  export type PropInputDefs = Record<string, unknown | PropDef<unknown>>;
22
- type PropType<T> = T extends string ? StringConstructor : T extends number ? NumberConstructor : T extends boolean ? BooleanConstructor : T extends unknown[] ? ArrayConstructor : ObjectConstructor;
23
- export declare const propRegistry: WeakMap<object, Map<string, PropMeta<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;
24
25
  type PropMeta<T = unknown> = {
25
26
  parse: (value: string | null) => T;
26
27
  reflect: boolean;
27
28
  signal: Signal<T>;
28
29
  };
29
- export declare const prop: <T>(name: string, defaultValue: T, options?: PropOptions<T>) => Signal<T>;
30
- type InferPropValue<T> = T extends object ? Exclude<keyof T, keyof PropDef<unknown>> extends never ? T extends PropDef<infer U> ? U : T : T : T;
30
+ export type InferPropValue<T> = T extends PropDef<infer U> ? U : T;
31
31
  export type InferPropsFromDefs<T extends PropInputDefs> = {
32
32
  [K in keyof T]: InferPropValue<T[K]>;
33
33
  };
34
- type RefineOptionalPropFromDefault<Value, Def> = undefined extends Value ? undefined extends InferDefaultFromDef<Def> ? Value : Exclude<Value, undefined> : Value;
35
- type InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props ? RefineOptionalPropFromDefault<Props[Key], Def> : InferDefaultFromDef<Def>;
36
- type ResolvePropValue<Props extends Record<string, unknown>, PropDefs extends Record<string, unknown>, Key extends PropertyKey> = Key extends keyof PropDefs ? InferPropSignalValue<Props, Key, PropDefs[Key]> : Key extends keyof Props ? Props[Key] : never;
37
34
  export type InferPropsSignals<T extends Record<string, unknown>> = {
38
- [K in keyof T]: Signal<T[K]>;
39
- };
40
- export type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;
41
- export declare function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>>;
42
- type InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;
43
- export type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {
44
- [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;
45
- };
46
- export type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [
47
- keyof Props
48
- ] extends [never] ? InferPropsFromDefs<PropDefs> : {
49
- [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;
35
+ readonly [K in keyof T]-?: Signal<T[K]>;
50
36
  };
37
+ export declare function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<InferPropsFromDefs<D>>;
51
38
  export {};
52
39
  //# sourceMappingURL=props.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../src/props.ts"],"names":[],"mappings":"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"}
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 CHANGED
@@ -1,2 +1,2 @@
1
- import{currentRuntime as e}from"./runtime-core.js";import{effect as t}from"./runtime-lifecycle.js";import{setAttr as n,toKebab as r}from"./internal.js";import{signal as i}from"@vielzeug/stateit";var a=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),o=new Set,s=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>a.has(e)),c=new WeakMap,l=(r,a,o)=>{let s=e().el;c.has(s)||c.set(s,new Map);let l=o?.parse??(e=>o?.type===Boolean?e===``||e===`true`:typeof a==`boolean`?e!==null&&e!==`false`:e==null?a:o?.type===Number||typeof a==`number`?Number(e):e),u=i(a),d=Object.prototype.hasOwnProperty.call(s,r),f=d?s[r]:void 0,p={parse:l,reflect:o?.reflect??!0,signal:u};if(d?(delete s[r],u.value=f):s.hasAttribute(r)&&(u.value=l(s.getAttribute(r))),c.get(s).set(r,p),Object.defineProperty(s,r,{configurable:!0,enumerable:!0,get:()=>u.value,set:e=>{u.value=e}}),o?.reflect??!0){let e=o?.omit??!1;t(()=>{let t=u.value;t==null||t===!1||e&&t===``?s.removeAttribute(r):n(s,r,t)})}return u};function u(t){let n={},i=e().el.localName;for(let[e,a]of Object.entries(t)){let t=s(a)?a:{default:a},c=typeof t.default==`object`&&t.default!==null||Array.isArray(t.default);if(t.reflect===!0&&c){let t=`${i}:${String(e)}`;o.has(t)||(o.add(t),console.warn(`[craftit] props.${t} requested reflect: true for a structured default; reflection is disabled.`))}let u={reflect:!c,...t};n[e]=l(r(e),t.default,u)}return n}export{u as createProps,c as propRegistry};
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
2
  //# sourceMappingURL=props.js.map
package/dist/props.js.map CHANGED
@@ -1 +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 { currentRuntime } from './runtime-core';\nimport { effect } from './runtime-lifecycle';\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type OptionalKeys<T extends Record<string, unknown>> = {\n [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;\n}[keyof T];\n\nexport type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\nexport type PropsInput<T extends Record<string, unknown>> = {\n [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;\n} & {\n [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst warnedStructuredReflectProps = new Set<string>();\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : 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>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\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 const omit = options?.omit ?? false;\n\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\ntype RefineOptionalPropFromDefault<Value, Def> = undefined extends Value\n ? undefined extends InferDefaultFromDef<Def>\n ? Value\n : Exclude<Value, undefined>\n : Value;\n\ntype InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props\n ? RefineOptionalPropFromDefault<Props[Key], Def>\n : InferDefaultFromDef<Def>;\n\ntype ResolvePropValue<\n Props extends Record<string, unknown>,\n PropDefs extends Record<string, unknown>,\n Key extends PropertyKey,\n> = Key extends keyof PropDefs\n ? InferPropSignalValue<Props, Key, PropDefs[Key]>\n : Key extends keyof Props\n ? Props[Key]\n : never;\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n [K in keyof T]: Signal<T[K]>;\n};\n\nexport type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;\n\nexport function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n const tag = currentRuntime().el.localName;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n\n if (descriptor.reflect === true && hasStructuredDefault) {\n const warningKey = `${tag}:${String(name)}`;\n\n if (!warnedStructuredReflectProps.has(warningKey)) {\n warnedStructuredReflectProps.add(warningKey);\n console.warn(\n `[craftit] props.${warningKey} requested reflect: true for a structured default; reflection is disabled.`,\n );\n }\n }\n\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n const signalRef = prop(toKebab(name), descriptor.default, propDef);\n\n props[name] = signalRef;\n }\n\n return props as ComponentProps<InferPropsFromDefs<D>>;\n}\n\ntype InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;\n\nexport type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {\n [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;\n};\n\nexport type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [\n keyof Props,\n] extends [never]\n ? InferPropsFromDefs<PropDefs>\n : {\n [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;\n };\n"],"mappings":"mMAuCA,IAAM,EAAgB,IAAI,IAAI,CAAC,UAAW,OAAQ,QAAS,UAAW,OAAO,CAAC,CACxE,EAA+B,IAAI,IAEnC,EAAa,GACb,OAAO,GAAU,WAAY,GAAkB,EAAE,YAAa,GAAe,GAE1E,OAAO,KAAK,EAAM,CAAC,MAAO,GAAQ,EAAc,IAAI,EAAI,CAAC,CAGrD,EAAe,IAAI,QAQnB,GAAW,EAAc,EAAiB,IAAwC,CAE7F,IAAM,EADK,GAAgB,CACb,GAET,EAAa,IAAI,EAAG,EAAE,EAAa,IAAI,EAAI,IAAI,IAAM,CAE1D,IAAM,EACJ,GAAS,QACP,GACI,GAAS,OAAS,QAAiB,IAAM,IAAM,IAAM,OAErD,OAAO,GAAiB,UAAmB,IAAM,MAAQ,IAAM,QAE/D,GAAK,KAAa,EAElB,GAAS,OAAS,QAAU,OAAO,GAAiB,SAAiB,OAAO,EAAE,CAE3E,GAGL,EAAI,EAAU,EAAa,CAC3B,EAAwB,OAAO,UAAU,eAAe,KAAK,EAAI,EAAK,CACtE,EAAkB,EAAyB,EAA0C,GAAQ,IAAA,GAE7F,EAAO,CACX,QACA,QAAS,GAAS,SAAW,GAC7B,OAAQ,EACT,CAoBD,GAlBI,GACF,OAAQ,EAA0C,GAClD,EAAE,MAAQ,GACD,EAAG,aAAa,EAAK,GAC9B,EAAE,MAAQ,EAAM,EAAG,aAAa,EAAK,CAAC,EAGxC,EAAa,IAAI,EAAG,CAAE,IAAI,EAAM,EAAK,CAErC,OAAO,eAAe,EAAI,EAAM,CAC9B,aAAc,GACd,WAAY,GACZ,QAAW,EAAE,MACb,IAAM,GAAa,CACjB,EAAE,MAAQ,GAEb,CAAC,CAEE,GAAS,SAAW,GAAM,CAC5B,IAAM,EAAO,GAAS,MAAQ,GAE9B,MAAa,CACX,IAAM,EAAI,EAAE,MAER,GAAK,MAAQ,IAAM,IAAU,GAAQ,IAAM,GAC7C,EAAG,gBAAgB,EAAK,CAExB,EAAQ,EAAI,EAAM,EAAE,EAEtB,CAGJ,OAAO,GAyCT,SAAgB,EAAqC,EAAgD,CACnG,IAAM,EAAQ,EAAE,CACV,EAAM,GAAgB,CAAC,GAAG,UAEhC,IAAK,GAAM,CAAC,EAAM,KAAQ,OAAO,QAAQ,EAAK,CAAE,CAC9C,IAAM,EAAa,EAAU,EAAI,CAAI,EAA2B,CAAE,QAAS,EAAK,CAC1E,EACH,OAAO,EAAW,SAAY,UAAY,EAAW,UAAY,MAAS,MAAM,QAAQ,EAAW,QAAQ,CAE9G,GAAI,EAAW,UAAY,IAAQ,EAAsB,CACvD,IAAM,EAAa,GAAG,EAAI,GAAG,OAAO,EAAK,GAEpC,EAA6B,IAAI,EAAW,GAC/C,EAA6B,IAAI,EAAW,CAC5C,QAAQ,KACN,mBAAmB,EAAW,4EAC/B,EAIL,IAAM,EAAgC,CAAE,QAAS,CAAC,EAAsB,GAAG,EAAY,CAIvF,EAAM,GAFY,EAAK,EAAQ,EAAK,CAAE,EAAW,QAAS,EAAQ,CAKpE,OAAO"}
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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"}
@@ -1,2 +1,2 @@
1
- const e=require(`./runtime-core.cjs`),t=require(`./internal.cjs`),n=require(`./form.cjs`),r=require(`./props.cjs`),i=require(`./template-dom.cjs`);require(`./template-bindings.cjs`),require(`./template-html.cjs`);const a=require(`./template.cjs`);let o=require(`@vielzeug/stateit`);var s=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_appliedHtmlBindings=new Set;_keyedStates=new Map;_mountFns=[];_runtime;_rendered=!1;_setupDone=!1;_template=null;constructor(){super();let e=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...e?.shadow}),this._runtime={cleanups:[],el:this,errorHandlers:[],onMount:[],styles:e?.styles}}connectedCallback(){(0,o.untrack)(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n)return;let i=r.propRegistry.get(this)?.get(e);if(!i)return;let a=i.parse(n);Object.is((0,o.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){t.runAll(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){n.formCallbackRegistry.get(this)?.onAssociated?.(e)}formDisabledCallback(e){n.formCallbackRegistry.get(this)?.onDisabled?.(e)}formResetCallback(){n.formCallbackRegistry.get(this)?.onReset?.()}formStateRestoreCallback(e,t){n.formCallbackRegistry.get(this)?.onStateRestore?.(e,t)}_handleError(e){if(this._runtime.errorHandlers.length>0)for(let t of this._runtime.errorHandlers)t(e);else throw console.error(`[craftit:E3] <${this.localName}>`,e),e instanceof Error?e:Error(String(e))}_runSetup(){this._setupDone=!0,e.runtimeStack.push(this._runtime);try{let{host:e}=this.constructor._options??{};if(e)for(let[t,n]of Object.entries(e))typeof n==`boolean`?n?this.setAttribute(t,``):this.removeAttribute(t):this.setAttribute(t,String(n));let t=this.constructor._setup();(typeof t==`string`||typeof t==`object`&&t&&`__html`in t)&&(this._template=t)}catch(e){this._handleError(e)}finally{e.runtimeStack.pop()}}_init(){let{styles:n}=this._runtime;if(n?.length&&(this.shadow.adoptedStyleSheets=n.map(t.loadStylesheet)),this._template){let e=typeof this._template==`string`?t.htmlResult(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(i.parseHTML(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);a.applyBindingsInContainer(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),a.applyHtmlBinding(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{e.runtimeStack.push(this._runtime);try{let e=this._runtime.onMount;this._mountFns=e.slice();for(let t of e){let e=t();typeof e==`function`&&this._runtime.cleanups.push(e)}}catch(e){this._handleError(e)}finally{e.runtimeStack.pop(),this._runtime.onMount=[]}})}};function c(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends s{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}exports.registerComponent=c;
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
2
  //# sourceMappingURL=registration.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"registration.cjs","names":[],"sources":["../src/registration.ts"],"sourcesContent":["import { type CleanupFn, untrack } from '@vielzeug/stateit';\n\nimport { formCallbackRegistry } from './form';\nimport { type CSSResult, type HTMLResult, htmlResult, loadStylesheet, runAll } from './internal';\nimport { propRegistry } from './props';\nimport { runtimeStack, type ComponentRuntime } from './runtime-core';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for a host element (e.g. for aria-*) */\n host?: Record<string, string | boolean | number>;\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\ntype ComponentSetupResult = string | HTMLResult;\n\nclass BaseElement extends HTMLElement {\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentSetupResult;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _appliedHtmlBindings = new Set<string>();\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _runtime: ComponentRuntime;\n private _rendered = false;\n private _setupDone = false;\n private _template: ComponentSetupResult | null = null;\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._runtime = {\n cleanups: [],\n el: this,\n errorHandlers: [],\n onMount: [],\n styles: options?.styles,\n };\n }\n\n connectedCallback(): void {\n untrack(() => {\n if (!this._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 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 runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice();\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n this._rendered = false;\n }\n\n formAssociatedCallback(form: HTMLFormElement | null): void {\n formCallbackRegistry.get(this)?.onAssociated?.(form);\n }\n\n formDisabledCallback(disabled: boolean): void {\n formCallbackRegistry.get(this)?.onDisabled?.(disabled);\n }\n\n formResetCallback(): void {\n formCallbackRegistry.get(this)?.onReset?.();\n }\n\n formStateRestoreCallback(state: unknown, mode: 'autocomplete' | 'restore'): void {\n formCallbackRegistry.get(this)?.onStateRestore?.(state, mode);\n }\n\n private _handleError(err: unknown): void {\n if (this._runtime.errorHandlers.length > 0) {\n for (const fn of this._runtime.errorHandlers) fn(err);\n } else {\n console.error(`[craftit:E3] <${this.localName}>`, err);\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const options = (this.constructor as typeof BaseElement)._options;\n const { host: hostOptions } = options ?? {};\n\n if (hostOptions) {\n for (const [name, value] of Object.entries(hostOptions)) {\n if (typeof value === 'boolean') {\n if (value) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n } else {\n this.setAttribute(name, String(value));\n }\n }\n }\n\n const result = (this.constructor as typeof BaseElement)._setup();\n\n if (typeof result === 'string' || (typeof result === 'object' && result !== null && '__html' in result)) {\n this._template = result as ComponentSetupResult;\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n }\n }\n\n private _init(): void {\n const { styles } = this._runtime;\n\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (this._template) {\n const result: HTMLResult = typeof this._template === 'string' ? htmlResult(this._template) : this._template;\n\n if (!this._rendered) {\n this.shadow.replaceChildren(parseHTML(result.__html));\n this._rendered = true;\n }\n\n if (result.__bindings.length) {\n const registerCleanup: RegisterCleanup = (fn) => this._runtime.cleanups.push(fn);\n\n applyBindingsInContainer(this.shadow, result.__bindings, registerCleanup, {\n onHtml: (binding) => {\n if (!this._appliedHtmlBindings.has(binding.uid)) {\n this._appliedHtmlBindings.add(binding.uid);\n applyHtmlBinding(this.shadow, binding, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const mountFns = this._runtime.onMount;\n\n this._mountFns = mountFns.slice();\n\n for (const mountFn of mountFns) {\n const cleanup = mountFn();\n\n if (typeof cleanup === 'function') this._runtime.cleanups.push(cleanup);\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n this._runtime.onMount = [];\n }\n });\n }\n}\n\n/** @internal — use define() instead. */\nexport function registerComponent(\n tag: string,\n setup: () => ComponentSetupResult,\n options: ComponentRegistrationOptions = {},\n): string {\n if (!tag) throw new Error('[craftit:E4] registerComponent(tag, ...) requires a tag name');\n\n if (customElements.get(tag)) {\n return 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"],"mappings":"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"}
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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"}
@@ -1,9 +1,9 @@
1
- import { type CSSResult, type HTMLResult } from './internal';
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';
2
4
  export type ComponentRegistrationOptions = {
3
5
  /** Indicates if this should be a form-associated element */
4
6
  formAssociated?: boolean;
5
- /** Custom options for a host element (e.g. for aria-*) */
6
- host?: Record<string, string | boolean | number>;
7
7
  /** @internal — list of attribute names to observe via attributeChangedCallback */
8
8
  observedAttrs?: string[];
9
9
  /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */
@@ -11,8 +11,28 @@ export type ComponentRegistrationOptions = {
11
11
  /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */
12
12
  styles?: (string | CSSStyleSheet | CSSResult)[];
13
13
  };
14
- type ComponentSetupResult = string | HTMLResult;
15
- /** @internal use define() instead. */
16
- export declare function registerComponent(tag: string, setup: () => ComponentSetupResult, options?: ComponentRegistrationOptions): string;
17
- export {};
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;
18
38
  //# sourceMappingURL=registration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registration.d.ts","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAsC,MAAM,YAAY,CAAC;AAQjG,MAAM,MAAM,4BAA4B,GAAG;IACzC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IACjD,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,KAAK,oBAAoB,GAAG,MAAM,GAAG,UAAU,CAAC;AAkLhD,wCAAwC;AACxC,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,oBAAoB,EACjC,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR"}
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"}
@@ -1,2 +1,2 @@
1
- import{runtimeStack as e}from"./runtime-core.js";import{htmlResult as t,loadStylesheet as n,runAll as r}from"./internal.js";import{formCallbackRegistry as i}from"./form.js";import{propRegistry as a}from"./props.js";import{parseHTML as o}from"./template-dom.js";import"./template-bindings.js";import"./template-html.js";import{applyBindingsInContainer as s,applyHtmlBinding as c}from"./template.js";import{untrack as l}from"@vielzeug/stateit";var u=class extends HTMLElement{static _options;static _setup;static formAssociated=!1;static observedAttributes=[];shadow;_appliedHtmlBindings=new Set;_keyedStates=new Map;_mountFns=[];_runtime;_rendered=!1;_setupDone=!1;_template=null;constructor(){super();let e=this.constructor._options;this.shadow=this.attachShadow({mode:`open`,...e?.shadow}),this._runtime={cleanups:[],el:this,errorHandlers:[],onMount:[],styles:e?.styles}}connectedCallback(){l(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(e,t,n){if(t===n)return;let r=a.get(this)?.get(e);if(!r)return;let i=r.parse(n);Object.is(l(()=>r.signal.value),i)||(r.signal.value=i)}disconnectedCallback(){r(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){i.get(this)?.onAssociated?.(e)}formDisabledCallback(e){i.get(this)?.onDisabled?.(e)}formResetCallback(){i.get(this)?.onReset?.()}formStateRestoreCallback(e,t){i.get(this)?.onStateRestore?.(e,t)}_handleError(e){if(this._runtime.errorHandlers.length>0)for(let t of this._runtime.errorHandlers)t(e);else throw console.error(`[craftit:E3] <${this.localName}>`,e),e instanceof Error?e:Error(String(e))}_runSetup(){this._setupDone=!0,e.push(this._runtime);try{let{host:e}=this.constructor._options??{};if(e)for(let[t,n]of Object.entries(e))typeof n==`boolean`?n?this.setAttribute(t,``):this.removeAttribute(t):this.setAttribute(t,String(n));let t=this.constructor._setup();(typeof t==`string`||typeof t==`object`&&t&&`__html`in t)&&(this._template=t)}catch(e){this._handleError(e)}finally{e.pop()}}_init(){let{styles:r}=this._runtime;if(r?.length&&(this.shadow.adoptedStyleSheets=r.map(n)),this._template){let e=typeof this._template==`string`?t(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(o(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);s(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),c(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{e.push(this._runtime);try{let e=this._runtime.onMount;this._mountFns=e.slice();for(let t of e){let e=t();typeof e==`function`&&this._runtime.cleanups.push(e)}}catch(e){this._handleError(e)}finally{e.pop(),this._runtime.onMount=[]}})}};function d(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends u{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}export{d as registerComponent};
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
2
  //# sourceMappingURL=registration.js.map