@bquery/bquery 1.1.2 → 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 (307) hide show
  1. package/README.md +501 -323
  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 +8 -2
  45. package/dist/full.d.ts.map +1 -1
  46. package/dist/full.es.mjs +86 -40
  47. package/dist/full.es.mjs.map +1 -1
  48. package/dist/full.iife.js +6 -1
  49. package/dist/full.iife.js.map +1 -1
  50. package/dist/full.umd.js +6 -1
  51. package/dist/full.umd.js.map +1 -1
  52. package/dist/index.d.ts +3 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.es.mjs +137 -44
  55. package/dist/index.es.mjs.map +1 -1
  56. package/dist/motion/animate.d.ts +25 -0
  57. package/dist/motion/animate.d.ts.map +1 -0
  58. package/dist/motion/easing.d.ts +30 -0
  59. package/dist/motion/easing.d.ts.map +1 -0
  60. package/dist/motion/flip.d.ts +55 -0
  61. package/dist/motion/flip.d.ts.map +1 -0
  62. package/dist/motion/index.d.ts +11 -138
  63. package/dist/motion/index.d.ts.map +1 -1
  64. package/dist/motion/keyframes.d.ts +21 -0
  65. package/dist/motion/keyframes.d.ts.map +1 -0
  66. package/dist/motion/reduced-motion.d.ts +12 -0
  67. package/dist/motion/reduced-motion.d.ts.map +1 -0
  68. package/dist/motion/scroll.d.ts +15 -0
  69. package/dist/motion/scroll.d.ts.map +1 -0
  70. package/dist/motion/spring.d.ts +42 -0
  71. package/dist/motion/spring.d.ts.map +1 -0
  72. package/dist/motion/stagger.d.ts +22 -0
  73. package/dist/motion/stagger.d.ts.map +1 -0
  74. package/dist/motion/timeline.d.ts +21 -0
  75. package/dist/motion/timeline.d.ts.map +1 -0
  76. package/dist/motion/transition.d.ts +22 -0
  77. package/dist/motion/transition.d.ts.map +1 -0
  78. package/dist/motion/types.d.ts +182 -0
  79. package/dist/motion/types.d.ts.map +1 -0
  80. package/dist/motion.es.mjs +320 -61
  81. package/dist/motion.es.mjs.map +1 -1
  82. package/dist/persisted-Dz_ryNuC.js +278 -0
  83. package/dist/persisted-Dz_ryNuC.js.map +1 -0
  84. package/dist/reactive/batch.d.ts +13 -0
  85. package/dist/reactive/batch.d.ts.map +1 -0
  86. package/dist/reactive/computed.d.ts +50 -0
  87. package/dist/reactive/computed.d.ts.map +1 -0
  88. package/dist/reactive/core.d.ts +60 -0
  89. package/dist/reactive/core.d.ts.map +1 -0
  90. package/dist/reactive/effect.d.ts +15 -0
  91. package/dist/reactive/effect.d.ts.map +1 -0
  92. package/dist/reactive/index.d.ts +2 -2
  93. package/dist/reactive/index.d.ts.map +1 -1
  94. package/dist/reactive/internals.d.ts +36 -0
  95. package/dist/reactive/internals.d.ts.map +1 -0
  96. package/dist/reactive/linked.d.ts +36 -0
  97. package/dist/reactive/linked.d.ts.map +1 -0
  98. package/dist/reactive/persisted.d.ts +14 -0
  99. package/dist/reactive/persisted.d.ts.map +1 -0
  100. package/dist/reactive/readonly.d.ts +26 -0
  101. package/dist/reactive/readonly.d.ts.map +1 -0
  102. package/dist/reactive/signal.d.ts +13 -305
  103. package/dist/reactive/signal.d.ts.map +1 -1
  104. package/dist/reactive/type-guards.d.ts +20 -0
  105. package/dist/reactive/type-guards.d.ts.map +1 -0
  106. package/dist/reactive/untrack.d.ts +29 -0
  107. package/dist/reactive/untrack.d.ts.map +1 -0
  108. package/dist/reactive/watch.d.ts +42 -0
  109. package/dist/reactive/watch.d.ts.map +1 -0
  110. package/dist/reactive.es.mjs +30 -154
  111. package/dist/reactive.es.mjs.map +1 -1
  112. package/dist/router/index.d.ts +41 -0
  113. package/dist/router/index.d.ts.map +1 -0
  114. package/dist/router/links.d.ts +44 -0
  115. package/dist/router/links.d.ts.map +1 -0
  116. package/dist/router/match.d.ts +20 -0
  117. package/dist/router/match.d.ts.map +1 -0
  118. package/dist/router/navigation.d.ts +45 -0
  119. package/dist/router/navigation.d.ts.map +1 -0
  120. package/dist/router/query.d.ts +16 -0
  121. package/dist/router/query.d.ts.map +1 -0
  122. package/dist/router/router.d.ts +34 -0
  123. package/dist/router/router.d.ts.map +1 -0
  124. package/dist/router/state.d.ts +27 -0
  125. package/dist/router/state.d.ts.map +1 -0
  126. package/dist/router/types.d.ts +88 -0
  127. package/dist/router/types.d.ts.map +1 -0
  128. package/dist/router/utils.d.ts +65 -0
  129. package/dist/router/utils.d.ts.map +1 -0
  130. package/dist/router.es.mjs +202 -0
  131. package/dist/router.es.mjs.map +1 -0
  132. package/dist/sanitize-1FBEPAFH.js +272 -0
  133. package/dist/sanitize-1FBEPAFH.js.map +1 -0
  134. package/dist/security/constants.d.ts +42 -0
  135. package/dist/security/constants.d.ts.map +1 -0
  136. package/dist/security/csp.d.ts +24 -0
  137. package/dist/security/csp.d.ts.map +1 -0
  138. package/dist/security/index.d.ts +4 -2
  139. package/dist/security/index.d.ts.map +1 -1
  140. package/dist/security/sanitize-core.d.ts +13 -0
  141. package/dist/security/sanitize-core.d.ts.map +1 -0
  142. package/dist/security/sanitize.d.ts +5 -57
  143. package/dist/security/sanitize.d.ts.map +1 -1
  144. package/dist/security/trusted-types.d.ts +25 -0
  145. package/dist/security/trusted-types.d.ts.map +1 -0
  146. package/dist/security/types.d.ts +36 -0
  147. package/dist/security/types.d.ts.map +1 -0
  148. package/dist/security.es.mjs +50 -277
  149. package/dist/security.es.mjs.map +1 -1
  150. package/dist/store/create-store.d.ts +15 -0
  151. package/dist/store/create-store.d.ts.map +1 -0
  152. package/dist/store/define-store.d.ts +28 -0
  153. package/dist/store/define-store.d.ts.map +1 -0
  154. package/dist/store/devtools.d.ts +22 -0
  155. package/dist/store/devtools.d.ts.map +1 -0
  156. package/dist/store/index.d.ts +12 -0
  157. package/dist/store/index.d.ts.map +1 -0
  158. package/dist/store/mapping.d.ts +28 -0
  159. package/dist/store/mapping.d.ts.map +1 -0
  160. package/dist/store/persisted.d.ts +13 -0
  161. package/dist/store/persisted.d.ts.map +1 -0
  162. package/dist/store/plugins.d.ts +13 -0
  163. package/dist/store/plugins.d.ts.map +1 -0
  164. package/dist/store/registry.d.ts +28 -0
  165. package/dist/store/registry.d.ts.map +1 -0
  166. package/dist/store/types.d.ts +71 -0
  167. package/dist/store/types.d.ts.map +1 -0
  168. package/dist/store/utils.d.ts +28 -0
  169. package/dist/store/utils.d.ts.map +1 -0
  170. package/dist/store/watch.d.ts +23 -0
  171. package/dist/store/watch.d.ts.map +1 -0
  172. package/dist/store.es.mjs +27 -0
  173. package/dist/store.es.mjs.map +1 -0
  174. package/dist/type-guards-DRma3-Kc.js +16 -0
  175. package/dist/type-guards-DRma3-Kc.js.map +1 -0
  176. package/dist/untrack-BuEQKH7_.js +6 -0
  177. package/dist/untrack-BuEQKH7_.js.map +1 -0
  178. package/dist/view/directives/bind.d.ts +7 -0
  179. package/dist/view/directives/bind.d.ts.map +1 -0
  180. package/dist/view/directives/class.d.ts +8 -0
  181. package/dist/view/directives/class.d.ts.map +1 -0
  182. package/dist/view/directives/for.d.ts +23 -0
  183. package/dist/view/directives/for.d.ts.map +1 -0
  184. package/dist/view/directives/html.d.ts +7 -0
  185. package/dist/view/directives/html.d.ts.map +1 -0
  186. package/dist/view/directives/if.d.ts +7 -0
  187. package/dist/view/directives/if.d.ts.map +1 -0
  188. package/dist/view/directives/index.d.ts +12 -0
  189. package/dist/view/directives/index.d.ts.map +1 -0
  190. package/dist/view/directives/model.d.ts +7 -0
  191. package/dist/view/directives/model.d.ts.map +1 -0
  192. package/dist/view/directives/on.d.ts +7 -0
  193. package/dist/view/directives/on.d.ts.map +1 -0
  194. package/dist/view/directives/ref.d.ts +7 -0
  195. package/dist/view/directives/ref.d.ts.map +1 -0
  196. package/dist/view/directives/show.d.ts +7 -0
  197. package/dist/view/directives/show.d.ts.map +1 -0
  198. package/dist/view/directives/style.d.ts +7 -0
  199. package/dist/view/directives/style.d.ts.map +1 -0
  200. package/dist/view/directives/text.d.ts +7 -0
  201. package/dist/view/directives/text.d.ts.map +1 -0
  202. package/dist/view/evaluate.d.ts +43 -0
  203. package/dist/view/evaluate.d.ts.map +1 -0
  204. package/dist/view/index.d.ts +111 -0
  205. package/dist/view/index.d.ts.map +1 -0
  206. package/dist/view/mount.d.ts +69 -0
  207. package/dist/view/mount.d.ts.map +1 -0
  208. package/dist/view/process.d.ts +26 -0
  209. package/dist/view/process.d.ts.map +1 -0
  210. package/dist/view/types.d.ts +36 -0
  211. package/dist/view/types.d.ts.map +1 -0
  212. package/dist/view.es.mjs +426 -0
  213. package/dist/view.es.mjs.map +1 -0
  214. package/dist/watch-CXyaBC_9.js +58 -0
  215. package/dist/watch-CXyaBC_9.js.map +1 -0
  216. package/package.json +26 -14
  217. package/src/component/component.ts +289 -0
  218. package/src/component/html.ts +53 -0
  219. package/src/component/index.ts +40 -414
  220. package/src/component/props.ts +116 -0
  221. package/src/component/types.ts +85 -0
  222. package/src/core/collection.ts +588 -454
  223. package/src/core/dom.ts +38 -0
  224. package/src/core/element.ts +746 -740
  225. package/src/core/index.ts +43 -0
  226. package/src/core/utils/array.ts +102 -0
  227. package/src/core/utils/function.ts +110 -0
  228. package/src/core/utils/index.ts +83 -0
  229. package/src/core/utils/misc.ts +82 -0
  230. package/src/core/utils/number.ts +78 -0
  231. package/src/core/utils/object.ts +206 -0
  232. package/src/core/utils/string.ts +112 -0
  233. package/src/core/utils/type-guards.ts +112 -0
  234. package/src/full.ts +187 -106
  235. package/src/index.ts +36 -27
  236. package/src/motion/animate.ts +113 -0
  237. package/src/motion/easing.ts +40 -0
  238. package/src/motion/flip.ts +176 -0
  239. package/src/motion/index.ts +41 -358
  240. package/src/motion/keyframes.ts +46 -0
  241. package/src/motion/reduced-motion.ts +17 -0
  242. package/src/motion/scroll.ts +57 -0
  243. package/src/motion/spring.ts +150 -0
  244. package/src/motion/stagger.ts +43 -0
  245. package/src/motion/timeline.ts +246 -0
  246. package/src/motion/transition.ts +51 -0
  247. package/src/motion/types.ts +198 -0
  248. package/src/reactive/batch.ts +22 -0
  249. package/src/reactive/computed.ts +92 -0
  250. package/src/reactive/core.ts +93 -0
  251. package/src/reactive/effect.ts +43 -0
  252. package/src/reactive/index.ts +23 -22
  253. package/src/reactive/internals.ts +105 -0
  254. package/src/reactive/linked.ts +56 -0
  255. package/src/reactive/persisted.ts +74 -0
  256. package/src/reactive/readonly.ts +35 -0
  257. package/src/reactive/signal.ts +20 -506
  258. package/src/reactive/type-guards.ts +22 -0
  259. package/src/reactive/untrack.ts +31 -0
  260. package/src/reactive/watch.ts +73 -0
  261. package/src/router/index.ts +41 -0
  262. package/src/router/links.ts +130 -0
  263. package/src/router/match.ts +106 -0
  264. package/src/router/navigation.ts +71 -0
  265. package/src/router/query.ts +35 -0
  266. package/src/router/router.ts +211 -0
  267. package/src/router/state.ts +46 -0
  268. package/src/router/types.ts +93 -0
  269. package/src/router/utils.ts +116 -0
  270. package/src/security/constants.ts +209 -0
  271. package/src/security/csp.ts +77 -0
  272. package/src/security/index.ts +4 -12
  273. package/src/security/sanitize-core.ts +343 -0
  274. package/src/security/sanitize.ts +66 -625
  275. package/src/security/trusted-types.ts +69 -0
  276. package/src/security/types.ts +40 -0
  277. package/src/store/create-store.ts +329 -0
  278. package/src/store/define-store.ts +48 -0
  279. package/src/store/devtools.ts +45 -0
  280. package/src/store/index.ts +22 -0
  281. package/src/store/mapping.ts +73 -0
  282. package/src/store/persisted.ts +61 -0
  283. package/src/store/plugins.ts +32 -0
  284. package/src/store/registry.ts +51 -0
  285. package/src/store/types.ts +94 -0
  286. package/src/store/utils.ts +141 -0
  287. package/src/store/watch.ts +52 -0
  288. package/src/view/directives/bind.ts +23 -0
  289. package/src/view/directives/class.ts +70 -0
  290. package/src/view/directives/for.ts +275 -0
  291. package/src/view/directives/html.ts +19 -0
  292. package/src/view/directives/if.ts +30 -0
  293. package/src/view/directives/index.ts +11 -0
  294. package/src/view/directives/model.ts +56 -0
  295. package/src/view/directives/on.ts +41 -0
  296. package/src/view/directives/ref.ts +41 -0
  297. package/src/view/directives/show.ts +26 -0
  298. package/src/view/directives/style.ts +47 -0
  299. package/src/view/directives/text.ts +15 -0
  300. package/src/view/evaluate.ts +274 -0
  301. package/src/view/index.ts +112 -0
  302. package/src/view/mount.ts +200 -0
  303. package/src/view/process.ts +92 -0
  304. package/src/view/types.ts +44 -0
  305. package/dist/core/utils.d.ts +0 -313
  306. package/dist/core/utils.d.ts.map +0 -1
  307. package/src/core/utils.ts +0 -444
