cereb 0.11.3 → 0.11.5

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 CHANGED
@@ -63,148 +63,39 @@ pinch(element)
63
63
 
64
64
  <br>
65
65
 
66
- ## API overview
66
+ ## Documentation
67
67
 
68
- Full API docs are coming soon.
69
- In the meantime, check the source—it's well-typed and commented:
68
+ ### Stream API
70
69
 
71
- - [Stream Factories](https://github.com/devphilip21/cereb/tree/main/packages/cereb/src/browser)
72
- - [Operators](https://github.com/devphilip21/cereb/tree/main/packages/cereb/src/operators)
70
+ Create streams from various input sources:
73
71
 
74
- <br>
75
-
76
- ## The Problems Cereb Solves
72
+ | API | Description |
73
+ |-----|-------------|
74
+ | [pan](https://cereb.dev/stream-api/pan) | Pan gesture with velocity and direction |
75
+ | [pinch](https://cereb.dev/stream-api/pinch) | Pinch gesture with distance and center |
76
+ | [singlePointer](https://cereb.dev/stream-api/single-pointer) | Unified pointer (mouse/touch/pen) |
77
+ | [multiPointer](https://cereb.dev/stream-api/multi-pointer) | Multi-touch tracking |
78
+ | [keyboard](https://cereb.dev/stream-api/keyboard) | Keyboard events (keydown + keyup) |
79
+ | [keydown](https://cereb.dev/stream-api/keydown) | Keydown events only |
80
+ | [keyheld](https://cereb.dev/stream-api/keyheld) | Track if a key is held |
81
+ | [wheel](https://cereb.dev/stream-api/wheel) | Wheel/scroll events |
82
+ | [domEvent](https://cereb.dev/stream-api/dom-event) | Any DOM event |
77
83
 
78
- ### 1. Event-Driven Code Becomes Spaghetti
84
+ ### Operator API
79
85
 
80
- Traditional event handlers create **scattered logic, side effects, and duplicated code** that's hard to maintain.
81
- See how this plays out in a multi-input zoom implementation:
86
+ Transform and compose streams with operators like `filter`, `map`, `merge`, `throttle`, `debounce`, and more.
82
87
 
83
- ```typescript
84
- // Before: Scattered handlers, shared state, duplicated logic
85
- let currentScale = 1;
86
- let isZoomMode = false;
87
- let initialPinchDistance = 0;
88
-
89
- window.addEventListener('keydown', e => {
90
- if (e.key === 'z') { isZoomMode = true; toggleZoomModeIndicator(true); }
91
- if (isZoomMode && (e.key === '+' || e.key === '=' || e.key === '-')) {
92
- e.preventDefault();
93
- currentScale = Math.max(MIN, Math.min(MAX, currentScale + ...));
94
- render(currentScale); // min/max logic here
95
- }
96
- });
97
- window.addEventListener('keyup', e => { /* isZoomMode = false ... */ });
98
-
99
- box.addEventListener('wheel', e => {
100
- if (!isZoomMode) return;
101
- currentScale = Math.max(MIN, Math.min(MAX, ...)); // duplicated
102
- render(currentScale);
103
- }, { passive: false });
104
-
105
- // Pinch: touchstart/touchmove/touchend, track two fingers, calculate distance...
106
- box.addEventListener('touchstart', e => { /* ... */ });
107
- box.addEventListener('touchmove', e => {
108
- // ... 10+ lines: distance calculation, ratio, min/max again
109
- });
110
- box.addEventListener('touchend', () => { /* cleanup */ });
111
-
112
- slider.addEventListener('input', e => { /* ... min/max again */ });
113
- // 8 handlers, 3+ shared states, min/max duplicated everywhere
114
- ```
88
+ [See all operators →](https://cereb.dev/operator-api/compose)
115
89
 
116
90
  <br>
117
91
 
118
- Cereb's solution:
119
- Model events as streams, and you get readable, reusable, extensible declarative pipelines.
120
-
121
- ```typescript
122
- // After: Clear flow, no side effects, composable
123
- import { keydown, keyheld, wheel, domEvent } from "cereb";
124
- import { zoom as createZoom, when, extend, spy } from "cereb/operators";
125
- import { pinch } from "@cereb/pinch";
126
-
127
- const zoomMode$ = keyheld(window, { code: "KeyZ" });
128
- const zoom = (op) => createZoom({ minScale: 0.5, maxScale: 3.0, baseScale: getScale, ...op });
129
-
130
- // Pinch zoom - phase-based session: baseScale captured at start, reset at end
131
- pinch(element)
132
- .pipe(zoom())
133
- .on(applyScale);
134
-
135
- // z + wheel zoom - ratio as absolute scale (current × factor)
136
- wheel(element, { passive: false })
137
- .pipe(
138
- when(zoomMode$),
139
- spy((signal) => signal.value.originalEvent.preventDefault()),
140
- extend((signal) => ({ ratio: getScale() * Math.exp(-signal.value.deltaY * 0.005) })),
141
- zoom({ baseScale: 1.0 }),
142
- )
143
- .on(applyScale);
144
-
145
- // z + '+/-' zoom - ratio as absolute scale (current × factor)
146
- keydown(window, { code: ["Equal", "Minus"] })
147
- .pipe(
148
- when(zoomMode$),
149
- spy((signal) => signal.value.originalEvent.preventDefault()),
150
- extend((signal) => ({ ratio: getScale() * (signal.value.code === "Equal" ? 1.2 : 1 / 1.2) })),
151
- zoom({ baseScale: 1.0 }),
152
- )
153
- .on(applyScale);
154
-
155
- // 'Slider Input' - sets absolute scale, so ratio is the target scale itself
156
- domEvent(slider, "input")
157
- .pipe(
158
- extend<DomEventSignal<Event>, ZoomInput>((signal) => {
159
- const inputElement = signal.value.target as HTMLInputElement;
160
- const value = Number(inputElement.value);
161
- const logScale = logMin + (value / 100) * (logMax - logMin);
162
- const scale = Math.exp(logScale);
163
- return {
164
- ratio: clamp(scale, MIN_SCALE, MAX_SCALE),
165
- };
166
- }),
167
- zoom({ baseScale: 1.0 }), // baseScale = 1.0 for absolute scale
168
- ).on(render);
169
- ```
170
-
171
- ### 2. Lightweight Bundle Size
172
-
173
- Benchmark: Equivalent pan gesture implementation
174
-
175
- | | Minified | Gzipped |
176
- |--|----------|---------|
177
- | cereb + @cereb/pan | 4.58 KB | **1.73 KB** |
178
- | Hammer.js | 20.98 KB | 7.52 KB |
179
-
180
- **~77% smaller** than Hammer.js for equivalent pan gesture functionality.
181
-
182
- ### 3. Performance & Resource Efficiency
183
-
184
- **3.1. Event Listener Reuse**
185
-
186
- ```typescript
187
- // Before: Multiple addEventListener calls
188
- window.addEventListener('keydown', handler1);
189
- window.addEventListener('keydown', handler2);
190
- window.addEventListener('keydown', handler3);
191
-
192
- // After: Shared stream, single listener
193
- // addEventListener called once
194
- keyboard(window).on(handler1);
195
- keyboard(window).on(handler2);
196
- keyboard(window).on(handler3);
197
- ```
92
+ ## The Problems Cereb Solves
198
93
 
199
- **3.2. Single Responsibility Operators**
94
+ - **Spaghetti Event Code** — Scattered handlers, shared mutable state, duplicated logic
95
+ - **Lightweight Bundle** — ~77% smaller than Hammer.js (1.73 KB gzipped for pan gesture)
96
+ - **Resource Efficiency** — Event listener reuse, single-responsibility operators
200
97
 
201
- ```typescript
202
- pan(element) // Pan gesture recognition
203
- .pipe(
204
- offset({ target }), // Element-relative coordinates
205
- axisLock() // Lock to horizontal/vertical
206
- )
207
- ```
98
+ [See detailed examples →](https://cereb.dev/core-concepts/the-problem-solves)
208
99
 
209
100
  <br>
210
101
 
@@ -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,CAmCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAuB3D"}
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,CA4CvD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAyB7D"}
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,CAmCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
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) => void, _options?: SinglePointerOptions): SinglePointerRecognizer<InputSignal>;
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;IACjD,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,IAAI,EACjF,QAAQ,GAAE,oBAAyB,GAClC,uBAAuB,CAAC,WAAW,CAAC,CAoBtC"}
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-DbiEtBOM.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;
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-CGZKcxpa.js";
3
- import { s as le } from "./recognizer-CGZKcxpa.js";
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";
@@ -2,7 +2,7 @@ let i = "";
2
2
  function c() {
3
3
  return i;
4
4
  }
5
- function g(e) {
5
+ function p(e) {
6
6
  i = e;
7
7
  }
8
8
  function s(e, r) {
@@ -14,11 +14,11 @@ function s(e, r) {
14
14
  };
15
15
  }
16
16
  const u = "single-pointer";
17
- function a(e) {
17
+ function l(e) {
18
18
  return s(u, e);
19
19
  }
20
- function l() {
21
- return a({
20
+ function a() {
21
+ return l({
22
22
  id: "",
23
23
  phase: "move",
24
24
  x: 0,
@@ -30,12 +30,12 @@ function l() {
30
30
  pressure: 0.5
31
31
  });
32
32
  }
33
- function p(e, r = {}) {
33
+ function d(e, r = {}) {
34
34
  let n = null;
35
35
  return {
36
36
  process: (o) => {
37
- const t = l();
38
- return e(o, t), n = t, t;
37
+ const t = a();
38
+ return e(o, t) ? (n = t, t) : null;
39
39
  },
40
40
  get isActive() {
41
41
  return n !== null;
@@ -50,7 +50,7 @@ function p(e, r = {}) {
50
50
  }
51
51
  export {
52
52
  s as a,
53
- p as c,
54
- g as s
53
+ d as c,
54
+ p as s
55
55
  };
56
- //# sourceMappingURL=recognizer-CGZKcxpa.js.map
56
+ //# sourceMappingURL=recognizer-BzvWMkxq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recognizer-CGZKcxpa.js","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Omit<T, \"value\"> & {\n readonly value: T[\"value\"] & Additional;\n};\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n processor(inputSignal, signal);\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","inputSignal","signal"],"mappings":"AAAA,IAAIA,IAAmB;AAEhB,SAASC,IAA2B;AACzC,SAAOD;AACT;AAEO,SAASE,EAAiBC,GAAkB;AACjD,EAAAH,IAAWG;AACb;ACgBO,SAASC,EACdC,GACAC,GACc;AACd,SAAO;AAAA,IACL,MAAAD;AAAA,IACA,OAAAC;AAAA,IACA,UAAUL,EAAA;AAAA,IACV,WAAW,YAAY,IAAA;AAAA,EAAI;AAE/B;AC7BO,MAAMM,IAA6B;AAmBnC,SAASC,EAA0BC,GAA6C;AACrF,SAAOL,EAAaG,GAA4BE,CAAO;AACzD;AAEO,SAASC,IAAwD;AACtE,SAAOF,EAA0B;AAAA,IAC/B,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA,CACX;AACH;AC1BO,SAASG,EACdC,GACAC,IAAiC,IACK;AACtC,MAAIC,IAAsC;AAE1C,SAAO;AAAA,IACL,SAAS,CAACC,MAAgB;AACxB,YAAMC,IAASN,EAAA;AACf,aAAAE,EAAUG,GAAaC,CAAM,GAC7BF,IAAUE,GACHA;AAAA,IACT;AAAA,IACA,IAAI,WAAoB;AACtB,aAAOF,MAAY;AAAA,IACrB;AAAA,IACA,QAAc;AACZ,MAAAA,IAAU;AAAA,IACZ;AAAA,IACA,UAAgB;AACd,WAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"recognizer-BzvWMkxq.js","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Omit<T, \"value\"> & {\n readonly value: T[\"value\"] & Additional;\n};\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal | null;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => boolean,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n const isValid = processor(inputSignal, signal);\n if (!isValid) {\n return null;\n }\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","inputSignal","signal"],"mappings":"AAAA,IAAIA,IAAmB;AAEhB,SAASC,IAA2B;AACzC,SAAOD;AACT;AAEO,SAASE,EAAiBC,GAAkB;AACjD,EAAAH,IAAWG;AACb;ACgBO,SAASC,EACdC,GACAC,GACc;AACd,SAAO;AAAA,IACL,MAAAD;AAAA,IACA,OAAAC;AAAA,IACA,UAAUL,EAAA;AAAA,IACV,WAAW,YAAY,IAAA;AAAA,EAAI;AAE/B;AC7BO,MAAMM,IAA6B;AAmBnC,SAASC,EAA0BC,GAA6C;AACrF,SAAOL,EAAaG,GAA4BE,CAAO;AACzD;AAEO,SAASC,IAAwD;AACtE,SAAOF,EAA0B;AAAA,IAC/B,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA,CACX;AACH;AC1BO,SAASG,EACdC,GACAC,IAAiC,IACK;AACtC,MAAIC,IAAsC;AAE1C,SAAO;AAAA,IACL,SAAS,CAACC,MAAgB;AACxB,YAAMC,IAASN,EAAA;AAEf,aADgBE,EAAUG,GAAaC,CAAM,KAI7CF,IAAUE,GACHA,KAHE;AAAA,IAIX;AAAA,IACA,IAAI,WAAoB;AACtB,aAAOF,MAAY;AAAA,IACrB;AAAA,IACA,QAAc;AACZ,MAAAA,IAAU;AAAA,IACZ;AAAA,IACA,UAAgB;AACd,WAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,2 @@
1
+ "use strict";let i="";function u(){return i}function l(e){i=e}function c(e,r){return{kind:e,value:r,deviceId:u(),createdAt:performance.now()}}const s="single-pointer";function a(e){return c(s,e)}function g(){return a({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"unknown",button:"none",pressure:.5})}function d(e,r={}){let n=null;return{process:o=>{const t=g();return e(o,t)?(n=t,t):null},get isActive(){return n!==null},reset(){n=null},dispose(){this.reset()}}}exports.createSignal=c;exports.createSinglePointerRecognizer=d;exports.setCerebDeviceId=l;
2
+ //# sourceMappingURL=recognizer-D3UwuOb3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"recognizer-DbiEtBOM.cjs","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Omit<T, \"value\"> & {\n readonly value: T[\"value\"] & Additional;\n};\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n processor(inputSignal, signal);\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","inputSignal","signal"],"mappings":"aAAA,IAAIA,EAAmB,GAEhB,SAASC,GAA2B,CACzC,OAAOD,CACT,CAEO,SAASE,EAAiBC,EAAkB,CACjDH,EAAWG,CACb,CCgBO,SAASC,EACdC,EACAC,EACc,CACd,MAAO,CACL,KAAAD,EACA,MAAAC,EACA,SAAUL,EAAA,EACV,UAAW,YAAY,IAAA,CAAI,CAE/B,CC7BO,MAAMM,EAA6B,iBAmBnC,SAASC,EAA0BC,EAA6C,CACrF,OAAOL,EAAaG,EAA4BE,CAAO,CACzD,CAEO,SAASC,GAAwD,CACtE,OAAOF,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,UACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CC1BO,SAASG,EACdC,EACAC,EAAiC,GACK,CACtC,IAAIC,EAAsC,KAE1C,MAAO,CACL,QAAUC,GAAgB,CACxB,MAAMC,EAASN,EAAA,EACf,OAAAE,EAAUG,EAAaC,CAAM,EAC7BF,EAAUE,EACHA,CACT,EACA,IAAI,UAAoB,CACtB,OAAOF,IAAY,IACrB,EACA,OAAc,CACZA,EAAU,IACZ,EACA,SAAgB,CACd,KAAK,MAAA,CACP,CAAA,CAEJ"}
1
+ {"version":3,"file":"recognizer-D3UwuOb3.cjs","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Omit<T, \"value\"> & {\n readonly value: T[\"value\"] & Additional;\n};\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal | null;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => boolean,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n const isValid = processor(inputSignal, signal);\n if (!isValid) {\n return null;\n }\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","inputSignal","signal"],"mappings":"aAAA,IAAIA,EAAmB,GAEhB,SAASC,GAA2B,CACzC,OAAOD,CACT,CAEO,SAASE,EAAiBC,EAAkB,CACjDH,EAAWG,CACb,CCgBO,SAASC,EACdC,EACAC,EACc,CACd,MAAO,CACL,KAAAD,EACA,MAAAC,EACA,SAAUL,EAAA,EACV,UAAW,YAAY,IAAA,CAAI,CAE/B,CC7BO,MAAMM,EAA6B,iBAmBnC,SAASC,EAA0BC,EAA6C,CACrF,OAAOL,EAAaG,EAA4BE,CAAO,CACzD,CAEO,SAASC,GAAwD,CACtE,OAAOF,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,UACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CC1BO,SAASG,EACdC,EACAC,EAAiC,GACK,CACtC,IAAIC,EAAsC,KAE1C,MAAO,CACL,QAAUC,GAAgB,CACxB,MAAMC,EAASN,EAAA,EAEf,OADgBE,EAAUG,EAAaC,CAAM,GAI7CF,EAAUE,EACHA,GAHE,IAIX,EACA,IAAI,UAAoB,CACtB,OAAOF,IAAY,IACrB,EACA,OAAc,CACZA,EAAU,IACZ,EACA,SAAgB,CACd,KAAK,MAAA,CACP,CAAA,CAEJ"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-BvdJvQie.cjs"),g=require("../recognizer-DbiEtBOM.cjs"),u=require("../types-BGR5Mhw9.cjs");function a(c={}){function i(r,s){const e=r.value;let t,o;switch(e.type){case"mousedown":t="start",o=u.toSinglePointerButton(e.button);break;case"mouseup":t="end",o=u.toSinglePointerButton(e.button);break;default:t="move",o="none"}const n=s.value;n.id="",n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType="mouse",n.button=o,n.pressure=t==="move"&&e.buttons===0?0:.5}return g.createSinglePointerRecognizer(i,c)}function l(c={}){return i=>p.createStream(r=>{const s=a(c),e=i.on({next(t){const o=s.process(t);r.next(o)},error(t){r.error?.(t)},complete(){r.complete?.()}});return()=>{e(),s.dispose()}})}exports.createMouseRecognizer=a;exports.singlePointerRecognizer=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-BvdJvQie.cjs"),g=require("../recognizer-D3UwuOb3.cjs"),c=require("../types-BGR5Mhw9.cjs");function a(u={}){function i(r,s){const e=r.value;let t,o;switch(e.type){case"mousedown":t="start",o=c.toSinglePointerButton(e.button);break;case"mouseup":t="end",o=c.toSinglePointerButton(e.button);break;default:t="move",o="none"}const n=s.value;return n.id="",n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType="mouse",n.button=o,n.pressure=t==="move"&&e.buttons===0?0:.5,!0}return g.createSinglePointerRecognizer(i,u)}function l(u={}){return i=>p.createStream(r=>{const s=a(u),e=i.on({next(t){const o=s.process(t);o&&r.next(o)},error(t){r.error?.(t)},complete(){r.complete?.()}});return()=>{e(),s.dispose()}})}exports.createMouseRecognizer=a;exports.singlePointerRecognizer=l;
2
2
  //# sourceMappingURL=mouse.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.cjs","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n observer.next(pointer);\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":"qMAaO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EACPC,EACAC,EACM,CACN,MAAM,EAAID,EAAe,MACzB,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,YACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,UACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,QACEF,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjBI,EAAE,GAAK,GACPA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAc,QAChBA,EAAE,OAASF,EACXE,EAAE,SAAWH,IAAU,QAAU,EAAE,UAAY,EAAI,EAAI,EACzD,CAEA,OAAOI,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,GAAG,CACtB,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACxCH,EAAS,KAAKI,CAAO,CACvB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
1
+ {"version":3,"file":"mouse.cjs","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): boolean {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":"qMAaO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EACPC,EACAC,EACS,CACT,MAAM,EAAID,EAAe,MACzB,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,YACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,UACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,QACEF,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjB,OAAAI,EAAE,GAAK,GACPA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAc,QAChBA,EAAE,OAASF,EACXE,EAAE,SAAWH,IAAU,QAAU,EAAE,UAAY,EAAI,EAAI,GAChD,EACT,CAEA,OAAOI,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,GAAG,CACtB,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACpCC,GACFJ,EAAS,KAAKI,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
@@ -1,5 +1,5 @@
1
1
  import { c as a } from "../stream-Y3XFAhlB.js";
2
- import { c as p } from "../recognizer-CGZKcxpa.js";
2
+ import { c as p } from "../recognizer-BzvWMkxq.js";
3
3
  import { t as u } from "../types-Ccnqx90M.js";
4
4
  function m(c = {}) {
5
5
  function i(r, s) {
@@ -16,7 +16,7 @@ function m(c = {}) {
16
16
  t = "move", n = "none";
17
17
  }
18
18
  const o = s.value;
19
- o.id = "", o.phase = t, o.x = e.clientX, o.y = e.clientY, o.pageX = e.pageX, o.pageY = e.pageY, o.pointerType = "mouse", o.button = n, o.pressure = t === "move" && e.buttons === 0 ? 0 : 0.5;
19
+ return o.id = "", o.phase = t, o.x = e.clientX, o.y = e.clientY, o.pageX = e.pageX, o.pageY = e.pageY, o.pointerType = "mouse", o.button = n, o.pressure = t === "move" && e.buttons === 0 ? 0 : 0.5, !0;
20
20
  }
21
21
  return p(i, c);
22
22
  }
@@ -25,7 +25,7 @@ function b(c = {}) {
25
25
  const s = m(c), e = i.on({
26
26
  next(t) {
27
27
  const n = s.process(t);
28
- r.next(n);
28
+ n && r.next(n);
29
29
  },
30
30
  error(t) {
31
31
  r.error?.(t);
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.js","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n observer.next(pointer);\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":";;;AAaO,SAASA,EACdC,IAAgC,IACqB;AACrD,WAASC,EACPC,GACAC,GACM;AACN,UAAM,IAAID,EAAe;AACzB,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF;AACE,QAAAF,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,IAAAI,EAAE,KAAK,IACPA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAc,SAChBA,EAAE,SAASF,GACXE,EAAE,WAAWH,MAAU,UAAU,EAAE,YAAY,IAAI,IAAI;AAAA,EACzD;AAEA,SAAOI,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAAgC,IAC2B;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAad,EAAsBC,CAAO,GAE1Cc,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAAH,EAAS,KAAKI,CAAO;AAAA,MACvB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
1
+ {"version":3,"file":"mouse.js","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): boolean {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":";;;AAaO,SAASA,EACdC,IAAgC,IACqB;AACrD,WAASC,EACPC,GACAC,GACS;AACT,UAAM,IAAID,EAAe;AACzB,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF;AACE,QAAAF,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,WAAAI,EAAE,KAAK,IACPA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAc,SAChBA,EAAE,SAASF,GACXE,EAAE,WAAWH,MAAU,UAAU,EAAE,YAAY,IAAI,IAAI,KAChD;AAAA,EACT;AAEA,SAAOI,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAAgC,IAC2B;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAad,EAAsBC,CAAO,GAE1Cc,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAIC,KACFJ,EAAS,KAAKI,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-BvdJvQie.cjs"),l=require("../recognizer-DbiEtBOM.cjs"),s=require("../types-BGR5Mhw9.cjs");function a(o={}){function u(i,c){const e=i.value;if(!e.isPrimary)return;let t,r;switch(e.type){case"pointerdown":t="start",r=s.toSinglePointerButton(e.button);break;case"pointerup":t="end",r=s.toSinglePointerButton(e.button);break;case"pointercancel":t="cancel",r="none";break;default:t="move",r="none"}const n=c.value;n.id=`${e.pointerType}-${e.pointerId}`,n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType=m(e.pointerType),n.button=r,n.pressure=e.pressure}return l.createSinglePointerRecognizer(u,o)}function g(o={}){return u=>p.createStream(i=>{const c=a(o),e=u.on({next(t){const r=c.process(t);r&&i.next(r)},error(t){i.error?.(t)},complete(){i.complete?.()}});return()=>{e(),c.dispose()}})}function m(o){switch(o){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}exports.createPointerRecognizer=a;exports.singlePointerRecognizer=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-BvdJvQie.cjs"),l=require("../recognizer-D3UwuOb3.cjs"),s=require("../types-BGR5Mhw9.cjs");function a(o={}){function u(i,c){const e=i.value;if(!e.isPrimary)return!1;let t,r;switch(e.type){case"pointerdown":t="start",r=s.toSinglePointerButton(e.button);break;case"pointerup":t="end",r=s.toSinglePointerButton(e.button);break;case"pointercancel":t="cancel",r="none";break;default:t="move",r="none"}const n=c.value;return n.id=`${e.pointerType}-${e.pointerId}`,n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType=m(e.pointerType),n.button=r,n.pressure=e.pressure,!0}return l.createSinglePointerRecognizer(u,o)}function g(o={}){return u=>p.createStream(i=>{const c=a(o),e=u.on({next(t){const r=c.process(t);r&&i.next(r)},error(t){i.error?.(t)},complete(){i.complete?.()}});return()=>{e(),c.dispose()}})}function m(o){switch(o){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}exports.createPointerRecognizer=a;exports.singlePointerRecognizer=g;
2
2
  //# sourceMappingURL=pointer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.cjs","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":"qMAcO,SAASA,EACdC,EAAgC,GACuB,CACvD,SAASC,EACPC,EACAC,EACM,CACN,MAAM,EAAID,EAAe,MAEzB,GAAI,CAAC,EAAE,UACL,OAGF,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,cACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,YACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,gBACHF,EAAQ,SACRC,EAAS,OACT,MACF,QACED,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjBI,EAAE,GAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,GACtCA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAcC,EAAqB,EAAE,WAAW,EAClDD,EAAE,OAASF,EACXE,EAAE,SAAW,EAAE,QACjB,CAEA,OAAOE,EAAAA,8BAA8BR,EAAWD,CAAO,CACzD,CAEO,SAASU,EACdV,EAAgC,GAC6B,CAC7D,OAAQW,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAaf,EAAwBC,CAAO,EAE5Ce,EAAQJ,EAAO,GAAG,CACtB,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACpCC,GACFJ,EAAS,KAAKI,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL,CAEA,SAASN,EAAqBW,EAAiC,CAC7D,OAAQA,EAAA,CACN,IAAK,QACH,MAAO,QACT,IAAK,QACH,MAAO,QACT,IAAK,MACH,MAAO,MACT,QACE,MAAO,SAAA,CAEb"}
1
+ {"version":3,"file":"pointer.cjs","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): boolean {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return false;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":"qMAcO,SAASA,EACdC,EAAgC,GACuB,CACvD,SAASC,EACPC,EACAC,EACS,CACT,MAAM,EAAID,EAAe,MAEzB,GAAI,CAAC,EAAE,UACL,MAAO,GAGT,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,cACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,YACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,gBACHF,EAAQ,SACRC,EAAS,OACT,MACF,QACED,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjB,OAAAI,EAAE,GAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,GACtCA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAcC,EAAqB,EAAE,WAAW,EAClDD,EAAE,OAASF,EACXE,EAAE,SAAW,EAAE,SACR,EACT,CAEA,OAAOE,EAAAA,8BAA8BR,EAAWD,CAAO,CACzD,CAEO,SAASU,EACdV,EAAgC,GAC6B,CAC7D,OAAQW,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAaf,EAAwBC,CAAO,EAE5Ce,EAAQJ,EAAO,GAAG,CACtB,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACpCC,GACFJ,EAAS,KAAKI,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL,CAEA,SAASN,EAAqBW,EAAiC,CAC7D,OAAQA,EAAA,CACN,IAAK,QACH,MAAO,QACT,IAAK,QACH,MAAO,QACT,IAAK,MACH,MAAO,MACT,QACE,MAAO,SAAA,CAEb"}
@@ -1,39 +1,39 @@
1
- import { c as a } from "../stream-Y3XFAhlB.js";
2
- import { c as u } from "../recognizer-CGZKcxpa.js";
3
- import { t as p } from "../types-Ccnqx90M.js";
1
+ import { c as p } from "../stream-Y3XFAhlB.js";
2
+ import { c as u } from "../recognizer-BzvWMkxq.js";
3
+ import { t as a } from "../types-Ccnqx90M.js";
4
4
  function l(o = {}) {
5
5
  function s(i, c) {
6
6
  const e = i.value;
7
7
  if (!e.isPrimary)
8
- return;
9
- let n, r;
8
+ return !1;
9
+ let t, r;
10
10
  switch (e.type) {
11
11
  case "pointerdown":
12
- n = "start", r = p(e.button);
12
+ t = "start", r = a(e.button);
13
13
  break;
14
14
  case "pointerup":
15
- n = "end", r = p(e.button);
15
+ t = "end", r = a(e.button);
16
16
  break;
17
17
  case "pointercancel":
18
- n = "cancel", r = "none";
18
+ t = "cancel", r = "none";
19
19
  break;
20
20
  default:
21
- n = "move", r = "none";
21
+ t = "move", r = "none";
22
22
  }
23
- const t = c.value;
24
- t.id = `${e.pointerType}-${e.pointerId}`, t.phase = n, t.x = e.clientX, t.y = e.clientY, t.pageX = e.pageX, t.pageY = e.pageY, t.pointerType = m(e.pointerType), t.button = r, t.pressure = e.pressure;
23
+ const n = c.value;
24
+ return n.id = `${e.pointerType}-${e.pointerId}`, n.phase = t, n.x = e.clientX, n.y = e.clientY, n.pageX = e.pageX, n.pageY = e.pageY, n.pointerType = m(e.pointerType), n.button = r, n.pressure = e.pressure, !0;
25
25
  }
26
26
  return u(s, o);
27
27
  }
28
28
  function d(o = {}) {
29
- return (s) => a((i) => {
29
+ return (s) => p((i) => {
30
30
  const c = l(o), e = s.on({
31
- next(n) {
32
- const r = c.process(n);
31
+ next(t) {
32
+ const r = c.process(t);
33
33
  r && i.next(r);
34
34
  },
35
- error(n) {
36
- i.error?.(n);
35
+ error(t) {
36
+ i.error?.(t);
37
37
  },
38
38
  complete() {
39
39
  i.complete?.();
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.js","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":";;;AAcO,SAASA,EACdC,IAAgC,IACuB;AACvD,WAASC,EACPC,GACAC,GACM;AACN,UAAM,IAAID,EAAe;AAEzB,QAAI,CAAC,EAAE;AACL;AAGF,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,UACRC,IAAS;AACT;AAAA,MACF;AACE,QAAAD,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,IAAAI,EAAE,KAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,IACtCA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAcC,EAAqB,EAAE,WAAW,GAClDD,EAAE,SAASF,GACXE,EAAE,WAAW,EAAE;AAAA,EACjB;AAEA,SAAOE,EAA8BR,GAAWD,CAAO;AACzD;AAEO,SAASU,EACdV,IAAgC,IAC6B;AAC7D,SAAO,CAACW,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAaf,EAAwBC,CAAO,GAE5Ce,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAIC,KACFJ,EAAS,KAAKI,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;AAEA,SAASN,EAAqBW,GAAiC;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"pointer.js","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): boolean {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return false;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":";;;AAcO,SAASA,EACdC,IAAgC,IACuB;AACvD,WAASC,EACPC,GACAC,GACS;AACT,UAAM,IAAID,EAAe;AAEzB,QAAI,CAAC,EAAE;AACL,aAAO;AAGT,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,UACRC,IAAS;AACT;AAAA,MACF;AACE,QAAAD,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,WAAAI,EAAE,KAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,IACtCA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAcC,EAAqB,EAAE,WAAW,GAClDD,EAAE,SAASF,GACXE,EAAE,WAAW,EAAE,UACR;AAAA,EACT;AAEA,SAAOE,EAA8BR,GAAWD,CAAO;AACzD;AAEO,SAASU,EACdV,IAAgC,IAC6B;AAC7D,SAAO,CAACW,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAaf,EAAwBC,CAAO,GAE5Ce,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAIC,KACFJ,EAAS,KAAKI,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;AAEA,SAASN,EAAqBW,GAAiC;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../stream-BvdJvQie.cjs"),p=require("../recognizer-DbiEtBOM.cjs");function a(s={}){function u(r,o){const n=r.value,e=n.touches[0]??n.changedTouches[0];if(!e)return;let t;switch(n.type){case"touchstart":t="start";break;case"touchend":t="end";break;case"touchcancel":t="cancel";break;default:t="move"}const c=o.value;c.phase=t,c.x=e.clientX,c.y=e.clientY,c.pageX=e.pageX,c.pageY=e.pageY,c.pointerType="touch",c.button="none",c.pressure=e.force||.5}return p.createSinglePointerRecognizer(u,s)}function g(s={}){return u=>i.createStream(r=>{const o=a(s),n=u.on({next(e){const t=o.process(e);t&&r.next(t)},error(e){r.error?.(e)},complete(){r.complete?.()}});return()=>{n(),o.dispose()}})}exports.createTouchRecognizer=a;exports.singlePointerRecognizer=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("../stream-BvdJvQie.cjs"),l=require("../recognizer-D3UwuOb3.cjs");function a(s={}){function u(c,o){const n=c.value,e=n.touches[0]??n.changedTouches[0];if(!e)return!1;let t;switch(n.type){case"touchstart":t="start";break;case"touchend":t="end";break;case"touchcancel":t="cancel";break;default:t="move"}const r=o.value;return r.phase=t,r.x=e.clientX,r.y=e.clientY,r.pageX=e.pageX,r.pageY=e.pageY,r.pointerType="touch",r.button="none",r.pressure=e.force||.5,!0}return l.createSinglePointerRecognizer(u,s)}function p(s={}){return u=>i.createStream(c=>{const o=a(s),n=u.on({next(e){const t=o.process(e);t&&c.next(t)},error(e){c.error?.(e)},complete(){c.complete?.()}});return()=>{n(),o.dispose()}})}exports.createTouchRecognizer=a;exports.singlePointerRecognizer=p;
2
2
  //# sourceMappingURL=touch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"touch.cjs","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): void {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.phase = phase;\n v.x = touch.clientX;\n v.y = touch.clientY;\n v.pageX = touch.pageX;\n v.pageY = touch.pageY;\n v.pointerType = \"touch\";\n v.button = \"none\";\n v.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createTouchRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createTouchRecognizer","options","processer","event","signal","e","touch","phase","v","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":"kKAQO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EAAUC,EAAmCC,EAAmC,CACvF,MAAMC,EAAIF,EAAM,MACVG,EAAQD,EAAE,QAAQ,CAAC,GAAKA,EAAE,eAAe,CAAC,EAChD,GAAI,CAACC,EACH,OAGF,IAAIC,EACJ,OAAQF,EAAE,KAAA,CACR,IAAK,aACHE,EAAQ,QACR,MACF,IAAK,WACHA,EAAQ,MACR,MACF,IAAK,cACHA,EAAQ,SACR,MACF,QACEA,EAAQ,MAAA,CAGZ,MAAMC,EAAIJ,EAAO,MACjBI,EAAE,MAAQD,EACVC,EAAE,EAAIF,EAAM,QACZE,EAAE,EAAIF,EAAM,QACZE,EAAE,MAAQF,EAAM,MAChBE,EAAE,MAAQF,EAAM,MAChBE,EAAE,YAAc,QAChBA,EAAE,OAAS,OACXA,EAAE,SAAWF,EAAM,OAAS,EAC9B,CAEA,OAAOG,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,GAAG,CACtB,KAAKR,EAAO,CACV,MAAMa,EAAUF,EAAW,QAAQX,CAAK,EACpCa,GACFH,EAAS,KAAKG,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTJ,EAAS,QAAQI,CAAG,CACtB,EACA,UAAW,CACTJ,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
1
+ {"version":3,"file":"touch.cjs","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): boolean {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return false;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.phase = phase;\n v.x = touch.clientX;\n v.y = touch.clientY;\n v.pageX = touch.pageX;\n v.pageY = touch.pageY;\n v.pointerType = \"touch\";\n v.button = \"none\";\n v.pressure = touch.force || 0.5;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createTouchRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createTouchRecognizer","options","processer","event","signal","e","touch","phase","v","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":"kKAQO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EAAUC,EAAmCC,EAAsC,CAC1F,MAAMC,EAAIF,EAAM,MACVG,EAAQD,EAAE,QAAQ,CAAC,GAAKA,EAAE,eAAe,CAAC,EAChD,GAAI,CAACC,EACH,MAAO,GAGT,IAAIC,EACJ,OAAQF,EAAE,KAAA,CACR,IAAK,aACHE,EAAQ,QACR,MACF,IAAK,WACHA,EAAQ,MACR,MACF,IAAK,cACHA,EAAQ,SACR,MACF,QACEA,EAAQ,MAAA,CAGZ,MAAMC,EAAIJ,EAAO,MACjB,OAAAI,EAAE,MAAQD,EACVC,EAAE,EAAIF,EAAM,QACZE,EAAE,EAAIF,EAAM,QACZE,EAAE,MAAQF,EAAM,MAChBE,EAAE,MAAQF,EAAM,MAChBE,EAAE,YAAc,QAChBA,EAAE,OAAS,OACXA,EAAE,SAAWF,EAAM,OAAS,GACrB,EACT,CAEA,OAAOG,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,GAAG,CACtB,KAAKR,EAAO,CACV,MAAMa,EAAUF,EAAW,QAAQX,CAAK,EACpCa,GACFH,EAAS,KAAKG,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTJ,EAAS,QAAQI,CAAG,CACtB,EACA,UAAW,CACTJ,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
@@ -1,10 +1,10 @@
1
- import { c as i } from "../stream-Y3XFAhlB.js";
2
- import { c as u } from "../recognizer-CGZKcxpa.js";
1
+ import { c as u } from "../stream-Y3XFAhlB.js";
2
+ import { c as i } from "../recognizer-BzvWMkxq.js";
3
3
  function p(s = {}) {
4
- function a(o, r) {
5
- const n = o.value, e = n.touches[0] ?? n.changedTouches[0];
4
+ function a(c, o) {
5
+ const n = c.value, e = n.touches[0] ?? n.changedTouches[0];
6
6
  if (!e)
7
- return;
7
+ return !1;
8
8
  let t;
9
9
  switch (n.type) {
10
10
  case "touchstart":
@@ -19,27 +19,27 @@ function p(s = {}) {
19
19
  default:
20
20
  t = "move";
21
21
  }
22
- const c = r.value;
23
- c.phase = t, c.x = e.clientX, c.y = e.clientY, c.pageX = e.pageX, c.pageY = e.pageY, c.pointerType = "touch", c.button = "none", c.pressure = e.force || 0.5;
22
+ const r = o.value;
23
+ return r.phase = t, r.x = e.clientX, r.y = e.clientY, r.pageX = e.pageX, r.pageY = e.pageY, r.pointerType = "touch", r.button = "none", r.pressure = e.force || 0.5, !0;
24
24
  }
25
- return u(a, s);
25
+ return i(a, s);
26
26
  }
27
27
  function g(s = {}) {
28
- return (a) => i((o) => {
29
- const r = p(s), n = a.on({
28
+ return (a) => u((c) => {
29
+ const o = p(s), n = a.on({
30
30
  next(e) {
31
- const t = r.process(e);
32
- t && o.next(t);
31
+ const t = o.process(e);
32
+ t && c.next(t);
33
33
  },
34
34
  error(e) {
35
- o.error?.(e);
35
+ c.error?.(e);
36
36
  },
37
37
  complete() {
38
- o.complete?.();
38
+ c.complete?.();
39
39
  }
40
40
  });
41
41
  return () => {
42
- n(), r.dispose();
42
+ n(), o.dispose();
43
43
  };
44
44
  });
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): void {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.phase = phase;\n v.x = touch.clientX;\n v.y = touch.clientY;\n v.pageX = touch.pageX;\n v.pageY = touch.pageY;\n v.pointerType = \"touch\";\n v.button = \"none\";\n v.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createTouchRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createTouchRecognizer","options","processer","event","signal","e","touch","phase","v","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":";;AAQO,SAASA,EACdC,IAAgC,IACqB;AACrD,WAASC,EAAUC,GAAmCC,GAAmC;AACvF,UAAMC,IAAIF,EAAM,OACVG,IAAQD,EAAE,QAAQ,CAAC,KAAKA,EAAE,eAAe,CAAC;AAChD,QAAI,CAACC;AACH;AAGF,QAAIC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAE,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF;AACE,QAAAA,IAAQ;AAAA,IAAA;AAGZ,UAAMC,IAAIJ,EAAO;AACjB,IAAAI,EAAE,QAAQD,GACVC,EAAE,IAAIF,EAAM,SACZE,EAAE,IAAIF,EAAM,SACZE,EAAE,QAAQF,EAAM,OAChBE,EAAE,QAAQF,EAAM,OAChBE,EAAE,cAAc,SAChBA,EAAE,SAAS,QACXA,EAAE,WAAWF,EAAM,SAAS;AAAA,EAC9B;AAEA,SAAOG,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAAgC,IAC2B;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAad,EAAsBC,CAAO,GAE1Cc,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKR,GAAO;AACV,cAAMa,IAAUF,EAAW,QAAQX,CAAK;AACxC,QAAIa,KACFH,EAAS,KAAKG,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAJ,EAAS,QAAQI,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAJ,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
1
+ {"version":3,"file":"touch.js","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): boolean {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return false;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.phase = phase;\n v.x = touch.clientX;\n v.y = touch.clientY;\n v.pageX = touch.pageX;\n v.pageY = touch.pageY;\n v.pointerType = \"touch\";\n v.button = \"none\";\n v.pressure = touch.force || 0.5;\n return true;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createTouchRecognizer(options);\n\n const unsub = source.on({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createTouchRecognizer","options","processer","event","signal","e","touch","phase","v","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":";;AAQO,SAASA,EACdC,IAAgC,IACqB;AACrD,WAASC,EAAUC,GAAmCC,GAAsC;AAC1F,UAAMC,IAAIF,EAAM,OACVG,IAAQD,EAAE,QAAQ,CAAC,KAAKA,EAAE,eAAe,CAAC;AAChD,QAAI,CAACC;AACH,aAAO;AAGT,QAAIC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAE,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF;AACE,QAAAA,IAAQ;AAAA,IAAA;AAGZ,UAAMC,IAAIJ,EAAO;AACjB,WAAAI,EAAE,QAAQD,GACVC,EAAE,IAAIF,EAAM,SACZE,EAAE,IAAIF,EAAM,SACZE,EAAE,QAAQF,EAAM,OAChBE,EAAE,QAAQF,EAAM,OAChBE,EAAE,cAAc,SAChBA,EAAE,SAAS,QACXA,EAAE,WAAWF,EAAM,SAAS,KACrB;AAAA,EACT;AAEA,SAAOG,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAAgC,IAC2B;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAad,EAAsBC,CAAO,GAE1Cc,IAAQJ,EAAO,GAAG;AAAA,MACtB,KAAKR,GAAO;AACV,cAAMa,IAAUF,EAAW,QAAQX,CAAK;AACxC,QAAIa,KACFH,EAAS,KAAKG,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAJ,EAAS,QAAQI,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAJ,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cereb",
3
3
  "description": "User input modeling and orchestration with a lightweight reactive stream library.",
4
- "version": "0.11.3",
4
+ "version": "0.11.5",
5
5
  "license": "MIT",
6
6
  "author": "devphilip21 <philip21.dev@gmail.com>",
7
7
  "repository": {
@@ -1,2 +0,0 @@
1
- "use strict";let i="";function u(){return i}function s(e){i=e}function c(e,r){return{kind:e,value:r,deviceId:u(),createdAt:performance.now()}}const l="single-pointer";function a(e){return c(l,e)}function g(){return a({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"unknown",button:"none",pressure:.5})}function p(e,r={}){let n=null;return{process:o=>{const t=g();return e(o,t),n=t,t},get isActive(){return n!==null},reset(){n=null},dispose(){this.reset()}}}exports.createSignal=c;exports.createSinglePointerRecognizer=p;exports.setCerebDeviceId=s;
2
- //# sourceMappingURL=recognizer-DbiEtBOM.cjs.map