@bquery/bquery 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +760 -716
  2. package/dist/{a11y-C5QOVvRn.js → a11y-DVBCy09c.js} +3 -3
  3. package/dist/a11y-DVBCy09c.js.map +1 -0
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/component/library.d.ts.map +1 -1
  6. package/dist/{component-CuuTijA6.js → component-L3-JfOFz.js} +5 -5
  7. package/dist/component-L3-JfOFz.js.map +1 -0
  8. package/dist/component.es.mjs +1 -1
  9. package/dist/{config-BW35FKuA.js → config-DhT9auRm.js} +1 -1
  10. package/dist/{config-BW35FKuA.js.map → config-DhT9auRm.js.map} +1 -1
  11. package/dist/{constraints-3lV9yyBw.js → constraints-D5RHQLmP.js} +1 -1
  12. package/dist/constraints-D5RHQLmP.js.map +1 -0
  13. package/dist/core/collection.d.ts +86 -0
  14. package/dist/core/collection.d.ts.map +1 -1
  15. package/dist/core/element.d.ts +28 -0
  16. package/dist/core/element.d.ts.map +1 -1
  17. package/dist/core/shared.d.ts +6 -0
  18. package/dist/core/shared.d.ts.map +1 -1
  19. package/dist/core-DdtZHzsS.js +168 -0
  20. package/dist/core-DdtZHzsS.js.map +1 -0
  21. package/dist/{core-Cjl7GUu8.js → core-EMYSLzaT.js} +289 -259
  22. package/dist/core-EMYSLzaT.js.map +1 -0
  23. package/dist/core.es.mjs +48 -47
  24. package/dist/{custom-directives-7wAShnnd.js → custom-directives-Dr4C5lVV.js} +1 -1
  25. package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
  26. package/dist/{devtools-D2fQLhDN.js → devtools-BhB2iDPT.js} +2 -2
  27. package/dist/devtools-BhB2iDPT.js.map +1 -0
  28. package/dist/devtools.es.mjs +1 -1
  29. package/dist/{dnd-B8EgyzaI.js → dnd-NwZBYh4l.js} +1 -1
  30. package/dist/dnd-NwZBYh4l.js.map +1 -0
  31. package/dist/dnd.es.mjs +1 -1
  32. package/dist/{env-NeVmr4Gf.js → env-CTdvLaH2.js} +1 -1
  33. package/dist/env-CTdvLaH2.js.map +1 -0
  34. package/dist/forms/create-form.d.ts.map +1 -1
  35. package/dist/forms/index.d.ts +3 -2
  36. package/dist/forms/index.d.ts.map +1 -1
  37. package/dist/forms/types.d.ts +46 -0
  38. package/dist/forms/types.d.ts.map +1 -1
  39. package/dist/forms/use-field.d.ts +34 -0
  40. package/dist/forms/use-field.d.ts.map +1 -0
  41. package/dist/forms/validators.d.ts +25 -0
  42. package/dist/forms/validators.d.ts.map +1 -1
  43. package/dist/forms-UcRHsYxC.js +227 -0
  44. package/dist/forms-UcRHsYxC.js.map +1 -0
  45. package/dist/forms.es.mjs +14 -12
  46. package/dist/full.d.ts +17 -26
  47. package/dist/full.d.ts.map +1 -1
  48. package/dist/full.es.mjs +206 -181
  49. package/dist/full.iife.js +33 -33
  50. package/dist/full.iife.js.map +1 -1
  51. package/dist/full.umd.js +33 -33
  52. package/dist/full.umd.js.map +1 -1
  53. package/dist/function-Cybd57JV.js +33 -0
  54. package/dist/function-Cybd57JV.js.map +1 -0
  55. package/dist/{i18n-BnnhTFOS.js → i18n-kuF6Ekj6.js} +3 -3
  56. package/dist/i18n-kuF6Ekj6.js.map +1 -0
  57. package/dist/i18n.es.mjs +1 -1
  58. package/dist/index.es.mjs +251 -228
  59. package/dist/media/breakpoints.d.ts.map +1 -1
  60. package/dist/media/types.d.ts +2 -2
  61. package/dist/media/types.d.ts.map +1 -1
  62. package/dist/{media-Di2Ta22s.js → media-i-fB5WxI.js} +3 -3
  63. package/dist/media-i-fB5WxI.js.map +1 -0
  64. package/dist/media.es.mjs +1 -1
  65. package/dist/{motion-qPj_TYGv.js → motion-BJsAuULb.js} +2 -2
  66. package/dist/motion-BJsAuULb.js.map +1 -0
  67. package/dist/motion.es.mjs +1 -1
  68. package/dist/{mount-SM07RUa6.js → mount-B4Y8bk8Z.js} +5 -5
  69. package/dist/mount-B4Y8bk8Z.js.map +1 -0
  70. package/dist/{platform-CPbCprb6.js → platform-Dw2gE3zI.js} +3 -3
  71. package/dist/{platform-CPbCprb6.js.map → platform-Dw2gE3zI.js.map} +1 -1
  72. package/dist/platform.es.mjs +2 -2
  73. package/dist/plugin/registry.d.ts.map +1 -1
  74. package/dist/{plugin-cPoOHFLY.js → plugin-C2WuC8SF.js} +20 -18
  75. package/dist/plugin-C2WuC8SF.js.map +1 -0
  76. package/dist/plugin.es.mjs +1 -1
  77. package/dist/reactive/async-data.d.ts +28 -3
  78. package/dist/reactive/async-data.d.ts.map +1 -1
  79. package/dist/reactive/computed.d.ts +3 -0
  80. package/dist/reactive/computed.d.ts.map +1 -1
  81. package/dist/reactive/effect.d.ts +3 -0
  82. package/dist/reactive/effect.d.ts.map +1 -1
  83. package/dist/reactive/http.d.ts +194 -0
  84. package/dist/reactive/http.d.ts.map +1 -0
  85. package/dist/reactive/index.d.ts +2 -2
  86. package/dist/reactive/index.d.ts.map +1 -1
  87. package/dist/reactive/pagination.d.ts +126 -0
  88. package/dist/reactive/pagination.d.ts.map +1 -0
  89. package/dist/reactive/polling.d.ts +55 -0
  90. package/dist/reactive/polling.d.ts.map +1 -0
  91. package/dist/reactive/readonly.d.ts +20 -1
  92. package/dist/reactive/readonly.d.ts.map +1 -1
  93. package/dist/reactive/rest.d.ts +293 -0
  94. package/dist/reactive/rest.d.ts.map +1 -0
  95. package/dist/reactive/scope.d.ts +140 -0
  96. package/dist/reactive/scope.d.ts.map +1 -0
  97. package/dist/reactive/signal.d.ts +16 -2
  98. package/dist/reactive/signal.d.ts.map +1 -1
  99. package/dist/reactive/to-value.d.ts +57 -0
  100. package/dist/reactive/to-value.d.ts.map +1 -0
  101. package/dist/reactive/websocket.d.ts +285 -0
  102. package/dist/reactive/websocket.d.ts.map +1 -0
  103. package/dist/reactive-DwkhUJfP.js +1148 -0
  104. package/dist/reactive-DwkhUJfP.js.map +1 -0
  105. package/dist/reactive.es.mjs +38 -19
  106. package/dist/{registry-CWf368tT.js → registry-B08iilIh.js} +1 -1
  107. package/dist/{registry-CWf368tT.js.map → registry-B08iilIh.js.map} +1 -1
  108. package/dist/router/constraints.d.ts.map +1 -1
  109. package/dist/router/index.d.ts +1 -1
  110. package/dist/router/index.d.ts.map +1 -1
  111. package/dist/router/router.d.ts.map +1 -1
  112. package/dist/router/state.d.ts +25 -2
  113. package/dist/router/state.d.ts.map +1 -1
  114. package/dist/router-CQikC9Ed.js +492 -0
  115. package/dist/router-CQikC9Ed.js.map +1 -0
  116. package/dist/router.es.mjs +9 -8
  117. package/dist/ssr/hydrate.d.ts.map +1 -1
  118. package/dist/{ssr-B2qd_WBB.js → ssr-_dAcGdzu.js} +4 -4
  119. package/dist/ssr-_dAcGdzu.js.map +1 -0
  120. package/dist/ssr.es.mjs +1 -1
  121. package/dist/store/persisted.d.ts.map +1 -1
  122. package/dist/{store-DWpyH6p5.js → store-Cb3gPRve.js} +7 -7
  123. package/dist/store-Cb3gPRve.js.map +1 -0
  124. package/dist/store.es.mjs +2 -2
  125. package/dist/storybook.es.mjs.map +1 -1
  126. package/dist/{testing-CsqjNUyy.js → testing-C5Sjfsna.js} +8 -8
  127. package/dist/testing-C5Sjfsna.js.map +1 -0
  128. package/dist/testing.es.mjs +1 -1
  129. package/dist/{type-guards-Do9DWgNp.js → type-guards-BMX2c0LP.js} +1 -1
  130. package/dist/{type-guards-Do9DWgNp.js.map → type-guards-BMX2c0LP.js.map} +1 -1
  131. package/dist/untrack-D0fnO5k2.js +36 -0
  132. package/dist/untrack-D0fnO5k2.js.map +1 -0
  133. package/dist/view/custom-directives.d.ts.map +1 -1
  134. package/dist/view.es.mjs +4 -4
  135. package/package.json +177 -177
  136. package/src/a11y/announce.ts +131 -131
  137. package/src/a11y/audit.ts +314 -314
  138. package/src/a11y/index.ts +68 -68
  139. package/src/a11y/media-preferences.ts +255 -255
  140. package/src/a11y/roving-tab-index.ts +164 -164
  141. package/src/a11y/skip-link.ts +255 -255
  142. package/src/a11y/trap-focus.ts +184 -184
  143. package/src/a11y/types.ts +183 -183
  144. package/src/component/component.ts +599 -599
  145. package/src/component/html.ts +153 -153
  146. package/src/component/index.ts +52 -52
  147. package/src/component/library.ts +540 -542
  148. package/src/component/scope.ts +212 -212
  149. package/src/component/types.ts +310 -310
  150. package/src/core/collection.ts +876 -707
  151. package/src/core/element.ts +1015 -981
  152. package/src/core/env.ts +60 -60
  153. package/src/core/index.ts +49 -49
  154. package/src/core/shared.ts +77 -62
  155. package/src/core/utils/index.ts +148 -148
  156. package/src/devtools/devtools.ts +410 -410
  157. package/src/devtools/index.ts +48 -48
  158. package/src/devtools/types.ts +104 -104
  159. package/src/dnd/draggable.ts +296 -296
  160. package/src/dnd/droppable.ts +228 -228
  161. package/src/dnd/index.ts +62 -62
  162. package/src/dnd/sortable.ts +307 -307
  163. package/src/dnd/types.ts +293 -293
  164. package/src/forms/create-form.ts +320 -278
  165. package/src/forms/index.ts +70 -65
  166. package/src/forms/types.ts +203 -154
  167. package/src/forms/use-field.ts +231 -0
  168. package/src/forms/validators.ts +294 -265
  169. package/src/full.ts +554 -480
  170. package/src/i18n/formatting.ts +67 -67
  171. package/src/i18n/i18n.ts +200 -200
  172. package/src/i18n/index.ts +67 -67
  173. package/src/i18n/translate.ts +182 -182
  174. package/src/i18n/types.ts +171 -171
  175. package/src/index.ts +108 -108
  176. package/src/media/battery.ts +116 -116
  177. package/src/media/breakpoints.ts +129 -131
  178. package/src/media/clipboard.ts +80 -80
  179. package/src/media/device-sensors.ts +158 -158
  180. package/src/media/geolocation.ts +119 -119
  181. package/src/media/index.ts +76 -76
  182. package/src/media/media-query.ts +92 -92
  183. package/src/media/network.ts +115 -115
  184. package/src/media/types.ts +177 -177
  185. package/src/media/viewport.ts +84 -84
  186. package/src/motion/index.ts +57 -57
  187. package/src/motion/morph.ts +151 -151
  188. package/src/motion/parallax.ts +120 -120
  189. package/src/motion/reduced-motion.ts +66 -66
  190. package/src/motion/types.ts +271 -271
  191. package/src/motion/typewriter.ts +164 -164
  192. package/src/plugin/index.ts +37 -37
  193. package/src/plugin/registry.ts +284 -269
  194. package/src/plugin/types.ts +137 -137
  195. package/src/reactive/async-data.ts +250 -29
  196. package/src/reactive/computed.ts +144 -130
  197. package/src/reactive/effect.ts +29 -6
  198. package/src/reactive/http.ts +790 -0
  199. package/src/reactive/index.ts +60 -0
  200. package/src/reactive/pagination.ts +317 -0
  201. package/src/reactive/polling.ts +179 -0
  202. package/src/reactive/readonly.ts +52 -8
  203. package/src/reactive/rest.ts +859 -0
  204. package/src/reactive/scope.ts +276 -0
  205. package/src/reactive/signal.ts +61 -1
  206. package/src/reactive/to-value.ts +71 -0
  207. package/src/reactive/websocket.ts +849 -0
  208. package/src/router/bq-link.ts +279 -279
  209. package/src/router/constraints.ts +204 -201
  210. package/src/router/index.ts +49 -49
  211. package/src/router/match.ts +312 -312
  212. package/src/router/path-pattern.ts +52 -52
  213. package/src/router/query.ts +38 -38
  214. package/src/router/router.ts +421 -402
  215. package/src/router/state.ts +51 -3
  216. package/src/router/types.ts +139 -139
  217. package/src/router/use-route.ts +68 -68
  218. package/src/router/utils.ts +157 -157
  219. package/src/security/index.ts +12 -12
  220. package/src/ssr/hydrate.ts +84 -82
  221. package/src/ssr/index.ts +70 -70
  222. package/src/ssr/render.ts +508 -508
  223. package/src/ssr/serialize.ts +296 -296
  224. package/src/ssr/types.ts +81 -81
  225. package/src/store/create-store.ts +467 -467
  226. package/src/store/index.ts +27 -27
  227. package/src/store/persisted.ts +245 -249
  228. package/src/store/types.ts +247 -247
  229. package/src/store/utils.ts +135 -135
  230. package/src/storybook/index.ts +480 -480
  231. package/src/testing/index.ts +42 -42
  232. package/src/testing/testing.ts +593 -593
  233. package/src/testing/types.ts +170 -170
  234. package/src/view/custom-directives.ts +28 -30
  235. package/src/view/evaluate.ts +292 -292
  236. package/src/view/process.ts +108 -108
  237. package/dist/a11y-C5QOVvRn.js.map +0 -1
  238. package/dist/component-CuuTijA6.js.map +0 -1
  239. package/dist/constraints-3lV9yyBw.js.map +0 -1
  240. package/dist/core-Cjl7GUu8.js.map +0 -1
  241. package/dist/core-DnlyjbF2.js +0 -112
  242. package/dist/core-DnlyjbF2.js.map +0 -1
  243. package/dist/custom-directives-7wAShnnd.js.map +0 -1
  244. package/dist/devtools-D2fQLhDN.js.map +0 -1
  245. package/dist/dnd-B8EgyzaI.js.map +0 -1
  246. package/dist/env-NeVmr4Gf.js.map +0 -1
  247. package/dist/forms-C3yovgH9.js +0 -141
  248. package/dist/forms-C3yovgH9.js.map +0 -1
  249. package/dist/i18n-BnnhTFOS.js.map +0 -1
  250. package/dist/media-Di2Ta22s.js.map +0 -1
  251. package/dist/motion-qPj_TYGv.js.map +0 -1
  252. package/dist/mount-SM07RUa6.js.map +0 -1
  253. package/dist/plugin-cPoOHFLY.js.map +0 -1
  254. package/dist/reactive-Cfv0RK6x.js +0 -233
  255. package/dist/reactive-Cfv0RK6x.js.map +0 -1
  256. package/dist/router-BrthaP_z.js +0 -473
  257. package/dist/router-BrthaP_z.js.map +0 -1
  258. package/dist/ssr-B2qd_WBB.js.map +0 -1
  259. package/dist/store-DWpyH6p5.js.map +0 -1
  260. package/dist/testing-CsqjNUyy.js.map +0 -1
  261. package/dist/untrack-DJVQQ2WM.js +0 -33
  262. package/dist/untrack-DJVQQ2WM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as s } from "./core-DnlyjbF2.js";
