@vielzeug/craftit 2.0.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/README.md +60 -108
  2. package/dist/controls/a11y-control.cjs +2 -0
  3. package/dist/controls/a11y-control.cjs.map +1 -0
  4. package/dist/controls/a11y-control.d.ts +16 -0
  5. package/dist/controls/a11y-control.d.ts.map +1 -0
  6. package/dist/controls/a11y-control.js +2 -0
  7. package/dist/controls/a11y-control.js.map +1 -0
  8. package/dist/controls/checkable-control.cjs +2 -0
  9. package/dist/controls/checkable-control.cjs.map +1 -0
  10. package/dist/controls/checkable-control.d.ts +15 -0
  11. package/dist/controls/checkable-control.d.ts.map +1 -0
  12. package/dist/controls/checkable-control.js +2 -0
  13. package/dist/controls/checkable-control.js.map +1 -0
  14. package/dist/controls/choice-field-control.cjs +2 -0
  15. package/dist/controls/choice-field-control.cjs.map +1 -0
  16. package/dist/controls/choice-field-control.d.ts +3 -0
  17. package/dist/controls/choice-field-control.d.ts.map +1 -0
  18. package/dist/controls/choice-field-control.js +2 -0
  19. package/dist/controls/choice-field-control.js.map +1 -0
  20. package/dist/controls/field-control.cjs +2 -0
  21. package/dist/controls/field-control.cjs.map +1 -0
  22. package/dist/controls/field-control.d.ts +111 -0
  23. package/dist/controls/field-control.d.ts.map +1 -0
  24. package/dist/controls/field-control.js +2 -0
  25. package/dist/controls/field-control.js.map +1 -0
  26. package/dist/controls/index.d.ts +12 -0
  27. package/dist/controls/index.d.ts.map +1 -0
  28. package/dist/controls/internal/control-state.cjs +2 -0
  29. package/dist/controls/internal/control-state.cjs.map +1 -0
  30. package/dist/controls/internal/control-state.d.ts +21 -0
  31. package/dist/controls/internal/control-state.d.ts.map +1 -0
  32. package/dist/controls/internal/control-state.js +2 -0
  33. package/dist/controls/internal/control-state.js.map +1 -0
  34. package/dist/controls/internal/keyboard-utils.cjs +2 -0
  35. package/dist/controls/internal/keyboard-utils.cjs.map +1 -0
  36. package/dist/controls/internal/keyboard-utils.d.ts +7 -0
  37. package/dist/controls/internal/keyboard-utils.d.ts.map +1 -0
  38. package/dist/controls/internal/keyboard-utils.js +2 -0
  39. package/dist/controls/internal/keyboard-utils.js.map +1 -0
  40. package/dist/controls/internal/number-utils.cjs +2 -0
  41. package/dist/controls/internal/number-utils.cjs.map +1 -0
  42. package/dist/controls/internal/number-utils.d.ts +6 -0
  43. package/dist/controls/internal/number-utils.d.ts.map +1 -0
  44. package/dist/controls/internal/number-utils.js +2 -0
  45. package/dist/controls/internal/number-utils.js.map +1 -0
  46. package/dist/controls/internal/validation-utils.cjs +2 -0
  47. package/dist/controls/internal/validation-utils.cjs.map +1 -0
  48. package/dist/controls/internal/validation-utils.d.ts +13 -0
  49. package/dist/controls/internal/validation-utils.d.ts.map +1 -0
  50. package/dist/controls/internal/validation-utils.js +2 -0
  51. package/dist/controls/internal/validation-utils.js.map +1 -0
  52. package/dist/controls/list-control.cjs +2 -0
  53. package/dist/controls/list-control.cjs.map +1 -0
  54. package/dist/controls/list-control.d.ts +23 -0
  55. package/dist/controls/list-control.d.ts.map +1 -0
  56. package/dist/controls/list-control.js +2 -0
  57. package/dist/controls/list-control.js.map +1 -0
  58. package/dist/controls/overlay-control.cjs +2 -0
  59. package/dist/controls/overlay-control.cjs.map +1 -0
  60. package/dist/{labs/overlay.d.ts → controls/overlay-control.d.ts} +19 -14
  61. package/dist/controls/overlay-control.d.ts.map +1 -0
  62. package/dist/controls/overlay-control.js +2 -0
  63. package/dist/controls/overlay-control.js.map +1 -0
  64. package/dist/controls/popup-list-control.cjs +2 -0
  65. package/dist/controls/popup-list-control.cjs.map +1 -0
  66. package/dist/controls/popup-list-control.d.ts +160 -0
  67. package/dist/controls/popup-list-control.d.ts.map +1 -0
  68. package/dist/controls/popup-list-control.js +2 -0
  69. package/dist/controls/popup-list-control.js.map +1 -0
  70. package/dist/controls/press-control.cjs +2 -0
  71. package/dist/controls/press-control.cjs.map +1 -0
  72. package/dist/controls/press-control.d.ts +12 -0
  73. package/dist/controls/press-control.d.ts.map +1 -0
  74. package/dist/controls/press-control.js +2 -0
  75. package/dist/controls/press-control.js.map +1 -0
  76. package/dist/controls/slider-control.cjs +2 -0
  77. package/dist/controls/slider-control.cjs.map +1 -0
  78. package/dist/controls/slider-control.d.ts +19 -0
  79. package/dist/controls/slider-control.d.ts.map +1 -0
  80. package/dist/controls/slider-control.js +2 -0
  81. package/dist/controls/slider-control.js.map +1 -0
  82. package/dist/controls/spinner-control.cjs +2 -0
  83. package/dist/controls/spinner-control.cjs.map +1 -0
  84. package/dist/controls/spinner-control.d.ts +18 -0
  85. package/dist/controls/spinner-control.d.ts.map +1 -0
  86. package/dist/controls/spinner-control.js +2 -0
  87. package/dist/controls/spinner-control.js.map +1 -0
  88. package/dist/controls/swipe-control.cjs +2 -0
  89. package/dist/controls/swipe-control.cjs.map +1 -0
  90. package/dist/controls/swipe-control.d.ts +32 -0
  91. package/dist/controls/swipe-control.d.ts.map +1 -0
  92. package/dist/controls/swipe-control.js +2 -0
  93. package/dist/controls/swipe-control.js.map +1 -0
  94. package/dist/controls/text-field-control.cjs +2 -0
  95. package/dist/controls/text-field-control.cjs.map +1 -0
  96. package/dist/controls/text-field-control.d.ts +3 -0
  97. package/dist/controls/text-field-control.d.ts.map +1 -0
  98. package/dist/controls/text-field-control.js +2 -0
  99. package/dist/controls/text-field-control.js.map +1 -0
  100. package/dist/controls.cjs +1 -0
  101. package/dist/controls.js +1 -0
  102. package/dist/craftit.cjs +1 -1
  103. package/dist/craftit.cjs.map +1 -1
  104. package/dist/craftit.js +1 -1
  105. package/dist/craftit.js.map +1 -1
  106. package/dist/directives/classMap.cjs +2 -0
  107. package/dist/directives/classMap.cjs.map +1 -0
  108. package/dist/directives/classMap.d.ts +19 -0
  109. package/dist/directives/classMap.d.ts.map +1 -0
  110. package/dist/directives/classMap.js +2 -0
  111. package/dist/directives/classMap.js.map +1 -0
  112. package/dist/directives/each.cjs +1 -1
  113. package/dist/directives/each.cjs.map +1 -1
  114. package/dist/directives/each.d.ts +12 -49
  115. package/dist/directives/each.d.ts.map +1 -1
  116. package/dist/directives/each.js +1 -1
  117. package/dist/directives/each.js.map +1 -1
  118. package/dist/directives/guard.cjs +2 -0
  119. package/dist/directives/guard.cjs.map +1 -0
  120. package/dist/directives/guard.d.ts +10 -0
  121. package/dist/directives/guard.d.ts.map +1 -0
  122. package/dist/directives/guard.js +2 -0
  123. package/dist/directives/guard.js.map +1 -0
  124. package/dist/directives/live.cjs +2 -0
  125. package/dist/directives/live.cjs.map +1 -0
  126. package/dist/directives/live.d.ts +23 -0
  127. package/dist/directives/live.d.ts.map +1 -0
  128. package/dist/directives/live.js +2 -0
  129. package/dist/directives/live.js.map +1 -0
  130. package/dist/directives/raw.cjs +1 -1
  131. package/dist/directives/raw.cjs.map +1 -1
  132. package/dist/directives/raw.d.ts +4 -6
  133. package/dist/directives/raw.d.ts.map +1 -1
  134. package/dist/directives/raw.js +1 -1
  135. package/dist/directives/raw.js.map +1 -1
  136. package/dist/directives/resource.cjs +2 -0
  137. package/dist/directives/resource.cjs.map +1 -0
  138. package/dist/directives/resource.d.ts +32 -0
  139. package/dist/directives/resource.d.ts.map +1 -0
  140. package/dist/directives/resource.js +2 -0
  141. package/dist/directives/resource.js.map +1 -0
  142. package/dist/directives/styleMap.cjs +2 -0
  143. package/dist/directives/styleMap.cjs.map +1 -0
  144. package/dist/directives/styleMap.d.ts +11 -0
  145. package/dist/directives/styleMap.d.ts.map +1 -0
  146. package/dist/directives/styleMap.js +2 -0
  147. package/dist/directives/styleMap.js.map +1 -0
  148. package/dist/directives/when.cjs +1 -1
  149. package/dist/directives/when.cjs.map +1 -1
  150. package/dist/directives/when.d.ts +7 -14
  151. package/dist/directives/when.d.ts.map +1 -1
  152. package/dist/directives/when.js +1 -1
  153. package/dist/directives/when.js.map +1 -1
  154. package/dist/errors.cjs +2 -0
  155. package/dist/errors.cjs.map +1 -0
  156. package/dist/errors.d.ts +12 -0
  157. package/dist/errors.d.ts.map +1 -0
  158. package/dist/errors.js +2 -0
  159. package/dist/errors.js.map +1 -0
  160. package/dist/form.cjs +2 -0
  161. package/dist/form.cjs.map +1 -0
  162. package/dist/form.d.ts +15 -0
  163. package/dist/form.d.ts.map +1 -0
  164. package/dist/form.js +2 -0
  165. package/dist/form.js.map +1 -0
  166. package/dist/host.cjs +2 -0
  167. package/dist/host.cjs.map +1 -0
  168. package/dist/host.d.ts +78 -0
  169. package/dist/host.d.ts.map +1 -0
  170. package/dist/host.js +2 -0
  171. package/dist/host.js.map +1 -0
  172. package/dist/index.cjs +1 -1
  173. package/dist/index.d.ts +16 -9
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +1 -1
  176. package/dist/internal.cjs +2 -0
  177. package/dist/internal.cjs.map +1 -0
  178. package/dist/internal.d.ts +111 -0
  179. package/dist/internal.d.ts.map +1 -0
  180. package/dist/internal.js +2 -0
  181. package/dist/internal.js.map +1 -0
  182. package/dist/observers/index.d.ts +5 -0
  183. package/dist/observers/index.d.ts.map +1 -0
  184. package/dist/observers/intersection-observe.cjs +2 -0
  185. package/dist/observers/intersection-observe.cjs.map +1 -0
  186. package/dist/observers/intersection-observe.d.ts +9 -0
  187. package/dist/observers/intersection-observe.d.ts.map +1 -0
  188. package/dist/observers/intersection-observe.js +2 -0
  189. package/dist/observers/intersection-observe.js.map +1 -0
  190. package/dist/observers/media-observe.cjs +2 -0
  191. package/dist/observers/media-observe.cjs.map +1 -0
  192. package/dist/observers/media-observe.d.ts +8 -0
  193. package/dist/observers/media-observe.d.ts.map +1 -0
  194. package/dist/observers/media-observe.js +2 -0
  195. package/dist/observers/media-observe.js.map +1 -0
  196. package/dist/observers/mutation-observe.cjs +2 -0
  197. package/dist/observers/mutation-observe.cjs.map +1 -0
  198. package/dist/observers/mutation-observe.d.ts +10 -0
  199. package/dist/observers/mutation-observe.d.ts.map +1 -0
  200. package/dist/observers/mutation-observe.js +2 -0
  201. package/dist/observers/mutation-observe.js.map +1 -0
  202. package/dist/observers/resize-observe.cjs +2 -0
  203. package/dist/observers/resize-observe.cjs.map +1 -0
  204. package/dist/observers/resize-observe.d.ts +11 -0
  205. package/dist/observers/resize-observe.d.ts.map +1 -0
  206. package/dist/observers/resize-observe.js +2 -0
  207. package/dist/observers/resize-observe.js.map +1 -0
  208. package/dist/observers.cjs +1 -0
  209. package/dist/observers.js +1 -0
  210. package/dist/props.cjs +2 -0
  211. package/dist/props.cjs.map +1 -0
  212. package/dist/props.d.ts +39 -0
  213. package/dist/props.d.ts.map +1 -0
  214. package/dist/props.js +2 -0
  215. package/dist/props.js.map +1 -0
  216. package/dist/registration.cjs +2 -0
  217. package/dist/registration.cjs.map +1 -0
  218. package/dist/registration.d.ts +38 -0
  219. package/dist/registration.d.ts.map +1 -0
  220. package/dist/registration.js +2 -0
  221. package/dist/registration.js.map +1 -0
  222. package/dist/runtime.cjs +2 -0
  223. package/dist/runtime.cjs.map +1 -0
  224. package/dist/runtime.d.ts +33 -0
  225. package/dist/runtime.d.ts.map +1 -0
  226. package/dist/runtime.js +2 -0
  227. package/dist/runtime.js.map +1 -0
  228. package/dist/template-bindings.cjs +2 -0
  229. package/dist/template-bindings.cjs.map +1 -0
  230. package/dist/template-bindings.d.ts +25 -0
  231. package/dist/template-bindings.d.ts.map +1 -0
  232. package/dist/template-bindings.js +2 -0
  233. package/dist/template-bindings.js.map +1 -0
  234. package/dist/template-compiler.cjs +2 -0
  235. package/dist/template-compiler.cjs.map +1 -0
  236. package/dist/template-compiler.d.ts +4 -0
  237. package/dist/template-compiler.d.ts.map +1 -0
  238. package/dist/template-compiler.js +2 -0
  239. package/dist/template-compiler.js.map +1 -0
  240. package/dist/testing/index.d.ts +2 -0
  241. package/dist/testing/index.d.ts.map +1 -0
  242. package/dist/testing/testing.cjs +2 -0
  243. package/dist/testing/testing.cjs.map +1 -0
  244. package/dist/{test/test.d.ts → testing/testing.d.ts} +18 -11
  245. package/dist/testing/testing.d.ts.map +1 -0
  246. package/dist/testing/testing.js +2 -0
  247. package/dist/testing/testing.js.map +1 -0
  248. package/dist/testing.cjs +1 -0
  249. package/dist/testing.js +1 -0
  250. package/package.json +21 -22
  251. package/dist/core/component.cjs +0 -2
  252. package/dist/core/component.cjs.map +0 -1
  253. package/dist/core/component.d.ts +0 -172
  254. package/dist/core/component.d.ts.map +0 -1
  255. package/dist/core/component.js +0 -2
  256. package/dist/core/component.js.map +0 -1
  257. package/dist/core/host.cjs +0 -2
  258. package/dist/core/host.cjs.map +0 -1
  259. package/dist/core/host.d.ts +0 -77
  260. package/dist/core/host.d.ts.map +0 -1
  261. package/dist/core/host.js +0 -2
  262. package/dist/core/host.js.map +0 -1
  263. package/dist/core/internal.cjs +0 -2
  264. package/dist/core/internal.cjs.map +0 -1
  265. package/dist/core/internal.d.ts +0 -107
  266. package/dist/core/internal.d.ts.map +0 -1
  267. package/dist/core/internal.js +0 -2
  268. package/dist/core/internal.js.map +0 -1
  269. package/dist/core/runtime-bindings.cjs +0 -2
  270. package/dist/core/runtime-bindings.cjs.map +0 -1
  271. package/dist/core/runtime-bindings.d.ts +0 -6
  272. package/dist/core/runtime-bindings.d.ts.map +0 -1
  273. package/dist/core/runtime-bindings.js +0 -2
  274. package/dist/core/runtime-bindings.js.map +0 -1
  275. package/dist/core/runtime-lifecycle.cjs +0 -2
  276. package/dist/core/runtime-lifecycle.cjs.map +0 -1
  277. package/dist/core/runtime-lifecycle.d.ts +0 -116
  278. package/dist/core/runtime-lifecycle.d.ts.map +0 -1
  279. package/dist/core/runtime-lifecycle.js +0 -2
  280. package/dist/core/runtime-lifecycle.js.map +0 -1
  281. package/dist/core/runtime.cjs +0 -1
  282. package/dist/core/runtime.d.ts +0 -3
  283. package/dist/core/runtime.d.ts.map +0 -1
  284. package/dist/core/runtime.js +0 -1
  285. package/dist/core/template-bindings.cjs +0 -2
  286. package/dist/core/template-bindings.cjs.map +0 -1
  287. package/dist/core/template-bindings.d.ts +0 -59
  288. package/dist/core/template-bindings.d.ts.map +0 -1
  289. package/dist/core/template-bindings.js +0 -2
  290. package/dist/core/template-bindings.js.map +0 -1
  291. package/dist/core/template-compiler.cjs +0 -2
  292. package/dist/core/template-compiler.cjs.map +0 -1
  293. package/dist/core/template-compiler.d.ts +0 -25
  294. package/dist/core/template-compiler.d.ts.map +0 -1
  295. package/dist/core/template-compiler.js +0 -2
  296. package/dist/core/template-compiler.js.map +0 -1
  297. package/dist/core/template-dom.cjs +0 -2
  298. package/dist/core/template-dom.cjs.map +0 -1
  299. package/dist/core/template-dom.d.ts +0 -13
  300. package/dist/core/template-dom.d.ts.map +0 -1
  301. package/dist/core/template-dom.js +0 -2
  302. package/dist/core/template-dom.js.map +0 -1
  303. package/dist/core/template-html.cjs +0 -2
  304. package/dist/core/template-html.cjs.map +0 -1
  305. package/dist/core/template-html.d.ts +0 -26
  306. package/dist/core/template-html.d.ts.map +0 -1
  307. package/dist/core/template-html.js +0 -2
  308. package/dist/core/template-html.js.map +0 -1
  309. package/dist/core/template.cjs +0 -2
  310. package/dist/core/template.cjs.map +0 -1
  311. package/dist/core/template.d.ts +0 -11
  312. package/dist/core/template.d.ts.map +0 -1
  313. package/dist/core/template.js +0 -2
  314. package/dist/core/template.js.map +0 -1
  315. package/dist/core/utilities.cjs +0 -2
  316. package/dist/core/utilities.cjs.map +0 -1
  317. package/dist/core/utilities.d.ts +0 -68
  318. package/dist/core/utilities.d.ts.map +0 -1
  319. package/dist/core/utilities.js +0 -2
  320. package/dist/core/utilities.js.map +0 -1
  321. package/dist/directives/attr.cjs +0 -2
  322. package/dist/directives/attr.cjs.map +0 -1
  323. package/dist/directives/attr.d.ts +0 -14
  324. package/dist/directives/attr.d.ts.map +0 -1
  325. package/dist/directives/attr.js +0 -2
  326. package/dist/directives/attr.js.map +0 -1
  327. package/dist/directives/bind.cjs +0 -2
  328. package/dist/directives/bind.cjs.map +0 -1
  329. package/dist/directives/bind.d.ts +0 -30
  330. package/dist/directives/bind.d.ts.map +0 -1
  331. package/dist/directives/bind.js +0 -2
  332. package/dist/directives/bind.js.map +0 -1
  333. package/dist/directives/choose.cjs +0 -2
  334. package/dist/directives/choose.cjs.map +0 -1
  335. package/dist/directives/choose.d.ts +0 -34
  336. package/dist/directives/choose.d.ts.map +0 -1
  337. package/dist/directives/choose.js +0 -2
  338. package/dist/directives/choose.js.map +0 -1
  339. package/dist/directives/classes.cjs +0 -2
  340. package/dist/directives/classes.cjs.map +0 -1
  341. package/dist/directives/classes.d.ts +0 -20
  342. package/dist/directives/classes.d.ts.map +0 -1
  343. package/dist/directives/classes.js +0 -2
  344. package/dist/directives/classes.js.map +0 -1
  345. package/dist/directives/index.cjs +0 -1
  346. package/dist/directives/index.d.ts +0 -14
  347. package/dist/directives/index.d.ts.map +0 -1
  348. package/dist/directives/index.js +0 -1
  349. package/dist/directives/match.cjs +0 -2
  350. package/dist/directives/match.cjs.map +0 -1
  351. package/dist/directives/match.d.ts +0 -31
  352. package/dist/directives/match.d.ts.map +0 -1
  353. package/dist/directives/match.js +0 -2
  354. package/dist/directives/match.js.map +0 -1
  355. package/dist/directives/memo.cjs +0 -2
  356. package/dist/directives/memo.cjs.map +0 -1
  357. package/dist/directives/memo.d.ts +0 -23
  358. package/dist/directives/memo.d.ts.map +0 -1
  359. package/dist/directives/memo.js +0 -2
  360. package/dist/directives/memo.js.map +0 -1
  361. package/dist/directives/on.cjs +0 -2
  362. package/dist/directives/on.cjs.map +0 -1
  363. package/dist/directives/on.d.ts +0 -25
  364. package/dist/directives/on.d.ts.map +0 -1
  365. package/dist/directives/on.js +0 -2
  366. package/dist/directives/on.js.map +0 -1
  367. package/dist/directives/spread.cjs +0 -2
  368. package/dist/directives/spread.cjs.map +0 -1
  369. package/dist/directives/spread.d.ts +0 -14
  370. package/dist/directives/spread.d.ts.map +0 -1
  371. package/dist/directives/spread.js +0 -2
  372. package/dist/directives/spread.js.map +0 -1
  373. package/dist/directives/style.cjs +0 -2
  374. package/dist/directives/style.cjs.map +0 -1
  375. package/dist/directives/style.d.ts +0 -22
  376. package/dist/directives/style.d.ts.map +0 -1
  377. package/dist/directives/style.js +0 -2
  378. package/dist/directives/style.js.map +0 -1
  379. package/dist/directives/until.cjs +0 -2
  380. package/dist/directives/until.cjs.map +0 -1
  381. package/dist/directives/until.d.ts +0 -26
  382. package/dist/directives/until.d.ts.map +0 -1
  383. package/dist/directives/until.js +0 -2
  384. package/dist/directives/until.js.map +0 -1
  385. package/dist/labs/a11y.cjs +0 -2
  386. package/dist/labs/a11y.cjs.map +0 -1
  387. package/dist/labs/a11y.d.ts +0 -61
  388. package/dist/labs/a11y.d.ts.map +0 -1
  389. package/dist/labs/a11y.js +0 -2
  390. package/dist/labs/a11y.js.map +0 -1
  391. package/dist/labs/index.d.ts +0 -8
  392. package/dist/labs/index.d.ts.map +0 -1
  393. package/dist/labs/list.cjs +0 -2
  394. package/dist/labs/list.cjs.map +0 -1
  395. package/dist/labs/list.d.ts +0 -26
  396. package/dist/labs/list.d.ts.map +0 -1
  397. package/dist/labs/list.js +0 -2
  398. package/dist/labs/list.js.map +0 -1
  399. package/dist/labs/observers.cjs +0 -2
  400. package/dist/labs/observers.cjs.map +0 -1
  401. package/dist/labs/observers.d.ts +0 -42
  402. package/dist/labs/observers.d.ts.map +0 -1
  403. package/dist/labs/observers.js +0 -2
  404. package/dist/labs/observers.js.map +0 -1
  405. package/dist/labs/overlay.cjs +0 -2
  406. package/dist/labs/overlay.cjs.map +0 -1
  407. package/dist/labs/overlay.d.ts.map +0 -1
  408. package/dist/labs/overlay.js +0 -2
  409. package/dist/labs/overlay.js.map +0 -1
  410. package/dist/labs/selectable.cjs +0 -2
  411. package/dist/labs/selectable.cjs.map +0 -1
  412. package/dist/labs/selectable.d.ts +0 -70
  413. package/dist/labs/selectable.d.ts.map +0 -1
  414. package/dist/labs/selectable.js +0 -2
  415. package/dist/labs/selectable.js.map +0 -1
  416. package/dist/labs/selection.cjs +0 -2
  417. package/dist/labs/selection.cjs.map +0 -1
  418. package/dist/labs/selection.d.ts +0 -68
  419. package/dist/labs/selection.d.ts.map +0 -1
  420. package/dist/labs/selection.js +0 -2
  421. package/dist/labs/selection.js.map +0 -1
  422. package/dist/labs.cjs +0 -1
  423. package/dist/labs.js +0 -1
  424. package/dist/test/index.d.ts +0 -2
  425. package/dist/test/index.d.ts.map +0 -1
  426. package/dist/test/test.cjs +0 -2
  427. package/dist/test/test.cjs.map +0 -1
  428. package/dist/test/test.d.ts.map +0 -1
  429. package/dist/test/test.js +0 -2
  430. package/dist/test/test.js.map +0 -1
  431. package/dist/test.cjs +0 -1
  432. package/dist/test.js +0 -1
