@bquery/bquery 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/README.md +716 -586
  2. package/dist/a11y/announce.d.ts +43 -0
  3. package/dist/a11y/announce.d.ts.map +1 -0
  4. package/dist/a11y/audit.d.ts +42 -0
  5. package/dist/a11y/audit.d.ts.map +1 -0
  6. package/dist/a11y/index.d.ts +53 -0
  7. package/dist/a11y/index.d.ts.map +1 -0
  8. package/dist/a11y/media-preferences.d.ts +77 -0
  9. package/dist/a11y/media-preferences.d.ts.map +1 -0
  10. package/dist/a11y/roving-tab-index.d.ts +38 -0
  11. package/dist/a11y/roving-tab-index.d.ts.map +1 -0
  12. package/dist/a11y/skip-link.d.ts +37 -0
  13. package/dist/a11y/skip-link.d.ts.map +1 -0
  14. package/dist/a11y/trap-focus.d.ts +49 -0
  15. package/dist/a11y/trap-focus.d.ts.map +1 -0
  16. package/dist/a11y/types.d.ts +152 -0
  17. package/dist/a11y/types.d.ts.map +1 -0
  18. package/dist/a11y-C5QOVvRn.js +421 -0
  19. package/dist/a11y-C5QOVvRn.js.map +1 -0
  20. package/dist/a11y.es.mjs +14 -0
  21. package/dist/component/component.d.ts.map +1 -1
  22. package/dist/component/html.d.ts.map +1 -1
  23. package/dist/component/index.d.ts +2 -1
  24. package/dist/component/index.d.ts.map +1 -1
  25. package/dist/component/library.d.ts.map +1 -1
  26. package/dist/component/scope.d.ts +138 -0
  27. package/dist/component/scope.d.ts.map +1 -0
  28. package/dist/component/types.d.ts +53 -1
  29. package/dist/component/types.d.ts.map +1 -1
  30. package/dist/component-CuuTijA6.js +684 -0
  31. package/dist/component-CuuTijA6.js.map +1 -0
  32. package/dist/component.es.mjs +9 -6
  33. package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
  34. package/dist/{config-DRmZZno3.js.map → config-BW35FKuA.js.map} +1 -1
  35. package/dist/constraints-3lV9yyBw.js +100 -0
  36. package/dist/constraints-3lV9yyBw.js.map +1 -0
  37. package/dist/core/collection.d.ts +48 -0
  38. package/dist/core/collection.d.ts.map +1 -1
  39. package/dist/core/element.d.ts +92 -0
  40. package/dist/core/element.d.ts.map +1 -1
  41. package/dist/core/env.d.ts +18 -0
  42. package/dist/core/env.d.ts.map +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/shared.d.ts +8 -0
  46. package/dist/core/shared.d.ts.map +1 -1
  47. package/dist/core/utils/index.d.ts +52 -41
  48. package/dist/core/utils/index.d.ts.map +1 -1
  49. package/dist/core-Cjl7GUu8.js +717 -0
  50. package/dist/core-Cjl7GUu8.js.map +1 -0
  51. package/dist/core-DnlyjbF2.js +112 -0
  52. package/dist/core-DnlyjbF2.js.map +1 -0
  53. package/dist/core.es.mjs +45 -44
  54. package/dist/custom-directives-7wAShnnd.js +9 -0
  55. package/dist/custom-directives-7wAShnnd.js.map +1 -0
  56. package/dist/devtools/devtools.d.ts +212 -0
  57. package/dist/devtools/devtools.d.ts.map +1 -0
  58. package/dist/devtools/index.d.ts +20 -0
  59. package/dist/devtools/index.d.ts.map +1 -0
  60. package/dist/devtools/types.d.ts +69 -0
  61. package/dist/devtools/types.d.ts.map +1 -0
  62. package/dist/devtools-D2fQLhDN.js +122 -0
  63. package/dist/devtools-D2fQLhDN.js.map +1 -0
  64. package/dist/devtools.es.mjs +19 -0
  65. package/dist/dnd/draggable.d.ts +51 -0
  66. package/dist/dnd/draggable.d.ts.map +1 -0
  67. package/dist/dnd/droppable.d.ts +38 -0
  68. package/dist/dnd/droppable.d.ts.map +1 -0
  69. package/dist/dnd/index.d.ts +47 -0
  70. package/dist/dnd/index.d.ts.map +1 -0
  71. package/dist/dnd/sortable.d.ts +43 -0
  72. package/dist/dnd/sortable.d.ts.map +1 -0
  73. package/dist/dnd/types.d.ts +250 -0
  74. package/dist/dnd/types.d.ts.map +1 -0
  75. package/dist/dnd-B8EgyzaI.js +244 -0
  76. package/dist/dnd-B8EgyzaI.js.map +1 -0
  77. package/dist/dnd.es.mjs +6 -0
  78. package/dist/env-NeVmr4Gf.js +19 -0
  79. package/dist/env-NeVmr4Gf.js.map +1 -0
  80. package/dist/forms/create-form.d.ts +49 -0
  81. package/dist/forms/create-form.d.ts.map +1 -0
  82. package/dist/forms/index.d.ts +39 -0
  83. package/dist/forms/index.d.ts.map +1 -0
  84. package/dist/forms/types.d.ts +139 -0
  85. package/dist/forms/types.d.ts.map +1 -0
  86. package/dist/forms/validators.d.ts +179 -0
  87. package/dist/forms/validators.d.ts.map +1 -0
  88. package/dist/forms-C3yovgH9.js +141 -0
  89. package/dist/forms-C3yovgH9.js.map +1 -0
  90. package/dist/forms.es.mjs +14 -0
  91. package/dist/full.d.ts +35 -7
  92. package/dist/full.d.ts.map +1 -1
  93. package/dist/full.es.mjs +182 -91
  94. package/dist/full.iife.js +47 -31
  95. package/dist/full.iife.js.map +1 -1
  96. package/dist/full.umd.js +47 -31
  97. package/dist/full.umd.js.map +1 -1
  98. package/dist/i18n/formatting.d.ts +40 -0
  99. package/dist/i18n/formatting.d.ts.map +1 -0
  100. package/dist/i18n/i18n.d.ts +48 -0
  101. package/dist/i18n/i18n.d.ts.map +1 -0
  102. package/dist/i18n/index.d.ts +57 -0
  103. package/dist/i18n/index.d.ts.map +1 -0
  104. package/dist/i18n/translate.d.ts +83 -0
  105. package/dist/i18n/translate.d.ts.map +1 -0
  106. package/dist/i18n/types.d.ts +156 -0
  107. package/dist/i18n/types.d.ts.map +1 -0
  108. package/dist/i18n-BnnhTFOS.js +89 -0
  109. package/dist/i18n-BnnhTFOS.js.map +1 -0
  110. package/dist/i18n.es.mjs +6 -0
  111. package/dist/index.d.ts +11 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.es.mjs +227 -136
  114. package/dist/media/battery.d.ts +35 -0
  115. package/dist/media/battery.d.ts.map +1 -0
  116. package/dist/media/breakpoints.d.ts +51 -0
  117. package/dist/media/breakpoints.d.ts.map +1 -0
  118. package/dist/media/clipboard.d.ts +30 -0
  119. package/dist/media/clipboard.d.ts.map +1 -0
  120. package/dist/media/device-sensors.d.ts +54 -0
  121. package/dist/media/device-sensors.d.ts.map +1 -0
  122. package/dist/media/geolocation.d.ts +38 -0
  123. package/dist/media/geolocation.d.ts.map +1 -0
  124. package/dist/media/index.d.ts +42 -0
  125. package/dist/media/index.d.ts.map +1 -0
  126. package/dist/media/media-query.d.ts +36 -0
  127. package/dist/media/media-query.d.ts.map +1 -0
  128. package/dist/media/network.d.ts +35 -0
  129. package/dist/media/network.d.ts.map +1 -0
  130. package/dist/media/types.d.ts +173 -0
  131. package/dist/media/types.d.ts.map +1 -0
  132. package/dist/media/viewport.d.ts +32 -0
  133. package/dist/media/viewport.d.ts.map +1 -0
  134. package/dist/media-Di2Ta22s.js +340 -0
  135. package/dist/media-Di2Ta22s.js.map +1 -0
  136. package/dist/media.es.mjs +12 -0
  137. package/dist/motion/index.d.ts +7 -3
  138. package/dist/motion/index.d.ts.map +1 -1
  139. package/dist/motion/morph.d.ts +27 -0
  140. package/dist/motion/morph.d.ts.map +1 -0
  141. package/dist/motion/parallax.d.ts +30 -0
  142. package/dist/motion/parallax.d.ts.map +1 -0
  143. package/dist/motion/reduced-motion.d.ts +36 -3
  144. package/dist/motion/reduced-motion.d.ts.map +1 -1
  145. package/dist/motion/types.d.ts +58 -0
  146. package/dist/motion/types.d.ts.map +1 -1
  147. package/dist/motion/typewriter.d.ts +31 -0
  148. package/dist/motion/typewriter.d.ts.map +1 -0
  149. package/dist/motion-qPj_TYGv.js +530 -0
  150. package/dist/motion-qPj_TYGv.js.map +1 -0
  151. package/dist/motion.es.mjs +27 -23
  152. package/dist/{view-C70lA3vf.js → mount-SM07RUa6.js} +166 -160
  153. package/dist/mount-SM07RUa6.js.map +1 -0
  154. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  155. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  156. package/dist/{platform-Dr9b6fsq.js → platform-CPbCprb6.js} +21 -22
  157. package/dist/{platform-Dr9b6fsq.js.map → platform-CPbCprb6.js.map} +1 -1
  158. package/dist/platform.es.mjs +2 -2
  159. package/dist/plugin/index.d.ts +22 -0
  160. package/dist/plugin/index.d.ts.map +1 -0
  161. package/dist/plugin/registry.d.ts +108 -0
  162. package/dist/plugin/registry.d.ts.map +1 -0
  163. package/dist/plugin/types.d.ts +110 -0
  164. package/dist/plugin/types.d.ts.map +1 -0
  165. package/dist/plugin-cPoOHFLY.js +64 -0
  166. package/dist/plugin-cPoOHFLY.js.map +1 -0
  167. package/dist/plugin.es.mjs +9 -0
  168. package/dist/reactive/computed.d.ts +7 -0
  169. package/dist/reactive/computed.d.ts.map +1 -1
  170. package/dist/reactive-Cfv0RK6x.js +233 -0
  171. package/dist/reactive-Cfv0RK6x.js.map +1 -0
  172. package/dist/reactive.es.mjs +19 -20
  173. package/dist/registry-CWf368tT.js +26 -0
  174. package/dist/registry-CWf368tT.js.map +1 -0
  175. package/dist/router/bq-link.d.ts +112 -0
  176. package/dist/router/bq-link.d.ts.map +1 -0
  177. package/dist/router/constraints.d.ts +9 -0
  178. package/dist/router/constraints.d.ts.map +1 -0
  179. package/dist/router/index.d.ts +14 -6
  180. package/dist/router/index.d.ts.map +1 -1
  181. package/dist/router/match.d.ts +0 -1
  182. package/dist/router/match.d.ts.map +1 -1
  183. package/dist/router/path-pattern.d.ts +14 -0
  184. package/dist/router/path-pattern.d.ts.map +1 -0
  185. package/dist/router/query.d.ts.map +1 -1
  186. package/dist/router/router.d.ts +3 -1
  187. package/dist/router/router.d.ts.map +1 -1
  188. package/dist/router/types.d.ts +48 -4
  189. package/dist/router/types.d.ts.map +1 -1
  190. package/dist/router/use-route.d.ts +50 -0
  191. package/dist/router/use-route.d.ts.map +1 -0
  192. package/dist/router/utils.d.ts +3 -0
  193. package/dist/router/utils.d.ts.map +1 -1
  194. package/dist/router-BrthaP_z.js +473 -0
  195. package/dist/router-BrthaP_z.js.map +1 -0
  196. package/dist/router.es.mjs +13 -10
  197. package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
  198. package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
  199. package/dist/security/index.d.ts +2 -2
  200. package/dist/security/index.d.ts.map +1 -1
  201. package/dist/security.es.mjs +1 -1
  202. package/dist/ssr/hydrate.d.ts +65 -0
  203. package/dist/ssr/hydrate.d.ts.map +1 -0
  204. package/dist/ssr/index.d.ts +59 -0
  205. package/dist/ssr/index.d.ts.map +1 -0
  206. package/dist/ssr/render.d.ts +62 -0
  207. package/dist/ssr/render.d.ts.map +1 -0
  208. package/dist/ssr/serialize.d.ts +118 -0
  209. package/dist/ssr/serialize.d.ts.map +1 -0
  210. package/dist/ssr/types.d.ts +70 -0
  211. package/dist/ssr/types.d.ts.map +1 -0
  212. package/dist/ssr-B2qd_WBB.js +248 -0
  213. package/dist/ssr-B2qd_WBB.js.map +1 -0
  214. package/dist/ssr.es.mjs +9 -0
  215. package/dist/store/create-store.d.ts.map +1 -1
  216. package/dist/store/index.d.ts +1 -1
  217. package/dist/store/index.d.ts.map +1 -1
  218. package/dist/store/persisted.d.ts +38 -4
  219. package/dist/store/persisted.d.ts.map +1 -1
  220. package/dist/store/types.d.ts +138 -1
  221. package/dist/store/types.d.ts.map +1 -1
  222. package/dist/store/utils.d.ts +2 -2
  223. package/dist/store/utils.d.ts.map +1 -1
  224. package/dist/store-DWpyH6p5.js +338 -0
  225. package/dist/store-DWpyH6p5.js.map +1 -0
  226. package/dist/store.es.mjs +11 -10
  227. package/dist/storybook/index.d.ts.map +1 -1
  228. package/dist/storybook.es.mjs +1 -1
  229. package/dist/storybook.es.mjs.map +1 -1
  230. package/dist/testing/index.d.ts +23 -0
  231. package/dist/testing/index.d.ts.map +1 -0
  232. package/dist/testing/testing.d.ts +156 -0
  233. package/dist/testing/testing.d.ts.map +1 -0
  234. package/dist/testing/types.d.ts +134 -0
  235. package/dist/testing/types.d.ts.map +1 -0
  236. package/dist/testing-CsqjNUyy.js +224 -0
  237. package/dist/testing-CsqjNUyy.js.map +1 -0
  238. package/dist/testing.es.mjs +9 -0
  239. package/dist/type-guards-Do9DWgNp.js +44 -0
  240. package/dist/type-guards-Do9DWgNp.js.map +1 -0
  241. package/dist/untrack-DJVQQ2WM.js +33 -0
  242. package/dist/untrack-DJVQQ2WM.js.map +1 -0
  243. package/dist/view/custom-directives.d.ts +20 -0
  244. package/dist/view/custom-directives.d.ts.map +1 -0
  245. package/dist/view/evaluate.d.ts.map +1 -1
  246. package/dist/view/process.d.ts.map +1 -1
  247. package/dist/view.es.mjs +9 -9
  248. package/package.json +177 -141
  249. package/src/a11y/announce.ts +131 -0
  250. package/src/a11y/audit.ts +314 -0
  251. package/src/a11y/index.ts +68 -0
  252. package/src/a11y/media-preferences.ts +255 -0
  253. package/src/a11y/roving-tab-index.ts +164 -0
  254. package/src/a11y/skip-link.ts +255 -0
  255. package/src/a11y/trap-focus.ts +184 -0
  256. package/src/a11y/types.ts +183 -0
  257. package/src/component/component.ts +104 -29
  258. package/src/component/html.ts +5 -5
  259. package/src/component/index.ts +2 -0
  260. package/src/component/library.ts +26 -2
  261. package/src/component/scope.ts +212 -0
  262. package/src/component/types.ts +94 -40
  263. package/src/core/collection.ts +707 -628
  264. package/src/core/element.ts +981 -774
  265. package/src/core/env.ts +60 -0
  266. package/src/core/index.ts +49 -48
  267. package/src/core/shared.ts +62 -13
  268. package/src/core/utils/index.ts +148 -83
  269. package/src/devtools/devtools.ts +410 -0
  270. package/src/devtools/index.ts +48 -0
  271. package/src/devtools/types.ts +104 -0
  272. package/src/dnd/draggable.ts +296 -0
  273. package/src/dnd/droppable.ts +228 -0
  274. package/src/dnd/index.ts +62 -0
  275. package/src/dnd/sortable.ts +307 -0
  276. package/src/dnd/types.ts +293 -0
  277. package/src/forms/create-form.ts +278 -0
  278. package/src/forms/index.ts +65 -0
  279. package/src/forms/types.ts +154 -0
  280. package/src/forms/validators.ts +265 -0
  281. package/src/full.ts +253 -2
  282. package/src/i18n/formatting.ts +67 -0
  283. package/src/i18n/i18n.ts +200 -0
  284. package/src/i18n/index.ts +67 -0
  285. package/src/i18n/translate.ts +182 -0
  286. package/src/i18n/types.ts +171 -0
  287. package/src/index.ts +108 -36
  288. package/src/media/battery.ts +116 -0
  289. package/src/media/breakpoints.ts +131 -0
  290. package/src/media/clipboard.ts +80 -0
  291. package/src/media/device-sensors.ts +158 -0
  292. package/src/media/geolocation.ts +119 -0
  293. package/src/media/index.ts +76 -0
  294. package/src/media/media-query.ts +92 -0
  295. package/src/media/network.ts +115 -0
  296. package/src/media/types.ts +177 -0
  297. package/src/media/viewport.ts +84 -0
  298. package/src/motion/index.ts +57 -48
  299. package/src/motion/morph.ts +151 -0
  300. package/src/motion/parallax.ts +120 -0
  301. package/src/motion/reduced-motion.ts +66 -17
  302. package/src/motion/types.ts +271 -208
  303. package/src/motion/typewriter.ts +164 -0
  304. package/src/plugin/index.ts +37 -0
  305. package/src/plugin/registry.ts +269 -0
  306. package/src/plugin/types.ts +137 -0
  307. package/src/reactive/computed.ts +130 -92
  308. package/src/router/bq-link.ts +279 -0
  309. package/src/router/constraints.ts +201 -0
  310. package/src/router/index.ts +49 -41
  311. package/src/router/match.ts +312 -106
  312. package/src/router/path-pattern.ts +52 -0
  313. package/src/router/query.ts +38 -35
  314. package/src/router/router.ts +402 -211
  315. package/src/router/types.ts +139 -93
  316. package/src/router/use-route.ts +68 -0
  317. package/src/router/utils.ts +157 -116
  318. package/src/security/index.ts +2 -7
  319. package/src/security/sanitize.ts +70 -70
  320. package/src/security/trusted-html.ts +71 -71
  321. package/src/ssr/hydrate.ts +82 -0
  322. package/src/ssr/index.ts +70 -0
  323. package/src/ssr/render.ts +508 -0
  324. package/src/ssr/serialize.ts +296 -0
  325. package/src/ssr/types.ts +81 -0
  326. package/src/store/create-store.ts +467 -329
  327. package/src/store/define-store.ts +49 -49
  328. package/src/store/index.ts +27 -22
  329. package/src/store/mapping.ts +74 -74
  330. package/src/store/persisted.ts +206 -19
  331. package/src/store/types.ts +157 -2
  332. package/src/store/utils.ts +135 -141
  333. package/src/store/watch.ts +53 -53
  334. package/src/storybook/index.ts +2 -1
  335. package/src/testing/index.ts +42 -0
  336. package/src/testing/testing.ts +593 -0
  337. package/src/testing/types.ts +170 -0
  338. package/src/view/custom-directives.ts +30 -0
  339. package/src/view/evaluate.ts +292 -290
  340. package/src/view/process.ts +108 -92
  341. package/dist/component-BEQgt5hl.js +0 -600
  342. package/dist/component-BEQgt5hl.js.map +0 -1
  343. package/dist/core-BGQJVw0-.js +0 -35
  344. package/dist/core-BGQJVw0-.js.map +0 -1
  345. package/dist/core-CCEabVHl.js +0 -648
  346. package/dist/core-CCEabVHl.js.map +0 -1
  347. package/dist/effect-AFRW_Plg.js +0 -84
  348. package/dist/effect-AFRW_Plg.js.map +0 -1
  349. package/dist/motion-D9TcHxOF.js +0 -415
  350. package/dist/motion-D9TcHxOF.js.map +0 -1
  351. package/dist/reactive-DSkct0dO.js +0 -254
  352. package/dist/reactive-DSkct0dO.js.map +0 -1
  353. package/dist/router-CbDhl8rS.js +0 -188
  354. package/dist/router-CbDhl8rS.js.map +0 -1
  355. package/dist/store-BwDvI45q.js +0 -263
  356. package/dist/store-BwDvI45q.js.map +0 -1
  357. package/dist/untrack-B0rVscTc.js +0 -7
  358. package/dist/untrack-B0rVscTc.js.map +0 -1
  359. package/dist/view-C70lA3vf.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Sortable list with animated reordering via pointer events.
