@bquery/bquery 1.6.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 (402) hide show
  1. package/README.md +192 -18
  2. package/dist/a11y/announce.d.ts +43 -0
  3. package/dist/a11y/announce.d.ts.map +1 -0
  4. package/dist/a11y/audit.d.ts +42 -0
  5. package/dist/a11y/audit.d.ts.map +1 -0
  6. package/dist/a11y/index.d.ts +53 -0
  7. package/dist/a11y/index.d.ts.map +1 -0
  8. package/dist/a11y/media-preferences.d.ts +77 -0
  9. package/dist/a11y/media-preferences.d.ts.map +1 -0
  10. package/dist/a11y/roving-tab-index.d.ts +38 -0
  11. package/dist/a11y/roving-tab-index.d.ts.map +1 -0
  12. package/dist/a11y/skip-link.d.ts +37 -0
  13. package/dist/a11y/skip-link.d.ts.map +1 -0
  14. package/dist/a11y/trap-focus.d.ts +49 -0
  15. package/dist/a11y/trap-focus.d.ts.map +1 -0
  16. package/dist/a11y/types.d.ts +152 -0
  17. package/dist/a11y/types.d.ts.map +1 -0
  18. package/dist/a11y-DVBCy09c.js +421 -0
  19. package/dist/a11y-DVBCy09c.js.map +1 -0
  20. package/dist/a11y.es.mjs +14 -0
  21. package/dist/component/component.d.ts.map +1 -1
  22. package/dist/component/html.d.ts.map +1 -1
  23. package/dist/component/index.d.ts +2 -1
  24. package/dist/component/index.d.ts.map +1 -1
  25. package/dist/component/library.d.ts.map +1 -1
  26. package/dist/component/scope.d.ts +138 -0
  27. package/dist/component/scope.d.ts.map +1 -0
  28. package/dist/component/types.d.ts +53 -1
  29. package/dist/component/types.d.ts.map +1 -1
  30. package/dist/component-L3-JfOFz.js +684 -0
  31. package/dist/component-L3-JfOFz.js.map +1 -0
  32. package/dist/component.es.mjs +9 -6
  33. package/dist/{config-DRmZZno3.js → config-DhT9auRm.js} +4 -4
  34. package/dist/{config-DRmZZno3.js.map → config-DhT9auRm.js.map} +1 -1
  35. package/dist/constraints-D5RHQLmP.js +100 -0
  36. package/dist/constraints-D5RHQLmP.js.map +1 -0
  37. package/dist/core/collection.d.ts +134 -0
  38. package/dist/core/collection.d.ts.map +1 -1
  39. package/dist/core/element.d.ts +120 -0
  40. package/dist/core/element.d.ts.map +1 -1
  41. package/dist/core/env.d.ts +18 -0
  42. package/dist/core/env.d.ts.map +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/shared.d.ts +14 -0
  46. package/dist/core/shared.d.ts.map +1 -1
  47. package/dist/core/utils/index.d.ts +52 -41
  48. package/dist/core/utils/index.d.ts.map +1 -1
  49. package/dist/core-DdtZHzsS.js +168 -0
  50. package/dist/core-DdtZHzsS.js.map +1 -0
  51. package/dist/{core-CCEabVHl.js → core-EMYSLzaT.js} +293 -194
  52. package/dist/core-EMYSLzaT.js.map +1 -0
  53. package/dist/core.es.mjs +48 -46
  54. package/dist/custom-directives-Dr4C5lVV.js +9 -0
  55. package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
  56. package/dist/devtools/devtools.d.ts +212 -0
  57. package/dist/devtools/devtools.d.ts.map +1 -0
  58. package/dist/devtools/index.d.ts +20 -0
  59. package/dist/devtools/index.d.ts.map +1 -0
  60. package/dist/devtools/types.d.ts +69 -0
  61. package/dist/devtools/types.d.ts.map +1 -0
  62. package/dist/devtools-BhB2iDPT.js +122 -0
  63. package/dist/devtools-BhB2iDPT.js.map +1 -0
  64. package/dist/devtools.es.mjs +19 -0
  65. package/dist/dnd/draggable.d.ts +51 -0
  66. package/dist/dnd/draggable.d.ts.map +1 -0
  67. package/dist/dnd/droppable.d.ts +38 -0
  68. package/dist/dnd/droppable.d.ts.map +1 -0
  69. package/dist/dnd/index.d.ts +47 -0
  70. package/dist/dnd/index.d.ts.map +1 -0
  71. package/dist/dnd/sortable.d.ts +43 -0
  72. package/dist/dnd/sortable.d.ts.map +1 -0
  73. package/dist/dnd/types.d.ts +250 -0
  74. package/dist/dnd/types.d.ts.map +1 -0
  75. package/dist/dnd-NwZBYh4l.js +244 -0
  76. package/dist/dnd-NwZBYh4l.js.map +1 -0
  77. package/dist/dnd.es.mjs +6 -0
  78. package/dist/env-CTdvLaH2.js +19 -0
  79. package/dist/env-CTdvLaH2.js.map +1 -0
  80. package/dist/forms/create-form.d.ts +49 -0
  81. package/dist/forms/create-form.d.ts.map +1 -0
  82. package/dist/forms/index.d.ts +40 -0
  83. package/dist/forms/index.d.ts.map +1 -0
  84. package/dist/forms/types.d.ts +185 -0
  85. package/dist/forms/types.d.ts.map +1 -0
  86. package/dist/forms/use-field.d.ts +34 -0
  87. package/dist/forms/use-field.d.ts.map +1 -0
  88. package/dist/forms/validators.d.ts +204 -0
  89. package/dist/forms/validators.d.ts.map +1 -0
  90. package/dist/forms-UcRHsYxC.js +227 -0
  91. package/dist/forms-UcRHsYxC.js.map +1 -0
  92. package/dist/forms.es.mjs +16 -0
  93. package/dist/full.d.ts +30 -11
  94. package/dist/full.d.ts.map +1 -1
  95. package/dist/full.es.mjs +209 -93
  96. package/dist/full.iife.js +47 -31
  97. package/dist/full.iife.js.map +1 -1
  98. package/dist/full.umd.js +47 -31
  99. package/dist/full.umd.js.map +1 -1
  100. package/dist/function-Cybd57JV.js +33 -0
  101. package/dist/function-Cybd57JV.js.map +1 -0
  102. package/dist/i18n/formatting.d.ts +40 -0
  103. package/dist/i18n/formatting.d.ts.map +1 -0
  104. package/dist/i18n/i18n.d.ts +48 -0
  105. package/dist/i18n/i18n.d.ts.map +1 -0
  106. package/dist/i18n/index.d.ts +57 -0
  107. package/dist/i18n/index.d.ts.map +1 -0
  108. package/dist/i18n/translate.d.ts +83 -0
  109. package/dist/i18n/translate.d.ts.map +1 -0
  110. package/dist/i18n/types.d.ts +156 -0
  111. package/dist/i18n/types.d.ts.map +1 -0
  112. package/dist/i18n-kuF6Ekj6.js +89 -0
  113. package/dist/i18n-kuF6Ekj6.js.map +1 -0
  114. package/dist/i18n.es.mjs +6 -0
  115. package/dist/index.d.ts +11 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.es.mjs +257 -143
  118. package/dist/media/battery.d.ts +35 -0
  119. package/dist/media/battery.d.ts.map +1 -0
  120. package/dist/media/breakpoints.d.ts +51 -0
  121. package/dist/media/breakpoints.d.ts.map +1 -0
  122. package/dist/media/clipboard.d.ts +30 -0
  123. package/dist/media/clipboard.d.ts.map +1 -0
  124. package/dist/media/device-sensors.d.ts +54 -0
  125. package/dist/media/device-sensors.d.ts.map +1 -0
  126. package/dist/media/geolocation.d.ts +38 -0
  127. package/dist/media/geolocation.d.ts.map +1 -0
  128. package/dist/media/index.d.ts +42 -0
  129. package/dist/media/index.d.ts.map +1 -0
  130. package/dist/media/media-query.d.ts +36 -0
  131. package/dist/media/media-query.d.ts.map +1 -0
  132. package/dist/media/network.d.ts +35 -0
  133. package/dist/media/network.d.ts.map +1 -0
  134. package/dist/media/types.d.ts +173 -0
  135. package/dist/media/types.d.ts.map +1 -0
  136. package/dist/media/viewport.d.ts +32 -0
  137. package/dist/media/viewport.d.ts.map +1 -0
  138. package/dist/media-i-fB5WxI.js +340 -0
  139. package/dist/media-i-fB5WxI.js.map +1 -0
  140. package/dist/media.es.mjs +12 -0
  141. package/dist/motion/index.d.ts +7 -3
  142. package/dist/motion/index.d.ts.map +1 -1
  143. package/dist/motion/morph.d.ts +27 -0
  144. package/dist/motion/morph.d.ts.map +1 -0
  145. package/dist/motion/parallax.d.ts +30 -0
  146. package/dist/motion/parallax.d.ts.map +1 -0
  147. package/dist/motion/reduced-motion.d.ts +36 -3
  148. package/dist/motion/reduced-motion.d.ts.map +1 -1
  149. package/dist/motion/types.d.ts +58 -0
  150. package/dist/motion/types.d.ts.map +1 -1
  151. package/dist/motion/typewriter.d.ts +31 -0
  152. package/dist/motion/typewriter.d.ts.map +1 -0
  153. package/dist/motion-BJsAuULb.js +530 -0
  154. package/dist/motion-BJsAuULb.js.map +1 -0
  155. package/dist/motion.es.mjs +27 -23
  156. package/dist/{view-C70lA3vf.js → mount-B4Y8bk8Z.js} +166 -160
  157. package/dist/mount-B4Y8bk8Z.js.map +1 -0
  158. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  159. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  160. package/dist/{platform-Dr9b6fsq.js → platform-Dw2gE3zI.js} +21 -22
  161. package/dist/{platform-Dr9b6fsq.js.map → platform-Dw2gE3zI.js.map} +1 -1
  162. package/dist/platform.es.mjs +2 -2
  163. package/dist/plugin/index.d.ts +22 -0
  164. package/dist/plugin/index.d.ts.map +1 -0
  165. package/dist/plugin/registry.d.ts +108 -0
  166. package/dist/plugin/registry.d.ts.map +1 -0
  167. package/dist/plugin/types.d.ts +110 -0
  168. package/dist/plugin/types.d.ts.map +1 -0
  169. package/dist/plugin-C2WuC8SF.js +66 -0
  170. package/dist/plugin-C2WuC8SF.js.map +1 -0
  171. package/dist/plugin.es.mjs +9 -0
  172. package/dist/reactive/async-data.d.ts +28 -3
  173. package/dist/reactive/async-data.d.ts.map +1 -1
  174. package/dist/reactive/computed.d.ts +10 -0
  175. package/dist/reactive/computed.d.ts.map +1 -1
  176. package/dist/reactive/effect.d.ts +3 -0
  177. package/dist/reactive/effect.d.ts.map +1 -1
  178. package/dist/reactive/http.d.ts +194 -0
  179. package/dist/reactive/http.d.ts.map +1 -0
  180. package/dist/reactive/index.d.ts +2 -2
  181. package/dist/reactive/index.d.ts.map +1 -1
  182. package/dist/reactive/pagination.d.ts +126 -0
  183. package/dist/reactive/pagination.d.ts.map +1 -0
  184. package/dist/reactive/polling.d.ts +55 -0
  185. package/dist/reactive/polling.d.ts.map +1 -0
  186. package/dist/reactive/readonly.d.ts +20 -1
  187. package/dist/reactive/readonly.d.ts.map +1 -1
  188. package/dist/reactive/rest.d.ts +293 -0
  189. package/dist/reactive/rest.d.ts.map +1 -0
  190. package/dist/reactive/scope.d.ts +140 -0
  191. package/dist/reactive/scope.d.ts.map +1 -0
  192. package/dist/reactive/signal.d.ts +16 -2
  193. package/dist/reactive/signal.d.ts.map +1 -1
  194. package/dist/reactive/to-value.d.ts +57 -0
  195. package/dist/reactive/to-value.d.ts.map +1 -0
  196. package/dist/reactive/websocket.d.ts +285 -0
  197. package/dist/reactive/websocket.d.ts.map +1 -0
  198. package/dist/reactive-DwkhUJfP.js +1148 -0
  199. package/dist/reactive-DwkhUJfP.js.map +1 -0
  200. package/dist/reactive.es.mjs +38 -20
  201. package/dist/registry-B08iilIh.js +26 -0
  202. package/dist/registry-B08iilIh.js.map +1 -0
  203. package/dist/router/bq-link.d.ts +112 -0
  204. package/dist/router/bq-link.d.ts.map +1 -0
  205. package/dist/router/constraints.d.ts +9 -0
  206. package/dist/router/constraints.d.ts.map +1 -0
  207. package/dist/router/index.d.ts +15 -7
  208. package/dist/router/index.d.ts.map +1 -1
  209. package/dist/router/match.d.ts +0 -1
  210. package/dist/router/match.d.ts.map +1 -1
  211. package/dist/router/path-pattern.d.ts +14 -0
  212. package/dist/router/path-pattern.d.ts.map +1 -0
  213. package/dist/router/query.d.ts.map +1 -1
  214. package/dist/router/router.d.ts +3 -1
  215. package/dist/router/router.d.ts.map +1 -1
  216. package/dist/router/state.d.ts +25 -2
  217. package/dist/router/state.d.ts.map +1 -1
  218. package/dist/router/types.d.ts +48 -4
  219. package/dist/router/types.d.ts.map +1 -1
  220. package/dist/router/use-route.d.ts +50 -0
  221. package/dist/router/use-route.d.ts.map +1 -0
  222. package/dist/router/utils.d.ts +3 -0
  223. package/dist/router/utils.d.ts.map +1 -1
  224. package/dist/router-CQikC9Ed.js +492 -0
  225. package/dist/router-CQikC9Ed.js.map +1 -0
  226. package/dist/router.es.mjs +14 -10
  227. package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
  228. package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
  229. package/dist/security/index.d.ts +2 -2
  230. package/dist/security/index.d.ts.map +1 -1
  231. package/dist/security.es.mjs +1 -1
  232. package/dist/ssr/hydrate.d.ts +65 -0
  233. package/dist/ssr/hydrate.d.ts.map +1 -0
  234. package/dist/ssr/index.d.ts +59 -0
  235. package/dist/ssr/index.d.ts.map +1 -0
  236. package/dist/ssr/render.d.ts +62 -0
  237. package/dist/ssr/render.d.ts.map +1 -0
  238. package/dist/ssr/serialize.d.ts +118 -0
  239. package/dist/ssr/serialize.d.ts.map +1 -0
  240. package/dist/ssr/types.d.ts +70 -0
  241. package/dist/ssr/types.d.ts.map +1 -0
  242. package/dist/ssr-_dAcGdzu.js +248 -0
  243. package/dist/ssr-_dAcGdzu.js.map +1 -0
  244. package/dist/ssr.es.mjs +9 -0
  245. package/dist/store/create-store.d.ts.map +1 -1
  246. package/dist/store/index.d.ts +1 -1
  247. package/dist/store/index.d.ts.map +1 -1
  248. package/dist/store/persisted.d.ts +38 -4
  249. package/dist/store/persisted.d.ts.map +1 -1
  250. package/dist/store/types.d.ts +138 -1
  251. package/dist/store/types.d.ts.map +1 -1
  252. package/dist/store/utils.d.ts +2 -2
  253. package/dist/store/utils.d.ts.map +1 -1
  254. package/dist/store-Cb3gPRve.js +338 -0
  255. package/dist/store-Cb3gPRve.js.map +1 -0
  256. package/dist/store.es.mjs +11 -10
  257. package/dist/storybook/index.d.ts.map +1 -1
  258. package/dist/storybook.es.mjs +1 -1
  259. package/dist/storybook.es.mjs.map +1 -1
  260. package/dist/testing/index.d.ts +23 -0
  261. package/dist/testing/index.d.ts.map +1 -0
  262. package/dist/testing/testing.d.ts +156 -0
  263. package/dist/testing/testing.d.ts.map +1 -0
  264. package/dist/testing/types.d.ts +134 -0
  265. package/dist/testing/types.d.ts.map +1 -0
  266. package/dist/testing-C5Sjfsna.js +224 -0
  267. package/dist/testing-C5Sjfsna.js.map +1 -0
  268. package/dist/testing.es.mjs +9 -0
  269. package/dist/type-guards-BMX2c0LP.js +44 -0
  270. package/dist/type-guards-BMX2c0LP.js.map +1 -0
  271. package/dist/untrack-D0fnO5k2.js +36 -0
  272. package/dist/untrack-D0fnO5k2.js.map +1 -0
  273. package/dist/view/custom-directives.d.ts +20 -0
  274. package/dist/view/custom-directives.d.ts.map +1 -0
  275. package/dist/view/evaluate.d.ts.map +1 -1
  276. package/dist/view/process.d.ts.map +1 -1
  277. package/dist/view.es.mjs +9 -9
  278. package/package.json +47 -11
  279. package/src/a11y/announce.ts +131 -0
  280. package/src/a11y/audit.ts +314 -0
  281. package/src/a11y/index.ts +68 -0
  282. package/src/a11y/media-preferences.ts +255 -0
  283. package/src/a11y/roving-tab-index.ts +164 -0
  284. package/src/a11y/skip-link.ts +255 -0
  285. package/src/a11y/trap-focus.ts +184 -0
  286. package/src/a11y/types.ts +183 -0
  287. package/src/component/component.ts +599 -524
  288. package/src/component/html.ts +153 -153
  289. package/src/component/index.ts +52 -50
  290. package/src/component/library.ts +540 -518
  291. package/src/component/scope.ts +212 -0
  292. package/src/component/types.ts +310 -256
  293. package/src/core/collection.ts +249 -1
  294. package/src/core/element.ts +252 -11
  295. package/src/core/env.ts +60 -0
  296. package/src/core/index.ts +1 -0
  297. package/src/core/shared.ts +64 -0
  298. package/src/core/utils/index.ts +66 -1
  299. package/src/devtools/devtools.ts +410 -0
  300. package/src/devtools/index.ts +48 -0
  301. package/src/devtools/types.ts +104 -0
  302. package/src/dnd/draggable.ts +296 -0
  303. package/src/dnd/droppable.ts +228 -0
  304. package/src/dnd/index.ts +62 -0
  305. package/src/dnd/sortable.ts +307 -0
  306. package/src/dnd/types.ts +293 -0
  307. package/src/forms/create-form.ts +320 -0
  308. package/src/forms/index.ts +70 -0
  309. package/src/forms/types.ts +203 -0
  310. package/src/forms/use-field.ts +231 -0
  311. package/src/forms/validators.ts +294 -0
  312. package/src/full.ts +554 -229
  313. package/src/i18n/formatting.ts +67 -0
  314. package/src/i18n/i18n.ts +200 -0
  315. package/src/i18n/index.ts +67 -0
  316. package/src/i18n/translate.ts +182 -0
  317. package/src/i18n/types.ts +171 -0
  318. package/src/index.ts +72 -0
  319. package/src/media/battery.ts +116 -0
  320. package/src/media/breakpoints.ts +129 -0
  321. package/src/media/clipboard.ts +80 -0
  322. package/src/media/device-sensors.ts +158 -0
  323. package/src/media/geolocation.ts +119 -0
  324. package/src/media/index.ts +76 -0
  325. package/src/media/media-query.ts +92 -0
  326. package/src/media/network.ts +115 -0
  327. package/src/media/types.ts +177 -0
  328. package/src/media/viewport.ts +84 -0
  329. package/src/motion/index.ts +11 -2
  330. package/src/motion/morph.ts +151 -0
  331. package/src/motion/parallax.ts +120 -0
  332. package/src/motion/reduced-motion.ts +52 -3
  333. package/src/motion/types.ts +63 -0
  334. package/src/motion/typewriter.ts +164 -0
  335. package/src/plugin/index.ts +37 -0
  336. package/src/plugin/registry.ts +284 -0
  337. package/src/plugin/types.ts +137 -0
  338. package/src/reactive/async-data.ts +250 -29
  339. package/src/reactive/computed.ts +53 -1
  340. package/src/reactive/effect.ts +29 -6
  341. package/src/reactive/http.ts +790 -0
  342. package/src/reactive/index.ts +60 -0
  343. package/src/reactive/pagination.ts +317 -0
  344. package/src/reactive/polling.ts +179 -0
  345. package/src/reactive/readonly.ts +52 -8
  346. package/src/reactive/rest.ts +859 -0
  347. package/src/reactive/scope.ts +276 -0
  348. package/src/reactive/signal.ts +61 -1
  349. package/src/reactive/to-value.ts +71 -0
  350. package/src/reactive/websocket.ts +849 -0
  351. package/src/router/bq-link.ts +279 -0
  352. package/src/router/constraints.ts +204 -0
  353. package/src/router/index.ts +15 -7
  354. package/src/router/match.ts +255 -49
  355. package/src/router/path-pattern.ts +52 -0
  356. package/src/router/query.ts +3 -0
  357. package/src/router/router.ts +258 -48
  358. package/src/router/state.ts +51 -3
  359. package/src/router/types.ts +50 -4
  360. package/src/router/use-route.ts +68 -0
  361. package/src/router/utils.ts +44 -3
  362. package/src/security/index.ts +12 -17
  363. package/src/security/sanitize.ts +70 -70
  364. package/src/security/trusted-html.ts +71 -71
  365. package/src/ssr/hydrate.ts +84 -0
  366. package/src/ssr/index.ts +70 -0
  367. package/src/ssr/render.ts +508 -0
  368. package/src/ssr/serialize.ts +296 -0
  369. package/src/ssr/types.ts +81 -0
  370. package/src/store/create-store.ts +146 -8
  371. package/src/store/define-store.ts +49 -49
  372. package/src/store/index.ts +5 -0
  373. package/src/store/mapping.ts +74 -74
  374. package/src/store/persisted.ts +245 -62
  375. package/src/store/types.ts +247 -92
  376. package/src/store/utils.ts +4 -10
  377. package/src/store/watch.ts +53 -53
  378. package/src/storybook/index.ts +480 -479
  379. package/src/testing/index.ts +42 -0
  380. package/src/testing/testing.ts +593 -0
  381. package/src/testing/types.ts +170 -0
  382. package/src/view/custom-directives.ts +28 -0
  383. package/src/view/evaluate.ts +2 -0
  384. package/src/view/process.ts +19 -3
  385. package/dist/component-BEQgt5hl.js +0 -600
  386. package/dist/component-BEQgt5hl.js.map +0 -1
  387. package/dist/core-BGQJVw0-.js +0 -35
  388. package/dist/core-BGQJVw0-.js.map +0 -1
  389. package/dist/core-CCEabVHl.js.map +0 -1
  390. package/dist/effect-AFRW_Plg.js +0 -84
  391. package/dist/effect-AFRW_Plg.js.map +0 -1
  392. package/dist/motion-D9TcHxOF.js +0 -415
  393. package/dist/motion-D9TcHxOF.js.map +0 -1
  394. package/dist/reactive-DSkct0dO.js +0 -254
  395. package/dist/reactive-DSkct0dO.js.map +0 -1
  396. package/dist/router-CbDhl8rS.js +0 -188
  397. package/dist/router-CbDhl8rS.js.map +0 -1
  398. package/dist/store-BwDvI45q.js +0 -263
  399. package/dist/store-BwDvI45q.js.map +0 -1
  400. package/dist/untrack-B0rVscTc.js +0 -7
  401. package/dist/untrack-B0rVscTc.js.map +0 -1
  402. package/dist/view-C70lA3vf.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-L3-JfOFz.js","names":[],"sources":["../src/component/props.ts","../src/component/scope.ts","../src/component/component.ts","../src/component/html.ts","../src/component/library.ts"],"sourcesContent":["/**\n * Prop coercion utilities.\n *\n * @module bquery/component\n */\n\nimport type { PropDefinition } from './types';\n\n/**\n * Coerces a string attribute value into a typed prop value.\n * Supports String, Number, Boolean, Object, Array, and custom converters.\n *\n * @internal\n * @template T - The target type\n * @param rawValue - The raw string value from the attribute\n * @param config - The prop definition with type information\n * @returns The coerced value of type T\n */\nexport const coercePropValue = <T>(rawValue: string, config: PropDefinition<T>): T => {\n const { type } = config;\n\n if (type === String) return rawValue as T;\n\n if (type === Number) {\n return Number(rawValue) as T;\n }\n\n if (type === Boolean) {\n const normalized = rawValue.trim().toLowerCase();\n if (normalized === '' || normalized === 'true' || normalized === '1') {\n return true as T;\n }\n if (normalized === 'false' || normalized === '0') {\n return false as T;\n }\n return Boolean(rawValue) as T;\n }\n\n if (type === Object || type === Array) {\n try {\n return JSON.parse(rawValue) as T;\n } catch {\n return rawValue as T;\n }\n }\n\n if (typeof type === 'function') {\n const callable = type as (value: unknown) => T;\n const constructable = type as new (value: unknown) => T;\n\n // Explicit construct mode takes precedence\n if (config.construct === true) {\n return Reflect.construct(constructable, [rawValue]) as T;\n }\n if (config.construct === false) {\n return callable(rawValue);\n }\n\n // Auto-detect: Check if type is constructable\n // A function is considered constructable if:\n // 1. It has a prototype with properties beyond just constructor, OR\n // 2. Its prototype.constructor is not itself (inherited), OR\n // 3. It's a class (toString starts with \"class\")\n const hasPrototype = type.prototype !== undefined && type.prototype !== null;\n const prototypeProps = hasPrototype ? Object.getOwnPropertyNames(type.prototype) : [];\n const hasPrototypeMethods = prototypeProps.length > 1;\n const hasInheritedConstructor = hasPrototype && type.prototype.constructor !== type;\n const isClassSyntax = /^class\\s/.test(Function.prototype.toString.call(type));\n\n const isConstructable = hasPrototypeMethods || hasInheritedConstructor || isClassSyntax;\n\n // For constructable types (e.g. Date, custom classes), prefer `new` to avoid\n // silent wrong-type returns (Date() returns string, new Date() returns Date)\n if (isConstructable) {\n try {\n return Reflect.construct(constructable, [rawValue]) as T;\n } catch {\n // Fall back to calling as function if construction fails\n return callable(rawValue);\n }\n }\n\n // For non-constructable types (arrow functions, plain functions), call directly\n // but fall back to constructor if result is undefined (common for function constructors)\n try {\n const result = callable(rawValue);\n\n // If calling without `new` returned undefined and the function has a prototype,\n // it's likely a function constructor that should be called with `new`\n if (result === undefined && hasPrototype) {\n try {\n return Reflect.construct(constructable, [rawValue]) as T;\n } catch {\n // Construction also failed, return the undefined\n return result as T;\n }\n }\n\n return result as T;\n } catch (error) {\n // Fall back to constructor if error indicates 'new' is required\n const isNewRequired =\n error instanceof TypeError &&\n /cannot be invoked without 'new'|is not a function/i.test(error.message);\n\n if (isNewRequired) {\n return Reflect.construct(constructable, [rawValue]) as T;\n }\n\n // Rethrow original error for non-constructable converters\n throw error;\n }\n }\n\n return rawValue as T;\n};\n","/**\n * Component-scoped reactive primitives.\n *\n * Provides `useSignal`, `useComputed`, and `useEffect` that automatically\n * dispose when their owning component disconnects from the DOM.\n *\n * @module bquery/component\n */\n\nimport type { Computed } from '../reactive/computed';\nimport { computed } from '../reactive/computed';\nimport { detectDevEnvironment } from '../core/env';\nimport type { Signal } from '../reactive/core';\nimport { signal } from '../reactive/core';\nimport { effect } from '../reactive/effect';\nimport type { CleanupFn } from '../reactive/index';\n\n/**\n * Holds disposable resources created inside a component scope.\n * All registered disposers run when the component disconnects.\n * @internal\n */\nexport interface ComponentScope {\n /** Register a cleanup function to run on dispose */\n addDisposer(fn: CleanupFn): void;\n /** Dispose all registered resources */\n dispose(): void;\n}\n\n/** Currently active component scope. @internal */\nlet currentScope: ComponentScope | undefined;\n\n/**\n * Sets the active component scope.\n * @internal\n */\nexport function setCurrentScope(scope: ComponentScope | undefined): ComponentScope | undefined {\n const previousScope = currentScope;\n currentScope = scope;\n return previousScope;\n}\n\n/**\n * Returns the active component scope, or undefined if none.\n * @internal\n */\nexport function getCurrentScope(): ComponentScope | undefined {\n return currentScope;\n}\n\n/**\n * Creates a new component scope that tracks disposable resources.\n * @internal\n */\nexport function createComponentScope(): ComponentScope {\n const disposers: CleanupFn[] = [];\n\n return {\n addDisposer(fn: CleanupFn): void {\n disposers.push(fn);\n },\n dispose(): void {\n for (const fn of disposers) {\n try {\n fn();\n } catch (error) {\n if (\n detectDevEnvironment() &&\n typeof console !== 'undefined' &&\n typeof console.error === 'function'\n ) {\n console.error('bQuery component: Error disposing scoped resource', error);\n }\n }\n }\n disposers.length = 0;\n },\n };\n}\n\n/**\n * Creates a reactive signal scoped to the current component.\n *\n * The signal is automatically disposed when the component disconnects\n * from the DOM, removing all subscribers and preventing memory leaks.\n *\n * Must be called during a component lifecycle hook such as `connected`,\n * `beforeMount`, `onAdopted`, or `onAttributeChanged`.\n *\n * Do not create scoped primitives from `render()`. Repeated renders can\n * accumulate render-scoped resources until disconnect; prefer lifecycle hooks.\n *\n * @template T - The type of the signal value\n * @param initialValue - The initial value of the signal\n * @returns A new Signal instance that auto-disposes with the component\n * @throws {Error} If called outside a component scope\n *\n * @example\n * ```ts\n * import { component, html, useSignal } from '@bquery/bquery/component';\n *\n * component('my-counter', {\n * connected() {\n * const count = useSignal(0);\n * // count.dispose() is called automatically on disconnect\n * },\n * render({ state }) {\n * return html`<span>${state.count}</span>`;\n * },\n * });\n * ```\n */\nexport function useSignal<T>(initialValue: T): Signal<T> {\n const scope = currentScope;\n if (!scope) {\n throw new Error(\n 'bQuery component: useSignal() must be called inside a component lifecycle hook. Avoid calling it directly from render()'\n );\n }\n const s = signal(initialValue);\n scope.addDisposer(() => s.dispose());\n return s;\n}\n\n/**\n * Creates a computed value scoped to the current component.\n *\n * The computed value's internal effect is automatically cleaned up\n * when the component disconnects from the DOM.\n *\n * Must be called during a component lifecycle hook such as `connected`,\n * `beforeMount`, `onAdopted`, or `onAttributeChanged`.\n *\n * Do not create scoped primitives from `render()`. Repeated renders can\n * accumulate render-scoped resources until disconnect; prefer lifecycle hooks.\n *\n * @template T - The type of the computed value\n * @param fn - Derivation function that reads reactive sources\n * @returns A new Computed instance that auto-cleans-up with the component\n * @throws {Error} If called outside a component scope\n *\n * @example\n * ```ts\n * import { component, html, useSignal, useComputed } from '@bquery/bquery/component';\n *\n * component('my-doubler', {\n * connected() {\n * const count = useSignal(1);\n * const doubled = useComputed(() => count.value * 2);\n * },\n * render({ state }) {\n * return html`<span>${state.doubled}</span>`;\n * },\n * });\n * ```\n */\nexport function useComputed<T>(fn: () => T): Computed<T> {\n const scope = currentScope;\n if (!scope) {\n throw new Error(\n 'bQuery component: useComputed() must be called inside a component lifecycle hook. Avoid calling it directly from render()'\n );\n }\n const c = computed(fn);\n scope.addDisposer(() => c.dispose());\n return c;\n}\n\n/**\n * Creates a side effect scoped to the current component.\n *\n * The effect runs immediately and re-runs when its reactive dependencies\n * change. It is automatically disposed when the component disconnects\n * from the DOM.\n *\n * Must be called during a component lifecycle hook such as `connected`,\n * `beforeMount`, `onAdopted`, or `onAttributeChanged`.\n *\n * Do not create scoped primitives from `render()`. Repeated renders can\n * accumulate render-scoped resources until disconnect; prefer lifecycle hooks.\n *\n * @param fn - The effect function; may return a cleanup function\n * @returns A cleanup function to manually stop the effect early\n * @throws {Error} If called outside a component scope\n *\n * @example\n * ```ts\n * import { component, useSignal, useEffect } from '@bquery/bquery/component';\n *\n * component('my-logger', {\n * connected() {\n * const count = useSignal(0);\n * useEffect(() => {\n * console.log('Count changed:', count.value);\n * return () => console.log('Cleanup');\n * });\n * },\n * render() { return '<p>Logger</p>'; },\n * });\n * ```\n */\nexport function useEffect(fn: () => void | CleanupFn): CleanupFn {\n const scope = currentScope;\n if (!scope) {\n throw new Error(\n 'bQuery component: useEffect() must be called inside a component lifecycle hook. Avoid calling it directly from render()'\n );\n }\n const cleanup = effect(fn);\n scope.addDisposer(cleanup);\n return cleanup;\n}\n","/**\n * Web Component factory and registry.\n *\n * @module bquery/component\n */\n\nimport type { CleanupFn } from '../reactive/signal';\nimport { effect, untrack } from '../reactive/signal';\nimport { sanitizeHtml } from '../security/sanitize';\nimport { coercePropValue } from './props';\nimport { createComponentScope, setCurrentScope, type ComponentScope } from './scope';\nimport type {\n AttributeChange,\n ComponentClass,\n ComponentDefinition,\n ComponentSignalLike,\n ComponentSignals,\n ComponentStateShape,\n PropDefinition,\n ShadowMode,\n} from './types';\n\n/**\n * Base extra tags preserved for component shadow DOM renders in addition to the\n * global sanitizer defaults. `slot` must remain allowed here because shadow DOM\n * content projection depends on authored `<slot>` elements in component render\n * output.\n */\nconst COMPONENT_ALLOWED_TAGS = ['slot'];\n\n/**\n * Base extra attributes preserved for component shadow DOM renders in addition\n * to the global sanitizer defaults.\n */\nconst COMPONENT_ALLOWED_ATTRIBUTES = [\n 'part',\n // Standard form attributes required by interactive shadow DOM content\n 'disabled',\n 'checked',\n 'placeholder',\n 'value',\n 'rows',\n 'cols',\n 'readonly',\n 'required',\n 'maxlength',\n 'minlength',\n 'max',\n 'min',\n 'step',\n 'pattern',\n 'autocomplete',\n 'autofocus',\n 'for',\n 'multiple',\n 'selected',\n 'wrap',\n];\n\n/**\n * Creates a custom element class for a component definition.\n *\n * This is useful when you want to extend or register the class manually\n * (e.g. with different tag names in tests or custom registries).\n *\n * @template TProps - Type of the component's props\n * @param tagName - The custom element tag name (used for diagnostics)\n * @param definition - The component configuration\n */\nconst createComponentClass = <\n TProps extends Record<string, unknown>,\n TState extends Record<string, unknown> | undefined = undefined,\n TSignals extends ComponentSignals = Record<string, never>,\n>(\n tagName: string,\n definition: ComponentDefinition<TProps, TState, TSignals>\n): ComponentClass<TState> => {\n const componentAllowedTags = [\n ...COMPONENT_ALLOWED_TAGS,\n ...(definition.sanitize?.allowTags ?? []),\n ];\n const componentAllowedAttributes = [\n ...COMPONENT_ALLOWED_ATTRIBUTES,\n ...(definition.sanitize?.allowAttributes ?? []),\n ];\n const signalSources = Object.values(definition.signals ?? {}) as ComponentSignalLike<unknown>[];\n\n /** Resolve the Shadow DOM mode from the `shadow` option. */\n const resolveShadowMode = (option: ShadowMode | undefined): 'open' | 'closed' | false => {\n if (option === false) return false;\n if (option === 'closed') return 'closed';\n // true, 'open', or undefined all resolve to 'open'\n return 'open';\n };\n const shadowMode = resolveShadowMode(definition.shadow);\n\n /**\n * Merges prop-derived observed attributes with any extra attributes from\n * `observeAttributes`, deduplicating to avoid redundant callbacks.\n */\n const observedAttrs = Array.from(\n new Set([...Object.keys(definition.props ?? {}), ...(definition.observeAttributes ?? [])])\n );\n\n class BQueryComponent extends HTMLElement {\n /** Internal state object for the component */\n private readonly state: ComponentStateShape<TState> = {\n ...(definition.state ?? {}),\n } as ComponentStateShape<TState>;\n /** Typed props object populated from attributes */\n private props = {} as TProps;\n /** Tracks missing required props for validation during connectedCallback */\n private missingRequiredProps = new Set<string>();\n /** Tracks whether the component has completed its initial mount */\n private hasMounted = false;\n /** Cleanup for external signal subscriptions */\n private signalEffectCleanup?: CleanupFn;\n /** Component-scoped reactive resource tracker */\n private scope?: ComponentScope;\n /** Render target for open/closed shadow roots or the host element when shadow DOM is disabled */\n private readonly renderRootNode: HTMLElement | ShadowRoot;\n\n constructor() {\n super();\n if (shadowMode !== false) {\n this.renderRootNode = this.attachShadow({ mode: shadowMode });\n } else {\n this.renderRootNode = this;\n }\n this.syncProps();\n }\n\n /**\n * Returns the list of attributes to observe for changes.\n */\n static get observedAttributes(): string[] {\n return observedAttrs;\n }\n\n /**\n * Called when the element is added to the DOM.\n */\n connectedCallback(): void {\n try {\n // Defer only the initial mount until all required props are present.\n // Already-mounted components must still reconnect their signal\n // subscriptions so reactive updates can resume after reattachment.\n if (!this.hasMounted && this.missingRequiredProps.size > 0) {\n // Component will mount once all required props are satisfied\n // via attributeChangedCallback\n return;\n }\n if (this.hasMounted) {\n // Recreate scope for reconnected component\n this.scope = createComponentScope();\n const previousScope = setCurrentScope(this.scope);\n try {\n definition.connected?.call(this);\n } catch (error) {\n this.handleError(error as Error);\n } finally {\n setCurrentScope(previousScope);\n }\n this.setupSignalSubscriptions(true);\n return;\n }\n this.mount();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Performs the initial mount of the component.\n * Called when the element is connected and all required props are present.\n * @internal\n */\n private mount(): void {\n if (this.hasMounted) return;\n const previousScope = setCurrentScope(this.ensureScope());\n let hookError = false;\n try {\n definition.beforeMount?.call(this);\n definition.connected?.call(this);\n } catch (error) {\n hookError = true;\n this.handleError(error as Error);\n } finally {\n setCurrentScope(previousScope);\n }\n if (hookError) {\n this.scope?.dispose();\n this.scope = undefined;\n return;\n }\n this.render();\n this.setupSignalSubscriptions();\n this.hasMounted = true;\n }\n\n /**\n * Called when the element is removed from the DOM.\n */\n disconnectedCallback(): void {\n try {\n this.signalEffectCleanup?.();\n this.signalEffectCleanup = undefined;\n // Dispose all scoped reactive resources (useSignal, useComputed, useEffect)\n this.scope?.dispose();\n this.scope = undefined;\n definition.disconnected?.call(this);\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Called when an observed attribute changes.\n */\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n try {\n const previousProps = this.cloneProps();\n this.syncProps();\n\n // Fire the user-facing onAttributeChanged hook for every observed attribute change\n if (definition.onAttributeChanged) {\n const previousScope = setCurrentScope(this.ensureScope());\n try {\n definition.onAttributeChanged.call(this, name, oldValue, newValue);\n } finally {\n setCurrentScope(previousScope);\n }\n }\n\n if (this.hasMounted) {\n // Component already mounted - trigger update render\n this.render(true, previousProps, { name, oldValue, newValue });\n } else if (this.isConnected && this.missingRequiredProps.size === 0) {\n // All required props are now satisfied and element is connected\n // Trigger the deferred initial mount\n this.mount();\n }\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Called when the element is moved to a new document (e.g. via `document.adoptNode`).\n */\n adoptedCallback(): void {\n if (!definition.onAdopted) {\n return;\n }\n\n const previousScope = setCurrentScope(this.ensureScope());\n try {\n definition.onAdopted.call(this);\n } catch (error) {\n this.handleError(error as Error);\n } finally {\n setCurrentScope(previousScope);\n }\n }\n\n /**\n * Handles errors during component lifecycle.\n * @internal\n */\n private handleError(error: Error): void {\n if (definition.onError) {\n definition.onError.call(this, error);\n } else {\n console.error(`bQuery component error in <${tagName}>:`, error);\n }\n }\n\n /**\n * Ensures the component has an active scope for scoped reactive primitives.\n * @internal\n */\n private ensureScope(): ComponentScope {\n return (this.scope ??= createComponentScope());\n }\n\n /**\n * Updates a state property and triggers a re-render.\n *\n * @param key - The state property key\n * @param value - The new value\n */\n setState<TKey extends keyof ComponentStateShape<TState>>(\n key: TKey,\n value: ComponentStateShape<TState>[TKey]\n ): void {\n this.state[key] = value;\n this.render(true, this.cloneProps(), undefined, false);\n }\n\n /**\n * Gets a state property value.\n *\n * @param key - The state property key\n * @returns The current value\n */\n getState<TKey extends keyof ComponentStateShape<TState>>(\n key: TKey\n ): ComponentStateShape<TState>[TKey];\n getState<TResult = unknown>(key: string): TResult;\n getState(key: string): unknown {\n return (this.state as Record<string, unknown>)[key];\n }\n\n /**\n * Subscribes to declared reactive sources and re-renders on change.\n *\n * @param renderOnInitialRun - When true, immediately re-renders after\n * re-subscribing so detached components resync with any signal changes\n * that happened while they were disconnected.\n * @internal\n */\n private setupSignalSubscriptions(renderOnInitialRun = false): void {\n if (this.signalEffectCleanup || signalSources.length === 0) return;\n\n let isInitialRun = true;\n this.signalEffectCleanup = effect(() => {\n try {\n for (const source of signalSources) {\n // Intentionally read each source to register this effect as a subscriber.\n void source.value;\n }\n\n if (isInitialRun) {\n isInitialRun = false;\n if (renderOnInitialRun && this.hasMounted && this.isConnected) {\n // Signal-driven reconnect renders do not change props, so the\n // previous-props snapshot is the current prop set at reconnect time.\n const previousProps = this.cloneProps();\n untrack(() => {\n this.render(true, previousProps, undefined, false);\n });\n }\n return;\n }\n\n if (!this.hasMounted || !this.isConnected) return;\n\n // Signal updates leave props unchanged, so cloning the current props\n // provides the previous-props snapshot expected by beforeUpdate().\n const previousProps = this.cloneProps();\n untrack(() => {\n this.render(true, previousProps, undefined, false);\n });\n } catch (error) {\n this.handleError(error as Error);\n }\n });\n }\n\n /**\n * Synchronizes props from attributes.\n * @internal\n */\n private syncProps(): void {\n const props = definition.props ?? {};\n for (const [key, config] of Object.entries(props) as [string, PropDefinition][]) {\n const attrValue = this.getAttribute(key);\n let value: unknown;\n\n if (attrValue == null) {\n if (config.required && config.default === undefined) {\n // Mark as missing instead of throwing - validate during connectedCallback\n this.missingRequiredProps.add(key);\n value = undefined;\n } else {\n value = config.default ?? undefined;\n }\n } else {\n // Attribute is present, remove from missing set if it was there\n if (this.missingRequiredProps.has(key)) {\n this.missingRequiredProps.delete(key);\n }\n value = coercePropValue(attrValue, config);\n }\n\n if (config.validator && value !== undefined) {\n const isValid = config.validator(value);\n if (!isValid) {\n throw new Error(\n `bQuery component: validation failed for prop \"${key}\" with value ${JSON.stringify(value)}`\n );\n }\n }\n\n (this.props as Record<string, unknown>)[key] = value;\n }\n }\n\n /**\n * Creates a shallow snapshot of the current props for lifecycle diffing.\n * A shallow copy is sufficient because component props are re-derived from\n * reflected attributes on each update, so nested object mutation is not\n * tracked as part of this lifecycle diff.\n * @internal\n */\n private cloneProps(): TProps {\n return { ...(this.props as Record<string, unknown>) } as TProps;\n }\n\n /**\n * Renders the component to its shadow root or host element.\n * @internal\n */\n private render(): void;\n private render(triggerUpdated: true, oldProps: TProps, change?: AttributeChange): void;\n private render(\n triggerUpdated: true,\n oldProps: TProps,\n change: AttributeChange | undefined,\n runBeforeUpdate: boolean\n ): void;\n private render(\n triggerUpdated = false,\n oldProps?: TProps,\n change?: AttributeChange,\n runBeforeUpdate = true\n ): void {\n try {\n if (triggerUpdated && runBeforeUpdate && definition.beforeUpdate) {\n if (!oldProps) {\n throw new Error('bQuery component: previous props are required for update renders');\n }\n const shouldUpdate = definition.beforeUpdate.call(this, this.props, oldProps);\n if (shouldUpdate === false) return;\n }\n\n const emit = (event: string, detail?: unknown): void => {\n this.dispatchEvent(new CustomEvent(event, { detail, bubbles: true, composed: true }));\n };\n\n const renderRoot = this.renderRootNode;\n\n const markup = definition.render({\n props: this.props,\n state: this.state,\n signals: (definition.signals ?? {}) as TSignals,\n emit,\n });\n\n // Component render output is authored by the component definition itself,\n // so we can explicitly preserve shadow-DOM-specific markup such as <slot>,\n // the stylistic `part` attribute, and standard form/input attributes without\n // relaxing the global DOM sanitization rules.\n const sanitizedMarkup = sanitizeHtml(markup, {\n allowTags: componentAllowedTags,\n allowAttributes: componentAllowedAttributes,\n });\n let existingStyleElement: HTMLStyleElement | null = null;\n if (definition.styles) {\n existingStyleElement = renderRoot.querySelector<HTMLStyleElement>(\n 'style[data-bquery-component-style]'\n );\n }\n\n renderRoot.innerHTML = sanitizedMarkup;\n\n if (definition.styles) {\n const styleElement = existingStyleElement ?? document.createElement('style');\n if (!existingStyleElement) {\n styleElement.setAttribute('data-bquery-component-style', '');\n }\n styleElement.textContent = definition.styles;\n renderRoot.prepend(styleElement);\n }\n\n if (triggerUpdated) {\n definition.updated?.call(this, change);\n }\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n }\n\n return BQueryComponent as ComponentClass<TState>;\n};\n\n/**\n * Creates a custom element class for a component definition.\n *\n * This is useful when you want to extend or register the class manually\n * (e.g. with different tag names in tests or custom registries).\n *\n * @template TProps - Type of the component's props\n * @template TState - Type of the component's internal state. When provided,\n * `definition.state` is required, `render({ state })` is strongly typed, and\n * returned instances expose typed `getState()` / `setState()` helpers.\n * @param tagName - The custom element tag name (used for diagnostics)\n * @param definition - The component configuration\n */\nexport function defineComponent<\n TProps extends Record<string, unknown>,\n TSignals extends ComponentSignals = Record<string, never>,\n>(\n tagName: string,\n definition: ComponentDefinition<TProps, undefined, TSignals>\n): ComponentClass<undefined>;\nexport function defineComponent<\n TProps extends Record<string, unknown>,\n TState extends Record<string, unknown>,\n TSignals extends ComponentSignals = Record<string, never>,\n>(\n tagName: string,\n definition: ComponentDefinition<TProps, TState, TSignals>\n): ComponentClass<TState>;\nexport function defineComponent<\n TProps extends Record<string, unknown>,\n TState extends Record<string, unknown> | undefined = undefined,\n TSignals extends ComponentSignals = Record<string, never>,\n>(\n tagName: string,\n definition: ComponentDefinition<TProps, TState, TSignals>\n): ComponentClass<TState> {\n return createComponentClass(tagName, definition);\n}\n\n/**\n * Defines and registers a custom Web Component.\n *\n * This function creates a new custom element with the given tag name\n * and configuration. The component uses Shadow DOM for encapsulation\n * and automatically re-renders when observed attributes change.\n *\n * @template TProps - Type of the component's props\n * @template TState - Type of the component's internal state. When provided,\n * `definition.state` is required and lifecycle hooks receive typed state\n * helpers via `this.getState()` / `this.setState()`.\n * @param tagName - The custom element tag name (must contain a hyphen)\n * @param definition - The component configuration\n *\n * @example\n * ```ts\n * component<{ start: number }, { count: number }>('counter-button', {\n * props: {\n * start: { type: Number, default: 0 },\n * },\n * state: { count: 0 },\n * styles: `\n * button { padding: 0.5rem 1rem; }\n * `,\n * connected() {\n * // Use event delegation on shadow root so handler survives re-renders\n * const handleClick = (event: Event) => {\n * const target = event.target as HTMLElement | null;\n * if (target?.matches('button')) {\n * this.setState('count', this.getState('count') + 1);\n * }\n * };\n * this.shadowRoot?.addEventListener('click', handleClick);\n * // Store handler for cleanup\n * (this as any)._handleClick = handleClick;\n * },\n * disconnected() {\n * // Clean up event listener to prevent memory leaks\n * const handleClick = (this as any)._handleClick;\n * if (handleClick) {\n * this.shadowRoot?.removeEventListener('click', handleClick);\n * }\n * },\n * render({ props, state }) {\n * return html`\n * <button>\n * Count: ${state.count}\n * </button>\n * `;\n * },\n * });\n * ```\n */\nexport function component<\n TProps extends Record<string, unknown>,\n TSignals extends ComponentSignals = Record<string, never>,\n>(tagName: string, definition: ComponentDefinition<TProps, undefined, TSignals>): void;\nexport function component<\n TProps extends Record<string, unknown>,\n TState extends Record<string, unknown>,\n TSignals extends ComponentSignals = Record<string, never>,\n>(tagName: string, definition: ComponentDefinition<TProps, TState, TSignals>): void;\nexport function component<\n TProps extends Record<string, unknown>,\n TState extends Record<string, unknown> | undefined = undefined,\n TSignals extends ComponentSignals = Record<string, never>,\n>(tagName: string, definition: ComponentDefinition<TProps, TState, TSignals>): void {\n const elementClass = createComponentClass(tagName, definition);\n\n if (!customElements.get(tagName)) {\n customElements.define(tagName, elementClass);\n }\n}\n","import {\n isTrustedHtml,\n type SanitizedHtml,\n toSanitizedHtml,\n unwrapTrustedHtml,\n} from '../security/trusted-html';\nconst BOOLEAN_ATTRIBUTE_MARKER: unique symbol = Symbol('bquery.booleanAttribute');\nconst BOOLEAN_ATTRIBUTE_NAME = /^[^\\0-\\x20\"'/>=]+$/;\n\n/**\n * Public shape of a boolean HTML attribute created by {@link bool}.\n *\n * This type is returned from {@link bool} and can be interpolated into\n * {@link html} / {@link safeHtml} templates to conditionally include or omit\n * an attribute by name. The internal marker property used for runtime checks\n * remains private and is not part of the public API.\n *\n * @example\n * ```ts\n * const disabled = bool('disabled', isDisabled);\n * const button = html`<button ${disabled}>Click</button>`;\n * ```\n */\nexport interface BooleanAttribute {\n readonly enabled: boolean;\n readonly name: string;\n}\n\ninterface BooleanAttributeValue extends BooleanAttribute {\n readonly [BOOLEAN_ATTRIBUTE_MARKER]: true;\n}\n\nconst isBooleanAttributeValue = (value: unknown): value is BooleanAttributeValue => {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<BooleanAttributeValue>;\n return (\n candidate[BOOLEAN_ATTRIBUTE_MARKER] === true &&\n typeof candidate.enabled === 'boolean' &&\n typeof candidate.name === 'string'\n );\n};\n\nconst stringifyTemplateValue = (value: unknown): string => {\n if (isBooleanAttributeValue(value)) {\n return value.enabled ? value.name : '';\n }\n\n return String(value ?? '');\n};\n\nconst escapeMap: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#x27;',\n '`': '&#x60;',\n};\n\nconst escapeTemplateValue = (value: unknown): string => {\n if (isBooleanAttributeValue(value)) {\n return value.enabled ? value.name : '';\n }\n\n return stringifyTemplateValue(value).replace(/[&<>\"'`]/g, (char) => escapeMap[char]);\n};\n\n/**\n * Creates a boolean-attribute marker for the {@link html} and {@link safeHtml} template tags.\n *\n * When the condition is truthy, the attribute name is rendered without a value.\n * When the condition is falsy, an empty string is rendered and any surrounding\n * template-literal whitespace is preserved.\n *\n * @param name - HTML attribute name to emit\n * @param enabled - Whether the boolean attribute should be present\n * @returns Internal marker consumed by template tags\n *\n * @example\n * ```ts\n * html`<button ${bool('disabled', isDisabled)}>Save</button>`;\n * // Result when isDisabled = true: '<button disabled>Save</button>'\n * ```\n */\nexport const bool = (name: string, enabled: unknown): BooleanAttribute => {\n if (!BOOLEAN_ATTRIBUTE_NAME.test(name)) {\n throw new TypeError(`Invalid boolean attribute name: ${name}`);\n }\n\n const attribute: BooleanAttributeValue = {\n [BOOLEAN_ATTRIBUTE_MARKER]: true,\n enabled: Boolean(enabled),\n name,\n };\n\n return Object.freeze(attribute);\n};\n\n/**\n * Tagged template literal for creating HTML strings.\n *\n * This function handles interpolation of values into HTML templates,\n * converting null/undefined to empty strings.\n *\n * @param strings - Template literal string parts\n * @param values - Interpolated values\n * @returns Combined HTML string\n *\n * @example\n * ```ts\n * const name = 'World';\n * const greeting = html`<h1>Hello, ${name}!</h1>`;\n * // Result: '<h1>Hello, World!</h1>'\n * ```\n */\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): string => {\n return strings.reduce(\n (acc, part, index) => `${acc}${part}${stringifyTemplateValue(values[index])}`,\n ''\n );\n};\n\n/**\n * Escapes HTML entities in interpolated values for XSS prevention.\n * Use this when you need to safely embed user content in templates.\n *\n * @param strings - Template literal string parts\n * @param values - Interpolated values to escape\n * @returns Branded escaped HTML string safe for bQuery template composition\n *\n * @example\n * ```ts\n * const userInput = '<script>alert(\"xss\")</script>';\n * const safe = safeHtml`<div>${userInput}</div>`;\n * // Result: '<div>&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;</div>'\n * ```\n */\nexport const safeHtml = (strings: TemplateStringsArray, ...values: unknown[]): SanitizedHtml => {\n const escape = (value: unknown): string => {\n if (isTrustedHtml(value)) return unwrapTrustedHtml(value);\n return escapeTemplateValue(value);\n };\n\n return toSanitizedHtml(\n strings.reduce(\n (acc, part, index) => `${acc}${part}${index < values.length ? escape(values[index]) : ''}`,\n ''\n )\n );\n};\n","/**\n * Default component library based on native Web Components.\n *\n * @module bquery/component\n */\n\nimport { getBqueryConfig } from '../platform/config';\nimport { escapeHtml } from '../security';\nimport { component } from './component';\nimport { html } from './html';\n\n/** Options for registering the default component library. */\nexport interface DefaultComponentLibraryOptions {\n /** Prefix used for all registered component tags. Defaults to `bq`. */\n prefix?: string;\n}\n\n/** Tag names returned by registerDefaultComponents(). */\nexport interface RegisteredDefaultComponents {\n /** Button component tag name. */\n button: string;\n /** Card component tag name. */\n card: string;\n /** Input component tag name. */\n input: string;\n /** Textarea component tag name. */\n textarea: string;\n /** Checkbox component tag name. */\n checkbox: string;\n}\n\nconst baseStyles = `\n :host {\n color: inherit;\n font: inherit;\n }\n`;\n\nconst controlStyles = `\n ${baseStyles}\n .field {\n display: inline-flex;\n flex-direction: column;\n gap: 0.375rem;\n width: 100%;\n }\n .label {\n color: #334155;\n font-size: 0.875rem;\n font-weight: 600;\n }\n .control {\n border: 1px solid #cbd5e1;\n border-radius: 0.75rem;\n box-sizing: border-box;\n font: inherit;\n min-height: 2.75rem;\n outline: none;\n padding: 0.75rem 0.875rem;\n width: 100%;\n background: #fff;\n color: #0f172a;\n transition: border-color 160ms ease, box-shadow 160ms ease;\n }\n .control:focus {\n border-color: #2563eb;\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);\n }\n .control:disabled {\n background: #f8fafc;\n color: #94a3b8;\n cursor: not-allowed;\n }\n`;\n\nconst escapeProp = (value: string): string => escapeHtml(value);\n\nconst handlerStore = new WeakMap<HTMLElement, Record<string, EventListener>>();\n\nconst readHandler = (element: HTMLElement, key: string): EventListener | undefined => {\n return handlerStore.get(element)?.[key];\n};\n\nconst storeHandler = (element: HTMLElement, key: string, value: EventListener): void => {\n const handlers = handlerStore.get(element) ?? {};\n handlers[key] = value;\n handlerStore.set(element, handlers);\n};\n\n/**\n * Detect a value-only input update, patch the live control in place, and\n * return whether the component can skip a full shadow DOM re-render.\n *\n * @param element - The host custom element whose shadow DOM is being updated\n * @param newProps - The next reflected input props for the pending update\n * @param oldProps - The previous reflected input props from the last render\n */\nconst canSkipInputRender = (\n element: HTMLElement,\n newProps: {\n label: string;\n type: string;\n value: string;\n placeholder: string;\n name: string;\n disabled: boolean;\n },\n oldProps: {\n label: string;\n type: string;\n value: string;\n placeholder: string;\n name: string;\n disabled: boolean;\n }\n): boolean => {\n if (oldProps.label !== newProps.label) return false;\n if (oldProps.type !== newProps.type) return false;\n if (oldProps.placeholder !== newProps.placeholder) return false;\n if (oldProps.name !== newProps.name) return false;\n if (oldProps.disabled !== newProps.disabled) return false;\n\n // Verify shadow DOM still matches expected non-value props before skipping re-render\n const shadowRoot = element.shadowRoot;\n if (!shadowRoot) return false;\n\n const labelEl = shadowRoot.querySelector('.label');\n if ((labelEl?.textContent ?? '') !== newProps.label) return false;\n\n const control = shadowRoot.querySelector('input.control') as HTMLInputElement | null;\n if (!control) return false;\n\n if (control.type !== newProps.type) return false;\n if (control.placeholder !== newProps.placeholder) return false;\n if (control.name !== newProps.name) return false;\n if (control.disabled !== newProps.disabled) return false;\n\n if (control.value !== newProps.value) {\n control.value = newProps.value;\n }\n\n return true;\n};\n\n/**\n * Detect a value-only textarea update, patch the live control in place, and\n * return whether the component can skip a full shadow DOM re-render.\n *\n * @param element - The host custom element whose shadow DOM is being updated\n * @param newProps - The next reflected textarea props for the pending update\n * @param oldProps - The previous reflected textarea props from the last render\n */\nconst canSkipTextareaRender = (\n element: HTMLElement,\n newProps: {\n label: string;\n value: string;\n placeholder: string;\n name: string;\n rows: number;\n disabled: boolean;\n },\n oldProps: {\n label: string;\n value: string;\n placeholder: string;\n name: string;\n rows: number;\n disabled: boolean;\n }\n): boolean => {\n if (oldProps.label !== newProps.label) return false;\n if (oldProps.placeholder !== newProps.placeholder) return false;\n if (oldProps.name !== newProps.name) return false;\n if (oldProps.rows !== newProps.rows) return false;\n if (oldProps.disabled !== newProps.disabled) return false;\n\n // Verify shadow DOM still matches expected non-value props before skipping re-render\n const shadowRoot = element.shadowRoot;\n if (!shadowRoot) return false;\n\n const labelEl = shadowRoot.querySelector('.label');\n if ((labelEl?.textContent ?? '') !== newProps.label) return false;\n\n const control = shadowRoot.querySelector('textarea.control') as HTMLTextAreaElement | null;\n if (!control) return false;\n\n if (control.placeholder !== newProps.placeholder) return false;\n if (control.name !== newProps.name) return false;\n if (Number(control.rows) !== newProps.rows) return false;\n if (control.disabled !== newProps.disabled) return false;\n\n if (control.value !== newProps.value) {\n control.value = newProps.value;\n }\n return true;\n};\n\nconst renderTextareaControl = (props: {\n value: string;\n placeholder: string;\n name: string;\n rows: number;\n disabled: boolean;\n}): string => {\n return [\n '<textarea',\n ' part=\"control\"',\n ' class=\"control\"',\n ` placeholder=\"${escapeProp(props.placeholder)}\"`,\n ` name=\"${escapeProp(props.name)}\"`,\n ` rows=\"${props.rows}\"`,\n props.disabled ? ' disabled' : '',\n `>${escapeProp(props.value)}</textarea>`,\n ].join('');\n};\n\n/**\n * Register a default set of foundational UI components.\n *\n * The library is intentionally small and dependency-free, providing common\n * primitives that can be themed via shadow parts and CSS custom properties.\n *\n * @param options - Optional registration settings such as a custom tag prefix\n * @returns The registered tag names for each component\n */\nexport const registerDefaultComponents = (\n options: DefaultComponentLibraryOptions = {}\n): RegisteredDefaultComponents => {\n const prefix = options.prefix ?? getBqueryConfig().components?.prefix ?? 'bq';\n const tags: RegisteredDefaultComponents = {\n button: `${prefix}-button`,\n card: `${prefix}-card`,\n input: `${prefix}-input`,\n textarea: `${prefix}-textarea`,\n checkbox: `${prefix}-checkbox`,\n };\n\n component<{\n label: string;\n variant: string;\n size: string;\n type: string;\n disabled: boolean;\n }>(tags.button, {\n props: {\n label: { type: String, default: '' },\n variant: { type: String, default: 'primary' },\n size: { type: String, default: 'md' },\n type: { type: String, default: 'button' },\n disabled: { type: Boolean, default: false },\n },\n styles: `\n ${baseStyles}\n button {\n appearance: none;\n border: 0;\n border-radius: 999px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font: inherit;\n font-weight: 600;\n gap: 0.5rem;\n min-height: 2.5rem;\n padding: 0.65rem 1rem;\n transition: transform 160ms ease, opacity 160ms ease, background 160ms ease;\n background: #2563eb;\n color: #fff;\n }\n button[data-variant='secondary'] {\n background: #e2e8f0;\n color: #0f172a;\n }\n button[data-size='sm'] {\n min-height: 2.125rem;\n padding: 0.5rem 0.875rem;\n }\n button[data-size='lg'] {\n min-height: 3rem;\n padding: 0.875rem 1.25rem;\n }\n button:hover:not(:disabled) {\n transform: translateY(-1px);\n }\n button:disabled {\n cursor: not-allowed;\n opacity: 0.6;\n }\n `,\n render: ({ props }) => html`\n <button\n part=\"button\"\n type=\"${escapeProp(props.type)}\"\n data-variant=\"${escapeProp(props.variant)}\"\n data-size=\"${escapeProp(props.size)}\"\n ${props.disabled ? 'disabled' : ''}\n >\n <slot>${escapeProp(props.label)}</slot>\n </button>\n `,\n });\n\n component<{ title: string; footer: string; elevated: boolean }>(tags.card, {\n props: {\n title: { type: String, default: '' },\n footer: { type: String, default: '' },\n elevated: { type: Boolean, default: true },\n },\n styles: `\n ${baseStyles}\n article {\n background: #fff;\n border: 1px solid #e2e8f0;\n border-radius: 1rem;\n box-shadow: 0 10px 25px rgba(15, 23, 42, 0.08);\n color: #0f172a;\n display: block;\n padding: 1rem;\n }\n article[data-elevated='false'] {\n box-shadow: none;\n }\n header, footer {\n color: #475569;\n font-size: 0.95rem;\n font-weight: 600;\n }\n header {\n margin-bottom: 0.75rem;\n }\n footer {\n margin-top: 0.75rem;\n }\n `,\n render: ({ props }) => html`\n <article part=\"card\" data-elevated=\"${String(props.elevated)}\">\n ${props.title ? `<header part=\"header\">${escapeProp(props.title)}</header>` : ''}\n <section part=\"body\"><slot></slot></section>\n ${props.footer ? `<footer part=\"footer\">${escapeProp(props.footer)}</footer>` : ''}\n </article>\n `,\n });\n\n component<{\n label: string;\n type: string;\n value: string;\n placeholder: string;\n name: string;\n disabled: boolean;\n }>(tags.input, {\n props: {\n label: { type: String, default: '' },\n type: { type: String, default: 'text' },\n value: { type: String, default: '' },\n placeholder: { type: String, default: '' },\n name: { type: String, default: '' },\n disabled: { type: Boolean, default: false },\n },\n styles: controlStyles,\n /**\n * Skip the full shadow DOM re-render when only the reflected input value\n * changed, because the live control has already been patched in place.\n */\n beforeUpdate(newProps, oldProps) {\n if (canSkipInputRender(this, newProps, oldProps)) {\n return false;\n }\n return true;\n },\n connected() {\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement | null;\n if (!target?.matches('input')) return;\n event.stopPropagation();\n this.setAttribute('value', target.value);\n this.dispatchEvent(\n new CustomEvent('input', {\n detail: { value: target.value },\n bubbles: true,\n composed: true,\n })\n );\n };\n storeHandler(this, '__bqueryInputHandler', handleInput);\n this.shadowRoot?.addEventListener('input', handleInput);\n },\n disconnected() {\n const handleInput = readHandler(this, '__bqueryInputHandler');\n if (handleInput) {\n this.shadowRoot?.removeEventListener('input', handleInput);\n }\n },\n render: ({ props }) => html`\n <label part=\"field\" class=\"field\">\n ${props.label ? `<span part=\"label\" class=\"label\">${escapeProp(props.label)}</span>` : ''}\n <input\n part=\"control\"\n class=\"control\"\n type=\"${escapeProp(props.type)}\"\n value=\"${escapeProp(props.value)}\"\n placeholder=\"${escapeProp(props.placeholder)}\"\n name=\"${escapeProp(props.name)}\"\n ${props.disabled ? 'disabled' : ''}\n />\n </label>\n `,\n });\n\n component<{\n label: string;\n value: string;\n placeholder: string;\n name: string;\n rows: number;\n disabled: boolean;\n }>(tags.textarea, {\n props: {\n label: { type: String, default: '' },\n value: { type: String, default: '' },\n placeholder: { type: String, default: '' },\n name: { type: String, default: '' },\n rows: { type: Number, default: 4 },\n disabled: { type: Boolean, default: false },\n },\n styles: `${controlStyles}\n textarea.control {\n min-height: 6rem;\n resize: vertical;\n }\n `,\n /**\n * Skip the full shadow DOM re-render when only the reflected textarea value\n * changed, because the live control has already been patched in place.\n */\n beforeUpdate(newProps, oldProps) {\n if (canSkipTextareaRender(this, newProps, oldProps)) {\n return false;\n }\n return true;\n },\n connected() {\n const handleInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement | null;\n if (!target?.matches('textarea')) return;\n event.stopPropagation();\n this.setAttribute('value', target.value);\n this.dispatchEvent(\n new CustomEvent('input', {\n detail: { value: target.value },\n bubbles: true,\n composed: true,\n })\n );\n };\n storeHandler(this, '__bqueryTextareaHandler', handleInput);\n this.shadowRoot?.addEventListener('input', handleInput);\n },\n disconnected() {\n const handleInput = readHandler(this, '__bqueryTextareaHandler');\n if (handleInput) {\n this.shadowRoot?.removeEventListener('input', handleInput);\n }\n },\n render: ({ props }) => html`\n <label part=\"field\" class=\"field\">\n ${props.label ? `<span part=\"label\" class=\"label\">${escapeProp(props.label)}</span>` : ''}\n ${renderTextareaControl(props)}\n </label>\n `,\n });\n\n component<{ label: string; checked: boolean; disabled: boolean }>(tags.checkbox, {\n props: {\n label: { type: String, default: '' },\n checked: { type: Boolean, default: false },\n disabled: { type: Boolean, default: false },\n },\n styles: `\n ${baseStyles}\n label {\n align-items: center;\n color: #0f172a;\n cursor: pointer;\n display: inline-flex;\n gap: 0.625rem;\n }\n input {\n accent-color: #2563eb;\n block-size: 1rem;\n inline-size: 1rem;\n }\n input:disabled {\n cursor: not-allowed;\n }\n `,\n connected() {\n const handleChange = (event: Event) => {\n const target = event.target as HTMLInputElement | null;\n if (!target?.matches('input[type=\"checkbox\"]')) return;\n event.stopPropagation();\n if (target.checked) {\n this.setAttribute('checked', 'true');\n } else {\n this.removeAttribute('checked');\n }\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: { checked: target.checked },\n bubbles: true,\n composed: true,\n })\n );\n };\n storeHandler(this, '__bqueryCheckboxHandler', handleChange);\n this.shadowRoot?.addEventListener('change', handleChange);\n },\n disconnected() {\n const handleChange = readHandler(this, '__bqueryCheckboxHandler');\n if (handleChange) {\n this.shadowRoot?.removeEventListener('change', handleChange);\n }\n },\n render: ({ props }) => html`\n <label part=\"label\">\n <input\n part=\"control\"\n type=\"checkbox\"\n ${props.checked ? 'checked' : ''}\n ${props.disabled ? 'disabled' : ''}\n />\n <span part=\"text\"><slot>${escapeProp(props.label)}</slot></span>\n </label>\n `,\n });\n\n return tags;\n};\n"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
- import { a as e, i as t, n as a, o as s, r as n, t as m } from "./component-BEQgt5hl.js";
1
+ import { a as e, c as a, i as o, l as t, n, o as m, r as f, s as l, t as p } from "./component-L3-JfOFz.js";
2
2
  export {
3
- a as bool,
3
+ n as bool,
4
4
  e as component,
5
- s as defineComponent,
6
- n as html,
7
- m as registerDefaultComponents,
8
- t as safeHtml
5
+ m as defineComponent,
6
+ f as html,
7
+ p as registerDefaultComponents,
8
+ o as safeHtml,
9
+ l as useComputed,
10
+ a as useEffect,
11
+ t as useSignal
9
12
  };
@@ -1,4 +1,4 @@
1
- import { i as o, r as f } from "./object-qGpWr6-J.js";
1
+ import { a as i, r as f } from "./object-BCk-1c8T.js";
2
2
  var s = {
3
3
  fetch: {
4
4
  headers: {},
@@ -27,14 +27,14 @@ var s = {
27
27
  if (Array.isArray(e)) return e.map((n) => r(n));
28
28
  if (f(e)) {
29
29
  const n = {};
30
- for (const [a, i] of Object.entries(e)) n[a] = r(i);
30
+ for (const [a, o] of Object.entries(e)) n[a] = r(o);
31
31
  return n;
32
32
  }
33
33
  return e;
34
- }, t = r(s), d = (e) => (t = r(o(s, t, e)), c()), c = () => r(t);
34
+ }, t = r(s), d = (e) => (t = r(i(s, t, e)), c()), c = () => r(t);
35
35
  export {
36
36
  c as n,
37
37
  d as t
38
38
  };
39
39
 
40
- //# sourceMappingURL=config-DRmZZno3.js.map
40
+ //# sourceMappingURL=config-DhT9auRm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-DRmZZno3.js","names":[],"sources":["../src/platform/config.ts"],"sourcesContent":["/**\n * Global bQuery configuration helpers.\n *\n * @module bquery/platform\n */\n\nimport { isPlainObject, merge } from '../core/utils/object';\n\n/** Supported response parsing strategies for fetch composables. */\nexport type BqueryFetchParseAs = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData' | 'response';\n\n/** Global fetch defaults used by useFetch(). */\nexport interface BqueryFetchConfig {\n /** Optional base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default request headers. */\n headers?: HeadersInit;\n /** Default response parser. */\n parseAs?: BqueryFetchParseAs;\n}\n\n/** Global cookie defaults used by useCookie(). */\nexport interface BqueryCookieConfig {\n /** Default cookie path. */\n path?: string;\n /** Default SameSite mode. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether cookies should be marked secure by default. */\n secure?: boolean;\n}\n\n/** Global announcer defaults used by useAnnouncer(). */\nexport interface BqueryAnnouncerConfig {\n /** Default politeness level. */\n politeness?: 'polite' | 'assertive';\n /** Whether announcements should be treated atomically. */\n atomic?: boolean;\n /** Delay before writing the message into the live region. */\n delay?: number;\n /** Delay after which the live region is cleared automatically. */\n clearDelay?: number;\n}\n\n/** Global page meta defaults used by definePageMeta(). */\nexport interface BqueryPageMetaConfig {\n /** Optional title template function. */\n titleTemplate?: (title: string) => string;\n}\n\n/** Global motion defaults used by transition(). */\nexport interface BqueryTransitionConfig {\n /** Skip transitions when reduced motion is preferred. */\n skipOnReducedMotion?: boolean;\n /** Classes applied to the root element during transitions. */\n classes?: string[];\n /** Transition type identifiers added when supported by the browser. */\n types?: string[];\n}\n\n/** Global default component library configuration. */\nexport interface BqueryComponentLibraryConfig {\n /** Prefix used by registerDefaultComponents(). */\n prefix?: string;\n}\n\n/** Complete global bQuery configuration object. */\nexport interface BqueryConfig {\n /** Fetch composable defaults. */\n fetch?: BqueryFetchConfig;\n /** Cookie composable defaults. */\n cookies?: BqueryCookieConfig;\n /** Announcer composable defaults. */\n announcer?: BqueryAnnouncerConfig;\n /** Page metadata defaults. */\n pageMeta?: BqueryPageMetaConfig;\n /** View transition defaults. */\n transitions?: BqueryTransitionConfig;\n /** Default component library options. */\n components?: BqueryComponentLibraryConfig;\n}\n\nconst defaultConfig: BqueryConfig = {\n fetch: {\n headers: {},\n parseAs: 'json',\n },\n cookies: {\n path: '/',\n sameSite: 'Lax',\n secure: false,\n },\n announcer: {\n politeness: 'polite',\n atomic: true,\n delay: 16,\n clearDelay: 1000,\n },\n pageMeta: {},\n transitions: {\n skipOnReducedMotion: false,\n classes: [],\n types: [],\n },\n components: {\n prefix: 'bq',\n },\n};\n\nconst cloneConfigValue = <T>(value: T): T => {\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return new Headers(value) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry)) as T;\n }\n\n if (isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] = cloneConfigValue(entry);\n }\n return result as T;\n }\n\n return value;\n};\n\nlet currentConfig: BqueryConfig = cloneConfigValue(defaultConfig);\n\n/**\n * Define or extend the global bQuery configuration.\n *\n * @param config - Partial configuration values to merge into the current config\n * @returns The resolved configuration after merging\n *\n * @example\n * ```ts\n * defineBqueryConfig({\n * fetch: { baseUrl: 'https://api.example.com' },\n * components: { prefix: 'ui' },\n * });\n * ```\n */\nexport const defineBqueryConfig = (config: BqueryConfig): BqueryConfig => {\n currentConfig = cloneConfigValue(\n merge(\n defaultConfig as Record<string, unknown>,\n currentConfig as Record<string, unknown>,\n config as Record<string, unknown>\n ) as BqueryConfig\n );\n return getBqueryConfig();\n};\n\n/**\n * Get the currently resolved bQuery configuration.\n *\n * @returns A cloned snapshot of the active configuration\n */\nexport const getBqueryConfig = (): BqueryConfig => {\n return cloneConfigValue(currentConfig);\n};\n"],"mappings":";AAiFA,IAAM,IAA8B;AAAA,EAClC,OAAO;AAAA,IACL,SAAS,CAAA;AAAA,IACT,SAAS;AAAA;EAEX,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA;EAEV,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA;EAEd,UAAU,CAAA;AAAA,EACV,aAAa;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,OAAO,CAAA;AAAA;EAET,YAAY,EACV,QAAQ,KAAA;GAIN,IAAA,CAAuB,MAAgB;AAC3C,MAAI,OAAO,UAAY,OAAe,aAAiB,QACrD,QAAO,IAAI,QAAQ,CAAA;AAGrB,MAAI,MAAM,QAAQ,CAAA,EAChB,QAAO,EAAM,IAAA,CAAK,MAAU,EAAiB,CAAA,CAAM;AAGrD,MAAI,EAAc,CAAA,GAAQ;AACxB,UAAM,IAAkC,CAAA;AACxC,eAAW,CAAC,GAAK,CAAA,KAAU,OAAO,QAAQ,CAAA,EACxC,CAAA,EAAO,CAAA,IAAO,EAAiB,CAAA;AAEjC,WAAO;AAAA;AAGT,SAAO;GAGL,IAA8B,EAAiB,CAAA,GAgBtC,IAAA,CAAsB,OACjC,IAAgB,EACd,EACE,GACA,GACA,CAAA,CACD,GAEI,EAAA,IAQI,IAAA,MACJ,EAAiB,CAAA"}
1
+ {"version":3,"file":"config-DhT9auRm.js","names":[],"sources":["../src/platform/config.ts"],"sourcesContent":["/**\n * Global bQuery configuration helpers.\n *\n * @module bquery/platform\n */\n\nimport { isPlainObject, merge } from '../core/utils/object';\n\n/** Supported response parsing strategies for fetch composables. */\nexport type BqueryFetchParseAs = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData' | 'response';\n\n/** Global fetch defaults used by useFetch(). */\nexport interface BqueryFetchConfig {\n /** Optional base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default request headers. */\n headers?: HeadersInit;\n /** Default response parser. */\n parseAs?: BqueryFetchParseAs;\n}\n\n/** Global cookie defaults used by useCookie(). */\nexport interface BqueryCookieConfig {\n /** Default cookie path. */\n path?: string;\n /** Default SameSite mode. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether cookies should be marked secure by default. */\n secure?: boolean;\n}\n\n/** Global announcer defaults used by useAnnouncer(). */\nexport interface BqueryAnnouncerConfig {\n /** Default politeness level. */\n politeness?: 'polite' | 'assertive';\n /** Whether announcements should be treated atomically. */\n atomic?: boolean;\n /** Delay before writing the message into the live region. */\n delay?: number;\n /** Delay after which the live region is cleared automatically. */\n clearDelay?: number;\n}\n\n/** Global page meta defaults used by definePageMeta(). */\nexport interface BqueryPageMetaConfig {\n /** Optional title template function. */\n titleTemplate?: (title: string) => string;\n}\n\n/** Global motion defaults used by transition(). */\nexport interface BqueryTransitionConfig {\n /** Skip transitions when reduced motion is preferred. */\n skipOnReducedMotion?: boolean;\n /** Classes applied to the root element during transitions. */\n classes?: string[];\n /** Transition type identifiers added when supported by the browser. */\n types?: string[];\n}\n\n/** Global default component library configuration. */\nexport interface BqueryComponentLibraryConfig {\n /** Prefix used by registerDefaultComponents(). */\n prefix?: string;\n}\n\n/** Complete global bQuery configuration object. */\nexport interface BqueryConfig {\n /** Fetch composable defaults. */\n fetch?: BqueryFetchConfig;\n /** Cookie composable defaults. */\n cookies?: BqueryCookieConfig;\n /** Announcer composable defaults. */\n announcer?: BqueryAnnouncerConfig;\n /** Page metadata defaults. */\n pageMeta?: BqueryPageMetaConfig;\n /** View transition defaults. */\n transitions?: BqueryTransitionConfig;\n /** Default component library options. */\n components?: BqueryComponentLibraryConfig;\n}\n\nconst defaultConfig: BqueryConfig = {\n fetch: {\n headers: {},\n parseAs: 'json',\n },\n cookies: {\n path: '/',\n sameSite: 'Lax',\n secure: false,\n },\n announcer: {\n politeness: 'polite',\n atomic: true,\n delay: 16,\n clearDelay: 1000,\n },\n pageMeta: {},\n transitions: {\n skipOnReducedMotion: false,\n classes: [],\n types: [],\n },\n components: {\n prefix: 'bq',\n },\n};\n\nconst cloneConfigValue = <T>(value: T): T => {\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return new Headers(value) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry)) as T;\n }\n\n if (isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] = cloneConfigValue(entry);\n }\n return result as T;\n }\n\n return value;\n};\n\nlet currentConfig: BqueryConfig = cloneConfigValue(defaultConfig);\n\n/**\n * Define or extend the global bQuery configuration.\n *\n * @param config - Partial configuration values to merge into the current config\n * @returns The resolved configuration after merging\n *\n * @example\n * ```ts\n * defineBqueryConfig({\n * fetch: { baseUrl: 'https://api.example.com' },\n * components: { prefix: 'ui' },\n * });\n * ```\n */\nexport const defineBqueryConfig = (config: BqueryConfig): BqueryConfig => {\n currentConfig = cloneConfigValue(\n merge(\n defaultConfig as Record<string, unknown>,\n currentConfig as Record<string, unknown>,\n config as Record<string, unknown>\n ) as BqueryConfig\n );\n return getBqueryConfig();\n};\n\n/**\n * Get the currently resolved bQuery configuration.\n *\n * @returns A cloned snapshot of the active configuration\n */\nexport const getBqueryConfig = (): BqueryConfig => {\n return cloneConfigValue(currentConfig);\n};\n"],"mappings":";AAiFA,IAAM,IAA8B;AAAA,EAClC,OAAO;AAAA,IACL,SAAS,CAAA;AAAA,IACT,SAAS;AAAA;EAEX,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA;EAEV,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA;EAEd,UAAU,CAAA;AAAA,EACV,aAAa;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,OAAO,CAAA;AAAA;EAET,YAAY,EACV,QAAQ,KAAA;GAIN,IAAA,CAAuB,MAAgB;AAC3C,MAAI,OAAO,UAAY,OAAe,aAAiB,QACrD,QAAO,IAAI,QAAQ,CAAA;AAGrB,MAAI,MAAM,QAAQ,CAAA,EAChB,QAAO,EAAM,IAAA,CAAK,MAAU,EAAiB,CAAA,CAAM;AAGrD,MAAI,EAAc,CAAA,GAAQ;AACxB,UAAM,IAAkC,CAAA;AACxC,eAAW,CAAC,GAAK,CAAA,KAAU,OAAO,QAAQ,CAAA,EACxC,CAAA,EAAO,CAAA,IAAO,EAAiB,CAAA;AAEjC,WAAO;AAAA;AAGT,SAAO;GAGL,IAA8B,EAAiB,CAAA,GAgBtC,IAAA,CAAsB,OACjC,IAAgB,EACd,EACE,GACA,GACA,CAAA,CACD,GAEI,EAAA,IAQI,IAAA,MACJ,EAAiB,CAAA"}
@@ -0,0 +1,100 @@
1
+ var s = 128, a = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map(), l = (e, t, n) => {
2
+ if (e.has(t) && e.delete(t), e.set(t, n), e.size <= s) return;
3
+ const r = e.keys().next().value;
4
+ r !== void 0 && e.delete(r);
5
+ }, c = (e) => {
6
+ const t = [];
7
+ let n = !1;
8
+ for (let r = 0; r < e.length; r++) {
9
+ const o = e[r];
10
+ if (o === "\\" && r + 1 < e.length) {
11
+ r++;
12
+ continue;
13
+ }
14
+ if (o === "[" && !n) {
15
+ n = !0;
16
+ continue;
17
+ }
18
+ if (o === "]" && n) {
19
+ n = !1;
20
+ continue;
21
+ }
22
+ if (!n) {
23
+ if (o === "(") {
24
+ t.push(!1);
25
+ continue;
26
+ }
27
+ if (o === ")") {
28
+ const i = t.pop() ?? !1, u = e[r + 1];
29
+ if (i && (u === "+" || u === "*" || u === "?" || u === "{")) return !0;
30
+ i && t.length > 0 && (t[t.length - 1] = !0);
31
+ continue;
32
+ }
33
+ if (t.length > 0) {
34
+ if (o === "?" && r > 0 && e[r - 1] === "(") continue;
35
+ (o === "+" || o === "*" || o === "?" || o === "{") && (t[t.length - 1] = !0);
36
+ }
37
+ }
38
+ }
39
+ return !1;
40
+ }, d = (e) => {
41
+ let t = "", n = !1;
42
+ for (let r = 0; r < e.length; r++) {
43
+ const o = e[r];
44
+ if (o === "\\" && r + 1 < e.length) {
45
+ if (!n && e[r + 1] >= "1" && e[r + 1] <= "9") throw new Error(`bQuery router: Route constraints cannot use backreferences: "${e}".`);
46
+ if (!n && e[r + 1] === "k" && e[r + 2] === "<") throw new Error(`bQuery router: Route constraints cannot use backreferences: "${e}".`);
47
+ t += o + e[r + 1], r++;
48
+ continue;
49
+ }
50
+ if (o === "[" && !n) {
51
+ n = !0, t += o;
52
+ continue;
53
+ }
54
+ if (o === "]" && n) {
55
+ n = !1, t += o;
56
+ continue;
57
+ }
58
+ if (!n && o === "(") {
59
+ if (r + 1 < e.length && e[r + 1] === "?") {
60
+ if (e[r + 2] === "<") {
61
+ if (e[r + 3] === "=" || e[r + 3] === "!") {
62
+ t += "(";
63
+ continue;
64
+ }
65
+ const i = e.indexOf(">", r + 3);
66
+ if (i === -1) throw new Error(`bQuery router: Invalid route constraint named capture group: "${e}".`);
67
+ t += "(?:", r = i;
68
+ continue;
69
+ }
70
+ t += "(";
71
+ continue;
72
+ }
73
+ t += "(?:";
74
+ continue;
75
+ }
76
+ t += o;
77
+ }
78
+ return t;
79
+ }, h = (e) => {
80
+ const t = a.get(e);
81
+ if (t !== void 0) return t;
82
+ const n = d(e);
83
+ return l(a, e, n), n;
84
+ }, g = (e) => {
85
+ const t = h(e), n = f.get(t);
86
+ if (n) return n;
87
+ if (c(t)) throw new Error(`bQuery router: Route constraint contains a potentially catastrophic (ReDoS) pattern. Nested quantifiers are not allowed: "${e}".`);
88
+ try {
89
+ const r = new RegExp(`^(?:${t})$`);
90
+ return l(f, t, r), r;
91
+ } catch (r) {
92
+ throw r instanceof SyntaxError ? new Error(`bQuery router: Invalid route constraint regex "${e}": ${r.message}`) : r;
93
+ }
94
+ };
95
+ export {
96
+ g as n,
97
+ h as t
98
+ };
99
+
100
+ //# sourceMappingURL=constraints-D5RHQLmP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints-D5RHQLmP.js","names":[],"sources":["../src/router/constraints.ts"],"sourcesContent":["/**\n * Shared helpers for validating and normalizing route param constraints.\n * @internal\n */\n\nconst MAX_ROUTE_CONSTRAINT_CACHE_SIZE = 128;\nconst normalizedConstraintCache = new Map<string, string>();\nconst compiledConstraintRegexCache = new Map<string, RegExp>();\n\nconst setBoundedCacheEntry = <T>(cache: Map<string, T>, key: string, value: T): void => {\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, value);\n\n if (cache.size <= MAX_ROUTE_CONSTRAINT_CACHE_SIZE) {\n return;\n }\n\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n};\n\n/**\n * Detects potentially super-linear (ReDoS) patterns caused by quantified\n * groups that already contain inner quantifiers, such as `(a+)+` or `(a*)*`.\n * @internal\n */\nconst hasNestedQuantifier = (pattern: string): boolean => {\n const groupQuantifierStack: boolean[] = [];\n let inCharClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n i++;\n continue;\n }\n\n if (ch === '[' && !inCharClass) {\n inCharClass = true;\n continue;\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false;\n continue;\n }\n if (inCharClass) continue;\n\n if (ch === '(') {\n groupQuantifierStack.push(false);\n continue;\n }\n\n if (ch === ')') {\n const groupHasInnerQuantifier = groupQuantifierStack.pop() ?? false;\n // Check if the closing paren is followed by a quantifier\n const next = pattern[i + 1];\n if (\n groupHasInnerQuantifier &&\n (next === '+' || next === '*' || next === '?' || next === '{')\n ) {\n return true;\n }\n if (groupHasInnerQuantifier && groupQuantifierStack.length > 0) {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n continue;\n }\n\n if (groupQuantifierStack.length > 0) {\n if (ch === '?' && i > 0 && pattern[i - 1] === '(') {\n continue;\n }\n\n if (ch === '+' || ch === '*' || ch === '?' || ch === '{') {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n }\n }\n\n return false;\n};\n\nconst normalizeConstraintCaptures = (constraint: string): string => {\n let normalized = '';\n let inCharacterClass = false;\n\n for (let i = 0; i < constraint.length; i++) {\n const char = constraint[i];\n\n if (char === '\\\\' && i + 1 < constraint.length) {\n if (!inCharacterClass && constraint[i + 1] >= '1' && constraint[i + 1] <= '9') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n if (!inCharacterClass && constraint[i + 1] === 'k' && constraint[i + 2] === '<') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n normalized += char + constraint[i + 1];\n i++;\n continue;\n }\n\n if (char === '[' && !inCharacterClass) {\n inCharacterClass = true;\n normalized += char;\n continue;\n }\n\n if (char === ']' && inCharacterClass) {\n inCharacterClass = false;\n normalized += char;\n continue;\n }\n\n if (!inCharacterClass && char === '(') {\n if (i + 1 < constraint.length && constraint[i + 1] === '?') {\n if (constraint[i + 2] === '<') {\n if (constraint[i + 3] === '=' || constraint[i + 3] === '!') {\n normalized += '(';\n continue;\n }\n\n const namedCaptureEnd = constraint.indexOf('>', i + 3);\n if (namedCaptureEnd === -1) {\n throw new Error(\n `bQuery router: Invalid route constraint named capture group: \"${constraint}\".`\n );\n }\n normalized += '(?:';\n i = namedCaptureEnd;\n continue;\n }\n\n normalized += '(';\n continue;\n }\n\n normalized += '(?:';\n continue;\n }\n\n normalized += char;\n }\n\n return normalized;\n};\n\nexport const getNormalizedRouteConstraint = (constraint: string): string => {\n const cached = normalizedConstraintCache.get(constraint);\n if (cached !== undefined) {\n return cached;\n }\n\n const normalized = normalizeConstraintCaptures(constraint);\n setBoundedCacheEntry(normalizedConstraintCache, constraint, normalized);\n return normalized;\n};\n\nexport const getRouteConstraintRegex = (constraint: string): RegExp => {\n const normalizedConstraint = getNormalizedRouteConstraint(constraint);\n const cached = compiledConstraintRegexCache.get(normalizedConstraint);\n if (cached) {\n return cached;\n }\n\n if (hasNestedQuantifier(normalizedConstraint)) {\n throw new Error(\n `bQuery router: Route constraint contains a potentially catastrophic (ReDoS) pattern. Nested quantifiers are not allowed: \"${constraint}\".`\n );\n }\n\n try {\n const compiled = new RegExp(`^(?:${normalizedConstraint})$`);\n setBoundedCacheEntry(compiledConstraintRegexCache, normalizedConstraint, compiled);\n return compiled;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `bQuery router: Invalid route constraint regex \"${constraint}\": ${error.message}`\n );\n }\n throw error;\n }\n};\n\nexport const routeConstraintMatches = (constraint: string, value: string): boolean => {\n return getRouteConstraintRegex(constraint).test(value);\n};\n\nexport const clearRouteConstraintCache = (): void => {\n normalizedConstraintCache.clear();\n compiledConstraintRegexCache.clear();\n};\n"],"mappings":"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"}
@@ -181,6 +181,66 @@ export declare class BQueryCollection {
181
181
  unwrap(): this;
182
182
  /** Replace each element with provided content. */
183
183
  replaceWith(content: string | Element): BQueryCollection;
184
+ /**
185
+ * Removes all elements from the DOM while keeping the wrapped nodes available
186
+ * for later reuse.
187
+ *
188
+ * @returns The instance for method chaining
189
+ */
190
+ detach(): this;
191
+ /**
192
+ * Gets the zero-based sibling index of the first element in the collection.
193
+ *
194
+ * @returns Index of the first element, or -1 when unavailable
195
+ */
196
+ index(): number;
197
+ /**
198
+ * Returns the child nodes of the first element, including text nodes and comments.
199
+ *
200
+ * @returns Array of child nodes from the first element
201
+ */
202
+ contents(): ChildNode[];
203
+ /**
204
+ * Gets the offset parent of the first element in the collection.
205
+ *
206
+ * @returns Offset parent element, or null when unavailable
207
+ */
208
+ offsetParent(): Element | null;
209
+ /**
210
+ * Gets the position of the first element relative to its offset parent.
211
+ *
212
+ * @returns Position object with top and left coordinates
213
+ */
214
+ position(): {
215
+ top: number;
216
+ left: number;
217
+ };
218
+ /**
219
+ * Gets the inner width of the first element (content + padding, excluding border).
220
+ *
221
+ * @returns Inner width in pixels, or 0 when the collection is empty
222
+ */
223
+ innerWidth(): number;
224
+ /**
225
+ * Gets the inner height of the first element (content + padding, excluding border).
226
+ *
227
+ * @returns Inner height in pixels, or 0 when the collection is empty
228
+ */
229
+ innerHeight(): number;
230
+ /**
231
+ * Gets the outer width of the first element, optionally including margins.
232
+ *
233
+ * @param includeMargin - When true, include horizontal margins
234
+ * @returns Outer width in pixels
235
+ */
236
+ outerWidth(includeMargin?: boolean): number;
237
+ /**
238
+ * Gets the outer height of the first element, optionally including margins.
239
+ *
240
+ * @param includeMargin - When true, include vertical margins
241
+ * @returns Outer height in pixels
242
+ */
243
+ outerHeight(includeMargin?: boolean): number;
184
244
  /**
185
245
  * Shows all elements.
186
246
  *
@@ -278,6 +338,80 @@ export declare class BQueryCollection {
278
338
  * ```
279
339
  */
280
340
  find(selector: string): BQueryCollection;
341
+ /**
342
+ * Gets the closest element or ancestor matching a selector for each element in
343
+ * the collection, including the element itself. Duplicates are removed from the
344
+ * result.
345
+ *
346
+ * @param selector - CSS selector to match
347
+ * @returns A new BQueryCollection with matching elements or ancestors
348
+ *
349
+ * @example
350
+ * ```ts
351
+ * $$('.item').closest('.container');
352
+ * ```
353
+ */
354
+ closest(selector: string): BQueryCollection;
355
+ /**
356
+ * Gets the parent element of each element in the collection.
357
+ * Duplicates are removed (e.g. siblings sharing a parent).
358
+ *
359
+ * @returns A new BQueryCollection with unique parent elements
360
+ *
361
+ * @example
362
+ * ```ts
363
+ * $$('.item').parent().addClass('has-items');
364
+ * ```
365
+ */
366
+ parent(): BQueryCollection;
367
+ /**
368
+ * Gets the direct children of every element in the collection.
369
+ * Duplicates are removed from the result.
370
+ *
371
+ * @returns A new BQueryCollection with child elements
372
+ *
373
+ * @example
374
+ * ```ts
375
+ * $$('.list').children().addClass('child');
376
+ * ```
377
+ */
378
+ children(): BQueryCollection;
379
+ /**
380
+ * Gets all siblings of every element in the collection (excluding the
381
+ * elements themselves). Duplicates are removed.
382
+ *
383
+ * @returns A new BQueryCollection with sibling elements
384
+ *
385
+ * @example
386
+ * ```ts
387
+ * $$('.active').siblings().removeClass('active');
388
+ * ```
389
+ */
390
+ siblings(): BQueryCollection;
391
+ /**
392
+ * Gets the next sibling element of each element in the collection.
393
+ * Elements without a next sibling are skipped.
394
+ *
395
+ * @returns A new BQueryCollection with next sibling elements
396
+ *
397
+ * @example
398
+ * ```ts
399
+ * $$('.current').next().addClass('upcoming');
400
+ * ```
401
+ */
402
+ next(): BQueryCollection;
403
+ /**
404
+ * Gets the previous sibling element of each element in the collection.
405
+ * Elements without a previous sibling are skipped.
406
+ *
407
+ * @returns A new BQueryCollection with previous sibling elements
408
+ *
409
+ * @example
410
+ * ```ts
411
+ * $$('.current').prev().addClass('previous');
412
+ * ```
413
+ */
414
+ prev(): BQueryCollection;
281
415
  /**
282
416
  * Removes all elements from the DOM.
283
417
  *
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/core/collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/core/collection.ts"],"names":[],"mappings":"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"}