@vielzeug/craftit 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +71 -53
  2. package/dist/component.cjs +2 -0
  3. package/dist/component.cjs.map +1 -0
  4. package/dist/component.d.ts +39 -0
  5. package/dist/component.d.ts.map +1 -0
  6. package/dist/component.js +2 -0
  7. package/dist/component.js.map +1 -0
  8. package/dist/controls/a11y-control.cjs +2 -0
  9. package/dist/controls/a11y-control.cjs.map +1 -0
  10. package/dist/controls/a11y-control.d.ts +16 -0
  11. package/dist/controls/a11y-control.d.ts.map +1 -0
  12. package/dist/controls/a11y-control.js +2 -0
  13. package/dist/controls/a11y-control.js.map +1 -0
  14. package/dist/controls/checkable-control.cjs +2 -0
  15. package/dist/controls/checkable-control.cjs.map +1 -0
  16. package/dist/controls/checkable-control.d.ts +15 -0
  17. package/dist/controls/checkable-control.d.ts.map +1 -0
  18. package/dist/controls/checkable-control.js +2 -0
  19. package/dist/controls/checkable-control.js.map +1 -0
  20. package/dist/controls/field-control.cjs +2 -0
  21. package/dist/controls/field-control.cjs.map +1 -0
  22. package/dist/controls/field-control.d.ts +156 -0
  23. package/dist/controls/field-control.d.ts.map +1 -0
  24. package/dist/controls/field-control.js +2 -0
  25. package/dist/controls/field-control.js.map +1 -0
  26. package/dist/controls/index.d.ts +10 -0
  27. package/dist/controls/index.d.ts.map +1 -0
  28. package/dist/controls/internal/control-state.cjs +2 -0
  29. package/dist/controls/internal/control-state.cjs.map +1 -0
  30. package/dist/controls/internal/control-state.d.ts +19 -0
  31. package/dist/controls/internal/control-state.d.ts.map +1 -0
  32. package/dist/controls/internal/control-state.js +2 -0
  33. package/dist/controls/internal/control-state.js.map +1 -0
  34. package/dist/controls/internal/keyboard-utils.cjs +2 -0
  35. package/dist/controls/internal/keyboard-utils.cjs.map +1 -0
  36. package/dist/controls/internal/keyboard-utils.d.ts +7 -0
  37. package/dist/controls/internal/keyboard-utils.d.ts.map +1 -0
  38. package/dist/controls/internal/keyboard-utils.js +2 -0
  39. package/dist/controls/internal/keyboard-utils.js.map +1 -0
  40. package/dist/controls/internal/number-utils.cjs +2 -0
  41. package/dist/controls/internal/number-utils.cjs.map +1 -0
  42. package/dist/controls/internal/number-utils.d.ts +6 -0
  43. package/dist/controls/internal/number-utils.d.ts.map +1 -0
  44. package/dist/controls/internal/number-utils.js +2 -0
  45. package/dist/controls/internal/number-utils.js.map +1 -0
  46. package/dist/controls/internal/validation-utils.cjs +2 -0
  47. package/dist/controls/internal/validation-utils.cjs.map +1 -0
  48. package/dist/controls/internal/validation-utils.d.ts +13 -0
  49. package/dist/controls/internal/validation-utils.d.ts.map +1 -0
  50. package/dist/controls/internal/validation-utils.js +2 -0
  51. package/dist/controls/internal/validation-utils.js.map +1 -0
  52. package/dist/controls/list-control.cjs +2 -0
  53. package/dist/controls/list-control.cjs.map +1 -0
  54. package/dist/controls/list-control.d.ts +21 -0
  55. package/dist/controls/list-control.d.ts.map +1 -0
  56. package/dist/controls/list-control.js +2 -0
  57. package/dist/controls/list-control.js.map +1 -0
  58. package/dist/controls/list-key-control.cjs +2 -0
  59. package/dist/controls/list-key-control.cjs.map +1 -0
  60. package/dist/controls/list-key-control.d.ts +14 -0
  61. package/dist/controls/list-key-control.d.ts.map +1 -0
  62. package/dist/controls/list-key-control.js +2 -0
  63. package/dist/controls/list-key-control.js.map +1 -0
  64. package/dist/controls/overlay-control.cjs +2 -0
  65. package/dist/controls/overlay-control.cjs.map +1 -0
  66. package/dist/controls/overlay-control.d.ts +37 -0
  67. package/dist/controls/overlay-control.d.ts.map +1 -0
  68. package/dist/controls/overlay-control.js +2 -0
  69. package/dist/controls/overlay-control.js.map +1 -0
  70. package/dist/controls/press-control.cjs +2 -0
  71. package/dist/controls/press-control.cjs.map +1 -0
  72. package/dist/controls/press-control.d.ts +12 -0
  73. package/dist/controls/press-control.d.ts.map +1 -0
  74. package/dist/controls/press-control.js +2 -0
  75. package/dist/controls/press-control.js.map +1 -0
  76. package/dist/controls/slider-control.cjs +2 -0
  77. package/dist/controls/slider-control.cjs.map +1 -0
  78. package/dist/controls/slider-control.d.ts +19 -0
  79. package/dist/controls/slider-control.d.ts.map +1 -0
  80. package/dist/controls/slider-control.js +2 -0
  81. package/dist/controls/slider-control.js.map +1 -0
  82. package/dist/controls/spinner-control.cjs +2 -0
  83. package/dist/controls/spinner-control.cjs.map +1 -0
  84. package/dist/controls/spinner-control.d.ts +18 -0
  85. package/dist/controls/spinner-control.d.ts.map +1 -0
  86. package/dist/controls/spinner-control.js +2 -0
  87. package/dist/controls/spinner-control.js.map +1 -0
  88. package/dist/controls.cjs +1 -0
  89. package/dist/controls.js +1 -0
  90. package/dist/craftit.cjs +1 -1
  91. package/dist/craftit.cjs.map +1 -1
  92. package/dist/craftit.js +1 -1
  93. package/dist/craftit.js.map +1 -1
  94. package/dist/directives/attr.cjs +1 -1
  95. package/dist/directives/attr.cjs.map +1 -1
  96. package/dist/directives/attr.d.ts +4 -6
  97. package/dist/directives/attr.d.ts.map +1 -1
  98. package/dist/directives/attr.js +1 -1
  99. package/dist/directives/attr.js.map +1 -1
  100. package/dist/directives/bind.cjs +1 -1
  101. package/dist/directives/bind.cjs.map +1 -1
  102. package/dist/directives/bind.d.ts +20 -12
  103. package/dist/directives/bind.d.ts.map +1 -1
  104. package/dist/directives/bind.js +1 -1
  105. package/dist/directives/bind.js.map +1 -1
  106. package/dist/directives/choose.cjs +1 -1
  107. package/dist/directives/choose.cjs.map +1 -1
  108. package/dist/directives/choose.d.ts +17 -12
  109. package/dist/directives/choose.d.ts.map +1 -1
  110. package/dist/directives/choose.js +1 -1
  111. package/dist/directives/choose.js.map +1 -1
  112. package/dist/directives/each.cjs +1 -1
  113. package/dist/directives/each.cjs.map +1 -1
  114. package/dist/directives/each.d.ts +19 -31
  115. package/dist/directives/each.d.ts.map +1 -1
  116. package/dist/directives/each.js +1 -1
  117. package/dist/directives/each.js.map +1 -1
  118. package/dist/directives/index.d.ts +1 -2
  119. package/dist/directives/index.d.ts.map +1 -1
  120. package/dist/directives/memo.cjs +1 -1
  121. package/dist/directives/memo.cjs.map +1 -1
  122. package/dist/directives/memo.d.ts +8 -4
  123. package/dist/directives/memo.d.ts.map +1 -1
  124. package/dist/directives/memo.js +1 -1
  125. package/dist/directives/memo.js.map +1 -1
  126. package/dist/directives/on.cjs +1 -1
  127. package/dist/directives/on.cjs.map +1 -1
  128. package/dist/directives/on.d.ts +1 -1
  129. package/dist/directives/on.d.ts.map +1 -1
  130. package/dist/directives/on.js +1 -1
  131. package/dist/directives/on.js.map +1 -1
  132. package/dist/directives/raw.cjs +1 -1
  133. package/dist/directives/raw.cjs.map +1 -1
  134. package/dist/directives/raw.d.ts +1 -1
  135. package/dist/directives/raw.d.ts.map +1 -1
  136. package/dist/directives/raw.js +1 -1
  137. package/dist/directives/raw.js.map +1 -1
  138. package/dist/directives/spread.cjs +1 -1
  139. package/dist/directives/spread.cjs.map +1 -1
  140. package/dist/directives/spread.d.ts +1 -1
  141. package/dist/directives/spread.d.ts.map +1 -1
  142. package/dist/directives/spread.js +1 -1
  143. package/dist/directives/spread.js.map +1 -1
  144. package/dist/directives/style.cjs +1 -1
  145. package/dist/directives/style.cjs.map +1 -1
  146. package/dist/directives/style.js +1 -1
  147. package/dist/directives/style.js.map +1 -1
  148. package/dist/directives/until.cjs.map +1 -1
  149. package/dist/directives/until.d.ts +1 -1
  150. package/dist/directives/until.d.ts.map +1 -1
  151. package/dist/directives/until.js.map +1 -1
  152. package/dist/directives/when.cjs +1 -1
  153. package/dist/directives/when.cjs.map +1 -1
  154. package/dist/directives/when.d.ts +11 -5
  155. package/dist/directives/when.d.ts.map +1 -1
  156. package/dist/directives/when.js +1 -1
  157. package/dist/directives/when.js.map +1 -1
  158. package/dist/directives.cjs +1 -0
  159. package/dist/directives.js +1 -0
  160. package/dist/form.cjs +2 -0
  161. package/dist/form.cjs.map +1 -0
  162. package/dist/form.d.ts +29 -0
  163. package/dist/form.d.ts.map +1 -0
  164. package/dist/form.js +2 -0
  165. package/dist/form.js.map +1 -0
  166. package/dist/host.cjs +2 -0
  167. package/dist/host.cjs.map +1 -0
  168. package/dist/host.d.ts +75 -0
  169. package/dist/host.d.ts.map +1 -0
  170. package/dist/host.js +2 -0
  171. package/dist/host.js.map +1 -0
  172. package/dist/index.cjs +1 -1
  173. package/dist/index.d.ts +8 -9
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +1 -1
  176. package/dist/internal.cjs +2 -0
  177. package/dist/internal.cjs.map +1 -0
  178. package/dist/internal.d.ts +171 -0
  179. package/dist/internal.d.ts.map +1 -0
  180. package/dist/internal.js +2 -0
  181. package/dist/internal.js.map +1 -0
  182. package/dist/observers/index.d.ts +4 -0
  183. package/dist/observers/index.d.ts.map +1 -0
  184. package/dist/observers/intersection-observe.cjs +2 -0
  185. package/dist/observers/intersection-observe.cjs.map +1 -0
  186. package/dist/observers/intersection-observe.d.ts +9 -0
  187. package/dist/observers/intersection-observe.d.ts.map +1 -0
  188. package/dist/observers/intersection-observe.js +2 -0
  189. package/dist/observers/intersection-observe.js.map +1 -0
  190. package/dist/observers/media-observe.cjs +2 -0
  191. package/dist/observers/media-observe.cjs.map +1 -0
  192. package/dist/observers/media-observe.d.ts +8 -0
  193. package/dist/observers/media-observe.d.ts.map +1 -0
  194. package/dist/observers/media-observe.js +2 -0
  195. package/dist/observers/media-observe.js.map +1 -0
  196. package/dist/observers/resize-observe.cjs +2 -0
  197. package/dist/observers/resize-observe.cjs.map +1 -0
  198. package/dist/observers/resize-observe.d.ts +11 -0
  199. package/dist/observers/resize-observe.d.ts.map +1 -0
  200. package/dist/observers/resize-observe.js +2 -0
  201. package/dist/observers/resize-observe.js.map +1 -0
  202. package/dist/observers.cjs +1 -0
  203. package/dist/observers.js +1 -0
  204. package/dist/props.cjs +2 -0
  205. package/dist/props.cjs.map +1 -0
  206. package/dist/props.d.ts +52 -0
  207. package/dist/props.d.ts.map +1 -0
  208. package/dist/props.js +2 -0
  209. package/dist/props.js.map +1 -0
  210. package/dist/registration.cjs +2 -0
  211. package/dist/registration.cjs.map +1 -0
  212. package/dist/registration.d.ts +18 -0
  213. package/dist/registration.d.ts.map +1 -0
  214. package/dist/registration.js +2 -0
  215. package/dist/registration.js.map +1 -0
  216. package/dist/runtime-bindings.cjs +2 -0
  217. package/dist/runtime-bindings.cjs.map +1 -0
  218. package/dist/runtime-bindings.d.ts.map +1 -0
  219. package/dist/runtime-bindings.js +2 -0
  220. package/dist/runtime-bindings.js.map +1 -0
  221. package/dist/runtime-core.cjs +2 -0
  222. package/dist/runtime-core.cjs.map +1 -0
  223. package/dist/runtime-core.d.ts +21 -0
  224. package/dist/runtime-core.d.ts.map +1 -0
  225. package/dist/runtime-core.js +2 -0
  226. package/dist/runtime-core.js.map +1 -0
  227. package/dist/runtime-lifecycle.cjs +2 -0
  228. package/dist/runtime-lifecycle.cjs.map +1 -0
  229. package/dist/runtime-lifecycle.d.ts +24 -0
  230. package/dist/runtime-lifecycle.d.ts.map +1 -0
  231. package/dist/runtime-lifecycle.js +2 -0
  232. package/dist/runtime-lifecycle.js.map +1 -0
  233. package/dist/runtime.cjs +2 -0
  234. package/dist/runtime.cjs.map +1 -0
  235. package/dist/runtime.d.ts +21 -0
  236. package/dist/runtime.d.ts.map +1 -0
  237. package/dist/runtime.js +2 -0
  238. package/dist/runtime.js.map +1 -0
  239. package/dist/template-bindings.cjs +2 -0
  240. package/dist/template-bindings.cjs.map +1 -0
  241. package/dist/{core/template-bindings.d.ts → template-bindings.d.ts} +4 -1
  242. package/dist/template-bindings.d.ts.map +1 -0
  243. package/dist/template-bindings.js +2 -0
  244. package/dist/template-bindings.js.map +1 -0
  245. package/dist/template-compiler.cjs +2 -0
  246. package/dist/template-compiler.cjs.map +1 -0
  247. package/dist/{core/template-compiler.d.ts → template-compiler.d.ts} +1 -2
  248. package/dist/template-compiler.d.ts.map +1 -0
  249. package/dist/template-compiler.js +2 -0
  250. package/dist/template-compiler.js.map +1 -0
  251. package/dist/template-dom.cjs +2 -0
  252. package/dist/{core/template-dom.js.map → template-dom.cjs.map} +1 -1
  253. package/dist/template-dom.d.ts.map +1 -0
  254. package/dist/template-dom.js +2 -0
  255. package/dist/template-dom.js.map +1 -0
  256. package/dist/template-html.cjs +2 -0
  257. package/dist/template-html.cjs.map +1 -0
  258. package/dist/{core/template-html.d.ts → template-html.d.ts} +1 -4
  259. package/dist/template-html.d.ts.map +1 -0
  260. package/dist/template-html.js +2 -0
  261. package/dist/template-html.js.map +1 -0
  262. package/dist/template.cjs +2 -0
  263. package/dist/template.cjs.map +1 -0
  264. package/dist/{core/template.d.ts → template.d.ts} +2 -3
  265. package/dist/template.d.ts.map +1 -0
  266. package/dist/template.js +2 -0
  267. package/dist/template.js.map +1 -0
  268. package/dist/testing/index.d.ts +2 -0
  269. package/dist/testing/index.d.ts.map +1 -0
  270. package/dist/testing/testing.cjs +2 -0
  271. package/dist/testing/testing.cjs.map +1 -0
  272. package/dist/{test/test.d.ts → testing/testing.d.ts} +8 -8
  273. package/dist/testing/testing.d.ts.map +1 -0
  274. package/dist/testing/testing.js +2 -0
  275. package/dist/testing/testing.js.map +1 -0
  276. package/dist/testing.cjs +1 -0
  277. package/dist/testing.js +1 -0
  278. package/package.json +19 -14
  279. package/dist/core/component.cjs +0 -2
  280. package/dist/core/component.cjs.map +0 -1
  281. package/dist/core/component.d.ts +0 -172
  282. package/dist/core/component.d.ts.map +0 -1
  283. package/dist/core/component.js +0 -2
  284. package/dist/core/component.js.map +0 -1
  285. package/dist/core/host.cjs +0 -2
  286. package/dist/core/host.cjs.map +0 -1
  287. package/dist/core/host.d.ts +0 -77
  288. package/dist/core/host.d.ts.map +0 -1
  289. package/dist/core/host.js +0 -2
  290. package/dist/core/host.js.map +0 -1
  291. package/dist/core/internal.cjs +0 -2
  292. package/dist/core/internal.cjs.map +0 -1
  293. package/dist/core/internal.d.ts +0 -107
  294. package/dist/core/internal.d.ts.map +0 -1
  295. package/dist/core/internal.js +0 -2
  296. package/dist/core/internal.js.map +0 -1
  297. package/dist/core/runtime-bindings.cjs +0 -2
  298. package/dist/core/runtime-bindings.cjs.map +0 -1
  299. package/dist/core/runtime-bindings.d.ts.map +0 -1
  300. package/dist/core/runtime-bindings.js +0 -2
  301. package/dist/core/runtime-bindings.js.map +0 -1
  302. package/dist/core/runtime-lifecycle.cjs +0 -2
  303. package/dist/core/runtime-lifecycle.cjs.map +0 -1
  304. package/dist/core/runtime-lifecycle.d.ts +0 -116
  305. package/dist/core/runtime-lifecycle.d.ts.map +0 -1
  306. package/dist/core/runtime-lifecycle.js +0 -2
  307. package/dist/core/runtime-lifecycle.js.map +0 -1
  308. package/dist/core/runtime.cjs +0 -1
  309. package/dist/core/runtime.d.ts +0 -3
  310. package/dist/core/runtime.d.ts.map +0 -1
  311. package/dist/core/runtime.js +0 -1
  312. package/dist/core/template-bindings.cjs +0 -2
  313. package/dist/core/template-bindings.cjs.map +0 -1
  314. package/dist/core/template-bindings.d.ts.map +0 -1
  315. package/dist/core/template-bindings.js +0 -2
  316. package/dist/core/template-bindings.js.map +0 -1
  317. package/dist/core/template-compiler.cjs +0 -2
  318. package/dist/core/template-compiler.cjs.map +0 -1
  319. package/dist/core/template-compiler.d.ts.map +0 -1
  320. package/dist/core/template-compiler.js +0 -2
  321. package/dist/core/template-compiler.js.map +0 -1
  322. package/dist/core/template-dom.cjs +0 -2
  323. package/dist/core/template-dom.cjs.map +0 -1
  324. package/dist/core/template-dom.d.ts.map +0 -1
  325. package/dist/core/template-dom.js +0 -2
  326. package/dist/core/template-html.cjs +0 -2
  327. package/dist/core/template-html.cjs.map +0 -1
  328. package/dist/core/template-html.d.ts.map +0 -1
  329. package/dist/core/template-html.js +0 -2
  330. package/dist/core/template-html.js.map +0 -1
  331. package/dist/core/template.cjs +0 -2
  332. package/dist/core/template.cjs.map +0 -1
  333. package/dist/core/template.d.ts.map +0 -1
  334. package/dist/core/template.js +0 -2
  335. package/dist/core/template.js.map +0 -1
  336. package/dist/core/utilities.cjs +0 -2
  337. package/dist/core/utilities.cjs.map +0 -1
  338. package/dist/core/utilities.d.ts +0 -68
  339. package/dist/core/utilities.d.ts.map +0 -1
  340. package/dist/core/utilities.js +0 -2
  341. package/dist/core/utilities.js.map +0 -1
  342. package/dist/directives/index.cjs +0 -1
  343. package/dist/directives/index.js +0 -1
  344. package/dist/directives/match.cjs +0 -2
  345. package/dist/directives/match.cjs.map +0 -1
  346. package/dist/directives/match.d.ts +0 -31
  347. package/dist/directives/match.d.ts.map +0 -1
  348. package/dist/directives/match.js +0 -2
  349. package/dist/directives/match.js.map +0 -1
  350. package/dist/labs/a11y.cjs +0 -2
  351. package/dist/labs/a11y.cjs.map +0 -1
  352. package/dist/labs/a11y.d.ts +0 -61
  353. package/dist/labs/a11y.d.ts.map +0 -1
  354. package/dist/labs/a11y.js +0 -2
  355. package/dist/labs/a11y.js.map +0 -1
  356. package/dist/labs/index.d.ts +0 -8
  357. package/dist/labs/index.d.ts.map +0 -1
  358. package/dist/labs/list.cjs +0 -2
  359. package/dist/labs/list.cjs.map +0 -1
  360. package/dist/labs/list.d.ts +0 -26
  361. package/dist/labs/list.d.ts.map +0 -1
  362. package/dist/labs/list.js +0 -2
  363. package/dist/labs/list.js.map +0 -1
  364. package/dist/labs/observers.cjs +0 -2
  365. package/dist/labs/observers.cjs.map +0 -1
  366. package/dist/labs/observers.d.ts +0 -42
  367. package/dist/labs/observers.d.ts.map +0 -1
  368. package/dist/labs/observers.js +0 -2
  369. package/dist/labs/observers.js.map +0 -1
  370. package/dist/labs/overlay.cjs +0 -2
  371. package/dist/labs/overlay.cjs.map +0 -1
  372. package/dist/labs/overlay.d.ts +0 -35
  373. package/dist/labs/overlay.d.ts.map +0 -1
  374. package/dist/labs/overlay.js +0 -2
  375. package/dist/labs/overlay.js.map +0 -1
  376. package/dist/labs/selectable.cjs +0 -2
  377. package/dist/labs/selectable.cjs.map +0 -1
  378. package/dist/labs/selectable.d.ts +0 -70
  379. package/dist/labs/selectable.d.ts.map +0 -1
  380. package/dist/labs/selectable.js +0 -2
  381. package/dist/labs/selectable.js.map +0 -1
  382. package/dist/labs/selection.cjs +0 -2
  383. package/dist/labs/selection.cjs.map +0 -1
  384. package/dist/labs/selection.d.ts +0 -68
  385. package/dist/labs/selection.d.ts.map +0 -1
  386. package/dist/labs/selection.js +0 -2
  387. package/dist/labs/selection.js.map +0 -1
  388. package/dist/labs.cjs +0 -1
  389. package/dist/labs.js +0 -1
  390. package/dist/test/index.d.ts +0 -2
  391. package/dist/test/index.d.ts.map +0 -1
  392. package/dist/test/test.cjs +0 -2
  393. package/dist/test/test.cjs.map +0 -1
  394. package/dist/test/test.d.ts.map +0 -1
  395. package/dist/test/test.js +0 -2
  396. package/dist/test/test.js.map +0 -1
  397. package/dist/test.cjs +0 -1
  398. package/dist/test.js +0 -1
  399. /package/dist/{core/runtime-bindings.d.ts → runtime-bindings.d.ts} +0 -0
  400. /package/dist/{core/template-dom.d.ts → template-dom.d.ts} +0 -0
