@bquery/bquery 1.2.0 → 1.3.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 (305) hide show
  1. package/README.md +501 -427
  2. package/dist/batch-4LAvfLE7.js +13 -0
  3. package/dist/batch-4LAvfLE7.js.map +1 -0
  4. package/dist/component/component.d.ts +69 -0
  5. package/dist/component/component.d.ts.map +1 -0
  6. package/dist/component/html.d.ts +35 -0
  7. package/dist/component/html.d.ts.map +1 -0
  8. package/dist/component/index.d.ts +3 -126
  9. package/dist/component/index.d.ts.map +1 -1
  10. package/dist/component/props.d.ts +18 -0
  11. package/dist/component/props.d.ts.map +1 -0
  12. package/dist/component/types.d.ts +77 -0
  13. package/dist/component/types.d.ts.map +1 -0
  14. package/dist/component.es.mjs +90 -59
  15. package/dist/component.es.mjs.map +1 -1
  16. package/dist/core/collection.d.ts +36 -0
  17. package/dist/core/collection.d.ts.map +1 -1
  18. package/dist/core/dom.d.ts +6 -0
  19. package/dist/core/dom.d.ts.map +1 -0
  20. package/dist/core/element.d.ts +8 -0
  21. package/dist/core/element.d.ts.map +1 -1
  22. package/dist/core/index.d.ts +1 -0
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/utils/array.d.ts +74 -0
  25. package/dist/core/utils/array.d.ts.map +1 -0
  26. package/dist/core/utils/function.d.ts +70 -0
  27. package/dist/core/utils/function.d.ts.map +1 -0
  28. package/dist/core/utils/index.d.ts +70 -0
  29. package/dist/core/utils/index.d.ts.map +1 -0
  30. package/dist/core/utils/misc.d.ts +63 -0
  31. package/dist/core/utils/misc.d.ts.map +1 -0
  32. package/dist/core/utils/number.d.ts +65 -0
  33. package/dist/core/utils/number.d.ts.map +1 -0
  34. package/dist/core/utils/object.d.ts +133 -0
  35. package/dist/core/utils/object.d.ts.map +1 -0
  36. package/dist/core/utils/string.d.ts +80 -0
  37. package/dist/core/utils/string.d.ts.map +1 -0
  38. package/dist/core/utils/type-guards.d.ts +79 -0
  39. package/dist/core/utils/type-guards.d.ts.map +1 -0
  40. package/dist/core-COenAZjD.js +145 -0
  41. package/dist/core-COenAZjD.js.map +1 -0
  42. package/dist/core.es.mjs +411 -448
  43. package/dist/core.es.mjs.map +1 -1
  44. package/dist/full.d.ts +2 -2
  45. package/dist/full.d.ts.map +1 -1
  46. package/dist/full.es.mjs +87 -64
  47. package/dist/full.es.mjs.map +1 -1
  48. package/dist/full.iife.js +2 -2
  49. package/dist/full.iife.js.map +1 -1
  50. package/dist/full.umd.js +2 -2
  51. package/dist/full.umd.js.map +1 -1
  52. package/dist/index.es.mjs +138 -68
  53. package/dist/index.es.mjs.map +1 -1
  54. package/dist/motion/animate.d.ts +25 -0
  55. package/dist/motion/animate.d.ts.map +1 -0
  56. package/dist/motion/easing.d.ts +30 -0
  57. package/dist/motion/easing.d.ts.map +1 -0
  58. package/dist/motion/flip.d.ts +55 -0
  59. package/dist/motion/flip.d.ts.map +1 -0
  60. package/dist/motion/index.d.ts +11 -138
  61. package/dist/motion/index.d.ts.map +1 -1
  62. package/dist/motion/keyframes.d.ts +21 -0
  63. package/dist/motion/keyframes.d.ts.map +1 -0
  64. package/dist/motion/reduced-motion.d.ts +12 -0
  65. package/dist/motion/reduced-motion.d.ts.map +1 -0
  66. package/dist/motion/scroll.d.ts +15 -0
  67. package/dist/motion/scroll.d.ts.map +1 -0
  68. package/dist/motion/spring.d.ts +42 -0
  69. package/dist/motion/spring.d.ts.map +1 -0
  70. package/dist/motion/stagger.d.ts +22 -0
  71. package/dist/motion/stagger.d.ts.map +1 -0
  72. package/dist/motion/timeline.d.ts +21 -0
  73. package/dist/motion/timeline.d.ts.map +1 -0
  74. package/dist/motion/transition.d.ts +22 -0
  75. package/dist/motion/transition.d.ts.map +1 -0
  76. package/dist/motion/types.d.ts +182 -0
  77. package/dist/motion/types.d.ts.map +1 -0
  78. package/dist/motion.es.mjs +320 -61
  79. package/dist/motion.es.mjs.map +1 -1
  80. package/dist/persisted-Dz_ryNuC.js +278 -0
  81. package/dist/persisted-Dz_ryNuC.js.map +1 -0
  82. package/dist/reactive/batch.d.ts +13 -0
  83. package/dist/reactive/batch.d.ts.map +1 -0
  84. package/dist/reactive/computed.d.ts +50 -0
  85. package/dist/reactive/computed.d.ts.map +1 -0
  86. package/dist/reactive/core.d.ts +60 -0
  87. package/dist/reactive/core.d.ts.map +1 -0
  88. package/dist/reactive/effect.d.ts +15 -0
  89. package/dist/reactive/effect.d.ts.map +1 -0
  90. package/dist/reactive/index.d.ts +2 -2
  91. package/dist/reactive/index.d.ts.map +1 -1
  92. package/dist/reactive/internals.d.ts +36 -0
  93. package/dist/reactive/internals.d.ts.map +1 -0
  94. package/dist/reactive/linked.d.ts +36 -0
  95. package/dist/reactive/linked.d.ts.map +1 -0
  96. package/dist/reactive/persisted.d.ts +14 -0
  97. package/dist/reactive/persisted.d.ts.map +1 -0
  98. package/dist/reactive/readonly.d.ts +26 -0
  99. package/dist/reactive/readonly.d.ts.map +1 -0
  100. package/dist/reactive/signal.d.ts +13 -312
  101. package/dist/reactive/signal.d.ts.map +1 -1
  102. package/dist/reactive/type-guards.d.ts +20 -0
  103. package/dist/reactive/type-guards.d.ts.map +1 -0
  104. package/dist/reactive/untrack.d.ts +29 -0
  105. package/dist/reactive/untrack.d.ts.map +1 -0
  106. package/dist/reactive/watch.d.ts +42 -0
  107. package/dist/reactive/watch.d.ts.map +1 -0
  108. package/dist/reactive.es.mjs +30 -163
  109. package/dist/reactive.es.mjs.map +1 -1
  110. package/dist/router/index.d.ts +6 -252
  111. package/dist/router/index.d.ts.map +1 -1
  112. package/dist/router/links.d.ts +44 -0
  113. package/dist/router/links.d.ts.map +1 -0
  114. package/dist/router/match.d.ts +20 -0
  115. package/dist/router/match.d.ts.map +1 -0
  116. package/dist/router/navigation.d.ts +45 -0
  117. package/dist/router/navigation.d.ts.map +1 -0
  118. package/dist/router/query.d.ts +16 -0
  119. package/dist/router/query.d.ts.map +1 -0
  120. package/dist/router/router.d.ts +34 -0
  121. package/dist/router/router.d.ts.map +1 -0
  122. package/dist/router/state.d.ts +27 -0
  123. package/dist/router/state.d.ts.map +1 -0
  124. package/dist/router/types.d.ts +88 -0
  125. package/dist/router/types.d.ts.map +1 -0
  126. package/dist/router/utils.d.ts +65 -0
  127. package/dist/router/utils.d.ts.map +1 -0
  128. package/dist/router.es.mjs +168 -132
  129. package/dist/router.es.mjs.map +1 -1
  130. package/dist/sanitize-1FBEPAFH.js +272 -0
  131. package/dist/sanitize-1FBEPAFH.js.map +1 -0
  132. package/dist/security/constants.d.ts +42 -0
  133. package/dist/security/constants.d.ts.map +1 -0
  134. package/dist/security/csp.d.ts +24 -0
  135. package/dist/security/csp.d.ts.map +1 -0
  136. package/dist/security/index.d.ts +4 -2
  137. package/dist/security/index.d.ts.map +1 -1
  138. package/dist/security/sanitize-core.d.ts +13 -0
  139. package/dist/security/sanitize-core.d.ts.map +1 -0
  140. package/dist/security/sanitize.d.ts +5 -57
  141. package/dist/security/sanitize.d.ts.map +1 -1
  142. package/dist/security/trusted-types.d.ts +25 -0
  143. package/dist/security/trusted-types.d.ts.map +1 -0
  144. package/dist/security/types.d.ts +36 -0
  145. package/dist/security/types.d.ts.map +1 -0
  146. package/dist/security.es.mjs +50 -277
  147. package/dist/security.es.mjs.map +1 -1
  148. package/dist/store/create-store.d.ts +15 -0
  149. package/dist/store/create-store.d.ts.map +1 -0
  150. package/dist/store/define-store.d.ts +28 -0
  151. package/dist/store/define-store.d.ts.map +1 -0
  152. package/dist/store/devtools.d.ts +22 -0
  153. package/dist/store/devtools.d.ts.map +1 -0
  154. package/dist/store/index.d.ts +10 -286
  155. package/dist/store/index.d.ts.map +1 -1
  156. package/dist/store/mapping.d.ts +28 -0
  157. package/dist/store/mapping.d.ts.map +1 -0
  158. package/dist/store/persisted.d.ts +13 -0
  159. package/dist/store/persisted.d.ts.map +1 -0
  160. package/dist/store/plugins.d.ts +13 -0
  161. package/dist/store/plugins.d.ts.map +1 -0
  162. package/dist/store/registry.d.ts +28 -0
  163. package/dist/store/registry.d.ts.map +1 -0
  164. package/dist/store/types.d.ts +71 -0
  165. package/dist/store/types.d.ts.map +1 -0
  166. package/dist/store/utils.d.ts +28 -0
  167. package/dist/store/utils.d.ts.map +1 -0
  168. package/dist/store/watch.d.ts +23 -0
  169. package/dist/store/watch.d.ts.map +1 -0
  170. package/dist/store.es.mjs +22 -224
  171. package/dist/store.es.mjs.map +1 -1
  172. package/dist/type-guards-DRma3-Kc.js +16 -0
  173. package/dist/type-guards-DRma3-Kc.js.map +1 -0
  174. package/dist/untrack-BuEQKH7_.js +6 -0
  175. package/dist/untrack-BuEQKH7_.js.map +1 -0
  176. package/dist/view/directives/bind.d.ts +7 -0
  177. package/dist/view/directives/bind.d.ts.map +1 -0
  178. package/dist/view/directives/class.d.ts +8 -0
  179. package/dist/view/directives/class.d.ts.map +1 -0
  180. package/dist/view/directives/for.d.ts +23 -0
  181. package/dist/view/directives/for.d.ts.map +1 -0
  182. package/dist/view/directives/html.d.ts +7 -0
  183. package/dist/view/directives/html.d.ts.map +1 -0
  184. package/dist/view/directives/if.d.ts +7 -0
  185. package/dist/view/directives/if.d.ts.map +1 -0
  186. package/dist/view/directives/index.d.ts +12 -0
  187. package/dist/view/directives/index.d.ts.map +1 -0
  188. package/dist/view/directives/model.d.ts +7 -0
  189. package/dist/view/directives/model.d.ts.map +1 -0
  190. package/dist/view/directives/on.d.ts +7 -0
  191. package/dist/view/directives/on.d.ts.map +1 -0
  192. package/dist/view/directives/ref.d.ts +7 -0
  193. package/dist/view/directives/ref.d.ts.map +1 -0
  194. package/dist/view/directives/show.d.ts +7 -0
  195. package/dist/view/directives/show.d.ts.map +1 -0
  196. package/dist/view/directives/style.d.ts +7 -0
  197. package/dist/view/directives/style.d.ts.map +1 -0
  198. package/dist/view/directives/text.d.ts +7 -0
  199. package/dist/view/directives/text.d.ts.map +1 -0
  200. package/dist/view/evaluate.d.ts +43 -0
  201. package/dist/view/evaluate.d.ts.map +1 -0
  202. package/dist/view/index.d.ts +3 -93
  203. package/dist/view/index.d.ts.map +1 -1
  204. package/dist/view/mount.d.ts +69 -0
  205. package/dist/view/mount.d.ts.map +1 -0
  206. package/dist/view/process.d.ts +26 -0
  207. package/dist/view/process.d.ts.map +1 -0
  208. package/dist/view/types.d.ts +36 -0
  209. package/dist/view/types.d.ts.map +1 -0
  210. package/dist/view.es.mjs +368 -267
  211. package/dist/view.es.mjs.map +1 -1
  212. package/dist/watch-CXyaBC_9.js +58 -0
  213. package/dist/watch-CXyaBC_9.js.map +1 -0
  214. package/package.json +132 -132
  215. package/src/component/component.ts +289 -0
  216. package/src/component/html.ts +53 -0
  217. package/src/component/index.ts +40 -414
  218. package/src/component/props.ts +116 -0
  219. package/src/component/types.ts +85 -0
  220. package/src/core/collection.ts +588 -454
  221. package/src/core/dom.ts +38 -0
  222. package/src/core/element.ts +746 -740
  223. package/src/core/index.ts +43 -0
  224. package/src/core/utils/array.ts +102 -0
  225. package/src/core/utils/function.ts +110 -0
  226. package/src/core/utils/index.ts +83 -0
  227. package/src/core/utils/misc.ts +82 -0
  228. package/src/core/utils/number.ts +78 -0
  229. package/src/core/utils/object.ts +206 -0
  230. package/src/core/utils/string.ts +112 -0
  231. package/src/core/utils/type-guards.ts +112 -0
  232. package/src/full.ts +187 -150
  233. package/src/index.ts +36 -36
  234. package/src/motion/animate.ts +113 -0
  235. package/src/motion/easing.ts +40 -0
  236. package/src/motion/flip.ts +176 -0
  237. package/src/motion/index.ts +41 -358
  238. package/src/motion/keyframes.ts +46 -0
  239. package/src/motion/reduced-motion.ts +17 -0
  240. package/src/motion/scroll.ts +57 -0
  241. package/src/motion/spring.ts +150 -0
  242. package/src/motion/stagger.ts +43 -0
  243. package/src/motion/timeline.ts +246 -0
  244. package/src/motion/transition.ts +51 -0
  245. package/src/motion/types.ts +198 -0
  246. package/src/reactive/batch.ts +22 -0
  247. package/src/reactive/computed.ts +92 -0
  248. package/src/reactive/core.ts +93 -0
  249. package/src/reactive/effect.ts +43 -0
  250. package/src/reactive/index.ts +23 -22
  251. package/src/reactive/internals.ts +105 -0
  252. package/src/reactive/linked.ts +56 -0
  253. package/src/reactive/persisted.ts +74 -0
  254. package/src/reactive/readonly.ts +35 -0
  255. package/src/reactive/signal.ts +20 -520
  256. package/src/reactive/type-guards.ts +22 -0
  257. package/src/reactive/untrack.ts +31 -0
  258. package/src/reactive/watch.ts +73 -0
  259. package/src/router/index.ts +41 -718
  260. package/src/router/links.ts +130 -0
  261. package/src/router/match.ts +106 -0
  262. package/src/router/navigation.ts +71 -0
  263. package/src/router/query.ts +35 -0
  264. package/src/router/router.ts +211 -0
  265. package/src/router/state.ts +46 -0
  266. package/src/router/types.ts +93 -0
  267. package/src/router/utils.ts +116 -0
  268. package/src/security/constants.ts +209 -0
  269. package/src/security/csp.ts +77 -0
  270. package/src/security/index.ts +4 -12
  271. package/src/security/sanitize-core.ts +343 -0
  272. package/src/security/sanitize.ts +66 -625
  273. package/src/security/trusted-types.ts +69 -0
  274. package/src/security/types.ts +40 -0
  275. package/src/store/create-store.ts +329 -0
  276. package/src/store/define-store.ts +48 -0
  277. package/src/store/devtools.ts +45 -0
  278. package/src/store/index.ts +22 -848
  279. package/src/store/mapping.ts +73 -0
  280. package/src/store/persisted.ts +61 -0
  281. package/src/store/plugins.ts +32 -0
  282. package/src/store/registry.ts +51 -0
  283. package/src/store/types.ts +94 -0
  284. package/src/store/utils.ts +141 -0
  285. package/src/store/watch.ts +52 -0
  286. package/src/view/directives/bind.ts +23 -0
  287. package/src/view/directives/class.ts +70 -0
  288. package/src/view/directives/for.ts +275 -0
  289. package/src/view/directives/html.ts +19 -0
  290. package/src/view/directives/if.ts +30 -0
  291. package/src/view/directives/index.ts +11 -0
  292. package/src/view/directives/model.ts +56 -0
  293. package/src/view/directives/on.ts +41 -0
  294. package/src/view/directives/ref.ts +41 -0
  295. package/src/view/directives/show.ts +26 -0
  296. package/src/view/directives/style.ts +47 -0
  297. package/src/view/directives/text.ts +15 -0
  298. package/src/view/evaluate.ts +274 -0
  299. package/src/view/index.ts +112 -1041
  300. package/src/view/mount.ts +200 -0
  301. package/src/view/process.ts +92 -0
  302. package/src/view/types.ts +44 -0
  303. package/dist/core/utils.d.ts +0 -313
  304. package/dist/core/utils.d.ts.map +0 -1
  305. package/src/core/utils.ts +0 -444