package/README.md CHANGED
@@ -1,323 +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
- ```
94
-
95
- ## Modules at a glance
96
-
97
- | Module | Description | Size (gzip) |
98
- | ------------- | ---------------------------------------------- | ----------- |
99
- | **Core** | Selectors, DOM manipulation, events, utilities | ~6 KB |
100
- | **Reactive** | `signal`, `computed`, `effect`, `batch` | ~1 KB |
101
- | **Component** | Lightweight Web Components with props | ~1.3 KB |
102
- | **Motion** | View transitions, FLIP animations, springs | ~1.2 KB |
103
- | **Security** | HTML sanitizing, Trusted Types, CSP | ~1.6 KB |
104
- | **Platform** | Storage, cache, notifications, buckets | ~1.7 KB |
105
-
106
- ## Quick examples
107
-
108
- ### Core DOM & events
109
-
110
- ```ts
111
- import { $, $$ } from '@bquery/bquery/core';
112
-
113
- // jQuery-style selectors
114
- $('#save').on('click', (event) => {
115
- console.log('Saved', event.type);
116
- });
117
-
118
- // Event delegation for dynamic content
119
- $('#list').delegate('click', '.item', (event, target) => {
120
- console.log('Item clicked', target.textContent);
121
- });
122
-
123
- // Method chaining
124
- $('#box').addClass('active').css({ opacity: '0.8' }).attr('data-state', 'ready');
125
-
126
- // DOM manipulation
127
- $('#content').wrap('<div class="wrapper"></div>');
128
- $('#wrapper').unwrap(); // Remove parent wrapper
129
-
130
- // Smooth scrolling
131
- $('#section').scrollTo({ behavior: 'smooth' });
132
-
133
- // Form serialization
134
- const formData = $('form').serialize(); // Returns object
135
- const queryString = $('form').serializeString(); // Returns URL-encoded string
136
-
137
- // Collections
138
- $$('.items').addClass('highlight');
139
- ```
140
-
141
- ### Reactive – signals
142
-
143
- ```ts
144
- import { signal, computed, effect, batch, watch, readonly } from '@bquery/bquery/reactive';
145
-
146
- const count = signal(0);
147
- const doubled = computed(() => count.value * 2);
148
-
149
- effect(() => {
150
- console.log('Count changed', count.value);
151
- });
152
-
153
- // Watch with cleanup support
154
- const stop = watch(count, (newVal, oldVal) => {
155
- console.log(`Changed from ${oldVal} to ${newVal}`);
156
- });
157
-
158
- // Read-only signal wrapper
159
- const readOnlyCount = readonly(count);
160
-
161
- // Batch updates for performance
162
- batch(() => {
163
- count.value++;
164
- count.value++;
165
- });
166
- ```
167
-
168
- ### Components Web Components
169
-
170
- ```ts
171
- import { component, html } from '@bquery/bquery/component';
172
-
173
- component('user-card', {
174
- props: {
175
- username: { type: String, required: true },
176
- age: { type: Number, validator: (v) => v >= 0 && v <= 150 },
177
- },
178
- // Extended lifecycle hooks
179
- beforeMount() {
180
- console.log('About to mount');
181
- },
182
- connected() {
183
- console.log('Mounted');
184
- },
185
- beforeUpdate(props) {
186
- // Return false to prevent update
187
- return props.username !== '';
188
- },
189
- onError(error) {
190
- console.error('Component error:', error);
191
- },
192
- render({ props }) {
193
- return html`<div>Hello ${props.username}</div>`;
194
- },
195
- });
196
- ```
197
-
198
- ### Motion – animations
199
-
200
- ```ts
201
- import { transition, spring } from '@bquery/bquery/motion';
202
-
203
- // View transitions (with fallback)
204
- await transition(() => {
205
- $('#content').text('Updated');
206
- });
207
-
208
- // Spring physics
209
- const x = spring(0, { stiffness: 120, damping: 14 });
210
- x.onChange((value) => {
211
- element.style.transform = `translateX(${value}px)`;
212
- });
213
- await x.to(100);
214
- ```
215
-
216
- ### Security – sanitizing
217
-
218
- ```ts
219
- import { sanitize, escapeHtml } from '@bquery/bquery/security';
220
-
221
- // Sanitize HTML (removes dangerous elements like script, iframe, svg)
222
- const safeHtml = sanitize(userInput);
223
-
224
- // DOM clobbering protection (reserved IDs are blocked)
225
- const safe = sanitize('<form id="cookie">...</form>'); // id stripped
226
-
227
- // Unicode bypass protection in URLs
228
- const urlSafe = sanitize('<a href="java\u200Bscript:alert(1)">click</a>');
229
-
230
- // Automatic link security (adds rel="noopener noreferrer" to external/target="_blank" links)
231
- const secureLink = sanitize('<a href="https://external.com" target="_blank">Link</a>');
232
-
233
- // Escape for text display
234
- const escaped = escapeHtml('<script>alert(1)</script>');
235
- ```
236
-
237
- ### Platform – storage & APIs
238
-
239
- ```ts
240
- import { storage, notifications } from '@bquery/bquery/platform';
241
-
242
- // Unified storage API
243
- const local = storage.local();
244
- await local.set('theme', 'dark');
245
- const theme = await local.get<string>('theme');
246
-
247
- // Notifications
248
- const permission = await notifications.requestPermission();
249
- if (permission === 'granted') {
250
- notifications.send('Build complete', {
251
- body: 'Your docs are ready.',
252
- });
253
- }
254
- ```
255
-
256
- ## Browser Support
257
-
258
- | Browser | Version | Support |
259
- | ------- | ------- | ------- |
260
- | Chrome | 90+ | ✅ Full |
261
- | Firefox | 90+ | ✅ Full |
262
- | Safari | 15+ | ✅ Full |
263
- | Edge | 90+ | ✅ Full |
264
-
265
- > **No IE support** by design.
266
-
267
- ## Documentation
268
-
269
- - **Getting Started**: [docs/guide/getting-started.md](docs/guide/getting-started.md)
270
- - **Core API**: [docs/guide/api-core.md](docs/guide/api-core.md)
271
- - **Agents**: [docs/guide/agents.md](docs/guide/agents.md)
272
- - **Components**: [docs/guide/components.md](docs/guide/components.md)
273
- - **Reactivity**: [docs/guide/reactive.md](docs/guide/reactive.md)
274
- - **Motion**: [docs/guide/motion.md](docs/guide/motion.md)
275
- - **Security**: [docs/guide/security.md](docs/guide/security.md)
276
- - **Platform**: [docs/guide/platform.md](docs/guide/platform.md)
277
-
278
- ## Local Development
279
-
280
- ```bash
281
- # Install dependencies
282
- bun install
283
-
284
- # Start VitePress docs
285
- bun run dev
286
-
287
- # Run Vite playground
288
- bun run playground
289
-
290
- # Run tests
291
- bun test
292
-
293
- # Build library
294
- bun run build
295
-
296
- # Generate API documentation
297
- bun run docs:api
298
- ```
299
-
300
- ## Project Structure
301
-
302
- ```text
303
- bQuery.js
304
- ├── src/
305
- │ ├── core/ # Selectors, DOM ops, events, utils
306
- │ ├── reactive/ # Signals, computed, effects
307
- │ ├── component/ # Web Components helper
308
- │ ├── motion/ # View transitions, FLIP, springs
309
- │ ├── security/ # Sanitizer, CSP, Trusted Types
310
- │ └── platform/ # Storage, cache, notifications
311
- ├── docs/ # VitePress documentation
312
- ├── playground/ # Vite demo app
313
- ├── tests/ # bun:test suites
314
- └── dist/ # Built files (ESM, UMD, IIFE)
315
- ```
316
-
317
- ## Contributing
318
-
319
- See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
320
-
321
- ## License
322
-
323
- 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
+ ### Components Web 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.