@bquery/bquery 1.4.0 → 1.5.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 (127) hide show
  1. package/README.md +139 -120
  2. package/dist/component/component.d.ts.map +1 -1
  3. package/dist/component/index.d.ts +2 -0
  4. package/dist/component/index.d.ts.map +1 -1
  5. package/dist/component/library.d.ts +34 -0
  6. package/dist/component/library.d.ts.map +1 -0
  7. package/dist/component/types.d.ts +10 -6
  8. package/dist/component/types.d.ts.map +1 -1
  9. package/dist/component-CY5MVoYN.js +531 -0
  10. package/dist/component-CY5MVoYN.js.map +1 -0
  11. package/dist/component.es.mjs +6 -184
  12. package/dist/config-DRmZZno3.js +40 -0
  13. package/dist/config-DRmZZno3.js.map +1 -0
  14. package/dist/core-CK2Mfpf4.js +648 -0
  15. package/dist/core-CK2Mfpf4.js.map +1 -0
  16. package/dist/core-DPdbItcq.js +112 -0
  17. package/dist/core-DPdbItcq.js.map +1 -0
  18. package/dist/core.es.mjs +45 -1261
  19. package/dist/full.d.ts +6 -6
  20. package/dist/full.d.ts.map +1 -1
  21. package/dist/full.es.mjs +98 -92
  22. package/dist/full.iife.js +173 -3
  23. package/dist/full.iife.js.map +1 -1
  24. package/dist/full.umd.js +173 -3
  25. package/dist/full.umd.js.map +1 -1
  26. package/dist/index.es.mjs +143 -139
  27. package/dist/motion/transition.d.ts +1 -1
  28. package/dist/motion/transition.d.ts.map +1 -1
  29. package/dist/motion/types.d.ts +11 -1
  30. package/dist/motion/types.d.ts.map +1 -1
  31. package/dist/motion-C5DRdPnO.js +415 -0
  32. package/dist/motion-C5DRdPnO.js.map +1 -0
  33. package/dist/motion.es.mjs +25 -361
  34. package/dist/object-qGpWr6-J.js +38 -0
  35. package/dist/object-qGpWr6-J.js.map +1 -0
  36. package/dist/platform/announcer.d.ts +59 -0
  37. package/dist/platform/announcer.d.ts.map +1 -0
  38. package/dist/platform/config.d.ts +92 -0
  39. package/dist/platform/config.d.ts.map +1 -0
  40. package/dist/platform/cookies.d.ts +45 -0
  41. package/dist/platform/cookies.d.ts.map +1 -0
  42. package/dist/platform/index.d.ts +8 -0
  43. package/dist/platform/index.d.ts.map +1 -1
  44. package/dist/platform/meta.d.ts +62 -0
  45. package/dist/platform/meta.d.ts.map +1 -0
  46. package/dist/platform-B7JhGBc7.js +361 -0
  47. package/dist/platform-B7JhGBc7.js.map +1 -0
  48. package/dist/platform.es.mjs +11 -248
  49. package/dist/reactive/async-data.d.ts +114 -0
  50. package/dist/reactive/async-data.d.ts.map +1 -0
  51. package/dist/reactive/index.d.ts +2 -2
  52. package/dist/reactive/index.d.ts.map +1 -1
  53. package/dist/reactive/signal.d.ts +2 -0
  54. package/dist/reactive/signal.d.ts.map +1 -1
  55. package/dist/reactive-BDya-ia8.js +253 -0
  56. package/dist/reactive-BDya-ia8.js.map +1 -0
  57. package/dist/reactive.es.mjs +18 -34
  58. package/dist/router-CijiICxt.js +188 -0
  59. package/dist/router-CijiICxt.js.map +1 -0
  60. package/dist/router.es.mjs +11 -200
  61. package/dist/sanitize-jyJ2ryE2.js +302 -0
  62. package/dist/sanitize-jyJ2ryE2.js.map +1 -0
  63. package/dist/security/constants.d.ts.map +1 -1
  64. package/dist/security.es.mjs +10 -56
  65. package/dist/store-CPK9E62U.js +262 -0
  66. package/dist/store-CPK9E62U.js.map +1 -0
  67. package/dist/store.es.mjs +12 -25
  68. package/dist/view-Cdi0g-qo.js +396 -0
  69. package/dist/view-Cdi0g-qo.js.map +1 -0
  70. package/dist/view.es.mjs +10 -430
  71. package/package.json +15 -11
  72. package/src/component/component.ts +319 -289
  73. package/src/component/index.ts +42 -40
  74. package/src/component/library.ts +504 -0
  75. package/src/component/types.ts +91 -85
  76. package/src/core/collection.ts +628 -628
  77. package/src/core/element.ts +774 -774
  78. package/src/core/index.ts +48 -48
  79. package/src/core/utils/function.ts +151 -151
  80. package/src/full.ts +223 -187
  81. package/src/motion/animate.ts +113 -113
  82. package/src/motion/flip.ts +176 -176
  83. package/src/motion/scroll.ts +57 -57
  84. package/src/motion/spring.ts +150 -150
  85. package/src/motion/timeline.ts +246 -246
  86. package/src/motion/transition.ts +53 -7
  87. package/src/motion/types.ts +208 -198
  88. package/src/platform/announcer.ts +208 -0
  89. package/src/platform/config.ts +163 -0
  90. package/src/platform/cookies.ts +165 -0
  91. package/src/platform/index.ts +39 -18
  92. package/src/platform/meta.ts +168 -0
  93. package/src/platform/storage.ts +215 -215
  94. package/src/reactive/async-data.ts +486 -0
  95. package/src/reactive/core.ts +114 -114
  96. package/src/reactive/effect.ts +54 -54
  97. package/src/reactive/index.ts +37 -23
  98. package/src/reactive/internals.ts +122 -122
  99. package/src/reactive/signal.ts +29 -20
  100. package/src/security/constants.ts +211 -209
  101. package/src/security/sanitize-core.ts +364 -364
  102. package/src/view/evaluate.ts +290 -290
  103. package/dist/batch-x7b2eZST.js +0 -13
  104. package/dist/batch-x7b2eZST.js.map +0 -1
  105. package/dist/component.es.mjs.map +0 -1
  106. package/dist/core-BhpuvPhy.js +0 -170
  107. package/dist/core-BhpuvPhy.js.map +0 -1
  108. package/dist/core.es.mjs.map +0 -1
  109. package/dist/full.es.mjs.map +0 -1
  110. package/dist/index.es.mjs.map +0 -1
  111. package/dist/motion.es.mjs.map +0 -1
  112. package/dist/persisted-DHoi3uEs.js +0 -278
  113. package/dist/persisted-DHoi3uEs.js.map +0 -1
  114. package/dist/platform.es.mjs.map +0 -1
  115. package/dist/reactive.es.mjs.map +0 -1
  116. package/dist/router.es.mjs.map +0 -1
  117. package/dist/sanitize-Cxvxa-DX.js +0 -283
  118. package/dist/sanitize-Cxvxa-DX.js.map +0 -1
  119. package/dist/security.es.mjs.map +0 -1
  120. package/dist/store.es.mjs.map +0 -1
  121. package/dist/type-guards-BdKlYYlS.js +0 -32
  122. package/dist/type-guards-BdKlYYlS.js.map +0 -1
  123. package/dist/untrack-DNnnqdlR.js +0 -6
  124. package/dist/untrack-DNnnqdlR.js.map +0 -1
  125. package/dist/view.es.mjs.map +0 -1
  126. package/dist/watch-DXXv3iAI.js +0 -58
  127. package/dist/watch-DXXv3iAI.js.map +0 -1