package/README.md CHANGED
@@ -1,427 +1,501 @@
1
- <p align="center">
2
- <img src="assets/bquerry-logo.svg" alt="bQuery.js Logo" width="120" />
3
- </p>
4
-
5
- <h1 align="center">bQuery.js</h1>
6
-
7
- <p align="center">
8
-
9
- [![Repo](https://img.shields.io/badge/github-bquery%2Fbquery-24292f?logo=github)](https://github.com/bQuery/bQuery)
10
- [![Stars](https://img.shields.io/github/stars/bquery/bquery?style=flat&logo=github)](https://github.com/bQuery/bQuery/stargazers)
11
- [![Issues](https://img.shields.io/github/issues/bquery/bquery?style=flat&logo=github)](https://github.com/bQuery/bQuery/issues)
12
- [![License](https://img.shields.io/github/license/bquery/bquery?style=flat)](https://github.com/bQuery/bQuery/blob/main/LICENSE.md)
13
- [![npm](https://img.shields.io/npm/v/@bquery/bquery)](https://www.npmjs.com/package/@bquery/bquery)
14
- [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@bquery/bquery)](https://bundlephobia.com/package/@bquery/bquery)
15
- [![unpkg](https://img.shields.io/badge/unpkg-browse-blue?logo=unpkg)](https://unpkg.com/@bquery/bquery)
16
- [![CodeFactor](https://www.codefactor.io/repository/github/bquery/bquery/badge)](https://www.codefactor.io/repository/github/bquery/bquery)
17
-
18
- **The jQuery for the modern Web Platform.**
19
-
20
- bQuery.js is a slim, TypeScript-first library that combines jQuery's direct DOM workflow with modern features like reactivity, Web Components, and motion utilities — without a mandatory build step.
21
-
22
- ## Highlights
23
-
24
- - **Zero‑build capable**: runs directly in the browser; build tools are optional.
25
- - **Securityfocused**: DOM writes are sanitized by default; Trusted Types supported.
26
- - **Modular**: the core stays small; extra modules are opt‑in.
27
- - **TypeScript‑first**: clear types and strong IDE support.
28
- - **Tree-shakeable**: import only what you need.
29
-
30
- ## Installation
31
-
32
- ### Via npm/bun/pnpm
33
-
34
- ```bash
35
- # npm
36
- npm install @bquery/bquery
37
-
38
- # bun
39
- bun add @bquery/bquery
40
-
41
- # pnpm
42
- pnpm add @bquery/bquery
43
- ```
44
-
45
- ### Via CDN (Zero-build)
46
-
47
- #### ES Modules (recommended)
48
-
49
- ```html
50
- <script type="module">
51
- import { $, signal } from 'https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs';
52
-
53
- const count = signal(0);
54
- $('#counter').text(`Count: ${count.value}`);
55
- </script>
56
- ```
57
-
58
- #### UMD (global variable)
59
-
60
- ```html
61
- <script src="https://unpkg.com/@bquery/bquery@1/dist/full.umd.js"></script>
62
- <script>
63
- const { $, signal } = bQuery;
64
- const count = signal(0);
65
- </script>
66
- ```
67
-
68
- #### IIFE (self-executing)
69
-
70
- ```html
71
- <script src="https://unpkg.com/@bquery/bquery@1/dist/full.iife.js"></script>
72
- <script>
73
- const { $, $$ } = bQuery;
74
- $$('.items').addClass('loaded');
75
- </script>
76
- ```
77
-
78
- ### Import Strategies
79
-
80
- ```ts
81
- // Full bundle (all modules)
82
- import { $, signal, component } from '@bquery/bquery';
83
-
84
- // Core only
85
- import { $, $$ } from '@bquery/bquery/core';
86
-
87
- // À la carte (individual modules)
88
- import { signal, computed, effect } from '@bquery/bquery/reactive';
89
- import { component, html } from '@bquery/bquery/component';
90
- import { transition, spring } from '@bquery/bquery/motion';
91
- import { sanitize } from '@bquery/bquery/security';
92
- import { storage, cache } from '@bquery/bquery/platform';
93
- import { createRouter, navigate } from '@bquery/bquery/router';
94
- import { createStore } from '@bquery/bquery/store';
95
- import { mount } from '@bquery/bquery/view';
96
- ```
97
-
98
- ## Modules at a glance
99
-
100
- | Module | Description | Size (gzip) |
101
- | ------------- | ---------------------------------------------- | ----------- |
102
- | **Core** | Selectors, DOM manipulation, events, utilities | ~7.7 KB |
103
- | **Reactive** | `signal`, `computed`, `effect`, `batch` | ~1.2 KB |
104
- | **Component** | Lightweight Web Components with props | ~1.5 KB |
105
- | **Motion** | View transitions, FLIP animations, springs | ~1.2 KB |
106
- | **Security** | HTML sanitizing, Trusted Types, CSP | ~2.2 KB |
107
- | **Platform** | Storage, cache, notifications, buckets | ~1.6 KB |
108
- | **Router** | SPA routing, navigation guards, history API | ~2 KB |
109
- | **Store** | Signal-based state management, persistence | ~1.5 KB |
110
- | **View** | Declarative DOM bindings, directives | ~2.6 KB |
111
-
112
- ## Quick examples
113
-
114
- ### Core DOM & events
115
-
116
- ```ts
117
- import { $, $$ } from '@bquery/bquery/core';
118
-
119
- // jQuery-style selectors
120
- $('#save').on('click', (event) => {
121
- console.log('Saved', event.type);
122
- });
123
-
124
- // Event delegation for dynamic content
125
- $('#list').delegate('click', '.item', (event, target) => {
126
- console.log('Item clicked', target.textContent);
127
- });
128
-
129
- // Method chaining
130
- $('#box').addClass('active').css({ opacity: '0.8' }).attr('data-state', 'ready');
131
-
132
- // DOM manipulation
133
- $('#content').wrap('<div class="wrapper"></div>');
134
- $('#wrapper').unwrap(); // Remove parent wrapper
135
-
136
- // Smooth scrolling
137
- $('#section').scrollTo({ behavior: 'smooth' });
138
-
139
- // Form serialization
140
- const formData = $('form').serialize(); // Returns object
141
- const queryString = $('form').serializeString(); // Returns URL-encoded string
142
-
143
- // Collections
144
- $$('.items').addClass('highlight');
145
- ```
146
-
147
- ### Reactive signals
148
-
149
- ```ts
150
- import { signal, computed, effect, batch, watch, readonly } from '@bquery/bquery/reactive';
151
-
152
- const count = signal(0);
153
- const doubled = computed(() => count.value * 2);
154
-
155
- effect(() => {
156
- console.log('Count changed', count.value);
157
- });
158
-
159
- // Watch with cleanup support
160
- const stop = watch(count, (newVal, oldVal) => {
161
- console.log(`Changed from ${oldVal} to ${newVal}`);
162
- });
163
-
164
- // Read-only signal wrapper
165
- const readOnlyCount = readonly(count);
166
-
167
- // Batch updates for performance
168
- batch(() => {
169
- count.value++;
170
- count.value++;
171
- });
172
- ```
173
-
174
- ### Components – Web Components
175
-
176
- ```ts
177
- import { component, html } from '@bquery/bquery/component';
178
-
179
- component('user-card', {
180
- props: {
181
- username: { type: String, required: true },
182
- age: { type: Number, validator: (v) => v >= 0 && v <= 150 },
183
- },
184
- // Extended lifecycle hooks
185
- beforeMount() {
186
- console.log('About to mount');
187
- },
188
- connected() {
189
- console.log('Mounted');
190
- },
191
- beforeUpdate(props) {
192
- // Return false to prevent update
193
- return props.username !== '';
194
- },
195
- onError(error) {
196
- console.error('Component error:', error);
197
- },
198
- render({ props }) {
199
- return html`<div>Hello ${props.username}</div>`;
200
- },
201
- });
202
- ```
203
-
204
- ### Motionanimations
205
-
206
- ```ts
207
- import { transition, spring } from '@bquery/bquery/motion';
208
-
209
- // View transitions (with fallback)
210
- await transition(() => {
211
- $('#content').text('Updated');
212
- });
213
-
214
- // Spring physics
215
- const x = spring(0, { stiffness: 120, damping: 14 });
216
- x.onChange((value) => {
217
- element.style.transform = `translateX(${value}px)`;
218
- });
219
- await x.to(100);
220
- ```
221
-
222
- ### Security sanitizing
223
-
224
- ```ts
225
- import { sanitize, escapeHtml } from '@bquery/bquery/security';
226
-
227
- // Sanitize HTML (removes dangerous elements like script, iframe, svg)
228
- const safeHtml = sanitize(userInput);
229
-
230
- // DOM clobbering protection (reserved IDs are blocked)
231
- const safe = sanitize('<form id="cookie">...</form>'); // id stripped
232
-
233
- // Unicode bypass protection in URLs
234
- const urlSafe = sanitize('<a href="java\u200Bscript:alert(1)">click</a>');
235
-
236
- // Automatic link security (adds rel="noopener noreferrer" to external/target="_blank" links)
237
- const secureLink = sanitize('<a href="https://external.com" target="_blank">Link</a>');
238
-
239
- // Escape for text display
240
- const escaped = escapeHtml('<script>alert(1)</script>');
241
- ```
242
-
243
- ### Platform – storage & APIs
244
-
245
- ```ts
246
- import { storage, notifications } from '@bquery/bquery/platform';
247
-
248
- // Unified storage API
249
- const local = storage.local();
250
- await local.set('theme', 'dark');
251
- const theme = await local.get<string>('theme');
252
-
253
- // Notifications
254
- const permission = await notifications.requestPermission();
255
- if (permission === 'granted') {
256
- notifications.send('Build complete', {
257
- body: 'Your docs are ready.',
258
- });
259
- }
260
- ```
261
-
262
- ### Router – SPA navigation
263
-
264
- ```ts
265
- import { createRouter, navigate, currentRoute } from '@bquery/bquery/router';
266
-
267
- // Create router with routes
268
- const router = createRouter({
269
- routes: [
270
- { path: '/', name: 'home', component: HomePage },
271
- { path: '/user/:id', name: 'user', component: UserPage },
272
- { path: '*', component: NotFound },
273
- ],
274
- });
275
-
276
- // Navigation guards
277
- router.beforeEach(async (to, from) => {
278
- if (to.path === '/admin' && !isAuthenticated()) {
279
- await navigate('/login'); // Redirect
280
- return false; // Cancel original navigation
281
- }
282
- });
283
-
284
- // Navigate programmatically
285
- await navigate('/user/42');
286
- await navigate('/search?q=bquery'); // Query params in path
287
- await navigate('/login', { replace: true }); // Replace history entry
288
-
289
- // Reactive current route
290
- effect(() => {
291
- console.log('Current path:', currentRoute.value.path);
292
- });
293
- ```
294
-
295
- ### Store – state management
296
-
297
- ```ts
298
- import { createStore, createPersistedStore } from '@bquery/bquery/store';
299
-
300
- // Define a store
301
- const useCounter = createStore({
302
- id: 'counter',
303
- state: () => ({ count: 0, name: 'Counter' }),
304
- getters: {
305
- doubled: (state) => state.count * 2,
306
- },
307
- actions: {
308
- increment() {
309
- this.count++;
310
- },
311
- async fetchCount() {
312
- this.count = await api.getCount();
313
- },
314
- },
315
- });
316
-
317
- // Use the store
318
- const counter = useCounter;
319
- counter.increment();
320
- console.log(counter.doubled); // Reactive getter
321
-
322
- // Persisted store (localStorage)
323
- const useSettings = createPersistedStore({
324
- id: 'settings',
325
- state: () => ({ theme: 'dark', language: 'en' }),
326
- });
327
- ```
328
-
329
- ### View – declarative bindings
330
-
331
- ```ts
332
- import { mount, createTemplate } from '@bquery/bquery/view';
333
- import { signal } from '@bquery/bquery/reactive';
334
-
335
- // Mount reactive bindings to DOM
336
- const count = signal(0);
337
- const items = signal(['Apple', 'Banana', 'Cherry']);
338
-
339
- const app = mount('#app', {
340
- count,
341
- items,
342
- increment: () => count.value++,
343
- });
344
-
345
- // In HTML:
346
- // <p bq-text="count"></p>
347
- // <button bq-on:click="increment">+1</button>
348
- // <ul><li bq-for="item in items" bq-text="item"></li></ul>
349
- // <input bq-model="count" type="number" />
350
- // <div bq-if="count > 5">Count is high!</div>
351
- // <div bq-class="{ active: count > 0 }"></div>
352
- ```
353
-
354
- ## Browser Support
355
-
356
- | Browser | Version | Support |
357
- | ------- | ------- | ------- |
358
- | Chrome | 90+ | ✅ Full |
359
- | Firefox | 90+ | ✅ Full |
360
- | Safari | 15+ | ✅ Full |
361
- | Edge | 90+ | ✅ Full |
362
-
363
- > **No IE support** by design.
364
-
365
- ## Documentation
366
-
367
- - **Getting Started**: [docs/guide/getting-started.md](docs/guide/getting-started.md)
368
- - **Core API**: [docs/guide/api-core.md](docs/guide/api-core.md)
369
- - **Agents**: [docs/guide/agents.md](docs/guide/agents.md)
370
- - **Components**: [docs/guide/components.md](docs/guide/components.md)
371
- - **Reactivity**: [docs/guide/reactive.md](docs/guide/reactive.md)
372
- - **Motion**: [docs/guide/motion.md](docs/guide/motion.md)
373
- - **Security**: [docs/guide/security.md](docs/guide/security.md)
374
- - **Platform**: [docs/guide/platform.md](docs/guide/platform.md)
375
- - **Router**: [docs/guide/router.md](docs/guide/router.md)
376
- - **Store**: [docs/guide/store.md](docs/guide/store.md)
377
- - **View**: [docs/guide/view.md](docs/guide/view.md)
378
-
379
- ## Local Development
380
-
381
- ```bash
382
- # Install dependencies
383
- bun install
384
-
385
- # Start VitePress docs
386
- bun run dev
387
-
388
- # Run Vite playground
389
- bun run playground
390
-
391
- # Run tests
392
- bun test
393
-
394
- # Build library
395
- bun run build
396
-
397
- # Generate API documentation
398
- bun run docs:api
399
- ```
400
-
401
- ## Project Structure
402
-
403
- ```text
404
- bQuery.js
405
- ├── src/
406
- │ ├── core/ # Selectors, DOM ops, events, utils
407
- │ ├── reactive/ # Signals, computed, effects
408
- │ ├── component/ # Web Components helper
409
- │ ├── motion/ # View transitions, FLIP, springs
410
- │ ├── security/ # Sanitizer, CSP, Trusted Types
411
- │ ├── platform/ # Storage, cache, notifications
412
- │ ├── router/ # SPA routing, navigation guards
413
- │ ├── store/ # State management, persistence
414
- │ └── view/ # Declarative DOM bindings
415
- ├── docs/ # VitePress documentation
416
- ├── playground/ # Vite demo app
417
- ├── tests/ # bun:test suites
418
- └── dist/ # Built files (ESM, UMD, IIFE)
419
- ```
420
-
421
- ## Contributing
422
-
423
- See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
424
-
425
- ## License
426
-
427
- MIT – See [LICENSE.md](LICENSE.md) for details.
1
+ <p align="center">
2
+ <img src="assets/bquerry-logo.svg" alt="bQuery.js Logo" width="120" />
3
+ </p>
4
+
5
+ <h1 align="center">bQuery.js</h1>
6
+
7
+ <p align="center">
8
+
9
+ [![Repo](https://img.shields.io/badge/github-bquery%2Fbquery-24292f?logo=github)](https://github.com/bQuery/bQuery)
10
+ [![Stars](https://img.shields.io/github/stars/bquery/bquery?style=flat&logo=github)](https://github.com/bQuery/bQuery/stargazers)
11
+ [![Issues](https://img.shields.io/github/issues/bquery/bquery?style=flat&logo=github)](https://github.com/bQuery/bQuery/issues)
12
+ [![License](https://img.shields.io/github/license/bquery/bquery?style=flat)](https://github.com/bQuery/bQuery/blob/main/LICENSE.md)
13
+ [![npm](https://img.shields.io/npm/v/@bquery/bquery)](https://www.npmjs.com/package/@bquery/bquery)
14
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@bquery/bquery)](https://bundlephobia.com/package/@bquery/bquery)
15
+ [![unpkg](https://img.shields.io/badge/unpkg-browse-blue?logo=unpkg)](https://unpkg.com/@bquery/bquery)
16
+ [![CodeFactor](https://www.codefactor.io/repository/github/bquery/bquery/badge)](https://www.codefactor.io/repository/github/bquery/bquery)
17
+ [![JsDelivr](https://data.jsdelivr.com/v1/package/npm/@bquery/bquery/badge)](https://www.jsdelivr.com/package/npm/@bquery/bquery)
18
+
19
+ **The jQuery for the modern Web Platform.**
20
+
21
+ bQuery.js is a slim, TypeScript-first library that combines jQuery's direct DOM workflow with modern features like reactivity, Web Components, and motion utilities — without a mandatory build step.
22
+
23
+ ## Highlights
24
+
25
+ - **Zerobuild capable**: runs directly in the browser; build tools are optional.
26
+ - **Security‑focused**: DOM writes are sanitized by default; Trusted Types supported.
27
+ - **Modular**: the core stays small; extra modules are opt‑in.
28
+ - **TypeScript‑first**: clear types and strong IDE support.
29
+ - **Tree-shakeable**: import only what you need.
30
+
31
+ ## Installation
32
+
33
+ ### Via npm/bun/pnpm
34
+
35
+ ```bash
36
+ # npm
37
+ npm install @bquery/bquery
38
+
39
+ # bun
40
+ bun add @bquery/bquery
41
+
42
+ # pnpm
43
+ pnpm add @bquery/bquery
44
+ ```
45
+
46
+ ### Via CDN (Zero-build)
47
+
48
+ #### ES Modules (recommended)
49
+
50
+ ```html
51
+ <script type="module">
52
+ import { $, signal } from 'https://unpkg.com/@bquery/bquery@1/dist/full.es.mjs';
53
+
54
+ const count = signal(0);
55
+ $('#counter').text(`Count: ${count.value}`);
56
+ </script>
57
+ ```
58
+
59
+ #### UMD (global variable)
60
+
61
+ ```html
62
+ <script src="https://unpkg.com/@bquery/bquery@1/dist/full.umd.js"></script>
63
+ <script>
64
+ const { $, signal } = bQuery;
65
+ const count = signal(0);
66
+ </script>
67
+ ```
68
+
69
+ #### IIFE (self-executing)
70
+
71
+ ```html
72
+ <script src="https://unpkg.com/@bquery/bquery@1/dist/full.iife.js"></script>
73
+ <script>
74
+ const { $, $$ } = bQuery;
75
+ $$('.items').addClass('loaded');
76
+ </script>
77
+ ```
78
+
79
+ ### Import Strategies
80
+
81
+ ```ts
82
+ // Full bundle (all modules)
83
+ import { $, signal, component } from '@bquery/bquery';
84
+
85
+ // Core only
86
+ import { $, $$ } from '@bquery/bquery/core';
87
+
88
+ // Core utilities (named exports, tree-shakeable)
89
+ import { debounce, merge, uid, once, utils } from '@bquery/bquery/core';
90
+
91
+ // À la carte (individual modules)
92
+ import { signal, computed, effect, linkedSignal, persistedSignal } from '@bquery/bquery/reactive';
93
+ import { component, defineComponent, html } from '@bquery/bquery/component';
94
+ import { transition, spring, animate, timeline } from '@bquery/bquery/motion';
95
+ import { sanitize } from '@bquery/bquery/security';
96
+ import { storage, cache } from '@bquery/bquery/platform';
97
+ import { createRouter, navigate } from '@bquery/bquery/router';
98
+ import { createStore, defineStore } from '@bquery/bquery/store';
99
+ import { mount, createTemplate } from '@bquery/bquery/view';
100
+ ```
101
+
102
+ ## Modules at a glance
103
+
104
+ | Module | Description | Size (gzip) |
105
+ | ------------- | -------------------------------------------------- | ----------- |
106
+ | **Core** | Selectors, DOM manipulation, events, utilities | ~11.3 KB |
107
+ | **Reactive** | `signal`, `computed`, `effect`, `batch` | ~0.3 KB |
108
+ | **Component** | Lightweight Web Components with props | ~1.9 KB |
109
+ | **Motion** | View transitions, FLIP, timelines, scroll, springs | ~4.0 KB |
110
+ | **Security** | HTML sanitizing, Trusted Types, CSP | ~0.7 KB |
111
+ | **Platform** | Storage, cache, notifications, buckets | ~2.2 KB |
112
+ | **Router** | SPA routing, navigation guards, history API | ~2.2 KB |
113
+ | **Store** | Signal-based state management, persistence | ~0.3 KB |
114
+ | **View** | Declarative DOM bindings, directives | ~4.3 KB |
115
+
116
+ ## Quick examples
117
+
118
+ ### Core – DOM & events
119
+
120
+ ```ts
121
+ import { $, $$ } from '@bquery/bquery/core';
122
+
123
+ // jQuery-style selectors
124
+ $('#save').on('click', (event) => {
125
+ console.log('Saved', event.type);
126
+ });
127
+
128
+ // Event delegation for dynamic content
129
+ $('#list').delegate('click', '.item', (event, target) => {
130
+ console.log('Item clicked', target.textContent);
131
+ });
132
+
133
+ // Method chaining
134
+ $('#box').addClass('active').css({ opacity: '0.8' }).attr('data-state', 'ready');
135
+
136
+ // DOM manipulation
137
+ $('#content').wrap('div');
138
+ $('#content').unwrap(); // Remove parent wrapper
139
+
140
+ // Attribute helpers
141
+ $('#dialog').toggleAttr('open');
142
+
143
+ // Smooth scrolling
144
+ $('#section').scrollTo({ behavior: 'smooth' });
145
+
146
+ // Form serialization
147
+ const formData = $('form').serialize(); // Returns object
148
+ const queryString = $('form').serializeString(); // Returns URL-encoded string
149
+
150
+ // Collections
151
+ $$('.items').addClass('highlight');
152
+ $$('.items').append('<li class="item">New</li>');
153
+ ```
154
+
155
+ ### Reactive – signals
156
+
157
+ ```ts
158
+ import {
159
+ signal,
160
+ computed,
161
+ effect,
162
+ batch,
163
+ watch,
164
+ readonly,
165
+ linkedSignal,
166
+ } from '@bquery/bquery/reactive';
167
+
168
+ const count = signal(0);
169
+ const doubled = computed(() => count.value * 2);
170
+
171
+ effect(() => {
172
+ console.log('Count changed', count.value);
173
+ });
174
+
175
+ // Watch with cleanup support
176
+ const stop = watch(count, (newVal, oldVal) => {
177
+ console.log(`Changed from ${oldVal} to ${newVal}`);
178
+ });
179
+
180
+ // Read-only signal wrapper
181
+ const readOnlyCount = readonly(count);
182
+
183
+ // Batch updates for performance
184
+ batch(() => {
185
+ count.value++;
186
+ count.value++;
187
+ });
188
+
189
+ // Writable computed (linked signal)
190
+ const first = signal('Ada');
191
+ const last = signal('Lovelace');
192
+ const fullName = linkedSignal(
193
+ () => `${first.value} ${last.value}`,
194
+ (next) => {
195
+ const [nextFirst, nextLast] = next.split(' ');
196
+ first.value = nextFirst ?? '';
197
+ last.value = nextLast ?? '';
198
+ }
199
+ );
200
+
201
+ fullName.value = 'Grace Hopper';
202
+ ```
203
+
204
+ ### ComponentsWeb Components
205
+
206
+ ```ts
207
+ import { component, defineComponent, html } from '@bquery/bquery/component';
208
+
209
+ component('user-card', {
210
+ props: {
211
+ username: { type: String, required: true },
212
+ age: { type: Number, validator: (v) => v >= 0 && v <= 150 },
213
+ },
214
+ // Extended lifecycle hooks
215
+ beforeMount() {
216
+ console.log('About to mount');
217
+ },
218
+ connected() {
219
+ console.log('Mounted');
220
+ },
221
+ beforeUpdate(props) {
222
+ // Return false to prevent update
223
+ return props.username !== '';
224
+ },
225
+ onError(error) {
226
+ console.error('Component error:', error);
227
+ },
228
+ render({ props }) {
229
+ return html`<div>Hello ${props.username}</div>`;
230
+ },
231
+ });
232
+
233
+ // Optional: create the class without auto-registration
234
+ const UserCard = defineComponent('user-card', {
235
+ props: { username: { type: String, required: true } },
236
+ render: ({ props }) => html`<div>Hello ${props.username}</div>`,
237
+ });
238
+ customElements.define('user-card', UserCard);
239
+ ```
240
+
241
+ ### Motion – animations
242
+
243
+ ```ts
244
+ import { animate, keyframePresets, spring, transition } from '@bquery/bquery/motion';
245
+
246
+ // View transitions (with fallback)
247
+ await transition(() => {
248
+ $('#content').text('Updated');
249
+ });
250
+
251
+ // Web Animations helper
252
+ await animate(card, {
253
+ keyframes: keyframePresets.pop(),
254
+ options: { duration: 240, easing: 'ease-out' },
255
+ });
256
+
257
+ // Spring physics
258
+ const x = spring(0, { stiffness: 120, damping: 14 });
259
+ x.onChange((value) => {
260
+ element.style.transform = `translateX(${value}px)`;
261
+ });
262
+ await x.to(100);
263
+ ```
264
+
265
+ ### Security sanitizing
266
+
267
+ Internally modularized (sanitize core, Trusted Types, CSP helpers) — the public API remains unchanged. For legacy deep imports, `@bquery/bquery/security/sanitize` also re-exports `generateNonce()` and `isTrustedTypesSupported()`.
268
+
269
+ ```ts
270
+ import { sanitize, escapeHtml } from '@bquery/bquery/security';
271
+
272
+ // Sanitize HTML (removes dangerous elements like script, iframe, svg)
273
+ const safeHtml = sanitize(userInput);
274
+
275
+ // DOM clobbering protection (reserved IDs are blocked)
276
+ const safe = sanitize('<form id="cookie">...</form>'); // id stripped
277
+
278
+ // Unicode bypass protection in URLs
279
+ const urlSafe = sanitize('<a href="java\u200Bscript:alert(1)">click</a>');
280
+
281
+ // Automatic link security (adds rel="noopener noreferrer" to external/target="_blank" links)
282
+ const secureLink = sanitize('<a href="https://external.com" target="_blank">Link</a>');
283
+
284
+ // Escape for text display
285
+ const escaped = escapeHtml('<script>alert(1)</script>');
286
+ ```
287
+
288
+ ### Platform – storage & APIs
289
+
290
+ ```ts
291
+ import { storage, notifications } from '@bquery/bquery/platform';
292
+
293
+ // Unified storage API
294
+ const local = storage.local();
295
+ await local.set('theme', 'dark');
296
+ const theme = await local.get<string>('theme');
297
+
298
+ // Notifications
299
+ const permission = await notifications.requestPermission();
300
+ if (permission === 'granted') {
301
+ notifications.send('Build complete', {
302
+ body: 'Your docs are ready.',
303
+ });
304
+ }
305
+ ```
306
+
307
+ ### Router – SPA navigation
308
+
309
+ Internally, the router has been split into focused submodules (matching, navigation, state, links, utilities) with no public API changes.
310
+
311
+ ```ts
312
+ import { createRouter, navigate, currentRoute } from '@bquery/bquery/router';
313
+
314
+ // Create router with routes
315
+ const router = createRouter({
316
+ routes: [
317
+ { path: '/', name: 'home', component: HomePage },
318
+ { path: '/user/:id', name: 'user', component: UserPage },
319
+ { path: '*', component: NotFound },
320
+ ],
321
+ });
322
+
323
+ // Navigation guards
324
+ router.beforeEach(async (to, from) => {
325
+ if (to.path === '/admin' && !isAuthenticated()) {
326
+ await navigate('/login'); // Redirect
327
+ return false; // Cancel original navigation
328
+ }
329
+ });
330
+
331
+ // Navigate programmatically
332
+ await navigate('/user/42');
333
+ await navigate('/search?q=bquery'); // Query params in path
334
+ await navigate('/login', { replace: true }); // Replace history entry
335
+
336
+ // Reactive current route
337
+ effect(() => {
338
+ console.log('Current path:', currentRoute.value.path);
339
+ });
340
+ ```
341
+
342
+ ### Store state management
343
+
344
+ ```ts
345
+ import { createStore, createPersistedStore } from '@bquery/bquery/store';
346
+
347
+ // Create a store (returns the store instance directly)
348
+ const counterStore = createStore({
349
+ id: 'counter',
350
+ state: () => ({ count: 0, name: 'Counter' }),
351
+ getters: {
352
+ doubled: (state) => state.count * 2,
353
+ },
354
+ actions: {
355
+ increment() {
356
+ this.count++;
357
+ },
358
+ async fetchCount() {
359
+ this.count = await api.getCount();
360
+ },
361
+ },
362
+ });
363
+
364
+ // Use the store
365
+ counterStore.increment();
366
+ console.log(counterStore.doubled); // Reactive getter
367
+
368
+ // Persisted store (localStorage)
369
+ const settingsStore = createPersistedStore({
370
+ id: 'settings',
371
+ state: () => ({ theme: 'dark', language: 'en' }),
372
+ });
373
+
374
+ // Factory-style store definition (Pinia-style)
375
+ import { defineStore, mapGetters, watchStore } from '@bquery/bquery/store';
376
+
377
+ const useCounter = defineStore('counter', {
378
+ state: () => ({ count: 0 }),
379
+ getters: {
380
+ doubled: (state) => state.count * 2,
381
+ },
382
+ actions: {
383
+ increment() {
384
+ this.count++;
385
+ },
386
+ },
387
+ });
388
+
389
+ const counter = useCounter();
390
+ const getters = mapGetters(counter, ['doubled']);
391
+
392
+ watchStore(
393
+ counter,
394
+ (state) => state.count,
395
+ (value) => {
396
+ console.log('Count changed:', value, getters.doubled);
397
+ }
398
+ );
399
+ ```
400
+
401
+ ### View – declarative bindings
402
+
403
+ Internally modularized into focused submodules; the public API remains unchanged.
404
+
405
+ ```ts
406
+ import { mount, createTemplate } from '@bquery/bquery/view';
407
+ import { signal } from '@bquery/bquery/reactive';
408
+
409
+ // Mount reactive bindings to DOM
410
+ const count = signal(0);
411
+ const items = signal(['Apple', 'Banana', 'Cherry']);
412
+
413
+ const app = mount('#app', {
414
+ count,
415
+ items,
416
+ increment: () => count.value++,
417
+ });
418
+
419
+ // In HTML:
420
+ // <p bq-text="count"></p>
421
+ // <button bq-on:click="increment">+1</button>
422
+ // <ul><li bq-for="item in items" bq-text="item"></li></ul>
423
+ // <input bq-model="count" type="number" />
424
+ // <div bq-if="count > 5">Count is high!</div>
425
+ // <div bq-class="{ active: count > 0 }"></div>
426
+ ```
427
+
428
+ ## Browser Support
429
+
430
+ | Browser | Version | Support |
431
+ | ------- | ------- | ------- |
432
+ | Chrome | 90+ | ✅ Full |
433
+ | Firefox | 90+ | ✅ Full |
434
+ | Safari | 15+ | ✅ Full |
435
+ | Edge | 90+ | ✅ Full |
436
+
437
+ > **No IE support** by design.
438
+
439
+ ## Documentation
440
+
441
+ - **Getting Started**: [docs/guide/getting-started.md](docs/guide/getting-started.md)
442
+ - **Core API**: [docs/guide/api-core.md](docs/guide/api-core.md)
443
+ - **Agents**: [docs/guide/agents.md](docs/guide/agents.md)
444
+ - **Components**: [docs/guide/components.md](docs/guide/components.md)
445
+ - **Reactivity**: [docs/guide/reactive.md](docs/guide/reactive.md)
446
+ - **Motion**: [docs/guide/motion.md](docs/guide/motion.md)
447
+ - **Security**: [docs/guide/security.md](docs/guide/security.md)
448
+ - **Platform**: [docs/guide/platform.md](docs/guide/platform.md)
449
+ - **Router**: [docs/guide/router.md](docs/guide/router.md)
450
+ - **Store**: [docs/guide/store.md](docs/guide/store.md)
451
+ - **View**: [docs/guide/view.md](docs/guide/view.md)
452
+
453
+ ## Local Development
454
+
455
+ ```bash
456
+ # Install dependencies
457
+ bun install
458
+
459
+ # Start VitePress docs
460
+ bun run dev
461
+
462
+ # Run Vite playground
463
+ bun run playground
464
+
465
+ # Run tests
466
+ bun test
467
+
468
+ # Build library
469
+ bun run build
470
+
471
+ # Generate API documentation
472
+ bun run docs:api
473
+ ```
474
+
475
+ ## Project Structure
476
+
477
+ ```text
478
+ bQuery.js
479
+ ├── src/
480
+ │ ├── core/ # Selectors, DOM ops, events, utils
481
+ │ ├── reactive/ # Signals, computed, effects
482
+ │ ├── component/ # Web Components helper
483
+ │ ├── motion/ # View transitions, FLIP, springs
484
+ │ ├── security/ # Sanitizer, CSP, Trusted Types
485
+ │ ├── platform/ # Storage, cache, notifications
486
+ │ ├── router/ # SPA routing, navigation guards
487
+ │ ├── store/ # State management, persistence
488
+ │ └── view/ # Declarative DOM bindings
489
+ ├── docs/ # VitePress documentation
490
+ ├── playground/ # Vite demo app
491
+ ├── tests/ # bun:test suites
492
+ └── dist/ # Built files (ESM, UMD, IIFE)
493
+ ```
494
+
495
+ ## Contributing
496
+
497
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
498
+
499
+ ## License
500
+
501
+ MIT – See [LICENSE.md](LICENSE.md) for details.