@bquery/bquery 1.5.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 (380) hide show
  1. package/README.md +193 -23
  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 +13 -5
  22. package/dist/component/component.d.ts.map +1 -1
  23. package/dist/component/html.d.ts +40 -3
  24. package/dist/component/html.d.ts.map +1 -1
  25. package/dist/component/index.d.ts +3 -2
  26. package/dist/component/index.d.ts.map +1 -1
  27. package/dist/component/library.d.ts.map +1 -1
  28. package/dist/component/scope.d.ts +138 -0
  29. package/dist/component/scope.d.ts.map +1 -0
  30. package/dist/component/types.d.ts +184 -17
  31. package/dist/component/types.d.ts.map +1 -1
  32. package/dist/component-CuuTijA6.js +684 -0
  33. package/dist/component-CuuTijA6.js.map +1 -0
  34. package/dist/component.es.mjs +10 -6
  35. package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
  36. package/dist/config-BW35FKuA.js.map +1 -0
  37. package/dist/constraints-3lV9yyBw.js +100 -0
  38. package/dist/constraints-3lV9yyBw.js.map +1 -0
  39. package/dist/core/collection.d.ts +48 -0
  40. package/dist/core/collection.d.ts.map +1 -1
  41. package/dist/core/element.d.ts +92 -0
  42. package/dist/core/element.d.ts.map +1 -1
  43. package/dist/core/env.d.ts +18 -0
  44. package/dist/core/env.d.ts.map +1 -0
  45. package/dist/core/index.d.ts +1 -0
  46. package/dist/core/index.d.ts.map +1 -1
  47. package/dist/core/shared.d.ts +8 -0
  48. package/dist/core/shared.d.ts.map +1 -1
  49. package/dist/core/utils/index.d.ts +52 -41
  50. package/dist/core/utils/index.d.ts.map +1 -1
  51. package/dist/core-Cjl7GUu8.js +717 -0
  52. package/dist/core-Cjl7GUu8.js.map +1 -0
  53. package/dist/{core-DPdbItcq.js → core-DnlyjbF2.js} +1 -1
  54. package/dist/{core-DPdbItcq.js.map → core-DnlyjbF2.js.map} +1 -1
  55. package/dist/core.es.mjs +45 -44
  56. package/dist/custom-directives-7wAShnnd.js +9 -0
  57. package/dist/custom-directives-7wAShnnd.js.map +1 -0
  58. package/dist/devtools/devtools.d.ts +212 -0
  59. package/dist/devtools/devtools.d.ts.map +1 -0
  60. package/dist/devtools/index.d.ts +20 -0
  61. package/dist/devtools/index.d.ts.map +1 -0
  62. package/dist/devtools/types.d.ts +69 -0
  63. package/dist/devtools/types.d.ts.map +1 -0
  64. package/dist/devtools-D2fQLhDN.js +122 -0
  65. package/dist/devtools-D2fQLhDN.js.map +1 -0
  66. package/dist/devtools.es.mjs +19 -0
  67. package/dist/dnd/draggable.d.ts +51 -0
  68. package/dist/dnd/draggable.d.ts.map +1 -0
  69. package/dist/dnd/droppable.d.ts +38 -0
  70. package/dist/dnd/droppable.d.ts.map +1 -0
  71. package/dist/dnd/index.d.ts +47 -0
  72. package/dist/dnd/index.d.ts.map +1 -0
  73. package/dist/dnd/sortable.d.ts +43 -0
  74. package/dist/dnd/sortable.d.ts.map +1 -0
  75. package/dist/dnd/types.d.ts +250 -0
  76. package/dist/dnd/types.d.ts.map +1 -0
  77. package/dist/dnd-B8EgyzaI.js +244 -0
  78. package/dist/dnd-B8EgyzaI.js.map +1 -0
  79. package/dist/dnd.es.mjs +6 -0
  80. package/dist/env-NeVmr4Gf.js +19 -0
  81. package/dist/env-NeVmr4Gf.js.map +1 -0
  82. package/dist/forms/create-form.d.ts +49 -0
  83. package/dist/forms/create-form.d.ts.map +1 -0
  84. package/dist/forms/index.d.ts +39 -0
  85. package/dist/forms/index.d.ts.map +1 -0
  86. package/dist/forms/types.d.ts +139 -0
  87. package/dist/forms/types.d.ts.map +1 -0
  88. package/dist/forms/validators.d.ts +179 -0
  89. package/dist/forms/validators.d.ts.map +1 -0
  90. package/dist/forms-C3yovgH9.js +141 -0
  91. package/dist/forms-C3yovgH9.js.map +1 -0
  92. package/dist/forms.es.mjs +14 -0
  93. package/dist/full.d.ts +37 -9
  94. package/dist/full.d.ts.map +1 -1
  95. package/dist/full.es.mjs +186 -91
  96. package/dist/full.iife.js +47 -31
  97. package/dist/full.iife.js.map +1 -1
  98. package/dist/full.umd.js +47 -31
  99. package/dist/full.umd.js.map +1 -1
  100. package/dist/i18n/formatting.d.ts +40 -0
  101. package/dist/i18n/formatting.d.ts.map +1 -0
  102. package/dist/i18n/i18n.d.ts +48 -0
  103. package/dist/i18n/i18n.d.ts.map +1 -0
  104. package/dist/i18n/index.d.ts +57 -0
  105. package/dist/i18n/index.d.ts.map +1 -0
  106. package/dist/i18n/translate.d.ts +83 -0
  107. package/dist/i18n/translate.d.ts.map +1 -0
  108. package/dist/i18n/types.d.ts +156 -0
  109. package/dist/i18n/types.d.ts.map +1 -0
  110. package/dist/i18n-BnnhTFOS.js +89 -0
  111. package/dist/i18n-BnnhTFOS.js.map +1 -0
  112. package/dist/i18n.es.mjs +6 -0
  113. package/dist/index.d.ts +11 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.es.mjs +233 -138
  116. package/dist/media/battery.d.ts +35 -0
  117. package/dist/media/battery.d.ts.map +1 -0
  118. package/dist/media/breakpoints.d.ts +51 -0
  119. package/dist/media/breakpoints.d.ts.map +1 -0
  120. package/dist/media/clipboard.d.ts +30 -0
  121. package/dist/media/clipboard.d.ts.map +1 -0
  122. package/dist/media/device-sensors.d.ts +54 -0
  123. package/dist/media/device-sensors.d.ts.map +1 -0
  124. package/dist/media/geolocation.d.ts +38 -0
  125. package/dist/media/geolocation.d.ts.map +1 -0
  126. package/dist/media/index.d.ts +42 -0
  127. package/dist/media/index.d.ts.map +1 -0
  128. package/dist/media/media-query.d.ts +36 -0
  129. package/dist/media/media-query.d.ts.map +1 -0
  130. package/dist/media/network.d.ts +35 -0
  131. package/dist/media/network.d.ts.map +1 -0
  132. package/dist/media/types.d.ts +173 -0
  133. package/dist/media/types.d.ts.map +1 -0
  134. package/dist/media/viewport.d.ts +32 -0
  135. package/dist/media/viewport.d.ts.map +1 -0
  136. package/dist/media-Di2Ta22s.js +340 -0
  137. package/dist/media-Di2Ta22s.js.map +1 -0
  138. package/dist/media.es.mjs +12 -0
  139. package/dist/motion/index.d.ts +7 -3
  140. package/dist/motion/index.d.ts.map +1 -1
  141. package/dist/motion/morph.d.ts +27 -0
  142. package/dist/motion/morph.d.ts.map +1 -0
  143. package/dist/motion/parallax.d.ts +30 -0
  144. package/dist/motion/parallax.d.ts.map +1 -0
  145. package/dist/motion/reduced-motion.d.ts +36 -3
  146. package/dist/motion/reduced-motion.d.ts.map +1 -1
  147. package/dist/motion/types.d.ts +58 -0
  148. package/dist/motion/types.d.ts.map +1 -1
  149. package/dist/motion/typewriter.d.ts +31 -0
  150. package/dist/motion/typewriter.d.ts.map +1 -0
  151. package/dist/motion-qPj_TYGv.js +530 -0
  152. package/dist/motion-qPj_TYGv.js.map +1 -0
  153. package/dist/motion.es.mjs +27 -23
  154. package/dist/mount-SM07RUa6.js +403 -0
  155. package/dist/mount-SM07RUa6.js.map +1 -0
  156. package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
  157. package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
  158. package/dist/{platform-B7JhGBc7.js → platform-CPbCprb6.js} +3 -3
  159. package/dist/platform-CPbCprb6.js.map +1 -0
  160. package/dist/platform.es.mjs +2 -2
  161. package/dist/plugin/index.d.ts +22 -0
  162. package/dist/plugin/index.d.ts.map +1 -0
  163. package/dist/plugin/registry.d.ts +108 -0
  164. package/dist/plugin/registry.d.ts.map +1 -0
  165. package/dist/plugin/types.d.ts +110 -0
  166. package/dist/plugin/types.d.ts.map +1 -0
  167. package/dist/plugin-cPoOHFLY.js +64 -0
  168. package/dist/plugin-cPoOHFLY.js.map +1 -0
  169. package/dist/plugin.es.mjs +9 -0
  170. package/dist/reactive/computed.d.ts +7 -0
  171. package/dist/reactive/computed.d.ts.map +1 -1
  172. package/dist/reactive-Cfv0RK6x.js +233 -0
  173. package/dist/reactive-Cfv0RK6x.js.map +1 -0
  174. package/dist/reactive.es.mjs +18 -17
  175. package/dist/registry-CWf368tT.js +26 -0
  176. package/dist/registry-CWf368tT.js.map +1 -0
  177. package/dist/router/bq-link.d.ts +112 -0
  178. package/dist/router/bq-link.d.ts.map +1 -0
  179. package/dist/router/constraints.d.ts +9 -0
  180. package/dist/router/constraints.d.ts.map +1 -0
  181. package/dist/router/index.d.ts +14 -6
  182. package/dist/router/index.d.ts.map +1 -1
  183. package/dist/router/match.d.ts +0 -1
  184. package/dist/router/match.d.ts.map +1 -1
  185. package/dist/router/path-pattern.d.ts +14 -0
  186. package/dist/router/path-pattern.d.ts.map +1 -0
  187. package/dist/router/query.d.ts.map +1 -1
  188. package/dist/router/router.d.ts +3 -1
  189. package/dist/router/router.d.ts.map +1 -1
  190. package/dist/router/types.d.ts +48 -4
  191. package/dist/router/types.d.ts.map +1 -1
  192. package/dist/router/use-route.d.ts +50 -0
  193. package/dist/router/use-route.d.ts.map +1 -0
  194. package/dist/router/utils.d.ts +3 -0
  195. package/dist/router/utils.d.ts.map +1 -1
  196. package/dist/router-BrthaP_z.js +473 -0
  197. package/dist/router-BrthaP_z.js.map +1 -0
  198. package/dist/router.es.mjs +13 -10
  199. package/dist/{sanitize-jyJ2ryE2.js → sanitize-B1V4JswB.js} +95 -83
  200. package/dist/sanitize-B1V4JswB.js.map +1 -0
  201. package/dist/security/index.d.ts +2 -0
  202. package/dist/security/index.d.ts.map +1 -1
  203. package/dist/security/sanitize.d.ts +4 -1
  204. package/dist/security/sanitize.d.ts.map +1 -1
  205. package/dist/security/trusted-html.d.ts +53 -0
  206. package/dist/security/trusted-html.d.ts.map +1 -0
  207. package/dist/security.es.mjs +10 -9
  208. package/dist/ssr/hydrate.d.ts +65 -0
  209. package/dist/ssr/hydrate.d.ts.map +1 -0
  210. package/dist/ssr/index.d.ts +59 -0
  211. package/dist/ssr/index.d.ts.map +1 -0
  212. package/dist/ssr/render.d.ts +62 -0
  213. package/dist/ssr/render.d.ts.map +1 -0
  214. package/dist/ssr/serialize.d.ts +118 -0
  215. package/dist/ssr/serialize.d.ts.map +1 -0
  216. package/dist/ssr/types.d.ts +70 -0
  217. package/dist/ssr/types.d.ts.map +1 -0
  218. package/dist/ssr-B2qd_WBB.js +248 -0
  219. package/dist/ssr-B2qd_WBB.js.map +1 -0
  220. package/dist/ssr.es.mjs +9 -0
  221. package/dist/store/create-store.d.ts.map +1 -1
  222. package/dist/store/define-store.d.ts +1 -1
  223. package/dist/store/define-store.d.ts.map +1 -1
  224. package/dist/store/index.d.ts +1 -1
  225. package/dist/store/index.d.ts.map +1 -1
  226. package/dist/store/mapping.d.ts +1 -1
  227. package/dist/store/mapping.d.ts.map +1 -1
  228. package/dist/store/persisted.d.ts +38 -4
  229. package/dist/store/persisted.d.ts.map +1 -1
  230. package/dist/store/types.d.ts +140 -3
  231. package/dist/store/types.d.ts.map +1 -1
  232. package/dist/store/utils.d.ts +2 -2
  233. package/dist/store/utils.d.ts.map +1 -1
  234. package/dist/store/watch.d.ts +1 -1
  235. package/dist/store/watch.d.ts.map +1 -1
  236. package/dist/store-DWpyH6p5.js +338 -0
  237. package/dist/store-DWpyH6p5.js.map +1 -0
  238. package/dist/store.es.mjs +11 -10
  239. package/dist/storybook/index.d.ts +37 -0
  240. package/dist/storybook/index.d.ts.map +1 -0
  241. package/dist/storybook.es.mjs +151 -0
  242. package/dist/storybook.es.mjs.map +1 -0
  243. package/dist/testing/index.d.ts +23 -0
  244. package/dist/testing/index.d.ts.map +1 -0
  245. package/dist/testing/testing.d.ts +156 -0
  246. package/dist/testing/testing.d.ts.map +1 -0
  247. package/dist/testing/types.d.ts +134 -0
  248. package/dist/testing/types.d.ts.map +1 -0
  249. package/dist/testing-CsqjNUyy.js +224 -0
  250. package/dist/testing-CsqjNUyy.js.map +1 -0
  251. package/dist/testing.es.mjs +9 -0
  252. package/dist/type-guards-Do9DWgNp.js +44 -0
  253. package/dist/type-guards-Do9DWgNp.js.map +1 -0
  254. package/dist/untrack-DJVQQ2WM.js +33 -0
  255. package/dist/untrack-DJVQQ2WM.js.map +1 -0
  256. package/dist/view/custom-directives.d.ts +20 -0
  257. package/dist/view/custom-directives.d.ts.map +1 -0
  258. package/dist/view/evaluate.d.ts.map +1 -1
  259. package/dist/view/process.d.ts.map +1 -1
  260. package/dist/view.es.mjs +11 -10
  261. package/package.json +52 -11
  262. package/src/a11y/announce.ts +131 -0
  263. package/src/a11y/audit.ts +314 -0
  264. package/src/a11y/index.ts +68 -0
  265. package/src/a11y/media-preferences.ts +255 -0
  266. package/src/a11y/roving-tab-index.ts +164 -0
  267. package/src/a11y/skip-link.ts +255 -0
  268. package/src/a11y/trap-focus.ts +184 -0
  269. package/src/a11y/types.ts +183 -0
  270. package/src/component/component.ts +345 -65
  271. package/src/component/html.ts +153 -53
  272. package/src/component/index.ts +12 -2
  273. package/src/component/library.ts +66 -28
  274. package/src/component/scope.ts +212 -0
  275. package/src/component/types.ts +238 -19
  276. package/src/core/collection.ts +707 -628
  277. package/src/core/element.ts +981 -774
  278. package/src/core/env.ts +60 -0
  279. package/src/core/index.ts +49 -48
  280. package/src/core/shared.ts +62 -13
  281. package/src/core/utils/index.ts +148 -83
  282. package/src/devtools/devtools.ts +410 -0
  283. package/src/devtools/index.ts +48 -0
  284. package/src/devtools/types.ts +104 -0
  285. package/src/dnd/draggable.ts +296 -0
  286. package/src/dnd/droppable.ts +228 -0
  287. package/src/dnd/index.ts +62 -0
  288. package/src/dnd/sortable.ts +307 -0
  289. package/src/dnd/types.ts +293 -0
  290. package/src/forms/create-form.ts +278 -0
  291. package/src/forms/index.ts +65 -0
  292. package/src/forms/types.ts +154 -0
  293. package/src/forms/validators.ts +265 -0
  294. package/src/full.ts +260 -3
  295. package/src/i18n/formatting.ts +67 -0
  296. package/src/i18n/i18n.ts +200 -0
  297. package/src/i18n/index.ts +67 -0
  298. package/src/i18n/translate.ts +182 -0
  299. package/src/i18n/types.ts +171 -0
  300. package/src/index.ts +108 -36
  301. package/src/media/battery.ts +116 -0
  302. package/src/media/breakpoints.ts +131 -0
  303. package/src/media/clipboard.ts +80 -0
  304. package/src/media/device-sensors.ts +158 -0
  305. package/src/media/geolocation.ts +119 -0
  306. package/src/media/index.ts +76 -0
  307. package/src/media/media-query.ts +92 -0
  308. package/src/media/network.ts +115 -0
  309. package/src/media/types.ts +177 -0
  310. package/src/media/viewport.ts +84 -0
  311. package/src/motion/index.ts +57 -48
  312. package/src/motion/morph.ts +151 -0
  313. package/src/motion/parallax.ts +120 -0
  314. package/src/motion/reduced-motion.ts +66 -17
  315. package/src/motion/transition.ts +97 -97
  316. package/src/motion/types.ts +63 -0
  317. package/src/motion/typewriter.ts +164 -0
  318. package/src/platform/announcer.ts +208 -208
  319. package/src/platform/config.ts +163 -163
  320. package/src/platform/cookies.ts +165 -165
  321. package/src/platform/index.ts +39 -39
  322. package/src/platform/meta.ts +168 -168
  323. package/src/plugin/index.ts +37 -0
  324. package/src/plugin/registry.ts +269 -0
  325. package/src/plugin/types.ts +137 -0
  326. package/src/reactive/async-data.ts +486 -486
  327. package/src/reactive/computed.ts +130 -92
  328. package/src/reactive/index.ts +37 -37
  329. package/src/reactive/signal.ts +29 -29
  330. package/src/router/bq-link.ts +279 -0
  331. package/src/router/constraints.ts +201 -0
  332. package/src/router/index.ts +49 -41
  333. package/src/router/match.ts +312 -106
  334. package/src/router/path-pattern.ts +52 -0
  335. package/src/router/query.ts +38 -35
  336. package/src/router/router.ts +402 -211
  337. package/src/router/types.ts +139 -93
  338. package/src/router/use-route.ts +68 -0
  339. package/src/router/utils.ts +157 -116
  340. package/src/security/constants.ts +211 -211
  341. package/src/security/index.ts +12 -10
  342. package/src/security/sanitize.ts +6 -2
  343. package/src/security/trusted-html.ts +71 -0
  344. package/src/ssr/hydrate.ts +82 -0
  345. package/src/ssr/index.ts +70 -0
  346. package/src/ssr/render.ts +508 -0
  347. package/src/ssr/serialize.ts +296 -0
  348. package/src/ssr/types.ts +81 -0
  349. package/src/store/create-store.ts +467 -329
  350. package/src/store/define-store.ts +2 -1
  351. package/src/store/index.ts +27 -22
  352. package/src/store/mapping.ts +2 -1
  353. package/src/store/persisted.ts +249 -61
  354. package/src/store/types.ts +247 -94
  355. package/src/store/utils.ts +135 -141
  356. package/src/store/watch.ts +2 -1
  357. package/src/storybook/index.ts +480 -0
  358. package/src/testing/index.ts +42 -0
  359. package/src/testing/testing.ts +593 -0
  360. package/src/testing/types.ts +170 -0
  361. package/src/view/custom-directives.ts +30 -0
  362. package/src/view/evaluate.ts +292 -290
  363. package/src/view/process.ts +108 -92
  364. package/dist/component-CY5MVoYN.js +0 -531
  365. package/dist/component-CY5MVoYN.js.map +0 -1
  366. package/dist/config-DRmZZno3.js.map +0 -1
  367. package/dist/core-CK2Mfpf4.js +0 -648
  368. package/dist/core-CK2Mfpf4.js.map +0 -1
  369. package/dist/motion-C5DRdPnO.js +0 -415
  370. package/dist/motion-C5DRdPnO.js.map +0 -1
  371. package/dist/platform-B7JhGBc7.js.map +0 -1
  372. package/dist/reactive-BDya-ia8.js +0 -253
  373. package/dist/reactive-BDya-ia8.js.map +0 -1
  374. package/dist/router-CijiICxt.js +0 -188
  375. package/dist/router-CijiICxt.js.map +0 -1
  376. package/dist/sanitize-jyJ2ryE2.js.map +0 -1
  377. package/dist/store-CPK9E62U.js +0 -262
  378. package/dist/store-CPK9E62U.js.map +0 -1
  379. package/dist/view-Cdi0g-qo.js +0 -396
  380. package/dist/view-Cdi0g-qo.js.map +0 -1