@@ -1,176 +1,176 @@
1
- /**
2
- * FLIP animation helpers.
3
- *
4
- * @module bquery/motion
5
- */
6
-
7
- import type { ElementBounds, FlipGroupOptions, FlipOptions } from './types';
8
-
9
- /**
10
- * Capture the current bounds of an element for FLIP animation.
11
- *
12
- * @param element - The DOM element to measure
13
- * @returns The element's current position and size
14
- */
15
- export const capturePosition = (element: Element): ElementBounds => {
16
- const rect = element.getBoundingClientRect();
17
- return {
18
- top: rect.top,
19
- left: rect.left,
20
- width: rect.width,
21
- height: rect.height,
22
- };
23
- };
24
-
25
- /**
26
- * Perform a FLIP (First, Last, Invert, Play) animation.
27
- * Animates an element from its captured position to its current position.
28
- *
29
- * @param element - The element to animate
30
- * @param firstBounds - The previously captured bounds
31
- * @param options - Animation configuration
32
- * @returns Promise that resolves when animation completes
33
- *
34
- * @example
35
- * ```ts
36
- * const first = capturePosition(element);
37
- * // ... DOM changes that move the element ...
38
- * await flip(element, first, { duration: 300 });
39
- * ```
40
- */
41
- export const flip = (
42
- element: Element,
43
- firstBounds: ElementBounds,
44
- options: FlipOptions = {}
45
- ): Promise<void> => {
46
- const { duration = 300, easing = 'ease-out', onComplete } = options;
47
-
48
- // Last: Get current position
49
- const lastBounds = capturePosition(element);
50
-
51
- // Skip animation if element has zero dimensions (avoid division by zero)
52
- if (lastBounds.width === 0 || lastBounds.height === 0) {
53
- onComplete?.();
54
- return Promise.resolve();
55
- }
56
-
57
- // Invert: Calculate the delta
58
- const deltaX = firstBounds.left - lastBounds.left;
59
- const deltaY = firstBounds.top - lastBounds.top;
60
- const deltaW = firstBounds.width / lastBounds.width;
61
- const deltaH = firstBounds.height / lastBounds.height;
62
-
63
- // Skip animation if no change
64
- if (deltaX === 0 && deltaY === 0 && deltaW === 1 && deltaH === 1) {
65
- onComplete?.();
66
- return Promise.resolve();
67
- }
68
-
69
- const htmlElement = element as HTMLElement;
70
-
71
- // Feature check: fallback if Web Animations API is unavailable
72
- if (typeof htmlElement.animate !== 'function') {
73
- onComplete?.();
74
- return Promise.resolve();
75
- }
76
-
77
- // Apply inverted transform
78
- htmlElement.style.transform = `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`;
79
- htmlElement.style.transformOrigin = 'top left';
80
-
81
- // Force reflow
82
- void htmlElement.offsetHeight;
83
-
84
- // Play: Animate back to current position
85
- return new Promise((resolve) => {
86
- const animation = htmlElement.animate(
87
- [
88
- {
89
- transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`,
90
- },
91
- { transform: 'translate(0, 0) scale(1, 1)' },
92
- ],
93
- { duration, easing, fill: 'forwards' }
94
- );
95
-
96
- let finalized = false;
97
- const finalize = () => {
98
- if (finalized) return;
99
- finalized = true;
100
- htmlElement.style.transform = '';
101
- htmlElement.style.transformOrigin = '';
102
- onComplete?.();
103
- resolve();
104
- };
105
-
106
- animation.onfinish = finalize;
107
- // Handle cancel/rejection via the finished promise
108
- if (animation.finished) {
109
- animation.finished.then(finalize).catch(finalize);
110
- }
111
- });
112
- };
113
-
114
- /**
115
- * FLIP helper for animating a list of elements.
116
- * Useful for reordering lists with smooth animations.
117
- *
118
- * @param elements - Array of elements to animate
119
- * @param performUpdate - Function that performs the DOM update
120
- * @param options - Animation configuration
121
- *
122
- * @example
123
- * ```ts
124
- * await flipList(listItems, () => {
125
- * container.appendChild(container.firstChild); // Move first to last
126
- * });
127
- * ```
128
- */
129
- export const flipList = async (
130
- elements: Element[],
131
- performUpdate: () => void,
132
- options: FlipOptions = {}
133
- ): Promise<void> => {
134
- await flipElements(elements, performUpdate, options);
135
- };
136
-
137
- /**
138
- * FLIP helper with optional stagger support.
139
- *
140
- * @param elements - Array of elements to animate
141
- * @param performUpdate - Function that performs the DOM update
142
- * @param options - Animation configuration
143
- */
144
- export const flipElements = async (
145
- elements: Element[],
146
- performUpdate: () => void,
147
- options: FlipGroupOptions = {}
148
- ): Promise<void> => {
149
- const { stagger, ...flipOptions } = options;
150
-
151
- // First: Capture all positions
152
- const positions = new Map<Element, ElementBounds>();
153
- for (const el of elements) {
154
- positions.set(el, capturePosition(el));
155
- }
156
-
157
- // Perform DOM update
158
- performUpdate();
159
-
160
- const total = elements.length;
161
-
162
- // Animate each element
163
- const animations = elements.map((el, index) => {
164
- const first = positions.get(el);
165
- if (!first) return Promise.resolve();
166
- const delay = stagger ? stagger(index, total) : 0;
167
- if (delay > 0) {
168
- return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>
169
- flip(el, first, flipOptions)
170
- );
171
- }
172
- return flip(el, first, flipOptions);
173
- });
174
-
175
- await Promise.all(animations);
176
- };
1
+ /**
2
+ * FLIP animation helpers.
3
+ *
4
+ * @module bquery/motion
5
+ */
6
+
7
+ import type { ElementBounds, FlipGroupOptions, FlipOptions } from './types';
8
+
9
+ /**
10
+ * Capture the current bounds of an element for FLIP animation.
11
+ *
12
+ * @param element - The DOM element to measure
13
+ * @returns The element's current position and size
14
+ */
15
+ export const capturePosition = (element: Element): ElementBounds => {
16
+ const rect = element.getBoundingClientRect();
17
+ return {
18
+ top: rect.top,
19
+ left: rect.left,
20
+ width: rect.width,
21
+ height: rect.height,
22
+ };
23
+ };
24
+
25
+ /**
26
+ * Perform a FLIP (First, Last, Invert, Play) animation.
27
+ * Animates an element from its captured position to its current position.
28
+ *
29
+ * @param element - The element to animate
30
+ * @param firstBounds - The previously captured bounds
31
+ * @param options - Animation configuration
32
+ * @returns Promise that resolves when animation completes
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * const first = capturePosition(element);
37
+ * // ... DOM changes that move the element ...
38
+ * await flip(element, first, { duration: 300 });
39
+ * ```
40
+ */
41
+ export const flip = (
42
+ element: Element,
43
+ firstBounds: ElementBounds,
44
+ options: FlipOptions = {}
45
+ ): Promise<void> => {
46
+ const { duration = 300, easing = 'ease-out', onComplete } = options;
47
+
48
+ // Last: Get current position
49
+ const lastBounds = capturePosition(element);
50
+
51
+ // Skip animation if element has zero dimensions (avoid division by zero)
52
+ if (lastBounds.width === 0 || lastBounds.height === 0) {
53
+ onComplete?.();
54
+ return Promise.resolve();
55
+ }
56
+
57
+ // Invert: Calculate the delta
58
+ const deltaX = firstBounds.left - lastBounds.left;
59
+ const deltaY = firstBounds.top - lastBounds.top;
60
+ const deltaW = firstBounds.width / lastBounds.width;
61
+ const deltaH = firstBounds.height / lastBounds.height;
62
+
63
+ // Skip animation if no change
64
+ if (deltaX === 0 && deltaY === 0 && deltaW === 1 && deltaH === 1) {
65
+ onComplete?.();
66
+ return Promise.resolve();
67
+ }
68
+
69
+ const htmlElement = element as HTMLElement;
70
+
71
+ // Feature check: fallback if Web Animations API is unavailable
72
+ if (typeof htmlElement.animate !== 'function') {
73
+ onComplete?.();
74
+ return Promise.resolve();
75
+ }
76
+
77
+ // Apply inverted transform
78
+ htmlElement.style.transform = `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`;
79
+ htmlElement.style.transformOrigin = 'top left';
80
+
81
+ // Force reflow
82
+ void htmlElement.offsetHeight;
83
+
84
+ // Play: Animate back to current position
85
+ return new Promise((resolve) => {
86
+ const animation = htmlElement.animate(
87
+ [
88
+ {
89
+ transform: `translate(${deltaX}px, ${deltaY}px) scale(${deltaW}, ${deltaH})`,
90
+ },
91
+ { transform: 'translate(0, 0) scale(1, 1)' },
92
+ ],
93
+ { duration, easing, fill: 'forwards' }
94
+ );
95
+
96
+ let finalized = false;
97
+ const finalize = () => {
98
+ if (finalized) return;
99
+ finalized = true;
100
+ htmlElement.style.transform = '';
101
+ htmlElement.style.transformOrigin = '';
102
+ onComplete?.();
103
+ resolve();
104
+ };
105
+
106
+ animation.onfinish = finalize;
107
+ // Handle cancel/rejection via the finished promise
108
+ if (animation.finished) {
109
+ animation.finished.then(finalize).catch(finalize);
110
+ }
111
+ });
112
+ };
113
+
114
+ /**
115
+ * FLIP helper for animating a list of elements.
116
+ * Useful for reordering lists with smooth animations.
117
+ *
118
+ * @param elements - Array of elements to animate
119
+ * @param performUpdate - Function that performs the DOM update
120
+ * @param options - Animation configuration
121
+ *
122
+ * @example
123
+ * ```ts
124
+ * await flipList(listItems, () => {
125
+ * container.appendChild(container.firstChild); // Move first to last
126
+ * });
127
+ * ```
128
+ */
129
+ export const flipList = async (
130
+ elements: Element[],
131
+ performUpdate: () => void,
132
+ options: FlipOptions = {}
133
+ ): Promise<void> => {
134
+ await flipElements(elements, performUpdate, options);
135
+ };
136
+
137
+ /**
138
+ * FLIP helper with optional stagger support.
139
+ *
140
+ * @param elements - Array of elements to animate
141
+ * @param performUpdate - Function that performs the DOM update
142
+ * @param options - Animation configuration
143
+ */
144
+ export const flipElements = async (
145
+ elements: Element[],
146
+ performUpdate: () => void,
147
+ options: FlipGroupOptions = {}
148
+ ): Promise<void> => {
149
+ const { stagger, ...flipOptions } = options;
150
+
151
+ // First: Capture all positions
152
+ const positions = new Map<Element, ElementBounds>();
153
+ for (const el of elements) {
154
+ positions.set(el, capturePosition(el));
155
+ }
156
+
157
+ // Perform DOM update
158
+ performUpdate();
159
+
160
+ const total = elements.length;
161
+
162
+ // Animate each element
163
+ const animations = elements.map((el, index) => {
164
+ const first = positions.get(el);
165
+ if (!first) return Promise.resolve();
166
+ const delay = stagger ? stagger(index, total) : 0;
167
+ if (delay > 0) {
168
+ return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>
169
+ flip(el, first, flipOptions)
170
+ );
171
+ }
172
+ return flip(el, first, flipOptions);
173
+ });
174
+
175
+ await Promise.all(animations);
176
+ };
@@ -1,57 +1,57 @@
1
- /**
2
- * Scroll-triggered animation helpers.
3
- *
4
- * @module bquery/motion
5
- */
6
-
7
- import { animate } from './animate';
8
- import type { ScrollAnimateCleanup, ScrollAnimateOptions } from './types';
9
-
10
- const resolveElements = (elements: Element | Iterable<Element> | ArrayLike<Element>): Element[] => {
11
- if (typeof Element !== 'undefined' && elements instanceof Element) return [elements];
12
- return Array.from(elements as Iterable<Element>);
13
- };
14
-
15
- /**
16
- * Animate elements when they enter the viewport.
17
- *
18
- * @param elements - Target element(s)
19
- * @param options - Scroll animation configuration
20
- * @returns Cleanup function to disconnect observers
21
- */
22
- export const scrollAnimate = (
23
- elements: Element | Iterable<Element> | ArrayLike<Element>,
24
- options: ScrollAnimateOptions
25
- ): ScrollAnimateCleanup => {
26
- const targets = resolveElements(elements);
27
- if (!targets.length) return () => undefined;
28
-
29
- const { root = null, rootMargin, threshold, once = true, onEnter, ...animationConfig } = options;
30
-
31
- if (typeof IntersectionObserver === 'undefined') {
32
- targets.forEach((element) => {
33
- onEnter?.(element);
34
- void animate(element, animationConfig);
35
- });
36
- return () => undefined;
37
- }
38
-
39
- const observer = new IntersectionObserver(
40
- (entries) => {
41
- entries.forEach((entry) => {
42
- if (!entry.isIntersecting) return;
43
- const element = entry.target as Element;
44
- onEnter?.(element);
45
- void animate(element, animationConfig);
46
- if (once) {
47
- observer.unobserve(element);
48
- }
49
- });
50
- },
51
- { root, rootMargin, threshold }
52
- );
53
-
54
- targets.forEach((element) => observer.observe(element));
55
-
56
- return () => observer.disconnect();
57
- };
1
+ /**
2
+ * Scroll-triggered animation helpers.
3
+ *
4
+ * @module bquery/motion
5
+ */
6
+
7
+ import { animate } from './animate';
8
+ import type { ScrollAnimateCleanup, ScrollAnimateOptions } from './types';
9
+
10
+ const resolveElements = (elements: Element | Iterable<Element> | ArrayLike<Element>): Element[] => {
11
+ if (typeof Element !== 'undefined' && elements instanceof Element) return [elements];
12
+ return Array.from(elements as Iterable<Element>);
13
+ };
14
+
15
+ /**
16
+ * Animate elements when they enter the viewport.
17
+ *
18
+ * @param elements - Target element(s)
19
+ * @param options - Scroll animation configuration
20
+ * @returns Cleanup function to disconnect observers
21
+ */
22
+ export const scrollAnimate = (
23
+ elements: Element | Iterable<Element> | ArrayLike<Element>,
24
+ options: ScrollAnimateOptions
25
+ ): ScrollAnimateCleanup => {
26
+ const targets = resolveElements(elements);
27
+ if (!targets.length) return () => undefined;
28
+
29
+ const { root = null, rootMargin, threshold, once = true, onEnter, ...animationConfig } = options;
30
+
31
+ if (typeof IntersectionObserver === 'undefined') {
32
+ targets.forEach((element) => {
33
+ onEnter?.(element);
34
+ void animate(element, animationConfig);
35
+ });
36
+ return () => undefined;
37
+ }
38
+
39
+ const observer = new IntersectionObserver(
40
+ (entries) => {
41
+ entries.forEach((entry) => {
42
+ if (!entry.isIntersecting) return;
43
+ const element = entry.target as Element;
44
+ onEnter?.(element);
45
+ void animate(element, animationConfig);
46
+ if (once) {
47
+ observer.unobserve(element);
48
+ }
49
+ });
50
+ },
51
+ { root, rootMargin, threshold }
52
+ );
53
+
54
+ targets.forEach((element) => observer.observe(element));
55
+
56
+ return () => observer.disconnect();
57
+ };