cereb 0.11.2 → 0.11.4
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 +7 -7
- package/dist/browser/single-pointer/recognizer-from-mouse.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-pointer.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-touch.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer.d.ts +2 -2
- package/dist/browser/single-pointer/recognizer.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/operators/zoom.d.ts +10 -0
- package/dist/operators/zoom.d.ts.map +1 -1
- package/dist/operators.cjs +1 -1
- package/dist/operators.cjs.map +1 -1
- package/dist/operators.js +76 -76
- package/dist/operators.js.map +1 -1
- package/dist/{recognizer-CGZKcxpa.js → recognizer-BzvWMkxq.js} +10 -10
- package/dist/{recognizer-CGZKcxpa.js.map → recognizer-BzvWMkxq.js.map} +1 -1
- package/dist/recognizer-D3UwuOb3.cjs +2 -0
- package/dist/{recognizer-DbiEtBOM.cjs.map → recognizer-D3UwuOb3.cjs.map} +1 -1
- package/dist/single-pointer/mouse.cjs +1 -1
- package/dist/single-pointer/mouse.cjs.map +1 -1
- package/dist/single-pointer/mouse.js +3 -3
- package/dist/single-pointer/mouse.js.map +1 -1
- package/dist/single-pointer/pointer.cjs +1 -1
- package/dist/single-pointer/pointer.cjs.map +1 -1
- package/dist/single-pointer/pointer.js +16 -16
- package/dist/single-pointer/pointer.js.map +1 -1
- package/dist/single-pointer/touch.cjs +1 -1
- package/dist/single-pointer/touch.cjs.map +1 -1
- package/dist/single-pointer/touch.js +15 -15
- package/dist/single-pointer/touch.js.map +1 -1
- package/package.json +1 -1
- package/dist/recognizer-DbiEtBOM.cjs +0 -2
package/README.md
CHANGED
|
@@ -127,28 +127,28 @@ import { pinch } from "@cereb/pinch";
|
|
|
127
127
|
const zoomMode$ = keyheld(window, { code: "KeyZ" });
|
|
128
128
|
const zoom = (op) => createZoom({ minScale: 0.5, maxScale: 3.0, baseScale: getScale, ...op });
|
|
129
129
|
|
|
130
|
-
// Pinch zoom - baseScale
|
|
130
|
+
// Pinch zoom - phase-based session: baseScale captured at start, reset at end
|
|
131
131
|
pinch(element)
|
|
132
132
|
.pipe(zoom())
|
|
133
133
|
.on(applyScale);
|
|
134
134
|
|
|
135
|
-
// z + wheel zoom - ratio as
|
|
135
|
+
// z + wheel zoom - ratio as absolute scale (current × factor)
|
|
136
136
|
wheel(element, { passive: false })
|
|
137
137
|
.pipe(
|
|
138
138
|
when(zoomMode$),
|
|
139
139
|
spy((signal) => signal.value.originalEvent.preventDefault()),
|
|
140
|
-
extend((signal) => ({ ratio: Math.exp(-signal.value.deltaY * 0.005) })),
|
|
141
|
-
zoom(),
|
|
140
|
+
extend((signal) => ({ ratio: getScale() * Math.exp(-signal.value.deltaY * 0.005) })),
|
|
141
|
+
zoom({ baseScale: 1.0 }),
|
|
142
142
|
)
|
|
143
143
|
.on(applyScale);
|
|
144
144
|
|
|
145
|
-
// z + '+/-' zoom - ratio as
|
|
145
|
+
// z + '+/-' zoom - ratio as absolute scale (current × factor)
|
|
146
146
|
keydown(window, { code: ["Equal", "Minus"] })
|
|
147
147
|
.pipe(
|
|
148
148
|
when(zoomMode$),
|
|
149
149
|
spy((signal) => signal.value.originalEvent.preventDefault()),
|
|
150
|
-
extend((signal) => ({ ratio: signal.value.code === "Equal" ? 1.2 : 1 / 1.2 })),
|
|
151
|
-
zoom(),
|
|
150
|
+
extend((signal) => ({ ratio: getScale() * (signal.value.code === "Equal" ? 1.2 : 1 / 1.2) })),
|
|
151
|
+
zoom({ baseScale: 1.0 }),
|
|
152
152
|
)
|
|
153
153
|
.on(applyScale);
|
|
154
154
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-from-mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"recognizer-from-mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAoCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-from-pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAI1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"recognizer-from-pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAI1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CA6CvD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAyB7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-from-touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAC;AAE3E,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"recognizer-from-touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAC;AAE3E,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAoCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
|
|
@@ -2,10 +2,10 @@ import { Signal } from '../../core/signal.js';
|
|
|
2
2
|
import { SinglePointerSignal } from './single-pointer-signal.js';
|
|
3
3
|
import { SinglePointerOptions } from './types.js';
|
|
4
4
|
export interface SinglePointerRecognizer<InputSignal extends Signal> {
|
|
5
|
-
process(event: InputSignal): SinglePointerSignal;
|
|
5
|
+
process(event: InputSignal): SinglePointerSignal | null;
|
|
6
6
|
readonly isActive: boolean;
|
|
7
7
|
reset(): void;
|
|
8
8
|
dispose(): void;
|
|
9
9
|
}
|
|
10
|
-
export declare function createSinglePointerRecognizer<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) =>
|
|
10
|
+
export declare function createSinglePointerRecognizer<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => boolean, _options?: SinglePointerOptions): SinglePointerRecognizer<InputSignal>;
|
|
11
11
|
//# sourceMappingURL=recognizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,uBAAuB,CAAC,WAAW,SAAS,MAAM;IACjE,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"recognizer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,uBAAuB,CAAC,WAAW,SAAS,MAAM;IACjE,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,6BAA6B,CAAC,WAAW,SAAS,MAAM,EACtE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,KAAK,OAAO,EACpF,QAAQ,GAAE,oBAAyB,GAClC,uBAAuB,CAAC,WAAW,CAAC,CAuBtC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./stream-BvdJvQie.cjs"),m=require("./recognizer-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./stream-BvdJvQie.cjs"),m=require("./recognizer-D3UwuOb3.cjs"),g=require("./share-vzh9f3Jn.cjs"),W=require("./types-BGR5Mhw9.cjs"),Y=require("./single-pointer/pointer.cjs"),b="dom-event";function K(e){return m.createSignal(b,e)}function M(e,t,o){return d.createStream(n=>{const r=c=>{n.next(K(c))};return e.addEventListener(t,r,o),()=>{e.removeEventListener(t,r,o)}})}const h=["mousedown","mousemove","mouseup"];function z(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<h.length;r++){const c=h[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<h.length;r++){const c=h[r];e.removeEventListener(c,n,t)}}})}const y=["pointerdown","pointermove","pointerup","pointercancel"];function L(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<y.length;r++){const c=y[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<y.length;r++){const c=y[r];e.removeEventListener(c,n,t)}}})}const p=["touchstart","touchmove","touchend","touchcancel"];function G(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<p.length;r++){const c=p[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<p.length;r++){const c=p[r];e.removeEventListener(c,n,t)}}})}const N="keyboard";function x(e){return m.createSignal(N,e)}function E(e,t){return x({phase:t,key:e.key,code:e.code,repeat:e.repeat,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,originalEvent:e})}const v=new WeakMap,P=new WeakMap;function O(e){return d.createStream(t=>{const o=r=>{t.next(E(r,"down"))},n=r=>{t.next(E(r,"up"))};return e.addEventListener("keydown",o),e.addEventListener("keyup",n),()=>{e.removeEventListener("keydown",o),e.removeEventListener("keyup",n)}})}function w(e){let t=v.get(e);return t||(t=g.share()(O(e)),v.set(e,t)),t}function X(e){return d.createStream(t=>{const o=n=>{t.next(E(n,"down"))};return e.addEventListener("keydown",o),()=>{e.removeEventListener("keydown",o)}})}function D(e){let t=P.get(e);return t||(t=g.share()(X(e)),P.set(e,t)),t}function F(e,t){if(!t)return w(e);const o=t.modifiers,n=t.preventDefault??!0,r=t.allowRepeat??!1,c=t.code?Array.isArray(t.code)?t.code.map(a=>a.toLowerCase()):[t.code.toLowerCase()]:null,u=w(e),i=a=>c?c.includes(a.code.toLowerCase()):!0,l=a=>!o||o.length===0?!0:o.some(s=>{switch(s){case"meta":return a.metaKey;case"ctrl":return a.ctrlKey;case"alt":return a.altKey;case"shift":return a.shiftKey;default:return!1}});return d.createStream(a=>u.on({next(s){const{repeat:f}=s.value;!r&&f||i(s.value)&&l(s.value)&&(n&&s.value.originalEvent.preventDefault(),a.next(s))},error:a.error?.bind(a),complete:a.complete?.bind(a)}))}function H(e,t){if(!t)return D(e);const o=t.modifiers,n=t.preventDefault??!0,r=t.allowRepeat??!1,c=t.code?Array.isArray(t.code)?t.code.map(a=>a.toLowerCase()):[t.code.toLowerCase()]:null,u=D(e),i=a=>c?c.includes(a.code.toLowerCase()):!0,l=a=>!o||o.length===0?!0:o.some(s=>{switch(s){case"meta":return a.metaKey;case"ctrl":return a.ctrlKey;case"alt":return a.altKey;case"shift":return a.shiftKey;default:return!1}});return d.createStream(a=>u.on({next(s){const{repeat:f}=s.value;!r&&f||i(s.value)&&l(s.value)&&(n&&s.value.originalEvent.preventDefault(),a.next(s))},error:a.error?.bind(a),complete:a.complete?.bind(a)}))}const k="keyheld";function q(e,t){const{code:o}=t,n=o.toLowerCase(),r=w(e);return d.createStream(c=>{let u;const i=l=>{l!==u&&(u=l,c.next(m.createSignal(k,{held:l})))};return r.on({next(l){const{code:a,phase:s,repeat:f}=l.value;f||a.toLowerCase()===n&&i(s==="down")},error:c.error?.bind(c),complete:c.complete?.bind(c)})})}const U="multi-pointer";function V(e){return m.createSignal(U,e)}function $(e,t={}){const o={maxPointers:t.maxPointers??2},n=new Map;let r="idle";function c(u,i){return u===0?r==="active"&&i>0?"ended":"idle":"active"}return{process(u){const i=e(u,n,o);if(i===null)return null;const l=i.endedPointerIds;for(const R of l)n.delete(R);const a=Array.from(n.values()),s=c(a.length,l.length);r=s==="ended"?"idle":s;const f={phase:s,pointers:a,count:a.length};return V(f)},get isActive(){return n.size>0},get activeCount(){return n.size},reset(){n.clear(),r="idle"},dispose(){this.reset()}}}function B(e={}){function t(o,n,r){const c=o.value,u=`${c.pointerType}-${c.pointerId}`,i=[];switch(c.type){case"pointerdown":{if(n.size>=r.maxPointers)return null;n.set(u,S(c,"start"));break}case"pointermove":{if(!n.has(u))return null;n.set(u,S(c,"move"));break}case"pointerup":{if(!n.has(u))return null;n.set(u,S(c,"end")),i.push(u);break}case"pointercancel":{if(!n.has(u))return null;n.set(u,S(c,"cancel")),i.push(u);break}default:return null}return{pointers:n,endedPointerIds:i}}return $(t,e)}function _(e={}){return t=>d.createStream(o=>{const n=B(e),r=t.on({next(c){const u=n.process(c);u&&o.next(u)},error(c){o.error?.(c)},complete(){o.complete?.()}});return()=>{r(),n.dispose()}})}function S(e,t){const o=t==="start"||t==="end"?W.toSinglePointerButton(e.button):"none";return{id:`${e.pointerType}-${e.pointerId}`,phase:t,x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY,pointerType:Z(e.pointerType),button:o,pressure:e.pressure}}function Z(e){switch(e){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}function j(e,t={}){const o=L(e);return _(t)(o)}function J(e,t={}){const o=L(e);return Y.singlePointerRecognizer(t)(o)}const C="wheel";function A(e){return m.createSignal(C,e)}function Q(e){switch(e){case 0:return"pixel";case 1:return"line";case 2:return"page";default:return"pixel"}}function T(e){return A({deltaX:e.deltaX,deltaY:e.deltaY,deltaZ:e.deltaZ,deltaMode:Q(e.deltaMode),x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,originalEvent:e})}const I=new WeakMap;function ee(e,t){let o=I.get(e);o||(o=new Map,I.set(e,o));let n=o.get(t);return n||(n=g.share()(te(e,t)),o.set(t,n)),n}function te(e,t){return d.createStream(o=>{const n=r=>{o.next(T(r))};return e.addEventListener("wheel",n,{passive:t}),()=>{e.removeEventListener("wheel",n)}})}function re(e,t){const o=t?.passive??!0,n=t?.modifiers,r=t?.preventDefault??!1,c=ee(e,o);if(!n?.length&&!r)return c;const u=i=>!n||n.length===0?!0:n.some(l=>{switch(l){case"meta":return i.metaKey;case"ctrl":return i.ctrlKey;case"alt":return i.altKey;case"shift":return i.shiftKey;default:return!1}});return d.createStream(i=>c.on({next(l){try{u(l.value)&&(r&&l.value.originalEvent.preventDefault(),i.next(l))}catch(a){i.error?.(a)}},error:i.error?.bind(i),complete:i.complete?.bind(i)}))}exports.createStream=d.createStream;exports.createSignal=m.createSignal;exports.setCerebDeviceId=m.setCerebDeviceId;exports.KEYBOARD_SIGNAL_KIND=N;exports.KEYHELD_SIGNAL_KIND=k;exports.WHEEL_SIGNAL_KIND=C;exports.createKeyboardSignal=x;exports.createKeyboardSignalFromEvent=E;exports.createWheelSignal=A;exports.createWheelSignalFromEvent=T;exports.domEvent=M;exports.keyboard=F;exports.keydown=H;exports.keyheld=q;exports.mouseEvents=z;exports.multiPointer=j;exports.multiPointerFromPointer=_;exports.pointerEvents=L;exports.singlePointer=J;exports.touchEvents=G;exports.wheel=re;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as d } from "./stream-Y3XFAhlB.js";
|
|
2
|
-
import { a as m } from "./recognizer-
|
|
3
|
-
import { s as le } from "./recognizer-
|
|
2
|
+
import { a as m } from "./recognizer-BzvWMkxq.js";
|
|
3
|
+
import { s as le } from "./recognizer-BzvWMkxq.js";
|
|
4
4
|
import { s as v } from "./share-BEu5SsOX.js";
|
|
5
5
|
import { t as I } from "./types-Ccnqx90M.js";
|
|
6
6
|
import { singlePointerRecognizer as N } from "./single-pointer/pointer.js";
|
package/dist/operators/zoom.d.ts
CHANGED
|
@@ -6,6 +6,16 @@ import { Operator } from '../core/stream.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export interface ZoomInput {
|
|
8
8
|
ratio: number;
|
|
9
|
+
/**
|
|
10
|
+
* Optional phase for session-based zoom (e.g., pinch gestures).
|
|
11
|
+
*
|
|
12
|
+
* When provided:
|
|
13
|
+
* - 'start': Captures baseScale at session start
|
|
14
|
+
* - 'end' or 'cancel': Resets session state for next gesture
|
|
15
|
+
*
|
|
16
|
+
* When not provided, falls back to prevScale-based detection.
|
|
17
|
+
*/
|
|
18
|
+
phase?: "start" | "change" | "end" | "cancel" | string;
|
|
9
19
|
}
|
|
10
20
|
export interface ZoomOptions {
|
|
11
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../src/operators/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../src/operators/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IAEd,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,UAAU,CAAC,SAAS,CAAC,EAClD,OAAO,GAAE,WAAgB,GACxB,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CA4D9C"}
|
package/dist/operators.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./stream-BvdJvQie.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./stream-BvdJvQie.cjs"),S=require("./share-vzh9f3Jn.cjs");function P(...r){return c=>c.pipe(...r)}function B(r){return c=>i.createStream(t=>{let e=null;const n=c.on({next(l){e!==null&&clearTimeout(e),e=setTimeout(()=>{e=null,t.next(l)},r)},error:t.error?.bind(t),complete(){e!==null&&clearTimeout(e),t.complete?.()}});return()=>{e!==null&&clearTimeout(e),n()}})}function C(r){return c=>i.createStream(t=>c.on({next(e){try{const n=r(e),l=e.value;Object.assign(l,n),t.next(e)}catch(n){t.error?.(n)}},error:t.error?.bind(t),complete:t.complete?.bind(t)}))}function O(r){return c=>i.createStream(t=>c.on({next(e){try{r(e)&&t.next(e)}catch(n){t.error?.(n)}},error:t.error?.bind(t),complete:t.complete?.bind(t)}))}function j(r){return c=>i.createStream(t=>c.on({next(e){try{t.next(r(e))}catch(n){t.error?.(n)}},error:t.error?.bind(t),complete:t.complete?.bind(t)}))}function k(r){return c=>i.createStream(t=>{let e=0;const n=()=>{e++,e===2&&t.complete?.()},l=c.on({next:a=>t.next(a),error:t.error?.bind(t),complete:n}),o=r.on({next:a=>t.next(a),error:t.error?.bind(t),complete:n});return()=>{l(),o()}})}function E(...r){return i.createStream(c=>{let t=0;const e=r.map(n=>n.on({next:l=>c.next(l),error:c.error?.bind(c),complete:()=>{t++,t===r.length&&c.complete?.()}}));return()=>{for(const n of e)n()}})}function I(r,c){r.value.offsetX=r.value.x-c.left,r.value.offsetY=r.value.y-c.top}function M(r){const{target:c,recalculate$:t}=r;if(!c)throw new Error("offset operator requires a valid target element");return e=>i.createStream(n=>{let l=null;function o(){return t?(l||(l=c.getBoundingClientRect()),l):c.getBoundingClientRect()}let a;t&&(a=t.on({next(){l=c.getBoundingClientRect()}}));const u=e.on({next(m){try{const f=o();I(m,f),n.next(m)}catch(f){n.error?.(f)}},error:n.error?.bind(n),complete(){n.complete?.()}});return()=>{u(),a?.()}})}function U(r,c){return t=>i.createStream(e=>{let n=c??{};return t.on({next(l){try{n=r(n,l);const o=l.value;Object.assign(o,n),e.next(l)}catch(o){e.error?.(o)}},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function y(r){return c=>i.createStream(t=>{let e=!1;return c.on({next(n){try{e?(t.next(n),r.end(n)&&(e=!1)):r.start(n)&&(e=!0,t.next(n))}catch(l){t.error?.(l)}},error:t.error?.bind(t),complete:t.complete?.bind(t)})})}function q(){return y({start:r=>r.value.phase==="start",end:r=>r.value.phase==="end"||r.value.phase==="cancel"})}function z(r){return c=>i.createStream(t=>{let e=!1,n=new Set;return c.on({next(l){try{const o=l.value.pointers;if(e)t.next(l),o.some(u=>n.has(u.id)&&(u.phase==="end"||u.phase==="cancel"))&&(e=!1,n.clear());else{const a=o.filter(u=>u.phase==="start"||u.phase==="move");a.length>=r&&(e=!0,n=new Set(a.slice(0,r).map(u=>u.id)),t.next(l))}}catch(o){t.error?.(o)}},error:t.error?.bind(t),complete:t.complete?.bind(t)})})}function g(r){return c=>i.createStream(t=>c.on({next(e){try{r(e),t.next(e)}catch(n){t.error?.(n)}},error:t.error?.bind(t),complete:t.complete?.bind(t)}))}const L=g;function V(r){return c=>i.createStream(t=>{let e=null;return c.on({next(n){const l=performance.now();(e===null||l-e>=r)&&(e=l,t.next(n))},error:t.error?.bind(t),complete:t.complete?.bind(t)})})}function W(r){return c=>i.createStream(t=>{let e,n=!1,l=null;const o=c.on({next(a){e=a,n=!0,l===null&&(l=setTimeout(()=>{n&&(t.next(e),n=!1),l=null},r))},error:t.error?.bind(t),complete(){l!==null&&(clearTimeout(l),n&&t.next(e)),t.complete?.()}});return()=>{l!==null&&clearTimeout(l),o()}})}function X(r){return c=>i.createStream(t=>{let e=!1;const n=r.on({next(o){try{e=o.value.opened}catch(a){t.error?.(a)}}}),l=c.on({next(o){e&&t.next(o)},error:t.error?.bind(t),complete:t.complete?.bind(t)});return()=>{n(),l()}})}function Y(r,c,t){return Math.max(c,Math.min(t,r))}function $(r={}){const{minScale:c=.1,maxScale:t=10,baseScale:e=1,mode:n="multiply"}=r,l=typeof e=="function"?e:()=>e,o=n==="add"?(a,u)=>a+u:(a,u)=>a*u;return a=>i.createStream(u=>{let m=null,f=1;const w=a.on({next(p){try{const{ratio:d,phase:s}=p.value;(s==="start"||m===null)&&(f=l(),m=f);const T=o(f,d),h=Y(T,c,t),R=h-m;m=h;const x=p.value;x.scale=h,x.deltaScale=R,u.next(p),(s==="end"||s==="cancel")&&(m=null)}catch(d){u.error?.(d)}},error:u.error?.bind(u),complete(){m=null,u.complete?.()}});return()=>{m=null,w()}})}exports.share=S.share;exports.shareReplay=S.shareReplay;exports.compose=P;exports.debounce=B;exports.extend=C;exports.filter=O;exports.map=j;exports.merge=E;exports.mergeWith=k;exports.multiPointerSession=z;exports.offset=M;exports.reduce=U;exports.session=y;exports.singlePointerSession=q;exports.spy=g;exports.tap=L;exports.throttle=V;exports.throttleLast=W;exports.when=X;exports.zoom=$;
|
|
2
2
|
//# sourceMappingURL=operators.cjs.map
|
package/dist/operators.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operators.cjs","sources":["../src/operators/compose.ts","../src/operators/debounce.ts","../src/operators/extend.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/offset.ts","../src/operators/reduce.ts","../src/operators/session.ts","../src/operators/spy.ts","../src/operators/throttle.ts","../src/operators/when.ts","../src/operators/zoom.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => source.pipe(...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.on({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { ExtendSignalValue, Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function extend<T extends Signal, A extends object>(\n extender: (signal: T) => A,\n): Operator<T, ExtendSignalValue<T, A>> {\n type OutputSignal = ExtendSignalValue<T, A>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n return source.on({\n next(signal) {\n try {\n const a = extender(signal);\n\n const value = signal.value as T[\"value\"] & A;\n Object.assign(value, a);\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { ExtendSignalValue, Signal, SignalWith } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface OffsetOptions {\n target: Element;\n /**\n * Optional stream that triggers rect recalculation.\n * When provided, the operator caches the rect and only recalculates when this stream emits.\n * When not provided, getBoundingClientRect() is called on every signal (always accurate).\n *\n * @example\n * // Cache rect, recalculate on window resize\n * const resize$ = domEvent(window, 'resize');\n * offset({ target: el, recalculate$: resize$ })\n *\n * @example\n * // Always calculate (no caching, always accurate)\n * offset({ target: el })\n */\n recalculate$?: Stream<Signal>;\n}\n\nexport interface PointerValue {\n x: number;\n y: number;\n}\n\nexport interface OffsetValue {\n offsetX: number;\n offsetY: number;\n}\n\ntype OffsetInputValue = PointerValue & Partial<OffsetValue>;\n\nexport type OffsetOperatorResult<T extends SignalWith<OffsetInputValue>> = ExtendSignalValue<\n T,\n OffsetValue\n>;\n\nfunction applyOffset<T extends SignalWith<OffsetInputValue>>(\n signal: T,\n rect: DOMRect,\n): asserts signal is T & ExtendSignalValue<T, OffsetValue> {\n signal.value.offsetX = signal.value.x - rect.left;\n signal.value.offsetY = signal.value.y - rect.top;\n}\n\n/**\n * Creates an operator that adds element-relative offset coordinates to pointer signals.\n * Uses getBoundingClientRect() to calculate offsetX and offsetY relative to the target element.\n *\n * @param options.target - The element to calculate offset relative to\n * @param options.recalculate$ - Optional stream that triggers rect recalculation for caching\n */\nexport function offset<T extends SignalWith<OffsetInputValue>>(\n options: OffsetOptions,\n): Operator<T, ExtendSignalValue<T, OffsetValue>> {\n const { target, recalculate$ } = options;\n if (!target) {\n throw new Error(\"offset operator requires a valid target element\");\n }\n\n type OutputSignal = ExtendSignalValue<T, OffsetValue>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let cachedRect: DOMRect | null = null;\n\n function getRect(): DOMRect {\n // If recalculate$ is provided, use caching\n if (recalculate$) {\n if (!cachedRect) {\n cachedRect = target.getBoundingClientRect();\n }\n return cachedRect;\n }\n // No recalculate$ means always calculate fresh\n return target.getBoundingClientRect();\n }\n\n // Subscribe to recalculate$ if provided\n let recalculateUnsub: (() => void) | undefined;\n if (recalculate$) {\n recalculateUnsub = recalculate$.on({\n next() {\n cachedRect = target.getBoundingClientRect();\n },\n });\n }\n\n const unsub = source.on({\n next(signal) {\n try {\n const rect = getRect();\n applyOffset(signal, rect);\n observer.next(signal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recalculateUnsub?.();\n };\n });\n}\n","import type { ExtendSignalValue, Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Applies a reducer function over the source stream, extending each signal's value\n * with the accumulated state while preserving signal metadata (kind, deviceId, createdAt).\n *\n * Unlike traditional scan/reduce which replaces the entire value, this operator merges\n * the accumulated state into the original signal's value, following Cereb's signal\n * extension pattern.\n *\n * @param reducer - Function that receives the previous accumulated state and current signal,\n * returning the new accumulated state to merge into the signal's value.\n * @param seed - The initial accumulated state.\n *\n * @example\n * ```typescript\n * // Track cumulative distance for zoom\n * pipe(\n * wheelSignals$,\n * reduce((acc, signal) => ({\n * initialDistance: acc.initialDistance,\n * distance: acc.distance + (-signal.value.deltaY * 0.5),\n * velocity: (-signal.value.deltaY * 0.5) / 16\n * }), { initialDistance: 100, distance: 100, velocity: 0 }),\n * zoom()\n * )\n * ```\n */\nexport function reduce<T extends Signal, A extends object>(\n reducer: (acc: A, signal: T) => A,\n seed?: A,\n): Operator<T, ExtendSignalValue<T, A>> {\n type OutputSignal = ExtendSignalValue<T, A>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let acc = seed ?? ({} as A);\n\n return source.on({\n next(signal) {\n try {\n acc = reducer(acc, signal);\n\n const value = signal.value as T[\"value\"] & A;\n Object.assign(value, acc);\n\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { MultiPointerSignal } from \"../browser/multi-pointer/multi-pointer-signal.js\";\nimport type { SinglePointerSignal } from \"../browser/single-pointer/single-pointer-signal.js\";\nimport type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface SessionOptions<T extends Signal> {\n start: (signal: T) => boolean;\n end: (signal: T) => boolean;\n}\n\n/**\n * Filters signals to only emit during active sessions.\n * A session begins when the start predicate returns true and ends when the end predicate returns true.\n * Both start and end signals are included in the output.\n * Sessions can repeat: after an end, the next start begins a new session.\n */\nexport function session<T extends Signal>(options: SessionOptions<T>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n\n return source.on({\n next(value) {\n try {\n if (!active) {\n if (options.start(value)) {\n active = true;\n observer.next(value);\n }\n } else {\n observer.next(value);\n if (options.end(value)) {\n active = false;\n }\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function singlePointerSession(): Operator<SinglePointerSignal, SinglePointerSignal> {\n return session({\n start: (signal) => signal.value.phase === \"start\",\n end: (signal) => signal.value.phase === \"end\" || signal.value.phase === \"cancel\",\n });\n}\n\n/**\n * Filters multi-pointer signals to only emit during active sessions.\n * A session begins when the required number of pointers are in working state (start/move).\n * A session ends when any of the tracked pointers ends or cancels.\n * Additional pointers beyond requiredCount are ignored; only the initial tracked pointers matter.\n */\nexport function multiPointerSession(\n requiredCount: number,\n): Operator<MultiPointerSignal, MultiPointerSignal> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n let trackedPointerIds: Set<string> = new Set();\n\n return source.on({\n next(signal) {\n try {\n const pointers = signal.value.pointers;\n\n if (!active) {\n const workingPointers = pointers.filter(\n (p) => p.phase === \"start\" || p.phase === \"move\",\n );\n if (workingPointers.length >= requiredCount) {\n active = true;\n trackedPointerIds = new Set(\n workingPointers.slice(0, requiredCount).map((p) => p.id),\n );\n observer.next(signal);\n }\n } else {\n observer.next(signal);\n const hasEnded = pointers.some(\n (p) => trackedPointerIds.has(p.id) && (p.phase === \"end\" || p.phase === \"cancel\"),\n );\n if (hasEnded) {\n active = false;\n trackedPointerIds.clear();\n }\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * eventSource<PointerEvent>(element, \"pointermove\")\n * .pipe(\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * )\n * .on();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.on({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.on({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Passes through source signals only when the gate stream's latest value is true.\n *\n * The gate stream should emit signals with a `held` property indicating the gate state.\n * Source signals are passed through when `held` is true, blocked when false.\n *\n * @param gate - Stream that controls whether source signals pass through\n *\n * @example\n * ```typescript\n * const isZHeld$ = pipe(\n * keyboard(window),\n * keyboardFilter({ key: 'z', modifiers: ['meta'] }),\n * keyboardHeld()\n * );\n *\n * pipe(\n * keyboard(window),\n * keyboardFilter({ key: ['+', '-'] }),\n * when(isZHeld$) // Only pass through when Z is held\n * ).on(...)\n * ```\n */\nexport function when<TSource extends Signal>(\n gate: Stream<Signal<string, { opened: boolean }>>,\n): Operator<TSource, TSource> {\n return (source) =>\n createStream<TSource>((observer) => {\n let isOpen = false;\n\n const gateUnsub = gate.on({\n next(signal) {\n try {\n isOpen = signal.value.opened;\n } catch (err) {\n observer.error?.(err);\n }\n },\n });\n\n const sourceUnsub = source.on({\n next(signal) {\n if (isOpen) {\n observer.next(signal);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n gateUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { ExtendSignalValue, SignalWith } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Required value properties for zoom operator input.\n * A signal must have these properties to be used with zoom().\n */\nexport interface ZoomInput {\n ratio: number;\n}\n\nexport interface ZoomOptions {\n /**\n * Minimum allowed scale value.\n * Scale below this will be clamped.\n * @default 0.1\n */\n minScale?: number;\n\n /**\n * Maximum allowed scale value.\n * Scale above this will be clamped.\n * @default 10.0\n */\n maxScale?: number;\n\n /**\n * Base scale value or a function that returns the current scale.\n *\n * When a function is provided, it is called once at the start of each session\n * (first event after stream creation or after complete). This enables proper\n * synchronization with external state when multiple input sources control zoom.\n *\n * @example\n * ```typescript\n * // Static value (default behavior)\n * zoom({ baseScale: 1.0 })\n *\n * // Dynamic reference to external state\n * zoom({ baseScale: () => zoomManager.getScale() })\n * ```\n *\n * @default 1.0\n */\n baseScale?: number | (() => number);\n\n /**\n * How ratio is applied to baseScale.\n *\n * - `'multiply'`: scale = baseScale × ratio (default)\n * Use for pinch gestures where ratio represents a scale factor (1.0 = no change)\n *\n * - `'add'`: scale = baseScale + ratio\n * Use for delta-based inputs where ratio represents a change amount\n *\n * @example\n * ```typescript\n * // Pinch: ratio is 1.2 means \"120% of base\" → multiply\n * pinch(el).pipe(zoom({ mode: 'multiply', baseScale: getScale }))\n *\n * // Keyboard: ratio is 0.1 means \"+0.1 to base\" → add\n * keyboard(el).pipe(\n * extend(() => ({ ratio: 0.1 })),\n * zoom({ mode: 'add', baseScale: getScale })\n * )\n * ```\n *\n * @default 'multiply'\n */\n mode?: \"multiply\" | \"add\";\n}\n\n/**\n * Zoom values added by zoom() operator.\n */\nexport interface ZoomValue {\n /** Current scale factor (1.0 = initial, >1 = zoom in, <1 = zoom out) */\n scale: number;\n\n /** Scale change since last event */\n deltaScale: number;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Creates an operator that adds scale/zoom calculations to distance-based signals.\n *\n * This operator transforms raw distance data into scale values, handling:\n * - Scale calculation from distance ratio\n * - Min/max scale clamping\n * - Delta scale computation\n * - Scale velocity computation\n *\n * @example\n * ```typescript\n * pipe(\n * pinch(element),\n * zoom({ minScale: 0.5, maxScale: 3.0 })\n * ).on(event => {\n * console.log(event.value.scale); // 0.5 ~ 3.0\n * console.log(event.value.scaleVelocity); // scale change per ms\n * });\n * ```\n */\nexport function zoom<T extends SignalWith<ZoomInput>>(\n options: ZoomOptions = {},\n): Operator<T, ExtendSignalValue<T, ZoomValue>> {\n const { minScale = 0.1, maxScale = 10.0, baseScale = 1.0, mode = \"multiply\" } = options;\n const resolveBaseScale = typeof baseScale === \"function\" ? baseScale : () => baseScale;\n const applyRatio =\n mode === \"add\"\n ? (base: number, ratio: number) => base + ratio\n : (base: number, ratio: number) => base * ratio;\n\n type OutputSignal = ExtendSignalValue<T, ZoomValue>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let prevScale: number | null = null;\n let sessionBaseScale = 1.0;\n\n const unsub = source.on({\n next(signal) {\n try {\n const { ratio } = signal.value;\n\n // Capture baseScale at session start (first event or after complete)\n sessionBaseScale = resolveBaseScale();\n if (prevScale === null) {\n prevScale = sessionBaseScale;\n }\n\n const rawScale = applyRatio(sessionBaseScale, ratio);\n const scale = clamp(rawScale, minScale, maxScale);\n const deltaScale = scale - prevScale;\n\n prevScale = scale;\n\n const value = signal.value as ZoomInput & ZoomValue;\n value.scale = scale;\n value.deltaScale = deltaScale;\n\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n prevScale = null;\n observer.complete?.();\n },\n });\n\n return () => {\n prevScale = null;\n unsub();\n };\n });\n}\n"],"names":["compose","operators","source","debounce","ms","createStream","observer","timeoutId","unsub","value","extend","extender","signal","a","err","filter","predicate","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","applyOffset","rect","offset","options","target","recalculate$","cachedRect","getRect","recalculateUnsub","reduce","reducer","seed","acc","session","active","singlePointerSession","multiPointerSession","requiredCount","trackedPointerIds","pointers","p","workingPointers","spy","fn","tap","throttle","lastTime","now","throttleLast","lastValue","hasValue","when","gate","isOpen","gateUnsub","sourceUnsub","clamp","min","max","zoom","minScale","maxScale","baseScale","mode","resolveBaseScale","applyRatio","base","ratio","prevScale","sessionBaseScale","rawScale","scale","deltaScale"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"operators.cjs","sources":["../src/operators/compose.ts","../src/operators/debounce.ts","../src/operators/extend.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/offset.ts","../src/operators/reduce.ts","../src/operators/session.ts","../src/operators/spy.ts","../src/operators/throttle.ts","../src/operators/when.ts","../src/operators/zoom.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => source.pipe(...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.on({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { ExtendSignalValue, Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function extend<T extends Signal, A extends object>(\n extender: (signal: T) => A,\n): Operator<T, ExtendSignalValue<T, A>> {\n type OutputSignal = ExtendSignalValue<T, A>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n return source.on({\n next(signal) {\n try {\n const a = extender(signal);\n\n const value = signal.value as T[\"value\"] & A;\n Object.assign(value, a);\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.on({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { ExtendSignalValue, Signal, SignalWith } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface OffsetOptions {\n target: Element;\n /**\n * Optional stream that triggers rect recalculation.\n * When provided, the operator caches the rect and only recalculates when this stream emits.\n * When not provided, getBoundingClientRect() is called on every signal (always accurate).\n *\n * @example\n * // Cache rect, recalculate on window resize\n * const resize$ = domEvent(window, 'resize');\n * offset({ target: el, recalculate$: resize$ })\n *\n * @example\n * // Always calculate (no caching, always accurate)\n * offset({ target: el })\n */\n recalculate$?: Stream<Signal>;\n}\n\nexport interface PointerValue {\n x: number;\n y: number;\n}\n\nexport interface OffsetValue {\n offsetX: number;\n offsetY: number;\n}\n\ntype OffsetInputValue = PointerValue & Partial<OffsetValue>;\n\nexport type OffsetOperatorResult<T extends SignalWith<OffsetInputValue>> = ExtendSignalValue<\n T,\n OffsetValue\n>;\n\nfunction applyOffset<T extends SignalWith<OffsetInputValue>>(\n signal: T,\n rect: DOMRect,\n): asserts signal is T & ExtendSignalValue<T, OffsetValue> {\n signal.value.offsetX = signal.value.x - rect.left;\n signal.value.offsetY = signal.value.y - rect.top;\n}\n\n/**\n * Creates an operator that adds element-relative offset coordinates to pointer signals.\n * Uses getBoundingClientRect() to calculate offsetX and offsetY relative to the target element.\n *\n * @param options.target - The element to calculate offset relative to\n * @param options.recalculate$ - Optional stream that triggers rect recalculation for caching\n */\nexport function offset<T extends SignalWith<OffsetInputValue>>(\n options: OffsetOptions,\n): Operator<T, ExtendSignalValue<T, OffsetValue>> {\n const { target, recalculate$ } = options;\n if (!target) {\n throw new Error(\"offset operator requires a valid target element\");\n }\n\n type OutputSignal = ExtendSignalValue<T, OffsetValue>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let cachedRect: DOMRect | null = null;\n\n function getRect(): DOMRect {\n // If recalculate$ is provided, use caching\n if (recalculate$) {\n if (!cachedRect) {\n cachedRect = target.getBoundingClientRect();\n }\n return cachedRect;\n }\n // No recalculate$ means always calculate fresh\n return target.getBoundingClientRect();\n }\n\n // Subscribe to recalculate$ if provided\n let recalculateUnsub: (() => void) | undefined;\n if (recalculate$) {\n recalculateUnsub = recalculate$.on({\n next() {\n cachedRect = target.getBoundingClientRect();\n },\n });\n }\n\n const unsub = source.on({\n next(signal) {\n try {\n const rect = getRect();\n applyOffset(signal, rect);\n observer.next(signal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recalculateUnsub?.();\n };\n });\n}\n","import type { ExtendSignalValue, Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Applies a reducer function over the source stream, extending each signal's value\n * with the accumulated state while preserving signal metadata (kind, deviceId, createdAt).\n *\n * Unlike traditional scan/reduce which replaces the entire value, this operator merges\n * the accumulated state into the original signal's value, following Cereb's signal\n * extension pattern.\n *\n * @param reducer - Function that receives the previous accumulated state and current signal,\n * returning the new accumulated state to merge into the signal's value.\n * @param seed - The initial accumulated state.\n *\n * @example\n * ```typescript\n * // Track cumulative distance for zoom\n * pipe(\n * wheelSignals$,\n * reduce((acc, signal) => ({\n * initialDistance: acc.initialDistance,\n * distance: acc.distance + (-signal.value.deltaY * 0.5),\n * velocity: (-signal.value.deltaY * 0.5) / 16\n * }), { initialDistance: 100, distance: 100, velocity: 0 }),\n * zoom()\n * )\n * ```\n */\nexport function reduce<T extends Signal, A extends object>(\n reducer: (acc: A, signal: T) => A,\n seed?: A,\n): Operator<T, ExtendSignalValue<T, A>> {\n type OutputSignal = ExtendSignalValue<T, A>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let acc = seed ?? ({} as A);\n\n return source.on({\n next(signal) {\n try {\n acc = reducer(acc, signal);\n\n const value = signal.value as T[\"value\"] & A;\n Object.assign(value, acc);\n\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { MultiPointerSignal } from \"../browser/multi-pointer/multi-pointer-signal.js\";\nimport type { SinglePointerSignal } from \"../browser/single-pointer/single-pointer-signal.js\";\nimport type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface SessionOptions<T extends Signal> {\n start: (signal: T) => boolean;\n end: (signal: T) => boolean;\n}\n\n/**\n * Filters signals to only emit during active sessions.\n * A session begins when the start predicate returns true and ends when the end predicate returns true.\n * Both start and end signals are included in the output.\n * Sessions can repeat: after an end, the next start begins a new session.\n */\nexport function session<T extends Signal>(options: SessionOptions<T>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n\n return source.on({\n next(value) {\n try {\n if (!active) {\n if (options.start(value)) {\n active = true;\n observer.next(value);\n }\n } else {\n observer.next(value);\n if (options.end(value)) {\n active = false;\n }\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function singlePointerSession(): Operator<SinglePointerSignal, SinglePointerSignal> {\n return session({\n start: (signal) => signal.value.phase === \"start\",\n end: (signal) => signal.value.phase === \"end\" || signal.value.phase === \"cancel\",\n });\n}\n\n/**\n * Filters multi-pointer signals to only emit during active sessions.\n * A session begins when the required number of pointers are in working state (start/move).\n * A session ends when any of the tracked pointers ends or cancels.\n * Additional pointers beyond requiredCount are ignored; only the initial tracked pointers matter.\n */\nexport function multiPointerSession(\n requiredCount: number,\n): Operator<MultiPointerSignal, MultiPointerSignal> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n let trackedPointerIds: Set<string> = new Set();\n\n return source.on({\n next(signal) {\n try {\n const pointers = signal.value.pointers;\n\n if (!active) {\n const workingPointers = pointers.filter(\n (p) => p.phase === \"start\" || p.phase === \"move\",\n );\n if (workingPointers.length >= requiredCount) {\n active = true;\n trackedPointerIds = new Set(\n workingPointers.slice(0, requiredCount).map((p) => p.id),\n );\n observer.next(signal);\n }\n } else {\n observer.next(signal);\n const hasEnded = pointers.some(\n (p) => trackedPointerIds.has(p.id) && (p.phase === \"end\" || p.phase === \"cancel\"),\n );\n if (hasEnded) {\n active = false;\n trackedPointerIds.clear();\n }\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * eventSource<PointerEvent>(element, \"pointermove\")\n * .pipe(\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * )\n * .on();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.on({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.on({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.on({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Passes through source signals only when the gate stream's latest value is true.\n *\n * The gate stream should emit signals with a `held` property indicating the gate state.\n * Source signals are passed through when `held` is true, blocked when false.\n *\n * @param gate - Stream that controls whether source signals pass through\n *\n * @example\n * ```typescript\n * const isZHeld$ = pipe(\n * keyboard(window),\n * keyboardFilter({ key: 'z', modifiers: ['meta'] }),\n * keyboardHeld()\n * );\n *\n * pipe(\n * keyboard(window),\n * keyboardFilter({ key: ['+', '-'] }),\n * when(isZHeld$) // Only pass through when Z is held\n * ).on(...)\n * ```\n */\nexport function when<TSource extends Signal>(\n gate: Stream<Signal<string, { opened: boolean }>>,\n): Operator<TSource, TSource> {\n return (source) =>\n createStream<TSource>((observer) => {\n let isOpen = false;\n\n const gateUnsub = gate.on({\n next(signal) {\n try {\n isOpen = signal.value.opened;\n } catch (err) {\n observer.error?.(err);\n }\n },\n });\n\n const sourceUnsub = source.on({\n next(signal) {\n if (isOpen) {\n observer.next(signal);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n gateUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { ExtendSignalValue, SignalWith } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Required value properties for zoom operator input.\n * A signal must have these properties to be used with zoom().\n */\nexport interface ZoomInput {\n ratio: number;\n\n /**\n * Optional phase for session-based zoom (e.g., pinch gestures).\n *\n * When provided:\n * - 'start': Captures baseScale at session start\n * - 'end' or 'cancel': Resets session state for next gesture\n *\n * When not provided, falls back to prevScale-based detection.\n */\n phase?: \"start\" | \"change\" | \"end\" | \"cancel\" | string;\n}\n\nexport interface ZoomOptions {\n /**\n * Minimum allowed scale value.\n * Scale below this will be clamped.\n * @default 0.1\n */\n minScale?: number;\n\n /**\n * Maximum allowed scale value.\n * Scale above this will be clamped.\n * @default 10.0\n */\n maxScale?: number;\n\n /**\n * Base scale value or a function that returns the current scale.\n *\n * When a function is provided, it is called once at the start of each session\n * (first event after stream creation or after complete). This enables proper\n * synchronization with external state when multiple input sources control zoom.\n *\n * @example\n * ```typescript\n * // Static value (default behavior)\n * zoom({ baseScale: 1.0 })\n *\n * // Dynamic reference to external state\n * zoom({ baseScale: () => zoomManager.getScale() })\n * ```\n *\n * @default 1.0\n */\n baseScale?: number | (() => number);\n\n /**\n * How ratio is applied to baseScale.\n *\n * - `'multiply'`: scale = baseScale × ratio (default)\n * Use for pinch gestures where ratio represents a scale factor (1.0 = no change)\n *\n * - `'add'`: scale = baseScale + ratio\n * Use for delta-based inputs where ratio represents a change amount\n *\n * @example\n * ```typescript\n * // Pinch: ratio is 1.2 means \"120% of base\" → multiply\n * pinch(el).pipe(zoom({ mode: 'multiply', baseScale: getScale }))\n *\n * // Keyboard: ratio is 0.1 means \"+0.1 to base\" → add\n * keyboard(el).pipe(\n * extend(() => ({ ratio: 0.1 })),\n * zoom({ mode: 'add', baseScale: getScale })\n * )\n * ```\n *\n * @default 'multiply'\n */\n mode?: \"multiply\" | \"add\";\n}\n\n/**\n * Zoom values added by zoom() operator.\n */\nexport interface ZoomValue {\n /** Current scale factor (1.0 = initial, >1 = zoom in, <1 = zoom out) */\n scale: number;\n\n /** Scale change since last event */\n deltaScale: number;\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Creates an operator that adds scale/zoom calculations to distance-based signals.\n *\n * This operator transforms raw distance data into scale values, handling:\n * - Scale calculation from distance ratio\n * - Min/max scale clamping\n * - Delta scale computation\n * - Scale velocity computation\n *\n * @example\n * ```typescript\n * pipe(\n * pinch(element),\n * zoom({ minScale: 0.5, maxScale: 3.0 })\n * ).on(event => {\n * console.log(event.value.scale); // 0.5 ~ 3.0\n * console.log(event.value.scaleVelocity); // scale change per ms\n * });\n * ```\n */\nexport function zoom<T extends SignalWith<ZoomInput>>(\n options: ZoomOptions = {},\n): Operator<T, ExtendSignalValue<T, ZoomValue>> {\n const { minScale = 0.1, maxScale = 10.0, baseScale = 1.0, mode = \"multiply\" } = options;\n const resolveBaseScale = typeof baseScale === \"function\" ? baseScale : () => baseScale;\n const applyRatio =\n mode === \"add\"\n ? (base: number, ratio: number) => base + ratio\n : (base: number, ratio: number) => base * ratio;\n\n type OutputSignal = ExtendSignalValue<T, ZoomValue>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let prevScale: number | null = null;\n let sessionBaseScale = 1.0;\n\n const unsub = source.on({\n next(signal) {\n try {\n const { ratio, phase } = signal.value;\n\n // Capture baseScale at session start\n // - If phase is provided: capture on 'start'\n // - If phase is not provided: capture on first event (prevScale === null)\n if (phase === \"start\" || prevScale === null) {\n sessionBaseScale = resolveBaseScale();\n prevScale = sessionBaseScale;\n }\n\n const rawScale = applyRatio(sessionBaseScale, ratio);\n const scale = clamp(rawScale, minScale, maxScale);\n const deltaScale = scale - prevScale;\n\n prevScale = scale;\n\n const value = signal.value as ZoomInput & ZoomValue;\n value.scale = scale;\n value.deltaScale = deltaScale;\n\n observer.next(signal as unknown as OutputSignal);\n\n // Reset session on end/cancel for next gesture\n if (phase === \"end\" || phase === \"cancel\") {\n prevScale = null;\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n prevScale = null;\n observer.complete?.();\n },\n });\n\n return () => {\n prevScale = null;\n unsub();\n };\n });\n}\n"],"names":["compose","operators","source","debounce","ms","createStream","observer","timeoutId","unsub","value","extend","extender","signal","a","err","filter","predicate","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","applyOffset","rect","offset","options","target","recalculate$","cachedRect","getRect","recalculateUnsub","reduce","reducer","seed","acc","session","active","singlePointerSession","multiPointerSession","requiredCount","trackedPointerIds","pointers","p","workingPointers","spy","fn","tap","throttle","lastTime","now","throttleLast","lastValue","hasValue","when","gate","isOpen","gateUnsub","sourceUnsub","clamp","min","max","zoom","minScale","maxScale","baseScale","mode","resolveBaseScale","applyRatio","base","ratio","prevScale","sessionBaseScale","phase","rawScale","scale","deltaScale"],"mappings":"2JAwCO,SAASA,KAAWC,EAAiE,CAC1F,OAAQC,GAAWA,EAAO,KAAK,GAAGD,CAAS,CAC7C,CCtCO,SAASE,EAA2BC,EAA4B,CACrE,OAAQF,GACNG,eAAcC,GAAa,CACzB,IAAIC,EAAkD,KAEtD,MAAMC,EAAQN,EAAO,GAAG,CACtB,KAAKO,EAAO,CACNF,IAAc,MAChB,aAAaA,CAAS,EAExBA,EAAY,WAAW,IAAM,CAC3BA,EAAY,KACZD,EAAS,KAAKG,CAAK,CACrB,EAAGL,CAAE,CACP,EACA,MAAOE,EAAS,OAAO,KAAKA,CAAQ,EACpC,UAAW,CACLC,IAAc,MAChB,aAAaA,CAAS,EAExBD,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACPC,IAAc,MAChB,aAAaA,CAAS,EAExBC,EAAA,CACF,CACF,CAAC,CACL,CC/BO,SAASE,EACdC,EACsC,CAGtC,OAAQT,GACNG,eAA4BC,GACnBJ,EAAO,GAAG,CACf,KAAKU,EAAQ,CACX,GAAI,CACF,MAAMC,EAAIF,EAASC,CAAM,EAEnBH,EAAQG,EAAO,MACrB,OAAO,OAAOH,EAAOI,CAAC,EACtBP,EAAS,KAAKM,CAAiC,CACjD,OAASE,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACF,CACL,CCvBO,SAASS,EAAyBC,EAAkD,CACzF,OAAQd,GACNG,eAAcC,GACLJ,EAAO,GAAG,CACf,KAAKO,EAAO,CACV,GAAI,CACEO,EAAUP,CAAK,GACjBH,EAAS,KAAKG,CAAK,CAEvB,OAASK,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACF,CACL,CCjBO,SAASW,EACdC,EACgB,CAChB,OAAQhB,GACNG,eAAcC,GACLJ,EAAO,GAAG,CACf,KAAKO,EAAO,CACV,GAAI,CACFH,EAAS,KAAKY,EAAUT,CAAK,CAAC,CAChC,OAASK,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACF,CACL,CCjBO,SAASa,EACdC,EACoB,CACpB,OAAQlB,GACNG,eAAcC,GAAa,CACzB,IAAIe,EAAiB,EAErB,MAAMC,EAAgB,IAAM,CAC1BD,IACIA,IAAmB,GACrBf,EAAS,WAAA,CAEb,EAEMiB,EAASrB,EAAO,GAAG,CACvB,KAAOO,GAAUH,EAAS,KAAKG,CAAK,EACpC,MAAOH,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUgB,CAAA,CACX,EAEKE,EAASJ,EAAM,GAAG,CACtB,KAAOX,GAAUH,EAAS,KAAKG,CAAK,EACpC,MAAOH,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUgB,CAAA,CACX,EAED,MAAO,IAAM,CACXC,EAAA,EACAC,EAAA,CACF,CACF,CAAC,CACL,CAEO,SAASC,KAA2BC,EAAiC,CAC1E,OAAOrB,EAAAA,aAAcC,GAAa,CAChC,IAAIe,EAAiB,EAErB,MAAMM,EAASD,EAAQ,IAAKxB,GAC1BA,EAAO,GAAG,CACR,KAAOO,GAAUH,EAAS,KAAKG,CAAK,EACpC,MAAOH,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAU,IAAM,CACde,IACIA,IAAmBK,EAAQ,QAC7BpB,EAAS,WAAA,CAEb,CAAA,CACD,CAAA,EAGH,MAAO,IAAM,CACX,UAAWE,KAASmB,EAClBnB,EAAA,CAEJ,CACF,CAAC,CACH,CCpBA,SAASoB,EACPhB,EACAiB,EACyD,CACzDjB,EAAO,MAAM,QAAUA,EAAO,MAAM,EAAIiB,EAAK,KAC7CjB,EAAO,MAAM,QAAUA,EAAO,MAAM,EAAIiB,EAAK,GAC/C,CASO,SAASC,EACdC,EACgD,CAChD,KAAM,CAAE,OAAAC,EAAQ,aAAAC,CAAA,EAAiBF,EACjC,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iDAAiD,EAKnE,OAAQ9B,GACNG,eAA4BC,GAAa,CACvC,IAAI4B,EAA6B,KAEjC,SAASC,GAAmB,CAE1B,OAAIF,GACGC,IACHA,EAAaF,EAAO,sBAAA,GAEfE,GAGFF,EAAO,sBAAA,CAChB,CAGA,IAAII,EACAH,IACFG,EAAmBH,EAAa,GAAG,CACjC,MAAO,CACLC,EAAaF,EAAO,sBAAA,CACtB,CAAA,CACD,GAGH,MAAMxB,EAAQN,EAAO,GAAG,CACtB,KAAKU,EAAQ,CACX,GAAI,CACF,MAAMiB,EAAOM,EAAA,EACbP,EAAYhB,EAAQiB,CAAI,EACxBvB,EAAS,KAAKM,CAAM,CACtB,OAASE,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,UAAW,CACTA,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACA4B,IAAA,CACF,CACF,CAAC,CACL,CClFO,SAASC,EACdC,EACAC,EACsC,CAGtC,OAAQrC,GACNG,eAA4BC,GAAa,CACvC,IAAIkC,EAAMD,GAAS,CAAA,EAEnB,OAAOrC,EAAO,GAAG,CACf,KAAKU,EAAQ,CACX,GAAI,CACF4B,EAAMF,EAAQE,EAAK5B,CAAM,EAEzB,MAAMH,EAAQG,EAAO,MACrB,OAAO,OAAOH,EAAO+B,CAAG,EAExBlC,EAAS,KAAKM,CAAiC,CACjD,OAASE,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACH,CAAC,CACL,CCxCO,SAASmC,EAA0BV,EAA4C,CACpF,OAAQ7B,GACNG,eAAcC,GAAa,CACzB,IAAIoC,EAAS,GAEb,OAAOxC,EAAO,GAAG,CACf,KAAKO,EAAO,CACV,GAAI,CACGiC,GAMHpC,EAAS,KAAKG,CAAK,EACfsB,EAAQ,IAAItB,CAAK,IACnBiC,EAAS,KAPPX,EAAQ,MAAMtB,CAAK,IACrBiC,EAAS,GACTpC,EAAS,KAAKG,CAAK,EAQzB,OAASK,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACH,CAAC,CACL,CAEO,SAASqC,GAA2E,CACzF,OAAOF,EAAQ,CACb,MAAQ7B,GAAWA,EAAO,MAAM,QAAU,QAC1C,IAAMA,GAAWA,EAAO,MAAM,QAAU,OAASA,EAAO,MAAM,QAAU,QAAA,CACzE,CACH,CAQO,SAASgC,EACdC,EACkD,CAClD,OAAQ3C,GACNG,eAAcC,GAAa,CACzB,IAAIoC,EAAS,GACTI,MAAqC,IAEzC,OAAO5C,EAAO,GAAG,CACf,KAAKU,EAAQ,CACX,GAAI,CACF,MAAMmC,EAAWnC,EAAO,MAAM,SAE9B,GAAK8B,EAYHpC,EAAS,KAAKM,CAAM,EACHmC,EAAS,KACvBC,GAAMF,EAAkB,IAAIE,EAAE,EAAE,IAAMA,EAAE,QAAU,OAASA,EAAE,QAAU,SAAA,IAGxEN,EAAS,GACTI,EAAkB,MAAA,OAlBT,CACX,MAAMG,EAAkBF,EAAS,OAC9BC,GAAMA,EAAE,QAAU,SAAWA,EAAE,QAAU,MAAA,EAExCC,EAAgB,QAAUJ,IAC5BH,EAAS,GACTI,EAAoB,IAAI,IACtBG,EAAgB,MAAM,EAAGJ,CAAa,EAAE,IAAKG,GAAMA,EAAE,EAAE,CAAA,EAEzD1C,EAAS,KAAKM,CAAM,EAExB,CAUF,OAASE,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACH,CAAC,CACL,CC3EO,SAAS4C,EAAsBC,EAAwC,CAC5E,OAAQjD,GACNG,eAAcC,GACLJ,EAAO,GAAG,CACf,KAAKO,EAAO,CACV,GAAI,CACF0C,EAAG1C,CAAK,EACRH,EAAS,KAAKG,CAAK,CACrB,OAASK,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACF,CACL,CAGO,MAAM8C,EAAMF,ECzCZ,SAASG,EAA2BjD,EAA4B,CACrE,OAAQF,GACNG,eAAcC,GAAa,CACzB,IAAIgD,EAA0B,KAE9B,OAAOpD,EAAO,GAAG,CACf,KAAKO,EAAO,CACV,MAAM8C,EAAM,YAAY,IAAA,GACpBD,IAAa,MAAQC,EAAMD,GAAYlD,KACzCkD,EAAWC,EACXjD,EAAS,KAAKG,CAAK,EAEvB,EACA,MAAOH,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,CACH,CAAC,CACL,CAEO,SAASkD,EAA+BpD,EAA4B,CACzE,OAAQF,GACNG,eAAcC,GAAa,CACzB,IAAImD,EACAC,EAAW,GACXnD,EAAkD,KAEtD,MAAMC,EAAQN,EAAO,GAAG,CACtB,KAAKO,EAAO,CACVgD,EAAYhD,EACZiD,EAAW,GAEPnD,IAAc,OAChBA,EAAY,WAAW,IAAM,CACvBmD,IACFpD,EAAS,KAAKmD,CAAU,EACxBC,EAAW,IAEbnD,EAAY,IACd,EAAGH,CAAE,EAET,EACA,MAAOE,EAAS,OAAO,KAAKA,CAAQ,EACpC,UAAW,CACLC,IAAc,OAChB,aAAaA,CAAS,EAClBmD,GACFpD,EAAS,KAAKmD,CAAU,GAG5BnD,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACPC,IAAc,MAChB,aAAaA,CAAS,EAExBC,EAAA,CACF,CACF,CAAC,CACL,CCrCO,SAASmD,EACdC,EAC4B,CAC5B,OAAQ1D,GACNG,eAAuBC,GAAa,CAClC,IAAIuD,EAAS,GAEb,MAAMC,EAAYF,EAAK,GAAG,CACxB,KAAKhD,EAAQ,CACX,GAAI,CACFiD,EAASjD,EAAO,MAAM,MACxB,OAASE,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,CAAA,CACD,EAEKiD,EAAc7D,EAAO,GAAG,CAC5B,KAAKU,EAAQ,CACPiD,GACFvD,EAAS,KAAKM,CAAM,CAExB,EACA,MAAON,EAAS,OAAO,KAAKA,CAAQ,EACpC,SAAUA,EAAS,UAAU,KAAKA,CAAQ,CAAA,CAC3C,EAED,MAAO,IAAM,CACXwD,EAAA,EACAC,EAAA,CACF,CACF,CAAC,CACL,CCoCA,SAASC,EAAMvD,EAAewD,EAAaC,EAAqB,CAC9D,OAAO,KAAK,IAAID,EAAK,KAAK,IAAIC,EAAKzD,CAAK,CAAC,CAC3C,CAsBO,SAAS0D,EACdpC,EAAuB,GACuB,CAC9C,KAAM,CAAE,SAAAqC,EAAW,GAAK,SAAAC,EAAW,GAAM,UAAAC,EAAY,EAAK,KAAAC,EAAO,UAAA,EAAexC,EAC1EyC,EAAmB,OAAOF,GAAc,WAAaA,EAAY,IAAMA,EACvEG,EACJF,IAAS,MACL,CAACG,EAAcC,IAAkBD,EAAOC,EACxC,CAACD,EAAcC,IAAkBD,EAAOC,EAI9C,OAAQzE,GACNG,eAA4BC,GAAa,CACvC,IAAIsE,EAA2B,KAC3BC,EAAmB,EAEvB,MAAMrE,EAAQN,EAAO,GAAG,CACtB,KAAKU,EAAQ,CACX,GAAI,CACF,KAAM,CAAE,MAAA+D,EAAO,MAAAG,CAAA,EAAUlE,EAAO,OAK5BkE,IAAU,SAAWF,IAAc,QACrCC,EAAmBL,EAAA,EACnBI,EAAYC,GAGd,MAAME,EAAWN,EAAWI,EAAkBF,CAAK,EAC7CK,EAAQhB,EAAMe,EAAUX,EAAUC,CAAQ,EAC1CY,EAAaD,EAAQJ,EAE3BA,EAAYI,EAEZ,MAAMvE,EAAQG,EAAO,MACrBH,EAAM,MAAQuE,EACdvE,EAAM,WAAawE,EAEnB3E,EAAS,KAAKM,CAAiC,GAG3CkE,IAAU,OAASA,IAAU,YAC/BF,EAAY,KAEhB,OAAS9D,EAAK,CACZR,EAAS,QAAQQ,CAAG,CACtB,CACF,EACA,MAAOR,EAAS,OAAO,KAAKA,CAAQ,EACpC,UAAW,CACTsE,EAAY,KACZtE,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXsE,EAAY,KACZpE,EAAA,CACF,CACF,CAAC,CACL"}
|