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 +22 -131
- package/dist/browser/single-pointer/recognizer-from-mouse.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-pointer.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-touch.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer.d.ts +2 -2
- package/dist/browser/single-pointer/recognizer.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/{recognizer-CGZKcxpa.js → recognizer-BzvWMkxq.js} +10 -10
- package/dist/{recognizer-CGZKcxpa.js.map → recognizer-BzvWMkxq.js.map} +1 -1
- package/dist/recognizer-D3UwuOb3.cjs +2 -0
- package/dist/{recognizer-DbiEtBOM.cjs.map → recognizer-D3UwuOb3.cjs.map} +1 -1
- package/dist/single-pointer/mouse.cjs +1 -1
- package/dist/single-pointer/mouse.cjs.map +1 -1
- package/dist/single-pointer/mouse.js +3 -3
- package/dist/single-pointer/mouse.js.map +1 -1
- package/dist/single-pointer/pointer.cjs +1 -1
- package/dist/single-pointer/pointer.cjs.map +1 -1
- package/dist/single-pointer/pointer.js +16 -16
- package/dist/single-pointer/pointer.js.map +1 -1
- package/dist/single-pointer/touch.cjs +1 -1
- package/dist/single-pointer/touch.cjs.map +1 -1
- package/dist/single-pointer/touch.js +15 -15
- package/dist/single-pointer/touch.js.map +1 -1
- package/package.json +1 -1
- package/dist/recognizer-DbiEtBOM.cjs +0 -2
package/README.md
CHANGED
|
@@ -63,148 +63,39 @@ pinch(element)
|
|
|
63
63
|
|
|
64
64
|
<br>
|
|
65
65
|
|
|
66
|
-
##
|
|
66
|
+
## Documentation
|
|
67
67
|
|
|
68
|
-
|
|
69
|
-
In the meantime, check the source—it's well-typed and commented:
|
|
68
|
+
### Stream API
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
- [Operators](https://github.com/devphilip21/cereb/tree/main/packages/cereb/src/operators)
|
|
70
|
+
Create streams from various input sources:
|
|
73
71
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
###
|
|
84
|
+
### Operator API
|
|
79
85
|
|
|
80
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
**
|
|
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
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"recognizer-from-mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAG1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAoCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-from-pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAI1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"recognizer-from-pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAEL,KAAK,oBAAoB,EAI1B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CA6CvD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAyB7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-from-touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAC;AAE3E,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"recognizer-from-touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAiC,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAC;AAE3E,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,oBAAyB,GACjC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAoCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,oBAAyB,GACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
|
|
@@ -2,10 +2,10 @@ import { Signal } from '../../core/signal.js';
|
|
|
2
2
|
import { SinglePointerSignal } from './single-pointer-signal.js';
|
|
3
3
|
import { SinglePointerOptions } from './types.js';
|
|
4
4
|
export interface SinglePointerRecognizer<InputSignal extends Signal> {
|
|
5
|
-
process(event: InputSignal): SinglePointerSignal;
|
|
5
|
+
process(event: InputSignal): SinglePointerSignal | null;
|
|
6
6
|
readonly isActive: boolean;
|
|
7
7
|
reset(): void;
|
|
8
8
|
dispose(): void;
|
|
9
9
|
}
|
|
10
|
-
export declare function createSinglePointerRecognizer<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) =>
|
|
10
|
+
export declare function createSinglePointerRecognizer<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => boolean, _options?: SinglePointerOptions): SinglePointerRecognizer<InputSignal>;
|
|
11
11
|
//# sourceMappingURL=recognizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,uBAAuB,CAAC,WAAW,SAAS,MAAM;IACjE,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"recognizer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,uBAAuB,CAAC,WAAW,SAAS,MAAM;IACjE,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,6BAA6B,CAAC,WAAW,SAAS,MAAM,EACtE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,KAAK,OAAO,EACpF,QAAQ,GAAE,oBAAyB,GAClC,uBAAuB,CAAC,WAAW,CAAC,CAuBtC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./stream-BvdJvQie.cjs"),m=require("./recognizer-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./stream-BvdJvQie.cjs"),m=require("./recognizer-D3UwuOb3.cjs"),g=require("./share-vzh9f3Jn.cjs"),W=require("./types-BGR5Mhw9.cjs"),Y=require("./single-pointer/pointer.cjs"),b="dom-event";function K(e){return m.createSignal(b,e)}function M(e,t,o){return d.createStream(n=>{const r=c=>{n.next(K(c))};return e.addEventListener(t,r,o),()=>{e.removeEventListener(t,r,o)}})}const h=["mousedown","mousemove","mouseup"];function z(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<h.length;r++){const c=h[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<h.length;r++){const c=h[r];e.removeEventListener(c,n,t)}}})}const y=["pointerdown","pointermove","pointerup","pointercancel"];function L(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<y.length;r++){const c=y[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<y.length;r++){const c=y[r];e.removeEventListener(c,n,t)}}})}const p=["touchstart","touchmove","touchend","touchcancel"];function G(e,t){return d.createStream(o=>{const n=r=>{o.next(K(r))};for(let r=0;r<p.length;r++){const c=p[r];e.addEventListener(c,n,t)}return()=>{for(let r=0;r<p.length;r++){const c=p[r];e.removeEventListener(c,n,t)}}})}const N="keyboard";function x(e){return m.createSignal(N,e)}function E(e,t){return x({phase:t,key:e.key,code:e.code,repeat:e.repeat,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,originalEvent:e})}const v=new WeakMap,P=new WeakMap;function O(e){return d.createStream(t=>{const o=r=>{t.next(E(r,"down"))},n=r=>{t.next(E(r,"up"))};return e.addEventListener("keydown",o),e.addEventListener("keyup",n),()=>{e.removeEventListener("keydown",o),e.removeEventListener("keyup",n)}})}function w(e){let t=v.get(e);return t||(t=g.share()(O(e)),v.set(e,t)),t}function X(e){return d.createStream(t=>{const o=n=>{t.next(E(n,"down"))};return e.addEventListener("keydown",o),()=>{e.removeEventListener("keydown",o)}})}function D(e){let t=P.get(e);return t||(t=g.share()(X(e)),P.set(e,t)),t}function F(e,t){if(!t)return w(e);const o=t.modifiers,n=t.preventDefault??!0,r=t.allowRepeat??!1,c=t.code?Array.isArray(t.code)?t.code.map(a=>a.toLowerCase()):[t.code.toLowerCase()]:null,u=w(e),i=a=>c?c.includes(a.code.toLowerCase()):!0,l=a=>!o||o.length===0?!0:o.some(s=>{switch(s){case"meta":return a.metaKey;case"ctrl":return a.ctrlKey;case"alt":return a.altKey;case"shift":return a.shiftKey;default:return!1}});return d.createStream(a=>u.on({next(s){const{repeat:f}=s.value;!r&&f||i(s.value)&&l(s.value)&&(n&&s.value.originalEvent.preventDefault(),a.next(s))},error:a.error?.bind(a),complete:a.complete?.bind(a)}))}function H(e,t){if(!t)return D(e);const o=t.modifiers,n=t.preventDefault??!0,r=t.allowRepeat??!1,c=t.code?Array.isArray(t.code)?t.code.map(a=>a.toLowerCase()):[t.code.toLowerCase()]:null,u=D(e),i=a=>c?c.includes(a.code.toLowerCase()):!0,l=a=>!o||o.length===0?!0:o.some(s=>{switch(s){case"meta":return a.metaKey;case"ctrl":return a.ctrlKey;case"alt":return a.altKey;case"shift":return a.shiftKey;default:return!1}});return d.createStream(a=>u.on({next(s){const{repeat:f}=s.value;!r&&f||i(s.value)&&l(s.value)&&(n&&s.value.originalEvent.preventDefault(),a.next(s))},error:a.error?.bind(a),complete:a.complete?.bind(a)}))}const k="keyheld";function q(e,t){const{code:o}=t,n=o.toLowerCase(),r=w(e);return d.createStream(c=>{let u;const i=l=>{l!==u&&(u=l,c.next(m.createSignal(k,{held:l})))};return r.on({next(l){const{code:a,phase:s,repeat:f}=l.value;f||a.toLowerCase()===n&&i(s==="down")},error:c.error?.bind(c),complete:c.complete?.bind(c)})})}const U="multi-pointer";function V(e){return m.createSignal(U,e)}function $(e,t={}){const o={maxPointers:t.maxPointers??2},n=new Map;let r="idle";function c(u,i){return u===0?r==="active"&&i>0?"ended":"idle":"active"}return{process(u){const i=e(u,n,o);if(i===null)return null;const l=i.endedPointerIds;for(const R of l)n.delete(R);const a=Array.from(n.values()),s=c(a.length,l.length);r=s==="ended"?"idle":s;const f={phase:s,pointers:a,count:a.length};return V(f)},get isActive(){return n.size>0},get activeCount(){return n.size},reset(){n.clear(),r="idle"},dispose(){this.reset()}}}function B(e={}){function t(o,n,r){const c=o.value,u=`${c.pointerType}-${c.pointerId}`,i=[];switch(c.type){case"pointerdown":{if(n.size>=r.maxPointers)return null;n.set(u,S(c,"start"));break}case"pointermove":{if(!n.has(u))return null;n.set(u,S(c,"move"));break}case"pointerup":{if(!n.has(u))return null;n.set(u,S(c,"end")),i.push(u);break}case"pointercancel":{if(!n.has(u))return null;n.set(u,S(c,"cancel")),i.push(u);break}default:return null}return{pointers:n,endedPointerIds:i}}return $(t,e)}function _(e={}){return t=>d.createStream(o=>{const n=B(e),r=t.on({next(c){const u=n.process(c);u&&o.next(u)},error(c){o.error?.(c)},complete(){o.complete?.()}});return()=>{r(),n.dispose()}})}function S(e,t){const o=t==="start"||t==="end"?W.toSinglePointerButton(e.button):"none";return{id:`${e.pointerType}-${e.pointerId}`,phase:t,x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY,pointerType:Z(e.pointerType),button:o,pressure:e.pressure}}function Z(e){switch(e){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}function j(e,t={}){const o=L(e);return _(t)(o)}function J(e,t={}){const o=L(e);return Y.singlePointerRecognizer(t)(o)}const C="wheel";function A(e){return m.createSignal(C,e)}function Q(e){switch(e){case 0:return"pixel";case 1:return"line";case 2:return"page";default:return"pixel"}}function T(e){return A({deltaX:e.deltaX,deltaY:e.deltaY,deltaZ:e.deltaZ,deltaMode:Q(e.deltaMode),x:e.clientX,y:e.clientY,pageX:e.pageX,pageY:e.pageY,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,originalEvent:e})}const I=new WeakMap;function ee(e,t){let o=I.get(e);o||(o=new Map,I.set(e,o));let n=o.get(t);return n||(n=g.share()(te(e,t)),o.set(t,n)),n}function te(e,t){return d.createStream(o=>{const n=r=>{o.next(T(r))};return e.addEventListener("wheel",n,{passive:t}),()=>{e.removeEventListener("wheel",n)}})}function re(e,t){const o=t?.passive??!0,n=t?.modifiers,r=t?.preventDefault??!1,c=ee(e,o);if(!n?.length&&!r)return c;const u=i=>!n||n.length===0?!0:n.some(l=>{switch(l){case"meta":return i.metaKey;case"ctrl":return i.ctrlKey;case"alt":return i.altKey;case"shift":return i.shiftKey;default:return!1}});return d.createStream(i=>c.on({next(l){try{u(l.value)&&(r&&l.value.originalEvent.preventDefault(),i.next(l))}catch(a){i.error?.(a)}},error:i.error?.bind(i),complete:i.complete?.bind(i)}))}exports.createStream=d.createStream;exports.createSignal=m.createSignal;exports.setCerebDeviceId=m.setCerebDeviceId;exports.KEYBOARD_SIGNAL_KIND=N;exports.KEYHELD_SIGNAL_KIND=k;exports.WHEEL_SIGNAL_KIND=C;exports.createKeyboardSignal=x;exports.createKeyboardSignalFromEvent=E;exports.createWheelSignal=A;exports.createWheelSignalFromEvent=T;exports.domEvent=M;exports.keyboard=F;exports.keydown=H;exports.keyheld=q;exports.mouseEvents=z;exports.multiPointer=j;exports.multiPointerFromPointer=_;exports.pointerEvents=L;exports.singlePointer=J;exports.touchEvents=G;exports.wheel=re;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { c as d } from "./stream-Y3XFAhlB.js";
|
|
2
|
-
import { a as m } from "./recognizer-
|
|
3
|
-
import { s as le } from "./recognizer-
|
|
2
|
+
import { a as m } from "./recognizer-BzvWMkxq.js";
|
|
3
|
+
import { s as le } from "./recognizer-BzvWMkxq.js";
|
|
4
4
|
import { s as v } from "./share-BEu5SsOX.js";
|
|
5
5
|
import { t as I } from "./types-Ccnqx90M.js";
|
|
6
6
|
import { singlePointerRecognizer as N } from "./single-pointer/pointer.js";
|
|
@@ -2,7 +2,7 @@ let i = "";
|
|
|
2
2
|
function c() {
|
|
3
3
|
return i;
|
|
4
4
|
}
|
|
5
|
-
function
|
|
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
|
|
17
|
+
function l(e) {
|
|
18
18
|
return s(u, e);
|
|
19
19
|
}
|
|
20
|
-
function
|
|
21
|
-
return
|
|
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
|
|
33
|
+
function d(e, r = {}) {
|
|
34
34
|
let n = null;
|
|
35
35
|
return {
|
|
36
36
|
process: (o) => {
|
|
37
|
-
const t =
|
|
38
|
-
return e(o, 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
|
-
|
|
54
|
-
|
|
53
|
+
d as c,
|
|
54
|
+
p as s
|
|
55
55
|
};
|
|
56
|
-
//# sourceMappingURL=recognizer-
|
|
56
|
+
//# sourceMappingURL=recognizer-BzvWMkxq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recognizer-
|
|
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-
|
|
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-
|
|
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 ):
|
|
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-
|
|
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 ):
|
|
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-
|
|
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 ):
|
|
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
|
|
2
|
-
import { c as u } from "../recognizer-
|
|
3
|
-
import { t as
|
|
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
|
|
8
|
+
return !1;
|
|
9
|
+
let t, r;
|
|
10
10
|
switch (e.type) {
|
|
11
11
|
case "pointerdown":
|
|
12
|
-
|
|
12
|
+
t = "start", r = a(e.button);
|
|
13
13
|
break;
|
|
14
14
|
case "pointerup":
|
|
15
|
-
|
|
15
|
+
t = "end", r = a(e.button);
|
|
16
16
|
break;
|
|
17
17
|
case "pointercancel":
|
|
18
|
-
|
|
18
|
+
t = "cancel", r = "none";
|
|
19
19
|
break;
|
|
20
20
|
default:
|
|
21
|
-
|
|
21
|
+
t = "move", r = "none";
|
|
22
22
|
}
|
|
23
|
-
const
|
|
24
|
-
|
|
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) =>
|
|
29
|
+
return (s) => p((i) => {
|
|
30
30
|
const c = l(o), e = s.on({
|
|
31
|
-
next(
|
|
32
|
-
const r = c.process(
|
|
31
|
+
next(t) {
|
|
32
|
+
const r = c.process(t);
|
|
33
33
|
r && i.next(r);
|
|
34
34
|
},
|
|
35
|
-
error(
|
|
36
|
-
i.error?.(
|
|
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 ):
|
|
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"),
|
|
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):
|
|
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
|
|
2
|
-
import { c as
|
|
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(
|
|
5
|
-
const n =
|
|
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
|
|
23
|
-
|
|
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
|
|
25
|
+
return i(a, s);
|
|
26
26
|
}
|
|
27
27
|
function g(s = {}) {
|
|
28
|
-
return (a) =>
|
|
29
|
-
const
|
|
28
|
+
return (a) => u((c) => {
|
|
29
|
+
const o = p(s), n = a.on({
|
|
30
30
|
next(e) {
|
|
31
|
-
const t =
|
|
32
|
-
t &&
|
|
31
|
+
const t = o.process(e);
|
|
32
|
+
t && c.next(t);
|
|
33
33
|
},
|
|
34
34
|
error(e) {
|
|
35
|
-
|
|
35
|
+
c.error?.(e);
|
|
36
36
|
},
|
|
37
37
|
complete() {
|
|
38
|
-
|
|
38
|
+
c.complete?.();
|
|
39
39
|
}
|
|
40
40
|
});
|
|
41
41
|
return () => {
|
|
42
|
-
n(),
|
|
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):
|
|
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,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
|