package/README.md CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  **The jQuery for the modern Web Platform.**
22
22
 
23
- bQuery.js is a slim, TypeScript-first library that combines jQuery's direct DOM workflow with modern features like reactivity, async data composables, Web Components, motion utilities, routing, stores, and declarative views — without a mandatory build step.
23
+ bQuery.js is a slim, TypeScript-first library that combines jQuery's direct DOM workflow with modern features like reactivity, async data composables, Web Components, motion utilities, routing, stores, declarative views, accessibility helpers, forms, i18n, media signals, drag-and-drop, plugins, devtools, testing utilities, and SSR — without a mandatory build step.
24
24
 
25
25
  ## Highlights
26
26
 
@@ -30,7 +30,7 @@ bQuery.js is a slim, TypeScript-first library that combines jQuery's direct DOM
30
30
  - **Modular**: the core stays small; extra modules are opt-in.
31
31
  - **TypeScript-first**: clear types and strong IDE support.
32
32
  - **Tree-shakeable**: import only what you need.
33
- - **Storybook-ready**: default components can be previewed and developed in Storybook.
33
+ - **Storybook-ready**: default components can be previewed and developed in Storybook with dedicated story template helpers.
34
34
 
35
35
  ## Installation
36
36
 
@@ -112,6 +112,7 @@ import {
112
112
 
113
113
  // Components only
114
114
  import {
115
+ bool,
115
116
  component,
116
117
  defineComponent,
117
118
  html,
@@ -122,7 +123,7 @@ import {
122
123
  import { transition, spring, animate, timeline } from '@bquery/bquery/motion';
123
124
 
124
125
  // Security only
125
- import { sanitize } from '@bquery/bquery/security';
126
+ import { sanitize, sanitizeHtml, trusted } from '@bquery/bquery/security';
126
127
 
127
128
  // Platform only
128
129
  import { storage, cache, useCookie, definePageMeta, useAnnouncer } from '@bquery/bquery/platform';
@@ -131,21 +132,49 @@ import { storage, cache, useCookie, definePageMeta, useAnnouncer } from '@bquery
131
132
  import { createRouter, navigate } from '@bquery/bquery/router';
132
133
  import { createStore, defineStore } from '@bquery/bquery/store';
133
134
  import { mount, createTemplate } from '@bquery/bquery/view';
135
+
136
+ // Forms, i18n, accessibility, drag & drop, media
137
+ import { createForm, required, email } from '@bquery/bquery/forms';
138
+ import { createI18n } from '@bquery/bquery/i18n';
139
+ import { trapFocus, rovingTabIndex } from '@bquery/bquery/a11y';
140
+ import { draggable, droppable, sortable } from '@bquery/bquery/dnd';
141
+ import { mediaQuery, useViewport, clipboard } from '@bquery/bquery/media';
142
+
143
+ // Plugins, devtools, testing, SSR
144
+ import { use } from '@bquery/bquery/plugin';
145
+ import { enableDevtools, inspectSignals } from '@bquery/bquery/devtools';
146
+ import { renderComponent, fireEvent, waitFor } from '@bquery/bquery/testing';
147
+ import { renderToString, hydrateMount, serializeStoreState } from '@bquery/bquery/ssr';
148
+
149
+ // Storybook helpers
150
+ import { storyHtml, when } from '@bquery/bquery/storybook';
134
151
  ```
135
152
 
136
153
  ## Modules at a glance
137
154
 
138
- | Module | Description | Size (gzip) |
139
- | ------------- | -------------------------------------------------- | ----------- |
140
- | **Core** | Selectors, DOM manipulation, events, utilities | ~11.3 KB |
141
- | **Reactive** | `signal`, `computed`, `effect`, async data/fetch | ~0.3 KB |
142
- | **Component** | Lightweight Web Components with props + defaults | ~1.9 KB |
143
- | **Motion** | View transitions, FLIP, timelines, scroll, springs | ~4.0 KB |
144
- | **Security** | HTML sanitizing, Trusted Types, CSP | ~0.7 KB |
145
- | **Platform** | Storage, cache, cookies, meta, announcers, config | ~2.2 KB |
146
- | **Router** | SPA routing, navigation guards, history API | ~2.2 KB |
147
- | **Store** | Signal-based state management, persistence | ~0.3 KB |
148
- | **View** | Declarative DOM bindings, directives | ~4.3 KB |
155
+ | Module | Description |
156
+ | ------------- | ------------------------------------------------------------------------------------- |
157
+ | **Core** | Selectors, DOM manipulation, events, traversal, and typed utilities |
158
+ | **Reactive** | `signal`, `computed`, `effect`, batching, async data, and fetch composables |
159
+ | **Component** | Typed Web Components with scoped reactivity and configurable Shadow DOM |
160
+ | **Storybook** | Safe story template helpers with boolean-attribute shorthand |
161
+ | **Motion** | View transitions, FLIP, morphing, parallax, typewriter, springs, and timelines |
162
+ | **Security** | HTML sanitization, Trusted Types, CSP helpers, and trusted fragment composition |
163
+ | **Platform** | Storage, cache, cookies, page metadata, announcers, and shared runtime config |
164
+ | **Router** | SPA routing, constrained params, redirects, guards, `useRoute()`, and `<bq-link>` |
165
+ | **Store** | Signal-based state management, persistence, migrations, and action hooks |
166
+ | **View** | Declarative DOM bindings, directives, and plugin-provided custom directives |
167
+ | **Forms** | Reactive form state with sync/async validation and submit handling |
168
+ | **i18n** | Reactive locales, interpolation, pluralization, lazy loading, and Intl formatting |
169
+ | **A11y** | Focus traps, live-region announcements, roving tabindex, skip links, and audits |
170
+ | **DnD** | Draggable elements, droppable zones, and sortable lists |
171
+ | **Media** | Reactive browser/device signals for viewport, network, battery, geolocation, and more |
172
+ | **Plugin** | Global plugin registration for custom directives and Web Components |
173
+ | **Devtools** | Runtime inspection helpers for signals, stores, components, and timelines |
174
+ | **Testing** | Component mounting, mock signals/router helpers, and async test utilities |
175
+ | **SSR** | Server-side rendering, hydration, and store-state serialization |
176
+
177
+ Storybook authoring helpers are also available as a dedicated entry point via `@bquery/bquery/storybook`.
149
178
 
150
179
  ## Quick examples
151
180
 
@@ -247,45 +276,76 @@ console.log(user.pending.value, user.data.value, settings.error.value);
247
276
 
248
277
  ```ts
249
278
  import {
279
+ bool,
250
280
  component,
251
281
  defineComponent,
252
282
  html,
253
283
  registerDefaultComponents,
284
+ safeHtml,
254
285
  } from '@bquery/bquery/component';
286
+ import { sanitizeHtml, trusted } from '@bquery/bquery/security';
287
+
288
+ const badge = trusted(sanitizeHtml('<span class="badge">Active</span>'));
255
289
 
256
290
  component('user-card', {
257
291
  props: {
258
292
  username: { type: String, required: true },
259
293
  age: { type: Number, validator: (v) => v >= 0 && v <= 150 },
260
294
  },
295
+ state: { count: 0 },
261
296
  beforeMount() {
262
297
  console.log('About to mount');
263
298
  },
264
299
  connected() {
265
300
  console.log('Mounted');
266
301
  },
267
- beforeUpdate(props) {
268
- return props.username !== '';
302
+ beforeUpdate(newProps, oldProps) {
303
+ return newProps.username !== oldProps.username;
304
+ },
305
+ updated(change) {
306
+ console.log('Updated because of', change?.name ?? 'state/signal change');
269
307
  },
270
308
  onError(error) {
271
309
  console.error('Component error:', error);
272
310
  },
273
- render({ props }) {
274
- return html`<div>Hello ${props.username}</div>`;
311
+ render({ props, state }) {
312
+ return safeHtml`
313
+ <button class="user-card" ${bool('disabled', state.count > 3)}>
314
+ ${badge}
315
+ <span>Hello ${props.username}</span>
316
+ </button>
317
+ `;
275
318
  },
276
319
  });
277
320
 
278
- const UserCard = defineComponent('user-card', {
321
+ const UserCard = defineComponent('user-card-manual', {
279
322
  props: { username: { type: String, required: true } },
280
323
  render: ({ props }) => html`<div>Hello ${props.username}</div>`,
281
324
  });
282
325
 
283
- customElements.define('user-card', UserCard);
326
+ customElements.define('user-card-manual', UserCard);
284
327
 
285
328
  const tags = registerDefaultComponents({ prefix: 'ui' });
286
329
  console.log(tags.button); // ui-button
287
330
  ```
288
331
 
332
+ ### Storybook – authoring helpers
333
+
334
+ ```ts
335
+ import { storyHtml, when } from '@bquery/bquery/storybook';
336
+
337
+ export const Primary = {
338
+ args: { disabled: false, label: 'Save' },
339
+ render: ({ disabled, label }) =>
340
+ storyHtml`
341
+ <ui-card>
342
+ <ui-button ?disabled=${disabled}>${label}</ui-button>
343
+ ${when(!disabled, '<small>Ready to submit</small>')}
344
+ </ui-card>
345
+ `,
346
+ };
347
+ ```
348
+
289
349
  ### Motion – animations
290
350
 
291
351
  ```ts
@@ -315,15 +375,18 @@ await x.to(100);
315
375
  ### Security – sanitizing
316
376
 
317
377
  ```ts
318
- import { sanitize, escapeHtml } from '@bquery/bquery/security';
378
+ import { sanitize, escapeHtml, sanitizeHtml, trusted } from '@bquery/bquery/security';
379
+ import { safeHtml } from '@bquery/bquery/component';
319
380
 
320
- const safeHtml = sanitize(userInput);
381
+ const safeMarkup = sanitize(userInput);
321
382
  const safe = sanitize('<form id="cookie">...</form>');
322
383
  const urlSafe = sanitize('<a href="java\u200Bscript:alert(1)">click</a>');
323
384
  const secureLink = sanitize('<a href="https://external.com" target="_blank">Link</a>');
324
385
  const safeSrcset = sanitize('<img srcset="safe.jpg 1x, javascript:alert(1) 2x">');
325
386
  const safeForm = sanitize('<form action="javascript:alert(1)">...</form>');
326
387
  const escaped = escapeHtml('<script>alert(1)</script>');
388
+ const icon = trusted(sanitizeHtml('<span class="icon">♥</span>'));
389
+ const button = safeHtml`<button>${icon}<span>Save</span></button>`;
327
390
  ```
328
391
 
329
392
  ### Platform – config, cookies & accessibility
@@ -389,6 +452,93 @@ effect(() => {
389
452
  });
390
453
  ```
391
454
 
455
+ ### Forms – reactive validation
456
+
457
+ ```ts
458
+ import { createForm, email, required } from '@bquery/bquery/forms';
459
+
460
+ const form = createForm({
461
+ fields: {
462
+ name: { initialValue: '', validators: [required()] },
463
+ email: { initialValue: '', validators: [required(), email()] },
464
+ },
465
+ onSubmit: async (values) => {
466
+ await fetch('/api/signup', {
467
+ method: 'POST',
468
+ body: JSON.stringify(values),
469
+ });
470
+ },
471
+ });
472
+
473
+ await form.handleSubmit();
474
+ console.log(form.isValid.value, form.fields.email.error.value);
475
+ ```
476
+
477
+ ### i18n – locale-aware content
478
+
479
+ ```ts
480
+ import { createI18n } from '@bquery/bquery/i18n';
481
+
482
+ const i18n = createI18n({
483
+ locale: 'en',
484
+ fallbackLocale: 'en',
485
+ messages: {
486
+ en: { greeting: 'Hello, {name}!' },
487
+ de: { greeting: 'Hallo, {name}!' },
488
+ },
489
+ });
490
+
491
+ console.log(i18n.t('greeting', { name: 'Ada' }));
492
+ i18n.$locale.value = 'de';
493
+ ```
494
+
495
+ ### Accessibility, media, and drag & drop
496
+
497
+ ```ts
498
+ import { trapFocus, announceToScreenReader } from '@bquery/bquery/a11y';
499
+ import { mediaQuery, useViewport } from '@bquery/bquery/media';
500
+ import { draggable } from '@bquery/bquery/dnd';
501
+
502
+ const modalTrap = trapFocus(document.querySelector('#dialog')!);
503
+ announceToScreenReader('Dialog opened');
504
+
505
+ const isDark = mediaQuery('(prefers-color-scheme: dark)');
506
+ const viewport = useViewport();
507
+ const drag = draggable(document.querySelector('#card')!, { bounds: 'parent' });
508
+
509
+ console.log(isDark.value, viewport.value.width);
510
+
511
+ drag.destroy();
512
+ modalTrap.release();
513
+ ```
514
+
515
+ ### Plugins, devtools, testing, and SSR
516
+
517
+ ```ts
518
+ import { use } from '@bquery/bquery/plugin';
519
+ import { enableDevtools, getTimeline } from '@bquery/bquery/devtools';
520
+ import { renderComponent, fireEvent } from '@bquery/bquery/testing';
521
+ import { renderToString } from '@bquery/bquery/ssr';
522
+
523
+ use({
524
+ name: 'focus-plugin',
525
+ install(ctx) {
526
+ ctx.directive('focus', (el) => (el as HTMLElement).focus());
527
+ },
528
+ });
529
+
530
+ enableDevtools(true, { logToConsole: true });
531
+ console.log(getTimeline());
532
+
533
+ const mounted = renderComponent('ui-button', { props: { variant: 'primary' } });
534
+ fireEvent(mounted.el, 'click');
535
+
536
+ const { html } = renderToString('<p bq-text="label"></p>', { label: 'Hello SSR' });
537
+ console.log(html);
538
+
539
+ mounted.unmount();
540
+ ```
541
+
392
542
  ### Store – state management
393
543
 
394
544
  ```ts
@@ -475,6 +625,7 @@ mount('#app', {
475
625
  - **Core API**: [docs/guide/api-core.md](docs/guide/api-core.md)
476
626
  - **Agents**: [docs/guide/agents.md](docs/guide/agents.md)
477
627
  - **Components**: [docs/guide/components.md](docs/guide/components.md)
628
+ - **Storybook**: [docs/guide/storybook.md](docs/guide/storybook.md)
478
629
  - **Reactivity**: [docs/guide/reactive.md](docs/guide/reactive.md)
479
630
  - **Motion**: [docs/guide/motion.md](docs/guide/motion.md)
480
631
  - **Security**: [docs/guide/security.md](docs/guide/security.md)
@@ -482,6 +633,15 @@ mount('#app', {
482
633
  - **Router**: [docs/guide/router.md](docs/guide/router.md)
483
634
  - **Store**: [docs/guide/store.md](docs/guide/store.md)
484
635
  - **View**: [docs/guide/view.md](docs/guide/view.md)
636
+ - **Forms**: [docs/guide/forms.md](docs/guide/forms.md)
637
+ - **i18n**: [docs/guide/i18n.md](docs/guide/i18n.md)
638
+ - **Accessibility**: [docs/guide/a11y.md](docs/guide/a11y.md)
639
+ - **Drag & Drop**: [docs/guide/dnd.md](docs/guide/dnd.md)
640
+ - **Media**: [docs/guide/media.md](docs/guide/media.md)
641
+ - **Plugin System**: [docs/guide/plugin.md](docs/guide/plugin.md)
642
+ - **Devtools**: [docs/guide/devtools.md](docs/guide/devtools.md)
643
+ - **Testing Utilities**: [docs/guide/testing.md](docs/guide/testing.md)
644
+ - **SSR / Hydration**: [docs/guide/ssr.md](docs/guide/ssr.md)
485
645
 
486
646
  ## Local Development
487
647
 
@@ -516,12 +676,22 @@ bQuery.js
516
676
  │ ├── core/ # Selectors, DOM ops, events, utils
517
677
  │ ├── reactive/ # Signals, computed, effects, async data
518
678
  │ ├── component/ # Web Components helper + default library
679
+ │ ├── storybook/ # Story template helpers
519
680
  │ ├── motion/ # View transitions, FLIP, springs
520
681
  │ ├── security/ # Sanitizer, CSP, Trusted Types
521
682
  │ ├── platform/ # Storage, cache, cookies, meta, config
522
683
  │ ├── router/ # SPA routing, navigation guards
523
684
  │ ├── store/ # State management, persistence
524
- └── view/ # Declarative DOM bindings
685
+ ├── view/ # Declarative DOM bindings
686
+ │ ├── forms/ # Reactive forms + validators
687
+ │ ├── i18n/ # Internationalization + formatting
688
+ │ ├── a11y/ # Accessibility utilities
689
+ │ ├── dnd/ # Drag & drop helpers
690
+ │ ├── media/ # Browser and device reactive signals
691
+ │ ├── plugin/ # Global plugin system
692
+ │ ├── devtools/ # Runtime inspection helpers
693
+ │ ├── testing/ # Test utilities
694
+ │ └── ssr/ # Server-side rendering + hydration
525
695
  ├── docs/ # VitePress documentation
526
696
  ├── .storybook/ # Storybook config
527
697
  ├── stories/ # Component stories
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Screen reader announcement utility using ARIA live regions.
3
+ *
4
+ * Creates and manages off-screen live regions to announce dynamic
5
+ * content changes to assistive technologies.
6
+ *
7
+ * @module bquery/a11y
8
+ */
9
+ import type { AnnouncePriority } from './types';
10
+ /**
11
+ * Announces a message to screen readers via an ARIA live region.
12
+ *
13
+ * The message is injected into a visually-hidden live region element.
14
+ * Screen readers will pick up the change and announce it to the user.
15
+ *
16
+ * @param message - The text message to announce
17
+ * @param priority - The urgency level: `'polite'` (default) or `'assertive'`
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import { announceToScreenReader } from '@bquery/bquery/a11y';
22
+ *
23
+ * // Polite announcement (waits for idle)
24
+ * announceToScreenReader('3 search results found');
25
+ *
26
+ * // Assertive announcement (interrupts current speech)
27
+ * announceToScreenReader('Error: Please fix the form', 'assertive');
28
+ * ```
29
+ */
30
+ export declare const announceToScreenReader: (message: string, priority?: AnnouncePriority) => void;
31
+ /**
32
+ * Removes all live region elements created by `announceToScreenReader`.
33
+ * Useful for cleanup in tests or when unmounting an application.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * import { clearAnnouncements } from '@bquery/bquery/a11y';
38
+ *
39
+ * clearAnnouncements();
40
+ * ```
41
+ */
42
+ export declare const clearAnnouncements: () => void;
43
+ //# sourceMappingURL=announce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"announce.d.ts","sourceRoot":"","sources":["../../src/a11y/announce.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAoDhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,MAAM,EACf,WAAU,gBAA2B,KACpC,IAuBF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,QAAO,IAUrC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Development-time accessibility audit utility.
3
+ *
4
+ * Scans DOM elements for common accessibility issues such as missing
5
+ * alt text on images, missing labels on form inputs, empty links/buttons,
6
+ * and incorrect ARIA usage.
7
+ *
8
+ * @module bquery/a11y
9
+ */
10
+ import type { AuditResult } from './types';
11
+ /**
12
+ * Runs a development-time accessibility audit on a container element.
13
+ *
14
+ * Checks for common accessibility issues including:
15
+ * - Missing alt text on images
16
+ * - Missing labels on form inputs
17
+ * - Empty buttons and links
18
+ * - Heading hierarchy issues
19
+ * - Invalid ARIA references
20
+ * - Missing document landmarks
21
+ *
22
+ * This is intended as a development tool — not a replacement for
23
+ * manual testing or professional accessibility audits.
24
+ *
25
+ * @param container - The element to audit (defaults to `document.body`)
26
+ * @returns An audit result with findings, counts, and pass/fail status
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { auditA11y } from '@bquery/bquery/a11y';
31
+ *
32
+ * const result = auditA11y();
33
+ * if (!result.passed) {
34
+ * console.warn(`Found ${result.errors} accessibility errors:`);
35
+ * for (const f of result.findings) {
36
+ * console.warn(`[${f.severity}] ${f.message}`, f.element);
37
+ * }
38
+ * }
39
+ * ```
40
+ */
41
+ export declare const auditA11y: (container?: Element) => AuditResult;
42
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/a11y/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAiB,MAAM,SAAS,CAAC;AAmPxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,SAAS,GAAI,YAAY,OAAO,KAAG,WA8B/C,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Accessibility (a11y) utilities module for bQuery.js.
3
+ *
4
+ * Provides essential accessibility helpers for building inclusive
5
+ * web applications: focus trapping, screen reader announcements,
6
+ * keyboard navigation patterns, skip navigation, media preference
7
+ * signals, and development-time auditing.
8
+ *
9
+ * @module bquery/a11y
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import {
14
+ * trapFocus,
15
+ * announceToScreenReader,
16
+ * rovingTabIndex,
17
+ * skipLink,
18
+ * prefersReducedMotion,
19
+ * prefersColorScheme,
20
+ * auditA11y,
21
+ * } from '@bquery/bquery/a11y';
22
+ *
23
+ * // Trap focus in a modal
24
+ * const trap = trapFocus(dialogElement);
25
+ *
26
+ * // Announce changes to screen readers
27
+ * announceToScreenReader('Form submitted successfully');
28
+ *
29
+ * // Arrow key navigation in a toolbar
30
+ * const roving = rovingTabIndex(toolbar, 'button', {
31
+ * orientation: 'horizontal',
32
+ * });
33
+ *
34
+ * // Auto-generate skip navigation
35
+ * const skip = skipLink('#main-content');
36
+ *
37
+ * // Reactive media preferences
38
+ * const reduced = prefersReducedMotion();
39
+ * const scheme = prefersColorScheme();
40
+ *
41
+ * // Development-time audit
42
+ * const result = auditA11y();
43
+ * if (!result.passed) console.warn(result.findings);
44
+ * ```
45
+ */
46
+ export { announceToScreenReader, clearAnnouncements } from './announce';
47
+ export { auditA11y } from './audit';
48
+ export { prefersColorScheme, prefersContrast, prefersReducedMotion } from './media-preferences';
49
+ export { rovingTabIndex } from './roving-tab-index';
50
+ export { skipLink } from './skip-link';
51
+ export { getFocusableElements, releaseFocus, trapFocus } from './trap-focus';
52
+ export type { AnnouncePriority, AuditFinding, AuditResult, AuditSeverity, ColorScheme, ContrastPreference, FocusTrapHandle, MediaPreferenceSignal, RovingTabIndexHandle, RovingTabIndexOptions, SkipLinkHandle, SkipLinkOptions, TrapFocusOptions, } from './types';
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/a11y/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7E,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Reactive media preference signals for accessibility.
3
+ *
4
+ * Provides reactive signals that track the user's system-level
5
+ * accessibility preferences (reduced motion, color scheme, contrast).
6
+ *
7
+ * @module bquery/a11y
8
+ */
9
+ import type { ColorScheme, ContrastPreference, MediaPreferenceSignal } from './types';
10
+ /**
11
+ * Returns a reactive signal indicating whether the user prefers reduced motion.
12
+ *
13
+ * Tracks the `(prefers-reduced-motion: reduce)` media query. Returns `true`
14
+ * when the user has requested reduced motion in their system settings.
15
+ *
16
+ * @returns A readonly reactive signal handle. Call `destroy()` to remove listeners.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * import { prefersReducedMotion } from '@bquery/bquery/a11y';
21
+ * import { effect } from '@bquery/bquery/reactive';
22
+ *
23
+ * const reduced = prefersReducedMotion();
24
+ * effect(() => {
25
+ * if (reduced.value) {
26
+ * console.log('User prefers reduced motion');
27
+ * }
28
+ * });
29
+ * ```
30
+ */
31
+ export declare const prefersReducedMotion: () => MediaPreferenceSignal<boolean>;
32
+ /**
33
+ * Returns a reactive signal tracking the user's preferred color scheme.
34
+ *
35
+ * Tracks the `(prefers-color-scheme: dark)` media query. Returns `'dark'`
36
+ * when the user prefers a dark color scheme, `'light'` otherwise.
37
+ *
38
+ * @returns A readonly reactive signal handle with `'light'` or `'dark'`
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { prefersColorScheme } from '@bquery/bquery/a11y';
43
+ * import { effect } from '@bquery/bquery/reactive';
44
+ *
45
+ * const scheme = prefersColorScheme();
46
+ * effect(() => {
47
+ * document.body.dataset.theme = scheme.value;
48
+ * });
49
+ * ```
50
+ */
51
+ export declare const prefersColorScheme: () => MediaPreferenceSignal<ColorScheme>;
52
+ /**
53
+ * Returns a reactive signal tracking the user's contrast preference.
54
+ *
55
+ * Tracks the `(prefers-contrast)` media query. Returns:
56
+ * - `'more'` — user prefers higher contrast
57
+ * - `'less'` — user prefers lower contrast
58
+ * - `'custom'` — user has set a custom contrast level
59
+ * - `'no-preference'` — no explicit preference
60
+ *
61
+ * @returns A readonly reactive signal handle
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * import { prefersContrast } from '@bquery/bquery/a11y';
66
+ * import { effect } from '@bquery/bquery/reactive';
67
+ *
68
+ * const contrast = prefersContrast();
69
+ * effect(() => {
70
+ * if (contrast.value === 'more') {
71
+ * document.body.classList.add('high-contrast');
72
+ * }
73
+ * });
74
+ * ```
75
+ */
76
+ export declare const prefersContrast: () => MediaPreferenceSignal<ContrastPreference>;
77
+ //# sourceMappingURL=media-preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-preferences.d.ts","sourceRoot":"","sources":["../../src/a11y/media-preferences.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAyFtF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB,QAAO,qBAAqB,CAAC,OAAO,CAEpE,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB,QAAO,qBAAqB,CAAC,WAAW,CA4BtE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,QAAO,qBAAqB,CAAC,kBAAkB,CAyD1E,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Roving tab index utility for arrow-key navigation within groups.
3
+ *
4
+ * Implements the WAI-ARIA roving tabindex pattern: only one item
5
+ * in the group has tabindex="0" (the active item), while all others
6
+ * have tabindex="-1". Arrow keys move focus between items.
7
+ *
8
+ * @module bquery/a11y
9
+ */
10
+ import type { RovingTabIndexHandle, RovingTabIndexOptions } from './types';
11
+ /**
12
+ * Sets up roving tab index navigation for a group of elements.
13
+ *
14
+ * Only the active item receives `tabindex="0"`, making it the only
15
+ * tabbable element in the group. Arrow keys move focus between items,
16
+ * and Home/End jump to the first/last item.
17
+ *
18
+ * @param container - The parent element containing the navigable items
19
+ * @param itemSelector - CSS selector for the navigable items within the container
20
+ * @param options - Configuration options
21
+ * @returns A handle with `destroy()`, `focusItem()`, and `activeIndex()`
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { rovingTabIndex } from '@bquery/bquery/a11y';
26
+ *
27
+ * const toolbar = document.querySelector('[role="toolbar"]');
28
+ * const handle = rovingTabIndex(toolbar, 'button', {
29
+ * orientation: 'horizontal',
30
+ * wrap: true,
31
+ * });
32
+ *
33
+ * // Later, clean up
34
+ * handle.destroy();
35
+ * ```
36
+ */
37
+ export declare const rovingTabIndex: (container: HTMLElement, itemSelector: string, options?: RovingTabIndexOptions) => RovingTabIndexHandle;
38
+ //# sourceMappingURL=roving-tab-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roving-tab-index.d.ts","sourceRoot":"","sources":["../../src/a11y/roving-tab-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,cAAc,GACzB,WAAW,WAAW,EACtB,cAAc,MAAM,EACpB,UAAS,qBAA0B,KAClC,oBAyHF,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Auto-generated skip navigation link utility.
3
+ *
4
+ * Creates a visually-hidden (but keyboard-focusable) "Skip to content"
5
+ * link that becomes visible on focus, letting keyboard users bypass
6
+ * repeated navigation.
7
+ *
8
+ * @module bquery/a11y
9
+ */
10
+ import type { SkipLinkHandle, SkipLinkOptions } from './types';
11
+ /**
12
+ * Creates a skip navigation link that jumps to the specified target.
13
+ *
14
+ * The link is visually hidden by default and becomes visible when
15
+ * it receives keyboard focus. This follows the WCAG 2.4.1 "Bypass Blocks"
16
+ * success criterion.
17
+ *
18
+ * @param targetSelector - CSS selector for the main content area (e.g. `'#main'`, `'main'`)
19
+ * @param options - Configuration options
20
+ * @returns A handle with `destroy()` method and reference to the created element
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { skipLink } from '@bquery/bquery/a11y';
25
+ *
26
+ * // Creates a "Skip to main content" link pointing to <main>
27
+ * const handle = skipLink('#main-content');
28
+ *
29
+ * // Custom text
30
+ * const handle2 = skipLink('#content', { text: 'Jump to content' });
31
+ *
32
+ * // Remove when no longer needed
33
+ * handle.destroy();
34
+ * ```
35
+ */
36
+ export declare const skipLink: (targetSelector: string, options?: SkipLinkOptions) => SkipLinkHandle;
37
+ //# sourceMappingURL=skip-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-link.d.ts","sourceRoot":"","sources":["../../src/a11y/skip-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA6C/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,GAAI,gBAAgB,MAAM,EAAE,UAAS,eAAoB,KAAG,cA8KhF,CAAC"}