2
- import { i as u } from "./reactive-Cfv0RK6x.js";
1
+ import { n as s } from "./core-DdtZHzsS.js";
2
+ import { m as u } from "./reactive-DwkhUJfP.js";
3
3
  var A = (t) => {
4
4
  const a = s(!1);
5
5
  let i;
@@ -337,4 +337,4 @@ export {
337
337
  z as t
338
338
  };
339
339
 
340
- //# sourceMappingURL=media-Di2Ta22s.js.map
340
+ //# sourceMappingURL=media-i-fB5WxI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-i-fB5WxI.js","names":[],"sources":["../src/media/media-query.ts","../src/media/breakpoints.ts","../src/media/viewport.ts","../src/media/network.ts","../src/media/battery.ts","../src/media/geolocation.ts","../src/media/device-sensors.ts","../src/media/clipboard.ts"],"sourcesContent":["/**\n * Reactive media query matching.\n *\n * Returns a reactive boolean signal that tracks whether a CSS media query matches.\n *\n * @module bquery/media\n */\n\nimport { readonly, signal } from '../reactive/index';\nimport type { MediaSignalHandle } from './types';\n\n/**\n * Creates a reactive signal that tracks whether a CSS media query matches.\n *\n * Uses `window.matchMedia()` under the hood and automatically updates\n * when the match state changes (e.g., on window resize, device orientation change).\n *\n * @param query - A valid CSS media query string (e.g., `'(min-width: 768px)'`)\n * @returns A readonly reactive signal that is `true` when the query matches,\n * plus a `destroy()` method to remove the media query listener\n *\n * @example\n * ```ts\n * import { mediaQuery } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const isDark = mediaQuery('(prefers-color-scheme: dark)');\n * effect(() => {\n * document.body.classList.toggle('dark', isDark.value);\n * });\n *\n * const isWide = mediaQuery('(min-width: 1024px)');\n * effect(() => {\n * console.log('Wide screen:', isWide.value);\n * });\n * ```\n */\nexport const mediaQuery = (query: string): MediaSignalHandle<boolean> => {\n const s = signal(false);\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n try {\n const mql = window.matchMedia(query);\n s.value = mql.matches;\n\n const handler = (e: MediaQueryListEvent): void => {\n s.value = e.matches;\n };\n\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handler);\n cleanup = () => {\n mql.removeEventListener('change', handler);\n };\n } else if (\n typeof (\n mql as MediaQueryList & {\n addListener?: (listener: (event: MediaQueryListEvent) => void) => void;\n removeListener?: (listener: (event: MediaQueryListEvent) => void) => void;\n }\n ).addListener === 'function'\n ) {\n const legacyMql = mql as MediaQueryList & {\n addListener: (listener: (event: MediaQueryListEvent) => void) => void;\n removeListener: (listener: (event: MediaQueryListEvent) => void) => void;\n };\n legacyMql.addListener(handler);\n cleanup = () => {\n legacyMql.removeListener(handler);\n };\n }\n } catch {\n // matchMedia may throw in non-browser environments\n }\n }\n\n const ro = readonly(s) as MediaSignalHandle<boolean>;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n","/**\n * Named breakpoint signals.\n *\n * Defines named breakpoints that return reactive boolean signals,\n * making it easy to respond to viewport size changes.\n *\n * @module bquery/media\n */\n\nimport { readonly, signal } from '../reactive/index';\nimport type { BreakpointMap, MediaSignalHandle } from './types';\n\ntype BreakpointSignals<T extends BreakpointMap> = { [K in keyof T]: MediaSignalHandle<boolean> } & {\n destroyAll(): void;\n} & ('destroy' extends keyof T ? Record<never, never> : { destroy(): void });\n\n/**\n * Defines named breakpoints and returns reactive boolean signals for each.\n *\n * Each breakpoint is a minimum-width media query. The returned object maps\n * each breakpoint name to a `ReadonlySignal<boolean>` that is `true` when\n * the viewport width is at or above the breakpoint value.\n *\n * @param bp - An object mapping breakpoint names to minimum widths in pixels\n * @returns An object with the same keys, each a reactive boolean signal with\n * `destroy()`, plus a top-level `destroyAll()` method to clean up all listeners.\n * When no breakpoint is named `destroy`, a `destroy()` alias is also provided.\n *\n * @example\n * ```ts\n * import { breakpoints } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const bp = breakpoints({ sm: 640, md: 768, lg: 1024, xl: 1280 });\n *\n * effect(() => {\n * if (bp.xl.value) {\n * console.log('Extra large viewport');\n * } else if (bp.lg.value) {\n * console.log('Large viewport');\n * } else if (bp.md.value) {\n * console.log('Medium viewport');\n * } else {\n * console.log('Small viewport');\n * }\n * });\n * ```\n */\nexport const breakpoints = <T extends BreakpointMap>(bp: T): BreakpointSignals<T> => {\n const signals = {} as { [K in keyof T]: MediaSignalHandle<boolean> };\n const destroyers: Array<() => void> = [];\n\n type LegacyMediaQueryList = MediaQueryList & {\n addListener?: (listener: (event: MediaQueryListEvent | MediaQueryList) => void) => void;\n removeListener?: (listener: (event: MediaQueryListEvent | MediaQueryList) => void) => void;\n };\n\n for (const key of Object.keys(bp) as Array<keyof T>) {\n const width = bp[key];\n const s = signal(false);\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n try {\n const mql = window.matchMedia(`(min-width: ${width}px)`);\n s.value = mql.matches;\n\n const handler = (e: MediaQueryListEvent | MediaQueryList): void => {\n s.value = e.matches;\n };\n\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handler);\n cleanup = () => {\n mql.removeEventListener('change', handler);\n };\n } else {\n const legacyMql = mql as LegacyMediaQueryList;\n if (typeof legacyMql.addListener === 'function') {\n legacyMql.addListener(handler);\n cleanup = () => {\n legacyMql.removeListener?.(handler);\n };\n }\n }\n } catch {\n // matchMedia may throw in non-browser environments\n }\n }\n\n const ro = readonly(s) as MediaSignalHandle<boolean>;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n destroyers.push(ro.destroy);\n signals[key] = ro;\n }\n\n let destroyed = false;\n const result = Object.defineProperty(signals, 'destroyAll', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n destroyers.forEach((destroy) => {\n destroy();\n });\n },\n }) as BreakpointSignals<T>;\n\n if (!Object.prototype.hasOwnProperty.call(signals, 'destroy')) {\n Object.defineProperty(result, 'destroy', {\n enumerable: false,\n configurable: true,\n value: result.destroyAll,\n });\n }\n\n return result;\n};\n","/**\n * Reactive viewport dimensions.\n *\n * Provides a reactive signal tracking the browser viewport's\n * width, height, and orientation.\n *\n * @module bquery/media\n */\n\nimport { readonly, signal } from '../reactive/index';\nimport type { ViewportSignal, ViewportState } from './types';\n\n/**\n * Computes orientation from width and height.\n * @internal\n */\nconst getOrientation = (w: number, h: number): 'portrait' | 'landscape' =>\n h >= w ? 'portrait' : 'landscape';\n\n/**\n * Returns a reactive signal tracking the current viewport dimensions and orientation.\n *\n * Updates automatically when the window is resized. Uses `window.innerWidth`\n * and `window.innerHeight` under the hood.\n *\n * @returns A readonly reactive signal with `{ width, height, orientation }`\n * and a `destroy()` method to remove the resize listener\n *\n * @example\n * ```ts\n * import { useViewport } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const viewport = useViewport();\n * effect(() => {\n * console.log(`Viewport: ${viewport.value.width}x${viewport.value.height}`);\n * console.log(`Orientation: ${viewport.value.orientation}`);\n * });\n * ```\n */\nexport const useViewport = (): ViewportSignal => {\n const initial: ViewportState = {\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n height: typeof window !== 'undefined' ? window.innerHeight : 0,\n orientation:\n typeof window !== 'undefined'\n ? getOrientation(window.innerWidth, window.innerHeight)\n : 'portrait',\n };\n\n const s = signal<ViewportState>(initial);\n\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined') {\n const handler = (): void => {\n s.value = {\n width: window.innerWidth,\n height: window.innerHeight,\n orientation: getOrientation(window.innerWidth, window.innerHeight),\n };\n };\n\n window.addEventListener('resize', handler);\n cleanup = () => {\n window.removeEventListener('resize', handler);\n };\n }\n\n const ro = readonly(s) as ViewportSignal;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value: (): void => {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n","/**\n * Reactive network status.\n *\n * Provides a reactive signal tracking the browser's network connectivity\n * and connection quality via the Network Information API.\n *\n * @module bquery/media\n */\n\nimport { readonly, signal } from '../reactive/index';\nimport type { NetworkSignal, NetworkState } from './types';\n\n/**\n * Navigator connection interface for the Network Information API.\n * @internal\n */\ninterface NavigatorConnection extends EventTarget {\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n}\n\n/**\n * Extended Navigator with connection property.\n * @internal\n */\ninterface NavigatorWithConnection extends Navigator {\n connection?: NavigatorConnection;\n}\n\n/**\n * Reads current network state from browser APIs.\n * @internal\n */\nconst getNetworkState = (): NetworkState => {\n const online =\n typeof navigator !== 'undefined' && navigator.onLine !== undefined ? navigator.onLine : true;\n\n const nav = typeof navigator !== 'undefined' ? (navigator as NavigatorWithConnection) : undefined;\n const conn = nav?.connection;\n\n return {\n online,\n effectiveType: conn?.effectiveType ?? 'unknown',\n downlink: conn?.downlink ?? 0,\n rtt: conn?.rtt ?? 0,\n };\n};\n\n/**\n * Returns a reactive signal tracking network connectivity and quality.\n *\n * Tracks whether the browser is online/offline and, where supported,\n * the effective connection type, downlink speed, and round-trip time\n * via the Network Information API.\n *\n * @returns A readonly reactive signal with `{ online, effectiveType, downlink, rtt }`\n * and a `destroy()` method to remove attached listeners\n *\n * @example\n * ```ts\n * import { useNetworkStatus } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const net = useNetworkStatus();\n * effect(() => {\n * if (!net.value.online) {\n * console.warn('You are offline!');\n * }\n * console.log(`Connection: ${net.value.effectiveType}, RTT: ${net.value.rtt}ms`);\n * });\n * ```\n */\nexport const useNetworkStatus = (): NetworkSignal => {\n const s = signal<NetworkState>(getNetworkState());\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined') {\n const update = (): void => {\n s.value = getNetworkState();\n };\n\n window.addEventListener('online', update);\n window.addEventListener('offline', update);\n\n const nav =\n typeof navigator !== 'undefined' ? (navigator as NavigatorWithConnection) : undefined;\n if (nav?.connection && typeof nav.connection.addEventListener === 'function') {\n nav.connection.addEventListener('change', update);\n }\n\n cleanup = () => {\n window.removeEventListener('online', update);\n window.removeEventListener('offline', update);\n if (nav?.connection && typeof nav.connection.removeEventListener === 'function') {\n nav.connection.removeEventListener('change', update);\n }\n };\n }\n\n const ro = readonly(s) as NetworkSignal;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n enumerable: false,\n configurable: true,\n });\n\n return ro;\n};\n","/**\n * Reactive battery status.\n *\n * Provides a reactive signal tracking the device's battery status\n * via the Battery Status API.\n *\n * @module bquery/media\n */\n\nimport { signal, readonly } from '../reactive/index';\nimport type { BatterySignal, BatteryState } from './types';\n\n/**\n * BatteryManager interface for the Battery Status API.\n * @internal\n */\ninterface BatteryManager extends EventTarget {\n charging: boolean;\n chargingTime: number;\n dischargingTime: number;\n level: number;\n}\n\n/** Default battery state when API is unavailable. */\nconst DEFAULT_BATTERY_STATE: BatteryState = {\n supported: false,\n charging: false,\n chargingTime: 0,\n dischargingTime: 0,\n level: 1,\n};\n\n/**\n * Returns a reactive signal tracking the device's battery status.\n *\n * Uses the Battery Status API (`navigator.getBattery()`) where available.\n * Falls back gracefully to a default state with `supported: false` when\n * the API is not available.\n *\n * @returns A readonly reactive signal with battery state and a `destroy()` method\n * to remove Battery Status API listeners\n *\n * @example\n * ```ts\n * import { useBattery } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const battery = useBattery();\n * effect(() => {\n * if (battery.value.supported) {\n * console.log(`Battery: ${(battery.value.level * 100).toFixed(0)}%`);\n * console.log(`Charging: ${battery.value.charging}`);\n * }\n * });\n * ```\n */\nexport const useBattery = (): BatterySignal => {\n const s = signal<BatteryState>({ ...DEFAULT_BATTERY_STATE });\n let cleanup: (() => void) | undefined;\n let destroyed = false;\n\n if (\n typeof navigator !== 'undefined' &&\n 'getBattery' in navigator &&\n typeof (navigator as Navigator & { getBattery: () => Promise<BatteryManager> }).getBattery ===\n 'function'\n ) {\n const nav = navigator as Navigator & { getBattery: () => Promise<BatteryManager> };\n\n nav\n .getBattery()\n .then((battery) => {\n if (destroyed) return;\n\n const update = (): void => {\n s.value = {\n supported: true,\n charging: battery.charging,\n chargingTime: battery.chargingTime,\n dischargingTime: battery.dischargingTime,\n level: battery.level,\n };\n };\n\n update();\n\n battery.addEventListener('chargingchange', update);\n battery.addEventListener('chargingtimechange', update);\n battery.addEventListener('dischargingtimechange', update);\n battery.addEventListener('levelchange', update);\n cleanup = () => {\n battery.removeEventListener('chargingchange', update);\n battery.removeEventListener('chargingtimechange', update);\n battery.removeEventListener('dischargingtimechange', update);\n battery.removeEventListener('levelchange', update);\n };\n })\n .catch(() => {\n // Battery API rejected — keep default state\n });\n }\n\n const ro = readonly(s) as BatterySignal;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n","/**\n * Reactive geolocation.\n *\n * Provides a reactive signal tracking the device's geographic position\n * via the Geolocation API.\n *\n * @module bquery/media\n */\n\nimport { signal, readonly } from '../reactive/index';\nimport type { GeolocationOptions, GeolocationSignal, GeolocationState } from './types';\n\n/** Default geolocation state. */\nconst DEFAULT_GEO_STATE: GeolocationState = {\n supported: false,\n loading: false,\n latitude: null,\n longitude: null,\n accuracy: null,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null,\n timestamp: null,\n error: null,\n};\n\n/**\n * Returns a reactive signal tracking the device's geographic position.\n *\n * Uses the Geolocation API (`navigator.geolocation`) where available.\n * Can operate in one-shot mode (default) or continuous watch mode.\n *\n * @param options - Configuration for the geolocation request\n * @returns A readonly reactive signal with position data and loading/error state,\n * plus a `destroy()` method to stop an active watcher\n *\n * @example\n * ```ts\n * import { useGeolocation } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * // One-shot position\n * const geo = useGeolocation();\n * effect(() => {\n * if (geo.value.loading) return console.log('Getting position...');\n * if (geo.value.error) return console.error(geo.value.error);\n * console.log(`Lat: ${geo.value.latitude}, Lng: ${geo.value.longitude}`);\n * });\n *\n * // Continuous watch with high accuracy\n * const geoWatch = useGeolocation({ watch: true, enableHighAccuracy: true });\n * ```\n */\nexport const useGeolocation = (options: GeolocationOptions = {}): GeolocationSignal => {\n const { enableHighAccuracy = false, maximumAge = 0, timeout = Infinity, watch = false } = options;\n\n const s = signal<GeolocationState>({ ...DEFAULT_GEO_STATE });\n\n let destroyWatcher: (() => void) | undefined;\n\n if (typeof navigator !== 'undefined' && 'geolocation' in navigator) {\n s.value = { ...DEFAULT_GEO_STATE, supported: true, loading: true };\n\n const posOptions: PositionOptions = {\n enableHighAccuracy,\n maximumAge,\n timeout: timeout === Infinity ? undefined : timeout,\n };\n\n const onSuccess = (pos: GeolocationPosition): void => {\n s.value = {\n supported: true,\n loading: false,\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n altitude: pos.coords.altitude,\n altitudeAccuracy: pos.coords.altitudeAccuracy,\n heading: pos.coords.heading,\n speed: pos.coords.speed,\n timestamp: pos.timestamp,\n error: null,\n };\n };\n\n const onError = (err: GeolocationPositionError): void => {\n s.value = {\n ...s.value,\n loading: false,\n error: err.message,\n };\n };\n\n if (watch) {\n const watchId = navigator.geolocation.watchPosition(onSuccess, onError, posOptions);\n destroyWatcher = () => {\n navigator.geolocation.clearWatch(watchId);\n };\n } else {\n navigator.geolocation.getCurrentPosition(onSuccess, onError, posOptions);\n }\n }\n\n const ro = readonly(s) as GeolocationSignal;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n destroyWatcher?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n","/**\n * Reactive device motion and orientation sensors.\n *\n * Provides reactive signals for accelerometer, gyroscope, and\n * compass data via the DeviceMotion and DeviceOrientation APIs.\n *\n * @module bquery/media\n */\n\nimport { signal, readonly } from '../reactive/index';\nimport type {\n DeviceMotionSignal,\n DeviceMotionState,\n DeviceOrientationSignal,\n DeviceOrientationState,\n} from './types';\n\n/** Default device motion state. */\nconst DEFAULT_MOTION_STATE: DeviceMotionState = {\n acceleration: { x: null, y: null, z: null },\n accelerationIncludingGravity: { x: null, y: null, z: null },\n rotationRate: { alpha: null, beta: null, gamma: null },\n interval: 0,\n};\n\n/** Default device orientation state. */\nconst DEFAULT_ORIENTATION_STATE: DeviceOrientationState = {\n alpha: null,\n beta: null,\n gamma: null,\n absolute: false,\n};\n\n/**\n * Returns a reactive signal tracking device motion (accelerometer + gyroscope).\n *\n * Uses the `devicemotion` event to provide acceleration, acceleration\n * including gravity, and rotation rate data.\n *\n * @returns A readonly reactive signal with motion sensor data and a `destroy()`\n * method to remove the underlying event listener\n *\n * @example\n * ```ts\n * import { useDeviceMotion } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const motion = useDeviceMotion();\n * effect(() => {\n * const { acceleration } = motion.value;\n * console.log(`Acceleration: x=${acceleration.x}, y=${acceleration.y}, z=${acceleration.z}`);\n * });\n * ```\n */\nexport const useDeviceMotion = (): DeviceMotionSignal => {\n const s = signal<DeviceMotionState>({ ...DEFAULT_MOTION_STATE });\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined') {\n const handler = (e: DeviceMotionEvent): void => {\n s.value = {\n acceleration: {\n x: e.acceleration?.x ?? null,\n y: e.acceleration?.y ?? null,\n z: e.acceleration?.z ?? null,\n },\n accelerationIncludingGravity: {\n x: e.accelerationIncludingGravity?.x ?? null,\n y: e.accelerationIncludingGravity?.y ?? null,\n z: e.accelerationIncludingGravity?.z ?? null,\n },\n rotationRate: {\n alpha: e.rotationRate?.alpha ?? null,\n beta: e.rotationRate?.beta ?? null,\n gamma: e.rotationRate?.gamma ?? null,\n },\n interval: e.interval ?? 0,\n };\n };\n\n window.addEventListener('devicemotion', handler);\n cleanup = () => {\n window.removeEventListener('devicemotion', handler);\n };\n }\n\n const ro = readonly(s) as DeviceMotionSignal;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n\n/**\n * Returns a reactive signal tracking device orientation (compass/gyroscope).\n *\n * Uses the `deviceorientation` event to provide alpha (compass heading),\n * beta (front-to-back tilt), and gamma (left-to-right tilt) data.\n *\n * @returns A readonly reactive signal with orientation data and a `destroy()`\n * method to remove the underlying event listener\n *\n * @example\n * ```ts\n * import { useDeviceOrientation } from '@bquery/bquery/media';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const orientation = useDeviceOrientation();\n * effect(() => {\n * console.log(`Compass heading: ${orientation.value.alpha}°`);\n * console.log(`Tilt: ${orientation.value.beta}° / ${orientation.value.gamma}°`);\n * });\n * ```\n */\nexport const useDeviceOrientation = (): DeviceOrientationSignal => {\n const s = signal<DeviceOrientationState>({ ...DEFAULT_ORIENTATION_STATE });\n let cleanup: (() => void) | undefined;\n\n if (typeof window !== 'undefined') {\n const handler = (e: DeviceOrientationEvent): void => {\n s.value = {\n alpha: e.alpha ?? null,\n beta: e.beta ?? null,\n gamma: e.gamma ?? null,\n absolute: e.absolute ?? false,\n };\n };\n\n window.addEventListener('deviceorientation', handler);\n cleanup = () => {\n window.removeEventListener('deviceorientation', handler);\n };\n }\n\n const ro = readonly(s) as DeviceOrientationSignal;\n let destroyed = false;\n Object.defineProperty(ro, 'destroy', {\n enumerable: false,\n configurable: true,\n value(): void {\n if (destroyed) return;\n destroyed = true;\n cleanup?.();\n s.dispose();\n },\n });\n\n return ro;\n};\n","/**\n * Async clipboard API wrappers.\n *\n * Provides simple read/write access to the system clipboard\n * via the Async Clipboard API.\n *\n * @module bquery/media\n */\n\nimport type { ClipboardAPI } from './types';\n\nconst CLIPBOARD_UNAVAILABLE_ERROR =\n 'bQuery media: Clipboard API is unavailable. Use a secure context (HTTPS or localhost) and ensure clipboard permissions or user-activation requirements are met.';\n\n/**\n * Clipboard API wrapper providing simple async read/write access.\n *\n * Uses the modern Async Clipboard API (`navigator.clipboard`) under the hood.\n * Both methods are `Promise`-based and will reject if the API is unavailable\n * or permission is denied.\n *\n * @example\n * ```ts\n * import { clipboard } from '@bquery/bquery/media';\n *\n * // Write text to clipboard\n * await clipboard.write('Hello, world!');\n *\n * // Read text from clipboard\n * const text = await clipboard.read();\n * console.log(text); // \"Hello, world!\"\n * ```\n */\nexport const clipboard: ClipboardAPI = {\n /**\n * Reads text from the system clipboard.\n *\n * @returns A promise that resolves with the clipboard text content\n * @throws Error if the Clipboard API is not available or permission is denied\n *\n * @example\n * ```ts\n * const text = await clipboard.read();\n * console.log('Clipboard contains:', text);\n * ```\n */\n read: async (): Promise<string> => {\n if (\n typeof navigator === 'undefined' ||\n !navigator.clipboard ||\n typeof navigator.clipboard.readText !== 'function'\n ) {\n throw new Error(CLIPBOARD_UNAVAILABLE_ERROR);\n }\n return navigator.clipboard.readText();\n },\n\n /**\n * Writes text to the system clipboard.\n *\n * @param text - The text to write to the clipboard\n * @returns A promise that resolves when the text has been written\n * @throws Error if the Clipboard API is not available or permission is denied\n *\n * @example\n * ```ts\n * await clipboard.write('Copied!');\n * ```\n */\n write: async (text: string): Promise<void> => {\n if (\n typeof navigator === 'undefined' ||\n !navigator.clipboard ||\n typeof navigator.clipboard.writeText !== 'function'\n ) {\n throw new Error(CLIPBOARD_UNAVAILABLE_ERROR);\n }\n return navigator.clipboard.writeText(text);\n },\n};\n"],"mappings":"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"}
package/dist/media.es.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as s, c as a, i as o, l as t, n as i, o as r, r as u, s as n, t as c } from "./media-Di2Ta22s.js";
1
+ import { a as s, c as a, i as o, l as t, n as i, o as r, r as u, s as n, t as c } from "./media-i-fB5WxI.js";
2
2
  export {
3
3
  a as breakpoints,
4
4
  c as clipboard,
@@ -1,4 +1,4 @@
1
- import { n as X } from "./config-BW35FKuA.js";
1
+ import { n as X } from "./config-DhT9auRm.js";
2
2
  var R = null, M = () => R !== null ? R : typeof window > "u" || typeof window.matchMedia != "function" ? !1 : window.matchMedia("(prefers-reduced-motion: reduce)").matches, te = (e) => {
3
3
  R = e;
4
4
  }, N = (e) => typeof e == "string" || typeof e == "number", k = (e) => e.replace(/[A-Z]/g, (t) => `-${t.toLowerCase()}`), P = (e, t) => {
@@ -527,4 +527,4 @@ export {
527
527
  q as y
528
528
  };
529
529
 
530
- //# sourceMappingURL=motion-qPj_TYGv.js.map
530
+ //# sourceMappingURL=motion-BJsAuULb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-BJsAuULb.js","names":[],"sources":["../src/motion/reduced-motion.ts","../src/motion/animate.ts","../src/motion/easing.ts","../src/motion/flip.ts","../src/motion/keyframes.ts","../src/motion/morph.ts","../src/motion/parallax.ts","../src/motion/scroll.ts","../src/motion/spring.ts","../src/motion/stagger.ts","../src/motion/timeline.ts","../src/motion/transition.ts","../src/motion/typewriter.ts"],"sourcesContent":["/**\n * Reduced motion detection and global toggle helpers.\n *\n * @module bquery/motion\n */\n\n/**\n * Global override for reduced motion preference.\n * When `null`, the system preference is used.\n * When `true`, reduced motion is forced on.\n * When `false`, reduced motion is forced off.\n *\n * @internal\n */\nlet reducedMotionOverride: boolean | null = null;\n\n/**\n * Check whether reduced motion should be applied.\n *\n * Returns the global override if set via {@link setReducedMotion},\n * otherwise checks the user's system preference.\n *\n * @returns `true` if reduced motion should be applied\n *\n * @example\n * ```ts\n * if (prefersReducedMotion()) {\n * // skip animation\n * }\n * ```\n */\nexport const prefersReducedMotion = (): boolean => {\n if (reducedMotionOverride !== null) {\n return reducedMotionOverride;\n }\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return false;\n }\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n};\n\n/**\n * Programmatically override the reduced motion preference globally.\n *\n * When set to `true`, all motion functions that respect reduced motion\n * will skip animations. When set to `false`, animations run regardless\n * of system settings. Pass `null` to restore system-preference detection.\n *\n * @param override - `true` to force reduced motion, `false` to force\n * full motion, or `null` to use system preference\n *\n * @example\n * ```ts\n * // Force all animations to be instant\n * setReducedMotion(true);\n *\n * // Re-enable animations regardless of system\n * setReducedMotion(false);\n *\n * // Restore system preference\n * setReducedMotion(null);\n * ```\n */\nexport const setReducedMotion = (override: boolean | null): void => {\n reducedMotionOverride = override;\n};\n","/**\n * Web Animations helpers.\n *\n * @module bquery/motion\n */\n\nimport { prefersReducedMotion } from './reduced-motion';\nimport type { AnimateOptions } from './types';\n\n/** @internal */\nconst isStyleValue = (value: unknown): value is string | number =>\n typeof value === 'string' || typeof value === 'number';\n\n/**\n * Convert camelCase property names to kebab-case for CSS.\n * @internal\n */\nconst toKebabCase = (str: string): string => {\n return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n};\n\n/** @internal */\nexport const applyFinalKeyframeStyles = (\n element: Element,\n keyframes: Keyframe[] | PropertyIndexedKeyframes\n): void => {\n const htmlElement = element as HTMLElement;\n const style = htmlElement.style;\n\n if (Array.isArray(keyframes)) {\n const last = keyframes[keyframes.length - 1];\n if (!last) return;\n for (const [prop, value] of Object.entries(last)) {\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\n if (isStyleValue(value)) {\n // Convert camelCase to kebab-case for CSS properties\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\n style.setProperty(cssProp, String(value));\n }\n }\n return;\n }\n\n for (const [prop, value] of Object.entries(keyframes)) {\n if (prop === 'offset' || prop === 'easing' || prop === 'composite') continue;\n const finalValue = Array.isArray(value) ? value[value.length - 1] : value;\n if (isStyleValue(finalValue)) {\n // Convert camelCase to kebab-case for CSS properties\n const cssProp = prop.startsWith('--') ? prop : toKebabCase(prop);\n style.setProperty(cssProp, String(finalValue));\n }\n }\n};\n\n/**\n * Animate an element using the Web Animations API with reduced-motion fallback.\n *\n * @param element - Element to animate\n * @param config - Animation configuration\n * @returns Promise that resolves when animation completes\n *\n * @example\n * ```ts\n * await animate(element, {\n * keyframes: [{ opacity: 0 }, { opacity: 1 }],\n * options: { duration: 200, easing: 'ease-out' },\n * });\n * ```\n */\nexport const animate = (element: Element, config: AnimateOptions): Promise<void> => {\n const { keyframes, options, commitStyles = true, respectReducedMotion = true, onFinish } = config;\n\n if (respectReducedMotion && prefersReducedMotion()) {\n if (commitStyles) {\n applyFinalKeyframeStyles(element, keyframes);\n }\n onFinish?.();\n return Promise.resolve();\n }\n\n const htmlElement = element as HTMLElement;\n if (typeof htmlElement.animate !== 'function') {\n if (commitStyles) {\n applyFinalKeyframeStyles(element, keyframes);\n }\n onFinish?.();\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const animation = htmlElement.animate(keyframes, options);\n let finalized = false;\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n if (commitStyles) {\n if (typeof animation.commitStyles === 'function') {\n animation.commitStyles();\n } else {\n applyFinalKeyframeStyles(element, keyframes);\n }\n }\n animation.cancel();\n onFinish?.();\n resolve();\n };\n\n animation.onfinish = finalize;\n if (animation.finished) {\n animation.finished.then(finalize).catch(finalize);\n }\n });\n};\n","/**\n * Easing helpers.\n *\n * @module bquery/motion\n */\n\nimport type { EasingFunction } from './types';\n\nconst clamp = (value: number) => Math.min(1, Math.max(0, value));\n\nexport const linear: EasingFunction = (t) => clamp(t);\nexport const easeInQuad: EasingFunction = (t) => clamp(t * t);\nexport const easeOutQuad: EasingFunction = (t) => clamp(1 - (1 - t) * (1 - t));\nexport const easeInOutQuad: EasingFunction = (t) =>\n clamp(t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2);\nexport const easeInCubic: EasingFunction = (t) => clamp(t * t * t);\nexport const easeOutCubic: EasingFunction = (t) => clamp(1 - Math.pow(1 - t, 3));\nexport const easeInOutCubic: EasingFunction = (t) =>\n clamp(t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\nexport const easeOutBack: EasingFunction = (t) => {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n return clamp(1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2));\n};\nexport const easeOutExpo: EasingFunction = (t) => clamp(t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n\n/**\n * Named easing presets.\n */\nexport const easingPresets = {\n linear,\n easeInQuad,\n easeOutQuad,\n easeInOutQuad,\n easeInCubic,\n easeOutCubic,\n easeInOutCubic,\n easeOutBack,\n easeOutExpo,\n};\n","/**\n * FLIP animation helpers.\n *\n * @module bquery/motion\n */\n\nimport type { ElementBounds, FlipGroupOptions, FlipOptions } from './types';\n\n/**\n * Capture the current bounds of an element for FLIP animation.\n *\n * @param element - The DOM element to measure\n * @returns The element's current position and size\n */\nexport const capturePosition = (element: Element): ElementBounds => {\n const rect = element.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n};\n\n/**\n * Perform a FLIP (First, Last, Invert, Play) animation.\n * Animates an element from its captured position to its current position.\n *\n * @param element - The element to animate\n * @param firstBounds - The previously captured bounds\n * @param options - Animation configuration\n * @returns Promise that resolves when animation completes\n *\n * @example\n * ```ts\n * const first = capturePosition(element);\n * // ... DOM changes that move the element ...\n * await flip(element, first, { duration: 300 });\n * ```\n */\nexport const flip = (\n element: Element,\n firstBounds: ElementBounds,\n options: FlipOptions = {}\n): Promise<void> => {\n const { duration = 300, easing = 'ease-out', onComplete } = options;\n\n // Last: Get current position\n const lastBounds = capturePosition(element);\n\n // Skip animation if element has zero dimensions (avoid division by zero)\n if (lastBounds.width === 0 || lastBounds.height === 0) {\n onComplete?.();\n return Promise.resolve();\n }\n\n // Invert: Calculate the delta\n const deltaX = firstBounds.left - lastBounds.left;\n const deltaY = firstBounds.top - lastBounds.top;\n const deltaW = firstBounds.width / lastBounds.width;\n const deltaH = firstBounds.height / lastBounds.height;\n\n // Skip animation if no change\n if (deltaX === 0 && deltaY === 0 && deltaW === 1 && deltaH === 1) {\n onComplete?.();\n return Promise.resolve();\n }\n\n const htmlElement = element as HTMLElement;\n\n // Feature check: fallback if Web Animations API is unavailable\n if (typeof htmlElement.animate !== 'function') {\n onComplete?.();\n return Promise.resolve();\n }\n\n // Apply inverted transform\n htmlElement.style.transform = `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`;\n htmlElement.style.transformOrigin = 'top left';\n\n // Force reflow\n void htmlElement.offsetHeight;\n\n // Play: Animate back to current position\n return new Promise((resolve) => {\n const animation = htmlElement.animate(\n [\n {\n transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`,\n },\n { transform: 'translate(0, 0) scale(1, 1)' },\n ],\n { duration, easing, fill: 'forwards' }\n );\n\n let finalized = false;\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n htmlElement.style.transform = '';\n htmlElement.style.transformOrigin = '';\n onComplete?.();\n resolve();\n };\n\n animation.onfinish = finalize;\n // Handle cancel/rejection via the finished promise\n if (animation.finished) {\n animation.finished.then(finalize).catch(finalize);\n }\n });\n};\n\n/**\n * FLIP helper for animating a list of elements.\n * Useful for reordering lists with smooth animations.\n *\n * @param elements - Array of elements to animate\n * @param performUpdate - Function that performs the DOM update\n * @param options - Animation configuration\n *\n * @example\n * ```ts\n * await flipList(listItems, () => {\n * container.appendChild(container.firstChild); // Move first to last\n * });\n * ```\n */\nexport const flipList = async (\n elements: Element[],\n performUpdate: () => void,\n options: FlipOptions = {}\n): Promise<void> => {\n await flipElements(elements, performUpdate, options);\n};\n\n/**\n * FLIP helper with optional stagger support.\n *\n * @param elements - Array of elements to animate\n * @param performUpdate - Function that performs the DOM update\n * @param options - Animation configuration\n */\nexport const flipElements = async (\n elements: Element[],\n performUpdate: () => void,\n options: FlipGroupOptions = {}\n): Promise<void> => {\n const { stagger, ...flipOptions } = options;\n\n // First: Capture all positions\n const positions = new Map<Element, ElementBounds>();\n for (const el of elements) {\n positions.set(el, capturePosition(el));\n }\n\n // Perform DOM update\n performUpdate();\n\n const total = elements.length;\n\n // Animate each element\n const animations = elements.map((el, index) => {\n const first = positions.get(el);\n if (!first) return Promise.resolve();\n const delay = stagger ? stagger(index, total) : 0;\n if (delay > 0) {\n return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>\n flip(el, first, flipOptions)\n );\n }\n return flip(el, first, flipOptions);\n });\n\n await Promise.all(animations);\n};\n","/**\n * Keyframe presets.\n *\n * @module bquery/motion\n */\n\n/**\n * Common keyframe presets for quick animations.\n */\nexport const keyframePresets = {\n fadeIn: (from = 0, to = 1): Keyframe[] => [{ opacity: from }, { opacity: to }],\n fadeOut: (from = 1, to = 0): Keyframe[] => [{ opacity: from }, { opacity: to }],\n slideInUp: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInDown: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateY(-${distance}px)` },\n { opacity: 1, transform: 'translateY(0)' },\n ],\n slideInLeft: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n slideInRight: (distance = 16): Keyframe[] => [\n { opacity: 0, transform: `translateX(-${distance}px)` },\n { opacity: 1, transform: 'translateX(0)' },\n ],\n scaleIn: (from = 0.95, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${to})` },\n ],\n scaleOut: (from = 1, to = 0.95): Keyframe[] => [\n { opacity: 1, transform: `scale(${from})` },\n { opacity: 0, transform: `scale(${to})` },\n ],\n pop: (from = 0.9, mid = 1.02, to = 1): Keyframe[] => [\n { opacity: 0, transform: `scale(${from})` },\n { opacity: 1, transform: `scale(${mid})`, offset: 0.6 },\n { opacity: 1, transform: `scale(${to})` },\n ],\n rotateIn: (degrees = 6): Keyframe[] => [\n { opacity: 0, transform: `rotate(${degrees}deg) scale(0.98)` },\n { opacity: 1, transform: 'rotate(0deg) scale(1)' },\n ],\n};\n","/**\n * FLIP-based morph animation between two element states.\n *\n * @module bquery/motion\n */\n\nimport { prefersReducedMotion } from './reduced-motion';\nimport type { MorphOptions } from './types';\n\n/**\n * Perform a FLIP-based morph animation between two elements.\n *\n * Captures the bounding rect of the `from` element, hides it, shows the\n * `to` element, then animates the `to` element from the `from` position\n * using CSS transforms and opacity.\n *\n * @param from - The source element (will be hidden at the end)\n * @param to - The destination element (will be shown and animated into place)\n * @param options - Morph animation options\n * @returns Promise that resolves when the morph completes\n *\n * @example\n * ```ts\n * const card = document.querySelector('.card');\n * const detail = document.querySelector('.detail');\n * await morphElement(card, detail, { duration: 400, easing: 'ease-out' });\n * ```\n */\nexport const morphElement = (\n from: Element,\n to: Element,\n options: MorphOptions = {}\n): Promise<void> => {\n const { duration = 300, easing = 'ease', respectReducedMotion = true, onComplete } = options;\n\n const fromEl = from as HTMLElement;\n const toEl = to as HTMLElement;\n\n if (\n typeof window === 'undefined' ||\n typeof document === 'undefined' ||\n typeof fromEl.getBoundingClientRect !== 'function' ||\n typeof toEl.getBoundingClientRect !== 'function' ||\n typeof fromEl.style === 'undefined' ||\n typeof toEl.style === 'undefined'\n ) {\n onComplete?.();\n return Promise.resolve();\n }\n\n // Capture FIRST position of source element\n const firstRect = from.getBoundingClientRect();\n\n // Ensure destination is visible so we can measure it\n const previousDisplay = toEl.style.display;\n const previousVisibility = toEl.style.visibility;\n const previousTransform = toEl.style.transform;\n const previousOpacity = toEl.style.opacity;\n const computedDisplay =\n typeof getComputedStyle === 'function'\n ? getComputedStyle(toEl).display\n : previousDisplay || 'block';\n // Prefer an explicit inline display, otherwise fall back to the current computed\n // display, and finally to `block` so hidden destinations remain measurable.\n const forcedDisplay =\n computedDisplay === 'none' ? 'block' : previousDisplay || computedDisplay || 'block';\n const restoreAnimatedInlineStyles = () => {\n toEl.style.transform = previousTransform;\n toEl.style.opacity = previousOpacity;\n };\n\n toEl.style.visibility = 'hidden';\n toEl.style.display = forcedDisplay;\n\n // Capture LAST position of destination element\n const lastRect = to.getBoundingClientRect();\n\n // Restore visibility (it will be animated in)\n toEl.style.visibility = previousVisibility;\n\n // Hide source, show destination\n fromEl.style.display = 'none';\n if (computedDisplay === 'none') {\n toEl.style.display = forcedDisplay;\n } else if (previousDisplay === 'none') {\n toEl.style.display = '';\n } else {\n toEl.style.display = previousDisplay;\n }\n\n // If reduced motion is preferred, skip the animation\n if (respectReducedMotion && prefersReducedMotion()) {\n restoreAnimatedInlineStyles();\n onComplete?.();\n return Promise.resolve();\n }\n\n // Calculate the transform inversion (FLIP: Invert)\n const dx = firstRect.left - lastRect.left;\n const dy = firstRect.top - lastRect.top;\n const sx = firstRect.width / (lastRect.width || 1);\n const sy = firstRect.height / (lastRect.height || 1);\n\n // If no visual change, skip animation\n if (dx === 0 && dy === 0 && sx === 1 && sy === 1) {\n restoreAnimatedInlineStyles();\n onComplete?.();\n return Promise.resolve();\n }\n\n const keyframes: Keyframe[] = [\n {\n transform: `translate(${dx}px, ${dy}px) scale(${sx}, ${sy})`,\n opacity: '0.5',\n },\n {\n transform: 'translate(0, 0) scale(1, 1)',\n opacity: '1',\n },\n ];\n\n // Check if animate API is available\n if (typeof toEl.animate !== 'function') {\n restoreAnimatedInlineStyles();\n onComplete?.();\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n const animation = toEl.animate(keyframes, {\n duration,\n easing,\n fill: 'forwards',\n });\n\n let finalized = false;\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n restoreAnimatedInlineStyles();\n animation.cancel();\n onComplete?.();\n resolve();\n };\n\n animation.onfinish = finalize;\n if (animation.finished) {\n animation.finished.then(finalize).catch(finalize);\n }\n });\n};\n","/**\n * Scroll-linked parallax effect.\n *\n * @module bquery/motion\n */\n\nimport { prefersReducedMotion } from './reduced-motion';\nimport type { ParallaxCleanup, ParallaxOptions } from './types';\n\n/**\n * Apply a scroll-linked parallax effect to an element.\n *\n * The element's position is translated based on the scroll position\n * multiplied by the speed factor. A speed of `0.5` means the element\n * moves at half the scroll speed (classic background parallax).\n *\n * @param element - The element to apply the parallax effect to\n * @param options - Parallax configuration\n * @returns A cleanup function that removes the scroll listener\n *\n * @example\n * ```ts\n * const cleanup = parallax(document.querySelector('.hero-bg')!, {\n * speed: 0.3,\n * direction: 'vertical',\n * });\n *\n * // Later, remove the effect:\n * cleanup();\n * ```\n */\nexport const parallax = (element: Element, options: ParallaxOptions = {}): ParallaxCleanup => {\n if (\n typeof window === 'undefined' ||\n typeof window.addEventListener !== 'function' ||\n typeof window.removeEventListener !== 'function' ||\n typeof requestAnimationFrame !== 'function' ||\n typeof cancelAnimationFrame !== 'function'\n ) {\n return () => {};\n }\n\n const { speed = 0.5, direction = 'vertical', respectReducedMotion = true } = options;\n\n const el = element as HTMLElement;\n const previousTransform = el.style.transform;\n\n // If reduced motion is preferred, don't apply parallax\n if (respectReducedMotion && prefersReducedMotion()) {\n return () => {};\n }\n\n let ticking = false;\n let destroyed = false;\n let frameId: number | null = null;\n\n const cleanup = (): void => {\n if (destroyed) return;\n destroyed = true;\n window.removeEventListener('scroll', onScroll);\n if (frameId !== null) {\n cancelAnimationFrame(frameId);\n frameId = null;\n }\n ticking = false;\n el.style.transform = previousTransform;\n };\n\n const updatePosition = () => {\n if (destroyed) return;\n\n // Re-check reduced motion on each frame (in case toggle changed)\n if (respectReducedMotion && prefersReducedMotion()) {\n cleanup();\n return;\n }\n\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n let tx = 0;\n let ty = 0;\n\n if (direction === 'vertical' || direction === 'both') {\n ty = scrollY * speed;\n }\n if (direction === 'horizontal' || direction === 'both') {\n tx = scrollX * speed;\n }\n\n const parallaxTransform = `translate3d(${tx}px, ${ty}px, 0)`;\n el.style.transform = previousTransform\n ? `${previousTransform} ${parallaxTransform}`\n : parallaxTransform;\n };\n\n const onScroll = () => {\n if (destroyed) return;\n if (respectReducedMotion && prefersReducedMotion()) {\n cleanup();\n return;\n }\n if (!ticking) {\n ticking = true;\n frameId = requestAnimationFrame(() => {\n frameId = null;\n updatePosition();\n ticking = false;\n });\n }\n };\n\n // Apply initial position\n updatePosition();\n\n // Listen to scroll events\n window.addEventListener('scroll', onScroll, { passive: true });\n\n return cleanup;\n};\n","/**\n * Scroll-triggered animation helpers.\n *\n * @module bquery/motion\n */\n\nimport { animate } from './animate';\nimport type { ScrollAnimateCleanup, ScrollAnimateOptions } from './types';\n\nconst resolveElements = (elements: Element | Iterable<Element> | ArrayLike<Element>): Element[] => {\n if (typeof Element !== 'undefined' && elements instanceof Element) return [elements];\n return Array.from(elements as Iterable<Element>);\n};\n\n/**\n * Animate elements when they enter the viewport.\n *\n * @param elements - Target element(s)\n * @param options - Scroll animation configuration\n * @returns Cleanup function to disconnect observers\n */\nexport const scrollAnimate = (\n elements: Element | Iterable<Element> | ArrayLike<Element>,\n options: ScrollAnimateOptions\n): ScrollAnimateCleanup => {\n const targets = resolveElements(elements);\n if (!targets.length) return () => undefined;\n\n const { root = null, rootMargin, threshold, once = true, onEnter, ...animationConfig } = options;\n\n if (typeof IntersectionObserver === 'undefined') {\n targets.forEach((element) => {\n onEnter?.(element);\n void animate(element, animationConfig);\n });\n return () => undefined;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (!entry.isIntersecting) return;\n const element = entry.target as Element;\n onEnter?.(element);\n void animate(element, animationConfig);\n if (once) {\n observer.unobserve(element);\n }\n });\n },\n { root, rootMargin, threshold }\n );\n\n targets.forEach((element) => observer.observe(element));\n\n return () => observer.disconnect();\n};\n","/**\n * Spring physics helpers.\n *\n * @module bquery/motion\n */\n\nimport type { Spring, SpringConfig } from './types';\n\n/**\n * Default spring configuration values.\n */\nconst DEFAULT_SPRING_CONFIG: Required<SpringConfig> = {\n stiffness: 100,\n damping: 10,\n mass: 1,\n precision: 0.01,\n};\n\n/**\n * Create a spring-based animation for smooth, physics-based motion.\n *\n * Uses variable frame rate timing based on `requestAnimationFrame` timestamps\n * to ensure consistent animation speed across different devices and frame rates.\n * Large time deltas (e.g., from tab backgrounding) are clamped to maintain\n * simulation stability.\n *\n * @param initialValue - Starting value for the spring\n * @param config - Spring physics configuration\n * @returns Spring instance for controlling the animation\n *\n * @example\n * ```ts\n * const x = spring(0, { stiffness: 120, damping: 14 });\n * x.onChange((value) => {\n * element.style.transform = `translateX(${value}px)`;\n * });\n * await x.to(100);\n * ```\n */\nexport const spring = (initialValue: number, config: SpringConfig = {}): Spring => {\n const { stiffness, damping, mass, precision } = {\n ...DEFAULT_SPRING_CONFIG,\n ...config,\n };\n\n let current = initialValue;\n let velocity = 0;\n let target = initialValue;\n let animationFrame: number | null = null;\n let resolvePromise: (() => void) | null = null;\n let lastTime: number | null = null;\n const listeners = new Set<(value: number) => void>();\n\n const notifyListeners = () => {\n for (const listener of listeners) {\n listener(current);\n }\n };\n\n const step = (timestamp: number) => {\n // Calculate time delta (in seconds) from last frame\n // If this is the first frame, use a sensible default (1/60s)\n // This ensures the animation speed is independent of frame rate\n const deltaTime = lastTime !== null ? (timestamp - lastTime) / 1000 : 1 / 60;\n // Clamp large deltas to prevent instability (e.g. tab backgrounding)\n // Maximum delta of 1/30s (~33ms) keeps simulation stable\n const clampedDelta = Math.min(deltaTime, 1 / 30);\n lastTime = timestamp;\n\n // Spring physics calculation\n const displacement = current - target;\n const springForce = -stiffness * displacement;\n const dampingForce = -damping * velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n velocity += acceleration * clampedDelta;\n current += velocity * clampedDelta;\n\n notifyListeners();\n\n // Check if spring has settled\n if (Math.abs(velocity) < precision && Math.abs(displacement) < precision) {\n current = target;\n velocity = 0;\n animationFrame = null;\n notifyListeners();\n resolvePromise?.();\n resolvePromise = null;\n return;\n }\n\n animationFrame = requestAnimationFrame(step);\n };\n\n return {\n to(newTarget: number): Promise<void> {\n target = newTarget;\n\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n\n // Resolve any pending promise from a previous to() call\n // This ensures all returned promises eventually settle\n resolvePromise?.();\n\n // Reset lastTime to ensure clean start for new animation\n lastTime = null;\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n animationFrame = requestAnimationFrame(step);\n });\n },\n\n current(): number {\n return current;\n },\n\n stop(): void {\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n animationFrame = null;\n }\n velocity = 0;\n lastTime = null;\n resolvePromise?.();\n resolvePromise = null;\n },\n\n onChange(callback: (value: number) => void): () => void {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n};\n\n/**\n * Preset spring configurations for common use cases.\n */\nexport const springPresets = {\n /** Gentle, slow-settling spring */\n gentle: { stiffness: 80, damping: 15 } as SpringConfig,\n /** Responsive, snappy spring */\n snappy: { stiffness: 200, damping: 20 } as SpringConfig,\n /** Bouncy, playful spring */\n bouncy: { stiffness: 300, damping: 8 } as SpringConfig,\n /** Stiff, quick spring with minimal overshoot */\n stiff: { stiffness: 400, damping: 30 } as SpringConfig,\n};\n","/**\n * Stagger helpers.\n *\n * @module bquery/motion\n */\n\nimport type { StaggerFunction, StaggerOptions } from './types';\n\n/**\n * Create a staggered delay function for list animations.\n *\n * @param step - Delay between items in milliseconds\n * @param options - Stagger configuration\n * @returns Function that returns delay for a given index\n *\n * @example\n * ```ts\n * const delay = stagger(50, { from: 'center' });\n * delay(0, 3); // 50\n * delay(1, 3); // 0\n * ```\n */\nexport const stagger = (step: number, options: StaggerOptions = {}): StaggerFunction => {\n const { start = 0, from = 'start', easing } = options;\n\n return (index: number, total = 0): number => {\n const origin =\n typeof from === 'number'\n ? from\n : from === 'center'\n ? (total - 1) / 2\n : from === 'end'\n ? total - 1\n : 0;\n\n const distance = Math.abs(index - origin);\n const maxDistance = total > 1 ? Math.max(origin, total - 1 - origin) : 1;\n const normalized = maxDistance === 0 ? 0 : distance / maxDistance;\n const eased = easing ? easing(normalized) * maxDistance : distance;\n\n return start + eased * step;\n };\n};\n","/**\n * Timeline and sequence helpers.\n *\n * @module bquery/motion\n */\n\nimport { animate, applyFinalKeyframeStyles } from './animate';\nimport { prefersReducedMotion } from './reduced-motion';\nimport type {\n SequenceOptions,\n SequenceStep,\n TimelineConfig,\n TimelineControls,\n TimelineStep,\n} from './types';\n\nconst resolveTimeValue = (value?: number | string): number => {\n if (typeof value === 'number') return value;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.endsWith('ms')) {\n const parsed = Number.parseFloat(trimmed.slice(0, -2));\n return Number.isFinite(parsed) ? parsed : 0;\n }\n if (trimmed.endsWith('s')) {\n const parsed = Number.parseFloat(trimmed.slice(0, -1));\n return Number.isFinite(parsed) ? parsed * 1000 : 0;\n }\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n return 0;\n};\n\nconst resolveAt = (at: TimelineStep['at'], previousEnd: number): number => {\n if (typeof at === 'number') return at;\n if (typeof at === 'string') {\n const match = /^([+-])=(\\d+(?:\\.\\d+)?)$/.exec(at);\n if (match) {\n const delta = Number.parseFloat(match[2]);\n if (!Number.isFinite(delta)) return previousEnd;\n return match[1] === '+' ? previousEnd + delta : previousEnd - delta;\n }\n }\n return previousEnd;\n};\n\nconst normalizeDuration = (options?: KeyframeAnimationOptions): number => {\n const baseDuration = resolveTimeValue(options?.duration as number | string | undefined);\n const endDelay = resolveTimeValue(options?.endDelay as number | string | undefined);\n const rawIterations = options?.iterations ?? 1;\n\n // Handle infinite iterations - treat as a special case with a very large duration\n // In practice, infinite iterations shouldn't be used in timelines as they never end\n if (rawIterations === Infinity) {\n // Return a large sentinel value - timeline calculations will be incorrect,\n // but this at least prevents NaN/Infinity from breaking scheduling\n return Number.MAX_SAFE_INTEGER;\n }\n\n // Per Web Animations spec, iterations must be a non-negative number\n // Treat negative as 0 (only endDelay duration)\n const iterations = Math.max(0, rawIterations);\n\n // Total duration = (baseDuration * iterations) + endDelay\n // Note: endDelay is applied once at the end, after all iterations\n return baseDuration * iterations + endDelay;\n};\n\nconst scheduleSteps = (steps: TimelineStep[]) => {\n let previousEnd = 0;\n return steps.map((step) => {\n const baseStart = resolveAt(step.at, previousEnd);\n const stepDelay = resolveTimeValue(step.options?.delay as number | string | undefined);\n const start = Math.max(0, baseStart + stepDelay);\n const duration = normalizeDuration(step.options);\n const end = start + duration;\n previousEnd = Math.max(previousEnd, end);\n return { step, start, end, duration };\n });\n};\n\n/**\n * Run a list of animations sequentially.\n *\n * @param steps - Steps to run in order\n * @param options - Sequence configuration\n */\nexport const sequence = async (\n steps: SequenceStep[],\n options: SequenceOptions = {}\n): Promise<void> => {\n const { stagger, onFinish } = options;\n const total = steps.length;\n\n for (let index = 0; index < steps.length; index += 1) {\n const step = steps[index];\n const delay = stagger ? stagger(index, total) : 0;\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n await animate(step.target, step);\n }\n\n onFinish?.();\n};\n\n/**\n * Create a timeline controller for multiple animations.\n *\n * @param initialSteps - Steps for the timeline\n * @param config - Timeline configuration\n */\nexport const timeline = (\n initialSteps: TimelineStep[] = [],\n config: TimelineConfig = {}\n): TimelineControls => {\n const steps = [...initialSteps];\n const listeners = new Set<() => void>();\n let animations: Array<{ animation: Animation; step: TimelineStep; start: number }> = [];\n let totalDuration = 0;\n let reducedMotionApplied = false;\n let finalized = false;\n\n const { commitStyles = true, respectReducedMotion = true, onFinish } = config;\n\n const finalize = () => {\n if (finalized) return;\n finalized = true;\n\n if (commitStyles) {\n for (const item of animations) {\n const { animation, step } = item;\n if (typeof animation.commitStyles === 'function') {\n animation.commitStyles();\n } else {\n applyFinalKeyframeStyles(step.target, step.keyframes);\n }\n animation.cancel();\n }\n }\n\n listeners.forEach((listener) => listener());\n onFinish?.();\n };\n\n const buildAnimations = () => {\n animations.forEach(({ animation }) => animation.cancel());\n animations = [];\n finalized = false;\n\n const schedule = scheduleSteps(steps);\n totalDuration = schedule.length ? Math.max(...schedule.map((item) => item.end)) : 0;\n\n if (respectReducedMotion && prefersReducedMotion()) {\n if (commitStyles) {\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\n }\n reducedMotionApplied = true;\n return;\n }\n\n // Check if Web Animations API is available on all targets\n const animateUnavailable = schedule.some(\n ({ step }) => typeof (step.target as HTMLElement).animate !== 'function'\n );\n if (animateUnavailable) {\n if (commitStyles) {\n schedule.forEach(({ step }) => applyFinalKeyframeStyles(step.target, step.keyframes));\n }\n reducedMotionApplied = true;\n return;\n }\n\n reducedMotionApplied = false;\n animations = schedule.map(({ step, start }) => {\n const { delay: _delay, ...options } = step.options ?? {};\n const animation = step.target.animate(step.keyframes, {\n ...options,\n delay: start,\n fill: options.fill ?? 'both',\n });\n return { animation, step, start };\n });\n };\n\n return {\n add(step: TimelineStep): void {\n steps.push(step);\n },\n\n duration(): number {\n if (!steps.length) return 0;\n if (!animations.length) {\n const schedule = scheduleSteps(steps);\n return Math.max(...schedule.map((item) => item.end));\n }\n return totalDuration;\n },\n\n async play(): Promise<void> {\n buildAnimations();\n\n if (reducedMotionApplied || animations.length === 0) {\n finalize();\n return;\n }\n\n const finishPromises = animations.map((item) =>\n item.animation.finished.catch(() => undefined)\n );\n await Promise.all(finishPromises);\n finalize();\n },\n\n pause(): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => animation.pause());\n },\n\n resume(): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => animation.play());\n },\n\n stop(): void {\n animations.forEach(({ animation }) => animation.cancel());\n animations = [];\n reducedMotionApplied = false;\n },\n\n seek(time: number): void {\n if (reducedMotionApplied) return;\n animations.forEach(({ animation }) => {\n // currentTime is measured from the beginning of the animation including delay,\n // so we set it directly to the requested timeline time\n animation.currentTime = time;\n });\n },\n\n onFinish(callback: () => void): () => void {\n listeners.add(callback);\n return () => listeners.delete(callback);\n },\n };\n};\n","/**\n * View transition helpers.\n *\n * @module bquery/motion\n */\n\nimport type { TransitionOptions } from './types';\nimport { prefersReducedMotion } from './reduced-motion';\nimport { getBqueryConfig } from '../platform/config';\n\n/** Extended document type with View Transitions API */\ntype DocumentWithTransition = Document & {\n startViewTransition?: (callback: () => void | Promise<void>) => {\n finished: Promise<void>;\n ready: Promise<void>;\n updateCallbackDone: Promise<void>;\n skipTransition?: () => void;\n types?: {\n add: (type: string) => void;\n };\n };\n};\n\nconst sanitizeTokens = (tokens?: string[]): string[] =>\n (tokens ?? []).map((token) => token.trim()).filter((token) => token.length > 0);\n\n/**\n * Execute a DOM update with view transition animation.\n * Falls back to immediate update when View Transitions API is unavailable.\n *\n * @param updateOrOptions - Update function or options object\n * @returns Promise that resolves when transition completes\n *\n * @example\n * ```ts\n * await transition(() => {\n * $('#content').text('Updated');\n * });\n * ```\n */\nexport const transition = async (\n updateOrOptions: (() => void | Promise<void>) | TransitionOptions\n): Promise<void> => {\n const config = getBqueryConfig().transitions;\n const options: TransitionOptions =\n typeof updateOrOptions === 'function'\n ? {\n update: updateOrOptions,\n classes: config?.classes,\n types: config?.types,\n skipOnReducedMotion: config?.skipOnReducedMotion,\n }\n : {\n ...updateOrOptions,\n classes: updateOrOptions.classes ?? config?.classes,\n types: updateOrOptions.types ?? config?.types,\n skipOnReducedMotion: updateOrOptions.skipOnReducedMotion ?? config?.skipOnReducedMotion,\n };\n const update = options.update;\n\n // SSR/non-DOM environment fallback\n if (typeof document === 'undefined') {\n await update();\n return;\n }\n\n const doc = document as DocumentWithTransition;\n const root = document.documentElement;\n const classes = sanitizeTokens(options.classes);\n const types = sanitizeTokens(options.types);\n\n if (!doc.startViewTransition || (options.skipOnReducedMotion && prefersReducedMotion())) {\n await update();\n options.onFinish?.();\n return;\n }\n\n classes.forEach((className: string) => root.classList.add(className));\n\n try {\n const viewTransition = doc.startViewTransition(() => update());\n const transitionTypes = viewTransition.types;\n\n if (transitionTypes) {\n for (const type of types) {\n transitionTypes.add(type);\n }\n }\n\n await viewTransition.ready;\n options.onReady?.();\n await viewTransition.finished;\n options.onFinish?.();\n } finally {\n classes.forEach((className: string) => root.classList.remove(className));\n }\n};\n","/**\n * Character-by-character typewriter text animation.\n *\n * @module bquery/motion\n */\n\nimport { prefersReducedMotion } from './reduced-motion';\nimport type { TypewriterControls, TypewriterOptions } from './types';\n\n/**\n * Animate text appearing character by character in an element.\n *\n * @param element - The element to type text into\n * @param text - The text to display\n * @param options - Typewriter configuration\n * @returns Controls with `.stop()` to cancel and `.done` promise\n *\n * @example\n * ```ts\n * const tw = typewriter(\n * document.querySelector('#output')!,\n * 'Hello, world!',\n * { speed: 80, cursor: true },\n * );\n *\n * // Wait for it to finish:\n * await tw.done;\n *\n * // Or cancel early:\n * tw.stop();\n * ```\n */\nexport const typewriter = (\n element: HTMLElement,\n text: string,\n options: TypewriterOptions = {}\n): TypewriterControls => {\n const {\n speed = 50,\n delay = 0,\n cursor = false,\n cursorChar = '|',\n loop = false,\n loopDelay = 1000,\n respectReducedMotion = true,\n onComplete,\n } = options;\n\n if (typeof document === 'undefined') {\n return {\n stop: () => {},\n done: Promise.resolve(),\n };\n }\n\n const el = element;\n let stopped = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let cursorEl: HTMLSpanElement | null = null;\n let cursorTimer: ReturnType<typeof setInterval> | null = null;\n let resolvePromise: (() => void) | null = null;\n\n // Add cursor element if enabled\n const setupCursor = () => {\n if (!cursor) return;\n cursorEl = document.createElement('span');\n cursorEl.setAttribute('aria-hidden', 'true');\n cursorEl.textContent = cursorChar;\n el.appendChild(cursorEl);\n\n // Blink the cursor\n let visible = true;\n cursorTimer = setInterval(() => {\n if (cursorEl) {\n visible = !visible;\n cursorEl.style.opacity = visible ? '1' : '0';\n }\n }, 530);\n };\n\n const removeCursor = () => {\n if (cursorTimer !== null) {\n clearInterval(cursorTimer);\n cursorTimer = null;\n }\n if (cursorEl && cursorEl.parentNode) {\n cursorEl.parentNode.removeChild(cursorEl);\n cursorEl = null;\n }\n };\n\n const stop = () => {\n if (stopped) return;\n stopped = true;\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n removeCursor();\n // Resolve the done promise so callers awaiting it are unblocked\n resolvePromise?.();\n resolvePromise = null;\n };\n\n // If reduced motion, show text instantly\n if (respectReducedMotion && prefersReducedMotion()) {\n el.textContent = text;\n onComplete?.();\n return {\n stop: () => {},\n done: Promise.resolve(),\n };\n }\n\n const done = new Promise<void>((resolve) => {\n resolvePromise = resolve;\n\n const typeLoop = () => {\n let charIndex = 0;\n el.textContent = '';\n setupCursor();\n const textNode = document.createTextNode('');\n\n if (cursorEl) {\n el.insertBefore(textNode, cursorEl);\n } else {\n el.appendChild(textNode);\n }\n\n const typeNextChar = () => {\n if (stopped) {\n return;\n }\n if (charIndex < text.length) {\n textNode.data = text.slice(0, charIndex + 1);\n charIndex++;\n timer = setTimeout(typeNextChar, speed);\n } else {\n // Typing complete for this iteration\n onComplete?.();\n\n if (loop && !stopped) {\n timer = setTimeout(() => {\n if (!stopped) {\n removeCursor();\n typeLoop();\n }\n }, loopDelay);\n } else {\n removeCursor();\n resolve();\n resolvePromise = null;\n }\n }\n };\n\n timer = setTimeout(typeNextChar, delay);\n };\n\n typeLoop();\n });\n\n return { stop, done };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { C as a, D as e, E as t, O as i, S as r, T as n, _ as u, a as o, b as p, c as l, d as c, f as m, g as d, h as f, i as O, l as g, m as b, n as x, o as C, p as E, r as I, s as P, t as y, u as Q, v as h, w as k, x as w, y as M } from "./motion-qPj_TYGv.js";
1
+ import { C as a, D as e, E as t, O as i, S as r, T as n, _ as u, a as o, b as p, c as l, d as c, f as m, g as d, h as f, i as O, l as g, m as b, n as x, o as C, p as E, r as I, s as P, t as y, u as Q, v as h, w as k, x as w, y as M } from "./motion-BJsAuULb.js";
2
2
  export {
3
3
  t as animate,
4
4
  m as capturePosition,
@@ -1,9 +1,9 @@
1
1
  import { n as V } from "./sanitize-B1V4JswB.js";
2
2
  import { i as Z } from "./object-BCk-1c8T.js";
3
- import { n as R, r as E } from "./core-DnlyjbF2.js";
4
- import { n as U, r as P } from "./reactive-Cfv0RK6x.js";
5
- import { t as X } from "./env-NeVmr4Gf.js";
6
- import { t as G } from "./custom-directives-7wAShnnd.js";
3
+ import { n as R, r as E } from "./core-DdtZHzsS.js";
4
+ import { o as U, s as P } from "./reactive-DwkhUJfP.js";
5
+ import { t as X } from "./env-CTdvLaH2.js";
6
+ import { t as G } from "./custom-directives-Dr4C5lVV.js";
7
7
  var D = 500, N = class {
8
8
  constructor(r) {
9
9
  this.cache = /* @__PURE__ */ new Map(), this.maxSize = r;
@@ -400,4 +400,4 @@ export {
400
400
  we as t
401
401
  };
402
402
 
403
- //# sourceMappingURL=mount-SM07RUa6.js.map
403
+ //# sourceMappingURL=mount-B4Y8bk8Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount-B4Y8bk8Z.js","names":[],"sources":["../src/view/evaluate.ts","../src/view/directives/bind.ts","../src/view/directives/class.ts","../src/view/directives/for.ts","../src/view/directives/html.ts","../src/view/directives/if.ts","../src/view/directives/model.ts","../src/view/directives/on.ts","../src/view/directives/ref.ts","../src/view/directives/show.ts","../src/view/directives/style.ts","../src/view/directives/text.ts","../src/view/process.ts","../src/view/mount.ts"],"sourcesContent":["import { isPrototypePollutionKey } from '../core/utils/object';\nimport { isComputed, isSignal, type Signal } from '../reactive/index';\nimport type { BindingContext } from './types';\n\n/** Maximum number of cached expression functions before LRU eviction */\nconst MAX_CACHE_SIZE = 500;\n\n/** Compiled function type for expression evaluation */\ntype CompiledFn = (ctx: BindingContext) => unknown;\n\n/**\n * Simple LRU cache for compiled expression functions.\n * Uses Map's insertion order to track recency - accessed items are re-inserted.\n * @internal\n */\nclass LRUCache {\n private cache = new Map<string, CompiledFn>();\n private maxSize: number;\n\n constructor(maxSize: number) {\n this.maxSize = maxSize;\n }\n\n get(key: string): CompiledFn | undefined {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Move to end (most recently used) by re-inserting\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n\n set(key: string, value: CompiledFn): void {\n // Delete first if exists to update insertion order\n if (this.cache.has(key)) {\n this.cache.delete(key);\n } else if (this.cache.size >= this.maxSize) {\n // Evict oldest (first) entry\n const oldest = this.cache.keys().next().value;\n if (oldest !== undefined) {\n this.cache.delete(oldest);\n }\n }\n this.cache.set(key, value);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n/** LRU cache for compiled evaluate functions, keyed by expression string */\nconst evaluateCache = new LRUCache(MAX_CACHE_SIZE);\n\n/** LRU cache for compiled evaluateRaw functions, keyed by expression string */\nconst evaluateRawCache = new LRUCache(MAX_CACHE_SIZE);\n\n/**\n * Clears all cached compiled expression functions.\n * Call this when unmounting views or to free memory after heavy template usage.\n *\n * @example\n * ```ts\n * import { clearExpressionCache } from 'bquery/view';\n *\n * // After destroying a view or when cleaning up\n * clearExpressionCache();\n * ```\n */\nexport const clearExpressionCache = (): void => {\n evaluateCache.clear();\n evaluateRawCache.clear();\n};\n\n/**\n * Creates a proxy that lazily unwraps signals/computed only when accessed.\n * This avoids subscribing to signals that aren't referenced in the expression.\n * @internal\n */\nconst createLazyContext = (context: BindingContext): BindingContext =>\n new Proxy(context, {\n get(target, prop: string | symbol) {\n // Only handle string keys for BindingContext indexing\n if (typeof prop !== 'string') {\n return Reflect.get(target, prop);\n }\n const value = target[prop];\n // Auto-unwrap signals/computed only when actually accessed\n if (isSignal(value) || isComputed(value)) {\n return (value as Signal<unknown>).value;\n }\n return value;\n },\n has(target, prop: string | symbol) {\n // Required for `with` statement to resolve identifiers correctly\n if (typeof prop !== 'string') {\n return Reflect.has(target, prop);\n }\n return prop in target;\n },\n });\n\n/**\n * Evaluates an expression in the given context using `new Function()`.\n *\n * Signals and computed values in the context are lazily unwrapped only when\n * accessed by the expression, avoiding unnecessary subscriptions to unused values.\n *\n * @security **WARNING:** This function uses dynamic code execution via `new Function()`.\n * - NEVER pass expressions derived from user input or untrusted sources\n * - Expressions should only come from developer-controlled templates\n * - Malicious expressions can access and exfiltrate context data\n * - Consider this equivalent to `eval()` in terms of security implications\n *\n * @internal\n */\nexport const evaluate = <T = unknown>(expression: string, context: BindingContext): T => {\n try {\n // Create a proxy that lazily unwraps signals/computed on access\n const lazyContext = createLazyContext(context);\n\n // Use cached function or compile and cache a new one\n let fn = evaluateCache.get(expression);\n if (!fn) {\n // Use `with` to enable direct property access from proxy scope.\n // Note: `new Function()` runs in non-strict mode, so `with` is allowed.\n fn = new Function('$ctx', `with($ctx) { return (${expression}); }`) as (\n ctx: BindingContext\n ) => unknown;\n evaluateCache.set(expression, fn);\n }\n return fn(lazyContext) as T;\n } catch (error) {\n console.error(`bQuery view: Error evaluating \"${expression}\"`, error);\n return undefined as T;\n }\n};\n\n/**\n * Evaluates an expression and returns the raw value (for signal access).\n *\n * @security **WARNING:** Uses dynamic code execution. See {@link evaluate} for security notes.\n * @internal\n */\nexport const evaluateRaw = <T = unknown>(expression: string, context: BindingContext): T => {\n try {\n // Use cached function or compile and cache a new one\n let fn = evaluateRawCache.get(expression);\n if (!fn) {\n // Use `with` to enable direct property access from context scope.\n // Unlike `evaluate`, we don't use a lazy proxy - values are accessed directly.\n fn = new Function('$ctx', `with($ctx) { return (${expression}); }`) as (\n ctx: BindingContext\n ) => unknown;\n evaluateRawCache.set(expression, fn);\n }\n return fn(context) as T;\n } catch (error) {\n console.error(`bQuery view: Error evaluating \"${expression}\"`, error);\n return undefined as T;\n }\n};\n\n/**\n * Parses object expression like \"{ active: isActive, disabled: !enabled }\".\n * Handles nested structures like function calls, arrays, and template literals.\n * @internal\n */\nexport const parseObjectExpression = (expression: string): Record<string, string> => {\n const result: Record<string, string> = {};\n\n // Remove outer braces and trim\n const inner = expression\n .trim()\n .replace(/^\\{|\\}$/g, '')\n .trim();\n if (!inner) return result;\n\n // Split by comma at depth 0, respecting strings and nesting\n const parts: string[] = [];\n let current = '';\n let depth = 0;\n let inString: string | null = null;\n\n for (let i = 0; i < inner.length; i++) {\n const char = inner[i];\n\n // Handle string literals: count consecutive backslashes before a quote\n // to correctly distinguish escaped quotes from end-of-string\n if (char === '\"' || char === \"'\" || char === '`') {\n let backslashCount = 0;\n let j = i - 1;\n while (j >= 0 && inner[j] === '\\\\') {\n backslashCount++;\n j--;\n }\n // Quote is escaped only if preceded by an odd number of backslashes\n if (backslashCount % 2 === 0) {\n if (inString === null) {\n inString = char;\n } else if (inString === char) {\n inString = null;\n }\n }\n current += char;\n continue;\n }\n\n // Skip if inside string\n if (inString !== null) {\n current += char;\n continue;\n }\n\n // Track nesting depth for parentheses, brackets, and braces\n if (char === '(' || char === '[' || char === '{') {\n depth++;\n current += char;\n } else if (char === ')' || char === ']' || char === '}') {\n depth--;\n current += char;\n } else if (char === ',' && depth === 0) {\n // Top-level comma - split point\n parts.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n // Add the last part\n if (current.trim()) {\n parts.push(current.trim());\n }\n\n // Parse each part to extract key and value\n for (const part of parts) {\n // Find the first colon at depth 0 (to handle ternary operators in values)\n let colonIndex = -1;\n let partDepth = 0;\n let partInString: string | null = null;\n\n for (let i = 0; i < part.length; i++) {\n const char = part[i];\n\n if (char === '\"' || char === \"'\" || char === '`') {\n let backslashCount = 0;\n let j = i - 1;\n while (j >= 0 && part[j] === '\\\\') {\n backslashCount++;\n j--;\n }\n if (backslashCount % 2 === 0) {\n if (partInString === null) {\n partInString = char;\n } else if (partInString === char) {\n partInString = null;\n }\n }\n continue;\n }\n\n if (partInString !== null) continue;\n\n if (char === '(' || char === '[' || char === '{') {\n partDepth++;\n } else if (char === ')' || char === ']' || char === '}') {\n partDepth--;\n } else if (char === ':' && partDepth === 0) {\n colonIndex = i;\n break;\n }\n }\n\n if (colonIndex > -1) {\n const key = part\n .slice(0, colonIndex)\n .trim()\n .replace(/^['\"]|['\"]$/g, '');\n if (isPrototypePollutionKey(key)) continue;\n const value = part.slice(colonIndex + 1).trim();\n result[key] = value;\n }\n }\n\n return result;\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-bind:attr directive - attribute binding.\n * @internal\n */\nexport const handleBind = (attrName: string): DirectiveHandler => {\n return (el, expression, context, cleanups) => {\n const cleanup = effect(() => {\n const value = evaluate(expression, context);\n if (value == null || value === false) {\n el.removeAttribute(attrName);\n } else if (value === true) {\n el.setAttribute(attrName, '');\n } else {\n el.setAttribute(attrName, String(value));\n }\n });\n cleanups.push(cleanup);\n };\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate, parseObjectExpression } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-class directive - dynamic class binding.\n * Tracks previously added classes to ensure proper cleanup when expressions change.\n * @internal\n */\nexport const handleClass: DirectiveHandler = (el, expression, context, cleanups) => {\n // Track classes added by this directive to clean them up on re-evaluation\n let previousClasses: Set<string> = new Set();\n\n const cleanup = effect(() => {\n const newClasses: Set<string> = new Set();\n\n if (expression.trimStart().startsWith('{')) {\n // Object syntax: { active: isActive, disabled: !enabled }\n const classMap = parseObjectExpression(expression);\n for (const [className, conditionExpr] of Object.entries(classMap)) {\n const condition = evaluate<boolean>(conditionExpr, context);\n el.classList.toggle(className, Boolean(condition));\n // Track class regardless of condition - toggle handles add/remove\n newClasses.add(className);\n }\n } else if (/^\\s*\\[/.test(expression)) {\n // Array literal syntax: [class1, class2]\n const classes = evaluate<string[]>(expression, context);\n if (Array.isArray(classes)) {\n for (const cls of classes) {\n if (cls) {\n el.classList.add(cls);\n newClasses.add(cls);\n }\n }\n }\n } else {\n // Single expression returning string or array\n const result = evaluate<string | string[]>(expression, context);\n if (typeof result === 'string') {\n result.split(/\\s+/).forEach((cls) => {\n if (cls) {\n el.classList.add(cls);\n newClasses.add(cls);\n }\n });\n } else if (Array.isArray(result)) {\n result.forEach((cls) => {\n if (cls) {\n el.classList.add(cls);\n newClasses.add(cls);\n }\n });\n }\n }\n\n // Remove classes that were previously added but are no longer in the new set\n // This keeps directive-managed classes in sync across all syntax forms and provides\n // defensive cleanup behavior for edge cases (e.g. external classList changes)\n for (const cls of previousClasses) {\n if (!newClasses.has(cls)) {\n el.classList.remove(cls);\n }\n }\n\n previousClasses = newClasses;\n });\n\n cleanups.push(cleanup);\n};\n","import { effect, signal, type CleanupFn, type Signal } from '../../reactive/index';\nimport { evaluate } from '../evaluate';\nimport type { BindingContext, DirectiveHandler } from '../types';\n\ntype ProcessElementFn = (\n el: Element,\n context: BindingContext,\n prefix: string,\n cleanups: CleanupFn[]\n) => void;\n\ntype ProcessChildrenFn = (\n el: Element,\n context: BindingContext,\n prefix: string,\n cleanups: CleanupFn[]\n) => void;\n\n/**\n * Represents a rendered item in bq-for with its DOM element and associated cleanup functions.\n * @internal\n */\ntype RenderedItem = {\n key: unknown;\n element: Element;\n cleanups: CleanupFn[];\n item: unknown;\n index: number;\n itemSignal: Signal<unknown>; // Reactive item value for item-dependent bindings\n indexSignal: Signal<number> | null; // Reactive index for index-dependent bindings\n};\n\n/**\n * Extracts a key from an item using the key expression or falls back to index.\n * @internal\n */\nconst getItemKey = (\n item: unknown,\n index: number,\n keyExpression: string | null,\n itemName: string,\n indexName: string | undefined,\n context: BindingContext\n): unknown => {\n if (!keyExpression) {\n return index; // Fallback to index-based keying\n }\n\n const keyContext: BindingContext = {\n ...context,\n [itemName]: item,\n };\n if (indexName) {\n keyContext[indexName] = index;\n }\n\n return evaluate(keyExpression, keyContext);\n};\n\n/**\n * Handles bq-for directive - list rendering with keyed reconciliation.\n *\n * Supports optional `:key` attribute for efficient DOM reuse:\n * ```html\n * <li bq-for=\"item in items\" :key=\"item.id\">...</li>\n * ```\n *\n * Without a key, falls back to index-based tracking (less efficient for reordering).\n *\n * @internal\n */\nexport const createForHandler = (options: {\n prefix: string;\n processElement: ProcessElementFn;\n processChildren: ProcessChildrenFn;\n}): DirectiveHandler => {\n const { prefix, processElement, processChildren } = options;\n\n return (el, expression, context, cleanups) => {\n const parent = el.parentNode;\n if (!parent) return;\n\n // Parse expression: \"item in items\" or \"(item, index) in items\"\n // Use \\S.* instead of .+ to prevent ReDoS by requiring non-whitespace start\n const match = expression.match(/^\\(?(\\w+)(?:\\s*,\\s*(\\w+))?\\)?\\s+in\\s+(\\S.*)$/);\n if (!match) {\n console.error(`bQuery view: Invalid bq-for expression \"${expression}\"`);\n return;\n }\n\n const [, itemName, indexName, listExpression] = match;\n\n // Extract :key attribute if present\n const keyExpression = el.getAttribute(':key') || el.getAttribute(`${prefix}-key`);\n\n const template = el.cloneNode(true) as Element;\n template.removeAttribute(`${prefix}-for`);\n template.removeAttribute(':key');\n template.removeAttribute(`${prefix}-key`);\n\n // Create placeholder comment\n const placeholder = document.createComment(`bq-for: ${expression}`);\n parent.replaceChild(placeholder, el);\n\n // Track rendered items by key for reconciliation\n let renderedItemsMap = new Map<unknown, RenderedItem>();\n let renderedOrder: unknown[] = [];\n\n /**\n * Creates a new DOM element for an item.\n */\n const createItemElement = (item: unknown, index: number, key: unknown): RenderedItem => {\n const clone = template.cloneNode(true) as Element;\n const itemCleanups: CleanupFn[] = [];\n\n // Create reactive signals for item and index\n const itemSig = signal(item);\n const indexSig = indexName ? signal(index) : null;\n\n const childContext: BindingContext = {\n ...context,\n [itemName]: itemSig,\n };\n if (indexName && indexSig) {\n childContext[indexName] = indexSig;\n }\n\n // Process bindings on the clone\n processElement(clone, childContext, prefix, itemCleanups);\n processChildren(clone, childContext, prefix, itemCleanups);\n\n return {\n key,\n element: clone,\n cleanups: itemCleanups,\n item,\n index,\n itemSignal: itemSig,\n indexSignal: indexSig,\n };\n };\n\n /**\n * Removes a rendered item and cleans up its effects.\n */\n const removeItem = (rendered: RenderedItem): void => {\n for (const cleanup of rendered.cleanups) {\n cleanup();\n }\n rendered.element.remove();\n };\n\n /**\n * Updates an existing item's data and index when reused.\n * Updates the reactive signals so bindings re-render.\n */\n const updateItem = (rendered: RenderedItem, newItem: unknown, newIndex: number): void => {\n // Update item if it changed\n if (!Object.is(rendered.item, newItem)) {\n rendered.item = newItem;\n rendered.itemSignal.value = newItem;\n }\n\n // Update index if it changed\n if (rendered.index !== newIndex) {\n rendered.index = newIndex;\n if (rendered.indexSignal) {\n rendered.indexSignal.value = newIndex;\n }\n }\n };\n\n const cleanup = effect(() => {\n const list = evaluate<unknown[]>(listExpression, context);\n\n if (!Array.isArray(list)) {\n // Clear all if list is invalid\n for (const rendered of renderedItemsMap.values()) {\n removeItem(rendered);\n }\n renderedItemsMap.clear();\n renderedOrder = [];\n return;\n }\n\n // Build new key order and detect changes\n const newKeys: unknown[] = [];\n const newItemsByKey = new Map<unknown, { item: unknown; index: number }>();\n const seenKeys = new Set<unknown>();\n\n list.forEach((item, index) => {\n let key = getItemKey(item, index, keyExpression, itemName, indexName, context);\n\n // Detect duplicate keys - warn developer and fall back to unique composite key\n if (seenKeys.has(key)) {\n console.warn(\n `bq-for: Duplicate key \"${String(key)}\" detected at index ${index}. ` +\n `Falling back to index-based key for this item. ` +\n `Ensure :key expressions produce unique values for each item.`\n );\n // Create a unique composite key to avoid corrupting rendered output\n key = { __bqDuplicateKey: key, __bqIndex: index };\n }\n seenKeys.add(key);\n\n newKeys.push(key);\n newItemsByKey.set(key, { item, index });\n });\n\n // Identify items to remove (in old but not in new)\n const keysToRemove: unknown[] = [];\n for (const key of renderedOrder) {\n if (!newItemsByKey.has(key)) {\n keysToRemove.push(key);\n }\n }\n\n // Remove deleted items\n for (const key of keysToRemove) {\n const rendered = renderedItemsMap.get(key);\n if (rendered) {\n removeItem(rendered);\n renderedItemsMap.delete(key);\n }\n }\n\n // Process new list: create new items, update indices, reorder\n const newRenderedMap = new Map<unknown, RenderedItem>();\n let lastInsertedElement: Element | Comment = placeholder;\n\n for (let i = 0; i < newKeys.length; i++) {\n const key = newKeys[i];\n const { item, index } = newItemsByKey.get(key)!;\n let rendered = renderedItemsMap.get(key);\n\n if (rendered) {\n // Reuse existing element\n updateItem(rendered, item, index);\n newRenderedMap.set(key, rendered);\n\n // Check if element needs to be moved\n const currentNext: ChildNode | null = lastInsertedElement.nextSibling;\n if (currentNext !== rendered.element) {\n // Move element to correct position\n lastInsertedElement.after(rendered.element);\n }\n lastInsertedElement = rendered.element;\n } else {\n // Create new element\n rendered = createItemElement(item, index, key);\n newRenderedMap.set(key, rendered);\n\n // Insert at correct position\n lastInsertedElement.after(rendered.element);\n lastInsertedElement = rendered.element;\n }\n }\n\n // Update tracking state\n renderedItemsMap = newRenderedMap;\n renderedOrder = newKeys;\n });\n\n // When the bq-for itself is cleaned up, also cleanup all rendered items\n cleanups.push(() => {\n cleanup();\n for (const rendered of renderedItemsMap.values()) {\n for (const itemCleanup of rendered.cleanups) {\n itemCleanup();\n }\n }\n renderedItemsMap.clear();\n });\n };\n};\n","import { effect } from '../../reactive/index';\nimport { sanitizeHtml } from '../../security/index';\nimport { evaluate } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-html directive - sets innerHTML (sanitized by default).\n * @internal\n */\nexport const handleHtml = (sanitize: boolean): DirectiveHandler => {\n return (el, expression, context, cleanups) => {\n const cleanup = effect(() => {\n const value = evaluate<string>(expression, context);\n const html = String(value ?? '');\n el.innerHTML = sanitize ? sanitizeHtml(html) : html;\n });\n cleanups.push(cleanup);\n };\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-if directive - conditional rendering.\n * @internal\n */\nexport const handleIf: DirectiveHandler = (el, expression, context, cleanups) => {\n const placeholder = document.createComment(`bq-if: ${expression}`);\n\n // Store original element state\n let isInserted = true;\n\n const cleanup = effect(() => {\n const condition = evaluate<boolean>(expression, context);\n\n if (condition && !isInserted) {\n // Insert element using replaceWith to handle moved elements\n placeholder.replaceWith(el);\n isInserted = true;\n } else if (!condition && isInserted) {\n // Remove element using replaceWith to handle moved elements\n el.replaceWith(placeholder);\n isInserted = false;\n }\n });\n\n cleanups.push(cleanup);\n};\n","import { effect, isSignal, type Signal } from '../../reactive/index';\nimport { evaluateRaw } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-model directive - two-way binding.\n * @internal\n */\nexport const handleModel: DirectiveHandler = (el, expression, context, cleanups) => {\n const input = el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n const rawValue = evaluateRaw<Signal<unknown>>(expression, context);\n\n if (!isSignal(rawValue)) {\n console.warn(`bQuery view: bq-model requires a signal, got \"${expression}\"`);\n return;\n }\n\n const sig = rawValue as Signal<unknown>;\n\n // Initial value sync\n const isCheckbox = input.type === 'checkbox';\n const isRadio = input.type === 'radio';\n\n const updateInput = () => {\n if (isCheckbox) {\n (input as HTMLInputElement).checked = Boolean(sig.value);\n } else if (isRadio) {\n (input as HTMLInputElement).checked = sig.value === input.value;\n } else {\n input.value = String(sig.value ?? '');\n }\n };\n\n // Effect to sync signal -> input\n const cleanup = effect(() => {\n updateInput();\n });\n cleanups.push(cleanup);\n\n // Event listener to sync input -> signal\n const eventType = input.tagName === 'SELECT' ? 'change' : 'input';\n const handler = () => {\n if (isCheckbox) {\n sig.value = (input as HTMLInputElement).checked;\n } else if (isRadio) {\n if ((input as HTMLInputElement).checked) {\n sig.value = input.value;\n }\n } else {\n sig.value = input.value;\n }\n };\n\n input.addEventListener(eventType, handler);\n cleanups.push(() => input.removeEventListener(eventType, handler));\n};\n","import { evaluateRaw } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-on:event directive - event binding.\n * @internal\n */\nexport const handleOn = (eventName: string): DirectiveHandler => {\n return (el, expression, context, cleanups) => {\n const handler = (event: Event) => {\n // Add $event to context for expression evaluation\n const eventContext = { ...context, $event: event, $el: el };\n\n // Check if expression contains a function call (has parentheses)\n // If not, it might be a plain function reference like \"handleClick\"\n // Note: Method references like \"handlers.onClick\" will lose their receiver\n // when auto-invoked. For methods, use explicit calls: \"handlers.onClick($event)\"\n const containsCall = expression.includes('(');\n\n if (!containsCall) {\n // Evaluate the expression - if it returns a function, invoke it with $event\n const result = evaluateRaw<unknown>(expression, eventContext);\n if (typeof result === 'function') {\n // Auto-invoke with event. Note: `this` will be undefined for method references.\n // For proper method binding, use explicit syntax: \"obj.method($event)\"\n result(event);\n return;\n }\n // If not a function, the expression was already evaluated (e.g., \"count.value++\")\n return;\n }\n\n // Otherwise evaluate as expression using evaluateRaw to allow signal mutations\n // (e.g., \"count.value++\" or \"handleClick($event)\")\n evaluateRaw(expression, eventContext);\n };\n\n el.addEventListener(eventName, handler);\n cleanups.push(() => el.removeEventListener(eventName, handler));\n };\n};\n","import { isSignal, type Signal } from '../../reactive/index';\nimport { evaluateRaw } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Checks if an object has a writable `value` property.\n * Returns true if `value` is an own data property or an accessor with a setter.\n * @internal\n */\nfunction hasWritableValue(obj: object): obj is { value: Element | null } {\n const descriptor = Object.getOwnPropertyDescriptor(obj, 'value');\n if (!descriptor) return false;\n // Data property: check writable flag\n if ('value' in descriptor) return descriptor.writable === true;\n // Accessor property: check for setter\n return typeof descriptor.set === 'function';\n}\n\n/**\n * Handles bq-ref directive - element reference.\n * @internal\n */\nexport const handleRef: DirectiveHandler = (el, expression, context, cleanups) => {\n const rawValue = evaluateRaw<Signal<Element | null> | { value: Element | null }>(\n expression,\n context\n );\n\n if (isSignal(rawValue)) {\n rawValue.value = el;\n cleanups.push(() => {\n rawValue.value = null;\n });\n } else if (typeof rawValue === 'object' && rawValue !== null && hasWritableValue(rawValue)) {\n // Object with writable .value property (e.g., { value: null })\n rawValue.value = el;\n cleanups.push(() => {\n rawValue.value = null;\n });\n }\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-show directive - toggle visibility.\n * @internal\n */\nexport const handleShow: DirectiveHandler = (el, expression, context, cleanups) => {\n const htmlEl = el as HTMLElement;\n // Capture the computed display value to properly restore visibility.\n // If inline display is 'none' or empty, we need to use the computed value.\n // Use ownerDocument.defaultView for cross-document/iframe compatibility.\n let originalDisplay = htmlEl.style.display;\n if (!originalDisplay || originalDisplay === 'none') {\n const computed = htmlEl.ownerDocument.defaultView?.getComputedStyle(htmlEl).display ?? '';\n originalDisplay = computed !== 'none' ? computed : '';\n }\n\n const cleanup = effect(() => {\n const condition = evaluate<boolean>(expression, context);\n htmlEl.style.display = condition ? originalDisplay : 'none';\n });\n\n cleanups.push(cleanup);\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate, parseObjectExpression } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-style directive - dynamic style binding.\n * @internal\n */\nexport const handleStyle: DirectiveHandler = (el, expression, context, cleanups) => {\n const htmlEl = el as HTMLElement;\n let appliedStyles: Set<string> = new Set();\n\n const cleanup = effect(() => {\n const newStyles = new Set<string>();\n\n if (expression.trimStart().startsWith('{')) {\n const styleMap = parseObjectExpression(expression);\n for (const [prop, valueExpr] of Object.entries(styleMap)) {\n const value = evaluate<string>(valueExpr, context);\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n htmlEl.style.setProperty(cssProp, String(value ?? ''));\n newStyles.add(cssProp);\n }\n } else {\n const result = evaluate<Record<string, string>>(expression, context);\n if (result && typeof result === 'object') {\n for (const [prop, value] of Object.entries(result)) {\n const cssProp = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n htmlEl.style.setProperty(cssProp, String(value ?? ''));\n newStyles.add(cssProp);\n }\n }\n }\n\n // Remove styles that were previously applied but are no longer present\n for (const cssProp of appliedStyles) {\n if (!newStyles.has(cssProp)) {\n htmlEl.style.removeProperty(cssProp);\n }\n }\n\n // Update the set of applied styles\n appliedStyles = newStyles;\n });\n\n cleanups.push(cleanup);\n};\n","import { effect } from '../../reactive/index';\nimport { evaluate } from '../evaluate';\nimport type { DirectiveHandler } from '../types';\n\n/**\n * Handles bq-text directive - sets text content.\n * @internal\n */\nexport const handleText: DirectiveHandler = (el, expression, context, cleanups) => {\n const cleanup = effect(() => {\n const value = evaluate(expression, context);\n el.textContent = String(value ?? '');\n });\n cleanups.push(cleanup);\n};\n","import type { CleanupFn } from '../reactive/index';\nimport { detectDevEnvironment } from '../core/env';\nimport { getCustomDirective } from './custom-directives';\nimport type { BindingContext, DirectiveHandler } from './types';\n\nexport type DirectiveHandlers = {\n text: DirectiveHandler;\n html: DirectiveHandler;\n if: DirectiveHandler;\n show: DirectiveHandler;\n class: DirectiveHandler;\n style: DirectiveHandler;\n model: DirectiveHandler;\n ref: DirectiveHandler;\n for: DirectiveHandler;\n bind: (attrName: string) => DirectiveHandler;\n on: (eventName: string) => DirectiveHandler;\n};\n\n/**\n * Processes a single element for directives.\n * @internal\n */\nexport const processElement = (\n el: Element,\n context: BindingContext,\n prefix: string,\n cleanups: CleanupFn[],\n handlers: DirectiveHandlers\n): void => {\n const attributes = Array.from(el.attributes);\n\n for (const attr of attributes) {\n const { name: attributeName, value } = attr;\n\n if (!attributeName.startsWith(`${prefix}-`)) continue;\n\n const directive = attributeName.slice(prefix.length + 1); // Remove prefix and dash\n\n // Handle bq-for specially (creates new scope)\n if (directive === 'for') {\n handlers.for(el, value, context, cleanups);\n return; // Don't process children, bq-for handles it\n }\n\n // Handle other directives\n if (directive === 'text') {\n handlers.text(el, value, context, cleanups);\n } else if (directive === 'html') {\n handlers.html(el, value, context, cleanups);\n } else if (directive === 'if') {\n handlers.if(el, value, context, cleanups);\n } else if (directive === 'show') {\n handlers.show(el, value, context, cleanups);\n } else if (directive === 'class') {\n handlers.class(el, value, context, cleanups);\n } else if (directive === 'style') {\n handlers.style(el, value, context, cleanups);\n } else if (directive === 'model') {\n handlers.model(el, value, context, cleanups);\n } else if (directive === 'ref') {\n handlers.ref(el, value, context, cleanups);\n } else if (directive.startsWith('bind:')) {\n const attrName = directive.slice(5);\n handlers.bind(attrName)(el, value, context, cleanups);\n } else if (directive.startsWith('on:')) {\n const eventName = directive.slice(3);\n handlers.on(eventName)(el, value, context, cleanups);\n } else {\n // Check for custom directives registered via plugins\n const customHandler = getCustomDirective(directive);\n if (customHandler) {\n customHandler(el, value, context, cleanups);\n } else if (\n detectDevEnvironment() &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n console.warn(\n `[bQuery][view] Unknown directive \"${attributeName}\" (parsed as \"${directive}\") on <${el.tagName.toLowerCase()}>. This may be a typo or a missing custom directive registration.`\n );\n }\n }\n }\n};\n\n/**\n * Recursively processes children of an element.\n * @internal\n */\nexport const processChildren = (\n el: Element,\n context: BindingContext,\n prefix: string,\n cleanups: CleanupFn[],\n handlers: DirectiveHandlers\n): void => {\n const children = Array.from(el.children);\n for (const child of children) {\n // Skip if element has bq-for (handled separately)\n if (!child.hasAttribute(`${prefix}-for`)) {\n processElement(child, context, prefix, cleanups, handlers);\n processChildren(child, context, prefix, cleanups, handlers);\n } else {\n processElement(child, context, prefix, cleanups, handlers);\n }\n }\n};\n","import type { CleanupFn } from '../reactive/index';\nimport {\n createForHandler,\n handleBind,\n handleClass,\n handleHtml,\n handleIf,\n handleModel,\n handleOn,\n handleRef,\n handleShow,\n handleStyle,\n handleText,\n} from './directives/index';\nimport { processChildren, processElement, type DirectiveHandlers } from './process';\nimport type { BindingContext, MountOptions, View } from './types';\n\n/**\n * Mounts a reactive view to an element.\n *\n * @param selector - CSS selector or Element\n * @param context - Binding context with signals, computed, and functions\n * @param options - Mount options\n * @returns The mounted View instance\n *\n * @security **WARNING:** Directive expressions (bq-text, bq-if, bq-on, etc.) are evaluated\n * using `new Function()` at runtime. This means:\n * - Template attributes must come from trusted sources only\n * - NEVER load templates containing bq-* attributes from user input or untrusted APIs\n * - If you must use external templates, validate/sanitize attribute values first\n *\n * @example\n * ```ts\n * import { mount } from 'bquery/view';\n * import { signal, computed } from 'bquery/reactive';\n *\n * const name = signal('World');\n * const greeting = computed(() => `Hello, ${name.value}!`);\n * const items = signal([\n * { id: 1, text: 'Item 1' },\n * { id: 2, text: 'Item 2' },\n * ]);\n *\n * const view = mount('#app', {\n * name,\n * greeting,\n * items,\n * addItem: () => {\n * items.value = [...items.value, { id: Date.now(), text: 'New Item' }];\n * },\n * });\n *\n * // Later, cleanup\n * view.destroy();\n * ```\n */\nexport const mount = (\n selector: string | Element,\n context: BindingContext,\n options: MountOptions = {}\n): View => {\n const { prefix = 'bq', sanitize = true } = options;\n\n const el = typeof selector === 'string' ? document.querySelector(selector) : selector;\n\n if (!el) {\n throw new Error(`bQuery view: Element \"${selector}\" not found.`);\n }\n\n // Reject if root element has bq-for directive\n // bq-for replaces the element with a placeholder comment, which would leave View.el detached\n if (el.hasAttribute(`${prefix}-for`)) {\n throw new Error(\n `bQuery view: Cannot mount on element with ${prefix}-for directive. ` +\n `Wrap the ${prefix}-for element in a container instead.`\n );\n }\n\n const cleanups: CleanupFn[] = [];\n\n const handlers: DirectiveHandlers = {\n text: handleText,\n html: handleHtml(sanitize),\n if: handleIf,\n show: handleShow,\n class: handleClass,\n style: handleStyle,\n model: handleModel,\n ref: handleRef,\n for: createForHandler({\n prefix,\n processElement: (node, nodeContext, nodePrefix, nodeCleanups) =>\n processElement(node, nodeContext, nodePrefix, nodeCleanups, handlers),\n processChildren: (node, nodeContext, nodePrefix, nodeCleanups) =>\n processChildren(node, nodeContext, nodePrefix, nodeCleanups, handlers),\n }),\n bind: handleBind,\n on: handleOn,\n };\n\n const processWithHandlers = (\n node: Element,\n nodeContext: BindingContext,\n nodeCleanups: CleanupFn[]\n ) => {\n // Check if element has bq-for before processing\n // bq-for replaces the element and handles its children internally\n const hasFor = node.hasAttribute(`${prefix}-for`);\n\n processElement(node, nodeContext, prefix, nodeCleanups, handlers);\n\n // Skip processChildren if bq-for was on this element - it handles children itself\n if (!hasFor) {\n processChildren(node, nodeContext, prefix, nodeCleanups, handlers);\n }\n };\n\n // Process the root element and its children\n processWithHandlers(el, context, cleanups);\n\n return {\n el,\n context,\n\n update: (newContext: Partial<BindingContext>) => {\n Object.assign(context, newContext);\n },\n\n destroy: () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n cleanups.length = 0;\n },\n };\n};\n\n/**\n * Creates a reactive template function.\n *\n * @param template - HTML template string\n * @returns A function that creates a mounted element with the given context\n *\n * @example\n * ```ts\n * import { createTemplate } from 'bquery/view';\n * import { signal } from 'bquery/reactive';\n *\n * const TodoItem = createTemplate(`\n * <li bq-class=\"{ completed: done }\">\n * <input type=\"checkbox\" bq-model=\"done\" />\n * <span bq-text=\"text\"></span>\n * </li>\n * `);\n *\n * const item = TodoItem({\n * done: signal(false),\n * text: 'Buy groceries',\n * });\n *\n * document.querySelector('#list').append(item.el);\n * ```\n */\nexport const createTemplate = (\n template: string,\n options: MountOptions = {}\n): ((context: BindingContext) => View) => {\n return (context: BindingContext) => {\n const container = document.createElement('div');\n container.innerHTML = template.trim();\n\n const el = container.firstElementChild;\n if (!el) {\n throw new Error('bQuery view: Template must contain a single root element.');\n }\n\n // We know at least one element exists (firstElementChild is not null above)\n // Reject if there are multiple root elements\n if (container.childElementCount > 1) {\n throw new Error(\n `bQuery view: Template must contain exactly one root element, found ${container.childElementCount}.`\n );\n }\n\n const { prefix = 'bq' } = options;\n // Reject templates with bq-for or bq-if on the root element\n // These directives replace the element with a placeholder comment, which would leave View.el detached\n // Since processing happens while el is still in the temporary container, the placeholder\n // would remain there while view.el is inserted elsewhere, causing desync on future toggles\n if (el.hasAttribute(`${prefix}-for`) || el.hasAttribute(`${prefix}-if`)) {\n const directive = el.hasAttribute(`${prefix}-for`) ? 'for' : 'if';\n throw new Error(\n `bQuery view: Template root element cannot have ${prefix}-${directive} directive. ` +\n `Wrap the ${prefix}-${directive} element in a container instead.`\n );\n }\n\n return mount(el, context, options);\n };\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { n as w, r as v } from "./core-DnlyjbF2.js";
2
- import { n as p } from "./config-BW35FKuA.js";
1
+ import { n as w, r as v } from "./core-DdtZHzsS.js";
2
+ import { n as p } from "./config-DhT9auRm.js";
3
3
  var k = class {
4
4
  constructor(e) {
5
5
  this.bucketName = e, this.dbPromise = null, this.storeName = "blobs";
@@ -358,4 +358,4 @@ export {
358
358
  Q as t
359
359
  };
360
360
 
361
- //# sourceMappingURL=platform-CPbCprb6.js.map
361
+ //# sourceMappingURL=platform-Dw2gE3zI.js.map