@@ -1,61 +0,0 @@
1
- /**
2
- * Tone of helper/error text: 'default' for helper, 'error' for error message.
3
- */
4
- export type A11yTone = 'default' | 'error';
5
- /**
6
- * Configuration for `useA11yControl()`.
7
- *
8
- * Label presence is detected via DOM query (not heuristics).
9
- * All other state getters are reactive and can change over time.
10
- */
11
- export type A11yControlConfig = {
12
- /** Reactive aria-checked value ('true' | 'false' | 'mixed' | undefined) */
13
- checked?: () => 'true' | 'false' | 'mixed' | undefined;
14
- /** Optional: custom helper ID instead of auto-generated */
15
- helperId?: string;
16
- /** Helper text content (mutually exclusive with explicit label/helper management) */
17
- helperText?: () => string | undefined;
18
- /** Tone of helper text: 'error' to set role="alert", 'default' otherwise */
19
- helperTone?: () => A11yTone;
20
- /** Reactive aria-invalid value */
21
- invalid?: () => boolean;
22
- /** Optional: custom label ID instead of auto-generated */
23
- labelId?: string;
24
- /** ARIA role (e.g., 'checkbox', 'radio', 'switch') */
25
- role: string;
26
- };
27
- /**
28
- * Return value from `useA11yControl()`.
29
- */
30
- export type A11yControlHandle = {
31
- /** ID for helper text element */
32
- helperId: string;
33
- /** ID for label element */
34
- labelId: string;
35
- };
36
- /**
37
- * Manages ARIA attributes, IDs, and helper/error live region for accessible form controls.
38
- *
39
- * Encapsulates:
40
- * - Stable ID generation for labels and helpers
41
- * - `aria-labelledby` wiring when label is present (detected via DOM query)
42
- * - `aria-describedby` wiring when helper text is present
43
- * - `aria-invalid` sync with error state
44
- * - `aria-checked` for checkable controls
45
- * - Helper text live region with `aria-live="polite"` or `role="alert"` based on tone
46
- *
47
- * @example
48
- * const a11y = useA11yControl(host, {
49
- * role: 'checkbox',
50
- * checked: () => indeterminate.value ? 'mixed' : String(checked.value),
51
- * invalid: () => !!error.value,
52
- * helperText: () => error.value || helper.value,
53
- * helperTone: () => error.value ? 'error' : 'default',
54
- * });
55
- *
56
- * // Later in template:
57
- * // <span id=${a11y.labelId}>Label</span>
58
- * // <div id=${a11y.helperId} aria-live="polite">Error or helper text</div>
59
- */
60
- export declare function useA11yControl(host: HTMLElement, config: A11yControlConfig): A11yControlHandle;
61
- //# sourceMappingURL=a11y.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../src/labs/a11y.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACvD,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACtC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC;IAC5B,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;IACxB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAkF9F"}
package/dist/labs/a11y.js DELETED
@@ -1,2 +0,0 @@
1
- import{effect as e,onMount as t}from"../core/runtime-lifecycle.js";import{createId as n}from"../core/utilities.js";import"../core/runtime.js";function r(r,i){let a=i.labelId||n(`a11y-label`),o=i.helperId||n(`a11y-helper`),s=null;return r.setAttribute(`role`,i.role),t(()=>{let t=r.shadowRoot;if(t&&(s=t.querySelector(`[data-a11y-helper]`)),t){let e=t.querySelector(`[data-a11y-label]`);if(e){let t=e.querySelector(`slot`);(t?t.assignedNodes().length>0:e.textContent?.trim().length??!1)&&(e.id=a,r.setAttribute(`aria-labelledby`,a))}}e(()=>{if(i.checked){let e=i.checked();e!==void 0&&r.setAttribute(`aria-checked`,e)}if(i.invalid){let e=i.invalid();r.setAttribute(`aria-invalid`,String(e))}if(i.helperText&&s){let e=i.helperText();e?(s.textContent=e,s.hidden=!1,r.setAttribute(`aria-describedby`,o),(i.helperTone?.()??`default`)===`error`?s.setAttribute(`role`,`alert`):s.removeAttribute(`role`)):(s.hidden=!0,r.removeAttribute(`aria-describedby`))}})}),{helperId:o,labelId:a}}export{r as useA11yControl};
2
- //# sourceMappingURL=a11y.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"a11y.js","names":[],"sources":["../../src/labs/a11y.ts"],"sourcesContent":["import { effect, onMount } from '../core/runtime';\nimport { createId } from '../core/utilities';\n\n/**\n * Tone of helper/error text: 'default' for helper, 'error' for error message.\n */\nexport type A11yTone = 'default' | 'error';\n\n/**\n * Configuration for `useA11yControl()`.\n *\n * Label presence is detected via DOM query (not heuristics).\n * All other state getters are reactive and can change over time.\n */\nexport type A11yControlConfig = {\n /** Reactive aria-checked value ('true' | 'false' | 'mixed' | undefined) */\n checked?: () => 'true' | 'false' | 'mixed' | undefined;\n /** Optional: custom helper ID instead of auto-generated */\n helperId?: string;\n /** Helper text content (mutually exclusive with explicit label/helper management) */\n helperText?: () => string | undefined;\n /** Tone of helper text: 'error' to set role=\"alert\", 'default' otherwise */\n helperTone?: () => A11yTone;\n /** Reactive aria-invalid value */\n invalid?: () => boolean;\n /** Optional: custom label ID instead of auto-generated */\n labelId?: string;\n /** ARIA role (e.g., 'checkbox', 'radio', 'switch') */\n role: string;\n};\n\n/**\n * Return value from `useA11yControl()`.\n */\nexport type A11yControlHandle = {\n /** ID for helper text element */\n helperId: string;\n /** ID for label element */\n labelId: string;\n};\n\n/**\n * Manages ARIA attributes, IDs, and helper/error live region for accessible form controls.\n *\n * Encapsulates:\n * - Stable ID generation for labels and helpers\n * - `aria-labelledby` wiring when label is present (detected via DOM query)\n * - `aria-describedby` wiring when helper text is present\n * - `aria-invalid` sync with error state\n * - `aria-checked` for checkable controls\n * - Helper text live region with `aria-live=\"polite\"` or `role=\"alert\"` based on tone\n *\n * @example\n * const a11y = useA11yControl(host, {\n * role: 'checkbox',\n * checked: () => indeterminate.value ? 'mixed' : String(checked.value),\n * invalid: () => !!error.value,\n * helperText: () => error.value || helper.value,\n * helperTone: () => error.value ? 'error' : 'default',\n * });\n *\n * // Later in template:\n * // <span id=${a11y.labelId}>Label</span>\n * // <div id=${a11y.helperId} aria-live=\"polite\">Error or helper text</div>\n */\nexport function useA11yControl(host: HTMLElement, config: A11yControlConfig): A11yControlHandle {\n const labelId = config.labelId || createId('a11y-label');\n const helperId = config.helperId || createId('a11y-helper');\n\n let helperElement: HTMLDivElement | null = null;\n\n // Set role once at setup\n host.setAttribute('role', config.role);\n\n onMount(() => {\n // Find helper element in shadow DOM\n const shadow = host.shadowRoot;\n\n if (shadow) {\n helperElement = shadow.querySelector('[data-a11y-helper]') as HTMLDivElement | null;\n }\n\n // Detect label presence via DOM query: check if label span has slotted content\n if (shadow) {\n const labelSpan = shadow.querySelector('[data-a11y-label]') as HTMLElement | null;\n\n if (labelSpan) {\n // Check if the label slot has any assigned nodes\n const slot = labelSpan.querySelector('slot') as HTMLSlotElement | null;\n const hasLabelContent = slot\n ? slot.assignedNodes().length > 0\n : (labelSpan.textContent?.trim().length ?? 0 > 0);\n\n if (hasLabelContent) {\n labelSpan.id = labelId;\n host.setAttribute('aria-labelledby', labelId);\n }\n }\n }\n\n // Reactive effects for aria attrs that can change\n effect(() => {\n // aria-checked\n if (config.checked) {\n const checked = config.checked();\n\n if (checked !== undefined) {\n host.setAttribute('aria-checked', checked);\n }\n }\n\n // aria-invalid\n if (config.invalid) {\n const invalid = config.invalid();\n\n host.setAttribute('aria-invalid', String(invalid));\n }\n\n // Helper text and describedby\n if (config.helperText && helperElement) {\n const text = config.helperText();\n\n if (text) {\n helperElement.textContent = text;\n helperElement.hidden = false;\n host.setAttribute('aria-describedby', helperId);\n\n // Set role based on explicit tone (no text heuristics)\n const tone = config.helperTone?.() ?? 'default';\n\n if (tone === 'error') {\n helperElement.setAttribute('role', 'alert');\n } else {\n helperElement.removeAttribute('role');\n }\n } else {\n helperElement.hidden = true;\n host.removeAttribute('aria-describedby');\n }\n }\n });\n });\n\n return {\n helperId,\n labelId,\n };\n}\n"],"mappings":"8IAiEA,SAAgB,EAAe,EAAmB,EAA8C,CAC9F,IAAM,EAAU,EAAO,SAAW,EAAS,aAAa,CAClD,EAAW,EAAO,UAAY,EAAS,cAAc,CAEvD,EAAuC,KA0E3C,OAvEA,EAAK,aAAa,OAAQ,EAAO,KAAK,CAEtC,MAAc,CAEZ,IAAM,EAAS,EAAK,WAOpB,GALI,IACF,EAAgB,EAAO,cAAc,qBAAqB,EAIxD,EAAQ,CACV,IAAM,EAAY,EAAO,cAAc,oBAAoB,CAE3D,GAAI,EAAW,CAEb,IAAM,EAAO,EAAU,cAAc,OAAO,EACpB,EACpB,EAAK,eAAe,CAAC,OAAS,EAC7B,EAAU,aAAa,MAAM,CAAC,QAAU,MAG3C,EAAU,GAAK,EACf,EAAK,aAAa,kBAAmB,EAAQ,GAMnD,MAAa,CAEX,GAAI,EAAO,QAAS,CAClB,IAAM,EAAU,EAAO,SAAS,CAE5B,IAAY,IAAA,IACd,EAAK,aAAa,eAAgB,EAAQ,CAK9C,GAAI,EAAO,QAAS,CAClB,IAAM,EAAU,EAAO,SAAS,CAEhC,EAAK,aAAa,eAAgB,OAAO,EAAQ,CAAC,CAIpD,GAAI,EAAO,YAAc,EAAe,CACtC,IAAM,EAAO,EAAO,YAAY,CAE5B,GACF,EAAc,YAAc,EAC5B,EAAc,OAAS,GACvB,EAAK,aAAa,mBAAoB,EAAS,EAGlC,EAAO,cAAc,EAAI,aAEzB,QACX,EAAc,aAAa,OAAQ,QAAQ,CAE3C,EAAc,gBAAgB,OAAO,GAGvC,EAAc,OAAS,GACvB,EAAK,gBAAgB,mBAAmB,IAG5C,EACF,CAEK,CACL,WACA,UACD"}
@@ -1,8 +0,0 @@
1
- /** Experimental/labs API for @vielzeug/craftit. */
2
- export { createListNavigation, type ListNavigationController, type ListNavigationOptions, type ListNavigationResult, type ListNavigationResultReason, } from './list';
3
- export { createOverlayControl, type OverlayChangeContext, type OverlayCloseReason, type OverlayControl, type OverlayControlOptions, type OverlayOpenReason, type OverlayPositioner, } from './overlay';
4
- export { createSelectionControl, type SelectionController, type SelectionControllerOptions, type SelectionKeyExtractor, type SelectionMode, } from './selection';
5
- export { useA11yControl, type A11yControlConfig, type A11yControlHandle, type A11yTone } from './a11y';
6
- export { createCheckableControl, type CheckableChangePayload, type CheckableControlConfig, type CheckableControlHandle, } from './selectable';
7
- export { observeIntersection, observeMedia, observeResize } from './observers';
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/labs/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAGnD,OAAO,EACL,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,GAChC,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,oBAAoB,EACpB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvG,OAAO,EACL,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -1,2 +0,0 @@
1
- var e=e=>{let t=(e,t,n=!1)=>e<0?{index:-1,moved:!1,reason:`no-enabled-item`,wrapped:n}:e===t?{index:e,moved:!1,reason:`unchanged`,wrapped:n}:{index:e,moved:!0,reason:`moved`,wrapped:n},n={index:-1,moved:!1,reason:`empty`,wrapped:!1},r=(t,n)=>e.isItemDisabled?e.isItemDisabled(t,n):!!t.disabled,i=(e,t)=>{for(let n=t;n<e.length;n++)if(!r(e[n],n))return n;return-1},a=(e,t)=>{for(let n=t;n>=0;n--)if(!r(e[n],n))return n;return-1},o=r=>{let a=e.getItems();if(a.length===0)return n;let o=e.getIndex(),s=i(a,Math.max(0,r));return s===-1?e.loop?t(i(a,0),o,!0):t(o,o):t(s,o)};return{first:()=>{let r=e.getItems();if(r.length===0)return n;let a=e.getIndex(),o=t(i(r,0),a);return o.index>=0&&e.setIndex(o.index),o},getActiveItem:()=>{let t=e.getItems(),n=e.getIndex();if(!(n<0||n>=t.length))return t[n]},getEnabledIndex:o,last:()=>{let r=e.getItems();if(r.length===0)return n;let i=e.getIndex(),o=t(a(r,r.length-1),i);return o.index>=0&&e.setIndex(o.index),o},next:()=>{let r=e.getItems();if(r.length===0)return n;let a=e.getIndex(),o=i(r,Math.max(0,a+1));if(o!==-1)return e.setIndex(o),t(o,a);if(e.loop){let n=i(r,0);return n!==-1&&e.setIndex(n),t(n,a,!0)}return t(a,a)},prev:()=>{let r=e.getItems();if(r.length===0)return n;let i=e.getIndex(),o=a(r,i-1);if(o!==-1)return e.setIndex(o),t(o,i);if(e.loop){let n=a(r,r.length-1);return n!==-1&&e.setIndex(n),t(n,i,!0)}return t(i,i)},reset:()=>{e.setIndex(-1)},set:t=>{let n=o(t);return n.index>=0&&e.setIndex(n.index),n}}};exports.createListNavigation=e;
2
- //# sourceMappingURL=list.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.cjs","names":[],"sources":["../../src/labs/list.ts"],"sourcesContent":["export type ListNavigationOptions<T> = {\n getIndex: () => number;\n getItems: () => T[];\n isItemDisabled?: (item: T, index: number) => boolean;\n loop?: boolean;\n setIndex: (index: number) => void;\n};\n\nexport type ListNavigationResultReason = 'empty' | 'moved' | 'no-enabled-item' | 'unchanged';\n\nexport type ListNavigationResult = {\n index: number;\n moved: boolean;\n reason: ListNavigationResultReason;\n wrapped: boolean;\n};\n\nexport type ListNavigationController<T> = {\n first: () => ListNavigationResult;\n getActiveItem: () => T | undefined;\n getEnabledIndex: (index: number) => ListNavigationResult;\n last: () => ListNavigationResult;\n next: () => ListNavigationResult;\n prev: () => ListNavigationResult;\n reset: () => void;\n set: (index: number) => ListNavigationResult;\n};\n\nexport const createListNavigation = <T>(options: ListNavigationOptions<T>): ListNavigationController<T> => {\n const createResult = (nextIndex: number, currentIndex: number, wrapped = false): ListNavigationResult => {\n if (nextIndex < 0) {\n return {\n index: -1,\n moved: false,\n reason: 'no-enabled-item',\n wrapped,\n };\n }\n\n if (nextIndex === currentIndex) {\n return {\n index: nextIndex,\n moved: false,\n reason: 'unchanged',\n wrapped,\n };\n }\n\n return {\n index: nextIndex,\n moved: true,\n reason: 'moved',\n wrapped,\n };\n };\n\n const emptyResult: ListNavigationResult = {\n index: -1,\n moved: false,\n reason: 'empty',\n wrapped: false,\n };\n\n const isDisabled = (item: T, index: number): boolean => {\n if (options.isItemDisabled) return options.isItemDisabled(item, index);\n\n return Boolean((item as { disabled?: boolean }).disabled);\n };\n\n const findForward = (items: T[], start: number): number => {\n for (let idx = start; idx < items.length; idx++) {\n if (!isDisabled(items[idx], idx)) return idx;\n }\n\n return -1;\n };\n\n const findBackward = (items: T[], start: number): number => {\n for (let idx = start; idx >= 0; idx--) {\n if (!isDisabled(items[idx], idx)) return idx;\n }\n\n return -1;\n };\n\n const getEnabledIndex = (index: number): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const forward = findForward(items, Math.max(0, index));\n\n if (forward !== -1) return createResult(forward, current);\n\n if (options.loop) {\n const wrapped = findForward(items, 0);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const set = (index: number): ListNavigationResult => {\n const result = getEnabledIndex(index);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const first = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const next = findForward(items, 0);\n const result = createResult(next, current);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const last = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const next = findBackward(items, items.length - 1);\n const result = createResult(next, current);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const next = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const forward = findForward(items, Math.max(0, current + 1));\n\n if (forward !== -1) {\n options.setIndex(forward);\n\n return createResult(forward, current);\n }\n\n if (options.loop) {\n const wrapped = findForward(items, 0);\n\n if (wrapped !== -1) options.setIndex(wrapped);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const prev = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const backward = findBackward(items, current - 1);\n\n if (backward !== -1) {\n options.setIndex(backward);\n\n return createResult(backward, current);\n }\n\n if (options.loop) {\n const wrapped = findBackward(items, items.length - 1);\n\n if (wrapped !== -1) options.setIndex(wrapped);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const reset = (): void => {\n options.setIndex(-1);\n };\n\n const getActiveItem = (): T | undefined => {\n const items = options.getItems();\n const index = options.getIndex();\n\n if (index < 0 || index >= items.length) return undefined;\n\n return items[index];\n };\n\n return {\n first,\n getActiveItem,\n getEnabledIndex,\n last,\n next,\n prev,\n reset,\n set,\n };\n};\n"],"mappings":"AA4BA,IAAa,EAA2B,GAAmE,CACzG,IAAM,GAAgB,EAAmB,EAAsB,EAAU,KACnE,EAAY,EACP,CACL,MAAO,GACP,MAAO,GACP,OAAQ,kBACR,UACD,CAGC,IAAc,EACT,CACL,MAAO,EACP,MAAO,GACP,OAAQ,YACR,UACD,CAGI,CACL,MAAO,EACP,MAAO,GACP,OAAQ,QACR,UACD,CAGG,EAAoC,CACxC,MAAO,GACP,MAAO,GACP,OAAQ,QACR,QAAS,GACV,CAEK,GAAc,EAAS,IACvB,EAAQ,eAAuB,EAAQ,eAAe,EAAM,EAAM,CAE/D,EAAS,EAAgC,SAG5C,GAAe,EAAY,IAA0B,CACzD,IAAK,IAAI,EAAM,EAAO,EAAM,EAAM,OAAQ,IACxC,GAAI,CAAC,EAAW,EAAM,GAAM,EAAI,CAAE,OAAO,EAG3C,MAAO,IAGH,GAAgB,EAAY,IAA0B,CAC1D,IAAK,IAAI,EAAM,EAAO,GAAO,EAAG,IAC9B,GAAI,CAAC,EAAW,EAAM,GAAM,EAAI,CAAE,OAAO,EAG3C,MAAO,IAGH,EAAmB,GAAwC,CAC/D,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAU,EAAY,EAAO,KAAK,IAAI,EAAG,EAAM,CAAC,CAUtD,OARI,IAAY,GAEZ,EAAQ,KAGH,EAFS,EAAY,EAAO,EAAE,CAER,EAAS,GAAK,CAGtC,EAAa,EAAS,EAAQ,CARV,EAAa,EAAS,EAAQ,EA8G3D,MAAO,CACL,UA5FwC,CACxC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAE5B,EAAS,EADF,EAAY,EAAO,EAAE,CACA,EAAQ,CAI1C,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAkFP,kBAXyC,CACzC,IAAM,EAAQ,EAAQ,UAAU,CAC1B,EAAQ,EAAQ,UAAU,CAE5B,OAAQ,GAAK,GAAS,EAAM,QAEhC,OAAO,EAAM,IAMb,kBACA,SAjFuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAE5B,EAAS,EADF,EAAa,EAAO,EAAM,OAAS,EAAE,CAChB,EAAQ,CAI1C,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAuEP,SApEuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAU,EAAY,EAAO,KAAK,IAAI,EAAG,EAAU,EAAE,CAAC,CAE5D,GAAI,IAAY,GAGd,OAFA,EAAQ,SAAS,EAAQ,CAElB,EAAa,EAAS,EAAQ,CAGvC,GAAI,EAAQ,KAAM,CAChB,IAAM,EAAU,EAAY,EAAO,EAAE,CAIrC,OAFI,IAAY,IAAI,EAAQ,SAAS,EAAQ,CAEtC,EAAa,EAAS,EAAS,GAAK,CAG7C,OAAO,EAAa,EAAS,EAAQ,EA+CrC,SA5CuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAW,EAAa,EAAO,EAAU,EAAE,CAEjD,GAAI,IAAa,GAGf,OAFA,EAAQ,SAAS,EAAS,CAEnB,EAAa,EAAU,EAAQ,CAGxC,GAAI,EAAQ,KAAM,CAChB,IAAM,EAAU,EAAa,EAAO,EAAM,OAAS,EAAE,CAIrD,OAFI,IAAY,IAAI,EAAQ,SAAS,EAAQ,CAEtC,EAAa,EAAS,EAAS,GAAK,CAG7C,OAAO,EAAa,EAAS,EAAQ,EAuBrC,UApBwB,CACxB,EAAQ,SAAS,GAAG,EAoBpB,IA3GW,GAAwC,CACnD,IAAM,EAAS,EAAgB,EAAM,CAIrC,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAuGR"}
@@ -1,26 +0,0 @@
1
- export type ListNavigationOptions<T> = {
2
- getIndex: () => number;
3
- getItems: () => T[];
4
- isItemDisabled?: (item: T, index: number) => boolean;
5
- loop?: boolean;
6
- setIndex: (index: number) => void;
7
- };
8
- export type ListNavigationResultReason = 'empty' | 'moved' | 'no-enabled-item' | 'unchanged';
9
- export type ListNavigationResult = {
10
- index: number;
11
- moved: boolean;
12
- reason: ListNavigationResultReason;
13
- wrapped: boolean;
14
- };
15
- export type ListNavigationController<T> = {
16
- first: () => ListNavigationResult;
17
- getActiveItem: () => T | undefined;
18
- getEnabledIndex: (index: number) => ListNavigationResult;
19
- last: () => ListNavigationResult;
20
- next: () => ListNavigationResult;
21
- prev: () => ListNavigationResult;
22
- reset: () => void;
23
- set: (index: number) => ListNavigationResult;
24
- };
25
- export declare const createListNavigation: <T>(options: ListNavigationOptions<T>) => ListNavigationController<T>;
26
- //# sourceMappingURL=list.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/labs/list.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACrC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE7F,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,0BAA0B,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI;IACxC,KAAK,EAAE,MAAM,oBAAoB,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACnC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,oBAAoB,CAAC;IACzD,IAAI,EAAE,MAAM,oBAAoB,CAAC;IACjC,IAAI,EAAE,MAAM,oBAAoB,CAAC;IACjC,IAAI,EAAE,MAAM,oBAAoB,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,oBAAoB,CAAC;CAC9C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,SAAS,qBAAqB,CAAC,CAAC,CAAC,KAAG,wBAAwB,CAAC,CAAC,CAyLrG,CAAC"}
package/dist/labs/list.js DELETED
@@ -1,2 +0,0 @@
1
- var e=e=>{let t=(e,t,n=!1)=>e<0?{index:-1,moved:!1,reason:`no-enabled-item`,wrapped:n}:e===t?{index:e,moved:!1,reason:`unchanged`,wrapped:n}:{index:e,moved:!0,reason:`moved`,wrapped:n},n={index:-1,moved:!1,reason:`empty`,wrapped:!1},r=(t,n)=>e.isItemDisabled?e.isItemDisabled(t,n):!!t.disabled,i=(e,t)=>{for(let n=t;n<e.length;n++)if(!r(e[n],n))return n;return-1},a=(e,t)=>{for(let n=t;n>=0;n--)if(!r(e[n],n))return n;return-1},o=r=>{let a=e.getItems();if(a.length===0)return n;let o=e.getIndex(),s=i(a,Math.max(0,r));return s===-1?e.loop?t(i(a,0),o,!0):t(o,o):t(s,o)};return{first:()=>{let r=e.getItems();if(r.length===0)return n;let a=e.getIndex(),o=t(i(r,0),a);return o.index>=0&&e.setIndex(o.index),o},getActiveItem:()=>{let t=e.getItems(),n=e.getIndex();if(!(n<0||n>=t.length))return t[n]},getEnabledIndex:o,last:()=>{let r=e.getItems();if(r.length===0)return n;let i=e.getIndex(),o=t(a(r,r.length-1),i);return o.index>=0&&e.setIndex(o.index),o},next:()=>{let r=e.getItems();if(r.length===0)return n;let a=e.getIndex(),o=i(r,Math.max(0,a+1));if(o!==-1)return e.setIndex(o),t(o,a);if(e.loop){let n=i(r,0);return n!==-1&&e.setIndex(n),t(n,a,!0)}return t(a,a)},prev:()=>{let r=e.getItems();if(r.length===0)return n;let i=e.getIndex(),o=a(r,i-1);if(o!==-1)return e.setIndex(o),t(o,i);if(e.loop){let n=a(r,r.length-1);return n!==-1&&e.setIndex(n),t(n,i,!0)}return t(i,i)},reset:()=>{e.setIndex(-1)},set:t=>{let n=o(t);return n.index>=0&&e.setIndex(n.index),n}}};export{e as createListNavigation};
2
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","names":[],"sources":["../../src/labs/list.ts"],"sourcesContent":["export type ListNavigationOptions<T> = {\n getIndex: () => number;\n getItems: () => T[];\n isItemDisabled?: (item: T, index: number) => boolean;\n loop?: boolean;\n setIndex: (index: number) => void;\n};\n\nexport type ListNavigationResultReason = 'empty' | 'moved' | 'no-enabled-item' | 'unchanged';\n\nexport type ListNavigationResult = {\n index: number;\n moved: boolean;\n reason: ListNavigationResultReason;\n wrapped: boolean;\n};\n\nexport type ListNavigationController<T> = {\n first: () => ListNavigationResult;\n getActiveItem: () => T | undefined;\n getEnabledIndex: (index: number) => ListNavigationResult;\n last: () => ListNavigationResult;\n next: () => ListNavigationResult;\n prev: () => ListNavigationResult;\n reset: () => void;\n set: (index: number) => ListNavigationResult;\n};\n\nexport const createListNavigation = <T>(options: ListNavigationOptions<T>): ListNavigationController<T> => {\n const createResult = (nextIndex: number, currentIndex: number, wrapped = false): ListNavigationResult => {\n if (nextIndex < 0) {\n return {\n index: -1,\n moved: false,\n reason: 'no-enabled-item',\n wrapped,\n };\n }\n\n if (nextIndex === currentIndex) {\n return {\n index: nextIndex,\n moved: false,\n reason: 'unchanged',\n wrapped,\n };\n }\n\n return {\n index: nextIndex,\n moved: true,\n reason: 'moved',\n wrapped,\n };\n };\n\n const emptyResult: ListNavigationResult = {\n index: -1,\n moved: false,\n reason: 'empty',\n wrapped: false,\n };\n\n const isDisabled = (item: T, index: number): boolean => {\n if (options.isItemDisabled) return options.isItemDisabled(item, index);\n\n return Boolean((item as { disabled?: boolean }).disabled);\n };\n\n const findForward = (items: T[], start: number): number => {\n for (let idx = start; idx < items.length; idx++) {\n if (!isDisabled(items[idx], idx)) return idx;\n }\n\n return -1;\n };\n\n const findBackward = (items: T[], start: number): number => {\n for (let idx = start; idx >= 0; idx--) {\n if (!isDisabled(items[idx], idx)) return idx;\n }\n\n return -1;\n };\n\n const getEnabledIndex = (index: number): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const forward = findForward(items, Math.max(0, index));\n\n if (forward !== -1) return createResult(forward, current);\n\n if (options.loop) {\n const wrapped = findForward(items, 0);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const set = (index: number): ListNavigationResult => {\n const result = getEnabledIndex(index);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const first = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const next = findForward(items, 0);\n const result = createResult(next, current);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const last = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const next = findBackward(items, items.length - 1);\n const result = createResult(next, current);\n\n if (result.index >= 0) options.setIndex(result.index);\n\n return result;\n };\n\n const next = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const forward = findForward(items, Math.max(0, current + 1));\n\n if (forward !== -1) {\n options.setIndex(forward);\n\n return createResult(forward, current);\n }\n\n if (options.loop) {\n const wrapped = findForward(items, 0);\n\n if (wrapped !== -1) options.setIndex(wrapped);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const prev = (): ListNavigationResult => {\n const items = options.getItems();\n\n if (items.length === 0) return emptyResult;\n\n const current = options.getIndex();\n const backward = findBackward(items, current - 1);\n\n if (backward !== -1) {\n options.setIndex(backward);\n\n return createResult(backward, current);\n }\n\n if (options.loop) {\n const wrapped = findBackward(items, items.length - 1);\n\n if (wrapped !== -1) options.setIndex(wrapped);\n\n return createResult(wrapped, current, true);\n }\n\n return createResult(current, current);\n };\n\n const reset = (): void => {\n options.setIndex(-1);\n };\n\n const getActiveItem = (): T | undefined => {\n const items = options.getItems();\n const index = options.getIndex();\n\n if (index < 0 || index >= items.length) return undefined;\n\n return items[index];\n };\n\n return {\n first,\n getActiveItem,\n getEnabledIndex,\n last,\n next,\n prev,\n reset,\n set,\n };\n};\n"],"mappings":"AA4BA,IAAa,EAA2B,GAAmE,CACzG,IAAM,GAAgB,EAAmB,EAAsB,EAAU,KACnE,EAAY,EACP,CACL,MAAO,GACP,MAAO,GACP,OAAQ,kBACR,UACD,CAGC,IAAc,EACT,CACL,MAAO,EACP,MAAO,GACP,OAAQ,YACR,UACD,CAGI,CACL,MAAO,EACP,MAAO,GACP,OAAQ,QACR,UACD,CAGG,EAAoC,CACxC,MAAO,GACP,MAAO,GACP,OAAQ,QACR,QAAS,GACV,CAEK,GAAc,EAAS,IACvB,EAAQ,eAAuB,EAAQ,eAAe,EAAM,EAAM,CAE/D,EAAS,EAAgC,SAG5C,GAAe,EAAY,IAA0B,CACzD,IAAK,IAAI,EAAM,EAAO,EAAM,EAAM,OAAQ,IACxC,GAAI,CAAC,EAAW,EAAM,GAAM,EAAI,CAAE,OAAO,EAG3C,MAAO,IAGH,GAAgB,EAAY,IAA0B,CAC1D,IAAK,IAAI,EAAM,EAAO,GAAO,EAAG,IAC9B,GAAI,CAAC,EAAW,EAAM,GAAM,EAAI,CAAE,OAAO,EAG3C,MAAO,IAGH,EAAmB,GAAwC,CAC/D,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAU,EAAY,EAAO,KAAK,IAAI,EAAG,EAAM,CAAC,CAUtD,OARI,IAAY,GAEZ,EAAQ,KAGH,EAFS,EAAY,EAAO,EAAE,CAER,EAAS,GAAK,CAGtC,EAAa,EAAS,EAAQ,CARV,EAAa,EAAS,EAAQ,EA8G3D,MAAO,CACL,UA5FwC,CACxC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAE5B,EAAS,EADF,EAAY,EAAO,EAAE,CACA,EAAQ,CAI1C,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAkFP,kBAXyC,CACzC,IAAM,EAAQ,EAAQ,UAAU,CAC1B,EAAQ,EAAQ,UAAU,CAE5B,OAAQ,GAAK,GAAS,EAAM,QAEhC,OAAO,EAAM,IAMb,kBACA,SAjFuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAE5B,EAAS,EADF,EAAa,EAAO,EAAM,OAAS,EAAE,CAChB,EAAQ,CAI1C,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAuEP,SApEuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAU,EAAY,EAAO,KAAK,IAAI,EAAG,EAAU,EAAE,CAAC,CAE5D,GAAI,IAAY,GAGd,OAFA,EAAQ,SAAS,EAAQ,CAElB,EAAa,EAAS,EAAQ,CAGvC,GAAI,EAAQ,KAAM,CAChB,IAAM,EAAU,EAAY,EAAO,EAAE,CAIrC,OAFI,IAAY,IAAI,EAAQ,SAAS,EAAQ,CAEtC,EAAa,EAAS,EAAS,GAAK,CAG7C,OAAO,EAAa,EAAS,EAAQ,EA+CrC,SA5CuC,CACvC,IAAM,EAAQ,EAAQ,UAAU,CAEhC,GAAI,EAAM,SAAW,EAAG,OAAO,EAE/B,IAAM,EAAU,EAAQ,UAAU,CAC5B,EAAW,EAAa,EAAO,EAAU,EAAE,CAEjD,GAAI,IAAa,GAGf,OAFA,EAAQ,SAAS,EAAS,CAEnB,EAAa,EAAU,EAAQ,CAGxC,GAAI,EAAQ,KAAM,CAChB,IAAM,EAAU,EAAa,EAAO,EAAM,OAAS,EAAE,CAIrD,OAFI,IAAY,IAAI,EAAQ,SAAS,EAAQ,CAEtC,EAAa,EAAS,EAAS,GAAK,CAG7C,OAAO,EAAa,EAAS,EAAQ,EAuBrC,UApBwB,CACxB,EAAQ,SAAS,GAAG,EAoBpB,IA3GW,GAAwC,CACnD,IAAM,EAAS,EAAgB,EAAM,CAIrC,OAFI,EAAO,OAAS,GAAG,EAAQ,SAAS,EAAO,MAAM,CAE9C,GAuGR"}
@@ -1,2 +0,0 @@
1
- const e=require(`../core/runtime-lifecycle.cjs`);require(`../core/runtime.cjs`);let t=require(`@vielzeug/stateit`);var n=n=>{let r=(0,t.signal)({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e.onCleanup(()=>i.disconnect()),r},r=(n,r)=>{let i=(0,t.signal)(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e.onCleanup(()=>a.disconnect()),i},i=n=>{let r=window.matchMedia(n),i=(0,t.signal)(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e.onCleanup(()=>r.removeEventListener(`change`,a)),i};exports.observeIntersection=r,exports.observeMedia=i,exports.observeResize=n;
2
- //# sourceMappingURL=observers.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observers.cjs","names":[],"sources":["../../src/labs/observers.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../core/runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const size = observeResize(containerRef.value!);\n * effect(() => console.log(size.value.width, size.value.height));\n * });\n */\nexport const observeResize = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const entry = observeIntersection(cardRef.value!);\n * effect(() => console.log(entry.value.isIntersecting));\n * });\n */\nexport const observeIntersection = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([e]) => {\n if (e) entry.value = e;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const prefersReducedMotion = observeMedia('(prefers-reduced-motion: reduce)');\n * effect(() => console.log(prefersReducedMotion.value));\n * });\n */\nexport const observeMedia = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"mHAeA,IAAa,EAAiB,GAAmE,CAC/F,IAAM,GAAA,EAAA,EAAA,QAAc,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,EAAA,cAAgB,EAAG,YAAY,CAAC,CAEzB,GAeI,GACX,EACA,IACqD,CACrD,IAAM,GAAA,EAAA,EAAA,QAAiD,KAAK,CACtD,EAAK,IAAI,sBAAsB,CAAC,KAAO,CACvC,IAAG,EAAM,MAAQ,IACpB,EAAQ,CAKX,OAHA,EAAG,QAAQ,EAAG,CACd,EAAA,cAAgB,EAAG,YAAY,CAAC,CAEzB,GAcI,EAAgB,GAA2C,CACtE,IAAM,EAAM,OAAO,WAAW,EAAM,CAC9B,GAAA,EAAA,EAAA,QAAiB,EAAI,QAAQ,CAC7B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,SAMpB,OAHA,EAAI,iBAAiB,SAAU,EAAQ,CACvC,EAAA,cAAgB,EAAI,oBAAoB,SAAU,EAAQ,CAAC,CAEpD"}
@@ -1,42 +0,0 @@
1
- import { type ReadonlySignal } from '@vielzeug/stateit';
2
- /**
3
- * Observes an element's content-box size via `ResizeObserver`.
4
- * Returns a `ReadonlySignal` that updates whenever the dimensions change.
5
- * Must be called inside an {@link onMount} callback.
6
- *
7
- * @example
8
- * onMount(() => {
9
- * const size = observeResize(containerRef.value!);
10
- * effect(() => console.log(size.value.width, size.value.height));
11
- * });
12
- */
13
- export declare const observeResize: (el: Element) => ReadonlySignal<{
14
- height: number;
15
- width: number;
16
- }>;
17
- /**
18
- * Observes an element's intersection with the viewport (or a given root) via
19
- * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the
20
- * intersection ratio changes.
21
- * Must be called inside an {@link onMount} callback.
22
- *
23
- * @example
24
- * onMount(() => {
25
- * const entry = observeIntersection(cardRef.value!);
26
- * effect(() => console.log(entry.value.isIntersecting));
27
- * });
28
- */
29
- export declare const observeIntersection: (el: Element, options?: IntersectionObserverInit) => ReadonlySignal<IntersectionObserverEntry | null>;
30
- /**
31
- * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`
32
- * that is `true` when the query matches and `false` when it does not.
33
- * Must be called inside an {@link onMount} callback.
34
- *
35
- * @example
36
- * onMount(() => {
37
- * const prefersReducedMotion = observeMedia('(prefers-reduced-motion: reduce)');
38
- * effect(() => console.log(prefersReducedMotion.value));
39
- * });
40
- */
41
- export declare const observeMedia: (query: string) => ReadonlySignal<boolean>;
42
- //# sourceMappingURL=observers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observers.d.ts","sourceRoot":"","sources":["../../src/labs/observers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,OAAO,KAAG,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAc3F,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,IAAI,OAAO,EACX,UAAU,wBAAwB,KACjC,cAAc,CAAC,yBAAyB,GAAG,IAAI,CAUjD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,cAAc,CAAC,OAAO,CAWlE,CAAC"}
@@ -1,2 +0,0 @@
1
- import{onCleanup as e}from"../core/runtime-lifecycle.js";import"../core/runtime.js";import{signal as t}from"@vielzeug/stateit";var n=n=>{let r=t({height:0,width:0}),i=new ResizeObserver(([e])=>{if(!e)return;let t=e.contentBoxSize[0];t&&(r.value={height:t.blockSize,width:t.inlineSize})});return i.observe(n),e(()=>i.disconnect()),r},r=(n,r)=>{let i=t(null),a=new IntersectionObserver(([e])=>{e&&(i.value=e)},r);return a.observe(n),e(()=>a.disconnect()),i},i=n=>{let r=window.matchMedia(n),i=t(r.matches),a=e=>{i.value=e.matches};return r.addEventListener(`change`,a),e(()=>r.removeEventListener(`change`,a)),i};export{r as observeIntersection,i as observeMedia,n as observeResize};
2
- //# sourceMappingURL=observers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observers.js","names":[],"sources":["../../src/labs/observers.ts"],"sourcesContent":["import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../core/runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const size = observeResize(containerRef.value!);\n * effect(() => console.log(size.value.width, size.value.height));\n * });\n */\nexport const observeResize = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const entry = observeIntersection(cardRef.value!);\n * effect(() => console.log(entry.value.isIntersecting));\n * });\n */\nexport const observeIntersection = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([e]) => {\n if (e) entry.value = e;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const prefersReducedMotion = observeMedia('(prefers-reduced-motion: reduce)');\n * effect(() => console.log(prefersReducedMotion.value));\n * });\n */\nexport const observeMedia = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"+HAeA,IAAa,EAAiB,GAAmE,CAC/F,IAAM,EAAO,EAAO,CAAE,OAAQ,EAAG,MAAO,EAAG,CAAC,CACtC,EAAK,IAAI,gBAAgB,CAAC,KAAW,CACzC,GAAI,CAAC,EAAO,OAEZ,IAAM,EAAM,EAAM,eAAe,GAE7B,IAAK,EAAK,MAAQ,CAAE,OAAQ,EAAI,UAAW,MAAO,EAAI,WAAY,GACtE,CAKF,OAHA,EAAG,QAAQ,EAAG,CACd,MAAgB,EAAG,YAAY,CAAC,CAEzB,GAeI,GACX,EACA,IACqD,CACrD,IAAM,EAAQ,EAAyC,KAAK,CACtD,EAAK,IAAI,sBAAsB,CAAC,KAAO,CACvC,IAAG,EAAM,MAAQ,IACpB,EAAQ,CAKX,OAHA,EAAG,QAAQ,EAAG,CACd,MAAgB,EAAG,YAAY,CAAC,CAEzB,GAcI,EAAgB,GAA2C,CACtE,IAAM,EAAM,OAAO,WAAW,EAAM,CAC9B,EAAU,EAAO,EAAI,QAAQ,CAC7B,EAAW,GAA2B,CAC1C,EAAQ,MAAQ,EAAE,SAMpB,OAHA,EAAI,iBAAiB,SAAU,EAAQ,CACvC,MAAgB,EAAI,oBAAoB,SAAU,EAAQ,CAAC,CAEpD"}
@@ -1,2 +0,0 @@
1
- let e=require(`@vielzeug/floatit`);var t=t=>{let n=null,r=()=>typeof t.restoreFocus==`function`?t.restoreFocus():t.restoreFocus??!0,i=()=>{let r=t.positioner;if(n?.(),n=null,!r)return;let i=r.reference(),a=r.floating();if(!i||!a){r.update();return}n=(0,e.autoUpdate)(i,a,r.update)},a=()=>{n?.(),n=null},o=e=>{if(t.isDisabled?.()||t.isOpen())return;let n=e?.reason??`programmatic`;t.setOpen(!0,{reason:n}),i(),requestAnimationFrame(()=>t.positioner?.update()),t.onOpen?.(n)},s=e=>{if(!t.isOpen())return;let n=e?.reason??`programmatic`;t.setOpen(!1,{reason:n}),a(),(e?.restoreFocus??r())&&t.getTriggerElement?.()?.focus(),t.onClose?.(n)};return{bindOutsideClick:(e=document,n=!0)=>{let r=e=>{if(!t.isOpen())return;let n=t.getBoundaryElement(),r=t.getPanelElement?.(),i=e.target,a=typeof e.composedPath==`function`?e.composedPath():[];i&&(n&&(n.contains(i)||a.includes(n))||r&&(r.contains(i)||a.includes(r))||s({reason:`outside-click`}))};return e.addEventListener(`click`,r,n),()=>{e.removeEventListener(`click`,r,n)}},close:s,open:o,toggle:()=>{if(t.isOpen()){s({reason:`toggle`});return}o({reason:`toggle`})}}};exports.createOverlayControl=t;
2
- //# sourceMappingURL=overlay.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.cjs","names":[],"sources":["../../src/labs/overlay.ts"],"sourcesContent":["import { autoUpdate } from '@vielzeug/floatit';\n\nexport type OverlayPositioner = {\n floating: () => HTMLElement | null;\n reference: () => HTMLElement | null;\n update: () => void;\n};\n\nexport type OverlayOpenReason = 'programmatic' | 'toggle' | 'trigger';\n\nexport type OverlayCloseReason = 'escape' | 'outside-click' | 'programmatic' | 'toggle';\n\nexport type OverlayChangeContext = {\n reason: OverlayCloseReason | OverlayOpenReason;\n};\n\nexport type OverlayControlOptions = {\n getBoundaryElement: () => HTMLElement | null;\n getPanelElement?: () => HTMLElement | null;\n getTriggerElement?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isOpen: () => boolean;\n onClose?: (reason: OverlayCloseReason) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n positioner?: OverlayPositioner;\n restoreFocus?: boolean | (() => boolean);\n setOpen: (next: boolean, context: OverlayChangeContext) => void;\n};\n\nexport type OverlayControl = {\n bindOutsideClick: (target?: Document | HTMLElement, capture?: boolean) => () => void;\n close: (opts?: { reason?: OverlayCloseReason; restoreFocus?: boolean }) => void;\n open: (opts?: { reason?: OverlayOpenReason }) => void;\n toggle: () => void;\n};\n\nexport const createOverlayControl = (options: OverlayControlOptions): OverlayControl => {\n let cleanupPositioning: (() => void) | null = null;\n\n const shouldRestoreFocus = (): boolean => {\n if (typeof options.restoreFocus === 'function') return options.restoreFocus();\n\n return options.restoreFocus ?? true;\n };\n\n const startPositioning = (): void => {\n const positioner = options.positioner;\n\n cleanupPositioning?.();\n cleanupPositioning = null;\n\n if (!positioner) return;\n\n const reference = positioner.reference();\n const floating = positioner.floating();\n\n if (!reference || !floating) {\n positioner.update();\n\n return;\n }\n\n cleanupPositioning = autoUpdate(reference, floating, positioner.update);\n };\n\n const stopPositioning = (): void => {\n cleanupPositioning?.();\n cleanupPositioning = null;\n };\n\n const open = (opts?: { reason?: OverlayOpenReason }): void => {\n if (options.isDisabled?.()) return;\n\n if (options.isOpen()) return;\n\n const reason = opts?.reason ?? 'programmatic';\n\n options.setOpen(true, { reason });\n startPositioning();\n requestAnimationFrame(() => options.positioner?.update());\n options.onOpen?.(reason);\n };\n\n const close = (opts?: { reason?: OverlayCloseReason; restoreFocus?: boolean }): void => {\n if (!options.isOpen()) return;\n\n const reason = opts?.reason ?? 'programmatic';\n\n options.setOpen(false, { reason });\n stopPositioning();\n\n const restore = opts?.restoreFocus ?? shouldRestoreFocus();\n\n if (restore) options.getTriggerElement?.()?.focus();\n\n options.onClose?.(reason);\n };\n\n const toggle = (): void => {\n if (options.isOpen()) {\n close({ reason: 'toggle' });\n\n return;\n }\n\n open({ reason: 'toggle' });\n };\n\n const bindOutsideClick = (target: Document | HTMLElement = document, capture = true): (() => void) => {\n const handler = (event: Event) => {\n if (!options.isOpen()) return;\n\n const boundary = options.getBoundaryElement();\n const panel = options.getPanelElement?.();\n const eventTarget = event.target as Node | null;\n const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n\n if (!eventTarget) return;\n\n if (boundary && (boundary.contains(eventTarget) || path.includes(boundary))) return;\n\n if (panel && (panel.contains(eventTarget) || path.includes(panel))) return;\n\n close({ reason: 'outside-click' });\n };\n\n target.addEventListener('click', handler, capture);\n\n return () => {\n target.removeEventListener('click', handler, capture);\n };\n };\n\n return { bindOutsideClick, close, open, toggle };\n};\n"],"mappings":"mCAoCA,IAAa,EAAwB,GAAmD,CACtF,IAAI,EAA0C,KAExC,MACA,OAAO,EAAQ,cAAiB,WAAmB,EAAQ,cAAc,CAEtE,EAAQ,cAAgB,GAG3B,MAA+B,CACnC,IAAM,EAAa,EAAQ,WAK3B,GAHA,KAAsB,CACtB,EAAqB,KAEjB,CAAC,EAAY,OAEjB,IAAM,EAAY,EAAW,WAAW,CAClC,EAAW,EAAW,UAAU,CAEtC,GAAI,CAAC,GAAa,CAAC,EAAU,CAC3B,EAAW,QAAQ,CAEnB,OAGF,GAAA,EAAA,EAAA,YAAgC,EAAW,EAAU,EAAW,OAAO,EAGnE,MAA8B,CAClC,KAAsB,CACtB,EAAqB,MAGjB,EAAQ,GAAgD,CAG5D,GAFI,EAAQ,cAAc,EAEtB,EAAQ,QAAQ,CAAE,OAEtB,IAAM,EAAS,GAAM,QAAU,eAE/B,EAAQ,QAAQ,GAAM,CAAE,SAAQ,CAAC,CACjC,GAAkB,CAClB,0BAA4B,EAAQ,YAAY,QAAQ,CAAC,CACzD,EAAQ,SAAS,EAAO,EAGpB,EAAS,GAAyE,CACtF,GAAI,CAAC,EAAQ,QAAQ,CAAE,OAEvB,IAAM,EAAS,GAAM,QAAU,eAE/B,EAAQ,QAAQ,GAAO,CAAE,SAAQ,CAAC,CAClC,GAAiB,EAED,GAAM,cAAgB,GAAoB,GAE7C,EAAQ,qBAAqB,EAAE,OAAO,CAEnD,EAAQ,UAAU,EAAO,EAsC3B,MAAO,CAAE,kBAzBiB,EAAiC,SAAU,EAAU,KAAuB,CACpG,IAAM,EAAW,GAAiB,CAChC,GAAI,CAAC,EAAQ,QAAQ,CAAE,OAEvB,IAAM,EAAW,EAAQ,oBAAoB,CACvC,EAAQ,EAAQ,mBAAmB,CACnC,EAAc,EAAM,OACpB,EAAO,OAAO,EAAM,cAAiB,WAAa,EAAM,cAAc,CAAG,EAAE,CAE5E,IAED,IAAa,EAAS,SAAS,EAAY,EAAI,EAAK,SAAS,EAAS,GAEtE,IAAU,EAAM,SAAS,EAAY,EAAI,EAAK,SAAS,EAAM,GAEjE,EAAM,CAAE,OAAQ,gBAAiB,CAAC,GAKpC,OAFA,EAAO,iBAAiB,QAAS,EAAS,EAAQ,KAErC,CACX,EAAO,oBAAoB,QAAS,EAAS,EAAQ,GAI9B,QAAO,OAAM,WAnCb,CACzB,GAAI,EAAQ,QAAQ,CAAE,CACpB,EAAM,CAAE,OAAQ,SAAU,CAAC,CAE3B,OAGF,EAAK,CAAE,OAAQ,SAAU,CAAC,EA4BoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/labs/overlay.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,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,iBAAiB,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,QAAQ,CAAC;AAExF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,kBAAkB,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,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,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;IACrF,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;KAAE,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,qBAAqB,KAAG,cAkGrE,CAAC"}
@@ -1,2 +0,0 @@
1
- import{autoUpdate as e}from"@vielzeug/floatit";var t=t=>{let n=null,r=()=>typeof t.restoreFocus==`function`?t.restoreFocus():t.restoreFocus??!0,i=()=>{let r=t.positioner;if(n?.(),n=null,!r)return;let i=r.reference(),a=r.floating();if(!i||!a){r.update();return}n=e(i,a,r.update)},a=()=>{n?.(),n=null},o=e=>{if(t.isDisabled?.()||t.isOpen())return;let n=e?.reason??`programmatic`;t.setOpen(!0,{reason:n}),i(),requestAnimationFrame(()=>t.positioner?.update()),t.onOpen?.(n)},s=e=>{if(!t.isOpen())return;let n=e?.reason??`programmatic`;t.setOpen(!1,{reason:n}),a(),(e?.restoreFocus??r())&&t.getTriggerElement?.()?.focus(),t.onClose?.(n)};return{bindOutsideClick:(e=document,n=!0)=>{let r=e=>{if(!t.isOpen())return;let n=t.getBoundaryElement(),r=t.getPanelElement?.(),i=e.target,a=typeof e.composedPath==`function`?e.composedPath():[];i&&(n&&(n.contains(i)||a.includes(n))||r&&(r.contains(i)||a.includes(r))||s({reason:`outside-click`}))};return e.addEventListener(`click`,r,n),()=>{e.removeEventListener(`click`,r,n)}},close:s,open:o,toggle:()=>{if(t.isOpen()){s({reason:`toggle`});return}o({reason:`toggle`})}}};export{t as createOverlayControl};
2
- //# sourceMappingURL=overlay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","names":[],"sources":["../../src/labs/overlay.ts"],"sourcesContent":["import { autoUpdate } from '@vielzeug/floatit';\n\nexport type OverlayPositioner = {\n floating: () => HTMLElement | null;\n reference: () => HTMLElement | null;\n update: () => void;\n};\n\nexport type OverlayOpenReason = 'programmatic' | 'toggle' | 'trigger';\n\nexport type OverlayCloseReason = 'escape' | 'outside-click' | 'programmatic' | 'toggle';\n\nexport type OverlayChangeContext = {\n reason: OverlayCloseReason | OverlayOpenReason;\n};\n\nexport type OverlayControlOptions = {\n getBoundaryElement: () => HTMLElement | null;\n getPanelElement?: () => HTMLElement | null;\n getTriggerElement?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isOpen: () => boolean;\n onClose?: (reason: OverlayCloseReason) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n positioner?: OverlayPositioner;\n restoreFocus?: boolean | (() => boolean);\n setOpen: (next: boolean, context: OverlayChangeContext) => void;\n};\n\nexport type OverlayControl = {\n bindOutsideClick: (target?: Document | HTMLElement, capture?: boolean) => () => void;\n close: (opts?: { reason?: OverlayCloseReason; restoreFocus?: boolean }) => void;\n open: (opts?: { reason?: OverlayOpenReason }) => void;\n toggle: () => void;\n};\n\nexport const createOverlayControl = (options: OverlayControlOptions): OverlayControl => {\n let cleanupPositioning: (() => void) | null = null;\n\n const shouldRestoreFocus = (): boolean => {\n if (typeof options.restoreFocus === 'function') return options.restoreFocus();\n\n return options.restoreFocus ?? true;\n };\n\n const startPositioning = (): void => {\n const positioner = options.positioner;\n\n cleanupPositioning?.();\n cleanupPositioning = null;\n\n if (!positioner) return;\n\n const reference = positioner.reference();\n const floating = positioner.floating();\n\n if (!reference || !floating) {\n positioner.update();\n\n return;\n }\n\n cleanupPositioning = autoUpdate(reference, floating, positioner.update);\n };\n\n const stopPositioning = (): void => {\n cleanupPositioning?.();\n cleanupPositioning = null;\n };\n\n const open = (opts?: { reason?: OverlayOpenReason }): void => {\n if (options.isDisabled?.()) return;\n\n if (options.isOpen()) return;\n\n const reason = opts?.reason ?? 'programmatic';\n\n options.setOpen(true, { reason });\n startPositioning();\n requestAnimationFrame(() => options.positioner?.update());\n options.onOpen?.(reason);\n };\n\n const close = (opts?: { reason?: OverlayCloseReason; restoreFocus?: boolean }): void => {\n if (!options.isOpen()) return;\n\n const reason = opts?.reason ?? 'programmatic';\n\n options.setOpen(false, { reason });\n stopPositioning();\n\n const restore = opts?.restoreFocus ?? shouldRestoreFocus();\n\n if (restore) options.getTriggerElement?.()?.focus();\n\n options.onClose?.(reason);\n };\n\n const toggle = (): void => {\n if (options.isOpen()) {\n close({ reason: 'toggle' });\n\n return;\n }\n\n open({ reason: 'toggle' });\n };\n\n const bindOutsideClick = (target: Document | HTMLElement = document, capture = true): (() => void) => {\n const handler = (event: Event) => {\n if (!options.isOpen()) return;\n\n const boundary = options.getBoundaryElement();\n const panel = options.getPanelElement?.();\n const eventTarget = event.target as Node | null;\n const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n\n if (!eventTarget) return;\n\n if (boundary && (boundary.contains(eventTarget) || path.includes(boundary))) return;\n\n if (panel && (panel.contains(eventTarget) || path.includes(panel))) return;\n\n close({ reason: 'outside-click' });\n };\n\n target.addEventListener('click', handler, capture);\n\n return () => {\n target.removeEventListener('click', handler, capture);\n };\n };\n\n return { bindOutsideClick, close, open, toggle };\n};\n"],"mappings":"+CAoCA,IAAa,EAAwB,GAAmD,CACtF,IAAI,EAA0C,KAExC,MACA,OAAO,EAAQ,cAAiB,WAAmB,EAAQ,cAAc,CAEtE,EAAQ,cAAgB,GAG3B,MAA+B,CACnC,IAAM,EAAa,EAAQ,WAK3B,GAHA,KAAsB,CACtB,EAAqB,KAEjB,CAAC,EAAY,OAEjB,IAAM,EAAY,EAAW,WAAW,CAClC,EAAW,EAAW,UAAU,CAEtC,GAAI,CAAC,GAAa,CAAC,EAAU,CAC3B,EAAW,QAAQ,CAEnB,OAGF,EAAqB,EAAW,EAAW,EAAU,EAAW,OAAO,EAGnE,MAA8B,CAClC,KAAsB,CACtB,EAAqB,MAGjB,EAAQ,GAAgD,CAG5D,GAFI,EAAQ,cAAc,EAEtB,EAAQ,QAAQ,CAAE,OAEtB,IAAM,EAAS,GAAM,QAAU,eAE/B,EAAQ,QAAQ,GAAM,CAAE,SAAQ,CAAC,CACjC,GAAkB,CAClB,0BAA4B,EAAQ,YAAY,QAAQ,CAAC,CACzD,EAAQ,SAAS,EAAO,EAGpB,EAAS,GAAyE,CACtF,GAAI,CAAC,EAAQ,QAAQ,CAAE,OAEvB,IAAM,EAAS,GAAM,QAAU,eAE/B,EAAQ,QAAQ,GAAO,CAAE,SAAQ,CAAC,CAClC,GAAiB,EAED,GAAM,cAAgB,GAAoB,GAE7C,EAAQ,qBAAqB,EAAE,OAAO,CAEnD,EAAQ,UAAU,EAAO,EAsC3B,MAAO,CAAE,kBAzBiB,EAAiC,SAAU,EAAU,KAAuB,CACpG,IAAM,EAAW,GAAiB,CAChC,GAAI,CAAC,EAAQ,QAAQ,CAAE,OAEvB,IAAM,EAAW,EAAQ,oBAAoB,CACvC,EAAQ,EAAQ,mBAAmB,CACnC,EAAc,EAAM,OACpB,EAAO,OAAO,EAAM,cAAiB,WAAa,EAAM,cAAc,CAAG,EAAE,CAE5E,IAED,IAAa,EAAS,SAAS,EAAY,EAAI,EAAK,SAAS,EAAS,GAEtE,IAAU,EAAM,SAAS,EAAY,EAAI,EAAK,SAAS,EAAM,GAEjE,EAAM,CAAE,OAAQ,gBAAiB,CAAC,GAKpC,OAFA,EAAO,iBAAiB,QAAS,EAAS,EAAQ,KAErC,CACX,EAAO,oBAAoB,QAAS,EAAS,EAAQ,GAI9B,QAAO,OAAM,WAnCb,CACzB,GAAI,EAAQ,QAAQ,CAAE,CACpB,EAAM,CAAE,OAAQ,SAAU,CAAC,CAE3B,OAGF,EAAK,CAAE,OAAQ,SAAU,CAAC,EA4BoB"}
@@ -1,2 +0,0 @@
1
- let e=require(`@vielzeug/stateit`);function t(t){let n=t.indeterminate??(0,e.signal)(!1);return{changePayload:e=>({checked:t.checked.value,fieldValue:t.value.value??``,originalEvent:e,value:t.checked.value}),checked:t.checked,indeterminate:n,toggle:e=>{if(!(t.disabled.value??!1)){if(t.group){n.value=!1,t.group.toggle(t.value.value??``,e),t.onToggle?.(e);return}t.clearIndeterminateFirst&&n.value||(t.checked.value=!t.checked.value),n.value=!1,t.onToggle?.(e)}}}}exports.createCheckableControl=t;
2
- //# sourceMappingURL=selectable.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectable.cjs","names":[],"sources":["../../src/labs/selectable.ts"],"sourcesContent":["import { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\n/**\n * Change event payload emitted by checkable controls.\n */\nexport type CheckableChangePayload = {\n checked: boolean;\n fieldValue: string;\n originalEvent?: Event;\n value: boolean;\n};\n\n/**\n * Configuration for `createCheckableControl()`.\n */\nexport type CheckableControlConfig = {\n /** Writable checked signal — mutated directly by toggle() so all reactive bindings stay in sync */\n checked: Signal<boolean>;\n /** When `true`, the first click clears indeterminate instead of toggling checked */\n clearIndeterminateFirst?: boolean;\n /** Disabled signal (usually from props) */\n disabled: ReadonlySignal<boolean | undefined>;\n /** Optional: checkbox group context for syncing multiple checkboxes */\n group?: { toggle(value: string, originalEvent?: Event): void } | undefined;\n /** Writable indeterminate signal — managed by the caller, cleared by toggle() */\n indeterminate?: Signal<boolean>;\n /** Optional: callback when toggle occurs (for form validation / event emission) */\n onToggle?: (e: Event) => void;\n /** Value signal (usually from props) */\n value: ReadonlySignal<string | undefined>;\n};\n\n/**\n * Handle returned from `createCheckableControl()`.\n */\nexport type CheckableControlHandle = {\n /** Create a standard change payload from an event */\n changePayload: (e: Event) => CheckableChangePayload;\n /** Current checked state — the same signal passed in via config.checked */\n checked: ReadonlySignal<boolean>;\n /** Current indeterminate state signal */\n indeterminate: ReadonlySignal<boolean>;\n /** Toggle function (respecting disabled state and indeterminate rules) */\n toggle: (e: Event) => void;\n};\n\n/**\n * Manages checked/indeterminate state logic for checkable form controls (checkbox, radio, switch).\n *\n * Encapsulates:\n * - Controlled state management (operates directly on the caller's signals — no internal copy)\n * - Indeterminate-first clearing behavior\n * - Disabled guard\n * - Group integration (for checkbox-group context)\n * - Standard change payload creation\n *\n * @example\n * const checkedSignal = signal(false);\n * const control = createCheckableControl({\n * checked: checkedSignal,\n * disabled: props.disabled,\n * value: props.value,\n * clearIndeterminateFirst: true,\n * });\n *\n * reflect({\n * checked: () => control.checked.value,\n * onClick: (e) => control.toggle(e),\n * });\n */\nexport function createCheckableControl(config: CheckableControlConfig): CheckableControlHandle {\n const indeterminate = config.indeterminate ?? signal<boolean>(false);\n\n const toggle = (e: Event) => {\n if (config.disabled.value ?? false) return;\n\n if (config.group) {\n indeterminate.value = false;\n config.group.toggle(config.value.value ?? '', e);\n config.onToggle?.(e);\n\n return;\n }\n\n if (config.clearIndeterminateFirst && indeterminate.value) {\n indeterminate.value = false;\n } else {\n config.checked.value = !config.checked.value;\n indeterminate.value = false;\n }\n\n config.onToggle?.(e);\n };\n\n const changePayload = (e: Event): CheckableChangePayload => ({\n checked: config.checked.value,\n fieldValue: config.value.value ?? '',\n originalEvent: e,\n value: config.checked.value,\n });\n\n return {\n changePayload,\n checked: config.checked,\n indeterminate,\n toggle,\n };\n}\n"],"mappings":"mCAsEA,SAAgB,EAAuB,EAAwD,CAC7F,IAAM,EAAgB,EAAO,gBAAA,EAAA,EAAA,QAAiC,GAAM,CA8BpE,MAAO,CACL,cARqB,IAAsC,CAC3D,QAAS,EAAO,QAAQ,MACxB,WAAY,EAAO,MAAM,OAAS,GAClC,cAAe,EACf,MAAO,EAAO,QAAQ,MACvB,EAIC,QAAS,EAAO,QAChB,gBACA,OAhCc,GAAa,CACvB,OAAO,SAAS,OAAS,IAE7B,IAAI,EAAO,MAAO,CAChB,EAAc,MAAQ,GACtB,EAAO,MAAM,OAAO,EAAO,MAAM,OAAS,GAAI,EAAE,CAChD,EAAO,WAAW,EAAE,CAEpB,OAGE,EAAO,yBAA2B,EAAc,QAGlD,EAAO,QAAQ,MAAQ,CAAC,EAAO,QAAQ,OAFvC,EAAc,MAAQ,GAMxB,EAAO,WAAW,EAAE,GAerB"}
@@ -1,70 +0,0 @@
1
- import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';
2
- /**
3
- * Change event payload emitted by checkable controls.
4
- */
5
- export type CheckableChangePayload = {
6
- checked: boolean;
7
- fieldValue: string;
8
- originalEvent?: Event;
9
- value: boolean;
10
- };
11
- /**
12
- * Configuration for `createCheckableControl()`.
13
- */
14
- export type CheckableControlConfig = {
15
- /** Writable checked signal — mutated directly by toggle() so all reactive bindings stay in sync */
16
- checked: Signal<boolean>;
17
- /** When `true`, the first click clears indeterminate instead of toggling checked */
18
- clearIndeterminateFirst?: boolean;
19
- /** Disabled signal (usually from props) */
20
- disabled: ReadonlySignal<boolean | undefined>;
21
- /** Optional: checkbox group context for syncing multiple checkboxes */
22
- group?: {
23
- toggle(value: string, originalEvent?: Event): void;
24
- } | undefined;
25
- /** Writable indeterminate signal — managed by the caller, cleared by toggle() */
26
- indeterminate?: Signal<boolean>;
27
- /** Optional: callback when toggle occurs (for form validation / event emission) */
28
- onToggle?: (e: Event) => void;
29
- /** Value signal (usually from props) */
30
- value: ReadonlySignal<string | undefined>;
31
- };
32
- /**
33
- * Handle returned from `createCheckableControl()`.
34
- */
35
- export type CheckableControlHandle = {
36
- /** Create a standard change payload from an event */
37
- changePayload: (e: Event) => CheckableChangePayload;
38
- /** Current checked state — the same signal passed in via config.checked */
39
- checked: ReadonlySignal<boolean>;
40
- /** Current indeterminate state signal */
41
- indeterminate: ReadonlySignal<boolean>;
42
- /** Toggle function (respecting disabled state and indeterminate rules) */
43
- toggle: (e: Event) => void;
44
- };
45
- /**
46
- * Manages checked/indeterminate state logic for checkable form controls (checkbox, radio, switch).
47
- *
48
- * Encapsulates:
49
- * - Controlled state management (operates directly on the caller's signals — no internal copy)
50
- * - Indeterminate-first clearing behavior
51
- * - Disabled guard
52
- * - Group integration (for checkbox-group context)
53
- * - Standard change payload creation
54
- *
55
- * @example
56
- * const checkedSignal = signal(false);
57
- * const control = createCheckableControl({
58
- * checked: checkedSignal,
59
- * disabled: props.disabled,
60
- * value: props.value,
61
- * clearIndeterminateFirst: true,
62
- * });
63
- *
64
- * reflect({
65
- * checked: () => control.checked.value,
66
- * onClick: (e) => control.toggle(e),
67
- * });
68
- */
69
- export declare function createCheckableControl(config: CheckableControlConfig): CheckableControlHandle;
70
- //# sourceMappingURL=selectable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectable.d.ts","sourceRoot":"","sources":["../../src/labs/selectable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,mGAAmG;IACnG,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,oFAAoF;IACpF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,2CAA2C;IAC3C,QAAQ,EAAE,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC9C,uEAAuE;IACvE,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3E,iFAAiF;IACjF,aAAa,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,mFAAmF;IACnF,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,wCAAwC;IACxC,KAAK,EAAE,cAAc,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC3C,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,qDAAqD;IACrD,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,sBAAsB,CAAC;IACpD,2EAA2E;IAC3E,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACjC,yCAAyC;IACzC,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,0EAA0E;IAC1E,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB,CAqC7F"}
@@ -1,2 +0,0 @@
1
- import{signal as e}from"@vielzeug/stateit";function t(t){let n=t.indeterminate??e(!1);return{changePayload:e=>({checked:t.checked.value,fieldValue:t.value.value??``,originalEvent:e,value:t.checked.value}),checked:t.checked,indeterminate:n,toggle:e=>{if(!(t.disabled.value??!1)){if(t.group){n.value=!1,t.group.toggle(t.value.value??``,e),t.onToggle?.(e);return}t.clearIndeterminateFirst&&n.value||(t.checked.value=!t.checked.value),n.value=!1,t.onToggle?.(e)}}}}export{t as createCheckableControl};
2
- //# sourceMappingURL=selectable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectable.js","names":[],"sources":["../../src/labs/selectable.ts"],"sourcesContent":["import { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\n/**\n * Change event payload emitted by checkable controls.\n */\nexport type CheckableChangePayload = {\n checked: boolean;\n fieldValue: string;\n originalEvent?: Event;\n value: boolean;\n};\n\n/**\n * Configuration for `createCheckableControl()`.\n */\nexport type CheckableControlConfig = {\n /** Writable checked signal — mutated directly by toggle() so all reactive bindings stay in sync */\n checked: Signal<boolean>;\n /** When `true`, the first click clears indeterminate instead of toggling checked */\n clearIndeterminateFirst?: boolean;\n /** Disabled signal (usually from props) */\n disabled: ReadonlySignal<boolean | undefined>;\n /** Optional: checkbox group context for syncing multiple checkboxes */\n group?: { toggle(value: string, originalEvent?: Event): void } | undefined;\n /** Writable indeterminate signal — managed by the caller, cleared by toggle() */\n indeterminate?: Signal<boolean>;\n /** Optional: callback when toggle occurs (for form validation / event emission) */\n onToggle?: (e: Event) => void;\n /** Value signal (usually from props) */\n value: ReadonlySignal<string | undefined>;\n};\n\n/**\n * Handle returned from `createCheckableControl()`.\n */\nexport type CheckableControlHandle = {\n /** Create a standard change payload from an event */\n changePayload: (e: Event) => CheckableChangePayload;\n /** Current checked state — the same signal passed in via config.checked */\n checked: ReadonlySignal<boolean>;\n /** Current indeterminate state signal */\n indeterminate: ReadonlySignal<boolean>;\n /** Toggle function (respecting disabled state and indeterminate rules) */\n toggle: (e: Event) => void;\n};\n\n/**\n * Manages checked/indeterminate state logic for checkable form controls (checkbox, radio, switch).\n *\n * Encapsulates:\n * - Controlled state management (operates directly on the caller's signals — no internal copy)\n * - Indeterminate-first clearing behavior\n * - Disabled guard\n * - Group integration (for checkbox-group context)\n * - Standard change payload creation\n *\n * @example\n * const checkedSignal = signal(false);\n * const control = createCheckableControl({\n * checked: checkedSignal,\n * disabled: props.disabled,\n * value: props.value,\n * clearIndeterminateFirst: true,\n * });\n *\n * reflect({\n * checked: () => control.checked.value,\n * onClick: (e) => control.toggle(e),\n * });\n */\nexport function createCheckableControl(config: CheckableControlConfig): CheckableControlHandle {\n const indeterminate = config.indeterminate ?? signal<boolean>(false);\n\n const toggle = (e: Event) => {\n if (config.disabled.value ?? false) return;\n\n if (config.group) {\n indeterminate.value = false;\n config.group.toggle(config.value.value ?? '', e);\n config.onToggle?.(e);\n\n return;\n }\n\n if (config.clearIndeterminateFirst && indeterminate.value) {\n indeterminate.value = false;\n } else {\n config.checked.value = !config.checked.value;\n indeterminate.value = false;\n }\n\n config.onToggle?.(e);\n };\n\n const changePayload = (e: Event): CheckableChangePayload => ({\n checked: config.checked.value,\n fieldValue: config.value.value ?? '',\n originalEvent: e,\n value: config.checked.value,\n });\n\n return {\n changePayload,\n checked: config.checked,\n indeterminate,\n toggle,\n };\n}\n"],"mappings":"2CAsEA,SAAgB,EAAuB,EAAwD,CAC7F,IAAM,EAAgB,EAAO,eAAiB,EAAgB,GAAM,CA8BpE,MAAO,CACL,cARqB,IAAsC,CAC3D,QAAS,EAAO,QAAQ,MACxB,WAAY,EAAO,MAAM,OAAS,GAClC,cAAe,EACf,MAAO,EAAO,QAAQ,MACvB,EAIC,QAAS,EAAO,QAChB,gBACA,OAhCc,GAAa,CACvB,OAAO,SAAS,OAAS,IAE7B,IAAI,EAAO,MAAO,CAChB,EAAc,MAAQ,GACtB,EAAO,MAAM,OAAO,EAAO,MAAM,OAAS,GAAI,EAAE,CAChD,EAAO,WAAW,EAAE,CAEpB,OAGE,EAAO,yBAA2B,EAAc,QAGlD,EAAO,QAAQ,MAAQ,CAAC,EAAO,QAAQ,OAFvC,EAAc,MAAQ,GAMxB,EAAO,WAAW,EAAE,GAerB"}
@@ -1,2 +0,0 @@
1
- var e=e=>{let t=()=>e.getSelected().map(e.keyExtractor),n=e=>t().includes(e);return{clear:()=>{e.setSelected([])},isSelected:n,remove:t=>{e.setSelected(e.getSelected().filter(n=>e.keyExtractor(n)!==t))},select:t=>{let r=e.findByKey(t);if(r){if(e.getMode()===`single`){e.setSelected([r]);return}n(t)||e.setSelected([...e.getSelected(),r])}},serialize:(e=`,`)=>t().join(e),toggle:t=>{let r=e.findByKey(t);if(r){if(e.getMode()===`single`){e.setSelected([r]);return}if(n(t)){e.setSelected(e.getSelected().filter(n=>e.keyExtractor(n)!==t));return}e.setSelected([...e.getSelected(),r])}}}};exports.createSelectionControl=e;
2
- //# sourceMappingURL=selection.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection.cjs","names":[],"sources":["../../src/labs/selection.ts"],"sourcesContent":["/**\n * Selection mode: single or multiple.\n */\nexport type SelectionMode = 'multiple' | 'single';\n\n/**\n * Key-driven selection controller.\n *\n * Works with arbitrary data structures via constructor options.\n * Manages selection state, deduplication, and serialization independently of item shape.\n */\nexport type SelectionController = {\n /** Clear all selections. */\n clear: () => void;\n /** Check if a key is currently selected. */\n isSelected: (key: string) => boolean;\n /** Remove a key from selection. */\n remove: (key: string) => void;\n /** Select a key (single or add to multiple). */\n select: (key: string) => void;\n /** Serialize all selected keys to a string (comma-separated by default). */\n serialize: (separator?: string) => string;\n /** Toggle a key's selection state. */\n toggle: (key: string) => void;\n};\n\n/**\n * Key extractor function: given an item, extract its unique key.\n */\nexport type SelectionKeyExtractor<T> = (item: T) => string;\n\n/**\n * Selection controller options.\n *\n * @typeParam T - Item type (any data structure)\n */\nexport type SelectionControllerOptions<T> = {\n /** Lookup function: given a key, find or reconstruct the item */\n findByKey: (key: string) => T | undefined;\n /** Getter: current selection mode */\n getMode: () => SelectionMode;\n /** Getter: currently selected items */\n getSelected: () => T[];\n /** Extractor: derive the unique key from an item */\n keyExtractor: SelectionKeyExtractor<T>;\n /** Setter: update selection to a new array of items */\n setSelected: (next: T[]) => void;\n};\n\n/**\n * Creates a key-driven selection controller.\n *\n * Decouples selection logic from item shape by working exclusively with extracted keys.\n * Manages deduplication and mode-aware selection (single vs. multiple).\n *\n * @example\n * ```typescript\n * const controller = createSelectionControl({\n * getMode: () => 'multiple',\n * getSelected: () => selected.value,\n * setSelected: (next) => { selected.value = next; },\n * keyExtractor: (item) => item.id,\n * findByKey: (id) => allItems.find((i) => i.id === id),\n * });\n *\n * controller.select('item-1');\n * controller.toggle('item-2');\n * if (controller.isSelected('item-1')) { ... }\n * ```\n */\nexport const createSelectionControl = <T>(options: SelectionControllerOptions<T>): SelectionController => {\n const getSelectedKeys = (): string[] => options.getSelected().map(options.keyExtractor);\n\n const isSelected = (key: string): boolean => getSelectedKeys().includes(key);\n\n const clear = (): void => {\n options.setSelected([]);\n };\n\n const select = (key: string): void => {\n const item = options.findByKey(key);\n\n if (!item) return;\n\n if (options.getMode() === 'single') {\n options.setSelected([item]);\n\n return;\n }\n\n if (isSelected(key)) return;\n\n options.setSelected([...options.getSelected(), item]);\n };\n\n const toggle = (key: string): void => {\n const item = options.findByKey(key);\n\n if (!item) return;\n\n if (options.getMode() === 'single') {\n options.setSelected([item]);\n\n return;\n }\n\n if (isSelected(key)) {\n options.setSelected(options.getSelected().filter((entry) => options.keyExtractor(entry) !== key));\n\n return;\n }\n\n options.setSelected([...options.getSelected(), item]);\n };\n\n const remove = (key: string): void => {\n options.setSelected(options.getSelected().filter((entry) => options.keyExtractor(entry) !== key));\n };\n\n const serialize = (separator = ','): string => getSelectedKeys().join(separator);\n\n return {\n clear,\n isSelected,\n remove,\n select,\n serialize,\n toggle,\n };\n};\n"],"mappings":"AAsEA,IAAa,EAA6B,GAAgE,CACxG,IAAM,MAAkC,EAAQ,aAAa,CAAC,IAAI,EAAQ,aAAa,CAEjF,EAAc,GAAyB,GAAiB,CAAC,SAAS,EAAI,CAgD5E,MAAO,CACL,UA/CwB,CACxB,EAAQ,YAAY,EAAE,CAAC,EA+CvB,aACA,OATc,GAAsB,CACpC,EAAQ,YAAY,EAAQ,aAAa,CAAC,OAAQ,GAAU,EAAQ,aAAa,EAAM,GAAK,EAAI,CAAC,EASjG,OA9Cc,GAAsB,CACpC,IAAM,EAAO,EAAQ,UAAU,EAAI,CAE9B,KAEL,IAAI,EAAQ,SAAS,GAAK,SAAU,CAClC,EAAQ,YAAY,CAAC,EAAK,CAAC,CAE3B,OAGE,EAAW,EAAI,EAEnB,EAAQ,YAAY,CAAC,GAAG,EAAQ,aAAa,CAAE,EAAK,CAAC,GAkCrD,WAPiB,EAAY,MAAgB,GAAiB,CAAC,KAAK,EAAU,CAQ9E,OAhCc,GAAsB,CACpC,IAAM,EAAO,EAAQ,UAAU,EAAI,CAE9B,KAEL,IAAI,EAAQ,SAAS,GAAK,SAAU,CAClC,EAAQ,YAAY,CAAC,EAAK,CAAC,CAE3B,OAGF,GAAI,EAAW,EAAI,CAAE,CACnB,EAAQ,YAAY,EAAQ,aAAa,CAAC,OAAQ,GAAU,EAAQ,aAAa,EAAM,GAAK,EAAI,CAAC,CAEjG,OAGF,EAAQ,YAAY,CAAC,GAAG,EAAQ,aAAa,CAAE,EAAK,CAAC,GAgBtD"}
@@ -1,68 +0,0 @@
1
- /**
2
- * Selection mode: single or multiple.
3
- */
4
- export type SelectionMode = 'multiple' | 'single';
5
- /**
6
- * Key-driven selection controller.
7
- *
8
- * Works with arbitrary data structures via constructor options.
9
- * Manages selection state, deduplication, and serialization independently of item shape.
10
- */
11
- export type SelectionController = {
12
- /** Clear all selections. */
13
- clear: () => void;
14
- /** Check if a key is currently selected. */
15
- isSelected: (key: string) => boolean;
16
- /** Remove a key from selection. */
17
- remove: (key: string) => void;
18
- /** Select a key (single or add to multiple). */
19
- select: (key: string) => void;
20
- /** Serialize all selected keys to a string (comma-separated by default). */
21
- serialize: (separator?: string) => string;
22
- /** Toggle a key's selection state. */
23
- toggle: (key: string) => void;
24
- };
25
- /**
26
- * Key extractor function: given an item, extract its unique key.
27
- */
28
- export type SelectionKeyExtractor<T> = (item: T) => string;
29
- /**
30
- * Selection controller options.
31
- *
32
- * @typeParam T - Item type (any data structure)
33
- */
34
- export type SelectionControllerOptions<T> = {
35
- /** Lookup function: given a key, find or reconstruct the item */
36
- findByKey: (key: string) => T | undefined;
37
- /** Getter: current selection mode */
38
- getMode: () => SelectionMode;
39
- /** Getter: currently selected items */
40
- getSelected: () => T[];
41
- /** Extractor: derive the unique key from an item */
42
- keyExtractor: SelectionKeyExtractor<T>;
43
- /** Setter: update selection to a new array of items */
44
- setSelected: (next: T[]) => void;
45
- };
46
- /**
47
- * Creates a key-driven selection controller.
48
- *
49
- * Decouples selection logic from item shape by working exclusively with extracted keys.
50
- * Manages deduplication and mode-aware selection (single vs. multiple).
51
- *
52
- * @example
53
- * ```typescript
54
- * const controller = createSelectionControl({
55
- * getMode: () => 'multiple',
56
- * getSelected: () => selected.value,
57
- * setSelected: (next) => { selected.value = next; },
58
- * keyExtractor: (item) => item.id,
59
- * findByKey: (id) => allItems.find((i) => i.id === id),
60
- * });
61
- *
62
- * controller.select('item-1');
63
- * controller.toggle('item-2');
64
- * if (controller.isSelected('item-1')) { ... }
65
- * ```
66
- */
67
- export declare const createSelectionControl: <T>(options: SelectionControllerOptions<T>) => SelectionController;
68
- //# sourceMappingURL=selection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/labs/selection.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,4BAA4B;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,mCAAmC;IACnC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,gDAAgD;IAChD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,sCAAsC;IACtC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC1C,iEAAiE;IACjE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC;IAC1C,qCAAqC;IACrC,OAAO,EAAE,MAAM,aAAa,CAAC;IAC7B,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;IACvB,oDAAoD;IACpD,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACvC,uDAAuD;IACvD,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,sBAAsB,GAAI,CAAC,EAAE,SAAS,0BAA0B,CAAC,CAAC,CAAC,KAAG,mBA2DlF,CAAC"}
@@ -1,2 +0,0 @@
1
- var e=e=>{let t=()=>e.getSelected().map(e.keyExtractor),n=e=>t().includes(e);return{clear:()=>{e.setSelected([])},isSelected:n,remove:t=>{e.setSelected(e.getSelected().filter(n=>e.keyExtractor(n)!==t))},select:t=>{let r=e.findByKey(t);if(r){if(e.getMode()===`single`){e.setSelected([r]);return}n(t)||e.setSelected([...e.getSelected(),r])}},serialize:(e=`,`)=>t().join(e),toggle:t=>{let r=e.findByKey(t);if(r){if(e.getMode()===`single`){e.setSelected([r]);return}if(n(t)){e.setSelected(e.getSelected().filter(n=>e.keyExtractor(n)!==t));return}e.setSelected([...e.getSelected(),r])}}}};export{e as createSelectionControl};
2
- //# sourceMappingURL=selection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection.js","names":[],"sources":["../../src/labs/selection.ts"],"sourcesContent":["/**\n * Selection mode: single or multiple.\n */\nexport type SelectionMode = 'multiple' | 'single';\n\n/**\n * Key-driven selection controller.\n *\n * Works with arbitrary data structures via constructor options.\n * Manages selection state, deduplication, and serialization independently of item shape.\n */\nexport type SelectionController = {\n /** Clear all selections. */\n clear: () => void;\n /** Check if a key is currently selected. */\n isSelected: (key: string) => boolean;\n /** Remove a key from selection. */\n remove: (key: string) => void;\n /** Select a key (single or add to multiple). */\n select: (key: string) => void;\n /** Serialize all selected keys to a string (comma-separated by default). */\n serialize: (separator?: string) => string;\n /** Toggle a key's selection state. */\n toggle: (key: string) => void;\n};\n\n/**\n * Key extractor function: given an item, extract its unique key.\n */\nexport type SelectionKeyExtractor<T> = (item: T) => string;\n\n/**\n * Selection controller options.\n *\n * @typeParam T - Item type (any data structure)\n */\nexport type SelectionControllerOptions<T> = {\n /** Lookup function: given a key, find or reconstruct the item */\n findByKey: (key: string) => T | undefined;\n /** Getter: current selection mode */\n getMode: () => SelectionMode;\n /** Getter: currently selected items */\n getSelected: () => T[];\n /** Extractor: derive the unique key from an item */\n keyExtractor: SelectionKeyExtractor<T>;\n /** Setter: update selection to a new array of items */\n setSelected: (next: T[]) => void;\n};\n\n/**\n * Creates a key-driven selection controller.\n *\n * Decouples selection logic from item shape by working exclusively with extracted keys.\n * Manages deduplication and mode-aware selection (single vs. multiple).\n *\n * @example\n * ```typescript\n * const controller = createSelectionControl({\n * getMode: () => 'multiple',\n * getSelected: () => selected.value,\n * setSelected: (next) => { selected.value = next; },\n * keyExtractor: (item) => item.id,\n * findByKey: (id) => allItems.find((i) => i.id === id),\n * });\n *\n * controller.select('item-1');\n * controller.toggle('item-2');\n * if (controller.isSelected('item-1')) { ... }\n * ```\n */\nexport const createSelectionControl = <T>(options: SelectionControllerOptions<T>): SelectionController => {\n const getSelectedKeys = (): string[] => options.getSelected().map(options.keyExtractor);\n\n const isSelected = (key: string): boolean => getSelectedKeys().includes(key);\n\n const clear = (): void => {\n options.setSelected([]);\n };\n\n const select = (key: string): void => {\n const item = options.findByKey(key);\n\n if (!item) return;\n\n if (options.getMode() === 'single') {\n options.setSelected([item]);\n\n return;\n }\n\n if (isSelected(key)) return;\n\n options.setSelected([...options.getSelected(), item]);\n };\n\n const toggle = (key: string): void => {\n const item = options.findByKey(key);\n\n if (!item) return;\n\n if (options.getMode() === 'single') {\n options.setSelected([item]);\n\n return;\n }\n\n if (isSelected(key)) {\n options.setSelected(options.getSelected().filter((entry) => options.keyExtractor(entry) !== key));\n\n return;\n }\n\n options.setSelected([...options.getSelected(), item]);\n };\n\n const remove = (key: string): void => {\n options.setSelected(options.getSelected().filter((entry) => options.keyExtractor(entry) !== key));\n };\n\n const serialize = (separator = ','): string => getSelectedKeys().join(separator);\n\n return {\n clear,\n isSelected,\n remove,\n select,\n serialize,\n toggle,\n };\n};\n"],"mappings":"AAsEA,IAAa,EAA6B,GAAgE,CACxG,IAAM,MAAkC,EAAQ,aAAa,CAAC,IAAI,EAAQ,aAAa,CAEjF,EAAc,GAAyB,GAAiB,CAAC,SAAS,EAAI,CAgD5E,MAAO,CACL,UA/CwB,CACxB,EAAQ,YAAY,EAAE,CAAC,EA+CvB,aACA,OATc,GAAsB,CACpC,EAAQ,YAAY,EAAQ,aAAa,CAAC,OAAQ,GAAU,EAAQ,aAAa,EAAM,GAAK,EAAI,CAAC,EASjG,OA9Cc,GAAsB,CACpC,IAAM,EAAO,EAAQ,UAAU,EAAI,CAE9B,KAEL,IAAI,EAAQ,SAAS,GAAK,SAAU,CAClC,EAAQ,YAAY,CAAC,EAAK,CAAC,CAE3B,OAGE,EAAW,EAAI,EAEnB,EAAQ,YAAY,CAAC,GAAG,EAAQ,aAAa,CAAE,EAAK,CAAC,GAkCrD,WAPiB,EAAY,MAAgB,GAAiB,CAAC,KAAK,EAAU,CAQ9E,OAhCc,GAAsB,CACpC,IAAM,EAAO,EAAQ,UAAU,EAAI,CAE9B,KAEL,IAAI,EAAQ,SAAS,GAAK,SAAU,CAClC,EAAQ,YAAY,CAAC,EAAK,CAAC,CAE3B,OAGF,GAAI,EAAW,EAAI,CAAE,CACnB,EAAQ,YAAY,EAAQ,aAAa,CAAC,OAAQ,GAAU,EAAQ,aAAa,EAAM,GAAK,EAAI,CAAC,CAEjG,OAGF,EAAQ,YAAY,CAAC,GAAG,EAAQ,aAAa,CAAE,EAAK,CAAC,GAgBtD"}
package/dist/labs.cjs DELETED
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./labs/observers.cjs`),t=require(`./labs/list.cjs`),n=require(`./labs/overlay.cjs`),r=require(`./labs/selection.cjs`),i=require(`./labs/a11y.cjs`),a=require(`./labs/selectable.cjs`);exports.createCheckableControl=a.createCheckableControl,exports.createListNavigation=t.createListNavigation,exports.createOverlayControl=n.createOverlayControl,exports.createSelectionControl=r.createSelectionControl,exports.observeIntersection=e.observeIntersection,exports.observeMedia=e.observeMedia,exports.observeResize=e.observeResize,exports.useA11yControl=i.useA11yControl;
package/dist/labs.js DELETED
@@ -1 +0,0 @@
1
- import{observeIntersection as e,observeMedia as t,observeResize as n}from"./labs/observers.js";import{createListNavigation as r}from"./labs/list.js";import{createOverlayControl as i}from"./labs/overlay.js";import{createSelectionControl as a}from"./labs/selection.js";import{useA11yControl as o}from"./labs/a11y.js";import{createCheckableControl as s}from"./labs/selectable.js";export{s as createCheckableControl,r as createListNavigation,i as createOverlayControl,a as createSelectionControl,e as observeIntersection,t as observeMedia,n as observeResize,o as useA11yControl};
@@ -1,2 +0,0 @@
1
- export * from './test';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
@@ -1,2 +0,0 @@
1
- const e=require(`../core/utilities.cjs`),t=require(`../core/template.cjs`),n=require(`../core/component.cjs`);var r=[],i=0,a=()=>{e._resetIdCounter(),t._resetMarkerIndex()};function o(){return(()=>{let e=0,t=()=>Promise.resolve().then(()=>{if(++e<10)return t()});return t()})().then(()=>new Promise(e=>typeof requestAnimationFrame<`u`?requestAnimationFrame(()=>e()):e()))}function s(e){e(b)}function c(e,t,n){n===!1?e.removeAttribute(t):e.setAttribute(t,n===!0?``:String(n))}async function l(e,t={}){let{attrs:a={},componentOptions:s,container:l=document.body,html:f,props:p={}}=t,m,h;typeof e==`string`?m=e:typeof e==`function`?(m=`trial-${++i}`,h={...s??{},setup:e}):(m=`trial-${++i}`,h=e),h&&n.defineComponent({tag:m,...h});let g=document.createElement(m);f&&(g.innerHTML=f),Object.keys(p).length&&Object.assign(g,p);for(let[e,t]of Object.entries(a))c(g,e,t);return l.appendChild(g),r.push(g),await o(),{async act(e){await e(),await o()},async attr(e,t){c(g,e,t),await o()},async attrs(e){for(let[t,n]of Object.entries(e))c(g,t,n);await o()},destroy(){g.remove();let e=r.indexOf(g);e!==-1&&r.splice(e,1)},element:g,flush:o,query(e){return g.shadowRoot?.querySelector(e)??null},queryAll(e){return Array.from(g.shadowRoot?.querySelectorAll(e)??[])},queryAllByTestId(e){return Array.from(g.shadowRoot?.querySelectorAll(`[data-testid="${e}"]`)??[])},queryAllByText(e,t=`*`){return d(g.shadowRoot,e,t)},queryByTestId(e){return g.shadowRoot?.querySelector(`[data-testid="${e}"]`)??null},queryByText(e,t=`*`){return u(g.shadowRoot,e,t)},get shadow(){return g.shadowRoot}}}function u(e,t,n){for(let r of e.querySelectorAll(n))if(r.textContent?.trim()===t)return r;return null}function d(e,t,n){return Array.from(e.querySelectorAll(n)).filter(e=>e.textContent?.trim()===t)}function f(e){return{query:t=>e.querySelector(t),queryAll:t=>Array.from(e.querySelectorAll(t)),queryAllByTestId:t=>Array.from(e.querySelectorAll(`[data-testid="${t}"]`)),queryAllByText:(t,n=`*`)=>d(e,t,n),queryByTestId:t=>e.querySelector(`[data-testid="${t}"]`),queryByText:(t,n=`*`)=>u(e,t,n)}}var p=(e,t={})=>typeof PointerEvent<`u`?new PointerEvent(e,t):new MouseEvent(e,t),m={blur:(e,t)=>e.dispatchEvent(new FocusEvent(`blur`,{bubbles:!0,...t})),change:(e,t)=>e.dispatchEvent(new Event(`change`,{bubbles:!0,...t})),click:(e,t)=>e.dispatchEvent(new MouseEvent(`click`,{bubbles:!0,cancelable:!0,...t})),custom(e,t,n,r){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n,...r}))},focus:(e,t)=>e.dispatchEvent(new FocusEvent(`focus`,{bubbles:!0,...t})),input:(e,t)=>e.dispatchEvent(new Event(`input`,{bubbles:!0,...t})),keyDown:(e,t)=>e.dispatchEvent(new KeyboardEvent(`keydown`,{bubbles:!0,cancelable:!0,...t})),keyUp:(e,t)=>e.dispatchEvent(new KeyboardEvent(`keyup`,{bubbles:!0,cancelable:!0,...t})),pointerDown:(e,t)=>e.dispatchEvent(p(`pointerdown`,{bubbles:!0,cancelable:!0,...t})),pointerEnter:(e,t)=>e.dispatchEvent(p(`pointerenter`,{bubbles:!1,...t})),pointerLeave:(e,t)=>e.dispatchEvent(p(`pointerleave`,{bubbles:!1,...t})),pointerUp:(e,t)=>e.dispatchEvent(p(`pointerup`,{bubbles:!0,cancelable:!0,...t})),submit:(e,t)=>e.dispatchEvent(new Event(`submit`,{bubbles:!0,cancelable:!0,...t}))},h=()=>Promise.resolve(),g={async clear(e){e.focus(),e.value=``,m.input(e),m.change(e),await h()},async click(e,t){m.pointerEnter(e,t),m.click(e,t),await h()},async dblClick(e){for(let t=0;t<2;t++)m.pointerDown(e),m.pointerUp(e),m.click(e);e.dispatchEvent(new MouseEvent(`dblclick`,{bubbles:!0,cancelable:!0})),await h()},async fill(e,t){e.focus(),e.value=``;for(let n of t)e.value+=n,m.input(e),m.keyDown(e,{key:n}),m.keyUp(e,{key:n}),await h();m.change(e)},async hover(e){m.pointerEnter(e),await h()},async press(e,t,n){m.keyDown(e,{key:t,...n}),m.keyUp(e,{key:t,...n}),await h()},async select(e,t){let n=Array.isArray(t)?t:[t];for(let t of e.options)t.selected=n.includes(t.value);m.change(e),await h()},async type(e,t){e.focus();for(let n of t)e.value+=n,m.input(e),m.keyDown(e,{key:n}),m.keyUp(e,{key:n}),await h();m.change(e)},async unhover(e){m.pointerLeave(e),await h()}};async function _(e,{interval:t=50,message:n,timeout:r=1e3}={}){let i=Date.now()+r,a,o=async()=>{try{let t=await e();return t===void 0||!!t}catch(e){return a=e,!1}};for(;Date.now()<i;){if(await o())return;await new Promise(e=>setTimeout(e,t))}if(await o())return;let s=n??`waitFor timed out after ${r}ms`;throw a instanceof Error?(a.message=`${s}\n${a.message}`,a):Error(a==null?s:`${s}\nCause: ${a}`)}function v(e,t,n=1e3){return new Promise((r,i)=>{let a=setTimeout(()=>i(Error(`waitForEvent: "${t}" timed out after ${n}ms`)),n);e.addEventListener(t,e=>{clearTimeout(a),r(e)},{once:!0})})}function y(e,t=``){customElements.get(e)||customElements.define(e,class extends HTMLElement{connectedCallback(){this.innerHTML=t}})}function b(){for(let e of r)e.remove();r.length=0}exports._resetCounters=a,exports.cleanup=b,exports.fire=m,exports.flush=o,exports.install=s,exports.mock=y,exports.mount=l,exports.user=g,exports.waitFor=_,exports.waitForEvent=v,exports.within=f;
2
- //# sourceMappingURL=test.cjs.map