@bquery/bquery 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/README.md +716 -586
  2. package/dist/a11y/announce.d.ts +43 -0
  3. package/dist/a11y/announce.d.ts.map +1 -0
  4. package/dist/a11y/audit.d.ts +42 -0
  5. package/dist/a11y/audit.d.ts.map +1 -0
  6. package/dist/a11y/index.d.ts +53 -0
  7. package/dist/a11y/index.d.ts.map +1 -0
  8. package/dist/a11y/media-preferences.d.ts +77 -0
  9. package/dist/a11y/media-preferences.d.ts.map +1 -0
  10. package/dist/a11y/roving-tab-index.d.ts +38 -0
  11. package/dist/a11y/roving-tab-index.d.ts.map +1 -0
  12. package/dist/a11y/skip-link.d.ts +37 -0
  13. package/dist/a11y/skip-link.d.ts.map +1 -0
  14. package/dist/a11y/trap-focus.d.ts +49 -0
  15. package/dist/a11y/trap-focus.d.ts.map +1 -0
  16. package/dist/a11y/types.d.ts +152 -0
  17. package/dist/a11y/types.d.ts.map +1 -0
  18. package/dist/a11y-C5QOVvRn.js +421 -0
  19. package/dist/a11y-C5QOVvRn.js.map +1 -0
  20. package/dist/a11y.es.mjs +14 -0
  21. package/dist/component/component.d.ts.map +1 -1
  22. package/dist/component/html.d.ts.map +1 -1
  23. package/dist/component/index.d.ts +2 -1
  24. package/dist/component/index.d.ts.map +1 -1
  25. package/dist/component/library.d.ts.map +1 -1
  26. package/dist/component/scope.d.ts +138 -0
  27. package/dist/component/scope.d.ts.map +1 -0
  28. package/dist/component/types.d.ts +53 -1
  29. package/dist/component/types.d.ts.map +1 -1
  30. package/dist/component-CuuTijA6.js +684 -0
  31. package/dist/component-CuuTijA6.js.map +1 -0
  32. package/dist/component.es.mjs +9 -6
  33. package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
  34. package/dist/{config-DRmZZno3.js.map → config-BW35FKuA.js.map} +1 -1
  35. package/dist/constraints-3lV9yyBw.js +100 -0
  36. package/dist/constraints-3lV9yyBw.js.map +1 -0
  37. package/dist/core/collection.d.ts +48 -0
  38. package/dist/core/collection.d.ts.map +1 -1
  39. package/dist/core/element.d.ts +92 -0
  40. package/dist/core/element.d.ts.map +1 -1
  41. package/dist/core/env.d.ts +18 -0
  42. package/dist/core/env.d.ts.map +1 -0
  43. package/dist/core/index.d.ts +1 -0
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/shared.d.ts +8 -0
  46. package/dist/core/shared.d.ts.map +1 -1
  47. package/dist/core/utils/index.d.ts +52 -41
  48. package/dist/core/utils/index.d.ts.map +1 -1
  49. package/dist/core-Cjl7GUu8.js +717 -0
  50. package/dist/core-Cjl7GUu8.js.map +1 -0
  51. package/dist/core-DnlyjbF2.js +112 -0
  52. package/dist/core-DnlyjbF2.js.map +1 -0
  53. package/dist/core.es.mjs +45 -44
  54. package/dist/custom-directives-7wAShnnd.js +9 -0
  55. package/dist/custom-directives-7wAShnnd.js.map +1 -0
  56. package/dist/devtools/devtools.d.ts +212 -0
  57. package/dist/devtools/devtools.d.ts.map +1 -0
  58. package/dist/devtools/index.d.ts +20 -0
  59. package/dist/devtools/index.d.ts.map +1 -0
  60. package/dist/devtools/types.d.ts +69 -0
  61. package/dist/devtools/types.d.ts.map +1 -0
  62. package/dist/devtools-D2fQLhDN.js +122 -0
  63. package/dist/devtools-D2fQLhDN.js.map +1 -0
  64. package/dist/devtools.es.mjs +19 -0
  65. package/dist/dnd/draggable.d.ts +51 -0
  66. package/dist/dnd/draggable.d.ts.map +1 -0
  67. package/dist/dnd/droppable.d.ts +38 -0
  68. package/dist/dnd/droppable.d.ts.map +1 -0
  69. package/dist/dnd/index.d.ts +47 -0
  70. package/dist/dnd/index.d.ts.map +1 -0
  71. package/dist/dnd/sortable.d.ts +43 -0
  72. package/dist/dnd/sortable.d.ts.map +1 -0
  73. package/dist/dnd/types.d.ts +250 -0
  74. package/dist/dnd/types.d.ts.map +1 -0
  75. package/dist/dnd-B8EgyzaI.js +244 -0
  76. package/dist/dnd-B8EgyzaI.js.map +1 -0
  77. package/dist/dnd.es.mjs +6 -0
  78. package/dist/env-NeVmr4Gf.js +19 -0
  79. package/dist/env-NeVmr4Gf.js.map +1 -0
  80. package/dist/forms/create-form.d.ts +49 -0
  81. package/dist/forms/create-form.d.ts.map +1 -0
  82. package/dist/forms/index.d.ts +39 -0
  83. package/dist/forms/index.d.ts.map +1 -0
  84. package/dist/forms/types.d.ts +139 -0
  85. package/dist/forms/types.d.ts.map +1 -0
  86. package/dist/forms/validators.d.ts +179 -0
  87. package/dist/forms/validators.d.ts.map +1 -0
  88. package/dist/forms-C3yovgH9.js +141 -0
  89. package/dist/forms-C3yovgH9.js.map +1 -0
  90. package/dist/forms.es.mjs +14 -0
  91. package/dist/full.d.ts +35 -7
  92. package/dist/full.d.ts.map +1 -1
  93. package/dist/full.es.mjs +182 -91
  94. package/dist/full.iife.js +47 -31
  95. package/dist/full.iife.js.map +1 -1
  96. package/dist/full.umd.js +47 -31
  97. package/dist/full.umd.js.map +1 -1
  98. package/dist/i18n/formatting.d.ts +40 -0
  99. package/dist/i18n/formatting.d.ts.map +1 -0
  100. package/dist/i18n/i18n.d.ts +48 -0
  101. package/dist/i18n/i18n.d.ts.map +1 -0
  102. package/dist/i18n/index.d.ts +57 -0
  103. package/dist/i18n/index.d.ts.map +1 -0
  104. package/dist/i18n/translate.d.ts +83 -0
  105. package/dist/i18n/translate.d.ts.map +1 -0
  106. package/dist/i18n/types.d.ts +156 -0
  107. package/dist/i18n/types.d.ts.map +1 -0
  108. package/dist/i18n-BnnhTFOS.js +89 -0
  109. package/dist/i18n-BnnhTFOS.js.map +1 -0
  110. package/dist/i18n.es.mjs +6 -0
  111. package/dist/index.d.ts +11 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.es.mjs +227 -136
  114. package/dist/media/battery.d.ts +35 -0
  115. package/dist/media/battery.d.ts.map +1 -0
  116. package/dist/media/breakpoints.d.ts +51 -0
  117. package/dist/media/breakpoints.d.ts.map +1 -0
  118. package/dist/media/clipboard.d.ts +30 -0
  119. package/dist/media/clipboard.d.ts.map +1 -0
  120. package/dist/media/device-sensors.d.ts +54 -0
  121. package/dist/media/device-sensors.d.ts.map +1 -0
  122. package/dist/media/geolocation.d.ts +38 -0
  123. package/dist/media/geolocation.d.ts.map +1 -0
  124. package/dist/media/index.d.ts +42 -0
  125. package/dist/media/index.d.ts.map +1 -0
  126. package/dist/media/media-query.d.ts +36 -0
  127. package/dist/media/media-query.d.ts.map +1 -0
  128. package/dist/media/network.d.ts +35 -0
  129. package/dist/media/network.d.ts.map +1 -0
  130. package/dist/media/types.d.ts +173 -0
  131. package/dist/media/types.d.ts.map +1 -0
  132. package/dist/media/viewport.d.ts +32 -0
  133. package/dist/media/viewport.d.ts.map +1 -0
  134. package/dist/media-Di2Ta22s.js +340 -0
  135. package/dist/media-Di2Ta22s.js.map +1 -0
  136. package/dist/media.es.mjs +12 -0
  137. package/dist/motion/index.d.ts +7 -3
  138. package/dist/motion/index.d.ts.map +1 -1
  139. package/dist/motion/morph.d.ts +27 -0
  140. package/dist/motion/morph.d.ts.map +1 -0
  141. package/dist/motion/parallax.d.ts +30 -0
  142. package/dist/motion/parallax.d.ts.map +1 -0
  143. package/dist/motion/reduced-motion.d.ts +36 -3
  144. package/dist/motion/reduced-motion.d.ts.map +1 -1
  145. package/dist/motion/types.d.ts +58 -0
  146. package/dist/motion/types.d.ts.map +1 -1
  147. package/dist/motion/typewriter.d.ts +31 -0
  148. package/dist/motion/typewriter.d.ts.map +1 -0
  149. package/dist/motion-qPj_TYGv.js +530 -0
  150. package/dist/motion-qPj_TYGv.js.map +1 -0
  151. package/dist/motion.es.mjs +27 -23
  152. package/dist/{view-C70lA3vf.js → mount-SM07RUa6.js} +166 -160
  153. package/dist/mount-SM07RUa6.js.map +1 -0
  154. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  155. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  156. package/dist/{platform-Dr9b6fsq.js → platform-CPbCprb6.js} +21 -22
  157. package/dist/{platform-Dr9b6fsq.js.map → platform-CPbCprb6.js.map} +1 -1
  158. package/dist/platform.es.mjs +2 -2
  159. package/dist/plugin/index.d.ts +22 -0
  160. package/dist/plugin/index.d.ts.map +1 -0
  161. package/dist/plugin/registry.d.ts +108 -0
  162. package/dist/plugin/registry.d.ts.map +1 -0
  163. package/dist/plugin/types.d.ts +110 -0
  164. package/dist/plugin/types.d.ts.map +1 -0
  165. package/dist/plugin-cPoOHFLY.js +64 -0
  166. package/dist/plugin-cPoOHFLY.js.map +1 -0
  167. package/dist/plugin.es.mjs +9 -0
  168. package/dist/reactive/computed.d.ts +7 -0
  169. package/dist/reactive/computed.d.ts.map +1 -1
  170. package/dist/reactive-Cfv0RK6x.js +233 -0
  171. package/dist/reactive-Cfv0RK6x.js.map +1 -0
  172. package/dist/reactive.es.mjs +19 -20
  173. package/dist/registry-CWf368tT.js +26 -0
  174. package/dist/registry-CWf368tT.js.map +1 -0
  175. package/dist/router/bq-link.d.ts +112 -0
  176. package/dist/router/bq-link.d.ts.map +1 -0
  177. package/dist/router/constraints.d.ts +9 -0
  178. package/dist/router/constraints.d.ts.map +1 -0
  179. package/dist/router/index.d.ts +14 -6
  180. package/dist/router/index.d.ts.map +1 -1
  181. package/dist/router/match.d.ts +0 -1
  182. package/dist/router/match.d.ts.map +1 -1
  183. package/dist/router/path-pattern.d.ts +14 -0
  184. package/dist/router/path-pattern.d.ts.map +1 -0
  185. package/dist/router/query.d.ts.map +1 -1
  186. package/dist/router/router.d.ts +3 -1
  187. package/dist/router/router.d.ts.map +1 -1
  188. package/dist/router/types.d.ts +48 -4
  189. package/dist/router/types.d.ts.map +1 -1
  190. package/dist/router/use-route.d.ts +50 -0
  191. package/dist/router/use-route.d.ts.map +1 -0
  192. package/dist/router/utils.d.ts +3 -0
  193. package/dist/router/utils.d.ts.map +1 -1
  194. package/dist/router-BrthaP_z.js +473 -0
  195. package/dist/router-BrthaP_z.js.map +1 -0
  196. package/dist/router.es.mjs +13 -10
  197. package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
  198. package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
  199. package/dist/security/index.d.ts +2 -2
  200. package/dist/security/index.d.ts.map +1 -1
  201. package/dist/security.es.mjs +1 -1
  202. package/dist/ssr/hydrate.d.ts +65 -0
  203. package/dist/ssr/hydrate.d.ts.map +1 -0
  204. package/dist/ssr/index.d.ts +59 -0
  205. package/dist/ssr/index.d.ts.map +1 -0
  206. package/dist/ssr/render.d.ts +62 -0
  207. package/dist/ssr/render.d.ts.map +1 -0
  208. package/dist/ssr/serialize.d.ts +118 -0
  209. package/dist/ssr/serialize.d.ts.map +1 -0
  210. package/dist/ssr/types.d.ts +70 -0
  211. package/dist/ssr/types.d.ts.map +1 -0
  212. package/dist/ssr-B2qd_WBB.js +248 -0
  213. package/dist/ssr-B2qd_WBB.js.map +1 -0
  214. package/dist/ssr.es.mjs +9 -0
  215. package/dist/store/create-store.d.ts.map +1 -1
  216. package/dist/store/index.d.ts +1 -1
  217. package/dist/store/index.d.ts.map +1 -1
  218. package/dist/store/persisted.d.ts +38 -4
  219. package/dist/store/persisted.d.ts.map +1 -1
  220. package/dist/store/types.d.ts +138 -1
  221. package/dist/store/types.d.ts.map +1 -1
  222. package/dist/store/utils.d.ts +2 -2
  223. package/dist/store/utils.d.ts.map +1 -1
  224. package/dist/store-DWpyH6p5.js +338 -0
  225. package/dist/store-DWpyH6p5.js.map +1 -0
  226. package/dist/store.es.mjs +11 -10
  227. package/dist/storybook/index.d.ts.map +1 -1
  228. package/dist/storybook.es.mjs +1 -1
  229. package/dist/storybook.es.mjs.map +1 -1
  230. package/dist/testing/index.d.ts +23 -0
  231. package/dist/testing/index.d.ts.map +1 -0
  232. package/dist/testing/testing.d.ts +156 -0
  233. package/dist/testing/testing.d.ts.map +1 -0
  234. package/dist/testing/types.d.ts +134 -0
  235. package/dist/testing/types.d.ts.map +1 -0
  236. package/dist/testing-CsqjNUyy.js +224 -0
  237. package/dist/testing-CsqjNUyy.js.map +1 -0
  238. package/dist/testing.es.mjs +9 -0
  239. package/dist/type-guards-Do9DWgNp.js +44 -0
  240. package/dist/type-guards-Do9DWgNp.js.map +1 -0
  241. package/dist/untrack-DJVQQ2WM.js +33 -0
  242. package/dist/untrack-DJVQQ2WM.js.map +1 -0
  243. package/dist/view/custom-directives.d.ts +20 -0
  244. package/dist/view/custom-directives.d.ts.map +1 -0
  245. package/dist/view/evaluate.d.ts.map +1 -1
  246. package/dist/view/process.d.ts.map +1 -1
  247. package/dist/view.es.mjs +9 -9
  248. package/package.json +177 -141
  249. package/src/a11y/announce.ts +131 -0
  250. package/src/a11y/audit.ts +314 -0
  251. package/src/a11y/index.ts +68 -0
  252. package/src/a11y/media-preferences.ts +255 -0
  253. package/src/a11y/roving-tab-index.ts +164 -0
  254. package/src/a11y/skip-link.ts +255 -0
  255. package/src/a11y/trap-focus.ts +184 -0
  256. package/src/a11y/types.ts +183 -0
  257. package/src/component/component.ts +104 -29
  258. package/src/component/html.ts +5 -5
  259. package/src/component/index.ts +2 -0
  260. package/src/component/library.ts +26 -2
  261. package/src/component/scope.ts +212 -0
  262. package/src/component/types.ts +94 -40
  263. package/src/core/collection.ts +707 -628
  264. package/src/core/element.ts +981 -774
  265. package/src/core/env.ts +60 -0
  266. package/src/core/index.ts +49 -48
  267. package/src/core/shared.ts +62 -13
  268. package/src/core/utils/index.ts +148 -83
  269. package/src/devtools/devtools.ts +410 -0
  270. package/src/devtools/index.ts +48 -0
  271. package/src/devtools/types.ts +104 -0
  272. package/src/dnd/draggable.ts +296 -0
  273. package/src/dnd/droppable.ts +228 -0
  274. package/src/dnd/index.ts +62 -0
  275. package/src/dnd/sortable.ts +307 -0
  276. package/src/dnd/types.ts +293 -0
  277. package/src/forms/create-form.ts +278 -0
  278. package/src/forms/index.ts +65 -0
  279. package/src/forms/types.ts +154 -0
  280. package/src/forms/validators.ts +265 -0
  281. package/src/full.ts +253 -2
  282. package/src/i18n/formatting.ts +67 -0
  283. package/src/i18n/i18n.ts +200 -0
  284. package/src/i18n/index.ts +67 -0
  285. package/src/i18n/translate.ts +182 -0
  286. package/src/i18n/types.ts +171 -0
  287. package/src/index.ts +108 -36
  288. package/src/media/battery.ts +116 -0
  289. package/src/media/breakpoints.ts +131 -0
  290. package/src/media/clipboard.ts +80 -0
  291. package/src/media/device-sensors.ts +158 -0
  292. package/src/media/geolocation.ts +119 -0
  293. package/src/media/index.ts +76 -0
  294. package/src/media/media-query.ts +92 -0
  295. package/src/media/network.ts +115 -0
  296. package/src/media/types.ts +177 -0
  297. package/src/media/viewport.ts +84 -0
  298. package/src/motion/index.ts +57 -48
  299. package/src/motion/morph.ts +151 -0
  300. package/src/motion/parallax.ts +120 -0
  301. package/src/motion/reduced-motion.ts +66 -17
  302. package/src/motion/types.ts +271 -208
  303. package/src/motion/typewriter.ts +164 -0
  304. package/src/plugin/index.ts +37 -0
  305. package/src/plugin/registry.ts +269 -0
  306. package/src/plugin/types.ts +137 -0
  307. package/src/reactive/computed.ts +130 -92
  308. package/src/router/bq-link.ts +279 -0
  309. package/src/router/constraints.ts +201 -0
  310. package/src/router/index.ts +49 -41
  311. package/src/router/match.ts +312 -106
  312. package/src/router/path-pattern.ts +52 -0
  313. package/src/router/query.ts +38 -35
  314. package/src/router/router.ts +402 -211
  315. package/src/router/types.ts +139 -93
  316. package/src/router/use-route.ts +68 -0
  317. package/src/router/utils.ts +157 -116
  318. package/src/security/index.ts +2 -7
  319. package/src/security/sanitize.ts +70 -70
  320. package/src/security/trusted-html.ts +71 -71
  321. package/src/ssr/hydrate.ts +82 -0
  322. package/src/ssr/index.ts +70 -0
  323. package/src/ssr/render.ts +508 -0
  324. package/src/ssr/serialize.ts +296 -0
  325. package/src/ssr/types.ts +81 -0
  326. package/src/store/create-store.ts +467 -329
  327. package/src/store/define-store.ts +49 -49
  328. package/src/store/index.ts +27 -22
  329. package/src/store/mapping.ts +74 -74
  330. package/src/store/persisted.ts +206 -19
  331. package/src/store/types.ts +157 -2
  332. package/src/store/utils.ts +135 -141
  333. package/src/store/watch.ts +53 -53
  334. package/src/storybook/index.ts +2 -1
  335. package/src/testing/index.ts +42 -0
  336. package/src/testing/testing.ts +593 -0
  337. package/src/testing/types.ts +170 -0
  338. package/src/view/custom-directives.ts +30 -0
  339. package/src/view/evaluate.ts +292 -290
  340. package/src/view/process.ts +108 -92
  341. package/dist/component-BEQgt5hl.js +0 -600
  342. package/dist/component-BEQgt5hl.js.map +0 -1
  343. package/dist/core-BGQJVw0-.js +0 -35
  344. package/dist/core-BGQJVw0-.js.map +0 -1
  345. package/dist/core-CCEabVHl.js +0 -648
  346. package/dist/core-CCEabVHl.js.map +0 -1
  347. package/dist/effect-AFRW_Plg.js +0 -84
  348. package/dist/effect-AFRW_Plg.js.map +0 -1
  349. package/dist/motion-D9TcHxOF.js +0 -415
  350. package/dist/motion-D9TcHxOF.js.map +0 -1
  351. package/dist/reactive-DSkct0dO.js +0 -254
  352. package/dist/reactive-DSkct0dO.js.map +0 -1
  353. package/dist/router-CbDhl8rS.js +0 -188
  354. package/dist/router-CbDhl8rS.js.map +0 -1
  355. package/dist/store-BwDvI45q.js +0 -263
  356. package/dist/store-BwDvI45q.js.map +0 -1
  357. package/dist/untrack-B0rVscTc.js +0 -7
  358. package/dist/untrack-B0rVscTc.js.map +0 -1
  359. package/dist/view-C70lA3vf.js.map +0 -1