3
+ *
4
+ * Makes children of a container sortable by dragging. Items are
5
+ * rearranged in the DOM with optional CSS animation.
6
+ *
7
+ * @module bquery/dnd
8
+ */
9
+ import type { SortableHandle, SortableOptions } from './types';
10
+ /**
11
+ * Makes the children of a container sortable by dragging.
12
+ *
13
+ * Features:
14
+ * - Pointer event based (touch + mouse)
15
+ * - Animated reordering with configurable duration
16
+ * - Axis constraint (vertical or horizontal)
17
+ * - Optional drag handle
18
+ * - Placeholder element during sort
19
+ * - Callbacks: `onSortStart`, `onSortMove`, `onSortEnd`
20
+ *
21
+ * @param container - The container element whose children will be sortable
22
+ * @param options - Configuration options
23
+ * @returns A handle with `destroy()`, `disable()`, and `enable()` methods
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { sortable } from '@bquery/bquery/dnd';
28
+ *
29
+ * const handle = sortable(document.querySelector('#list'), {
30
+ * items: 'li',
31
+ * axis: 'y',
32
+ * animationDuration: 200,
33
+ * onSortEnd: ({ oldIndex, newIndex }) => {
34
+ * console.log(`Moved from ${oldIndex} to ${newIndex}`);
35
+ * },
36
+ * });
37
+ *
38
+ * // Later:
39
+ * handle.destroy();
40
+ * ```
41
+ */
42
+ export declare const sortable: (container: HTMLElement, options?: SortableOptions) => SortableHandle;
43
+ //# sourceMappingURL=sortable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortable.d.ts","sourceRoot":"","sources":["../../src/dnd/sortable.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA6C9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,WAAW,EAAE,UAAS,eAAoB,KAAG,cA4NhF,CAAC"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Type definitions for the bQuery Drag & Drop module.
3
+ *
4
+ * @module bquery/dnd
5
+ */
6
+ /**
7
+ * Axis constraint for draggable elements.
8
+ * - `'x'` — horizontal only
9
+ * - `'y'` — vertical only
10
+ * - `'both'` — free movement (default)
11
+ */
12
+ export type DragAxis = 'x' | 'y' | 'both';
13
+ /**
14
+ * Position coordinates in pixels.
15
+ */
16
+ export interface DragPosition {
17
+ /** Horizontal position in pixels. */
18
+ x: number;
19
+ /** Vertical position in pixels. */
20
+ y: number;
21
+ }
22
+ /**
23
+ * A bounding rectangle used to constrain drag movement.
24
+ */
25
+ export interface BoundsRect {
26
+ /** Minimum X coordinate (left edge). */
27
+ left: number;
28
+ /** Minimum Y coordinate (top edge). */
29
+ top: number;
30
+ /** Maximum X coordinate (right edge). */
31
+ right: number;
32
+ /** Maximum Y coordinate (bottom edge). */
33
+ bottom: number;
34
+ }
35
+ /**
36
+ * Bounds constraint for draggable elements.
37
+ * - `'parent'` — constrain to parent element's bounds
38
+ * - A CSS selector string — constrain to the matched element's bounds
39
+ * - A `BoundsRect` — constrain to explicit coordinates
40
+ */
41
+ export type DragBounds = 'parent' | string | BoundsRect;
42
+ /**
43
+ * Data passed to all drag event callbacks.
44
+ */
45
+ export interface DragEventData {
46
+ /** The dragged element. */
47
+ element: HTMLElement;
48
+ /** Current position relative to the initial position (0,0 at start). */
49
+ position: DragPosition;
50
+ /** Movement delta since the last event. */
51
+ delta: DragPosition;
52
+ /** The original pointer event. */
53
+ event: PointerEvent;
54
+ }
55
+ /**
56
+ * Configuration options for `draggable()`.
57
+ */
58
+ export interface DraggableOptions {
59
+ /**
60
+ * Axis constraint for movement.
61
+ * @default 'both'
62
+ */
63
+ axis?: DragAxis;
64
+ /**
65
+ * Bounds constraint. Restricts the element's movement to within the
66
+ * specified area.
67
+ */
68
+ bounds?: DragBounds;
69
+ /**
70
+ * CSS selector for a drag handle. If provided, only pointer events
71
+ * on matching child elements will initiate a drag.
72
+ */
73
+ handle?: string;
74
+ /**
75
+ * Whether to show a ghost/clone preview during drag instead of
76
+ * moving the original element. The ghost follows the pointer while
77
+ * the original stays in place.
78
+ * @default false
79
+ */
80
+ ghost?: boolean;
81
+ /**
82
+ * CSS class applied to the ghost element.
83
+ * @default 'bq-drag-ghost'
84
+ */
85
+ ghostClass?: string;
86
+ /**
87
+ * CSS class applied to the element while it is being dragged.
88
+ * @default 'bq-dragging'
89
+ */
90
+ draggingClass?: string;
91
+ /**
92
+ * Whether the element is initially disabled for dragging.
93
+ * @default false
94
+ */
95
+ disabled?: boolean;
96
+ /**
97
+ * Called when a drag operation starts.
98
+ */
99
+ onDragStart?: (data: DragEventData) => void;
100
+ /**
101
+ * Called continuously during drag movement.
102
+ */
103
+ onDrag?: (data: DragEventData) => void;
104
+ /**
105
+ * Called when a drag operation ends.
106
+ */
107
+ onDragEnd?: (data: DragEventData) => void;
108
+ }
109
+ /**
110
+ * Handle returned by `draggable()` for controlling the drag behavior.
111
+ */
112
+ export interface DraggableHandle {
113
+ /** Remove all event listeners and clean up. */
114
+ destroy: () => void;
115
+ /** Disable dragging. */
116
+ disable: () => void;
117
+ /** Re-enable dragging. */
118
+ enable: () => void;
119
+ /** Whether dragging is currently enabled. */
120
+ readonly enabled: boolean;
121
+ }
122
+ /**
123
+ * Data passed to droppable event callbacks.
124
+ */
125
+ export interface DropEventData {
126
+ /** The drop zone element. */
127
+ zone: HTMLElement;
128
+ /** The dragged element entering/leaving/dropping onto the zone. */
129
+ dragged: HTMLElement;
130
+ /** The original pointer event. */
131
+ event: PointerEvent;
132
+ }
133
+ /**
134
+ * Configuration options for `droppable()`.
135
+ */
136
+ export interface DroppableOptions {
137
+ /**
138
+ * CSS class applied to the zone while a draggable element is over it.
139
+ * @default 'bq-drop-over'
140
+ */
141
+ overClass?: string;
142
+ /**
143
+ * CSS selector or predicate to filter which dragged elements are
144
+ * accepted. If a string, only elements matching the selector can
145
+ * be dropped. If a function, return `true` to accept.
146
+ */
147
+ accept?: string | ((el: HTMLElement) => boolean);
148
+ /**
149
+ * Called when a dragged element enters the drop zone.
150
+ */
151
+ onDragEnter?: (data: DropEventData) => void;
152
+ /**
153
+ * Called while a dragged element is over the drop zone.
154
+ */
155
+ onDragOver?: (data: DropEventData) => void;
156
+ /**
157
+ * Called when a dragged element leaves the drop zone.
158
+ */
159
+ onDragLeave?: (data: DropEventData) => void;
160
+ /**
161
+ * Called when a dragged element is dropped onto the zone.
162
+ */
163
+ onDrop?: (data: DropEventData) => void;
164
+ }
165
+ /**
166
+ * Handle returned by `droppable()` for controlling the drop zone.
167
+ */
168
+ export interface DroppableHandle {
169
+ /** Remove all event listeners and clean up. */
170
+ destroy: () => void;
171
+ }
172
+ /**
173
+ * Data passed to sortable event callbacks.
174
+ */
175
+ export interface SortEventData {
176
+ /** The container element. */
177
+ container: HTMLElement;
178
+ /** The item being moved. */
179
+ item: HTMLElement;
180
+ /** The old index before the move. */
181
+ oldIndex: number;
182
+ /** The new index after the move. */
183
+ newIndex: number;
184
+ }
185
+ /**
186
+ * Configuration options for `sortable()`.
187
+ */
188
+ export interface SortableOptions {
189
+ /**
190
+ * CSS selector for the sortable items within the container.
191
+ * @default '> *'
192
+ */
193
+ items?: string;
194
+ /**
195
+ * Axis constraint for sorting.
196
+ * @default 'y'
197
+ */
198
+ axis?: 'x' | 'y';
199
+ /**
200
+ * CSS selector for a drag handle within each item. If provided,
201
+ * only pointer events on handle elements initiate sorting.
202
+ */
203
+ handle?: string;
204
+ /**
205
+ * CSS class applied to the placeholder element during sorting.
206
+ * @default 'bq-sort-placeholder'
207
+ */
208
+ placeholderClass?: string;
209
+ /**
210
+ * CSS class applied to the item being sorted.
211
+ * @default 'bq-sorting'
212
+ */
213
+ sortingClass?: string;
214
+ /**
215
+ * Duration of the reorder animation in milliseconds.
216
+ * @default 200
217
+ */
218
+ animationDuration?: number;
219
+ /**
220
+ * Whether sorting is initially disabled.
221
+ * @default false
222
+ */
223
+ disabled?: boolean;
224
+ /**
225
+ * Called when sorting starts.
226
+ */
227
+ onSortStart?: (data: SortEventData) => void;
228
+ /**
229
+ * Called when an item is moved to a new position.
230
+ */
231
+ onSortMove?: (data: SortEventData) => void;
232
+ /**
233
+ * Called when sorting ends and the item is placed.
234
+ */
235
+ onSortEnd?: (data: SortEventData) => void;
236
+ }
237
+ /**
238
+ * Handle returned by `sortable()` for controlling the sortable list.
239
+ */
240
+ export interface SortableHandle {
241
+ /** Remove all event listeners and clean up. */
242
+ destroy: () => void;
243
+ /** Disable sorting. */
244
+ disable: () => void;
245
+ /** Re-enable sorting. */
246
+ enable: () => void;
247
+ /** Whether sorting is currently enabled. */
248
+ readonly enabled: boolean;
249
+ }
250
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dnd/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ var $ = /* @__PURE__ */ new Map(), N = () => {
2
+ const e = Array.from($.values());
3
+ return e[e.length - 1];
4
+ }, k = (e, r) => {
5
+ if (typeof r == "object") return r;
6
+ let f = null;
7
+ if (r === "parent" ? f = e.parentElement : f = document.querySelector(r), !f) return null;
8
+ const p = f.getBoundingClientRect(), l = e.getBoundingClientRect(), g = parseFloat(e.style.left || "0"), y = parseFloat(e.style.top || "0"), v = Number.isNaN(g) ? 0 : g, c = Number.isNaN(y) ? 0 : y;
9
+ return {
10
+ left: p.left - l.left + v,
11
+ top: p.top - l.top + c,
12
+ right: p.right - l.right + v + (p.width - l.width),
13
+ bottom: p.bottom - l.bottom + c + (p.height - l.height)
14
+ };
15
+ }, H = (e, r) => r ? {
16
+ x: Math.max(r.left, Math.min(r.right, e.x)),
17
+ y: Math.max(r.top, Math.min(r.bottom, e.y))
18
+ } : e, ee = (e, r = {}) => {
19
+ const { axis: f = "both", bounds: p, handle: l, ghost: g = !1, ghostClass: y = "bq-drag-ghost", draggingClass: v = "bq-dragging", onDragStart: c, onDrag: P, onDragEnd: D } = r;
20
+ let x = !r.disabled, L = !1, o = {
21
+ x: 0,
22
+ y: 0
23
+ }, n = {
24
+ x: 0,
25
+ y: 0
26
+ }, E = {
27
+ x: 0,
28
+ y: 0
29
+ }, h = null, a = null;
30
+ const i = e.style.touchAction, I = e.style.userSelect, b = (t) => ({
31
+ element: e,
32
+ position: { ...n },
33
+ delta: {
34
+ x: n.x - E.x,
35
+ y: n.y - E.y
36
+ },
37
+ event: t
38
+ }), X = () => {
39
+ const t = e.cloneNode(!0), u = e.getBoundingClientRect();
40
+ return t.classList.add(y), t.style.position = "fixed", t.style.left = `${u.left}px`, t.style.top = `${u.top}px`, t.style.width = `${u.width}px`, t.style.height = `${u.height}px`, t.style.pointerEvents = "none", t.style.zIndex = "999999", t.style.opacity = "0.7", t.style.margin = "0", document.body.appendChild(t), t;
41
+ }, S = () => {
42
+ h && (h.remove(), h = null), a = null;
43
+ }, A = (t) => {
44
+ if (x && !(l && !t.target.closest(l))) {
45
+ if (t.preventDefault(), L = !0, o = {
46
+ x: t.clientX,
47
+ y: t.clientY
48
+ }, E = { ...n }, e.classList.add(v), e.setPointerCapture(t.pointerId), g) {
49
+ const u = e.getBoundingClientRect();
50
+ a = {
51
+ x: u.left,
52
+ y: u.top
53
+ }, h = X();
54
+ }
55
+ $.set(e, {
56
+ element: e,
57
+ position: n
58
+ }), c?.(b(t));
59
+ }
60
+ }, M = (t) => {
61
+ if (!L) return;
62
+ t.preventDefault(), E = { ...n };
63
+ let u = n.x + (t.clientX - o.x), s = n.y + (t.clientY - o.y);
64
+ o = {
65
+ x: t.clientX,
66
+ y: t.clientY
67
+ }, f === "x" && (s = n.y), f === "y" && (u = n.x);
68
+ let m = {
69
+ x: u,
70
+ y: s
71
+ };
72
+ if (p) {
73
+ const w = k(e, p);
74
+ m = H(m, w);
75
+ }
76
+ if (n = m, $.set(e, {
77
+ element: e,
78
+ position: n
79
+ }), g && h) {
80
+ const w = a ?? {
81
+ x: e.getBoundingClientRect().left,
82
+ y: e.getBoundingClientRect().top
83
+ };
84
+ h.style.left = `${w.x + n.x}px`, h.style.top = `${w.y + n.y}px`;
85
+ } else e.style.transform = `translate(${n.x}px, ${n.y}px)`;
86
+ P?.(b(t));
87
+ }, d = (t) => {
88
+ if (L) {
89
+ L = !1, e.classList.remove(v);
90
+ try {
91
+ typeof e.releasePointerCapture == "function" && (typeof e.hasPointerCapture != "function" || e.hasPointerCapture(t.pointerId)) && e.releasePointerCapture(t.pointerId);
92
+ } catch {
93
+ } finally {
94
+ S(), $.delete(e), D?.(b(t));
95
+ }
96
+ }
97
+ };
98
+ return e.addEventListener("pointerdown", A), e.addEventListener("pointermove", M), e.addEventListener("pointerup", d), e.addEventListener("pointercancel", d), e.style.touchAction = "none", e.style.userSelect = "none", {
99
+ destroy: () => {
100
+ e.removeEventListener("pointerdown", A), e.removeEventListener("pointermove", M), e.removeEventListener("pointerup", d), e.removeEventListener("pointercancel", d), S(), $.delete(e), e.style.touchAction = i, e.style.userSelect = I, e.classList.remove(v);
101
+ },
102
+ disable: () => {
103
+ x = !1;
104
+ },
105
+ enable: () => {
106
+ x = !0;
107
+ },
108
+ get enabled() {
109
+ return x;
110
+ }
111
+ };
112
+ }, J = { passive: !0 }, B = /* @__PURE__ */ new Set(), R = null, C = null, U = () => Array.from(B), K = () => typeof document < "u" && typeof document.addEventListener == "function" && typeof document.removeEventListener == "function" && typeof requestAnimationFrame == "function" && typeof cancelAnimationFrame == "function", Q = (e) => {
113
+ for (const r of U()) r.handlePointerMove(e);
114
+ }, V = () => {
115
+ C = null;
116
+ const e = R;
117
+ R = null, e && Q(e);
118
+ }, T = (e) => {
119
+ R = e, C === null && (C = requestAnimationFrame(V));
120
+ }, G = (e) => {
121
+ C !== null && (cancelAnimationFrame(C), C = null, R = null);
122
+ for (const r of U()) r.handlePointerUp(e);
123
+ }, W = (e) => {
124
+ B.size === 0 && (document.addEventListener("pointermove", T, J), document.addEventListener("pointerup", G)), B.add(e);
125
+ }, Z = (e) => {
126
+ B.delete(e), B.size === 0 && (document.removeEventListener("pointermove", T), document.removeEventListener("pointerup", G), C !== null && (cancelAnimationFrame(C), C = null), R = null);
127
+ }, O = (e, r) => r ? typeof r == "string" ? e.matches(r) : r(e) : !0, te = (e, r = {}) => {
128
+ const { overClass: f = "bq-drop-over", accept: p, onDragEnter: l, onDragOver: g, onDragLeave: y, onDrop: v } = r;
129
+ if (!K()) return { destroy: () => {
130
+ } };
131
+ let c = !1, P = null;
132
+ const D = (a, i) => ({
133
+ zone: e,
134
+ dragged: a,
135
+ event: i
136
+ }), x = (a) => {
137
+ const i = e.getBoundingClientRect();
138
+ return a.clientX >= i.left && a.clientX <= i.right && a.clientY >= i.top && a.clientY <= i.bottom;
139
+ }, L = () => N()?.element ?? P, o = (a, i = P) => {
140
+ c && (c = !1, e.classList.remove(f), i && y?.(D(i, a)), P = null);
141
+ }, h = {
142
+ handlePointerMove: (a) => {
143
+ const i = N()?.element ?? null, I = x(a);
144
+ if (!(i !== null && i !== e && O(i, p)) || !I) {
145
+ o(a, i ?? P);
146
+ return;
147
+ }
148
+ c ? g?.(D(i, a)) : (c = !0, P = i, e.classList.add(f), l?.(D(i, a)));
149
+ },
150
+ handlePointerUp: (a) => {
151
+ const i = L(), I = x(a), b = i !== null && i !== e && O(i, p);
152
+ I && b && i && v?.(D(i, a)), c && (c = !1, e.classList.remove(f)), P = null;
153
+ }
154
+ };
155
+ return W(h), { destroy: () => {
156
+ Z(h), e.classList.remove(f), P = null;
157
+ } };
158
+ }, F = (e, r) => Array.from(e.querySelectorAll(r)), _ = (e, r, f, p) => {
159
+ let l = null;
160
+ for (let g = 0; g < e.length; g++) {
161
+ const y = e[g];
162
+ if (y === p) continue;
163
+ const v = y.getBoundingClientRect(), c = r - (f === "y" ? v.top + v.height / 2 : v.left + v.width / 2);
164
+ (l === null || c < 0 && c > l.distance || l.distance >= 0 && c < 0 && Math.abs(c) < Math.abs(l.distance)) && c < 0 && (l = {
165
+ element: y,
166
+ index: g,
167
+ distance: c
168
+ });
169
+ }
170
+ return l ? {
171
+ element: l.element,
172
+ index: l.index
173
+ } : null;
174
+ }, ne = (e, r = {}) => {
175
+ const { items: f = ":scope > *", axis: p = "y", handle: l, placeholderClass: g = "bq-sort-placeholder", sortingClass: y = "bq-sorting", animationDuration: v = 200, onSortStart: c, onSortMove: P, onSortEnd: D } = r;
176
+ let x = !r.disabled, L = !1, o = null, n = null, E = -1, h = 0, a = 0, i = 0, I = 0;
177
+ const b = (d, t, u) => ({
178
+ container: e,
179
+ item: d,
180
+ oldIndex: t,
181
+ newIndex: u
182
+ }), X = (d) => {
183
+ if (!x) return;
184
+ const t = d.target, u = F(e, f);
185
+ let s = null;
186
+ for (const w of u) if (w.contains(t)) {
187
+ s = w;
188
+ break;
189
+ }
190
+ if (!s || l && !t.closest(l)) return;
191
+ d.preventDefault(), L = !0, o = s, E = u.indexOf(s), h = d.clientY, a = d.clientX;
192
+ const m = s.getBoundingClientRect();
193
+ i = m.top, I = m.left, n = document.createElement("div"), n.classList.add(g), n.style.width = `${m.width}px`, n.style.height = `${m.height}px`, n.style.boxSizing = "border-box", s.classList.add(y), s.style.position = "fixed", s.style.width = `${m.width}px`, s.style.height = `${m.height}px`, s.style.left = `${m.left}px`, s.style.top = `${m.top}px`, s.style.zIndex = "999999", s.style.pointerEvents = "none", s.style.margin = "0", s.parentNode?.insertBefore(n, s), e.setPointerCapture(d.pointerId), c?.(b(s, E, E));
194
+ }, S = (d) => {
195
+ if (!L || !o || !n) return;
196
+ d.preventDefault();
197
+ const t = d.clientX - a, u = d.clientY - h;
198
+ p === "y" ? o.style.top = `${i + u}px` : o.style.left = `${I + t}px`;
199
+ const s = _(F(e, f), p === "y" ? d.clientY : d.clientX, p, o);
200
+ s ? e.insertBefore(n, s.element) : e.appendChild(n);
201
+ const m = Array.from(e.children).indexOf(n);
202
+ P?.(b(o, E, m));
203
+ }, A = (d) => {
204
+ if (!L || !o || !n) return;
205
+ L = !1;
206
+ const t = o, u = Array.from(e.children).indexOf(n), s = n.getBoundingClientRect(), m = t.getBoundingClientRect();
207
+ if (v > 0) {
208
+ const w = s.left - m.left, j = s.top - m.top;
209
+ t.style.transition = `transform ${v}ms ease`, t.style.transform = `translate(${w}px, ${j}px)`;
210
+ let q = !1, Y = null;
211
+ const z = () => {
212
+ q || (q = !0, Y !== null && (window.clearTimeout(Y), Y = null), M(), D?.(b(t, E, u)));
213
+ };
214
+ Y = window.setTimeout(() => {
215
+ z();
216
+ }, v + 50), t.addEventListener("transitionend", z, { once: !0 });
217
+ } else
218
+ M(), D?.(b(t, E, u));
219
+ e.releasePointerCapture(d.pointerId);
220
+ }, M = () => {
221
+ !o || !n || (n.parentNode?.insertBefore(o, n), n.remove(), n = null, o.classList.remove(y), o.style.position = "", o.style.width = "", o.style.height = "", o.style.left = "", o.style.top = "", o.style.zIndex = "", o.style.pointerEvents = "", o.style.margin = "", o.style.transition = "", o.style.transform = "", o = null);
222
+ };
223
+ return e.addEventListener("pointerdown", X), e.addEventListener("pointermove", S), e.addEventListener("pointerup", A), e.addEventListener("pointercancel", A), e.style.touchAction = "none", {
224
+ destroy: () => {
225
+ e.removeEventListener("pointerdown", X), e.removeEventListener("pointermove", S), e.removeEventListener("pointerup", A), e.removeEventListener("pointercancel", A), e.style.touchAction = "", L && M();
226
+ },
227
+ disable: () => {
228
+ x = !1;
229
+ },
230
+ enable: () => {
231
+ x = !0;
232
+ },
233
+ get enabled() {
234
+ return x;
235
+ }
236
+ };
237
+ };
238
+ export {
239
+ te as n,
240
+ ee as r,
241
+ ne as t
242
+ };
243
+
244
+ //# sourceMappingURL=dnd-B8EgyzaI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dnd-B8EgyzaI.js","names":[],"sources":["../src/dnd/draggable.ts","../src/dnd/droppable.ts","../src/dnd/sortable.ts"],"sourcesContent":["/**\r\n * Make an element draggable using pointer events.\r\n *\r\n * Uses Pointer Events (not HTML5 Drag & Drop) for reliable\r\n * cross-platform behavior including touch support.\r\n *\r\n * @module bquery/dnd\r\n */\r\n\r\nimport type {\r\n BoundsRect,\r\n DragBounds,\r\n DragEventData,\r\n DragPosition,\r\n DraggableHandle,\r\n DraggableOptions,\r\n} from './types';\r\n\r\n/** Global registry of active draggable elements for drop zone detection. */\r\nconst activeDrags = new Map<HTMLElement, { element: HTMLElement; position: DragPosition }>();\r\n\r\n/**\r\n * Returns the currently active drag state, if any.\r\n * Used internally by `droppable()` to detect drag interactions.\r\n * @internal\r\n */\r\nexport const getActiveDrag = (): { element: HTMLElement; position: DragPosition } | undefined => {\r\n const entries = Array.from(activeDrags.values());\r\n return entries[entries.length - 1];\r\n};\r\n\r\n/**\r\n * Resolves a `DragBounds` value to an absolute `BoundsRect`.\r\n * @internal\r\n */\r\nconst resolveBounds = (el: HTMLElement, bounds: DragBounds): BoundsRect | null => {\r\n if (typeof bounds === 'object') {\r\n return bounds;\r\n }\r\n\r\n let target: HTMLElement | null = null;\r\n\r\n if (bounds === 'parent') {\r\n target = el.parentElement;\r\n } else {\r\n target = document.querySelector(bounds) as HTMLElement | null;\r\n }\r\n\r\n if (!target) return null;\r\n\r\n const rect = target.getBoundingClientRect();\r\n const elRect = el.getBoundingClientRect();\r\n const rawLeft = parseFloat(el.style.left || '0');\r\n const rawTop = parseFloat(el.style.top || '0');\r\n const leftOffset = Number.isNaN(rawLeft) ? 0 : rawLeft;\r\n const topOffset = Number.isNaN(rawTop) ? 0 : rawTop;\r\n\r\n return {\r\n left: rect.left - elRect.left + leftOffset,\r\n top: rect.top - elRect.top + topOffset,\r\n right: rect.right - elRect.right + leftOffset + (rect.width - elRect.width),\r\n bottom: rect.bottom - elRect.bottom + topOffset + (rect.height - elRect.height),\r\n };\r\n};\r\n\r\n/**\r\n * Clamp a position within bounds.\r\n * @internal\r\n */\r\nconst clampPosition = (pos: DragPosition, bounds: BoundsRect | null): DragPosition => {\r\n if (!bounds) return pos;\r\n return {\r\n x: Math.max(bounds.left, Math.min(bounds.right, pos.x)),\r\n y: Math.max(bounds.top, Math.min(bounds.bottom, pos.y)),\r\n };\r\n};\r\n\r\n/**\r\n * Makes an element draggable using pointer events.\r\n *\r\n * Features:\r\n * - Touch and mouse support via Pointer Events\r\n * - Axis locking (`x`, `y`, or `both`)\r\n * - Bounds constraint (parent, selector, or explicit rect)\r\n * - Optional drag handle\r\n * - Ghost/clone preview during drag\r\n * - Callbacks: `onDragStart`, `onDrag`, `onDragEnd`\r\n *\r\n * @param el - The element to make draggable\r\n * @param options - Configuration options\r\n * @returns A handle with `destroy()`, `disable()`, and `enable()` methods\r\n *\r\n * @example\r\n * ```ts\r\n * import { draggable } from '@bquery/bquery/dnd';\r\n *\r\n * const handle = draggable(document.querySelector('#box'), {\r\n * axis: 'both',\r\n * bounds: 'parent',\r\n * onDragEnd: ({ position }) => {\r\n * console.log('Dropped at', position.x, position.y);\r\n * },\r\n * });\r\n *\r\n * // Later:\r\n * handle.destroy();\r\n * ```\r\n */\r\nexport const draggable = (el: HTMLElement, options: DraggableOptions = {}): DraggableHandle => {\r\n const {\r\n axis = 'both',\r\n bounds,\r\n handle,\r\n ghost = false,\r\n ghostClass = 'bq-drag-ghost',\r\n draggingClass = 'bq-dragging',\r\n onDragStart,\r\n onDrag,\r\n onDragEnd,\r\n } = options;\r\n\r\n let enabled = !options.disabled;\r\n let isDragging = false;\r\n let startPointer: DragPosition = { x: 0, y: 0 };\r\n let currentPosition: DragPosition = { x: 0, y: 0 };\r\n let previousPosition: DragPosition = { x: 0, y: 0 };\r\n let ghostEl: HTMLElement | null = null;\r\n let ghostStartPosition: DragPosition | null = null;\r\n const previousTouchAction = el.style.touchAction;\r\n const previousUserSelect = el.style.userSelect;\r\n\r\n const createEventData = (event: PointerEvent): DragEventData => ({\r\n element: el,\r\n position: { ...currentPosition },\r\n delta: {\r\n x: currentPosition.x - previousPosition.x,\r\n y: currentPosition.y - previousPosition.y,\r\n },\r\n event,\r\n });\r\n\r\n const createGhost = (): HTMLElement => {\r\n const clone = el.cloneNode(true) as HTMLElement;\r\n const rect = el.getBoundingClientRect();\r\n clone.classList.add(ghostClass);\r\n clone.style.position = 'fixed';\r\n clone.style.left = `${rect.left}px`;\r\n clone.style.top = `${rect.top}px`;\r\n clone.style.width = `${rect.width}px`;\r\n clone.style.height = `${rect.height}px`;\r\n clone.style.pointerEvents = 'none';\r\n clone.style.zIndex = '999999';\r\n clone.style.opacity = '0.7';\r\n clone.style.margin = '0';\r\n document.body.appendChild(clone);\r\n return clone;\r\n };\r\n\r\n const removeGhost = (): void => {\r\n if (ghostEl) {\r\n ghostEl.remove();\r\n ghostEl = null;\r\n }\r\n ghostStartPosition = null;\r\n };\r\n\r\n const onPointerDown = (e: PointerEvent): void => {\r\n if (!enabled) return;\r\n\r\n // Check handle constraint\r\n if (handle) {\r\n const target = e.target as Element;\r\n if (!target.closest(handle)) return;\r\n }\r\n\r\n e.preventDefault();\r\n isDragging = true;\r\n startPointer = { x: e.clientX, y: e.clientY };\r\n previousPosition = { ...currentPosition };\r\n\r\n el.classList.add(draggingClass);\r\n el.setPointerCapture(e.pointerId);\r\n\r\n if (ghost) {\r\n const rect = el.getBoundingClientRect();\r\n ghostStartPosition = { x: rect.left, y: rect.top };\r\n ghostEl = createGhost();\r\n }\r\n\r\n // Register in global active drags\r\n activeDrags.set(el, { element: el, position: currentPosition });\r\n\r\n onDragStart?.(createEventData(e));\r\n };\r\n\r\n const onPointerMove = (e: PointerEvent): void => {\r\n if (!isDragging) return;\r\n\r\n e.preventDefault();\r\n previousPosition = { ...currentPosition };\r\n\r\n let newX = currentPosition.x + (e.clientX - startPointer.x);\r\n let newY = currentPosition.y + (e.clientY - startPointer.y);\r\n\r\n // Reset start pointer to current for delta calculation\r\n startPointer = { x: e.clientX, y: e.clientY };\r\n\r\n // Apply axis constraint\r\n if (axis === 'x') newY = currentPosition.y;\r\n if (axis === 'y') newX = currentPosition.x;\r\n\r\n let newPos: DragPosition = { x: newX, y: newY };\r\n\r\n // Apply bounds constraint\r\n if (bounds) {\r\n const resolvedBounds = resolveBounds(el, bounds);\r\n newPos = clampPosition(newPos, resolvedBounds);\r\n }\r\n\r\n currentPosition = newPos;\r\n\r\n // Update active drag position\r\n activeDrags.set(el, { element: el, position: currentPosition });\r\n\r\n // Apply the position\r\n if (ghost && ghostEl) {\r\n const start = ghostStartPosition ?? {\r\n x: el.getBoundingClientRect().left,\r\n y: el.getBoundingClientRect().top,\r\n };\r\n ghostEl.style.left = `${start.x + currentPosition.x}px`;\r\n ghostEl.style.top = `${start.y + currentPosition.y}px`;\r\n } else {\r\n el.style.transform = `translate(${currentPosition.x}px, ${currentPosition.y}px)`;\r\n }\r\n\r\n onDrag?.(createEventData(e));\r\n };\r\n\r\n const onPointerUp = (e: PointerEvent): void => {\r\n if (!isDragging) return;\r\n\r\n isDragging = false;\r\n el.classList.remove(draggingClass);\r\n try {\r\n if (\r\n typeof el.releasePointerCapture === 'function' &&\r\n (typeof el.hasPointerCapture !== 'function' || el.hasPointerCapture(e.pointerId))\r\n ) {\r\n el.releasePointerCapture(e.pointerId);\r\n }\r\n } catch {\r\n // Pointer capture may already be released in some interrupted drag flows.\r\n } finally {\r\n removeGhost();\r\n\r\n // Remove from active drags\r\n activeDrags.delete(el);\r\n\r\n onDragEnd?.(createEventData(e));\r\n }\r\n };\r\n\r\n // Attach listeners\r\n el.addEventListener('pointerdown', onPointerDown);\r\n el.addEventListener('pointermove', onPointerMove);\r\n el.addEventListener('pointerup', onPointerUp);\r\n el.addEventListener('pointercancel', onPointerUp);\r\n\r\n // Prevent default drag behavior\r\n el.style.touchAction = 'none';\r\n el.style.userSelect = 'none';\r\n\r\n return {\r\n destroy: () => {\r\n el.removeEventListener('pointerdown', onPointerDown);\r\n el.removeEventListener('pointermove', onPointerMove);\r\n el.removeEventListener('pointerup', onPointerUp);\r\n el.removeEventListener('pointercancel', onPointerUp);\r\n removeGhost();\r\n activeDrags.delete(el);\r\n el.style.touchAction = previousTouchAction;\r\n el.style.userSelect = previousUserSelect;\r\n el.classList.remove(draggingClass);\r\n },\r\n disable: () => {\r\n enabled = false;\r\n },\r\n enable: () => {\r\n enabled = true;\r\n },\r\n get enabled() {\r\n return enabled;\r\n },\r\n };\r\n};\r\n","/**\r\n * Define drop zones for draggable elements.\r\n *\r\n * Drop zones detect when draggable elements enter, move over,\r\n * leave, or are dropped onto them using pointer event hit-testing.\r\n *\r\n * @module bquery/dnd\r\n */\r\n\r\nimport { getActiveDrag } from './draggable';\r\nimport type { DropEventData, DroppableHandle, DroppableOptions } from './types';\r\n\r\ntype DroppableListener = {\r\n handlePointerMove: (event: PointerEvent) => void;\r\n handlePointerUp: (event: PointerEvent) => void;\r\n};\r\n\r\nconst passivePointerMoveListenerOptions = { passive: true } as const;\r\n\r\nconst droppableListeners = new Set<DroppableListener>();\r\nlet queuedPointerMove: PointerEvent | null = null;\r\nlet pointerMoveFrame: number | null = null;\r\n\r\nconst getDroppableListenersSnapshot = (): DroppableListener[] => Array.from(droppableListeners);\r\n\r\nconst hasDroppableEnvironment = (): boolean => {\r\n return (\r\n typeof document !== 'undefined' &&\r\n typeof document.addEventListener === 'function' &&\r\n typeof document.removeEventListener === 'function' &&\r\n typeof requestAnimationFrame === 'function' &&\r\n typeof cancelAnimationFrame === 'function'\r\n );\r\n};\r\n\r\nconst dispatchPointerMove = (event: PointerEvent): void => {\r\n for (const listener of getDroppableListenersSnapshot()) {\r\n listener.handlePointerMove(event);\r\n }\r\n};\r\n\r\nconst flushPointerMove = (): void => {\r\n pointerMoveFrame = null;\r\n const event = queuedPointerMove;\r\n queuedPointerMove = null;\r\n if (!event) return;\r\n dispatchPointerMove(event);\r\n};\r\n\r\nconst handleDocumentPointerMove = (event: PointerEvent): void => {\r\n queuedPointerMove = event;\r\n if (pointerMoveFrame === null) {\r\n pointerMoveFrame = requestAnimationFrame(flushPointerMove);\r\n }\r\n};\r\n\r\nconst handleDocumentPointerUp = (event: PointerEvent): void => {\r\n if (pointerMoveFrame !== null) {\r\n cancelAnimationFrame(pointerMoveFrame);\r\n pointerMoveFrame = null;\r\n queuedPointerMove = null;\r\n }\r\n\r\n for (const listener of getDroppableListenersSnapshot()) {\r\n listener.handlePointerUp(event);\r\n }\r\n};\r\n\r\nconst registerDroppableListener = (listener: DroppableListener): void => {\r\n if (droppableListeners.size === 0) {\r\n document.addEventListener(\r\n 'pointermove',\r\n handleDocumentPointerMove,\r\n passivePointerMoveListenerOptions\r\n );\r\n document.addEventListener('pointerup', handleDocumentPointerUp);\r\n }\r\n\r\n droppableListeners.add(listener);\r\n};\r\n\r\nconst unregisterDroppableListener = (listener: DroppableListener): void => {\r\n droppableListeners.delete(listener);\r\n\r\n if (droppableListeners.size !== 0) return;\r\n\r\n document.removeEventListener('pointermove', handleDocumentPointerMove);\r\n document.removeEventListener('pointerup', handleDocumentPointerUp);\r\n if (pointerMoveFrame !== null) {\r\n cancelAnimationFrame(pointerMoveFrame);\r\n pointerMoveFrame = null;\r\n }\r\n queuedPointerMove = null;\r\n};\r\n\r\n/**\r\n * Checks whether a dragged element is accepted by the drop zone.\r\n * @internal\r\n */\r\nconst isAccepted = (dragged: HTMLElement, accept: DroppableOptions['accept']): boolean => {\r\n if (!accept) return true;\r\n if (typeof accept === 'string') return dragged.matches(accept);\r\n return accept(dragged);\r\n};\r\n\r\n/**\r\n * Defines an element as a drop zone.\r\n *\r\n * Drop zones respond to draggable elements being moved over them\r\n * by firing callbacks and applying CSS classes. They work with\r\n * the `draggable()` function from this module.\r\n *\r\n * @param el - The drop zone element\r\n * @param options - Configuration options\r\n * @returns A handle with a `destroy()` method\r\n *\r\n * @example\r\n * ```ts\r\n * import { droppable } from '@bquery/bquery/dnd';\r\n *\r\n * const handle = droppable(document.querySelector('#dropzone'), {\r\n * accept: '.draggable-item',\r\n * overClass: 'drop-active',\r\n * onDrop: ({ dragged }) => {\r\n * console.log('Dropped:', dragged);\r\n * },\r\n * });\r\n *\r\n * // Later:\r\n * handle.destroy();\r\n * ```\r\n */\r\nexport const droppable = (el: HTMLElement, options: DroppableOptions = {}): DroppableHandle => {\r\n const {\r\n overClass = 'bq-drop-over',\r\n accept,\r\n onDragEnter,\r\n onDragOver,\r\n onDragLeave,\r\n onDrop,\r\n } = options;\r\n\r\n if (!hasDroppableEnvironment()) {\r\n return {\r\n destroy: () => {},\r\n };\r\n }\r\n\r\n let isOver = false;\r\n let currentDragged: HTMLElement | null = null;\r\n\r\n const createEventData = (dragged: HTMLElement, event: PointerEvent): DropEventData => ({\r\n zone: el,\r\n dragged,\r\n event,\r\n });\r\n\r\n const isPointerInside = (event: PointerEvent): boolean => {\r\n const rect = el.getBoundingClientRect();\r\n return (\r\n event.clientX >= rect.left &&\r\n event.clientX <= rect.right &&\r\n event.clientY >= rect.top &&\r\n event.clientY <= rect.bottom\r\n );\r\n };\r\n\r\n const resolveDraggedElement = (): HTMLElement | null => {\r\n return getActiveDrag()?.element ?? currentDragged;\r\n };\r\n\r\n const clearOverState = (event: PointerEvent, dragged = currentDragged): void => {\r\n if (!isOver) return;\r\n isOver = false;\r\n el.classList.remove(overClass);\r\n if (dragged) {\r\n onDragLeave?.(createEventData(dragged, event));\r\n }\r\n currentDragged = null;\r\n };\r\n\r\n const handlePointerMove = (e: PointerEvent): void => {\r\n const dragged = getActiveDrag()?.element ?? null;\r\n const isInside = isPointerInside(e);\r\n const acceptsDragged = dragged !== null && dragged !== el && isAccepted(dragged, accept);\r\n\r\n if (!acceptsDragged || !isInside) {\r\n clearOverState(e, dragged ?? currentDragged);\r\n return;\r\n }\r\n\r\n if (!isOver) {\r\n isOver = true;\r\n currentDragged = dragged;\r\n el.classList.add(overClass);\r\n onDragEnter?.(createEventData(dragged, e));\r\n } else {\r\n onDragOver?.(createEventData(dragged, e));\r\n }\r\n };\r\n\r\n const handlePointerUp = (e: PointerEvent): void => {\r\n const dragged = resolveDraggedElement();\r\n const isInside = isPointerInside(e);\r\n const acceptsDragged = dragged !== null && dragged !== el && isAccepted(dragged, accept);\r\n\r\n if (isInside && acceptsDragged && dragged) {\r\n onDrop?.(createEventData(dragged, e));\r\n }\r\n\r\n if (isOver) {\r\n isOver = false;\r\n el.classList.remove(overClass);\r\n }\r\n currentDragged = null;\r\n };\r\n\r\n const listener: DroppableListener = { handlePointerMove, handlePointerUp };\r\n registerDroppableListener(listener);\r\n\r\n return {\r\n destroy: () => {\r\n unregisterDroppableListener(listener);\r\n el.classList.remove(overClass);\r\n currentDragged = null;\r\n },\r\n };\r\n};\r\n","/**\r\n * Sortable list with animated reordering via pointer events.\r\n *\r\n * Makes children of a container sortable by dragging. Items are\r\n * rearranged in the DOM with optional CSS animation.\r\n *\r\n * @module bquery/dnd\r\n */\r\n\r\nimport type { SortEventData, SortableHandle, SortableOptions } from './types';\r\n\r\n/**\r\n * Gets the sortable items within a container.\r\n * @internal\r\n */\r\nconst getItems = (container: HTMLElement, selector: string): HTMLElement[] => {\r\n return Array.from(container.querySelectorAll(selector)) as HTMLElement[];\r\n};\r\n\r\n/**\r\n * Finds the closest sortable item to a given Y (or X) position.\r\n * @internal\r\n */\r\nconst getClosestItem = (\r\n items: HTMLElement[],\r\n clientPos: number,\r\n axis: 'x' | 'y',\r\n dragged: HTMLElement\r\n): { element: HTMLElement; index: number } | null => {\r\n let closest: { element: HTMLElement; index: number; distance: number } | null = null;\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i];\r\n if (item === dragged) continue;\r\n\r\n const rect = item.getBoundingClientRect();\r\n const mid = axis === 'y' ? rect.top + rect.height / 2 : rect.left + rect.width / 2;\r\n const distance = clientPos - mid;\r\n\r\n if (\r\n closest === null ||\r\n (distance < 0 && distance > closest.distance) ||\r\n (closest.distance >= 0 && distance < 0 && Math.abs(distance) < Math.abs(closest.distance))\r\n ) {\r\n // Find the item we're just before\r\n if (distance < 0) {\r\n closest = { element: item, index: i, distance };\r\n }\r\n }\r\n }\r\n\r\n return closest ? { element: closest.element, index: closest.index } : null;\r\n};\r\n\r\n/**\r\n * Makes the children of a container sortable by dragging.\r\n *\r\n * Features:\r\n * - Pointer event based (touch + mouse)\r\n * - Animated reordering with configurable duration\r\n * - Axis constraint (vertical or horizontal)\r\n * - Optional drag handle\r\n * - Placeholder element during sort\r\n * - Callbacks: `onSortStart`, `onSortMove`, `onSortEnd`\r\n *\r\n * @param container - The container element whose children will be sortable\r\n * @param options - Configuration options\r\n * @returns A handle with `destroy()`, `disable()`, and `enable()` methods\r\n *\r\n * @example\r\n * ```ts\r\n * import { sortable } from '@bquery/bquery/dnd';\r\n *\r\n * const handle = sortable(document.querySelector('#list'), {\r\n * items: 'li',\r\n * axis: 'y',\r\n * animationDuration: 200,\r\n * onSortEnd: ({ oldIndex, newIndex }) => {\r\n * console.log(`Moved from ${oldIndex} to ${newIndex}`);\r\n * },\r\n * });\r\n *\r\n * // Later:\r\n * handle.destroy();\r\n * ```\r\n */\r\nexport const sortable = (container: HTMLElement, options: SortableOptions = {}): SortableHandle => {\r\n const {\r\n items: itemSelector = ':scope > *',\r\n axis = 'y',\r\n handle,\r\n placeholderClass = 'bq-sort-placeholder',\r\n sortingClass = 'bq-sorting',\r\n animationDuration = 200,\r\n onSortStart,\r\n onSortMove,\r\n onSortEnd,\r\n } = options;\r\n\r\n let enabled = !options.disabled;\r\n let isDragging = false;\r\n let dragItem: HTMLElement | null = null;\r\n let placeholder: HTMLElement | null = null;\r\n let startIndex = -1;\r\n let startPointerY = 0;\r\n let startPointerX = 0;\r\n let itemStartTop = 0;\r\n let itemStartLeft = 0;\r\n\r\n const createEventData = (item: HTMLElement, oldIdx: number, newIdx: number): SortEventData => ({\r\n container,\r\n item,\r\n oldIndex: oldIdx,\r\n newIndex: newIdx,\r\n });\r\n\r\n const onPointerDown = (e: PointerEvent): void => {\r\n if (!enabled) return;\r\n\r\n const target = e.target as HTMLElement;\r\n\r\n // Find the item being dragged\r\n const items = getItems(container, itemSelector);\r\n let item: HTMLElement | null = null;\r\n\r\n for (const it of items) {\r\n if (it.contains(target)) {\r\n item = it;\r\n break;\r\n }\r\n }\r\n\r\n if (!item) return;\r\n\r\n // Check handle constraint\r\n if (handle && !target.closest(handle)) return;\r\n\r\n e.preventDefault();\r\n\r\n isDragging = true;\r\n dragItem = item;\r\n startIndex = items.indexOf(item);\r\n startPointerY = e.clientY;\r\n startPointerX = e.clientX;\r\n\r\n const rect = item.getBoundingClientRect();\r\n itemStartTop = rect.top;\r\n itemStartLeft = rect.left;\r\n\r\n // Create placeholder\r\n placeholder = document.createElement('div');\r\n placeholder.classList.add(placeholderClass);\r\n placeholder.style.width = `${rect.width}px`;\r\n placeholder.style.height = `${rect.height}px`;\r\n placeholder.style.boxSizing = 'border-box';\r\n\r\n // Style the dragged item\r\n item.classList.add(sortingClass);\r\n item.style.position = 'fixed';\r\n item.style.width = `${rect.width}px`;\r\n item.style.height = `${rect.height}px`;\r\n item.style.left = `${rect.left}px`;\r\n item.style.top = `${rect.top}px`;\r\n item.style.zIndex = '999999';\r\n item.style.pointerEvents = 'none';\r\n item.style.margin = '0';\r\n\r\n // Insert placeholder where the item was\r\n item.parentNode?.insertBefore(placeholder, item);\r\n\r\n container.setPointerCapture(e.pointerId);\r\n\r\n onSortStart?.(createEventData(item, startIndex, startIndex));\r\n };\r\n\r\n const onPointerMove = (e: PointerEvent): void => {\r\n if (!isDragging || !dragItem || !placeholder) return;\r\n\r\n e.preventDefault();\r\n\r\n const deltaX = e.clientX - startPointerX;\r\n const deltaY = e.clientY - startPointerY;\r\n\r\n // Move the dragged item\r\n if (axis === 'y') {\r\n dragItem.style.top = `${itemStartTop + deltaY}px`;\r\n } else {\r\n dragItem.style.left = `${itemStartLeft + deltaX}px`;\r\n }\r\n\r\n // Find the closest item to determine insertion point\r\n const items = getItems(container, itemSelector);\r\n const clientPos = axis === 'y' ? e.clientY : e.clientX;\r\n const closest = getClosestItem(items, clientPos, axis, dragItem);\r\n\r\n if (closest) {\r\n // Move placeholder before the closest element\r\n container.insertBefore(placeholder, closest.element);\r\n } else {\r\n // Append to end\r\n container.appendChild(placeholder);\r\n }\r\n\r\n const currentIndex = Array.from(container.children).indexOf(placeholder);\r\n onSortMove?.(createEventData(dragItem, startIndex, currentIndex));\r\n };\r\n\r\n const onPointerUp = (e: PointerEvent): void => {\r\n if (!isDragging || !dragItem || !placeholder) return;\r\n\r\n isDragging = false;\r\n const draggedItem = dragItem;\r\n\r\n // Get final index\r\n const newIndex = Array.from(container.children).indexOf(placeholder);\r\n\r\n // Animate the item back to the placeholder position\r\n const placeholderRect = placeholder.getBoundingClientRect();\r\n const itemRect = draggedItem.getBoundingClientRect();\r\n\r\n if (animationDuration > 0) {\r\n const deltaX = placeholderRect.left - itemRect.left;\r\n const deltaY = placeholderRect.top - itemRect.top;\r\n\r\n draggedItem.style.transition = `transform ${animationDuration}ms ease`;\r\n draggedItem.style.transform = `translate(${deltaX}px, ${deltaY}px)`;\r\n\r\n let finalized = false;\r\n let timeoutId: number | null = null;\r\n const finalize = (): void => {\r\n if (finalized) return;\r\n finalized = true;\r\n if (timeoutId !== null) {\r\n window.clearTimeout(timeoutId);\r\n timeoutId = null;\r\n }\r\n resetDragItem();\r\n onSortEnd?.(createEventData(draggedItem, startIndex, newIndex));\r\n };\r\n timeoutId = window.setTimeout(() => {\r\n finalize();\r\n }, animationDuration + 50);\r\n\r\n draggedItem.addEventListener('transitionend', finalize, { once: true });\r\n } else {\r\n resetDragItem();\r\n onSortEnd?.(createEventData(draggedItem, startIndex, newIndex));\r\n }\r\n\r\n container.releasePointerCapture(e.pointerId);\r\n };\r\n\r\n const resetDragItem = (): void => {\r\n if (!dragItem || !placeholder) return;\r\n\r\n // Insert the real item where the placeholder is\r\n placeholder.parentNode?.insertBefore(dragItem, placeholder);\r\n placeholder.remove();\r\n placeholder = null;\r\n\r\n // Reset styles\r\n dragItem.classList.remove(sortingClass);\r\n dragItem.style.position = '';\r\n dragItem.style.width = '';\r\n dragItem.style.height = '';\r\n dragItem.style.left = '';\r\n dragItem.style.top = '';\r\n dragItem.style.zIndex = '';\r\n dragItem.style.pointerEvents = '';\r\n dragItem.style.margin = '';\r\n dragItem.style.transition = '';\r\n dragItem.style.transform = '';\r\n\r\n dragItem = null;\r\n };\r\n\r\n container.addEventListener('pointerdown', onPointerDown);\r\n container.addEventListener('pointermove', onPointerMove);\r\n container.addEventListener('pointerup', onPointerUp);\r\n container.addEventListener('pointercancel', onPointerUp);\r\n\r\n // Prevent default touch behavior on container\r\n container.style.touchAction = 'none';\r\n\r\n return {\r\n destroy: () => {\r\n container.removeEventListener('pointerdown', onPointerDown);\r\n container.removeEventListener('pointermove', onPointerMove);\r\n container.removeEventListener('pointerup', onPointerUp);\r\n container.removeEventListener('pointercancel', onPointerUp);\r\n container.style.touchAction = '';\r\n\r\n if (isDragging) {\r\n resetDragItem();\r\n }\r\n },\r\n disable: () => {\r\n enabled = false;\r\n },\r\n enable: () => {\r\n enabled = true;\r\n },\r\n get enabled() {\r\n return enabled;\r\n },\r\n };\r\n};\r\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { n as r, r as o, t as e } from "./dnd-B8EgyzaI.js";
2
+ export {
3
+ o as draggable,
4
+ r as droppable,
5
+ e as sortable
6
+ };
@@ -0,0 +1,19 @@
1
+ var o = () => {
2
+ try {
3
+ const e = globalThis;
4
+ if (typeof e.__BQUERY_DEV__ == "boolean") return e.__BQUERY_DEV__;
5
+ const r = e.process?.env?.NODE_ENV;
6
+ if (typeof r == "string") return r !== "production";
7
+ const n = e.process?.versions?.node;
8
+ if (typeof n == "string" && n.length > 0) return !0;
9
+ const t = e.process?.release?.name;
10
+ return t === "node" || t === "io.js";
11
+ } catch {
12
+ return !1;
13
+ }
14
+ };
15
+ export {
16
+ o as t
17
+ };
18
+
19
+ //# sourceMappingURL=env-NeVmr4Gf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-NeVmr4Gf.js","names":[],"sources":["../src/core/env.ts"],"sourcesContent":["/**\r\n * Shared environment detection helpers.\r\n *\r\n * @internal\r\n */\r\n\r\ntype BQueryEnvGlobal = typeof globalThis & {\r\n __BQUERY_DEV__?: boolean;\r\n process?: {\r\n env?: {\r\n NODE_ENV?: string;\r\n };\r\n release?: {\r\n name?: string;\r\n };\r\n versions?: {\r\n node?: string;\r\n };\r\n };\r\n};\r\n\r\n/**\r\n * Returns whether development-only diagnostics should be enabled.\r\n *\r\n * Priority:\r\n * 1. Explicit global override via `globalThis.__BQUERY_DEV__`\r\n * 2. `process.env.NODE_ENV`\r\n * 3. Actual Node-like runtimes without `NODE_ENV` default to development\r\n * 4. Production-safe fallback (`false`)\r\n *\r\n * @internal\r\n */\r\nexport const detectDevEnvironment = (): boolean => {\r\n try {\r\n const globalObject = globalThis as BQueryEnvGlobal;\r\n\r\n if (typeof globalObject.__BQUERY_DEV__ === 'boolean') {\r\n return globalObject.__BQUERY_DEV__;\r\n }\r\n\r\n const nodeEnv = globalObject.process?.env?.NODE_ENV;\r\n if (typeof nodeEnv === 'string') {\r\n return nodeEnv !== 'production';\r\n }\r\n\r\n const nodeVersion = globalObject.process?.versions?.node;\r\n if (typeof nodeVersion === 'string' && nodeVersion.length > 0) {\r\n return true;\r\n }\r\n\r\n const releaseName = globalObject.process?.release?.name;\r\n if (releaseName === 'node' || releaseName === 'io.js') {\r\n return true;\r\n }\r\n\r\n return false;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n"],"mappings":"AAgCA,IAAa,IAAA,MAAsC;AACjD,MAAI;AACF,UAAM,IAAe;AAErB,QAAI,OAAO,EAAa,kBAAmB,UACzC,QAAO,EAAa;AAGtB,UAAM,IAAU,EAAa,SAAS,KAAK;AAC3C,QAAI,OAAO,KAAY,SACrB,QAAO,MAAY;AAGrB,UAAM,IAAc,EAAa,SAAS,UAAU;AACpD,QAAI,OAAO,KAAgB,YAAY,EAAY,SAAS,EAC1D,QAAO;AAGT,UAAM,IAAc,EAAa,SAAS,SAAS;AACnD,WAAI,MAAgB,UAAU,MAAgB;AAAA,UAKxC;AACN,WAAO;AAAA"}