@@ -0,0 +1,37 @@
1
+ import { type ReadonlySignal } from '@vielzeug/stateit';
2
+ import { type ControlContextOptions } from './internal/control-state';
3
+ export type OverlayOpenReason = 'programmatic' | 'trigger';
4
+ export type OverlayCloseReason = 'escape' | 'outside-click' | 'programmatic' | 'trigger';
5
+ export type OverlayCloseDetail = {
6
+ reason: OverlayCloseReason;
7
+ };
8
+ export type OverlayOpenDetail = {
9
+ reason: OverlayOpenReason;
10
+ };
11
+ type OverlayPositioner = {
12
+ floating: () => HTMLElement | null;
13
+ reference: () => HTMLElement | null;
14
+ update: () => void;
15
+ };
16
+ export type OverlayControlOptions = ControlContextOptions & {
17
+ elements: {
18
+ boundary: HTMLElement;
19
+ panel?: HTMLElement | null;
20
+ trigger?: HTMLElement | null;
21
+ };
22
+ isOpen: ReadonlySignal<boolean>;
23
+ onClose?: (reason: OverlayCloseReason) => void;
24
+ onOpen?: (reason: OverlayOpenReason) => void;
25
+ positioner?: OverlayPositioner;
26
+ restoreFocus?: boolean | (() => boolean);
27
+ setOpen: (next: boolean, reason: OverlayOpenReason | OverlayCloseReason) => void;
28
+ };
29
+ export type OverlayControl = {
30
+ bindOutsideClick(target?: Document | HTMLElement, capture?: boolean): () => void;
31
+ close(reason?: OverlayCloseReason, restoreFocus?: boolean): void;
32
+ open(reason?: OverlayOpenReason): void;
33
+ toggle(): void;
34
+ };
35
+ export declare const createOverlayControl: (options: OverlayControlOptions) => OverlayControl;
36
+ export {};
37
+ //# sourceMappingURL=overlay-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-control.d.ts","sourceRoot":"","sources":["../../src/controls/overlay-control.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,SAAS,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;AACzF,MAAM,MAAM,kBAAkB,GAAG;IAAE,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE9D,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,GAAG;IAC1D,QAAQ,EAAE;QACR,QAAQ,EAAE,WAAW,CAAC;QACtB,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;QAC3B,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,KAAK,IAAI,CAAC;CAClF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;IACjF,KAAK,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,qBAAqB,KAAG,cAqFrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{effect as e}from"../runtime-lifecycle.js";import{createControlState as t}from"./internal/control-state.js";import{onCleanup as n}from"@vielzeug/stateit";import{autoUpdate as r}from"@vielzeug/floatit";var i=i=>{let a=t(i);e(()=>{if(!i.isOpen.value||!i.positioner)return;let e=i.positioner.reference(),t=i.positioner.floating();if(!e||!t){i.positioner.update();return}n(r(e,t,()=>i.positioner?.update()))});let o=()=>typeof i.restoreFocus==`function`?i.restoreFocus():i.restoreFocus??!0,s=(e=`programmatic`)=>{a.disabled.value||i.isOpen.value||(i.setOpen(!0,e),requestAnimationFrame(()=>i.positioner?.update()),i.onOpen?.(e))},c=(e=`programmatic`,t)=>{i.isOpen.value&&(i.setOpen(!1,e),(t??o())&&i.elements.trigger?.focus(),i.onClose?.(e))},l=()=>{if(i.isOpen.value){c(`trigger`);return}s(`trigger`)},u=(e,t)=>e?e.contains(t):!1;return{bindOutsideClick:(e=document,t=!0)=>{let n=e=>{if(!i.isOpen.value)return;let t=e.composedPath()[0];t&&(u(i.elements.boundary,t)||u(i.elements.panel,t)||c(`outside-click`))};return e.addEventListener(`click`,n,{capture:t}),()=>e.removeEventListener(`click`,n,{capture:t})},close:c,open:s,toggle:l}};export{i as createOverlayControl};
2
+ //# sourceMappingURL=overlay-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay-control.js","names":[],"sources":["../../src/controls/overlay-control.ts"],"sourcesContent":["import { autoUpdate } from '@vielzeug/floatit';\nimport { onCleanup as onSignalCleanup, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { effect } from '../runtime-lifecycle';\nimport { createControlState, type ControlContextOptions } from './internal/control-state';\n\nexport type OverlayOpenReason = 'programmatic' | 'trigger';\nexport type OverlayCloseReason = 'escape' | 'outside-click' | 'programmatic' | 'trigger';\nexport type OverlayCloseDetail = { reason: OverlayCloseReason };\nexport type OverlayOpenDetail = { reason: OverlayOpenReason };\n\ntype OverlayPositioner = {\n floating: () => HTMLElement | null;\n reference: () => HTMLElement | null;\n update: () => void;\n};\n\nexport type OverlayControlOptions = ControlContextOptions & {\n elements: {\n boundary: HTMLElement;\n panel?: HTMLElement | null;\n trigger?: HTMLElement | null;\n };\n isOpen: ReadonlySignal<boolean>;\n onClose?: (reason: OverlayCloseReason) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n positioner?: OverlayPositioner;\n restoreFocus?: boolean | (() => boolean);\n setOpen: (next: boolean, reason: OverlayOpenReason | OverlayCloseReason) => void;\n};\n\nexport type OverlayControl = {\n bindOutsideClick(target?: Document | HTMLElement, capture?: boolean): () => void;\n close(reason?: OverlayCloseReason, restoreFocus?: boolean): void;\n open(reason?: OverlayOpenReason): void;\n toggle(): void;\n};\n\nexport const createOverlayControl = (options: OverlayControlOptions): OverlayControl => {\n const controlState = createControlState(options);\n\n // Effect handles positioning lifecycle automatically\n effect(() => {\n if (!options.isOpen.value || !options.positioner) return;\n\n const reference = options.positioner.reference();\n const floating = options.positioner.floating();\n\n if (!reference || !floating) {\n options.positioner.update();\n\n return;\n }\n\n const cleanup = autoUpdate(reference, floating, () => options.positioner?.update());\n\n onSignalCleanup(cleanup); // Auto-cleanup on effect re-run/end\n });\n\n const shouldRestoreFocus = (): boolean => {\n if (typeof options.restoreFocus === 'function') return options.restoreFocus();\n\n return options.restoreFocus ?? true;\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (controlState.disabled.value || options.isOpen.value) return;\n\n options.setOpen(true, reason);\n requestAnimationFrame(() => options.positioner?.update());\n options.onOpen?.(reason);\n };\n\n const close = (reason: OverlayCloseReason = 'programmatic', restoreFocus?: boolean): void => {\n if (!options.isOpen.value) return;\n\n options.setOpen(false, reason);\n\n const restore = restoreFocus ?? shouldRestoreFocus();\n\n if (restore) options.elements.trigger?.focus();\n\n options.onClose?.(reason);\n };\n\n const toggle = (): void => {\n if (options.isOpen.value) {\n close('trigger');\n\n return;\n }\n\n open('trigger');\n };\n\n const isInside = (element: HTMLElement | null | undefined, target: Node): boolean => {\n return element ? element.contains(target) : false;\n };\n\n const bindOutsideClick = (target: Document | HTMLElement = document, capture = true): (() => void) => {\n const handler = (event: Event) => {\n if (!options.isOpen.value) return;\n\n const el = event.composedPath()[0] as Node | null;\n\n if (!el) return;\n\n const inside = isInside(options.elements.boundary, el) || isInside(options.elements.panel, el);\n\n if (!inside) close('outside-click');\n };\n\n target.addEventListener('click', handler, { capture });\n\n return () => target.removeEventListener('click', handler, { capture });\n };\n\n return {\n bindOutsideClick,\n close,\n open,\n toggle,\n };\n};\n"],"mappings":"+MAsCA,IAAa,EAAwB,GAAmD,CACtF,IAAM,EAAe,EAAmB,EAAQ,CAGhD,MAAa,CACX,GAAI,CAAC,EAAQ,OAAO,OAAS,CAAC,EAAQ,WAAY,OAElD,IAAM,EAAY,EAAQ,WAAW,WAAW,CAC1C,EAAW,EAAQ,WAAW,UAAU,CAE9C,GAAI,CAAC,GAAa,CAAC,EAAU,CAC3B,EAAQ,WAAW,QAAQ,CAE3B,OAKF,EAFgB,EAAW,EAAW,MAAgB,EAAQ,YAAY,QAAQ,CAAC,CAE3D,EACxB,CAEF,IAAM,MACA,OAAO,EAAQ,cAAiB,WAAmB,EAAQ,cAAc,CAEtE,EAAQ,cAAgB,GAG3B,GAAQ,EAA4B,iBAAyB,CAC7D,EAAa,SAAS,OAAS,EAAQ,OAAO,QAElD,EAAQ,QAAQ,GAAM,EAAO,CAC7B,0BAA4B,EAAQ,YAAY,QAAQ,CAAC,CACzD,EAAQ,SAAS,EAAO,GAGpB,GAAS,EAA6B,eAAgB,IAAiC,CACtF,EAAQ,OAAO,QAEpB,EAAQ,QAAQ,GAAO,EAAO,EAEd,GAAgB,GAAoB,GAEvC,EAAQ,SAAS,SAAS,OAAO,CAE9C,EAAQ,UAAU,EAAO,GAGrB,MAAqB,CACzB,GAAI,EAAQ,OAAO,MAAO,CACxB,EAAM,UAAU,CAEhB,OAGF,EAAK,UAAU,EAGX,GAAY,EAAyC,IAClD,EAAU,EAAQ,SAAS,EAAO,CAAG,GAqB9C,MAAO,CACL,kBAnBwB,EAAiC,SAAU,EAAU,KAAuB,CACpG,IAAM,EAAW,GAAiB,CAChC,GAAI,CAAC,EAAQ,OAAO,MAAO,OAE3B,IAAM,EAAK,EAAM,cAAc,CAAC,GAE3B,IAEU,EAAS,EAAQ,SAAS,SAAU,EAAG,EAAI,EAAS,EAAQ,SAAS,MAAO,EAAG,EAEjF,EAAM,gBAAgB,GAKrC,OAFA,EAAO,iBAAiB,QAAS,EAAS,CAAE,UAAS,CAAC,KAEzC,EAAO,oBAAoB,QAAS,EAAS,CAAE,UAAS,CAAC,EAKtE,QACA,OACA,SACD"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./internal/keyboard-utils.cjs`);var t=t=>{let n=()=>!!t.disabled?.(),r=t.keys??[`Enter`,` `],i=Object.fromEntries(r.map(e=>[e,e=>t.onPress(e,`keyboard`)]));return{handleClick:e=>n()?!1:(t.onPress(e,`pointer`),!0),handleKeydown:t=>e.dispatchKeyboardAction(t,{disabled:n,keymap:i})}};exports.createPressControl=t;
2
+ //# sourceMappingURL=press-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press-control.cjs","names":[],"sources":["../../src/controls/press-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\nexport type PressControlOptions = {\n disabled?: () => boolean;\n keys?: string[];\n onPress: (originalEvent: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type PressControl = {\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\nexport const createPressControl = (options: PressControlOptions): PressControl => {\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress(keyboardEvent, 'keyboard')]),\n );\n\n const handleClick = (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress(event, 'pointer');\n\n return true;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isDisabled,\n keymap,\n });\n };\n\n return {\n handleClick,\n handleKeydown,\n };\n};\n"],"mappings":"iDAeA,IAAa,EAAsB,GAA+C,CAChF,IAAM,MAA4B,EAAQ,EAAQ,YAAY,CACxD,EAAe,EAAQ,MAAQ,CAAC,QAAS,IAAI,CAC7C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,QAAQ,EAAe,WAAW,CAAC,CAAC,CAC/G,CAiBD,MAAO,CACL,YAhBmB,GACf,GAAY,CAAS,IAEzB,EAAQ,QAAQ,EAAO,UAAU,CAE1B,IAYP,cATqB,GACd,EAAA,uBAAuB,EAAO,CACnC,SAAU,EACV,SACD,CAAC,CAMH"}
@@ -0,0 +1,12 @@
1
+ export type PressTrigger = 'keyboard' | 'pointer';
2
+ export type PressControlOptions = {
3
+ disabled?: () => boolean;
4
+ keys?: string[];
5
+ onPress: (originalEvent: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;
6
+ };
7
+ export type PressControl = {
8
+ handleClick: (event: MouseEvent) => boolean;
9
+ handleKeydown: (event: KeyboardEvent) => boolean;
10
+ };
11
+ export declare const createPressControl: (options: PressControlOptions) => PressControl;
12
+ //# sourceMappingURL=press-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press-control.d.ts","sourceRoot":"","sources":["../../src/controls/press-control.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAElD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,GAAG,UAAU,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CACrF,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,mBAAmB,KAAG,YA0BjE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{dispatchKeyboardAction as e}from"./internal/keyboard-utils.js";var t=t=>{let n=()=>!!t.disabled?.(),r=t.keys??[`Enter`,` `],i=Object.fromEntries(r.map(e=>[e,e=>t.onPress(e,`keyboard`)]));return{handleClick:e=>n()?!1:(t.onPress(e,`pointer`),!0),handleKeydown:t=>e(t,{disabled:n,keymap:i})}};export{t as createPressControl};
2
+ //# sourceMappingURL=press-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press-control.js","names":[],"sources":["../../src/controls/press-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\nexport type PressControlOptions = {\n disabled?: () => boolean;\n keys?: string[];\n onPress: (originalEvent: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type PressControl = {\n handleClick: (event: MouseEvent) => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\nexport const createPressControl = (options: PressControlOptions): PressControl => {\n const isDisabled = (): boolean => Boolean(options.disabled?.());\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress(keyboardEvent, 'keyboard')]),\n );\n\n const handleClick = (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress(event, 'pointer');\n\n return true;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isDisabled,\n keymap,\n });\n };\n\n return {\n handleClick,\n handleKeydown,\n };\n};\n"],"mappings":"sEAeA,IAAa,EAAsB,GAA+C,CAChF,IAAM,MAA4B,EAAQ,EAAQ,YAAY,CACxD,EAAe,EAAQ,MAAQ,CAAC,QAAS,IAAI,CAC7C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,QAAQ,EAAe,WAAW,CAAC,CAAC,CAC/G,CAiBD,MAAO,CACL,YAhBmB,GACf,GAAY,CAAS,IAEzB,EAAQ,QAAQ,EAAO,UAAU,CAE1B,IAYP,cATqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,SACD,CAAC,CAMH"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./internal/number-utils.cjs`);var t=t=>{let n=()=>e.toFiniteNumberOr(t.min?.(),0),r=()=>e.toFiniteNumberOr(t.max?.(),100),i=()=>e.toPositiveStep(t.step?.(),1),a=t=>{let i=n(),a=r();return e.clampNumber(e.normalizeFinite(t,i),i,a)},o=t=>{let r=e.normalizeFinite(t,n());return a(Math.round(r/i())*i())};return{clamp:a,fromClientX:(e,t)=>{if(t.width<=0)return o(n());let i=Math.max(0,Math.min(1,(e-t.left)/t.width)),a=n();return o(a+i*(r()-a))},max:r,min:n,nextFromKey:(t,o)=>{let s=e.normalizeFinite(o,n());return t===`ArrowRight`||t===`ArrowUp`?a(s+i()):t===`ArrowLeft`||t===`ArrowDown`?a(s-i()):t===`Home`?n():t===`End`?r():null},snap:o,toPercent:t=>{let i=n(),a=r(),o=e.normalizeFinite(t,i);return a<=i?0:(o-i)/(a-i)*100}}};exports.createSliderControl=t;
2
+ //# sourceMappingURL=slider-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-control.cjs","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"+CAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAA,iBAAiB,EAAQ,OAAO,CAAE,EAAE,CACxD,MAAoB,EAAA,iBAAiB,EAAQ,OAAO,CAAE,IAAI,CAC1D,MAAqB,EAAA,eAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,EAAS,GAA0B,CACvC,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAGtB,OAAO,EAAA,YAFY,EAAA,gBAAgB,EAAO,EAAS,CAEpB,EAAU,EAAS,EAG9C,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAA,gBAAgB,EADlB,GAAK,CAC6B,CAEnD,OAAO,EAAM,KAAK,MAAM,EAAa,GAAM,CAAC,CAAG,GAAM,CAAC,EAqCxD,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,GAAK,CAAC,CAEvC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,MAAM,CAAC,CAClE,EAAW,GAAK,CAGtB,OAAO,EAAK,EAAW,GAFN,GAAK,CAEmB,GAAU,EAoBnD,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAA,gBAAgB,EAAS,GAAK,CAAC,CAUlD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,GAAM,CAAC,CAE5E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,GAAM,CAAC,CAE7E,IAAQ,OAAe,GAAK,CAE5B,IAAQ,MAAc,GAAK,CAExB,MASP,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAChB,EAAa,EAAA,gBAAgB,EAAO,EAAS,CAInD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,KAmC5D"}
@@ -0,0 +1,19 @@
1
+ export type SliderControlOptions = {
2
+ max?: () => number | string | undefined;
3
+ min?: () => number | string | undefined;
4
+ step?: () => number | string | undefined;
5
+ };
6
+ export type SliderControl = {
7
+ clamp: (value: number) => number;
8
+ fromClientX: (clientX: number, rect: {
9
+ left: number;
10
+ width: number;
11
+ }) => number;
12
+ max: () => number;
13
+ min: () => number;
14
+ nextFromKey: (key: string, current: number) => number | null;
15
+ snap: (value: number) => number;
16
+ toPercent: (value: number) => number;
17
+ };
18
+ export declare const createSliderControl: (options: SliderControlOptions) => SliderControl;
19
+ //# sourceMappingURL=slider-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-control.d.ts","sourceRoot":"","sources":["../../src/controls/slider-control.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACjC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAChF,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,SAAS,oBAAoB,KAAG,aA+DnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{clampNumber as e,normalizeFinite as t,toFiniteNumberOr as n,toPositiveStep as r}from"./internal/number-utils.js";var i=i=>{let a=()=>n(i.min?.(),0),o=()=>n(i.max?.(),100),s=()=>r(i.step?.(),1),c=n=>{let r=a(),i=o();return e(t(n,r),r,i)},l=e=>{let n=t(e,a());return c(Math.round(n/s())*s())};return{clamp:c,fromClientX:(e,t)=>{if(t.width<=0)return l(a());let n=Math.max(0,Math.min(1,(e-t.left)/t.width)),r=a();return l(r+n*(o()-r))},max:o,min:a,nextFromKey:(e,n)=>{let r=t(n,a());return e===`ArrowRight`||e===`ArrowUp`?c(r+s()):e===`ArrowLeft`||e===`ArrowDown`?c(r-s()):e===`Home`?a():e===`End`?o():null},snap:l,toPercent:e=>{let n=a(),r=o(),i=t(e,n);return r<=n?0:(i-n)/(r-n)*100}}};export{i as createSliderControl};
2
+ //# sourceMappingURL=slider-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-control.js","names":[],"sources":["../../src/controls/slider-control.ts"],"sourcesContent":["import { clampNumber, normalizeFinite, toFiniteNumberOr, toPositiveStep } from './internal/number-utils';\n\nexport type SliderControlOptions = {\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n step?: () => number | string | undefined;\n};\n\nexport type SliderControl = {\n clamp: (value: number) => number;\n fromClientX: (clientX: number, rect: { left: number; width: number }) => number;\n max: () => number;\n min: () => number;\n nextFromKey: (key: string, current: number) => number | null;\n snap: (value: number) => number;\n toPercent: (value: number) => number;\n};\n\nexport const createSliderControl = (options: SliderControlOptions): SliderControl => {\n const min = (): number => toFiniteNumberOr(options.min?.(), 0);\n const max = (): number => toFiniteNumberOr(options.max?.(), 100);\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const clamp = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n return clampNumber(normalized, minValue, maxValue);\n };\n\n const snap = (value: number): number => {\n const minValue = min();\n const normalized = normalizeFinite(value, minValue);\n\n return clamp(Math.round(normalized / step()) * step());\n };\n\n const toPercent = (value: number): number => {\n const minValue = min();\n const maxValue = max();\n const normalized = normalizeFinite(value, minValue);\n\n if (maxValue <= minValue) return 0;\n\n return ((normalized - minValue) / (maxValue - minValue)) * 100;\n };\n\n const fromClientX = (clientX: number, rect: { left: number; width: number }): number => {\n if (rect.width <= 0) return snap(min());\n\n const pct = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n const minValue = min();\n const maxValue = max();\n\n return snap(minValue + pct * (maxValue - minValue));\n };\n\n const nextFromKey = (key: string, current: number): number | null => {\n const normalized = normalizeFinite(current, min());\n\n if (key === 'ArrowRight' || key === 'ArrowUp') return clamp(normalized + step());\n\n if (key === 'ArrowLeft' || key === 'ArrowDown') return clamp(normalized - step());\n\n if (key === 'Home') return min();\n\n if (key === 'End') return max();\n\n return null;\n };\n\n return {\n clamp,\n fromClientX,\n max,\n min,\n nextFromKey,\n snap,\n toPercent,\n };\n};\n"],"mappings":"wHAkBA,IAAa,EAAuB,GAAiD,CACnF,IAAM,MAAoB,EAAiB,EAAQ,OAAO,CAAE,EAAE,CACxD,MAAoB,EAAiB,EAAQ,OAAO,CAAE,IAAI,CAC1D,MAAqB,EAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,EAAS,GAA0B,CACvC,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAGtB,OAAO,EAFY,EAAgB,EAAO,EAAS,CAEpB,EAAU,EAAS,EAG9C,EAAQ,GAA0B,CAEtC,IAAM,EAAa,EAAgB,EADlB,GAAK,CAC6B,CAEnD,OAAO,EAAM,KAAK,MAAM,EAAa,GAAM,CAAC,CAAG,GAAM,CAAC,EAqCxD,MAAO,CACL,QACA,aA1BmB,EAAiB,IAAkD,CACtF,GAAI,EAAK,OAAS,EAAG,OAAO,EAAK,GAAK,CAAC,CAEvC,IAAM,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAK,MAAQ,EAAK,MAAM,CAAC,CAClE,EAAW,GAAK,CAGtB,OAAO,EAAK,EAAW,GAFN,GAAK,CAEmB,GAAU,EAoBnD,MACA,MACA,aAnBmB,EAAa,IAAmC,CACnE,IAAM,EAAa,EAAgB,EAAS,GAAK,CAAC,CAUlD,OARI,IAAQ,cAAgB,IAAQ,UAAkB,EAAM,EAAa,GAAM,CAAC,CAE5E,IAAQ,aAAe,IAAQ,YAAoB,EAAM,EAAa,GAAM,CAAC,CAE7E,IAAQ,OAAe,GAAK,CAE5B,IAAQ,MAAc,GAAK,CAExB,MASP,OACA,UAzCiB,GAA0B,CAC3C,IAAM,EAAW,GAAK,CAChB,EAAW,GAAK,CAChB,EAAa,EAAgB,EAAO,EAAS,CAInD,OAFI,GAAY,EAAiB,GAExB,EAAa,IAAa,EAAW,GAAa,KAmC5D"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./internal/keyboard-utils.cjs`),t=require(`./internal/number-utils.cjs`);var n=n=>{let r=()=>!!n.disabled?.()||!!n.readonly?.(),i=()=>t.toFiniteNumber(n.min?.()),a=()=>t.toFiniteNumber(n.max?.()),o=e=>t.clampNumber(e,i(),a()),s=()=>t.toPositiveStep(n.step?.(),1),c=()=>{let e=s();return t.toPositiveStep(n.largeStep?.(),e*10)},l=()=>n.parse()??i()??0,u=(e,t)=>{if(e==null){n.commit(null,t);return}n.commit(o(e),t)},d=(e,t)=>{r()||u(l()+e,t)};return{atMax:()=>{let e=n.parse(),t=a();return e!=null&&t!=null&&e>=t},atMin:()=>{let e=n.parse(),t=i();return e!=null&&t!=null&&e<=t},handleKeydown:t=>e.dispatchKeyboardAction(t,{disabled:r,keymap:{ArrowDown:()=>d(-s(),t),ArrowUp:()=>d(s(),t),End:()=>{let e=a();if(e==null)return!1;u(e,t)},Home:()=>{let e=i();if(e==null)return!1;u(e,t)},PageDown:()=>d(-c(),t),PageUp:()=>d(c(),t)},preventDefault:`after`}),incrementBy:d}};exports.createSpinnerControl=n;
2
+ //# sourceMappingURL=spinner-control.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-control.cjs","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"0FAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,YAAY,EAAK,EAAQ,EAAQ,YAAY,CAExF,MACG,EAAA,eAAe,EAAQ,OAAO,CAAC,CAGlC,MACG,EAAA,eAAe,EAAQ,OAAO,CAAC,CAGlC,EAAS,GACN,EAAA,YAAY,EAAO,GAAK,CAAE,GAAK,CAAC,CAGnC,MAAqB,EAAA,eAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,MAA0B,CAC9B,IAAM,EAAI,GAAM,CAEhB,OAAO,EAAA,eAAe,EAAQ,aAAa,CAAE,EAAI,GAAG,EAGhD,MACW,EAAQ,OAAO,EAIb,GAAK,EAIf,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,EAAc,CAEnC,OAGF,EAAQ,OAAO,EAAM,EAAM,CAAE,EAAc,EAGvC,GAAe,EAAe,IAAgC,CAC9D,GAAW,EAEf,EAAO,GAAmB,CAAG,EAAO,EAAc,EA4CpD,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAgCvD,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAwCvD,cA9BqB,GACd,EAAA,uBAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,GAAM,CAAE,EAAM,CAC5C,YAAe,EAAY,GAAM,CAAE,EAAM,CACzC,QAAW,CACT,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,SAAY,CACV,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,aAAgB,EAAY,CAAC,GAAW,CAAE,EAAM,CAChD,WAAc,EAAY,GAAW,CAAE,EAAM,CAC9C,CACD,eAAgB,QACjB,CAAC,CAOF,cACD"}
@@ -0,0 +1,18 @@
1
+ export type SpinnerControlOptions = {
2
+ commit: (value: number | null, originalEvent?: Event) => void;
3
+ disabled?: () => boolean;
4
+ largeStep?: () => number | string | undefined;
5
+ max?: () => number | string | undefined;
6
+ min?: () => number | string | undefined;
7
+ parse: () => number | null;
8
+ readonly?: () => boolean;
9
+ step?: () => number | string | undefined;
10
+ };
11
+ export type SpinnerControl = {
12
+ atMax: () => boolean;
13
+ atMin: () => boolean;
14
+ handleKeydown: (event: KeyboardEvent) => boolean;
15
+ incrementBy: (delta: number, originalEvent?: Event) => void;
16
+ };
17
+ export declare const createSpinnerControl: (options: SpinnerControlOptions) => SpinnerControl;
18
+ //# sourceMappingURL=spinner-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-control.d.ts","sourceRoot":"","sources":["../../src/controls/spinner-control.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IACjD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,qBAAqB,KAAG,cAkGrE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{dispatchKeyboardAction as e}from"./internal/keyboard-utils.js";import{clampNumber as t,toFiniteNumber as n,toPositiveStep as r}from"./internal/number-utils.js";var i=i=>{let a=()=>!!i.disabled?.()||!!i.readonly?.(),o=()=>n(i.min?.()),s=()=>n(i.max?.()),c=e=>t(e,o(),s()),l=()=>r(i.step?.(),1),u=()=>{let e=l();return r(i.largeStep?.(),e*10)},d=()=>i.parse()??o()??0,f=(e,t)=>{if(e==null){i.commit(null,t);return}i.commit(c(e),t)},p=(e,t)=>{a()||f(d()+e,t)};return{atMax:()=>{let e=i.parse(),t=s();return e!=null&&t!=null&&e>=t},atMin:()=>{let e=i.parse(),t=o();return e!=null&&t!=null&&e<=t},handleKeydown:t=>e(t,{disabled:a,keymap:{ArrowDown:()=>p(-l(),t),ArrowUp:()=>p(l(),t),End:()=>{let e=s();if(e==null)return!1;f(e,t)},Home:()=>{let e=o();if(e==null)return!1;f(e,t)},PageDown:()=>p(-u(),t),PageUp:()=>p(u(),t)},preventDefault:`after`}),incrementBy:p}};export{i as createSpinnerControl};
2
+ //# sourceMappingURL=spinner-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-control.js","names":[],"sources":["../../src/controls/spinner-control.ts"],"sourcesContent":["import { dispatchKeyboardAction } from './internal/keyboard-utils';\nimport { clampNumber, toFiniteNumber, toPositiveStep } from './internal/number-utils';\n\nexport type SpinnerControlOptions = {\n commit: (value: number | null, originalEvent?: Event) => void;\n disabled?: () => boolean;\n largeStep?: () => number | string | undefined;\n max?: () => number | string | undefined;\n min?: () => number | string | undefined;\n parse: () => number | null;\n readonly?: () => boolean;\n step?: () => number | string | undefined;\n};\n\nexport type SpinnerControl = {\n atMax: () => boolean;\n atMin: () => boolean;\n handleKeydown: (event: KeyboardEvent) => boolean;\n incrementBy: (delta: number, originalEvent?: Event) => void;\n};\n\nexport const createSpinnerControl = (options: SpinnerControlOptions): SpinnerControl => {\n const isBlocked = (): boolean => Boolean(options.disabled?.()) || Boolean(options.readonly?.());\n\n const min = (): number | undefined => {\n return toFiniteNumber(options.min?.());\n };\n\n const max = (): number | undefined => {\n return toFiniteNumber(options.max?.());\n };\n\n const clamp = (value: number): number => {\n return clampNumber(value, min(), max());\n };\n\n const step = (): number => toPositiveStep(options.step?.(), 1);\n\n const largeStep = (): number => {\n const s = step();\n\n return toPositiveStep(options.largeStep?.(), s * 10);\n };\n\n const currentOrFallback = (): number => {\n const parsed = options.parse();\n\n if (parsed != null) return parsed;\n\n const minValue = min();\n\n if (minValue != null) return minValue;\n\n return 0;\n };\n\n const commit = (value: number | null, originalEvent?: Event): void => {\n if (value == null) {\n options.commit(null, originalEvent);\n\n return;\n }\n\n options.commit(clamp(value), originalEvent);\n };\n\n const incrementBy = (delta: number, originalEvent?: Event): void => {\n if (isBlocked()) return;\n\n commit(currentOrFallback() + delta, originalEvent);\n };\n\n const atMin = (): boolean => {\n const parsed = options.parse();\n const minValue = min();\n\n return parsed != null && minValue != null && parsed <= minValue;\n };\n\n const atMax = (): boolean => {\n const parsed = options.parse();\n const maxValue = max();\n\n return parsed != null && maxValue != null && parsed >= maxValue;\n };\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n return dispatchKeyboardAction(event, {\n disabled: isBlocked,\n keymap: {\n ArrowDown: () => incrementBy(-step(), event),\n ArrowUp: () => incrementBy(step(), event),\n End: () => {\n const maxValue = max();\n\n if (maxValue == null) return false;\n\n commit(maxValue, event);\n },\n Home: () => {\n const minValue = min();\n\n if (minValue == null) return false;\n\n commit(minValue, event);\n },\n PageDown: () => incrementBy(-largeStep(), event),\n PageUp: () => incrementBy(largeStep(), event),\n },\n preventDefault: 'after',\n });\n };\n\n return {\n atMax,\n atMin,\n handleKeydown,\n incrementBy,\n };\n};\n"],"mappings":"uKAqBA,IAAa,EAAwB,GAAmD,CACtF,IAAM,MAA2B,EAAQ,EAAQ,YAAY,EAAK,EAAQ,EAAQ,YAAY,CAExF,MACG,EAAe,EAAQ,OAAO,CAAC,CAGlC,MACG,EAAe,EAAQ,OAAO,CAAC,CAGlC,EAAS,GACN,EAAY,EAAO,GAAK,CAAE,GAAK,CAAC,CAGnC,MAAqB,EAAe,EAAQ,QAAQ,CAAE,EAAE,CAExD,MAA0B,CAC9B,IAAM,EAAI,GAAM,CAEhB,OAAO,EAAe,EAAQ,aAAa,CAAE,EAAI,GAAG,EAGhD,MACW,EAAQ,OAAO,EAIb,GAAK,EAIf,EAGH,GAAU,EAAsB,IAAgC,CACpE,GAAI,GAAS,KAAM,CACjB,EAAQ,OAAO,KAAM,EAAc,CAEnC,OAGF,EAAQ,OAAO,EAAM,EAAM,CAAE,EAAc,EAGvC,GAAe,EAAe,IAAgC,CAC9D,GAAW,EAEf,EAAO,GAAmB,CAAG,EAAO,EAAc,EA4CpD,MAAO,CACL,UAnC2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAgCvD,UA3C2B,CAC3B,IAAM,EAAS,EAAQ,OAAO,CACxB,EAAW,GAAK,CAEtB,OAAO,GAAU,MAAQ,GAAY,MAAQ,GAAU,GAwCvD,cA9BqB,GACd,EAAuB,EAAO,CACnC,SAAU,EACV,OAAQ,CACN,cAAiB,EAAY,CAAC,GAAM,CAAE,EAAM,CAC5C,YAAe,EAAY,GAAM,CAAE,EAAM,CACzC,QAAW,CACT,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,SAAY,CACV,IAAM,EAAW,GAAK,CAEtB,GAAI,GAAY,KAAM,MAAO,GAE7B,EAAO,EAAU,EAAM,EAEzB,aAAgB,EAAY,CAAC,GAAW,CAAE,EAAM,CAChD,WAAc,EAAY,GAAW,CAAE,EAAM,CAC9C,CACD,eAAgB,QACjB,CAAC,CAOF,cACD"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./controls/a11y-control.cjs`),t=require(`./controls/internal/control-state.cjs`),n=require(`./controls/field-control.cjs`),r=require(`./controls/press-control.cjs`),i=require(`./controls/checkable-control.cjs`),a=require(`./controls/list-control.cjs`),o=require(`./controls/list-key-control.cjs`),s=require(`./controls/overlay-control.cjs`),c=require(`./controls/spinner-control.cjs`),l=require(`./controls/slider-control.cjs`);exports.createA11yControl=e.createA11yControl,exports.createCheckableFieldControl=i.createCheckableFieldControl,exports.createChoiceFieldControl=n.createChoiceFieldControl,exports.createListControl=a.createListControl,exports.createListKeyControl=o.createListKeyControl,exports.createOverlayControl=s.createOverlayControl,exports.createPressControl=r.createPressControl,exports.createSliderControl=l.createSliderControl,exports.createSpinnerControl=c.createSpinnerControl,exports.createTextFieldControl=n.createTextFieldControl,exports.createValidationControl=t.createValidationControl,exports.mountTextFieldLifecycle=n.mountTextFieldLifecycle;
@@ -0,0 +1 @@
1
+ import{createA11yControl as e}from"./controls/a11y-control.js";import{createValidationControl as t}from"./controls/internal/control-state.js";import{createChoiceFieldControl as n,createTextFieldControl as r,mountTextFieldLifecycle as i}from"./controls/field-control.js";import{createPressControl as a}from"./controls/press-control.js";import{createCheckableFieldControl as o}from"./controls/checkable-control.js";import{createListControl as s}from"./controls/list-control.js";import{createListKeyControl as c}from"./controls/list-key-control.js";import{createOverlayControl as l}from"./controls/overlay-control.js";import{createSpinnerControl as u}from"./controls/spinner-control.js";import{createSliderControl as d}from"./controls/slider-control.js";export{e as createA11yControl,o as createCheckableFieldControl,n as createChoiceFieldControl,s as createListControl,c as createListKeyControl,l as createOverlayControl,a as createPressControl,d as createSliderControl,u as createSpinnerControl,r as createTextFieldControl,t as createValidationControl,i as mountTextFieldLifecycle};
package/dist/craftit.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@vielzeug/stateit`);var t=0,n=e=>{for(let t of e)t()},r=(e,t,n)=>{/^on/i.test(t)||n==null||!1===n?e.removeAttribute(t):!0===n?e.setAttribute(t,``):e.setAttribute(t,String(n))},i=(e,t,n,r)=>{let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},a=e=>`${e?`${e}-`:`cft-`}${++t}`,o=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),s={"'":`&#39;`,'"':`&quot;`,"&":`&amp;`,"<":`&lt;`,">":`&gt;`},c=e=>String(e).replace(/[&<>"']/g,e=>s[e]),l=function(){return this.content},u=new Map,d=e=>{if(e instanceof CSSStyleSheet)return e;let t=typeof e==`string`?e:e.content,n=u.get(t);if(n)return n;let r=new CSSStyleSheet;try{r.replaceSync(t),u.set(t,r)}catch(e){console.error(`[craftit:E2] style replace failed`,e)}return r},f=[],p=()=>{let e=f[f.length-1];if(!e)throw Error(`[craftit:E1] lifecycle outside setup`);return e},m=e=>{p().onMount.push(e)},h=t=>{f.length>0?p().cleanups.push(t):(0,e.onCleanup)(t)},g=e=>{f.length>0&&h(e)},_=(t,n)=>{let r=(0,e.effect)(t,n);return g(r),r};function v(e,t,n,r){e&&(e.addEventListener(t,n,r),h(()=>e.removeEventListener(t,n,r)))}var y={bubbles:!0,cancelable:!0,composed:!0},b={basic:(e,t,n={})=>e.dispatchEvent(new Event(t,{...y,...n})),custom:(e,t,n={})=>e.dispatchEvent(new CustomEvent(t,{...y,...n})),event:(e,t)=>e.dispatchEvent(t),focus:(e,t,n={})=>e.dispatchEvent(new FocusEvent(t,{...y,...n})),keyboard:(e,t,n={})=>e.dispatchEvent(new KeyboardEvent(t,{...y,...n})),mouse:(e,t,n={})=>e.dispatchEvent(new MouseEvent(t,{...y,...n})),touch:(e,t,n={})=>typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...y,...n})):e.dispatchEvent(new CustomEvent(t,{...y,...n}))},x=new WeakMap,S=new Set,C=(e,t,n)=>{let r=`${n}:${e.localName}:${t||`default`}`;S.has(r)||(S.add(r),console.warn(`[craftit:E10] ${n} could not find a matching <slot${t?` name="${t}"`:``}> in <${e.localName}>. Render the slot before using ${n}.`))};function w(e,t){for(let[n,r]of Object.entries(t))if(n===`classMap`)te(e,r);else if(n.startsWith(`on`)&&n.length>2&&typeof r==`function`){let t=n.slice(2);v(e,t[0].toLowerCase()+t.slice(1),r)}else ee(e,n,r)}function ee(e,t,n){typeof n==`function`?_(()=>r(e,t,n())):r(e,t,n)}function te(e,t){let n=new Set;_(()=>{let r=new Set(Object.entries(t()).filter(([,e])=>e).map(([e])=>e));for(let t of n)r.has(t)||e.classList.remove(t);for(let t of r)n.has(t)||e.classList.add(t);n=r})}var T=Symbol(`craftit.htmlResultBrand`);function E(e,t=[]){let n={__bindings:t,__html:e,toString:()=>e};return Object.defineProperty(n,T,{configurable:!1,enumerable:!1,value:!0,writable:!1}),n}var D=e=>typeof e==`object`&&!!e&&!0===e[T],O=Symbol(`craftit.eachSignal`),k=t=>(0,e.isSignal)(t)?t:typeof t==`function`?(0,e.computed)(t):void 0,A=t=>{if(!(0,e.isSignal)(t))return!1;let n=Object.getPrototypeOf(t);for(;n;){let e=Object.getOwnPropertyDescriptor(n,`value`);if(e)return typeof e.set==`function`;n=Object.getPrototypeOf(n)}return!1},j=(e,t)=>{if(!Object.is(e.value,t))try{e.value=t}catch{}},M=new Map,N=e=>(e=>{let t=M.get(e);if(!t){if(t=document.createElement(`template`),t.innerHTML=e,M.size>=1e3){let e=M.keys().next().value;e!==void 0&&M.delete(e)}M.set(e,t)}return t})(e).content.cloneNode(!0),P=(e,t)=>{if(e.nodeType===Node.COMMENT_NODE){let n=e.nodeValue;n&&t.comments.set(n,e);return}if(e.nodeType!==Node.ELEMENT_NODE)return;let n=e.getAttribute(`u`);n&&t.elements.set(n,e)},F=e=>{let t={comments:new Map,elements:new Map};for(let n of e){let e=document.createTreeWalker(n,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(P(n,t);e.nextNode();)P(e.currentNode,t)}return t},I=e=>Array.from(N(e).childNodes),L=(e,t,n)=>{if(e.parentNode)for(let r of t)e.parentNode.insertBefore(r,n)},R=e=>Array.isArray(e)||typeof e==`object`&&!!e,z=(e,t,n)=>{n(_(()=>t(e.value)))},ne=(e,t,n)=>{let i=n=>{let i=Q.get(e)?.get(t.name);if(!i&&R(n))return void(e[t.name]=n);if(i&&!i.reflect||(t.mode===`bool`?e.toggleAttribute(t.name,!!n):r(e,t.name,n)),!i)return;let a=R(n)?n:i.parse(t.mode===`bool`?n?``:null:n==null||!1===n?null:String(n));Object.is(i.signal.peek(),a)||(i.signal.value=a)};t.signal?z(t.signal,i,n):i(t.value)},re=(e,t,n)=>{let r=n=>{e[t.name]=n};t.signal?z(t.signal,r,n):r(t.value),((e,t,n,r)=>{n&&(t===`value`?(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)&&r(i(e,e instanceof HTMLSelectElement?`change`:`input`,()=>{j(n,e.value)})):t===`checked`&&e instanceof HTMLInputElement&&r(i(e,`change`,()=>{j(n,e.checked)})))})(e,t.name,t.model,n)},ie=(e,t,n)=>{let{modifiers:r}=t,a=r?{capture:!!r.capture,once:!!r.once,passive:!!r.passive}:void 0;n(i(e,t.name,e=>{r?.self&&e.target!==e.currentTarget||(r?.stop&&e.stopPropagation(),r?.prevent&&!r?.passive&&e.preventDefault(),t.handler(e))},a))},ae=(e,t,n)=>{let{ref:r}=t;typeof r==`function`?(r(e),n(()=>r(null))):Array.isArray(r)?(r.push(e),n(()=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)})):(r.value=e,n(()=>{r.value=null}))},B=(e,t,n,r)=>{let i=new Map;for(let a of e){let e=a.uid;if(a.type===`text`){let r=n.comments.get(e);if(r){let i=document.createTextNode(``);r.replaceWith(i),n.comments.delete(e),z(a.signal,e=>{i.textContent=String(e)},t)}}else a.type===`html`?r?.onHtml?.(a):(i.has(e)||i.set(e,[]),i.get(e).push(a))}for(let[e,r]of i){let i=n.elements.get(e);if(i){i.removeAttribute(`u`),n.elements.delete(e);for(let e of r)switch(e.type){case`attr`:ne(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:ie(i,e,t);break;case`prop`:re(i,e,t);break;case`ref`:ae(i,e,t)}}}},V=(e,t,n,r)=>{let i=k(r);return i?{mode:e,name:t,signal:i,type:`attr`,uid:n}:{mode:e,name:t,type:`attr`,uid:n,value:r}},oe=(e,t,n)=>{let r=k(n);return r?{model:A(n)?n:void 0,name:e,signal:r,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:n}},se=RegExp(`u="([^"]+)"`,`g`),ce=[{kind:`event`,regex:/\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\s*=\s*["']?$/},{kind:`ref`,regex:/\s+ref\s*=\s*["']?$/},{kind:`specialAttr`,regex:/\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`prop`,regex:/\.([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`plainAttr`,regex:/\s+([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/}],H=new WeakMap,le=e=>{let[t,...n]=e.split(`.`),r={};for(let e of n)e===`capture`?r.capture=!0:e===`once`?r.once=!0:e===`passive`?r.passive=!0:e===`prevent`?r.prevent=!0:e===`self`?r.self=!0:e===`stop`&&(r.stop=!0);return{modifiers:Object.keys(r).length?r:void 0,name:t}},U=()=>{let e=0;return()=>String(e++)},W=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(se,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`\x3c!--${r(t)}--\x3e`)}},G=e=>typeof e==`string`?c(e):e==null?``:D(e)?e.__html:c(String(e)),ue=(t,n)=>{let r=(e=>typeof e==`object`&&e&&O in e?e[O]:null)(t);if(r)return{keyed:!0,signal:r};if(typeof t==`function`&&!(0,e.isSignal)(t)){let{signal:r}=((t,n)=>{let r={bindings:[],html:``},i=(0,e.signal)(r);return n(()=>{let e=t(),n=Array.isArray(e)?e:[e],a=U(),o=``,s=[];for(let e of n)if(D(e)){let t=W(e,a);o+=t.html,s.push(...t.bindings)}else o+=G(e);let c=s.length!==r.bindings.length||s.some((e,t)=>e!==r.bindings[t]);(o!==r.html||c)&&(r={bindings:s,html:o},i.value=r)}),{bindings:[],signal:i}})(t,n);return{keyed:!1,signal:r}}return(0,e.isSignal)(t)&&D(t.value)?{keyed:!1,signal:(0,e.computed)(()=>{let e=t.value;if(!D(e))return{bindings:[],html:G(e)};let n=W(e,U());return{bindings:n.bindings,html:n.html}})}:null},K=e=>{n(e.cleanups);for(let t of e.nodes)t.remove()},q=(e,t,n=F(e))=>{let r=[];return B(t,e=>r.push(e),n),r},J=(t,r,i,a,o)=>{let s=((e,t)=>{let n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT);for(;n.nextNode();){let e=n.currentNode;if(e.nodeValue===t)return e}return null})(t,r.uid);if(!s)return;let c=document.createComment(`html-binding`);s.replaceWith(c);let l=[],u=e=>l.push(e),d=()=>{n(l),l=[]},f=null,p=[];i((0,e.effect)(()=>{(0,e.batch)(()=>{let i=r.signal.value;if(!r.keyed&&i.html===f)return;f=i.html,d();let{bindings:s,html:l,keys:m}=i;r.keyed&&!a.has(r.uid)&&a.set(r.uid,new Map);let h=r.keyed?a.get(r.uid):null,g=c.parentElement||t,_=!1;(0,e.untrack)(()=>{(0,e.batch)(()=>{if(h&&m?.length&&i.items?.length===m.length){if(_=!0,h.size===0&&p.length>0){for(let e of p)e.remove();p=[]}let e=new Map;for(let t=0;t<m.length;t++){let r=m[t],a=i.items[t],o=h.get(r),s=t>0?e.get(m[t-1])?.nodes:null,l=s?.length?s[s.length-1].nextSibling:c.nextSibling;if(o?.html===a.html){o.nodes[0]&&L(c,o.nodes,l),n(o.cleanups);let t=F(o.nodes),i=q(o.nodes,a.bindings,t);e.set(r,{...o,bindings:a.bindings,cleanups:i,targets:t})}else if(o){n(o.cleanups);let t=I(a.html),i=F(t);L(c,t,l);let s=q(t,a.bindings,i);e.set(r,{bindings:a.bindings,cleanups:s,html:a.html,nodes:t,targets:i});for(let e of o.nodes)e.remove()}else{let t=I(a.html),n=F(t);L(c,t,l);let i=q(t,a.bindings,n);e.set(r,{bindings:a.bindings,cleanups:i,html:a.html,nodes:t,targets:n})}}for(let[t,n]of h)e.has(t)||K(n);a.set(r.uid,e)}else{if(r.keyed&&h&&h.size>0)for(let[,e]of h)K(e);else for(let e of p)e.remove();let e=N(l);p=Array.from(e.childNodes),c.after(e),r.keyed&&a.set(r.uid,new Map)}}),_||o(g,s,u,{onHtml:e=>J(g,e,u,a,o)})})})})),i(d),r.keyed&&i(()=>a.delete(r.uid))},Y=(e,t,n,r)=>{B(t,n,(e=>{let t={comments:new Map,elements:new Map},n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(P(e,t);n.nextNode();)P(n.currentNode,t);return t})(e),r)},X=new WeakMap,Z=new WeakMap,de=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),fe=e=>typeof e==`object`&&!!e&&`default`in e&&Object.keys(e).every(e=>de.has(e)),Q=new WeakMap,$=(t,n,i)=>{let a=p(),o=a.el;Q.has(o)||Q.set(o,new Map);let s=i?.parse??(e=>i?.type===Boolean?e===``||e===`true`:typeof n==`boolean`?e!==null&&e!==`false`:e==null?n:i?.type===Number||typeof n==`number`?Number(e):e),c=(0,e.signal)(n),l=Object.prototype.hasOwnProperty.call(o,t),u=l?o[t]:void 0,d={parse:s,reflect:i?.reflect??!0,signal:c};if(l?(delete o[t],c.value=u):o.hasAttribute(t)&&(c.value=s(o.getAttribute(t))),Q.get(o).set(t,d),Object.defineProperty(o,t,{configurable:!0,enumerable:!0,get:()=>c.value,set:e=>{c.value=e}}),i?.reflect??1){let n=i?.omit??!1;a.onMount.push(()=>{a.cleanups.push((0,e.effect)(()=>{let e=c.value;e==null||!1===e||n&&e===``?o.removeAttribute(t):r(o,t,e)}))})}return c},pe=class extends HTMLElement{static _setup;static _options;static formAssociated=!1;static observedAttributes=[];shadow;_keyedStates=new Map;_mountFns=[];_template=null;_appliedHtmlBindings=new Set;_setupDone=!1;_runtime;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(){this._setupDone||this._runSetup(),this._init()}attributeChangedCallback(e,t,n){if(t===n)return;let r=Q.get(this)?.get(e);if(!r)return;let i=r.parse(n);Object.is(r.signal.peek(),i)||(r.signal.value=i)}disconnectedCallback(){n(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear()}formAssociatedCallback(e){X.get(this)?.onAssociated?.(e)}formDisabledCallback(e){X.get(this)?.onDisabled?.(e)}formResetCallback(){X.get(this)?.onReset?.()}formStateRestoreCallback(e,t){X.get(this)?.onStateRestore?.(e,t)}_handleError(e){if(this._runtime.errorHandlers.length>0)for(let t of this._runtime.errorHandlers)t(e);else console.error(`[craftit:E3] <${this.localName}>`,e)}_runSetup(){this._setupDone=!0,f.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({host:this,shadow:this.shadow});(typeof t==`string`||typeof t==`object`&&t&&`__html`in t)&&(this._template=t)}catch(e){this._handleError(e)}finally{f.pop()}}_init(){let{styles:e}=this._runtime;if(e?.length&&(this.shadow.adoptedStyleSheets=e.map(d)),this._template){let e=typeof this._template==`string`?E(this._template):this._template;if(this.shadow.replaceChildren(N(e.__html)),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);Y(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),((e,t,n,r)=>{J(e,t,n,r,Y)})(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{f.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{f.pop(),this._runtime.onMount=[]}})}};exports.aria=function(e,t){let n=t===void 0?p().el:e,r=Object.entries(t===void 0?e:t).map(([e,t])=>_(()=>((e,t)=>{let r=`aria-${e}`,i=typeof t==`function`?t():t;i==null||!1===i?n.removeAttribute(r):n.setAttribute(r,String(i))})(e,t)));if(t!==void 0)return()=>{for(let e of r)e()}},exports.createContext=function(e){return Symbol(e)},exports.createFormIds=(e,t)=>{let n=`${e}-${t&&t.trim()?t:a(e)}`;return{errorId:`error-${n}`,fieldId:n,helperId:`helper-${n}`,labelId:`label-${n}`}},exports.createId=a,exports.css=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=e&&typeof e==`object`&&`content`in e?e.content:e??``}return{content:n.trim(),toString:l}},exports.defineComponent=function(t){let{formAssociated:n,host:r,props:i,setup:a,shadow:s,styles:c,tag:l}=t;return function(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))throw Error(`[craftit:E9] custom element already defined: ${e}`);class r extends pe{static _setup=t;static _options=n;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}(l,t=>{let n=i?function(e){let t={};for(let[n,r]of Object.entries(e)){let e=fe(r)?r:{default:r},i={reflect:!(typeof e.default==`object`&&e.default!==null||Array.isArray(e.default)),...e};t[n]=$(o(n),e.default,i)}return t}(i):{},r=(()=>{let e=p().el;return(t,...n)=>{b.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)}})(),s=(()=>{let t=p().el,n=new Map;return{has:r=>(r=>{if(n.has(r))return n.get(r);let i=(0,e.signal)(!1);return n.set(r,i),m(()=>{let e=r?`slot[name="${r}"]`:`slot:not([name])`,n=t.shadowRoot?.querySelector(e);if(!n)return void C(t,r,`slots.has()`);let a=()=>{i.value=n.assignedNodes().length>0};return a(),n.addEventListener(`slotchange`,a),()=>n.removeEventListener(`slotchange`,a)}),i})(r===`default`?``:String(r))}})();return a({emit:r,host:t.host,props:n,reflect:e=>w(t.host,e),shadow:t.shadow,slots:s})},{formAssociated:n,host:r,observedAttrs:i?Object.keys(i).map(o):[],shadow:s,styles:c})},exports.defineField=(t,n)=>{let r=p().el;if(!r.constructor.formAssociated)throw Error(`[craftit:E8] defineField() requires defineComponent({ formAssociated: true })`);let i=Z.get(r)??r.attachInternals();Z.set(r,i);let a=t.toFormValue??(e=>e==null?``:String(e));return(0,e.effect)(()=>{i.setFormValue(a(t.value.value))}),t.disabled&&(0,e.effect)(()=>{t.disabled.value?i.states.add(`disabled`):i.states.delete(`disabled`)}),n&&X.set(r,{...X.get(r),...n}),{checkValidity:()=>i.checkValidity(),internals:i,reportValidity:()=>i.reportValidity(),setCustomValidity:e=>e?i.setValidity({customError:!0},e):i.setValidity({}),setValidity:i.setValidity.bind(i)}},exports.effect=_,exports.escapeHtml=c,exports.fire=b,exports.guard=(e,t)=>n=>{e()&&t(n)},exports.handle=v,exports.html=(t,...n)=>((t,n,r)=>{let i=(e=>{let t=H.get(e);return t||(t=(e=>{let t=[];for(let n=0;n<e.length-1;n++){let r=e[n],i=!1;for(let e of ce){let n=e.regex.exec(r);if(!n)continue;let a=r.slice(0,-n[0].length);if(i=!0,e.kind===`event`){let e=le(n[1]);t.push({kind:`event`,modifiers:e.modifiers,name:e.name,prefix:a,raw:r})}else e.kind===`ref`?t.push({kind:`ref`,prefix:a,raw:r}):e.kind===`specialAttr`?t.push({kind:`specialAttr`,mode:n[1]===`?`?`bool`:`attr`,name:n[2],prefix:a,raw:r}):e.kind===`prop`?t.push({kind:`prop`,name:n[1],prefix:a,raw:r}):e.kind===`plainAttr`&&t.push({kind:`plainAttr`,name:n[1],prefix:a,raw:r});break}i||t.push({kind:`node`,prefix:r,raw:r})}return{slots:t,tail:e[e.length-1]??``}})(e),H.set(e,t)),t})(t),a=``,o=[],s=null,c=U(),l=e=>(s&&!(e=>e.lastIndexOf(`<`)>e.lastIndexOf(`>`))(e)||(s=c()),s),u=()=>{s=null};for(let t=0;t<i.slots.length;t++){let s=i.slots[t],d=n[t];if(s.kind===`event`){if(typeof d==`function`){let e=l(s.prefix);a+=`${s.prefix} u="${e}"`,o.push({handler:d,modifiers:s.modifiers,name:s.name,type:`event`,uid:e})}else a+=s.raw;continue}if(s.kind===`ref`){if(d){let e=l(s.prefix);a+=`${s.prefix} u="${e}"`,o.push({ref:d,type:`ref`,uid:e})}else a+=s.raw;continue}if(s.kind===`specialAttr`){let e=l(s.prefix);a+=`${s.prefix} u="${e}"`,o.push(V(s.mode,s.name,e,d));continue}if(s.kind===`prop`){let e=l(s.prefix);a+=`${s.prefix} u="${e}"`,o.push(oe(s.name,e,d));continue}if(s.kind===`plainAttr`){let e=l(s.prefix);a+=`${s.prefix} u="${e}"`,o.push(V(`attr`,s.name,e,d));continue}if(typeof d==`object`&&d&&(`mount`in d||`render`in d)){let t=`render`in d,n=t?c():l(s.raw);a+=t?`${s.raw}\x3c!--${n}--\x3e`:`${s.raw} u="${n}"`;let i=d.mount?.bind(d);if(i&&o.push({apply:(e,t)=>{i(e,{registerCleanup:t})},type:`callback`,uid:n}),t){let t=d.render.bind(d),i={bindings:[],html:``},a=(0,e.signal)(i);r(()=>{let e=t(),n=Array.isArray(e)?e:[e],r=U(),o=``,s=[];for(let e of n)if(D(e)){let t=W(e,r);o+=t.html,s.push(...t.bindings)}else o+=G(e);let c=s.length!==i.bindings.length||s.some((e,t)=>e!==i.bindings[t]);(o!==i.html||c)&&(i={bindings:s,html:o},a.value=i)}),o.push({keyed:!1,signal:a,type:`html`,uid:n})}continue}u();let f=ue(d,r);if(f){let e=c();a+=`${s.raw}\x3c!--${e}--\x3e`,o.push({keyed:f.keyed,signal:f.signal,type:`html`,uid:e});continue}if(Array.isArray(d)){let e=``;for(let t of d)if(D(t)){let n=W(t,c);e+=n.html,o.push(...n.bindings)}else e+=G(t);a+=s.raw+e;continue}if((0,e.isSignal)(d)){let e=c();a+=`${s.raw}\x3c!--${e}--\x3e`,o.push({signal:d,type:`text`,uid:e})}else if(D(d)){let e=W(d,c);a+=s.raw+e.html,o.push(...e.bindings)}else a+=s.raw+G(d)}return a+=i.tail,E(a.replace(/>\s+</g,`><`).trim(),o)})(t,n,_),exports.inject=function(e,...t){let n=p().el;for(;n;){if(n instanceof HTMLElement){let t=x.get(n)?.get(e);if(t!==void 0)return t}let t=n.getRootNode();n=n.parentElement??(t instanceof ShadowRoot?t.host:null)}return t.length>0?t[0]:void 0},exports.observeResize=t=>{let n=(0,e.signal)({height:0,width:0}),r=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(n.value={height:t.blockSize,width:t.inlineSize})});return r.observe(t),h(()=>r.disconnect()),n},exports.onCleanup=h,exports.onError=e=>{p().errorHandlers.push(e)},exports.onMount=m,exports.onSlotChange=(e,t)=>{let n=p().el,r=e===`default`?``:e,i=r?`slot[name="${r}"]`:`slot:not([name])`,a=n.shadowRoot?.querySelector(i);if(!a)return void C(n,r,`onSlotChange()`);let o=()=>t(a.assignedElements({flatten:!0}));o(),a.addEventListener(`slotchange`,o),h(()=>a.removeEventListener(`slotchange`,o))},exports.prop=$,exports.provide=(e,t)=>{let n=p().el;x.has(n)||x.set(n,new Map),x.get(n).set(e,t)},exports.ref=function(){return{value:null}},exports.reflect=w,exports.refs=function(){return[]},exports.syncContextProps=(e,t,n)=>{e&&m(()=>{_(()=>{for(let r of n){let n=e[r]?.value;n!==void 0&&(t[r].value=n)}})})},exports.toKebab=o,exports.typed=(e,t)=>({...t,default:e}),exports.watch=function(t,n,r){if(Array.isArray(t)){let i=r,a=!1,o=!1,s=(0,e.effect)(()=>{for(let e of t)e.value;if(a)(0,e.untrack)(n),i?.once&&s();else if(a=!0,i?.immediate&&((0,e.untrack)(n),i.once))return void(o=!0)});return g(s),o&&s(),s}let i=(0,e.watch)(t,n,r);return g(i),i},Object.keys(e).forEach(function(t){t===`default`||Object.prototype.hasOwnProperty.call(exports,t)||Object.defineProperty(exports,t,{enumerable:!0,get:function(){return e[t]}})});
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@vielzeug/stateit`);var t=Symbol(`craftit.htmlResultBrand`),n=0,r=e=>`${e?`${e}-`:`cft-`}${++n}`;function i(){return(0,e.signal)(null)}function a(){return[]}function o(e,n=[]){let r={__bindings:n,__html:e,toString(){return e}};return Object.defineProperty(r,t,{configurable:!1,enumerable:!1,value:!0,writable:!1}),r}var s=e=>typeof e==`object`&&!!e&&e[t]===!0,c=Symbol(`craftit.eachSignal`),l=e=>{let t=[...e];for(let e=t.length-1;e>=0;e--)t[e]?.()},u=(e,t,n)=>{if(/^on/i.test(t)){e.removeAttribute(t);return}n==null||n===!1?e.removeAttribute(t):n===!0?e.setAttribute(t,t.startsWith(`aria-`)?`true`:``):e.setAttribute(t,String(n))},d=(e,t,n,r)=>{let i=n;return e.addEventListener(t,i,r),()=>e.removeEventListener(t,i,r)},f=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`),p={"'":`&#39;`,'"':`&quot;`,"&":`&amp;`,"<":`&lt;`,">":`&gt;`},m=e=>String(e).replace(/[&<>"']/g,e=>p[e]),h=()=>{let e=y().el;return((t,...n)=>{T.custom(e,String(t),n.length>0?{detail:n[0]}:void 0)})},g=function(){return this.content},ee=(e,...t)=>{let n=``;for(let r=0;r<e.length;r++)if(n+=e[r],r<t.length){let e=t[r];n+=e&&typeof e==`object`&&`content`in e?e.content:e??``}return{content:n.trim(),toString:g}},_=new Map,te=e=>{if(e instanceof CSSStyleSheet)return e;let t=typeof e==`string`?e:e.content,n=_.get(t);if(n)return n;let r=new CSSStyleSheet;try{r.replaceSync(t),_.set(t,r)}catch(e){console.error(`[craftit:E2] style replace failed`,e)}return r},v=[],y=()=>{let e=v[v.length-1];if(!e)throw Error(`[craftit:E1] lifecycle outside setup`);return e},b=e=>{y().onMount.push(e)},x=t=>{v.length>0?y().cleanups.push(t):(0,e.onCleanup)(t)},S=e=>{v.length>0&&x(e)},ne=e=>{y().errorHandlers.push(e)},C=(t,n)=>{let r=(0,e.effect)(t,n);return S(r),r};function re(t,n,r){let i=(0,e.watch)(t,n,r);return S(i),i}function ie(e,t,n,r){e&&(e.addEventListener(t,n,r),x(()=>e.removeEventListener(t,n,r)))}var ae=()=>{let t=(0,e.signal)(null),n=()=>{t.value?.(),t.value=null};return x(n),{clear:n,set:e=>{t.value!==e&&(n(),t.value=e??null)},value:t}},oe=(e,t,n)=>C(()=>{let n=e.value;if(n)return t(n)},n),w={bubbles:!0,cancelable:!0,composed:!0},T={custom(e,t,n={}){return e.dispatchEvent(new CustomEvent(t,{...w,...n}))},event(e,t){return e.dispatchEvent(t)},focus(e,t,n={}){return e.dispatchEvent(new FocusEvent(t,{...w,...n}))},keyboard(e,t,n={}){return e.dispatchEvent(new KeyboardEvent(t,{...w,...n}))},mouse(e,t,n={}){return e.dispatchEvent(new MouseEvent(t,{...w,...n}))},touch(e,t,n={}){return typeof TouchEvent<`u`?e.dispatchEvent(new TouchEvent(t,{...w,...n})):e.dispatchEvent(new CustomEvent(t,{...w,...n}))}},E=new WeakMap,se=(e,t)=>{let n=y().el;E.has(n)||E.set(n,new Map),E.get(n).set(e,t)};function ce(e,...t){let n=y().el;for(;n;){if(n instanceof HTMLElement){let t=E.get(n)?.get(e);if(t!==void 0)return t}let t=n.getRootNode();n=n.parentElement??(t instanceof ShadowRoot?t.host:null)}return t.length>0?t[0]:void 0}function le(e){return Symbol(e)}var ue=(e,t,n)=>{e&&b(()=>{C(()=>{let r=t;for(let t of n){let n=e[t]?.value;n!==void 0&&(r[t].value=n)}})})},de=(e,t)=>{let n=!1;C(()=>{let r=!!t.contextDisabled?.value;r&&!n?(e.setAttribute(`disabled`,``),n=!0):!r&&n&&!t.ownDisabled?.value&&(e.removeAttribute(`disabled`),n=!1);let i=t.contextSize?.value,a=!!t.ownSize?.value;i&&!a?e.setAttribute(`size`,i):a||e.removeAttribute(`size`);let o=t.contextVariant?.value,s=!!t.ownVariant?.value;o&&!s?e.setAttribute(`variant`,o):s||e.removeAttribute(`variant`)})},D=`default`,O=e=>!e||e===D?D:e,k=new WeakMap,A=()=>{let t=y().el,n=k.get(t);if(n)return n;let r=new Map,i=new Map,a=new Map,o=new Map,s=!1,c=t=>{let n=O(t),i=r.get(n);return i||(i=(0,e.signal)(!1),r.set(n,i)),i},l=t=>{let n=O(t),r=i.get(n);return r||(r=(0,e.signal)([]),i.set(n,r)),r},u=e=>{let t=O(e),n=a.get(t),r=[];if(n)for(let e of n)r.push(...e.assignedElements({flatten:!0}));l(t).value=r,c(t).value=r.length>0},d=e=>{if(o.has(e))return;let t=O(e.getAttribute(`name`)),n=a.get(t)??new Set;n.add(e),a.set(t,n);let r=()=>u(t);e.addEventListener(`slotchange`,r),o.set(e,()=>{if(e.removeEventListener(`slotchange`,r),o.delete(e),s)return;let n=a.get(t);n&&(n.delete(e),n.size===0&&a.delete(t),u(t))}),u(t)},f=e=>{o.get(e)?.()};c(D),l(D),t.shadowRoot?.querySelectorAll(`slot`).forEach(e=>d(e));let p=new MutationObserver(e=>{for(let t of e)t.addedNodes.forEach(e=>{if(e instanceof HTMLSlotElement){d(e);return}e instanceof Element&&e.querySelectorAll(`slot`).forEach(e=>d(e))}),t.removedNodes.forEach(e=>{if(e instanceof HTMLSlotElement){f(e);return}e instanceof Element&&e.querySelectorAll(`slot`).forEach(e=>f(e))})});t.shadowRoot&&p.observe(t.shadowRoot,{childList:!0,subtree:!0}),x(()=>{s=!0,p.disconnect();for(let e of[...o.values()])e();o.clear(),a.clear()});let m={elements:e=>l(O(e)),has:e=>c(O(e))};return k.set(t,m),m},fe=()=>{let e=y().el;return{bind:(t,n,r)=>{let i=[],a=typeof t==`string`?{[t]:n}:t,o=typeof t==`string`&&t===`on`?r:n;if(`attr`in a)for(let[t,n]of Object.entries(a.attr)){let r=pe(e,t.startsWith(`aria-`)||t===`role`?t:t.startsWith(`aria`)?`aria-${t.slice(4).toLowerCase()}`:t,n);r&&i.push(r)}if(`class`in a&&i.push(me(e,a.class)),`on`in a)for(let t of Object.keys(a.on)){let n=a.on[t];n&&i.push(d(e,t,n,o))}let s=()=>{for(;i.length>0;)i.pop()?.()};return x(s),s},el:e,shadowRoot:e.shadowRoot}};function pe(e,t,n){if(typeof n==`function`)return C(()=>u(e,t,n()));u(e,t,n)}function me(e,t){let n=new Set;return C(()=>{let r=new Set(Object.entries(t()).filter(([,e])=>e).map(([e])=>e));for(let t of n)r.has(t)||e.classList.remove(t);for(let t of r)n.has(t)||e.classList.add(t);n=r})}var he=new Set([`default`,`omit`,`parse`,`reflect`,`type`]),j=new Set,ge=e=>typeof e!=`object`||!e||!(`default`in e)?!1:Object.keys(e).every(e=>he.has(e)),M=new WeakMap,_e=(t,n,r)=>{let i=y().el;M.has(i)||M.set(i,new Map);let a=r?.parse??(e=>r?.type===Boolean?e===``||e===`true`:typeof n==`boolean`?e!==null&&e!==`false`:e==null?n:r?.type===Number||typeof n==`number`?Number(e):e),o=(0,e.signal)(n),s=Object.prototype.hasOwnProperty.call(i,t),c=s?i[t]:void 0,l={parse:a,reflect:r?.reflect??!0,signal:o};if(s?(delete i[t],o.value=c):i.hasAttribute(t)&&(o.value=a(i.getAttribute(t))),M.get(i).set(t,l),Object.defineProperty(i,t,{configurable:!0,enumerable:!0,get:()=>o.value,set:e=>{o.value=e}}),r?.reflect??!0){let e=r?.omit??!1;C(()=>{let n=o.value;n==null||n===!1||e&&n===``?i.removeAttribute(t):u(i,t,n)})}return o};function ve(e){let t={},n=y().el.localName;for(let[r,i]of Object.entries(e)){let e=ge(i)?i:{default:i},a=typeof e.default==`object`&&e.default!==null||Array.isArray(e.default);if(e.reflect===!0&&a){let e=`${n}:${String(r)}`;j.has(e)||(j.add(e),console.warn(`[craftit] props.${e} requested reflect: true for a structured default; reflection is disabled.`))}let o={reflect:!a,...e};t[r]=_e(f(r),e.default,o)}return t}var N=new WeakMap,P=new WeakMap,ye=(t,n)=>{let r=y().el;if(!r.constructor.formAssociated)throw Error(`[craftit:E8] defineField() requires define(..., { formAssociated: true, ... })`);let i=P.get(r)??r.attachInternals();P.set(r,i);let a=t.toFormValue??(e=>e==null?``:String(e));(0,e.effect)(()=>{i.setFormValue(a(t.value.value))});let o=t.disabled;return o&&(0,e.effect)(()=>{o.value?i.states.add(`disabled`):i.states.delete(`disabled`)}),n&&N.set(r,{...N.get(r),...n}),{checkValidity:()=>i.checkValidity(),internals:i,reportValidity:()=>i.reportValidity(),setCustomValidity:e=>e?i.setValidity({customError:!0},e):i.setValidity({}),setValidity:i.setValidity.bind(i)}},F=t=>{if((0,e.isSignal)(t))return t;if(typeof t==`function`)return(0,e.computed)(t)},be=t=>{if(!(0,e.isSignal)(t))return!1;let n=Object.getPrototypeOf(t);for(;n;){let e=Object.getOwnPropertyDescriptor(n,`value`);if(e)return typeof e.set==`function`;n=Object.getPrototypeOf(n)}return!1},I=(e,t)=>{if(!Object.is(e.value,t))try{e.value=t}catch{}},xe=(e,t,n,r)=>{if(n){if(t===`value`){(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)&&r(d(e,e instanceof HTMLSelectElement?`change`:`input`,()=>{I(n,e.value)}));return}t===`checked`&&e instanceof HTMLInputElement&&r(d(e,`change`,()=>{I(n,e.checked)}))}},L=new Map,Se=e=>{let t=L.get(e);return t||(t=document.createElement(`template`),t.innerHTML=e,L.set(e,t)),t},R=e=>Se(e).content.cloneNode(!0),z=(e,t)=>{if(e.nodeType===Node.COMMENT_NODE){let n=e.nodeValue;n&&t.comments.set(n,e);return}if(e.nodeType!==Node.ELEMENT_NODE)return;let n=e.getAttribute(`u`);n&&t.elements.set(n,e)},Ce=e=>{let t={comments:new Map,elements:new Map},n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(z(e,t);n.nextNode();)z(n.currentNode,t);return t},B=e=>{let t={comments:new Map,elements:new Map};for(let n of e){let e=document.createTreeWalker(n,NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_ELEMENT);for(z(n,t);e.nextNode();)z(e.currentNode,t)}return t},we=(e,t)=>{let n=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT);for(;n.nextNode();){let e=n.currentNode;if(e.nodeValue===t)return e}return null},V=e=>Array.from(R(e).childNodes),H=(e,t,n)=>{if(e.parentNode)for(let r of t)e.parentNode.insertBefore(r,n)},U=e=>Array.isArray(e)||typeof e==`object`&&!!e,W=(t,n,r)=>{r((0,e.effect)(()=>n(t.value)))},Te=(t,n,r)=>{let i=r=>{let i=M.get(t)?.get(n.name);if(!i&&U(r)){t[n.name]=r;return}if((!i||i.reflect)&&(n.mode===`bool`?t.toggleAttribute(n.name,!!r):u(t,n.name,r)),!i)return;let a=U(r)?r:i.parse(n.mode===`bool`?r?``:null:r==null||r===!1?null:String(r));Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)};n.signal?W(n.signal,i,r):i(n.value)},Ee=(e,t,n)=>{let r=n=>{e[t.name]=n};t.signal?W(t.signal,r,n):r(t.value),xe(e,t.name,t.model,n)},De=(e,t,n)=>{let{modifiers:r}=t,i=r?{capture:!!r.capture,once:!!r.once,passive:!!r.passive}:void 0;n(d(e,t.name,e=>{r?.self&&e.target!==e.currentTarget||(r?.stop&&e.stopPropagation(),r?.prevent&&!r?.passive&&e.preventDefault(),t.handler(e))},i))},Oe=(e,t,n)=>{let{ref:r}=t;if(typeof r==`function`){r(e),n(()=>r(null));return}if(Array.isArray(r)){r.push(e),n(()=>{let t=r.indexOf(e);t!==-1&&r.splice(t,1)});return}r.value=e,n(()=>{r.value=null})},G=(e,t,n,r)=>{let i=new Map;for(let a of e){let e=a.uid;if(a.type===`text`){let r=n.comments.get(e);if(r){let i=document.createTextNode(``);r.replaceWith(i),n.comments.delete(e),W(a.signal,e=>{i.textContent=String(e)},t)}}else a.type===`html`?r?.onHtml?.(a):(i.has(e)||i.set(e,[]),i.get(e).push(a))}for(let[e,r]of i){let i=n.elements.get(e);if(i){i.removeAttribute(`u`),n.elements.delete(e);for(let e of r)switch(e.type){case`attr`:Te(i,e,t);break;case`callback`:e.apply(i,t);break;case`event`:De(i,e,t);break;case`prop`:Ee(i,e,t);break;case`ref`:Oe(i,e,t);break}}}},K=(e,t,n,r)=>{G(t,n,Ce(e),r)},q=(e,t,n,r)=>{let i=F(r);return i?{mode:e,name:t,signal:i,type:`attr`,uid:n}:{mode:e,name:t,type:`attr`,uid:n,value:r}},ke=(e,t,n)=>{let r=F(n);return r?{model:be(n)?n:void 0,name:e,signal:r,type:`prop`,uid:t}:{name:e,type:`prop`,uid:t,value:n}},Ae=RegExp(`u="([^"]+)"`,`g`),je=e=>e.replace(/>\s+</g,`><`).trim(),Me=[{kind:`event`,regex:/\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\s*=\s*["']?$/},{kind:`ref`,regex:/\s+ref\s*=\s*["']?$/},{kind:`specialAttr`,regex:/\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`prop`,regex:/\.([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/},{kind:`plainAttr`,regex:/\s+([a-zA-Z_][-a-zA-Z0-9_]*)\s*=\s*["']?$/}],J=new WeakMap,Ne=e=>{let[t,...n]=e.split(`.`),r={};for(let e of n)e===`capture`?r.capture=!0:e===`once`?r.once=!0:e===`passive`?r.passive=!0:e===`prevent`?r.prevent=!0:e===`self`?r.self=!0:e===`stop`&&(r.stop=!0);return{modifiers:Object.keys(r).length?r:void 0,name:t}},Pe=e=>{let t=[];for(let n=0;n<e.length-1;n++){let r=e[n],i=!1;for(let e of Me){let n=e.regex.exec(r);if(!n)continue;let a=r.slice(0,-n[0].length);if(i=!0,e.kind===`event`){let e=Ne(n[1]);t.push({kind:`event`,modifiers:e.modifiers,name:e.name,prefix:a,raw:r})}else e.kind===`ref`?t.push({kind:`ref`,prefix:a,raw:r}):e.kind===`specialAttr`?t.push({kind:`specialAttr`,mode:n[1]===`?`?`bool`:`attr`,name:n[2],prefix:a,raw:r}):e.kind===`prop`?t.push({kind:`prop`,name:n[1],prefix:a,raw:r}):e.kind===`plainAttr`&&t.push({kind:`plainAttr`,name:n[1],prefix:a,raw:r});break}i||t.push({kind:`node`,prefix:r,raw:r})}return{slots:t,tail:e[e.length-1]??``}},Fe=e=>{let t=J.get(e);return t||(t=Pe(e),J.set(e,t)),t},Y=()=>{let e=0;return()=>String(e++)},X=(e,t)=>{let n=new Map,r=e=>{let r=n.get(e);if(r)return r;let i=t();return n.set(e,i),i};return{bindings:e.__bindings.map(e=>({...e,uid:r(e.uid)})),html:e.__html.replace(Ae,(e,t)=>`u="${r(t)}"`).replace(/<!--(\d+)-->/g,(e,t)=>`<!--${r(t)}-->`)}},Ie=e=>typeof e!=`object`||!e||!(c in e)?null:e[c],Z=e=>typeof e==`string`?m(e):e==null?``:s(e)?e.__html:m(String(e)),Le=t=>{let n={bindings:[],html:``};return{bindings:[],signal:(0,e.computed)(()=>{let e=t(),r=Array.isArray(e)?e:[e],i=Y(),a=``,o=[];for(let e of r)if(s(e)){let t=X(e,i);a+=t.html,o.push(...t.bindings)}else a+=Z(e);let c=o.length!==n.bindings.length||o.some((e,t)=>e!==n.bindings[t]);return(a!==n.html||c)&&(n={bindings:o,html:a}),n})}},Re=t=>{let n=Ie(t);if(n)return{keyed:!0,signal:n};if(typeof t==`function`&&!(0,e.isSignal)(t)){let{signal:e}=Le(t);return{keyed:!1,signal:e}}return(0,e.isSignal)(t)&&s(t.value)?{keyed:!1,signal:(0,e.computed)(()=>{let e=t.value;if(!s(e))return{bindings:[],html:Z(e)};let n=X(e,Y());return{bindings:n.bindings,html:n.html}})}:null},ze=(t,n)=>{let r=Fe(t),i=``,a=[],c=null,l=Y(),u=e=>e.lastIndexOf(`<`)>e.lastIndexOf(`>`),d=e=>((!c||u(e))&&(c=l()),c),f=()=>{c=null};for(let t=0;t<r.slots.length;t++){let o=r.slots[t],c=n[t];if(o.kind===`event`){if(typeof c==`function`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push({handler:c,modifiers:o.modifiers,name:o.name,type:`event`,uid:e})}else i+=o.raw;continue}if(o.kind===`ref`){if(c){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push({ref:c,type:`ref`,uid:e})}else i+=o.raw;continue}if(o.kind===`specialAttr`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(q(o.mode,o.name,e,c));continue}if(o.kind===`prop`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(ke(o.name,e,c));continue}if(o.kind===`plainAttr`){let e=d(o.prefix);i+=`${o.prefix} u="${e}"`,a.push(q(`attr`,o.name,e,c));continue}if(typeof c==`object`&&c&&(`mount`in c||`render`in c)){let t=`render`in c,n=t?l():d(o.raw);t?i+=`${o.raw}<!--${n}-->`:i+=`${o.raw} u="${n}"`;let r=c.mount?.bind(c);if(r&&a.push({apply:(e,t)=>{r(e,{registerCleanup:t})},type:`callback`,uid:n}),t){let t=c.render.bind(c),r={bindings:[],html:``},i=(0,e.computed)(()=>{let e=t(),n=Array.isArray(e)?e:[e],i=Y(),a=``,o=[];for(let e of n)if(s(e)){let t=X(e,i);a+=t.html,o.push(...t.bindings)}else a+=Z(e);let c=o.length!==r.bindings.length||o.some((e,t)=>e!==r.bindings[t]);return(a!==r.html||c)&&(r={bindings:o,html:a}),r});a.push({keyed:!1,signal:i,type:`html`,uid:n})}continue}f();let u=Re(c);if(u){let e=l();i+=`${o.raw}<!--${e}-->`,a.push({keyed:u.keyed,signal:u.signal,type:`html`,uid:e});continue}if(Array.isArray(c)){let e=``;for(let t of c)if(s(t)){let n=X(t,l);e+=n.html,a.push(...n.bindings)}else e+=Z(t);i+=o.raw+e;continue}if((0,e.isSignal)(c)){let e=l();i+=`${o.raw}<!--${e}-->`,a.push({signal:c,type:`text`,uid:e})}else if(s(c)){let e=X(c,l);i+=o.raw+e.html,a.push(...e.bindings)}else i+=o.raw+Z(c)}return i+=r.tail,o(je(i),a)},Be=e=>{l(e.cleanups);for(let t of e.nodes)t.remove()},Q=(e,t,n=B(e))=>{let r=[];return G(t,e=>r.push(e),n),r},$=(t,n,r,i)=>{let a=we(t,n.uid);if(!a)return;let o=document.createComment(`html-binding`);a.replaceWith(o);let s=[],c=e=>s.push(e),u=()=>{l(s),s=[]},d=null,f=[];r((0,e.effect)(()=>{(0,e.batch)(()=>{let r=n.signal.value;if(!n.keyed&&r.html===d)return;d=r.html,u();let{bindings:a,html:s,keys:p}=r;n.keyed&&!i.has(n.uid)&&i.set(n.uid,new Map);let m=n.keyed?i.get(n.uid):null,h=o.parentElement||t,g=!1;(0,e.untrack)(()=>{(0,e.batch)(()=>{if(m&&p?.length&&r.items?.length===p.length){if(g=!0,m.size===0&&f.length>0){for(let e of f)e.remove();f=[]}let e=new Map;for(let t=0;t<p.length;t++){let n=p[t],i=r.items[t],a=m.get(n),s=t>0?e.get(p[t-1])?.nodes:null,c=s?.length?s[s.length-1].nextSibling:o.nextSibling;if(a&&a.html===i.html){a.nodes[0]&&H(o,a.nodes,c),l(a.cleanups);let t=B(a.nodes),r=Q(a.nodes,i.bindings,t);e.set(n,{...a,bindings:i.bindings,cleanups:r,targets:t})}else if(a){l(a.cleanups);let t=V(i.html),r=B(t);H(o,t,c);let s=Q(t,i.bindings,r);e.set(n,{bindings:i.bindings,cleanups:s,html:i.html,nodes:t,targets:r});for(let e of a.nodes)e.remove()}else{let t=V(i.html),r=B(t);H(o,t,c);let a=Q(t,i.bindings,r);e.set(n,{bindings:i.bindings,cleanups:a,html:i.html,nodes:t,targets:r})}}for(let[t,n]of m)e.has(t)||Be(n);i.set(n.uid,e)}else{if(n.keyed&&m&&m.size>0)for(let[,e]of m)Be(e);else for(let e of f)e.remove();let e=R(s);f=Array.from(e.childNodes),o.after(e),n.keyed&&i.set(n.uid,new Map)}}),g||K(h,a,c,{onHtml:e=>$(h,e,c,i)})})})})),r(u),n.keyed&&r(()=>i.delete(n.uid))},Ve=K,He=(e,...t)=>ze(e,t),Ue=(e,t,n,r)=>{$(e,t,n,r)},We=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,e.untrack)(()=>{this._setupDone||this._runSetup(),this._init()})}attributeChangedCallback(t,n,r){if(n===r)return;let i=M.get(this)?.get(t);if(!i)return;let a=i.parse(r);Object.is((0,e.untrack)(()=>i.signal.value),a)||(i.signal.value=a)}disconnectedCallback(){l(this._runtime.cleanups),this._runtime.cleanups=[],this._runtime.onMount=this._mountFns.slice(),this._appliedHtmlBindings.clear(),this._keyedStates.clear(),this._rendered=!1}formAssociatedCallback(e){N.get(this)?.onAssociated?.(e)}formDisabledCallback(e){N.get(this)?.onDisabled?.(e)}formResetCallback(){N.get(this)?.onReset?.()}formStateRestoreCallback(e,t){N.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,v.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{v.pop()}}_init(){let{styles:e}=this._runtime;if(e?.length&&(this.shadow.adoptedStyleSheets=e.map(te)),this._template){let e=typeof this._template==`string`?o(this._template):this._template;if(this._rendered||=(this.shadow.replaceChildren(R(e.__html)),!0),e.__bindings.length){let t=e=>this._runtime.cleanups.push(e);Ve(this.shadow,e.__bindings,t,{onHtml:e=>{this._appliedHtmlBindings.has(e.uid)||(this._appliedHtmlBindings.add(e.uid),Ue(this.shadow,e,t,this._keyedStates))}})}}queueMicrotask(()=>{v.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{v.pop(),this._runtime.onMount=[]}})}};function Ge(e,t,n={}){if(!e)throw Error(`[craftit:E4] registerComponent(tag, ...) requires a tag name`);if(customElements.get(e))return e;class r extends We{static _options=n;static _setup=t;static formAssociated=n.formAssociated??!1;static observedAttributes=n.observedAttrs??[]}return customElements.define(e,r),e}var Ke=(e,t)=>{let{formAssociated:n,host:r,props:i,setup:a,shadow:o,styles:s}=t;return Ge(e,()=>{let e=i?ve(i):{},t=h(),n=fe(),r;return a({emit:t,host:n,props:e,shadowRoot:n.shadowRoot,slots:{elements:e=>(r||=A(),r.elements(e)),has:e=>(r||=A(),r.has(e))}})},{formAssociated:n,host:r,observedAttrs:i?Object.keys(i).map(f):[],shadow:o,styles:s})};function qe(e,t){return Ke(e,t)}Object.defineProperty(exports,`batch`,{enumerable:!0,get:function(){return e.batch}}),exports.bridgeContextAttributes=de,Object.defineProperty(exports,`computed`,{enumerable:!0,get:function(){return e.computed}}),exports.createCleanupSignal=ae,exports.createContext=le,exports.createId=r,exports.css=ee,exports.currentRuntime=y,exports.define=qe,exports.defineField=ye,exports.effect=C,exports.fire=T,exports.handle=ie,exports.html=He,exports.inject=ce,Object.defineProperty(exports,`isSignal`,{enumerable:!0,get:function(){return e.isSignal}}),exports.onCleanup=x,exports.onElement=oe,exports.onError=ne,exports.onMount=b,Object.defineProperty(exports,`peekValue`,{enumerable:!0,get:function(){return e.peekValue}}),exports.provide=se,Object.defineProperty(exports,`readonly`,{enumerable:!0,get:function(){return e.readonly}}),exports.ref=i,exports.refs=a,Object.defineProperty(exports,`signal`,{enumerable:!0,get:function(){return e.signal}}),exports.syncContextProps=ue,Object.defineProperty(exports,`toValue`,{enumerable:!0,get:function(){return e.toValue}}),Object.defineProperty(exports,`untrack`,{enumerable:!0,get:function(){return e.untrack}}),exports.watch=re,Object.defineProperty(exports,`writable`,{enumerable:!0,get:function(){return e.writable}});
2
2
  //# sourceMappingURL=craftit.cjs.map