@@ -1,208 +1,271 @@
1
- /**
2
- * Shared Motion module types.
3
- *
4
- * @module bquery/motion
5
- */
6
-
7
- /**
8
- * Options for view transitions.
9
- */
10
- export interface TransitionOptions {
11
- /** The DOM update function to execute during transition */
12
- update: () => void | Promise<void>;
13
- /** Skip the transition when reduced motion is preferred. */
14
- skipOnReducedMotion?: boolean;
15
- /** Classes applied to the root element while the transition is active. */
16
- classes?: string[];
17
- /** Transition types added when supported by the browser. */
18
- types?: string[];
19
- /** Called after the transition becomes ready. */
20
- onReady?: () => void;
21
- /** Called after the transition finishes. */
22
- onFinish?: () => void;
23
- }
24
-
25
- /**
26
- * Captured element bounds for FLIP animations.
27
- */
28
- export interface ElementBounds {
29
- top: number;
30
- left: number;
31
- width: number;
32
- height: number;
33
- }
34
-
35
- /**
36
- * FLIP animation configuration options.
37
- */
38
- export interface FlipOptions {
39
- /** Animation duration in milliseconds */
40
- duration?: number;
41
- /** CSS easing function */
42
- easing?: string;
43
- /** Callback when animation completes */
44
- onComplete?: () => void;
45
- }
46
-
47
- /**
48
- * Stagger delay function signature.
49
- */
50
- export type StaggerFunction = (index: number, total: number) => number;
51
-
52
- /**
53
- * Extended options for group FLIP animations.
54
- */
55
- export interface FlipGroupOptions extends FlipOptions {
56
- /** Optional stagger delay function */
57
- stagger?: StaggerFunction;
58
- }
59
-
60
- /**
61
- * Spring physics configuration.
62
- */
63
- export interface SpringConfig {
64
- /** Spring stiffness (default: 100) */
65
- stiffness?: number;
66
- /** Damping coefficient (default: 10) */
67
- damping?: number;
68
- /** Mass of the object (default: 1) */
69
- mass?: number;
70
- /** Velocity threshold for completion (default: 0.01) */
71
- precision?: number;
72
- }
73
-
74
- /**
75
- * Spring instance for animating values.
76
- */
77
- export interface Spring {
78
- /** Start animating to target value */
79
- to(target: number): Promise<void>;
80
- /** Get current animated value */
81
- current(): number;
82
- /** Stop the animation */
83
- stop(): void;
84
- /** Subscribe to value changes */
85
- onChange(callback: (value: number) => void): () => void;
86
- }
87
-
88
- /**
89
- * Web Animations helper configuration.
90
- */
91
- export interface AnimateOptions {
92
- /** Keyframes to animate */
93
- keyframes: Keyframe[] | PropertyIndexedKeyframes;
94
- /** Animation options (duration, easing, etc.) */
95
- options?: KeyframeAnimationOptions;
96
- /** Commit final styles to the element (default: true) */
97
- commitStyles?: boolean;
98
- /** Respect prefers-reduced-motion (default: true) */
99
- respectReducedMotion?: boolean;
100
- /** Callback when animation completes */
101
- onFinish?: () => void;
102
- }
103
-
104
- /**
105
- * Stagger helper configuration.
106
- */
107
- export interface StaggerOptions {
108
- /** Start delay in milliseconds (default: 0) */
109
- start?: number;
110
- /** Origin index or keyword (default: 'start') */
111
- from?: 'start' | 'center' | 'end' | number;
112
- /** Optional easing function for normalized distance */
113
- easing?: EasingFunction;
114
- }
115
-
116
- /**
117
- * Easing function signature.
118
- */
119
- export type EasingFunction = (t: number) => number;
120
-
121
- /**
122
- * Sequence step configuration.
123
- */
124
- export interface SequenceStep extends AnimateOptions {
125
- /** Target element to animate */
126
- target: Element;
127
- }
128
-
129
- /**
130
- * Sequence run configuration.
131
- */
132
- export interface SequenceOptions {
133
- /** Optional stagger delay between steps */
134
- stagger?: StaggerFunction;
135
- /** Callback when sequence completes */
136
- onFinish?: () => void;
137
- }
138
-
139
- /**
140
- * Timeline step configuration.
141
- */
142
- export interface TimelineStep {
143
- /** Target element to animate */
144
- target: Element;
145
- /** Keyframes to animate */
146
- keyframes: Keyframe[] | PropertyIndexedKeyframes;
147
- /** Animation options for this step */
148
- options?: KeyframeAnimationOptions;
149
- /** Absolute or relative start time in milliseconds */
150
- at?: number | `+=${number}` | `-=${number}`;
151
- /** Optional label for debugging */
152
- label?: string;
153
- }
154
-
155
- /**
156
- * Timeline configuration.
157
- */
158
- export interface TimelineConfig {
159
- /** Commit final styles when timeline completes (default: true) */
160
- commitStyles?: boolean;
161
- /** Respect prefers-reduced-motion (default: true) */
162
- respectReducedMotion?: boolean;
163
- /** Callback when timeline completes */
164
- onFinish?: () => void;
165
- }
166
-
167
- /**
168
- * Timeline controls.
169
- */
170
- export interface TimelineControls {
171
- /** Play all steps */
172
- play(): Promise<void>;
173
- /** Pause animations */
174
- pause(): void;
175
- /** Resume animations */
176
- resume(): void;
177
- /** Stop and cancel animations */
178
- stop(): void;
179
- /** Seek to a specific time in milliseconds */
180
- seek(time: number): void;
181
- /** Add a step to the timeline */
182
- add(step: TimelineStep): void;
183
- /** Total timeline duration in milliseconds */
184
- duration(): number;
185
- /** Subscribe to finish events */
186
- onFinish(callback: () => void): () => void;
187
- }
188
-
189
- /**
190
- * Scroll animation configuration.
191
- */
192
- export interface ScrollAnimateOptions extends AnimateOptions {
193
- /** IntersectionObserver root */
194
- root?: Element | Document | null;
195
- /** Root margin for observer */
196
- rootMargin?: string;
197
- /** Intersection thresholds */
198
- threshold?: number | number[];
199
- /** Trigger only once (default: true) */
200
- once?: boolean;
201
- /** Callback when element enters the viewport */
202
- onEnter?: (element: Element) => void;
203
- }
204
-
205
- /**
206
- * Cleanup function for scroll animations.
207
- */
208
- export type ScrollAnimateCleanup = () => void;
1
+ /**
2
+ * Shared Motion module types.
3
+ *
4
+ * @module bquery/motion
5
+ */
6
+
7
+ /**
8
+ * Options for view transitions.
9
+ */
10
+ export interface TransitionOptions {
11
+ /** The DOM update function to execute during transition */
12
+ update: () => void | Promise<void>;
13
+ /** Skip the transition when reduced motion is preferred. */
14
+ skipOnReducedMotion?: boolean;
15
+ /** Classes applied to the root element while the transition is active. */
16
+ classes?: string[];
17
+ /** Transition types added when supported by the browser. */
18
+ types?: string[];
19
+ /** Called after the transition becomes ready. */
20
+ onReady?: () => void;
21
+ /** Called after the transition finishes. */
22
+ onFinish?: () => void;
23
+ }
24
+
25
+ /**
26
+ * Captured element bounds for FLIP animations.
27
+ */
28
+ export interface ElementBounds {
29
+ top: number;
30
+ left: number;
31
+ width: number;
32
+ height: number;
33
+ }
34
+
35
+ /**
36
+ * FLIP animation configuration options.
37
+ */
38
+ export interface FlipOptions {
39
+ /** Animation duration in milliseconds */
40
+ duration?: number;
41
+ /** CSS easing function */
42
+ easing?: string;
43
+ /** Callback when animation completes */
44
+ onComplete?: () => void;
45
+ }
46
+
47
+ /**
48
+ * Stagger delay function signature.
49
+ */
50
+ export type StaggerFunction = (index: number, total: number) => number;
51
+
52
+ /**
53
+ * Extended options for group FLIP animations.
54
+ */
55
+ export interface FlipGroupOptions extends FlipOptions {
56
+ /** Optional stagger delay function */
57
+ stagger?: StaggerFunction;
58
+ }
59
+
60
+ /**
61
+ * Spring physics configuration.
62
+ */
63
+ export interface SpringConfig {
64
+ /** Spring stiffness (default: 100) */
65
+ stiffness?: number;
66
+ /** Damping coefficient (default: 10) */
67
+ damping?: number;
68
+ /** Mass of the object (default: 1) */
69
+ mass?: number;
70
+ /** Velocity threshold for completion (default: 0.01) */
71
+ precision?: number;
72
+ }
73
+
74
+ /**
75
+ * Spring instance for animating values.
76
+ */
77
+ export interface Spring {
78
+ /** Start animating to target value */
79
+ to(target: number): Promise<void>;
80
+ /** Get current animated value */
81
+ current(): number;
82
+ /** Stop the animation */
83
+ stop(): void;
84
+ /** Subscribe to value changes */
85
+ onChange(callback: (value: number) => void): () => void;
86
+ }
87
+
88
+ /**
89
+ * Web Animations helper configuration.
90
+ */
91
+ export interface AnimateOptions {
92
+ /** Keyframes to animate */
93
+ keyframes: Keyframe[] | PropertyIndexedKeyframes;
94
+ /** Animation options (duration, easing, etc.) */
95
+ options?: KeyframeAnimationOptions;
96
+ /** Commit final styles to the element (default: true) */
97
+ commitStyles?: boolean;
98
+ /** Respect prefers-reduced-motion (default: true) */
99
+ respectReducedMotion?: boolean;
100
+ /** Callback when animation completes */
101
+ onFinish?: () => void;
102
+ }
103
+
104
+ /**
105
+ * Stagger helper configuration.
106
+ */
107
+ export interface StaggerOptions {
108
+ /** Start delay in milliseconds (default: 0) */
109
+ start?: number;
110
+ /** Origin index or keyword (default: 'start') */
111
+ from?: 'start' | 'center' | 'end' | number;
112
+ /** Optional easing function for normalized distance */
113
+ easing?: EasingFunction;
114
+ }
115
+
116
+ /**
117
+ * Easing function signature.
118
+ */
119
+ export type EasingFunction = (t: number) => number;
120
+
121
+ /**
122
+ * Sequence step configuration.
123
+ */
124
+ export interface SequenceStep extends AnimateOptions {
125
+ /** Target element to animate */
126
+ target: Element;
127
+ }
128
+
129
+ /**
130
+ * Sequence run configuration.
131
+ */
132
+ export interface SequenceOptions {
133
+ /** Optional stagger delay between steps */
134
+ stagger?: StaggerFunction;
135
+ /** Callback when sequence completes */
136
+ onFinish?: () => void;
137
+ }
138
+
139
+ /**
140
+ * Timeline step configuration.
141
+ */
142
+ export interface TimelineStep {
143
+ /** Target element to animate */
144
+ target: Element;
145
+ /** Keyframes to animate */
146
+ keyframes: Keyframe[] | PropertyIndexedKeyframes;
147
+ /** Animation options for this step */
148
+ options?: KeyframeAnimationOptions;
149
+ /** Absolute or relative start time in milliseconds */
150
+ at?: number | `+=${number}` | `-=${number}`;
151
+ /** Optional label for debugging */
152
+ label?: string;
153
+ }
154
+
155
+ /**
156
+ * Timeline configuration.
157
+ */
158
+ export interface TimelineConfig {
159
+ /** Commit final styles when timeline completes (default: true) */
160
+ commitStyles?: boolean;
161
+ /** Respect prefers-reduced-motion (default: true) */
162
+ respectReducedMotion?: boolean;
163
+ /** Callback when timeline completes */
164
+ onFinish?: () => void;
165
+ }
166
+
167
+ /**
168
+ * Timeline controls.
169
+ */
170
+ export interface TimelineControls {
171
+ /** Play all steps */
172
+ play(): Promise<void>;
173
+ /** Pause animations */
174
+ pause(): void;
175
+ /** Resume animations */
176
+ resume(): void;
177
+ /** Stop and cancel animations */
178
+ stop(): void;
179
+ /** Seek to a specific time in milliseconds */
180
+ seek(time: number): void;
181
+ /** Add a step to the timeline */
182
+ add(step: TimelineStep): void;
183
+ /** Total timeline duration in milliseconds */
184
+ duration(): number;
185
+ /** Subscribe to finish events */
186
+ onFinish(callback: () => void): () => void;
187
+ }
188
+
189
+ /**
190
+ * Scroll animation configuration.
191
+ */
192
+ export interface ScrollAnimateOptions extends AnimateOptions {
193
+ /** IntersectionObserver root */
194
+ root?: Element | Document | null;
195
+ /** Root margin for observer */
196
+ rootMargin?: string;
197
+ /** Intersection thresholds */
198
+ threshold?: number | number[];
199
+ /** Trigger only once (default: true) */
200
+ once?: boolean;
201
+ /** Callback when element enters the viewport */
202
+ onEnter?: (element: Element) => void;
203
+ }
204
+
205
+ /**
206
+ * Cleanup function for scroll animations.
207
+ */
208
+ export type ScrollAnimateCleanup = () => void;
209
+
210
+ /**
211
+ * Options for the `morphElement` FLIP-based morph animation.
212
+ */
213
+ export interface MorphOptions {
214
+ /** Animation duration in milliseconds (default: 300) */
215
+ duration?: number;
216
+ /** CSS easing function (default: 'ease') */
217
+ easing?: string;
218
+ /** Whether to respect prefers-reduced-motion (default: true) */
219
+ respectReducedMotion?: boolean;
220
+ /** Callback when morph completes */
221
+ onComplete?: () => void;
222
+ }
223
+
224
+ /**
225
+ * Options for the `parallax` scroll-linked effect.
226
+ */
227
+ export interface ParallaxOptions {
228
+ /** Parallax speed multiplier (default: 0.5). Values < 1 are slower, > 1 are faster. */
229
+ speed?: number;
230
+ /** Direction of the parallax effect (default: 'vertical') */
231
+ direction?: 'vertical' | 'horizontal' | 'both';
232
+ /** Whether to respect prefers-reduced-motion (default: true) */
233
+ respectReducedMotion?: boolean;
234
+ }
235
+
236
+ /**
237
+ * Cleanup function for the parallax effect.
238
+ */
239
+ export type ParallaxCleanup = () => void;
240
+
241
+ /**
242
+ * Options for the `typewriter` text animation.
243
+ */
244
+ export interface TypewriterOptions {
245
+ /** Time in milliseconds between each character (default: 50) */
246
+ speed?: number;
247
+ /** Initial delay before starting, in milliseconds (default: 0) */
248
+ delay?: number;
249
+ /** Whether to show a blinking cursor (default: false) */
250
+ cursor?: boolean;
251
+ /** Cursor character (default: '|') */
252
+ cursorChar?: string;
253
+ /** Whether to loop the animation (default: false) */
254
+ loop?: boolean;
255
+ /** Pause duration at end before looping, in ms (default: 1000) */
256
+ loopDelay?: number;
257
+ /** Whether to respect prefers-reduced-motion (default: true) */
258
+ respectReducedMotion?: boolean;
259
+ /** Callback when typing completes (per-loop) */
260
+ onComplete?: () => void;
261
+ }
262
+
263
+ /**
264
+ * Controls for an active typewriter animation.
265
+ */
266
+ export interface TypewriterControls {
267
+ /** Stop the animation and clean up */
268
+ stop(): void;
269
+ /** Promise that resolves when the animation finishes, or when a looping animation is stopped */
270
+ done: Promise<void>;
271
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Character-by-character typewriter text animation.
3
+ *
4
+ * @module bquery/motion
5
+ */
6
+
7
+ import { prefersReducedMotion } from './reduced-motion';
8
+ import type { TypewriterControls, TypewriterOptions } from './types';
9
+
10
+ /**
11
+ * Animate text appearing character by character in an element.
12
+ *
13
+ * @param element - The element to type text into
14
+ * @param text - The text to display
15
+ * @param options - Typewriter configuration
16
+ * @returns Controls with `.stop()` to cancel and `.done` promise
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const tw = typewriter(
21
+ * document.querySelector('#output')!,
22
+ * 'Hello, world!',
23
+ * { speed: 80, cursor: true },
24
+ * );
25
+ *
26
+ * // Wait for it to finish:
27
+ * await tw.done;
28
+ *
29
+ * // Or cancel early:
30
+ * tw.stop();
31
+ * ```
32
+ */
33
+ export const typewriter = (
34
+ element: HTMLElement,
35
+ text: string,
36
+ options: TypewriterOptions = {}
37
+ ): TypewriterControls => {
38
+ const {
39
+ speed = 50,
40
+ delay = 0,
41
+ cursor = false,
42
+ cursorChar = '|',
43
+ loop = false,
44
+ loopDelay = 1000,
45
+ respectReducedMotion = true,
46
+ onComplete,
47
+ } = options;
48
+
49
+ if (typeof document === 'undefined') {
50
+ return {
51
+ stop: () => {},
52
+ done: Promise.resolve(),
53
+ };
54
+ }
55
+
56
+ const el = element;
57
+ let stopped = false;
58
+ let timer: ReturnType<typeof setTimeout> | null = null;
59
+ let cursorEl: HTMLSpanElement | null = null;
60
+ let cursorTimer: ReturnType<typeof setInterval> | null = null;
61
+ let resolvePromise: (() => void) | null = null;
62
+
63
+ // Add cursor element if enabled
64
+ const setupCursor = () => {
65
+ if (!cursor) return;
66
+ cursorEl = document.createElement('span');
67
+ cursorEl.setAttribute('aria-hidden', 'true');
68
+ cursorEl.textContent = cursorChar;
69
+ el.appendChild(cursorEl);
70
+
71
+ // Blink the cursor
72
+ let visible = true;
73
+ cursorTimer = setInterval(() => {
74
+ if (cursorEl) {
75
+ visible = !visible;
76
+ cursorEl.style.opacity = visible ? '1' : '0';
77
+ }
78
+ }, 530);
79
+ };
80
+
81
+ const removeCursor = () => {
82
+ if (cursorTimer !== null) {
83
+ clearInterval(cursorTimer);
84
+ cursorTimer = null;
85
+ }
86
+ if (cursorEl && cursorEl.parentNode) {
87
+ cursorEl.parentNode.removeChild(cursorEl);
88
+ cursorEl = null;
89
+ }
90
+ };
91
+
92
+ const stop = () => {
93
+ if (stopped) return;
94
+ stopped = true;
95
+ if (timer !== null) {
96
+ clearTimeout(timer);
97
+ timer = null;
98
+ }
99
+ removeCursor();
100
+ // Resolve the done promise so callers awaiting it are unblocked
101
+ resolvePromise?.();
102
+ resolvePromise = null;
103
+ };
104
+
105
+ // If reduced motion, show text instantly
106
+ if (respectReducedMotion && prefersReducedMotion()) {
107
+ el.textContent = text;
108
+ onComplete?.();
109
+ return {
110
+ stop: () => {},
111
+ done: Promise.resolve(),
112
+ };
113
+ }
114
+
115
+ const done = new Promise<void>((resolve) => {
116
+ resolvePromise = resolve;
117
+
118
+ const typeLoop = () => {
119
+ let charIndex = 0;
120
+ el.textContent = '';
121
+ setupCursor();
122
+ const textNode = document.createTextNode('');
123
+
124
+ if (cursorEl) {
125
+ el.insertBefore(textNode, cursorEl);
126
+ } else {
127
+ el.appendChild(textNode);
128
+ }
129
+
130
+ const typeNextChar = () => {
131
+ if (stopped) {
132
+ return;
133
+ }
134
+ if (charIndex < text.length) {
135
+ textNode.data = text.slice(0, charIndex + 1);
136
+ charIndex++;
137
+ timer = setTimeout(typeNextChar, speed);
138
+ } else {
139
+ // Typing complete for this iteration
140
+ onComplete?.();
141
+
142
+ if (loop && !stopped) {
143
+ timer = setTimeout(() => {
144
+ if (!stopped) {
145
+ removeCursor();
146
+ typeLoop();
147
+ }
148
+ }, loopDelay);
149
+ } else {
150
+ removeCursor();
151
+ resolve();
152
+ resolvePromise = null;
153
+ }
154
+ }
155
+ };
156
+
157
+ timer = setTimeout(typeNextChar, delay);
158
+ };
159
+
160
+ typeLoop();
161
+ });
162
+
163
+ return { stop, done };
164
+ };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * bQuery Plugin System — register plugins that extend bQuery with custom
3
+ * directives and components.
4
+ *
5
+ * @module bquery/plugin
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { use, isInstalled, getInstalledPlugins } from '@bquery/bquery/plugin';
10
+ *
11
+ * use({
12
+ * name: 'my-plugin',
13
+ * install(ctx, options) {
14
+ * ctx.directive('tooltip', (el, expr) => { ... });
15
+ * ctx.component('my-widget', MyWidgetElement);
16
+ * },
17
+ * });
18
+ * ```
19
+ */
20
+
21
+ // Types
22
+ export type {
23
+ BQueryPlugin,
24
+ CustomDirective,
25
+ CustomDirectiveHandler,
26
+ PluginInstallContext,
27
+ } from './types';
28
+
29
+ // Runtime API
30
+ export {
31
+ use,
32
+ isInstalled,
33
+ getInstalledPlugins,
34
+ getCustomDirective,
35
+ getCustomDirectives,
36
+ resetPlugins,
37
+ } from './registry';