@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.
- package/README.md +193 -23
- package/dist/a11y/announce.d.ts +43 -0
- package/dist/a11y/announce.d.ts.map +1 -0
- package/dist/a11y/audit.d.ts +42 -0
- package/dist/a11y/audit.d.ts.map +1 -0
- package/dist/a11y/index.d.ts +53 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/media-preferences.d.ts +77 -0
- package/dist/a11y/media-preferences.d.ts.map +1 -0
- package/dist/a11y/roving-tab-index.d.ts +38 -0
- package/dist/a11y/roving-tab-index.d.ts.map +1 -0
- package/dist/a11y/skip-link.d.ts +37 -0
- package/dist/a11y/skip-link.d.ts.map +1 -0
- package/dist/a11y/trap-focus.d.ts +49 -0
- package/dist/a11y/trap-focus.d.ts.map +1 -0
- package/dist/a11y/types.d.ts +152 -0
- package/dist/a11y/types.d.ts.map +1 -0
- package/dist/a11y-C5QOVvRn.js +421 -0
- package/dist/a11y-C5QOVvRn.js.map +1 -0
- package/dist/a11y.es.mjs +14 -0
- package/dist/component/component.d.ts +13 -5
- package/dist/component/component.d.ts.map +1 -1
- package/dist/component/html.d.ts +40 -3
- package/dist/component/html.d.ts.map +1 -1
- package/dist/component/index.d.ts +3 -2
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/library.d.ts.map +1 -1
- package/dist/component/scope.d.ts +138 -0
- package/dist/component/scope.d.ts.map +1 -0
- package/dist/component/types.d.ts +184 -17
- package/dist/component/types.d.ts.map +1 -1
- package/dist/component-CuuTijA6.js +684 -0
- package/dist/component-CuuTijA6.js.map +1 -0
- package/dist/component.es.mjs +10 -6
- package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
- package/dist/config-BW35FKuA.js.map +1 -0
- package/dist/constraints-3lV9yyBw.js +100 -0
- package/dist/constraints-3lV9yyBw.js.map +1 -0
- package/dist/core/collection.d.ts +48 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/element.d.ts +92 -0
- package/dist/core/element.d.ts.map +1 -1
- package/dist/core/env.d.ts +18 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/shared.d.ts +8 -0
- package/dist/core/shared.d.ts.map +1 -1
- package/dist/core/utils/index.d.ts +52 -41
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core-Cjl7GUu8.js +717 -0
- package/dist/core-Cjl7GUu8.js.map +1 -0
- package/dist/{core-DPdbItcq.js → core-DnlyjbF2.js} +1 -1
- package/dist/{core-DPdbItcq.js.map → core-DnlyjbF2.js.map} +1 -1
- package/dist/core.es.mjs +45 -44
- package/dist/custom-directives-7wAShnnd.js +9 -0
- package/dist/custom-directives-7wAShnnd.js.map +1 -0
- package/dist/devtools/devtools.d.ts +212 -0
- package/dist/devtools/devtools.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +20 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/types.d.ts +69 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/devtools-D2fQLhDN.js +122 -0
- package/dist/devtools-D2fQLhDN.js.map +1 -0
- package/dist/devtools.es.mjs +19 -0
- package/dist/dnd/draggable.d.ts +51 -0
- package/dist/dnd/draggable.d.ts.map +1 -0
- package/dist/dnd/droppable.d.ts +38 -0
- package/dist/dnd/droppable.d.ts.map +1 -0
- package/dist/dnd/index.d.ts +47 -0
- package/dist/dnd/index.d.ts.map +1 -0
- package/dist/dnd/sortable.d.ts +43 -0
- package/dist/dnd/sortable.d.ts.map +1 -0
- package/dist/dnd/types.d.ts +250 -0
- package/dist/dnd/types.d.ts.map +1 -0
- package/dist/dnd-B8EgyzaI.js +244 -0
- package/dist/dnd-B8EgyzaI.js.map +1 -0
- package/dist/dnd.es.mjs +6 -0
- package/dist/env-NeVmr4Gf.js +19 -0
- package/dist/env-NeVmr4Gf.js.map +1 -0
- package/dist/forms/create-form.d.ts +49 -0
- package/dist/forms/create-form.d.ts.map +1 -0
- package/dist/forms/index.d.ts +39 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/types.d.ts +139 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/validators.d.ts +179 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms-C3yovgH9.js +141 -0
- package/dist/forms-C3yovgH9.js.map +1 -0
- package/dist/forms.es.mjs +14 -0
- package/dist/full.d.ts +37 -9
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +186 -91
- package/dist/full.iife.js +47 -31
- package/dist/full.iife.js.map +1 -1
- package/dist/full.umd.js +47 -31
- package/dist/full.umd.js.map +1 -1
- package/dist/i18n/formatting.d.ts +40 -0
- package/dist/i18n/formatting.d.ts.map +1 -0
- package/dist/i18n/i18n.d.ts +48 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/translate.d.ts +83 -0
- package/dist/i18n/translate.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +156 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n-BnnhTFOS.js +89 -0
- package/dist/i18n-BnnhTFOS.js.map +1 -0
- package/dist/i18n.es.mjs +6 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.mjs +233 -138
- package/dist/media/battery.d.ts +35 -0
- package/dist/media/battery.d.ts.map +1 -0
- package/dist/media/breakpoints.d.ts +51 -0
- package/dist/media/breakpoints.d.ts.map +1 -0
- package/dist/media/clipboard.d.ts +30 -0
- package/dist/media/clipboard.d.ts.map +1 -0
- package/dist/media/device-sensors.d.ts +54 -0
- package/dist/media/device-sensors.d.ts.map +1 -0
- package/dist/media/geolocation.d.ts +38 -0
- package/dist/media/geolocation.d.ts.map +1 -0
- package/dist/media/index.d.ts +42 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/media-query.d.ts +36 -0
- package/dist/media/media-query.d.ts.map +1 -0
- package/dist/media/network.d.ts +35 -0
- package/dist/media/network.d.ts.map +1 -0
- package/dist/media/types.d.ts +173 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/viewport.d.ts +32 -0
- package/dist/media/viewport.d.ts.map +1 -0
- package/dist/media-Di2Ta22s.js +340 -0
- package/dist/media-Di2Ta22s.js.map +1 -0
- package/dist/media.es.mjs +12 -0
- package/dist/motion/index.d.ts +7 -3
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/morph.d.ts +27 -0
- package/dist/motion/morph.d.ts.map +1 -0
- package/dist/motion/parallax.d.ts +30 -0
- package/dist/motion/parallax.d.ts.map +1 -0
- package/dist/motion/reduced-motion.d.ts +36 -3
- package/dist/motion/reduced-motion.d.ts.map +1 -1
- package/dist/motion/types.d.ts +58 -0
- package/dist/motion/types.d.ts.map +1 -1
- package/dist/motion/typewriter.d.ts +31 -0
- package/dist/motion/typewriter.d.ts.map +1 -0
- package/dist/motion-qPj_TYGv.js +530 -0
- package/dist/motion-qPj_TYGv.js.map +1 -0
- package/dist/motion.es.mjs +27 -23
- package/dist/mount-SM07RUa6.js +403 -0
- package/dist/mount-SM07RUa6.js.map +1 -0
- package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
- package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
- package/dist/{platform-B7JhGBc7.js → platform-CPbCprb6.js} +3 -3
- package/dist/platform-CPbCprb6.js.map +1 -0
- package/dist/platform.es.mjs +2 -2
- package/dist/plugin/index.d.ts +22 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/registry.d.ts +108 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/types.d.ts +110 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin-cPoOHFLY.js +64 -0
- package/dist/plugin-cPoOHFLY.js.map +1 -0
- package/dist/plugin.es.mjs +9 -0
- package/dist/reactive/computed.d.ts +7 -0
- package/dist/reactive/computed.d.ts.map +1 -1
- package/dist/reactive-Cfv0RK6x.js +233 -0
- package/dist/reactive-Cfv0RK6x.js.map +1 -0
- package/dist/reactive.es.mjs +18 -17
- package/dist/registry-CWf368tT.js +26 -0
- package/dist/registry-CWf368tT.js.map +1 -0
- package/dist/router/bq-link.d.ts +112 -0
- package/dist/router/bq-link.d.ts.map +1 -0
- package/dist/router/constraints.d.ts +9 -0
- package/dist/router/constraints.d.ts.map +1 -0
- package/dist/router/index.d.ts +14 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/match.d.ts +0 -1
- package/dist/router/match.d.ts.map +1 -1
- package/dist/router/path-pattern.d.ts +14 -0
- package/dist/router/path-pattern.d.ts.map +1 -0
- package/dist/router/query.d.ts.map +1 -1
- package/dist/router/router.d.ts +3 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/types.d.ts +48 -4
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/use-route.d.ts +50 -0
- package/dist/router/use-route.d.ts.map +1 -0
- package/dist/router/utils.d.ts +3 -0
- package/dist/router/utils.d.ts.map +1 -1
- package/dist/router-BrthaP_z.js +473 -0
- package/dist/router-BrthaP_z.js.map +1 -0
- package/dist/router.es.mjs +13 -10
- package/dist/{sanitize-jyJ2ryE2.js → sanitize-B1V4JswB.js} +95 -83
- package/dist/sanitize-B1V4JswB.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/sanitize.d.ts +4 -1
- package/dist/security/sanitize.d.ts.map +1 -1
- package/dist/security/trusted-html.d.ts +53 -0
- package/dist/security/trusted-html.d.ts.map +1 -0
- package/dist/security.es.mjs +10 -9
- package/dist/ssr/hydrate.d.ts +65 -0
- package/dist/ssr/hydrate.d.ts.map +1 -0
- package/dist/ssr/index.d.ts +59 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/render.d.ts +62 -0
- package/dist/ssr/render.d.ts.map +1 -0
- package/dist/ssr/serialize.d.ts +118 -0
- package/dist/ssr/serialize.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +70 -0
- package/dist/ssr/types.d.ts.map +1 -0
- package/dist/ssr-B2qd_WBB.js +248 -0
- package/dist/ssr-B2qd_WBB.js.map +1 -0
- package/dist/ssr.es.mjs +9 -0
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/define-store.d.ts +1 -1
- package/dist/store/define-store.d.ts.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/mapping.d.ts +1 -1
- package/dist/store/mapping.d.ts.map +1 -1
- package/dist/store/persisted.d.ts +38 -4
- package/dist/store/persisted.d.ts.map +1 -1
- package/dist/store/types.d.ts +140 -3
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/utils.d.ts +2 -2
- package/dist/store/utils.d.ts.map +1 -1
- package/dist/store/watch.d.ts +1 -1
- package/dist/store/watch.d.ts.map +1 -1
- package/dist/store-DWpyH6p5.js +338 -0
- package/dist/store-DWpyH6p5.js.map +1 -0
- package/dist/store.es.mjs +11 -10
- package/dist/storybook/index.d.ts +37 -0
- package/dist/storybook/index.d.ts.map +1 -0
- package/dist/storybook.es.mjs +151 -0
- package/dist/storybook.es.mjs.map +1 -0
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/testing.d.ts +156 -0
- package/dist/testing/testing.d.ts.map +1 -0
- package/dist/testing/types.d.ts +134 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing-CsqjNUyy.js +224 -0
- package/dist/testing-CsqjNUyy.js.map +1 -0
- package/dist/testing.es.mjs +9 -0
- package/dist/type-guards-Do9DWgNp.js +44 -0
- package/dist/type-guards-Do9DWgNp.js.map +1 -0
- package/dist/untrack-DJVQQ2WM.js +33 -0
- package/dist/untrack-DJVQQ2WM.js.map +1 -0
- package/dist/view/custom-directives.d.ts +20 -0
- package/dist/view/custom-directives.d.ts.map +1 -0
- package/dist/view/evaluate.d.ts.map +1 -1
- package/dist/view/process.d.ts.map +1 -1
- package/dist/view.es.mjs +11 -10
- package/package.json +52 -11
- package/src/a11y/announce.ts +131 -0
- package/src/a11y/audit.ts +314 -0
- package/src/a11y/index.ts +68 -0
- package/src/a11y/media-preferences.ts +255 -0
- package/src/a11y/roving-tab-index.ts +164 -0
- package/src/a11y/skip-link.ts +255 -0
- package/src/a11y/trap-focus.ts +184 -0
- package/src/a11y/types.ts +183 -0
- package/src/component/component.ts +345 -65
- package/src/component/html.ts +153 -53
- package/src/component/index.ts +12 -2
- package/src/component/library.ts +66 -28
- package/src/component/scope.ts +212 -0
- package/src/component/types.ts +238 -19
- package/src/core/collection.ts +707 -628
- package/src/core/element.ts +981 -774
- package/src/core/env.ts +60 -0
- package/src/core/index.ts +49 -48
- package/src/core/shared.ts +62 -13
- package/src/core/utils/index.ts +148 -83
- package/src/devtools/devtools.ts +410 -0
- package/src/devtools/index.ts +48 -0
- package/src/devtools/types.ts +104 -0
- package/src/dnd/draggable.ts +296 -0
- package/src/dnd/droppable.ts +228 -0
- package/src/dnd/index.ts +62 -0
- package/src/dnd/sortable.ts +307 -0
- package/src/dnd/types.ts +293 -0
- package/src/forms/create-form.ts +278 -0
- package/src/forms/index.ts +65 -0
- package/src/forms/types.ts +154 -0
- package/src/forms/validators.ts +265 -0
- package/src/full.ts +260 -3
- package/src/i18n/formatting.ts +67 -0
- package/src/i18n/i18n.ts +200 -0
- package/src/i18n/index.ts +67 -0
- package/src/i18n/translate.ts +182 -0
- package/src/i18n/types.ts +171 -0
- package/src/index.ts +108 -36
- package/src/media/battery.ts +116 -0
- package/src/media/breakpoints.ts +131 -0
- package/src/media/clipboard.ts +80 -0
- package/src/media/device-sensors.ts +158 -0
- package/src/media/geolocation.ts +119 -0
- package/src/media/index.ts +76 -0
- package/src/media/media-query.ts +92 -0
- package/src/media/network.ts +115 -0
- package/src/media/types.ts +177 -0
- package/src/media/viewport.ts +84 -0
- package/src/motion/index.ts +57 -48
- package/src/motion/morph.ts +151 -0
- package/src/motion/parallax.ts +120 -0
- package/src/motion/reduced-motion.ts +66 -17
- package/src/motion/transition.ts +97 -97
- package/src/motion/types.ts +63 -0
- package/src/motion/typewriter.ts +164 -0
- package/src/platform/announcer.ts +208 -208
- package/src/platform/config.ts +163 -163
- package/src/platform/cookies.ts +165 -165
- package/src/platform/index.ts +39 -39
- package/src/platform/meta.ts +168 -168
- package/src/plugin/index.ts +37 -0
- package/src/plugin/registry.ts +269 -0
- package/src/plugin/types.ts +137 -0
- package/src/reactive/async-data.ts +486 -486
- package/src/reactive/computed.ts +130 -92
- package/src/reactive/index.ts +37 -37
- package/src/reactive/signal.ts +29 -29
- package/src/router/bq-link.ts +279 -0
- package/src/router/constraints.ts +201 -0
- package/src/router/index.ts +49 -41
- package/src/router/match.ts +312 -106
- package/src/router/path-pattern.ts +52 -0
- package/src/router/query.ts +38 -35
- package/src/router/router.ts +402 -211
- package/src/router/types.ts +139 -93
- package/src/router/use-route.ts +68 -0
- package/src/router/utils.ts +157 -116
- package/src/security/constants.ts +211 -211
- package/src/security/index.ts +12 -10
- package/src/security/sanitize.ts +6 -2
- package/src/security/trusted-html.ts +71 -0
- package/src/ssr/hydrate.ts +82 -0
- package/src/ssr/index.ts +70 -0
- package/src/ssr/render.ts +508 -0
- package/src/ssr/serialize.ts +296 -0
- package/src/ssr/types.ts +81 -0
- package/src/store/create-store.ts +467 -329
- package/src/store/define-store.ts +2 -1
- package/src/store/index.ts +27 -22
- package/src/store/mapping.ts +2 -1
- package/src/store/persisted.ts +249 -61
- package/src/store/types.ts +247 -94
- package/src/store/utils.ts +135 -141
- package/src/store/watch.ts +2 -1
- package/src/storybook/index.ts +480 -0
- package/src/testing/index.ts +42 -0
- package/src/testing/testing.ts +593 -0
- package/src/testing/types.ts +170 -0
- package/src/view/custom-directives.ts +30 -0
- package/src/view/evaluate.ts +292 -290
- package/src/view/process.ts +108 -92
- package/dist/component-CY5MVoYN.js +0 -531
- package/dist/component-CY5MVoYN.js.map +0 -1
- package/dist/config-DRmZZno3.js.map +0 -1
- package/dist/core-CK2Mfpf4.js +0 -648
- package/dist/core-CK2Mfpf4.js.map +0 -1
- package/dist/motion-C5DRdPnO.js +0 -415
- package/dist/motion-C5DRdPnO.js.map +0 -1
- package/dist/platform-B7JhGBc7.js.map +0 -1
- package/dist/reactive-BDya-ia8.js +0 -253
- package/dist/reactive-BDya-ia8.js.map +0 -1
- package/dist/router-CijiICxt.js +0 -188
- package/dist/router-CijiICxt.js.map +0 -1
- package/dist/sanitize-jyJ2ryE2.js.map +0 -1
- package/dist/store-CPK9E62U.js +0 -262
- package/dist/store-CPK9E62U.js.map +0 -1
- package/dist/view-Cdi0g-qo.js +0 -396
- 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,
|
|
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
|
|
139
|
-
| ------------- |
|
|
140
|
-
| **Core** | Selectors, DOM manipulation, events,
|
|
141
|
-
| **Reactive** | `signal`, `computed`, `effect`, async data
|
|
142
|
-
| **Component** |
|
|
143
|
-
| **
|
|
144
|
-
| **
|
|
145
|
-
| **
|
|
146
|
-
| **
|
|
147
|
-
| **
|
|
148
|
-
| **
|
|
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(
|
|
268
|
-
return
|
|
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
|
|
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
|
|
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
|
-
│
|
|
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"}
|