@bquery/bquery 1.7.0 → 1.8.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 (262) hide show
  1. package/README.md +760 -716
  2. package/dist/{a11y-C5QOVvRn.js → a11y-DVBCy09c.js} +3 -3
  3. package/dist/a11y-DVBCy09c.js.map +1 -0
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/component/library.d.ts.map +1 -1
  6. package/dist/{component-CuuTijA6.js → component-L3-JfOFz.js} +5 -5
  7. package/dist/component-L3-JfOFz.js.map +1 -0
  8. package/dist/component.es.mjs +1 -1
  9. package/dist/{config-BW35FKuA.js → config-DhT9auRm.js} +1 -1
  10. package/dist/{config-BW35FKuA.js.map → config-DhT9auRm.js.map} +1 -1
  11. package/dist/{constraints-3lV9yyBw.js → constraints-D5RHQLmP.js} +1 -1
  12. package/dist/constraints-D5RHQLmP.js.map +1 -0
  13. package/dist/core/collection.d.ts +86 -0
  14. package/dist/core/collection.d.ts.map +1 -1
  15. package/dist/core/element.d.ts +28 -0
  16. package/dist/core/element.d.ts.map +1 -1
  17. package/dist/core/shared.d.ts +6 -0
  18. package/dist/core/shared.d.ts.map +1 -1
  19. package/dist/core-DdtZHzsS.js +168 -0
  20. package/dist/core-DdtZHzsS.js.map +1 -0
  21. package/dist/{core-Cjl7GUu8.js → core-EMYSLzaT.js} +289 -259
  22. package/dist/core-EMYSLzaT.js.map +1 -0
  23. package/dist/core.es.mjs +48 -47
  24. package/dist/{custom-directives-7wAShnnd.js → custom-directives-Dr4C5lVV.js} +1 -1
  25. package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
  26. package/dist/{devtools-D2fQLhDN.js → devtools-BhB2iDPT.js} +2 -2
  27. package/dist/devtools-BhB2iDPT.js.map +1 -0
  28. package/dist/devtools.es.mjs +1 -1
  29. package/dist/{dnd-B8EgyzaI.js → dnd-NwZBYh4l.js} +1 -1
  30. package/dist/dnd-NwZBYh4l.js.map +1 -0
  31. package/dist/dnd.es.mjs +1 -1
  32. package/dist/{env-NeVmr4Gf.js → env-CTdvLaH2.js} +1 -1
  33. package/dist/env-CTdvLaH2.js.map +1 -0
  34. package/dist/forms/create-form.d.ts.map +1 -1
  35. package/dist/forms/index.d.ts +3 -2
  36. package/dist/forms/index.d.ts.map +1 -1
  37. package/dist/forms/types.d.ts +46 -0
  38. package/dist/forms/types.d.ts.map +1 -1
  39. package/dist/forms/use-field.d.ts +34 -0
  40. package/dist/forms/use-field.d.ts.map +1 -0
  41. package/dist/forms/validators.d.ts +25 -0
  42. package/dist/forms/validators.d.ts.map +1 -1
  43. package/dist/forms-UcRHsYxC.js +227 -0
  44. package/dist/forms-UcRHsYxC.js.map +1 -0
  45. package/dist/forms.es.mjs +14 -12
  46. package/dist/full.d.ts +17 -26
  47. package/dist/full.d.ts.map +1 -1
  48. package/dist/full.es.mjs +206 -181
  49. package/dist/full.iife.js +33 -33
  50. package/dist/full.iife.js.map +1 -1
  51. package/dist/full.umd.js +33 -33
  52. package/dist/full.umd.js.map +1 -1
  53. package/dist/function-Cybd57JV.js +33 -0
  54. package/dist/function-Cybd57JV.js.map +1 -0
  55. package/dist/{i18n-BnnhTFOS.js → i18n-kuF6Ekj6.js} +3 -3
  56. package/dist/i18n-kuF6Ekj6.js.map +1 -0
  57. package/dist/i18n.es.mjs +1 -1
  58. package/dist/index.es.mjs +251 -228
  59. package/dist/media/breakpoints.d.ts.map +1 -1
  60. package/dist/media/types.d.ts +2 -2
  61. package/dist/media/types.d.ts.map +1 -1
  62. package/dist/{media-Di2Ta22s.js → media-i-fB5WxI.js} +3 -3
  63. package/dist/media-i-fB5WxI.js.map +1 -0
  64. package/dist/media.es.mjs +1 -1
  65. package/dist/{motion-qPj_TYGv.js → motion-BJsAuULb.js} +2 -2
  66. package/dist/motion-BJsAuULb.js.map +1 -0
  67. package/dist/motion.es.mjs +1 -1
  68. package/dist/{mount-SM07RUa6.js → mount-B4Y8bk8Z.js} +5 -5
  69. package/dist/mount-B4Y8bk8Z.js.map +1 -0
  70. package/dist/{platform-CPbCprb6.js → platform-Dw2gE3zI.js} +3 -3
  71. package/dist/{platform-CPbCprb6.js.map → platform-Dw2gE3zI.js.map} +1 -1
  72. package/dist/platform.es.mjs +2 -2
  73. package/dist/plugin/registry.d.ts.map +1 -1
  74. package/dist/{plugin-cPoOHFLY.js → plugin-C2WuC8SF.js} +20 -18
  75. package/dist/plugin-C2WuC8SF.js.map +1 -0
  76. package/dist/plugin.es.mjs +1 -1
  77. package/dist/reactive/async-data.d.ts +28 -3
  78. package/dist/reactive/async-data.d.ts.map +1 -1
  79. package/dist/reactive/computed.d.ts +3 -0
  80. package/dist/reactive/computed.d.ts.map +1 -1
  81. package/dist/reactive/effect.d.ts +3 -0
  82. package/dist/reactive/effect.d.ts.map +1 -1
  83. package/dist/reactive/http.d.ts +194 -0
  84. package/dist/reactive/http.d.ts.map +1 -0
  85. package/dist/reactive/index.d.ts +2 -2
  86. package/dist/reactive/index.d.ts.map +1 -1
  87. package/dist/reactive/pagination.d.ts +126 -0
  88. package/dist/reactive/pagination.d.ts.map +1 -0
  89. package/dist/reactive/polling.d.ts +55 -0
  90. package/dist/reactive/polling.d.ts.map +1 -0
  91. package/dist/reactive/readonly.d.ts +20 -1
  92. package/dist/reactive/readonly.d.ts.map +1 -1
  93. package/dist/reactive/rest.d.ts +293 -0
  94. package/dist/reactive/rest.d.ts.map +1 -0
  95. package/dist/reactive/scope.d.ts +140 -0
  96. package/dist/reactive/scope.d.ts.map +1 -0
  97. package/dist/reactive/signal.d.ts +16 -2
  98. package/dist/reactive/signal.d.ts.map +1 -1
  99. package/dist/reactive/to-value.d.ts +57 -0
  100. package/dist/reactive/to-value.d.ts.map +1 -0
  101. package/dist/reactive/websocket.d.ts +285 -0
  102. package/dist/reactive/websocket.d.ts.map +1 -0
  103. package/dist/reactive-DwkhUJfP.js +1148 -0
  104. package/dist/reactive-DwkhUJfP.js.map +1 -0
  105. package/dist/reactive.es.mjs +38 -19
  106. package/dist/{registry-CWf368tT.js → registry-B08iilIh.js} +1 -1
  107. package/dist/{registry-CWf368tT.js.map → registry-B08iilIh.js.map} +1 -1
  108. package/dist/router/constraints.d.ts.map +1 -1
  109. package/dist/router/index.d.ts +1 -1
  110. package/dist/router/index.d.ts.map +1 -1
  111. package/dist/router/router.d.ts.map +1 -1
  112. package/dist/router/state.d.ts +25 -2
  113. package/dist/router/state.d.ts.map +1 -1
  114. package/dist/router-CQikC9Ed.js +492 -0
  115. package/dist/router-CQikC9Ed.js.map +1 -0
  116. package/dist/router.es.mjs +9 -8
  117. package/dist/ssr/hydrate.d.ts.map +1 -1
  118. package/dist/{ssr-B2qd_WBB.js → ssr-_dAcGdzu.js} +4 -4
  119. package/dist/ssr-_dAcGdzu.js.map +1 -0
  120. package/dist/ssr.es.mjs +1 -1
  121. package/dist/store/persisted.d.ts.map +1 -1
  122. package/dist/{store-DWpyH6p5.js → store-Cb3gPRve.js} +7 -7
  123. package/dist/store-Cb3gPRve.js.map +1 -0
  124. package/dist/store.es.mjs +2 -2
  125. package/dist/storybook.es.mjs.map +1 -1
  126. package/dist/{testing-CsqjNUyy.js → testing-C5Sjfsna.js} +8 -8
  127. package/dist/testing-C5Sjfsna.js.map +1 -0
  128. package/dist/testing.es.mjs +1 -1
  129. package/dist/{type-guards-Do9DWgNp.js → type-guards-BMX2c0LP.js} +1 -1
  130. package/dist/{type-guards-Do9DWgNp.js.map → type-guards-BMX2c0LP.js.map} +1 -1
  131. package/dist/untrack-D0fnO5k2.js +36 -0
  132. package/dist/untrack-D0fnO5k2.js.map +1 -0
  133. package/dist/view/custom-directives.d.ts.map +1 -1
  134. package/dist/view.es.mjs +4 -4
  135. package/package.json +177 -177
  136. package/src/a11y/announce.ts +131 -131
  137. package/src/a11y/audit.ts +314 -314
  138. package/src/a11y/index.ts +68 -68
  139. package/src/a11y/media-preferences.ts +255 -255
  140. package/src/a11y/roving-tab-index.ts +164 -164
  141. package/src/a11y/skip-link.ts +255 -255
  142. package/src/a11y/trap-focus.ts +184 -184
  143. package/src/a11y/types.ts +183 -183
  144. package/src/component/component.ts +599 -599
  145. package/src/component/html.ts +153 -153
  146. package/src/component/index.ts +52 -52
  147. package/src/component/library.ts +540 -542
  148. package/src/component/scope.ts +212 -212
  149. package/src/component/types.ts +310 -310
  150. package/src/core/collection.ts +876 -707
  151. package/src/core/element.ts +1015 -981
  152. package/src/core/env.ts +60 -60
  153. package/src/core/index.ts +49 -49
  154. package/src/core/shared.ts +77 -62
  155. package/src/core/utils/index.ts +148 -148
  156. package/src/devtools/devtools.ts +410 -410
  157. package/src/devtools/index.ts +48 -48
  158. package/src/devtools/types.ts +104 -104
  159. package/src/dnd/draggable.ts +296 -296
  160. package/src/dnd/droppable.ts +228 -228
  161. package/src/dnd/index.ts +62 -62
  162. package/src/dnd/sortable.ts +307 -307
  163. package/src/dnd/types.ts +293 -293
  164. package/src/forms/create-form.ts +320 -278
  165. package/src/forms/index.ts +70 -65
  166. package/src/forms/types.ts +203 -154
  167. package/src/forms/use-field.ts +231 -0
  168. package/src/forms/validators.ts +294 -265
  169. package/src/full.ts +554 -480
  170. package/src/i18n/formatting.ts +67 -67
  171. package/src/i18n/i18n.ts +200 -200
  172. package/src/i18n/index.ts +67 -67
  173. package/src/i18n/translate.ts +182 -182
  174. package/src/i18n/types.ts +171 -171
  175. package/src/index.ts +108 -108
  176. package/src/media/battery.ts +116 -116
  177. package/src/media/breakpoints.ts +129 -131
  178. package/src/media/clipboard.ts +80 -80
  179. package/src/media/device-sensors.ts +158 -158
  180. package/src/media/geolocation.ts +119 -119
  181. package/src/media/index.ts +76 -76
  182. package/src/media/media-query.ts +92 -92
  183. package/src/media/network.ts +115 -115
  184. package/src/media/types.ts +177 -177
  185. package/src/media/viewport.ts +84 -84
  186. package/src/motion/index.ts +57 -57
  187. package/src/motion/morph.ts +151 -151
  188. package/src/motion/parallax.ts +120 -120
  189. package/src/motion/reduced-motion.ts +66 -66
  190. package/src/motion/types.ts +271 -271
  191. package/src/motion/typewriter.ts +164 -164
  192. package/src/plugin/index.ts +37 -37
  193. package/src/plugin/registry.ts +284 -269
  194. package/src/plugin/types.ts +137 -137
  195. package/src/reactive/async-data.ts +250 -29
  196. package/src/reactive/computed.ts +144 -130
  197. package/src/reactive/effect.ts +29 -6
  198. package/src/reactive/http.ts +790 -0
  199. package/src/reactive/index.ts +60 -0
  200. package/src/reactive/pagination.ts +317 -0
  201. package/src/reactive/polling.ts +179 -0
  202. package/src/reactive/readonly.ts +52 -8
  203. package/src/reactive/rest.ts +859 -0
  204. package/src/reactive/scope.ts +276 -0
  205. package/src/reactive/signal.ts +61 -1
  206. package/src/reactive/to-value.ts +71 -0
  207. package/src/reactive/websocket.ts +849 -0
  208. package/src/router/bq-link.ts +279 -279
  209. package/src/router/constraints.ts +204 -201
  210. package/src/router/index.ts +49 -49
  211. package/src/router/match.ts +312 -312
  212. package/src/router/path-pattern.ts +52 -52
  213. package/src/router/query.ts +38 -38
  214. package/src/router/router.ts +421 -402
  215. package/src/router/state.ts +51 -3
  216. package/src/router/types.ts +139 -139
  217. package/src/router/use-route.ts +68 -68
  218. package/src/router/utils.ts +157 -157
  219. package/src/security/index.ts +12 -12
  220. package/src/ssr/hydrate.ts +84 -82
  221. package/src/ssr/index.ts +70 -70
  222. package/src/ssr/render.ts +508 -508
  223. package/src/ssr/serialize.ts +296 -296
  224. package/src/ssr/types.ts +81 -81
  225. package/src/store/create-store.ts +467 -467
  226. package/src/store/index.ts +27 -27
  227. package/src/store/persisted.ts +245 -249
  228. package/src/store/types.ts +247 -247
  229. package/src/store/utils.ts +135 -135
  230. package/src/storybook/index.ts +480 -480
  231. package/src/testing/index.ts +42 -42
  232. package/src/testing/testing.ts +593 -593
  233. package/src/testing/types.ts +170 -170
  234. package/src/view/custom-directives.ts +28 -30
  235. package/src/view/evaluate.ts +292 -292
  236. package/src/view/process.ts +108 -108
  237. package/dist/a11y-C5QOVvRn.js.map +0 -1
  238. package/dist/component-CuuTijA6.js.map +0 -1
  239. package/dist/constraints-3lV9yyBw.js.map +0 -1
  240. package/dist/core-Cjl7GUu8.js.map +0 -1
  241. package/dist/core-DnlyjbF2.js +0 -112
  242. package/dist/core-DnlyjbF2.js.map +0 -1
  243. package/dist/custom-directives-7wAShnnd.js.map +0 -1
  244. package/dist/devtools-D2fQLhDN.js.map +0 -1
  245. package/dist/dnd-B8EgyzaI.js.map +0 -1
  246. package/dist/env-NeVmr4Gf.js.map +0 -1
  247. package/dist/forms-C3yovgH9.js +0 -141
  248. package/dist/forms-C3yovgH9.js.map +0 -1
  249. package/dist/i18n-BnnhTFOS.js.map +0 -1
  250. package/dist/media-Di2Ta22s.js.map +0 -1
  251. package/dist/motion-qPj_TYGv.js.map +0 -1
  252. package/dist/mount-SM07RUa6.js.map +0 -1
  253. package/dist/plugin-cPoOHFLY.js.map +0 -1
  254. package/dist/reactive-Cfv0RK6x.js +0 -233
  255. package/dist/reactive-Cfv0RK6x.js.map +0 -1
  256. package/dist/router-BrthaP_z.js +0 -473
  257. package/dist/router-BrthaP_z.js.map +0 -1
  258. package/dist/ssr-B2qd_WBB.js.map +0 -1
  259. package/dist/store-DWpyH6p5.js.map +0 -1
  260. package/dist/testing-CsqjNUyy.js.map +0 -1
  261. package/dist/untrack-DJVQQ2WM.js +0 -33
  262. package/dist/untrack-DJVQQ2WM.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-Cjl7GUu8.js","names":[],"sources":["../src/core/shared.ts","../src/core/dom.ts","../src/core/element.ts","../src/core/collection.ts","../src/core/selector.ts","../src/core/utils/array.ts","../src/core/utils/function.ts","../src/core/utils/misc.ts","../src/core/utils/number.ts","../src/core/utils/string.ts","../src/core/utils/index.ts"],"sourcesContent":["/**\r\n * Shared helpers for element wrappers.\r\n */\r\nexport type ElementList = Element[];\r\n\r\nexport const toElementList = (input: Element | ElementList): ElementList =>\r\n Array.isArray(input) ? input : [input];\r\n\r\nexport const applyAll = (elements: ElementList, action: (el: Element) => void) => {\r\n for (const el of elements) {\r\n action(el);\r\n }\r\n};\r\n\r\n/** @internal */\r\nexport const isHTMLElement = (element: Element | null | undefined): element is HTMLElement => {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n const view = element.ownerDocument?.defaultView;\r\n const HTMLElementCtor = view?.HTMLElement ?? globalThis.HTMLElement;\r\n return typeof HTMLElementCtor === 'function' && element instanceof HTMLElementCtor;\r\n};\r\n\r\n/**\r\n * Gets an element's outer size, optionally including margins.\r\n *\r\n * @internal\r\n */\r\nexport const getOuterSize = (\r\n element: Element | null | undefined,\r\n dimension: 'width' | 'height',\r\n includeMargin: boolean\r\n): number => {\r\n if (!isHTMLElement(element)) {\r\n return 0;\r\n }\r\n\r\n const size = dimension === 'width' ? element.offsetWidth : element.offsetHeight;\r\n if (!includeMargin) {\r\n return size;\r\n }\r\n\r\n const view = element.ownerDocument?.defaultView;\r\n if (!view || typeof view.getComputedStyle !== 'function') {\r\n return size;\r\n }\r\n\r\n const computedStyle = view.getComputedStyle(element);\r\n const startMargin = Number.parseFloat(\r\n computedStyle.getPropertyValue(dimension === 'width' ? 'margin-left' : 'margin-top')\r\n );\r\n const endMargin = Number.parseFloat(\r\n computedStyle.getPropertyValue(dimension === 'width' ? 'margin-right' : 'margin-bottom')\r\n );\r\n\r\n const safeStartMargin = Number.isNaN(startMargin) ? 0 : startMargin;\r\n const safeEndMargin = Number.isNaN(endMargin) ? 0 : endMargin;\r\n\r\n return size + safeStartMargin + safeEndMargin;\r\n};\r\n","import { sanitizeHtml } from '../security/sanitize';\nimport { applyAll, toElementList } from './shared';\n\nexport type InsertableContent = string | Element | Element[];\n\nexport const sanitizeContent = (html: string): string => sanitizeHtml(html);\n\nexport const setHtml = (element: Element, html: string): void => {\n element.innerHTML = sanitizeHtml(html);\n};\n\nexport const createElementFromHtml = (html: string): Element => {\n const template = document.createElement('template');\n template.innerHTML = sanitizeHtml(html);\n return template.content.firstElementChild ?? document.createElement('div');\n};\n\nexport const insertContent = (\n target: Element,\n content: InsertableContent,\n position: InsertPosition\n): void => {\n if (typeof content === 'string') {\n target.insertAdjacentHTML(position, sanitizeHtml(content));\n return;\n }\n\n const elements = toElementList(content);\n\n // For positions that insert at the beginning (afterbegin, afterend), reverse\n // the array to maintain the caller's order. For beforeend/beforebegin, keep order.\n const needsReverse = position === 'afterbegin' || position === 'afterend';\n const orderedElements = needsReverse ? elements.slice().reverse() : elements;\n\n applyAll(orderedElements, (el) => {\n target.insertAdjacentElement(position, el);\n });\n};\n","import { createElementFromHtml, insertContent, setHtml } from './dom';\r\nimport { getOuterSize, isHTMLElement } from './shared';\r\nimport { isPrototypePollutionKey } from './utils/object';\r\n\r\n/**\r\n * Wrapper for a single DOM element.\r\n * Provides a chainable, jQuery-like API for DOM manipulation.\r\n *\r\n * This class encapsulates a DOM element and provides methods for:\r\n * - Class manipulation (addClass, removeClass, toggleClass)\r\n * - Attribute and property access (attr, prop, data)\r\n * - Content manipulation (text, html, append, prepend)\r\n * - Style manipulation (css)\r\n * - Event handling (on, off, once, trigger)\r\n * - DOM traversal (find, closest, parent, children, siblings)\r\n *\r\n * All mutating methods return `this` for method chaining.\r\n *\r\n * @example\r\n * ```ts\r\n * $('#button')\r\n * .addClass('active')\r\n * .css({ color: 'blue' })\r\n * .on('click', () => console.log('clicked'));\r\n * ```\r\n */\r\n/** Handler signature for delegated events */\r\ntype DelegatedHandler = (event: Event, target: Element) => void;\r\n\r\ntype SerializableFormControl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\r\n\r\nconst isSerializableFormControl = (element: Element): element is SerializableFormControl => {\r\n const tagName = element.tagName.toLowerCase();\r\n return tagName === 'input' || tagName === 'textarea' || tagName === 'select';\r\n};\r\n\r\nconst collectFormEntries = (form: HTMLFormElement): Array<[string, string]> => {\r\n const entries: Array<[string, string]> = [];\r\n const elementCtor = form.ownerDocument.defaultView?.Element ?? Element;\r\n\r\n for (const control of Array.from(form.elements)) {\r\n if (!(control instanceof elementCtor) || !isSerializableFormControl(control)) {\r\n continue;\r\n }\r\n\r\n const name = control.name;\r\n if (!name || control.disabled || isPrototypePollutionKey(name)) {\r\n continue;\r\n }\r\n\r\n if (control.tagName.toLowerCase() === 'input') {\r\n const input = control as HTMLInputElement;\r\n const type = input.type.toLowerCase();\r\n\r\n if (type === 'checkbox' || type === 'radio') {\r\n if (input.checked) {\r\n entries.push([name, input.value]);\r\n }\r\n continue;\r\n }\r\n\r\n if (\r\n type === 'file' ||\r\n type === 'submit' ||\r\n type === 'button' ||\r\n type === 'reset' ||\r\n type === 'image'\r\n ) {\r\n continue;\r\n }\r\n\r\n entries.push([name, input.value]);\r\n continue;\r\n }\r\n\r\n if (control.tagName.toLowerCase() === 'select') {\r\n const select = control as HTMLSelectElement;\r\n\r\n if (select.multiple) {\r\n for (const option of Array.from(select.selectedOptions)) {\r\n entries.push([name, option.value]);\r\n }\r\n } else {\r\n entries.push([name, select.value]);\r\n }\r\n continue;\r\n }\r\n\r\n entries.push([name, (control as HTMLTextAreaElement).value]);\r\n }\r\n\r\n return entries;\r\n};\r\n\r\nconst getFormEntries = (form: HTMLFormElement): Array<[string, string]> => {\r\n if (typeof FormData === 'function') {\r\n try {\r\n const entries: Array<[string, string]> = [];\r\n\r\n for (const [key, value] of new FormData(form).entries()) {\r\n if (isPrototypePollutionKey(key) || typeof value !== 'string') {\r\n continue;\r\n }\r\n entries.push([key, value]);\r\n }\r\n\r\n // Some environments expose FormData(form) but fail to populate entries for\r\n // successful controls. Fall back to manual collection only in that zero-entry case.\r\n return entries.length > 0 ? entries : collectFormEntries(form);\r\n } catch {\r\n // Fall back to manual collection when FormData is unavailable for this form\r\n // or the environment does not fully support constructing it.\r\n }\r\n }\r\n\r\n return collectFormEntries(form);\r\n};\r\n\r\nexport class BQueryElement {\r\n /**\r\n * Stores delegated event handlers for cleanup via undelegate().\r\n * Key format: `${event}:${selector}`\r\n * @internal\r\n */\r\n private readonly delegatedHandlers = new Map<string, Map<DelegatedHandler, EventListener>>();\r\n\r\n /**\r\n * Creates a new BQueryElement wrapper.\r\n * @param element - The DOM element to wrap\r\n */\r\n constructor(private readonly element: Element) {}\r\n\r\n /**\r\n * Exposes the raw DOM element when direct access is needed.\r\n * Use sparingly; prefer the wrapper methods for consistency.\r\n */\r\n get raw(): Element {\r\n return this.element;\r\n }\r\n\r\n /**\r\n * Exposes the underlying DOM element.\r\n * Provided for spec compatibility and read-only access.\r\n */\r\n get node(): Element {\r\n return this.element;\r\n }\r\n\r\n /** Add one or more classes. */\r\n addClass(...classNames: string[]): this {\r\n this.element.classList.add(...classNames);\r\n return this;\r\n }\r\n\r\n /** Remove one or more classes. */\r\n removeClass(...classNames: string[]): this {\r\n this.element.classList.remove(...classNames);\r\n return this;\r\n }\r\n\r\n /** Toggle a class by name. */\r\n toggleClass(className: string, force?: boolean): this {\r\n this.element.classList.toggle(className, force);\r\n return this;\r\n }\r\n\r\n /** Get or set an attribute. */\r\n attr(name: string, value?: string): string | this {\r\n if (value === undefined) {\r\n return this.element.getAttribute(name) ?? '';\r\n }\r\n this.element.setAttribute(name, value);\r\n return this;\r\n }\r\n\r\n /** Remove an attribute. */\r\n removeAttr(name: string): this {\r\n this.element.removeAttribute(name);\r\n return this;\r\n }\r\n\r\n /** Toggle an attribute on/off. */\r\n toggleAttr(name: string, force?: boolean): this {\r\n const hasAttr = this.element.hasAttribute(name);\r\n const shouldAdd = force ?? !hasAttr;\r\n if (shouldAdd) {\r\n this.element.setAttribute(name, '');\r\n } else {\r\n this.element.removeAttribute(name);\r\n }\r\n return this;\r\n }\r\n\r\n /** Get or set a property. */\r\n prop<T extends keyof Element>(name: T, value?: Element[T]): Element[T] | this {\r\n if (value === undefined) {\r\n return this.element[name];\r\n }\r\n this.element[name] = value;\r\n return this;\r\n }\r\n\r\n /** Read or write data attributes in camelCase. */\r\n data(name: string, value?: string): string | this {\r\n const key = name.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\r\n if (value === undefined) {\r\n return this.element.getAttribute(`data-${key}`) ?? '';\r\n }\r\n this.element.setAttribute(`data-${key}`, value);\r\n return this;\r\n }\r\n\r\n /** Get or set text content. */\r\n text(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.element.textContent ?? '';\r\n }\r\n this.element.textContent = value;\r\n return this;\r\n }\r\n\r\n /** Set HTML content using a sanitized string. */\r\n /**\r\n * Sets sanitized HTML content on the element.\r\n * Uses the security module to sanitize input and prevent XSS attacks.\r\n *\r\n * @param value - The HTML string to set (will be sanitized)\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#content').html('<strong>Hello</strong>');\r\n * ```\r\n */\r\n html(value: string): this {\r\n setHtml(this.element, value);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets HTML content without sanitization.\r\n * Use only when you trust the HTML source completely.\r\n *\r\n * @param value - The raw HTML string to set\r\n * @returns The instance for method chaining\r\n *\r\n * @warning This method bypasses XSS protection. Use with caution.\r\n */\r\n htmlUnsafe(value: string): this {\r\n this.element.innerHTML = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets CSS styles on the element.\r\n *\r\n * @param property - A CSS property name or an object of property-value pairs\r\n * @param value - The value when setting a single property\r\n * @returns The computed style value when getting a single property, or the instance for method chaining when setting\r\n *\r\n * @example\r\n * ```ts\r\n * // Get a computed style value\r\n * const color = $('#box').css('color');\r\n *\r\n * // Set a single property\r\n * $('#box').css('color', 'red');\r\n *\r\n * // Set multiple properties\r\n * $('#box').css({ color: 'red', 'font-size': '16px' });\r\n * ```\r\n */\r\n css(property: string): string;\r\n css(property: string, value: string): this;\r\n css(property: Record<string, string>): this;\r\n css(property: string | Record<string, string>, value?: string): string | this {\r\n if (typeof property === 'string') {\r\n if (value !== undefined) {\r\n (this.element as HTMLElement).style.setProperty(property, value);\r\n return this;\r\n }\r\n const view = this.element.ownerDocument?.defaultView;\r\n if (!view || typeof view.getComputedStyle !== 'function') {\r\n return '';\r\n }\r\n return view.getComputedStyle(this.element).getPropertyValue(property);\r\n }\r\n\r\n for (const [key, val] of Object.entries(property)) {\r\n (this.element as HTMLElement).style.setProperty(key, val);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Appends HTML or elements to the end of the element.\r\n *\r\n * @param content - HTML string or element(s) to append\r\n * @returns The instance for method chaining\r\n */\r\n append(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'beforeend');\r\n return this;\r\n }\r\n\r\n /**\r\n * Prepends HTML or elements to the beginning of the element.\r\n *\r\n * @param content - HTML string or element(s) to prepend\r\n * @returns The instance for method chaining\r\n */\r\n prepend(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'afterbegin');\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts content before this element.\r\n *\r\n * @param content - HTML string or element(s) to insert\r\n * @returns The instance for method chaining\r\n */\r\n before(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'beforebegin');\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts content after this element.\r\n *\r\n * @param content - HTML string or element(s) to insert\r\n * @returns The instance for method chaining\r\n */\r\n after(content: string | Element | Element[]): this {\r\n this.insertContent(content, 'afterend');\r\n return this;\r\n }\r\n\r\n /**\r\n * Wraps the element with the specified wrapper element or tag.\r\n *\r\n * @param wrapper - Tag name string or Element to wrap with\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#content').wrap('div'); // Wraps with <div>\r\n * $('#content').wrap(document.createElement('section'));\r\n * ```\r\n */\r\n wrap(wrapper: string | Element): this {\r\n const wrapperEl = typeof wrapper === 'string' ? document.createElement(wrapper) : wrapper;\r\n this.element.parentNode?.insertBefore(wrapperEl, this.element);\r\n wrapperEl.appendChild(this.element);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the parent element, keeping this element in its place.\r\n * Essentially the opposite of wrap().\r\n *\r\n * **Important**: This method only moves the current element out of its parent\r\n * before removing the parent. Any sibling elements will be removed along with\r\n * the parent. For unwrapping multiple siblings, use a collection: `$$(siblings).unwrap()`.\r\n *\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // Before: <div><span id=\"text\">Hello</span></div>\r\n * $('#text').unwrap();\r\n * // After: <span id=\"text\">Hello</span>\r\n * ```\r\n */\r\n unwrap(): this {\r\n const parent = this.element.parentElement;\r\n if (parent && parent.parentNode) {\r\n parent.parentNode.insertBefore(this.element, parent);\r\n parent.remove();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Replaces this element with new content.\r\n *\r\n * @param content - HTML string (sanitized) or Element to replace with\r\n * @returns A new BQueryElement wrapping the replacement element\r\n *\r\n * @example\r\n * ```ts\r\n * const newEl = $('#old').replaceWith('<div id=\"new\">Replaced</div>');\r\n * ```\r\n */\r\n replaceWith(content: string | Element): BQueryElement {\r\n const newEl = typeof content === 'string' ? createElementFromHtml(content) : content;\r\n this.element.replaceWith(newEl);\r\n return new BQueryElement(newEl);\r\n }\r\n\r\n /**\r\n * Removes the element from the DOM while keeping the wrapped node available\r\n * for later reuse.\r\n *\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const item = $('#item').detach();\r\n * document.body.appendChild(item.raw);\r\n * ```\r\n */\r\n detach(): this {\r\n return this.remove();\r\n }\r\n\r\n /**\r\n * Gets the zero-based index of the element among its element siblings.\r\n *\r\n * @returns Index within the parent element, or -1 when detached\r\n *\r\n * @example\r\n * ```ts\r\n * const index = $('#item').index();\r\n * ```\r\n */\r\n index(): number {\r\n const parent = this.element.parentElement;\r\n if (!parent) {\r\n return -1;\r\n }\r\n return Array.from(parent.children).indexOf(this.element);\r\n }\r\n\r\n /**\r\n * Returns all child nodes, including text nodes and comments.\r\n *\r\n * @returns Array of child nodes\r\n *\r\n * @example\r\n * ```ts\r\n * const nodes = $('#content').contents();\r\n * ```\r\n */\r\n contents(): ChildNode[] {\r\n return Array.from(this.element.childNodes);\r\n }\r\n\r\n /**\r\n * Gets the nearest positioned ancestor used for offset calculations.\r\n *\r\n * @returns The offset parent element, or null when unavailable\r\n *\r\n * @example\r\n * ```ts\r\n * const parent = $('#item').offsetParent();\r\n * ```\r\n */\r\n offsetParent(): Element | null {\r\n return isHTMLElement(this.element) ? this.element.offsetParent : null;\r\n }\r\n\r\n /**\r\n * Gets the current position relative to the offset parent.\r\n *\r\n * @returns Position object with top and left coordinates\r\n *\r\n * @example\r\n * ```ts\r\n * const { top, left } = $('#item').position();\r\n * ```\r\n */\r\n position(): { top: number; left: number } {\r\n if (!isHTMLElement(this.element)) {\r\n return { top: 0, left: 0 };\r\n }\r\n\r\n const el = this.element;\r\n return {\r\n top: el.offsetTop,\r\n left: el.offsetLeft,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the outer width of the element, optionally including margins.\r\n *\r\n * @param includeMargin - When true, include horizontal margins\r\n * @returns Outer width in pixels\r\n *\r\n * @example\r\n * ```ts\r\n * const width = $('#panel').outerWidth();\r\n * const widthWithMargin = $('#panel').outerWidth(true);\r\n * ```\r\n */\r\n outerWidth(includeMargin: boolean = false): number {\r\n return getOuterSize(this.element, 'width', includeMargin);\r\n }\r\n\r\n /**\r\n * Gets the outer height of the element, optionally including margins.\r\n *\r\n * @param includeMargin - When true, include vertical margins\r\n * @returns Outer height in pixels\r\n *\r\n * @example\r\n * ```ts\r\n * const height = $('#panel').outerHeight();\r\n * const heightWithMargin = $('#panel').outerHeight(true);\r\n * ```\r\n */\r\n outerHeight(includeMargin: boolean = false): number {\r\n return getOuterSize(this.element, 'height', includeMargin);\r\n }\r\n\r\n /**\r\n * Scrolls the element into view with configurable behavior.\r\n *\r\n * @param options - ScrollIntoView options or boolean for legacy behavior\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * $('#section').scrollTo(); // Smooth scroll\r\n * $('#section').scrollTo({ behavior: 'instant', block: 'start' });\r\n * ```\r\n */\r\n scrollTo(options: ScrollIntoViewOptions | boolean = { behavior: 'smooth' }): this {\r\n this.element.scrollIntoView(options);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes the element from the DOM.\r\n *\r\n * @returns The instance for method chaining (though element is now detached)\r\n */\r\n remove(): this {\r\n this.element.remove();\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all child nodes from the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n empty(): this {\r\n this.element.innerHTML = '';\r\n return this;\r\n }\r\n\r\n /**\r\n * Clones the element, optionally with all descendants.\r\n *\r\n * @param deep - If true, clone all descendants (default: true)\r\n * @returns A new BQueryElement wrapping the cloned element\r\n */\r\n clone(deep: boolean = true): BQueryElement {\r\n return new BQueryElement(this.element.cloneNode(deep) as Element);\r\n }\r\n\r\n /**\r\n * Finds all descendant elements matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns Array of matching elements\r\n */\r\n find(selector: string): Element[] {\r\n return Array.from(this.element.querySelectorAll(selector));\r\n }\r\n\r\n /**\r\n * Finds the first descendant element matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns The first matching element or null\r\n */\r\n findOne(selector: string): Element | null {\r\n return this.element.querySelector(selector);\r\n }\r\n\r\n /**\r\n * Finds the closest ancestor matching the selector.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns The matching ancestor or null\r\n */\r\n closest(selector: string): Element | null {\r\n return this.element.closest(selector);\r\n }\r\n\r\n /**\r\n * Gets the parent element.\r\n *\r\n * @returns The parent element or null\r\n */\r\n parent(): Element | null {\r\n return this.element.parentElement;\r\n }\r\n\r\n /**\r\n * Gets all child elements.\r\n *\r\n * @returns Array of child elements\r\n */\r\n children(): Element[] {\r\n return Array.from(this.element.children);\r\n }\r\n\r\n /**\r\n * Gets all sibling elements.\r\n *\r\n * @returns Array of sibling elements (excluding this element)\r\n */\r\n siblings(): Element[] {\r\n const parent = this.element.parentElement;\r\n if (!parent) return [];\r\n return Array.from(parent.children).filter((child) => child !== this.element);\r\n }\r\n\r\n /**\r\n * Gets the next sibling element.\r\n *\r\n * @returns The next sibling element or null\r\n */\r\n next(): Element | null {\r\n return this.element.nextElementSibling;\r\n }\r\n\r\n /**\r\n * Gets the previous sibling element.\r\n *\r\n * @returns The previous sibling element or null\r\n */\r\n prev(): Element | null {\r\n return this.element.previousElementSibling;\r\n }\r\n\r\n /**\r\n * Adds an event listener.\r\n *\r\n * @param event - Event type to listen for\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n */\r\n on(event: string, handler: EventListenerOrEventListenerObject): this {\r\n this.element.addEventListener(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a one-time event listener that removes itself after firing.\r\n *\r\n * @param event - Event type to listen for\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n */\r\n once(event: string, handler: EventListener): this {\r\n this.element.addEventListener(event, handler, { once: true });\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an event listener.\r\n *\r\n * @param event - Event type\r\n * @param handler - The handler to remove\r\n * @returns The instance for method chaining\r\n */\r\n off(event: string, handler: EventListenerOrEventListenerObject): this {\r\n this.element.removeEventListener(event, handler);\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers a custom event on the element.\r\n *\r\n * @param event - Event type to trigger\r\n * @param detail - Optional detail data to include with the event\r\n * @returns The instance for method chaining\r\n */\r\n trigger(event: string, detail?: unknown): this {\r\n this.element.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a delegated event listener that only triggers for matching descendants.\r\n * More efficient than adding listeners to many elements individually.\r\n *\r\n * Use `undelegate()` to remove the listener later.\r\n *\r\n * @param event - Event type to listen for\r\n * @param selector - CSS selector to match against event targets\r\n * @param handler - Event handler function, receives the matched element as context\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // Instead of adding listeners to each button:\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $('#list').delegate('click', '.item', handler);\r\n *\r\n * // Later, remove the delegated listener:\r\n * $('#list').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n delegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n const wrapper: EventListener = (e: Event) => {\r\n const target = (e.target as Element).closest(selector);\r\n if (target && this.element.contains(target)) {\r\n handler(e, target);\r\n }\r\n };\r\n\r\n // Store the wrapper so it can be removed later\r\n if (!this.delegatedHandlers.has(key)) {\r\n this.delegatedHandlers.set(key, new Map());\r\n }\r\n this.delegatedHandlers.get(key)!.set(handler, wrapper);\r\n\r\n this.element.addEventListener(event, wrapper);\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a delegated event listener previously added with `delegate()`.\r\n *\r\n * @param event - Event type that was registered\r\n * @param selector - CSS selector that was used\r\n * @param handler - The original handler function passed to delegate()\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $('#list').delegate('click', '.item', handler);\r\n *\r\n * // Remove the delegated listener:\r\n * $('#list').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n undelegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n const handlers = this.delegatedHandlers.get(key);\r\n\r\n if (handlers) {\r\n const wrapper = handlers.get(handler);\r\n if (wrapper) {\r\n this.element.removeEventListener(event, wrapper);\r\n handlers.delete(handler);\r\n\r\n // Clean up empty maps\r\n if (handlers.size === 0) {\r\n this.delegatedHandlers.delete(key);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Checks if the element matches a CSS selector.\r\n *\r\n * @param selector - CSS selector to match against\r\n * @returns True if the element matches the selector\r\n */\r\n matches(selector: string): boolean {\r\n return this.element.matches(selector);\r\n }\r\n\r\n /**\r\n * Alias for `matches()`. Checks if the element matches a CSS selector.\r\n *\r\n * @param selector - CSS selector to match against\r\n * @returns True if the element matches the selector\r\n *\r\n * @example\r\n * ```ts\r\n * if ($('#el').is('.active')) {\r\n * console.log('Element is active');\r\n * }\r\n * ```\r\n */\r\n is(selector: string): boolean {\r\n return this.matches(selector);\r\n }\r\n\r\n /**\r\n * Checks if the element has a specific class.\r\n *\r\n * @param className - Class name to check\r\n * @returns True if the element has the class\r\n */\r\n hasClass(className: string): boolean {\r\n return this.element.classList.contains(className);\r\n }\r\n\r\n /**\r\n * Shows the element by removing the hidden attribute and setting display.\r\n *\r\n * @param display - Optional display value (default: '')\r\n * @returns The instance for method chaining\r\n */\r\n show(display: string = ''): this {\r\n this.element.removeAttribute('hidden');\r\n (this.element as HTMLElement).style.display = display;\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides the element by setting display to 'none'.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n hide(): this {\r\n (this.element as HTMLElement).style.display = 'none';\r\n return this;\r\n }\r\n\r\n /**\r\n * Toggles the visibility of the element.\r\n *\r\n * @param force - Optional force show (true) or hide (false)\r\n * @returns The instance for method chaining\r\n */\r\n toggle(force?: boolean): this {\r\n const isHidden = (this.element as HTMLElement).style.display === 'none';\r\n const shouldShow = force ?? isHidden;\r\n return shouldShow ? this.show() : this.hide();\r\n }\r\n\r\n /**\r\n * Focuses the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n focus(): this {\r\n (this.element as HTMLElement).focus();\r\n return this;\r\n }\r\n\r\n /**\r\n * Blurs (unfocuses) the element.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n blur(): this {\r\n (this.element as HTMLElement).blur();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets the value of form elements.\r\n *\r\n * @param newValue - Optional value to set\r\n * @returns The current value when getting, or the instance when setting\r\n */\r\n val(newValue?: string): string | this {\r\n const input = this.element as HTMLInputElement;\r\n if (newValue === undefined) {\r\n return input.value ?? '';\r\n }\r\n input.value = newValue;\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes form data to a plain object.\r\n * Only works on form elements; returns empty object for non-forms.\r\n *\r\n * For security hardening, the returned object uses a null prototype,\r\n * so inherited members like `hasOwnProperty` are not available directly.\r\n * Prefer `Object.keys()` or `Object.prototype.hasOwnProperty.call(...)`\r\n * when checking for fields on the serialized result.\r\n *\r\n * @returns Object with form field names as keys and values\r\n *\r\n * @example\r\n * ```ts\r\n * // For a form with <input name=\"email\" value=\"test@example.com\">\r\n * const data = $('#myForm').serialize();\r\n * // { email: 'test@example.com' }\r\n * Object.prototype.hasOwnProperty.call(data, 'email'); // true\r\n * ```\r\n */\r\n serialize(): Record<string, string | string[]> {\r\n const form = this.element as HTMLFormElement;\r\n if (form.tagName.toLowerCase() !== 'form') {\r\n return {};\r\n }\r\n\r\n const result = Object.create(null) as Record<string, string | string[]>;\r\n\r\n for (const [key, value] of getFormEntries(form)) {\r\n if (Object.prototype.hasOwnProperty.call(result, key)) {\r\n // Handle multiple values (e.g., checkboxes)\r\n const existing = result[key];\r\n if (Array.isArray(existing)) {\r\n existing.push(value);\r\n } else {\r\n result[key] = [existing, value];\r\n }\r\n } else {\r\n result[key] = value;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Serializes form data to a URL-encoded query string.\r\n *\r\n * @returns URL-encoded string suitable for form submission\r\n *\r\n * @example\r\n * ```ts\r\n * const queryString = $('#myForm').serializeString();\r\n * // 'email=test%40example.com&name=John'\r\n * ```\r\n */\r\n serializeString(): string {\r\n const form = this.element as HTMLFormElement;\r\n if (form.tagName.toLowerCase() !== 'form') {\r\n return '';\r\n }\r\n\r\n const params = new URLSearchParams();\r\n\r\n for (const [key, value] of getFormEntries(form)) {\r\n params.append(key, value);\r\n }\r\n\r\n return params.toString();\r\n }\r\n\r\n /**\r\n * Gets the bounding client rectangle of the element.\r\n *\r\n * @returns The element's bounding rectangle\r\n */\r\n rect(): DOMRect {\r\n return this.element.getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Gets the offset dimensions (width, height, top, left).\r\n *\r\n * @returns Object with offset dimensions\r\n */\r\n offset(): { width: number; height: number; top: number; left: number } {\r\n const el = this.element as HTMLElement;\r\n return {\r\n width: el.offsetWidth,\r\n height: el.offsetHeight,\r\n top: el.offsetTop,\r\n left: el.offsetLeft,\r\n };\r\n }\r\n\r\n /**\r\n * Internal method to insert content at a specified position.\r\n * @internal\r\n */\r\n private insertContent(content: string | Element | Element[], position: InsertPosition) {\r\n insertContent(this.element, content, position);\r\n }\r\n}\r\n","import {\r\n createElementFromHtml,\r\n insertContent,\r\n sanitizeContent,\r\n type InsertableContent,\r\n} from './dom';\r\nimport { BQueryElement } from './element';\r\nimport { applyAll, getOuterSize, isHTMLElement, toElementList } from './shared';\r\n\r\n/** Handler signature for delegated events */\r\ntype DelegatedHandler = (event: Event, target: Element) => void;\r\n\r\n/**\r\n * Wrapper for multiple DOM elements.\r\n * Provides batch operations on a collection of elements with chainable API.\r\n *\r\n * This class enables jQuery-like operations across multiple elements:\r\n * - All mutating methods apply to every element in the collection\r\n * - Getter methods return data from the first element\r\n * - Supports iteration via forEach, map, filter, and reduce\r\n *\r\n * @example\r\n * ```ts\r\n * $$('.items')\r\n * .addClass('highlight')\r\n * .css({ opacity: '0.8' })\r\n * .on('click', () => console.log('clicked'));\r\n * ```\r\n */\r\nexport class BQueryCollection {\r\n /**\r\n * Stores delegated event handlers for cleanup via undelegate().\r\n * Outer map: element -> (key -> (handler -> wrapper))\r\n * Key format: `${event}:${selector}`\r\n * @internal\r\n */\r\n private readonly delegatedHandlers = new WeakMap<\r\n Element,\r\n Map<string, Map<DelegatedHandler, EventListener>>\r\n >();\r\n\r\n /**\r\n * Creates a new collection wrapper.\r\n * @param elements - Array of DOM elements to wrap\r\n */\r\n constructor(public readonly elements: Element[]) {}\r\n\r\n /**\r\n * Gets the number of elements in the collection.\r\n */\r\n get length(): number {\r\n return this.elements.length;\r\n }\r\n\r\n /**\r\n * Gets the first element in the collection, if any.\r\n * @internal\r\n */\r\n private first(): Element | undefined {\r\n return this.elements[0];\r\n }\r\n\r\n /**\r\n * Gets a single element as a BQueryElement wrapper.\r\n *\r\n * @param index - Zero-based index of the element\r\n * @returns BQueryElement wrapper or undefined if out of range\r\n */\r\n eq(index: number): BQueryElement | undefined {\r\n const el = this.elements[index];\r\n return el ? new BQueryElement(el) : undefined;\r\n }\r\n\r\n /**\r\n * Gets the first element as a BQueryElement wrapper.\r\n *\r\n * @returns BQueryElement wrapper or undefined if empty\r\n */\r\n firstEl(): BQueryElement | undefined {\r\n return this.eq(0);\r\n }\r\n\r\n /**\r\n * Gets the last element as a BQueryElement wrapper.\r\n *\r\n * @returns BQueryElement wrapper or undefined if empty\r\n */\r\n lastEl(): BQueryElement | undefined {\r\n return this.eq(this.elements.length - 1);\r\n }\r\n\r\n /**\r\n * Iterates over each element in the collection.\r\n *\r\n * @param callback - Function to call for each wrapped element\r\n * @returns The instance for method chaining\r\n */\r\n each(callback: (element: BQueryElement, index: number) => void): this {\r\n this.elements.forEach((element, index) => {\r\n callback(new BQueryElement(element), index);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Maps each element to a new value.\r\n *\r\n * @param callback - Function to transform each element\r\n * @returns Array of transformed values\r\n */\r\n map<T>(callback: (element: Element, index: number) => T): T[] {\r\n return this.elements.map(callback);\r\n }\r\n\r\n /**\r\n * Filters elements based on a predicate.\r\n *\r\n * @param predicate - Function to test each element\r\n * @returns New BQueryCollection with matching elements\r\n */\r\n filter(predicate: (element: Element, index: number) => boolean): BQueryCollection {\r\n return new BQueryCollection(this.elements.filter(predicate));\r\n }\r\n\r\n /**\r\n * Reduces the collection to a single value.\r\n *\r\n * @param callback - Reducer function\r\n * @param initialValue - Initial accumulator value\r\n * @returns Accumulated result\r\n */\r\n reduce<T>(callback: (accumulator: T, element: Element, index: number) => T, initialValue: T): T {\r\n return this.elements.reduce(callback, initialValue);\r\n }\r\n\r\n /**\r\n * Converts the collection to an array of BQueryElement wrappers.\r\n *\r\n * @returns Array of BQueryElement instances\r\n */\r\n toArray(): BQueryElement[] {\r\n return this.elements.map((el) => new BQueryElement(el));\r\n }\r\n\r\n /** Add one or more classes to all elements. */\r\n addClass(...classNames: string[]): this {\r\n applyAll(this.elements, (el) => el.classList.add(...classNames));\r\n return this;\r\n }\r\n\r\n /** Remove one or more classes from all elements. */\r\n removeClass(...classNames: string[]): this {\r\n applyAll(this.elements, (el) => el.classList.remove(...classNames));\r\n return this;\r\n }\r\n\r\n /** Toggle a class on all elements. */\r\n toggleClass(className: string, force?: boolean): this {\r\n applyAll(this.elements, (el) => el.classList.toggle(className, force));\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets an attribute on all elements or gets from first.\r\n *\r\n * @param name - Attribute name\r\n * @param value - Value to set (optional)\r\n * @returns Attribute value when getting, instance when setting\r\n */\r\n attr(name: string, value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.getAttribute(name) ?? '';\r\n }\r\n applyAll(this.elements, (el) => el.setAttribute(name, value));\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an attribute from all elements.\r\n *\r\n * @param name - Attribute name to remove\r\n * @returns The instance for method chaining\r\n */\r\n removeAttr(name: string): this {\r\n applyAll(this.elements, (el) => el.removeAttribute(name));\r\n return this;\r\n }\r\n\r\n /** Toggle an attribute on all elements. */\r\n toggleAttr(name: string, force?: boolean): this {\r\n applyAll(this.elements, (el) => {\r\n const hasAttr = el.hasAttribute(name);\r\n const shouldAdd = force ?? !hasAttr;\r\n if (shouldAdd) {\r\n el.setAttribute(name, '');\r\n } else {\r\n el.removeAttribute(name);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets text content on all elements or gets from first.\r\n *\r\n * @param value - Text to set (optional)\r\n * @returns Text content when getting, instance when setting\r\n */\r\n text(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.textContent ?? '';\r\n }\r\n applyAll(this.elements, (el) => {\r\n el.textContent = value;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets sanitized HTML on all elements or gets from first.\r\n *\r\n * @param value - HTML to set (optional, will be sanitized)\r\n * @returns HTML content when getting, instance when setting\r\n */\r\n html(value?: string): string | this {\r\n if (value === undefined) {\r\n return this.first()?.innerHTML ?? '';\r\n }\r\n const sanitized = sanitizeContent(value);\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = sanitized;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets HTML on all elements without sanitization.\r\n *\r\n * @param value - Raw HTML to set\r\n * @returns The instance for method chaining\r\n * @warning Bypasses XSS protection\r\n */\r\n htmlUnsafe(value: string): this {\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = value;\r\n });\r\n return this;\r\n }\r\n\r\n /** Append content to all elements. */\r\n append(content: InsertableContent): this {\r\n this.insertAll(content, 'beforeend');\r\n return this;\r\n }\r\n\r\n /** Prepend content to all elements. */\r\n prepend(content: InsertableContent): this {\r\n this.insertAll(content, 'afterbegin');\r\n return this;\r\n }\r\n\r\n /** Insert content before all elements. */\r\n before(content: InsertableContent): this {\r\n this.insertAll(content, 'beforebegin');\r\n return this;\r\n }\r\n\r\n /** Insert content after all elements. */\r\n after(content: InsertableContent): this {\r\n this.insertAll(content, 'afterend');\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets or sets CSS styles on all elements.\r\n * When getting, returns the computed style value from the first element.\r\n *\r\n * @param property - Property name or object of properties\r\n * @param value - Value when setting single property\r\n * @returns The computed style value when getting, instance when setting\r\n */\r\n css(property: string): string;\r\n css(property: string, value: string): this;\r\n css(property: Record<string, string>): this;\r\n css(property: string | Record<string, string>, value?: string): string | this {\r\n if (typeof property === 'string') {\r\n if (value !== undefined) {\r\n applyAll(this.elements, (el) => {\r\n (el as HTMLElement).style.setProperty(property, value);\r\n });\r\n return this;\r\n }\r\n const first = this.first();\r\n if (!first) {\r\n return '';\r\n }\r\n const view = first.ownerDocument?.defaultView;\r\n if (!view || typeof view.getComputedStyle !== 'function') {\r\n return '';\r\n }\r\n return view.getComputedStyle(first).getPropertyValue(property);\r\n }\r\n\r\n applyAll(this.elements, (el) => {\r\n for (const [key, val] of Object.entries(property)) {\r\n (el as HTMLElement).style.setProperty(key, val);\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n /** Wrap each element with a wrapper element or tag. */\r\n wrap(wrapper: string | Element): this {\r\n this.elements.forEach((el, index) => {\r\n const wrapperEl =\r\n typeof wrapper === 'string'\r\n ? document.createElement(wrapper)\r\n : index === 0\r\n ? wrapper\r\n : (wrapper.cloneNode(true) as Element);\r\n el.parentNode?.insertBefore(wrapperEl, el);\r\n wrapperEl.appendChild(el);\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove the parent element of each element, keeping the elements in place.\r\n *\r\n * **Important**: This method unwraps ALL children of each parent element,\r\n * not just the elements in the collection. If you call `unwrap()` on a\r\n * collection containing only some children of a parent, all siblings will\r\n * also be unwrapped. This behavior is consistent with jQuery's `.unwrap()`.\r\n *\r\n * @returns The collection for chaining\r\n *\r\n * @example\r\n * ```ts\r\n * // HTML: <div><section><span>A</span><span>B</span></section></div>\r\n * const spans = $$('span');\r\n * spans.unwrap(); // Removes <section>, both spans move to <div>\r\n * // Result: <div><span>A</span><span>B</span></div>\r\n * ```\r\n */\r\n unwrap(): this {\r\n // Collect unique parent elements to avoid removing the same parent multiple times.\r\n const parents = new Set<Element>();\r\n for (const el of this.elements) {\r\n if (el.parentElement) {\r\n parents.add(el.parentElement);\r\n }\r\n }\r\n\r\n // Unwrap each parent once: move all children out, then remove the wrapper.\r\n parents.forEach((parent) => {\r\n const grandParent = parent.parentNode;\r\n if (!grandParent) return;\r\n\r\n while (parent.firstChild) {\r\n grandParent.insertBefore(parent.firstChild, parent);\r\n }\r\n\r\n parent.remove();\r\n });\r\n return this;\r\n }\r\n\r\n /** Replace each element with provided content. */\r\n replaceWith(content: string | Element): BQueryCollection {\r\n const replacements: Element[] = [];\r\n this.elements.forEach((el, index) => {\r\n const replacement =\r\n typeof content === 'string'\r\n ? createElementFromHtml(content)\r\n : index === 0\r\n ? content\r\n : (content.cloneNode(true) as Element);\r\n el.replaceWith(replacement);\r\n replacements.push(replacement);\r\n });\r\n return new BQueryCollection(replacements);\r\n }\r\n\r\n /**\r\n * Removes all elements from the DOM while keeping the wrapped nodes available\r\n * for later reuse.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n detach(): this {\r\n return this.remove();\r\n }\r\n\r\n /**\r\n * Gets the zero-based sibling index of the first element in the collection.\r\n *\r\n * @returns Index of the first element, or -1 when unavailable\r\n */\r\n index(): number {\r\n const first = this.first();\r\n if (!first?.parentElement) {\r\n return -1;\r\n }\r\n return Array.from(first.parentElement.children).indexOf(first);\r\n }\r\n\r\n /**\r\n * Returns the child nodes of the first element, including text nodes and comments.\r\n *\r\n * @returns Array of child nodes from the first element\r\n */\r\n contents(): ChildNode[] {\r\n return Array.from(this.first()?.childNodes ?? []);\r\n }\r\n\r\n /**\r\n * Gets the offset parent of the first element in the collection.\r\n *\r\n * @returns Offset parent element, or null when unavailable\r\n */\r\n offsetParent(): Element | null {\r\n const first = this.first();\r\n return isHTMLElement(first) ? first.offsetParent : null;\r\n }\r\n\r\n /**\r\n * Gets the position of the first element relative to its offset parent.\r\n *\r\n * @returns Position object with top and left coordinates\r\n */\r\n position(): { top: number; left: number } {\r\n const first = this.first();\r\n if (!isHTMLElement(first)) {\r\n return { top: 0, left: 0 };\r\n }\r\n\r\n return {\r\n top: first.offsetTop,\r\n left: first.offsetLeft,\r\n };\r\n }\r\n\r\n /**\r\n * Gets the outer width of the first element, optionally including margins.\r\n *\r\n * @param includeMargin - When true, include horizontal margins\r\n * @returns Outer width in pixels\r\n */\r\n outerWidth(includeMargin: boolean = false): number {\r\n return getOuterSize(this.first(), 'width', includeMargin);\r\n }\r\n\r\n /**\r\n * Gets the outer height of the first element, optionally including margins.\r\n *\r\n * @param includeMargin - When true, include vertical margins\r\n * @returns Outer height in pixels\r\n */\r\n outerHeight(includeMargin: boolean = false): number {\r\n return getOuterSize(this.first(), 'height', includeMargin);\r\n }\r\n\r\n /**\r\n * Shows all elements.\r\n *\r\n * @param display - Optional display value (default: '')\r\n * @returns The instance for method chaining\r\n */\r\n show(display: string = ''): this {\r\n applyAll(this.elements, (el) => {\r\n el.removeAttribute('hidden');\r\n (el as HTMLElement).style.display = display;\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides all elements.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n hide(): this {\r\n applyAll(this.elements, (el) => {\r\n (el as HTMLElement).style.display = 'none';\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an event listener to all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - Event handler\r\n * @returns The instance for method chaining\r\n */\r\n on(event: string, handler: EventListenerOrEventListenerObject): this {\r\n applyAll(this.elements, (el) => el.addEventListener(event, handler));\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a one-time event listener to all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - Event handler\r\n * @returns The instance for method chaining\r\n */\r\n once(event: string, handler: EventListener): this {\r\n applyAll(this.elements, (el) => el.addEventListener(event, handler, { once: true }));\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes an event listener from all elements.\r\n *\r\n * @param event - Event type\r\n * @param handler - The handler to remove\r\n * @returns The instance for method chaining\r\n */\r\n off(event: string, handler: EventListenerOrEventListenerObject): this {\r\n applyAll(this.elements, (el) => el.removeEventListener(event, handler));\r\n return this;\r\n }\r\n\r\n /**\r\n * Triggers a custom event on all elements.\r\n *\r\n * @param event - Event type\r\n * @param detail - Optional event detail\r\n * @returns The instance for method chaining\r\n */\r\n trigger(event: string, detail?: unknown): this {\r\n applyAll(this.elements, (el) => {\r\n el.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, cancelable: true }));\r\n });\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a delegated event listener to all elements.\r\n * Events are delegated to matching descendants.\r\n *\r\n * Use `undelegate()` to remove the listener later.\r\n *\r\n * @param event - Event type to listen for\r\n * @param selector - CSS selector to match against event targets\r\n * @param handler - Event handler function\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $$('.container').delegate('click', '.item', handler);\r\n *\r\n * // Later, remove the delegated listener:\r\n * $$('.container').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n delegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n\r\n applyAll(this.elements, (el) => {\r\n const wrapper: EventListener = (e: Event) => {\r\n const target = (e.target as Element).closest(selector);\r\n if (target && el.contains(target)) {\r\n handler(e, target);\r\n }\r\n };\r\n\r\n // Get or create the handler maps for this element\r\n if (!this.delegatedHandlers.has(el)) {\r\n this.delegatedHandlers.set(el, new Map());\r\n }\r\n const elementHandlers = this.delegatedHandlers.get(el)!;\r\n\r\n if (!elementHandlers.has(key)) {\r\n elementHandlers.set(key, new Map());\r\n }\r\n elementHandlers.get(key)!.set(handler, wrapper);\r\n\r\n el.addEventListener(event, wrapper);\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a delegated event listener previously added with `delegate()`.\r\n *\r\n * @param event - Event type that was registered\r\n * @param selector - CSS selector that was used\r\n * @param handler - The original handler function passed to delegate()\r\n * @returns The instance for method chaining\r\n *\r\n * @example\r\n * ```ts\r\n * const handler = (e, target) => console.log('Clicked:', target.textContent);\r\n * $$('.container').delegate('click', '.item', handler);\r\n *\r\n * // Remove the delegated listener:\r\n * $$('.container').undelegate('click', '.item', handler);\r\n * ```\r\n */\r\n undelegate(\r\n event: string,\r\n selector: string,\r\n handler: (event: Event, target: Element) => void\r\n ): this {\r\n const key = `${event}:${selector}`;\r\n\r\n applyAll(this.elements, (el) => {\r\n const elementHandlers = this.delegatedHandlers.get(el);\r\n if (!elementHandlers) return;\r\n\r\n const handlers = elementHandlers.get(key);\r\n if (!handlers) return;\r\n\r\n const wrapper = handlers.get(handler);\r\n if (wrapper) {\r\n el.removeEventListener(event, wrapper);\r\n handlers.delete(handler);\r\n\r\n // Clean up empty maps\r\n if (handlers.size === 0) {\r\n elementHandlers.delete(key);\r\n }\r\n if (elementHandlers.size === 0) {\r\n this.delegatedHandlers.delete(el);\r\n }\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Finds all descendant elements matching the selector across all elements\r\n * in the collection. Returns a new BQueryCollection with the results.\r\n *\r\n * @param selector - CSS selector to match\r\n * @returns A new BQueryCollection with all matching descendants\r\n *\r\n * @example\r\n * ```ts\r\n * $$('.container').find('.item').addClass('highlight');\r\n * ```\r\n */\r\n find(selector: string): BQueryCollection {\r\n const seen = new Set<Element>();\r\n const results: Element[] = [];\r\n for (const el of this.elements) {\r\n const found = el.querySelectorAll(selector);\r\n for (let i = 0; i < found.length; i++) {\r\n if (!seen.has(found[i])) {\r\n seen.add(found[i]);\r\n results.push(found[i]);\r\n }\r\n }\r\n }\r\n return new BQueryCollection(results);\r\n }\r\n\r\n /**\r\n * Removes all elements from the DOM.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n remove(): this {\r\n applyAll(this.elements, (el) => el.remove());\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all child nodes from all elements.\r\n *\r\n * @returns The instance for method chaining\r\n */\r\n empty(): this {\r\n applyAll(this.elements, (el) => {\r\n el.innerHTML = '';\r\n });\r\n return this;\r\n }\r\n\r\n /** @internal */\r\n private insertAll(content: InsertableContent, position: InsertPosition): void {\r\n if (typeof content === 'string') {\r\n // Sanitize once and reuse for all elements\r\n const sanitized = sanitizeContent(content);\r\n applyAll(this.elements, (el) => {\r\n el.insertAdjacentHTML(position, sanitized);\r\n });\r\n return;\r\n }\r\n\r\n const elements = toElementList(content);\r\n this.elements.forEach((el, index) => {\r\n const nodes =\r\n index === 0 ? elements : elements.map((node) => node.cloneNode(true) as Element);\r\n insertContent(el, nodes, position);\r\n });\r\n }\r\n}\r\n","import { BQueryCollection } from './collection';\nimport { BQueryElement } from './element';\n\n/**\n * Select a single element. Returns a wrapper for chainable operations.\n */\nexport const $ = (selector: string | Element): BQueryElement => {\n if (typeof selector !== 'string') {\n return new BQueryElement(selector);\n }\n const element = document.querySelector(selector);\n if (!element) {\n throw new Error(`bQuery: element not found for selector \"${selector}\"`);\n }\n return new BQueryElement(element);\n};\n\n/**\n * Select multiple elements. Returns a collection wrapper.\n */\nexport const $$ = (selector: string | Element[] | NodeListOf<Element>): BQueryCollection => {\n if (Array.isArray(selector)) {\n return new BQueryCollection(selector);\n }\n if (selector instanceof NodeList) {\n return new BQueryCollection(Array.from(selector));\n }\n return new BQueryCollection(Array.from(document.querySelectorAll(selector)));\n};\n","/**\n * Array-focused utility helpers.\n *\n * @module bquery/core/utils/array\n */\n\n/**\n * Ensures the input is always returned as an array.\n *\n * @template T - The item type\n * @param value - A single value, array, or nullish value\n * @returns An array (empty if nullish)\n *\n * @example\n * ```ts\n * ensureArray('a'); // ['a']\n * ensureArray(['a', 'b']); // ['a', 'b']\n * ensureArray(null); // []\n * ```\n */\nexport function ensureArray<T>(value: T | T[] | null | undefined): T[] {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n/**\n * Removes duplicate entries from an array.\n *\n * @template T - The item type\n * @param items - The array to deduplicate\n * @returns A new array with unique items\n *\n * @example\n * ```ts\n * unique([1, 2, 2, 3]); // [1, 2, 3]\n * ```\n */\nexport function unique<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\n/**\n * Splits an array into chunks of a given size.\n *\n * @template T - The item type\n * @param items - The array to chunk\n * @param size - The maximum size of each chunk\n * @returns An array of chunks\n *\n * @example\n * ```ts\n * chunk([1, 2, 3, 4, 5], 2); // [[1,2],[3,4],[5]]\n * ```\n */\nexport function chunk<T>(items: T[], size: number): T[][] {\n if (size <= 0) return [];\n const result: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n result.push(items.slice(i, i + size));\n }\n return result;\n}\n\n/**\n * Removes falsy values from an array.\n *\n * @template T - The item type\n * @param items - The array to compact\n * @returns A new array without falsy values\n *\n * @example\n * ```ts\n * compact([0, 1, '', 'ok', null]); // [1, 'ok']\n * ```\n */\nexport function compact<T>(items: Array<T | null | undefined | false | 0 | ''>): T[] {\n return items.filter(Boolean) as T[];\n}\n\n/**\n * Flattens a single level of nested arrays.\n *\n * @template T - The item type\n * @param items - The array to flatten\n * @returns A new flattened array\n *\n * @example\n * ```ts\n * flatten([1, [2, 3], 4]); // [1, 2, 3, 4]\n * ```\n */\nexport function flatten<T>(items: Array<T | T[]>): T[] {\n const result: T[] = [];\n for (const item of items) {\n if (Array.isArray(item)) {\n result.push(...item);\n } else {\n result.push(item);\n }\n }\n return result;\n}\n","/**\n * Function-focused utility helpers.\n *\n * @module bquery/core/utils/function\n */\n\n/** A debounced function with a cancel method to clear the pending timeout. */\nexport interface DebouncedFn<TArgs extends unknown[]> {\n (...args: TArgs): void;\n /** Cancels the pending debounced invocation. */\n cancel(): void;\n}\n\n/** A throttled function with a cancel method to reset the throttle timer. */\nexport interface ThrottledFn<TArgs extends unknown[]> {\n (...args: TArgs): void;\n /** Resets the throttle timer, allowing the next call to execute immediately. */\n cancel(): void;\n}\n\n/**\n * Creates a debounced function that delays execution until after\n * the specified delay has elapsed since the last call.\n *\n * @template TArgs - The argument types of the function\n * @param fn - The function to debounce\n * @param delayMs - Delay in milliseconds\n * @returns A debounced version of the function with a `cancel()` method\n *\n * @example\n * ```ts\n * const search = debounce((query: string) => {\n * console.log('Searching:', query);\n * }, 300);\n *\n * search('h');\n * search('he');\n * search('hello'); // Only this call executes after 300ms\n *\n * search('cancel me');\n * search.cancel(); // Cancels the pending invocation\n * ```\n */\nexport function debounce<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n delayMs: number\n): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const debounced: DebouncedFn<TArgs> = Object.assign(\n (...args: TArgs) => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn(...args);\n }, delayMs);\n },\n {\n cancel: () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n },\n }\n );\n return debounced;\n}\n\n/**\n * Creates a throttled function that runs at most once per interval.\n *\n * @template TArgs - The argument types of the function\n * @param fn - The function to throttle\n * @param intervalMs - Minimum interval between calls in milliseconds\n * @returns A throttled version of the function with a `cancel()` method\n *\n * @example\n * ```ts\n * const handleScroll = throttle(() => {\n * console.log('Scroll position:', window.scrollY);\n * }, 100);\n *\n * window.addEventListener('scroll', handleScroll);\n *\n * handleScroll.cancel(); // Resets throttle, next call executes immediately\n * ```\n */\nexport function throttle<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n intervalMs: number\n): ThrottledFn<TArgs> {\n let lastRun = 0;\n const throttled: ThrottledFn<TArgs> = Object.assign(\n (...args: TArgs) => {\n const now = Date.now();\n if (now - lastRun >= intervalMs) {\n lastRun = now;\n fn(...args);\n }\n },\n {\n cancel: () => {\n lastRun = 0;\n },\n }\n );\n return throttled;\n}\n\n/**\n * Ensures a function only runs once. Subsequent calls return the first result.\n *\n * @template TArgs - The argument types of the function\n * @template TResult - The return type of the function\n * @param fn - The function to wrap\n * @returns A function that only runs once\n *\n * @example\n * ```ts\n * const init = once(() => ({ ready: true }));\n * init();\n * init(); // only runs once\n * ```\n */\nexport function once<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => TResult\n): (...args: TArgs) => TResult {\n let hasRun = false;\n let result!: TResult;\n return (...args: TArgs) => {\n if (!hasRun) {\n result = fn(...args);\n hasRun = true;\n }\n return result;\n };\n}\n\n/**\n * A no-operation function.\n *\n * @example\n * ```ts\n * noop();\n * ```\n */\nexport function noop(): void {\n // Intentionally empty\n}\n","/**\n * Miscellaneous utility helpers.\n *\n * @module bquery/core/utils/misc\n */\n\n/**\n * Creates a stable unique ID for DOM usage.\n *\n * @param prefix - Optional prefix for the ID (default: 'bQuery')\n * @returns A unique identifier string\n *\n * @example\n * ```ts\n * const id = uid('modal'); // 'modal_x7k2m9p'\n * ```\n */\nexport function uid(prefix = 'bQuery'): string {\n return `${prefix}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Delays execution for a specified number of milliseconds.\n *\n * @param ms - Milliseconds to delay\n * @returns A promise that resolves after the delay\n *\n * @example\n * ```ts\n * await sleep(1000); // Wait 1 second\n * console.log('Done!');\n * ```\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Safely parses a JSON string, returning a default value on error.\n *\n * @template T - The expected type of the parsed value\n * @param json - The JSON string to parse\n * @param fallback - The default value if parsing fails\n * @returns The parsed value or the fallback\n *\n * @example\n * ```ts\n * parseJson('{\"name\":\"bQuery\"}', {}); // { name: 'bQuery' }\n * parseJson('invalid', {}); // {}\n * ```\n */\nexport function parseJson<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Checks for emptiness across common value types.\n *\n * @param value - The value to check\n * @returns True if the value is empty (null, undefined, empty string, empty array, or empty object)\n *\n * @example\n * ```ts\n * isEmpty(''); // true\n * isEmpty([]); // true\n * isEmpty({}); // true\n * isEmpty(null); // true\n * isEmpty('hello'); // false\n * isEmpty([1, 2]); // false\n * ```\n */\nexport function isEmpty(value: unknown): boolean {\n if (value == null) return true;\n if (typeof value === 'string') return value.trim().length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === 'object') return Object.keys(value as object).length === 0;\n return false;\n}\n","/**\n * Number-focused utility helpers.\n *\n * @module bquery/core/utils/number\n */\n\n/**\n * Generates a random integer between min and max (inclusive).\n *\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns A random integer in the range [min, max]\n *\n * @example\n * ```ts\n * const roll = randomInt(1, 6); // Random dice roll\n * ```\n */\nexport function randomInt(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n/**\n * Clamps a number between a minimum and maximum value.\n *\n * @param value - The value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns The clamped value\n *\n * @example\n * ```ts\n * clamp(150, 0, 100); // 100\n * clamp(-10, 0, 100); // 0\n * clamp(50, 0, 100); // 50\n * ```\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Checks if a number is within a range.\n *\n * @param value - The value to check\n * @param min - Minimum value\n * @param max - Maximum value\n * @param inclusive - Whether the range is inclusive (default: true)\n * @returns True if the value is within the range\n *\n * @example\n * ```ts\n * inRange(5, 1, 10); // true\n * inRange(10, 1, 10, false); // false\n * ```\n */\nexport function inRange(value: number, min: number, max: number, inclusive = true): boolean {\n if (inclusive) return value >= min && value <= max;\n return value > min && value < max;\n}\n\n/**\n * Converts a value to a number with a fallback on NaN.\n *\n * @param value - The value to convert\n * @param fallback - The fallback value if conversion fails (default: 0)\n * @returns The parsed number or the fallback\n *\n * @example\n * ```ts\n * toNumber('42'); // 42\n * toNumber('nope', 10); // 10\n * ```\n */\nexport function toNumber(value: unknown, fallback = 0): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n","/**\n * String-focused utility helpers.\n *\n * @module bquery/core/utils/string\n */\n\n/**\n * Capitalizes the first letter of a string.\n *\n * @param str - The string to capitalize\n * @returns The capitalized string\n *\n * @example\n * ```ts\n * capitalize('hello'); // 'Hello'\n * ```\n */\nexport function capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Converts a string to kebab-case.\n *\n * @param str - The string to convert\n * @returns The kebab-cased string\n *\n * @example\n * ```ts\n * toKebabCase('myVariableName'); // 'my-variable-name'\n * ```\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Converts a string to camelCase.\n *\n * @param str - The string to convert\n * @returns The camelCased string\n *\n * @example\n * ```ts\n * toCamelCase('my-variable-name'); // 'myVariableName'\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\n .replace(/^[A-Z]/, (char) => char.toLowerCase());\n}\n\n/**\n * Truncates a string to a maximum length.\n *\n * @param str - The string to truncate\n * @param maxLength - The maximum length\n * @param suffix - The suffix to append when truncating (default: '…')\n * @returns The truncated string\n *\n * @example\n * ```ts\n * truncate('Hello world', 8); // 'Hello w…'\n * ```\n */\nexport function truncate(str: string, maxLength: number, suffix = '…'): string {\n if (maxLength <= 0) return '';\n if (str.length <= maxLength) return str;\n const sliceLength = Math.max(0, maxLength - suffix.length);\n return `${str.slice(0, sliceLength)}${suffix}`;\n}\n\n/**\n * Converts a string to a URL-friendly slug.\n *\n * @param str - The string to slugify\n * @returns The slugified string\n *\n * @example\n * ```ts\n * slugify('Hello, World!'); // 'hello-world'\n * ```\n */\nexport function slugify(str: string): string {\n return str\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^\\w\\s-]/g, '')\n .trim()\n .replace(/[\\s_-]+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Escapes a string for safe usage inside a RegExp.\n *\n * @param str - The string to escape\n * @returns The escaped string\n *\n * @example\n * ```ts\n * escapeRegExp('[a-z]+'); // '\\\\[a-z\\\\]+'\n * ```\n */\nexport function escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\r\n * Utility helpers used across the framework.\r\n * These are intentionally small and framework-agnostic to keep the core tiny.\r\n *\r\n * @module bquery/core/utils\r\n */\r\n\r\nexport * from './array';\r\nexport * from './function';\r\nexport * from './misc';\r\nexport * from './number';\r\nexport * from './object';\r\nexport * from './string';\r\nexport * from './type-guards';\r\n\r\nimport { chunk, compact, ensureArray, flatten, unique } from './array';\r\nimport { debounce, noop, once, throttle } from './function';\r\nimport { isEmpty, parseJson, sleep, uid } from './misc';\r\nimport { clamp, inRange, randomInt, toNumber } from './number';\r\nimport { clone, hasOwn, isPlainObject, merge, omit, pick } from './object';\r\nimport { capitalize, escapeRegExp, slugify, toCamelCase, toKebabCase, truncate } from './string';\r\nimport {\r\n isArray,\r\n isBoolean,\r\n isCollection,\r\n isDate,\r\n isElement,\r\n isFunction,\r\n isNumber,\r\n isObject,\r\n isPromise,\r\n isString,\r\n} from './type-guards';\r\n\r\n/**\r\n * Describes the public shape of the aggregated {@link utils} namespace.\r\n *\r\n * Every member maps 1-to-1 to a named export from one of the sub-modules\r\n * (`array`, `function`, `misc`, `number`, `object`, `string`, `type-guards`).\r\n *\r\n * `isPrototypePollutionKey` is intentionally excluded as it is an\r\n * internal security helper. It remains available as a named export for\r\n * internal framework use.\r\n */\r\nexport interface BQueryUtils {\r\n // ── object ──────────────────────────────────────────────────────────\r\n readonly clone: typeof clone;\r\n readonly merge: typeof merge;\r\n readonly pick: typeof pick;\r\n readonly omit: typeof omit;\r\n readonly hasOwn: typeof hasOwn;\r\n readonly isPlainObject: typeof isPlainObject;\r\n\r\n // ── function ────────────────────────────────────────────────────────\r\n readonly debounce: typeof debounce;\r\n readonly throttle: typeof throttle;\r\n readonly once: typeof once;\r\n readonly noop: typeof noop;\r\n\r\n // ── misc ────────────────────────────────────────────────────────────\r\n readonly uid: typeof uid;\r\n readonly isEmpty: typeof isEmpty;\r\n readonly parseJson: typeof parseJson;\r\n readonly sleep: typeof sleep;\r\n\r\n // ── type-guards ─────────────────────────────────────────────────────\r\n readonly isElement: typeof isElement;\r\n readonly isCollection: typeof isCollection;\r\n readonly isFunction: typeof isFunction;\r\n readonly isString: typeof isString;\r\n readonly isNumber: typeof isNumber;\r\n readonly isBoolean: typeof isBoolean;\r\n readonly isArray: typeof isArray;\r\n readonly isDate: typeof isDate;\r\n readonly isPromise: typeof isPromise;\r\n readonly isObject: typeof isObject;\r\n\r\n // ── number ──────────────────────────────────────────────────────────\r\n readonly randomInt: typeof randomInt;\r\n readonly clamp: typeof clamp;\r\n readonly inRange: typeof inRange;\r\n readonly toNumber: typeof toNumber;\r\n\r\n // ── string ──────────────────────────────────────────────────────────\r\n readonly capitalize: typeof capitalize;\r\n readonly toKebabCase: typeof toKebabCase;\r\n readonly toCamelCase: typeof toCamelCase;\r\n readonly truncate: typeof truncate;\r\n readonly slugify: typeof slugify;\r\n readonly escapeRegExp: typeof escapeRegExp;\r\n\r\n // ── array ───────────────────────────────────────────────────────────\r\n readonly ensureArray: typeof ensureArray;\r\n readonly unique: typeof unique;\r\n readonly chunk: typeof chunk;\r\n readonly compact: typeof compact;\r\n readonly flatten: typeof flatten;\r\n}\r\n\r\n/**\r\n * Utility object containing common helper functions.\r\n * All utilities are designed to be tree-shakeable and have zero dependencies.\r\n *\r\n * Note: `isPrototypePollutionKey` is intentionally excluded from this namespace\r\n * as it is an internal security helper. It remains available as a named export\r\n * for internal framework use.\r\n */\r\nexport const utils: BQueryUtils = {\r\n clone,\r\n merge,\r\n pick,\r\n omit,\r\n hasOwn,\r\n debounce,\r\n throttle,\r\n once,\r\n noop,\r\n uid,\r\n isElement,\r\n isCollection,\r\n isEmpty,\r\n isPlainObject,\r\n isFunction,\r\n isString,\r\n isNumber,\r\n isBoolean,\r\n isArray,\r\n isDate,\r\n isPromise,\r\n isObject,\r\n parseJson,\r\n sleep,\r\n randomInt,\r\n clamp,\r\n inRange,\r\n toNumber,\r\n capitalize,\r\n toKebabCase,\r\n toCamelCase,\r\n truncate,\r\n slugify,\r\n escapeRegExp,\r\n ensureArray,\r\n unique,\r\n chunk,\r\n compact,\r\n flatten,\r\n};\r\n"],"mappings":"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"}
@@ -1,112 +0,0 @@
1
- var t = [], a = 0, u = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new WeakMap(), l = (e, r) => {
2
- t.push(e);
3
- try {
4
- return r();
5
- } finally {
6
- t.pop();
7
- }
8
- }, b = () => t[t.length - 1], g = (e) => {
9
- t.push(void 0);
10
- try {
11
- return e();
12
- } finally {
13
- t.pop();
14
- }
15
- }, f = (e) => {
16
- if (a > 0) {
17
- u.add(e);
18
- return;
19
- }
20
- e();
21
- }, h = () => {
22
- for (const e of Array.from(u)) {
23
- u.delete(e);
24
- try {
25
- e();
26
- } catch (r) {
27
- console.error("bQuery reactive: Error in observer during batch flush", r);
28
- }
29
- }
30
- }, w = () => {
31
- a += 1;
32
- }, D = () => {
33
- a <= 0 || (a -= 1, a === 0 && h());
34
- }, d = (e, r) => {
35
- let s = n.get(e);
36
- s || (s = /* @__PURE__ */ new Set(), n.set(e, s)), s.add(r);
37
- }, p = (e, r) => {
38
- const s = n.get(e);
39
- s && s.delete(r);
40
- }, v = (e) => {
41
- const r = n.get(e);
42
- if (r) {
43
- for (const s of r) s.unsubscribe(e);
44
- r.clear();
45
- }
46
- }, O = (e) => {
47
- let r, s = !1;
48
- const o = () => {
49
- if (r) {
50
- try {
51
- r();
52
- } catch (c) {
53
- console.error("bQuery reactive: Error in effect cleanup", c);
54
- }
55
- r = void 0;
56
- }
57
- }, i = () => {
58
- if (!s) {
59
- o(), v(i);
60
- try {
61
- r = l(i, e);
62
- } catch (c) {
63
- console.error("bQuery reactive: Error in effect", c);
64
- }
65
- }
66
- };
67
- return i(), () => {
68
- s = !0, o(), v(i);
69
- };
70
- }, y = class {
71
- constructor(e) {
72
- this._value = e, this.subscribers = /* @__PURE__ */ new Set();
73
- }
74
- get value() {
75
- const e = b();
76
- return e && (this.subscribers.add(e), d(e, this)), this._value;
77
- }
78
- set value(e) {
79
- if (Object.is(this._value, e)) return;
80
- this._value = e;
81
- const r = Array.from(this.subscribers);
82
- for (const s of r) f(s);
83
- }
84
- peek() {
85
- return this._value;
86
- }
87
- update(e) {
88
- this.value = e(this._value);
89
- }
90
- dispose() {
91
- for (const e of this.subscribers) p(e, this);
92
- this.subscribers.clear();
93
- }
94
- unsubscribe(e) {
95
- this.subscribers.delete(e);
96
- }
97
- }, S = (e) => new y(e);
98
- export {
99
- v as a,
100
- d as c,
101
- g as d,
102
- w as i,
103
- f as l,
104
- S as n,
105
- D as o,
106
- O as r,
107
- b as s,
108
- y as t,
109
- l as u
110
- };
111
-
112
- //# sourceMappingURL=core-DnlyjbF2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-DnlyjbF2.js","names":[],"sources":["../src/reactive/internals.ts","../src/reactive/effect.ts","../src/reactive/core.ts"],"sourcesContent":["/**\n * Internal reactive plumbing shared across primitives.\n * @internal\n */\n\nexport type Observer = () => void;\nexport type CleanupFn = () => void;\n\n/**\n * Interface for reactive sources (Signals, Computed) that can unsubscribe observers.\n * @internal\n */\nexport interface ReactiveSource {\n unsubscribe(observer: Observer): void;\n}\n\nconst observerStack: Observer[] = [];\nlet batchDepth = 0;\nconst pendingObservers = new Set<Observer>();\n\n// Track dependencies for each observer to enable cleanup\nconst observerDependencies = new WeakMap<Observer, Set<ReactiveSource>>();\n\nexport const track = <T>(observer: Observer, fn: () => T): T => {\n observerStack.push(observer);\n try {\n return fn();\n } finally {\n observerStack.pop();\n }\n};\n\nexport const getCurrentObserver = (): Observer | undefined =>\n observerStack[observerStack.length - 1];\n\n/**\n * Executes a function without exposing the current observer to dependencies.\n * Unlike disabling tracking globally, this still allows nested reactive internals\n * (e.g., computed recomputation) to track their own dependencies.\n * @internal\n */\nexport const withoutCurrentObserver = <T>(fn: () => T): T => {\n // Push undefined to temporarily \"hide\" the current observer\n // This way, Signal.value reads won't link to the previous observer,\n // but nested track() calls (e.g., computed recompute) still work normally.\n observerStack.push(undefined as unknown as Observer);\n try {\n return fn();\n } finally {\n observerStack.pop();\n }\n};\n\nexport const scheduleObserver = (observer: Observer): void => {\n if (batchDepth > 0) {\n pendingObservers.add(observer);\n return;\n }\n observer();\n};\n\nconst flushObservers = (): void => {\n for (const observer of Array.from(pendingObservers)) {\n pendingObservers.delete(observer);\n try {\n observer();\n } catch (error) {\n console.error('bQuery reactive: Error in observer during batch flush', error);\n }\n }\n};\n\nexport const beginBatch = (): void => {\n batchDepth += 1;\n};\n\nexport const endBatch = (): void => {\n if (batchDepth <= 0) return;\n batchDepth -= 1;\n if (batchDepth === 0) {\n flushObservers();\n }\n};\n\n/**\n * Registers a dependency between an observer and a reactive source.\n * @internal\n */\nexport const registerDependency = (observer: Observer, source: ReactiveSource): void => {\n let deps = observerDependencies.get(observer);\n if (!deps) {\n deps = new Set();\n observerDependencies.set(observer, deps);\n }\n deps.add(source);\n};\n\n/**\n * Removes a specific source from an observer's dependency set.\n * Used when a source (e.g. Signal) is disposed to prevent stale references.\n * @internal\n */\nexport const removeDependency = (observer: Observer, source: ReactiveSource): void => {\n const deps = observerDependencies.get(observer);\n if (deps) {\n deps.delete(source);\n }\n};\n\n/**\n * Clears all dependencies for an observer, unsubscribing from all sources.\n * @internal\n */\nexport const clearDependencies = (observer: Observer): void => {\n const deps = observerDependencies.get(observer);\n if (deps) {\n for (const source of deps) {\n source.unsubscribe(observer);\n }\n deps.clear();\n }\n};\n","/**\n * Reactive effects.\n */\n\nimport { CleanupFn, Observer, track, clearDependencies } from './internals';\n\n/**\n * Creates a side effect that automatically re-runs when dependencies change.\n *\n * The effect runs immediately upon creation and then re-runs whenever\n * any signal or computed value read inside it changes.\n *\n * @param fn - The effect function to run\n * @returns A cleanup function to stop the effect\n */\nexport const effect = (fn: () => void | CleanupFn): CleanupFn => {\n let cleanupFn: CleanupFn | void;\n let isDisposed = false;\n\n const runCleanup = (): void => {\n if (cleanupFn) {\n try {\n cleanupFn();\n } catch (error) {\n console.error('bQuery reactive: Error in effect cleanup', error);\n }\n cleanupFn = undefined;\n }\n };\n\n const observer: Observer = () => {\n if (isDisposed) return;\n\n runCleanup();\n\n // Clear old dependencies before running to avoid stale subscriptions\n clearDependencies(observer);\n\n try {\n cleanupFn = track(observer, fn);\n } catch (error) {\n console.error('bQuery reactive: Error in effect', error);\n }\n };\n\n observer();\n\n return () => {\n isDisposed = true;\n runCleanup();\n // Clean up all dependencies when effect is disposed\n clearDependencies(observer);\n };\n};\n","/**\n * Core reactive signals.\n */\n\nimport {\n getCurrentObserver,\n registerDependency,\n removeDependency,\n scheduleObserver,\n type ReactiveSource,\n} from './internals';\n\n/**\n * A reactive value container that notifies subscribers on change.\n *\n * Signals are the foundational primitive of the reactive system.\n * Reading a signal's value inside an effect or computed automatically\n * establishes a reactive dependency.\n *\n * @template T - The type of the stored value\n */\nexport class Signal<T> implements ReactiveSource {\n private subscribers = new Set<() => void>();\n\n /**\n * Creates a new signal with an initial value.\n * @param _value - The initial value\n */\n constructor(private _value: T) {}\n\n /**\n * Gets the current value and tracks the read if inside an observer.\n * During untrack calls, getCurrentObserver returns undefined, preventing dependency tracking.\n */\n get value(): T {\n const current = getCurrentObserver();\n if (current) {\n this.subscribers.add(current);\n registerDependency(current, this);\n }\n return this._value;\n }\n\n /**\n * Sets a new value and notifies all subscribers if the value changed.\n * Uses Object.is for equality comparison.\n */\n set value(next: T) {\n if (Object.is(this._value, next)) return;\n this._value = next;\n // Create snapshot to avoid issues with subscribers modifying the set during iteration\n const subscribersSnapshot = Array.from(this.subscribers);\n for (const subscriber of subscribersSnapshot) {\n scheduleObserver(subscriber);\n }\n }\n\n /**\n * Reads the current value without tracking.\n * Useful when you need the value but don't want to create a dependency.\n *\n * @returns The current value\n */\n peek(): T {\n return this._value;\n }\n\n /**\n * Updates the value using a function.\n * Useful for updates based on the current value.\n *\n * @param updater - Function that receives current value and returns new value\n */\n update(updater: (current: T) => T): void {\n this.value = updater(this._value);\n }\n\n /**\n * Removes all subscribers from this signal.\n * Use this when a signal is no longer needed to prevent memory leaks.\n *\n * @example\n * ```ts\n * const count = signal(0);\n * effect(() => console.log(count.value));\n * count.dispose(); // All subscribers removed\n * ```\n */\n dispose(): void {\n // Remove this signal from each subscriber's dependency set\n // so the observer no longer holds a strong reference to it\n for (const subscriber of this.subscribers) {\n removeDependency(subscriber, this);\n }\n this.subscribers.clear();\n }\n\n /**\n * Removes an observer from this signal's subscriber set.\n * @internal\n */\n unsubscribe(observer: () => void): void {\n this.subscribers.delete(observer);\n }\n}\n\n/**\n * Creates a new reactive signal.\n *\n * @template T - The type of the signal value\n * @param value - The initial value\n * @returns A new Signal instance\n */\nexport const signal = <T>(value: T): Signal<T> => new Signal(value);\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"custom-directives-7wAShnnd.js","names":[],"sources":["../src/view/custom-directives.ts"],"sourcesContent":["import type { DirectiveHandler } from './types';\r\n\r\n/**\r\n * Function signature used to resolve custom directives without coupling the\r\n * view pipeline directly to the plugin module.\r\n * @internal\r\n */\r\nexport type CustomDirectiveResolver = (name: string) => DirectiveHandler | undefined;\r\n\r\nlet customDirectiveResolver: CustomDirectiveResolver | null = null;\r\n\r\n/**\r\n * Registers the resolver used by the view pipeline for custom directives.\r\n *\r\n * Pass `null` to unregister the current resolver and reset to the default behavior.\r\n * @internal\r\n */\r\nexport const registerCustomDirectiveResolver = (\r\n resolver: CustomDirectiveResolver | null\r\n): void => {\r\n customDirectiveResolver = resolver;\r\n};\r\n\r\n/**\r\n * Returns a custom directive handler when one is registered.\r\n * @internal\r\n */\r\nexport const getCustomDirective = (name: string): DirectiveHandler | undefined => {\r\n return customDirectiveResolver ? customDirectiveResolver(name) : undefined;\r\n};\r\n"],"mappings":"AASA,IAAI,IAA0D,MAQjD,IAAA,CACX,MACS;AACT,EAAA,IAA0B;GAOf,IAAA,CAAsB,MAC1B,IAA0B,EAAwB,CAAA,IAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"devtools-D2fQLhDN.js","names":[],"sources":["../src/devtools/devtools.ts"],"sourcesContent":["/**\r\n * bQuery DevTools — runtime debugging utilities.\r\n *\r\n * Enable devtools to inspect signals, stores, components, and view a\r\n * timeline of reactive events.\r\n *\r\n * @module bquery/devtools\r\n */\r\n\r\nimport type {\r\n ComponentSnapshot,\r\n DevtoolsOptions,\r\n DevtoolsState,\r\n SignalSnapshot,\r\n StoreSnapshot,\r\n TimelineEntry,\r\n TimelineEventType,\r\n} from './types';\r\nimport { listStores as _listStores, getStore as _getStore } from '../store/registry';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Internal state\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _enabled = false;\r\nlet _options: DevtoolsOptions = {};\r\nconst _timeline: TimelineEntry[] = [];\r\n\r\n/** Registered signals keyed by label. */\r\nconst _trackedSignals = new Map<string, { peek: () => unknown; subscriberCount: () => number }>();\r\n\r\n/** Monotonic counter for auto-labelling anonymous signals. */\r\nlet _signalCounter = 0;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Enable / disable\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Enable bQuery development mode.\r\n *\r\n * When enabled the devtools module records timeline events and\r\n * allows inspection of signals, stores, and components.\r\n *\r\n * @param enabled - `true` to enable, `false` to disable.\r\n * @param options - Optional configuration.\r\n *\r\n * @example\r\n * ```ts\r\n * import { enableDevtools } from '@bquery/bquery/devtools';\r\n * enableDevtools(true, { logToConsole: true });\r\n * ```\r\n */\r\nexport const enableDevtools = (enabled: boolean, options?: DevtoolsOptions): void => {\r\n _enabled = enabled;\r\n _options = options ?? {};\r\n\r\n if (!enabled) {\r\n _timeline.length = 0;\r\n _trackedSignals.clear();\r\n _signalCounter = 0;\r\n }\r\n};\r\n\r\n/**\r\n * Returns `true` when devtools are active.\r\n *\r\n * @example\r\n * ```ts\r\n * import { isDevtoolsEnabled } from '@bquery/bquery/devtools';\r\n * if (isDevtoolsEnabled()) { ... }\r\n * ```\r\n */\r\nexport const isDevtoolsEnabled = (): boolean => _enabled;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Signal tracking\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Register a signal for devtools inspection.\r\n *\r\n * @param label - Human-readable label (must be unique).\r\n * @param peek - Returns the signal's value without tracking.\r\n * @param subscriberCount - Returns the current subscriber count.\r\n * @throws If a signal with the same label is already tracked.\r\n *\r\n * @example\r\n * ```ts\r\n * import { trackSignal } from '@bquery/bquery/devtools';\r\n * import { signal } from '@bquery/bquery/reactive';\r\n *\r\n * const count = signal(0);\r\n * trackSignal('count', () => count.peek(), () => 0);\r\n * ```\r\n */\r\nexport const trackSignal = (\r\n label: string,\r\n peek: () => unknown,\r\n subscriberCount: () => number\r\n): void => {\r\n if (!_enabled) return;\r\n if (typeof label !== 'string' || label.length === 0) {\r\n throw new Error('bQuery devtools: trackSignal() requires a non-empty label');\r\n }\r\n _trackedSignals.set(label, { peek, subscriberCount });\r\n};\r\n\r\n/**\r\n * Remove a previously tracked signal.\r\n *\r\n * @param label - The label used during registration.\r\n *\r\n * @example\r\n * ```ts\r\n * import { untrackSignal } from '@bquery/bquery/devtools';\r\n * untrackSignal('count');\r\n * ```\r\n */\r\nexport const untrackSignal = (label: string): void => {\r\n _trackedSignals.delete(label);\r\n};\r\n\r\n/**\r\n * Generate a unique label for anonymous signals.\r\n *\r\n * @returns A label such as `signal_0`, `signal_1`, …\r\n *\r\n * @example\r\n * ```ts\r\n * import { generateSignalLabel } from '@bquery/bquery/devtools';\r\n * const label = generateSignalLabel(); // 'signal_0'\r\n * ```\r\n */\r\nexport const generateSignalLabel = (): string => `signal_${_signalCounter++}`;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Signal inspector\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * List all tracked signals with their current values.\r\n *\r\n * @returns An array of {@link SignalSnapshot} objects.\r\n *\r\n * @example\r\n * ```ts\r\n * import { inspectSignals } from '@bquery/bquery/devtools';\r\n * console.table(inspectSignals());\r\n * ```\r\n */\r\nexport const inspectSignals = (): SignalSnapshot[] => {\r\n const result: SignalSnapshot[] = [];\r\n for (const [label, entry] of _trackedSignals) {\r\n result.push({\r\n label,\r\n value: entry.peek(),\r\n subscriberCount: entry.subscriberCount(),\r\n });\r\n }\r\n return result;\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Store inspector\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * List all stores with their current state.\r\n *\r\n * Reads from the store registry (`listStores` / `getStore`) that is\r\n * already maintained by the store module.\r\n *\r\n * @returns An array of {@link StoreSnapshot} objects.\r\n *\r\n * @example\r\n * ```ts\r\n * import { inspectStores } from '@bquery/bquery/devtools';\r\n * console.table(inspectStores());\r\n * ```\r\n */\r\nexport const inspectStores = (): StoreSnapshot[] => {\r\n try {\r\n const ids: string[] = _listStores();\r\n return ids.map((id: string) => {\r\n const store = _getStore(id) as Record<string, unknown> | undefined;\r\n const state: Record<string, unknown> = {};\r\n if (store && typeof store === 'object' && '$state' in store) {\r\n const raw = (store as { $state: unknown }).$state;\r\n if (raw && typeof raw === 'object') {\r\n Object.assign(state, raw);\r\n }\r\n }\r\n return { id, state };\r\n });\r\n } catch {\r\n return [];\r\n }\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Component inspector\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * List all bQuery-registered custom elements visible in the document.\r\n *\r\n * @returns An array of {@link ComponentSnapshot} objects.\r\n *\r\n * @example\r\n * ```ts\r\n * import { inspectComponents } from '@bquery/bquery/devtools';\r\n * console.table(inspectComponents());\r\n * ```\r\n */\r\nexport const inspectComponents = (): ComponentSnapshot[] => {\r\n if (typeof document === 'undefined') return [];\r\n\r\n const result: ComponentSnapshot[] = [];\r\n const seen = new Set<string>();\r\n\r\n // Walk every custom element in the DOM (they must contain a hyphen)\r\n const all = document.querySelectorAll('*');\r\n for (let i = 0; i < all.length; i++) {\r\n const el = all[i];\r\n const tag = el.tagName.toLowerCase();\r\n if (!tag.includes('-')) continue;\r\n if (seen.has(tag)) continue;\r\n\r\n // Only include if registered via customElements\r\n if (typeof customElements !== 'undefined' && customElements.get(tag)) {\r\n seen.add(tag);\r\n const instances = document.querySelectorAll(tag);\r\n result.push({ tagName: tag, instanceCount: instances.length });\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Timeline\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Record a timeline event.\r\n *\r\n * This is called internally by bQuery modules (signals, store, router)\r\n * or can be called from user code / plugins to add custom entries.\r\n *\r\n * @param type - The event category.\r\n * @param detail - A human-readable description.\r\n *\r\n * @example\r\n * ```ts\r\n * import { recordEvent } from '@bquery/bquery/devtools';\r\n * recordEvent('signal:update', 'count changed to 5');\r\n * ```\r\n */\r\nexport const recordEvent = (type: TimelineEventType, detail: string): void => {\r\n if (!_enabled) return;\r\n\r\n const entry: TimelineEntry = {\r\n timestamp: Date.now(),\r\n type,\r\n detail,\r\n };\r\n _timeline.push(entry);\r\n\r\n if (_options.logToConsole) {\r\n console.log(`[bq:devtools] ${type} — ${detail}`);\r\n }\r\n};\r\n\r\n/**\r\n * Returns the full timeline log.\r\n *\r\n * @returns A read-only array of {@link TimelineEntry} objects.\r\n *\r\n * @example\r\n * ```ts\r\n * import { getTimeline } from '@bquery/bquery/devtools';\r\n * for (const e of getTimeline()) {\r\n * console.log(e.type, e.detail);\r\n * }\r\n * ```\r\n */\r\nexport const getTimeline = (): readonly TimelineEntry[] => _timeline;\r\n\r\n/**\r\n * Clear all timeline entries.\r\n *\r\n * @example\r\n * ```ts\r\n * import { clearTimeline } from '@bquery/bquery/devtools';\r\n * clearTimeline();\r\n * ```\r\n */\r\nexport const clearTimeline = (): void => {\r\n _timeline.length = 0;\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Combined state\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns a snapshot of the full devtools state.\r\n *\r\n * @returns A {@link DevtoolsState} object.\r\n *\r\n * @example\r\n * ```ts\r\n * import { getDevtoolsState } from '@bquery/bquery/devtools';\r\n * const state = getDevtoolsState();\r\n * console.log(state.enabled, state.timeline.length);\r\n * ```\r\n */\r\nexport const getDevtoolsState = (): DevtoolsState => ({\r\n enabled: _enabled,\r\n options: { ..._options },\r\n timeline: [..._timeline],\r\n});\r\n\r\n// ---------------------------------------------------------------------------\r\n// Log helpers (convenience for interactive debugging)\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Pretty-print all tracked signals to the console.\r\n *\r\n * @example\r\n * ```ts\r\n * import { logSignals } from '@bquery/bquery/devtools';\r\n * logSignals(); // → table output\r\n * ```\r\n */\r\nexport const logSignals = (): void => {\r\n const signals = inspectSignals();\r\n if (signals.length === 0) {\r\n console.log('[bq:devtools] No tracked signals.');\r\n return;\r\n }\r\n\r\n console.table(signals);\r\n};\r\n\r\n/**\r\n * Pretty-print all stores to the console.\r\n *\r\n * @example\r\n * ```ts\r\n * import { logStores } from '@bquery/bquery/devtools';\r\n * logStores(); // → table output\r\n * ```\r\n */\r\nexport const logStores = (): void => {\r\n const stores = inspectStores();\r\n if (stores.length === 0) {\r\n console.log('[bq:devtools] No stores registered.');\r\n return;\r\n }\r\n\r\n console.table(stores.map((s) => ({ id: s.id, state: JSON.stringify(s.state) })));\r\n};\r\n\r\n/**\r\n * Pretty-print all registered components to the console.\r\n *\r\n * @example\r\n * ```ts\r\n * import { logComponents } from '@bquery/bquery/devtools';\r\n * logComponents(); // → table output\r\n * ```\r\n */\r\nexport const logComponents = (): void => {\r\n const components = inspectComponents();\r\n if (components.length === 0) {\r\n console.log('[bq:devtools] No custom elements found.');\r\n return;\r\n }\r\n\r\n console.table(components);\r\n};\r\n\r\n/**\r\n * Pretty-print the timeline to the console.\r\n *\r\n * @param last - Only show the last N entries (default: all).\r\n *\r\n * @example\r\n * ```ts\r\n * import { logTimeline } from '@bquery/bquery/devtools';\r\n * logTimeline(10);\r\n * ```\r\n */\r\nexport const logTimeline = (last?: number): void => {\r\n const entries = typeof last === 'number' && last > 0 ? _timeline.slice(-last) : _timeline;\r\n if (entries.length === 0) {\r\n console.log('[bq:devtools] Timeline is empty.');\r\n return;\r\n }\r\n\r\n console.table(\r\n entries.map((e) => ({\r\n time: new Date(e.timestamp).toISOString(),\r\n type: e.type,\r\n detail: e.detail,\r\n }))\r\n );\r\n};\r\n"],"mappings":"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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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"}