# `testing.FakeSession.pointer`

> Contract 2.0.0 · package sha256 `a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e` · generated from `testing.d.ts` by `services/onsite-scripter/scripts/build-contract-docs.mjs`; edit the source, not this file.

Method of [`testing.FakeSession`](testing.FakeSession.md) · stable · since 2.0.0

```ts
pointer(input: {
  kind: 'click' | 'drag' | 'longPress' | 'move';
  at: {
    x: number;
    y: number;
  };
  to?: {
    x: number;
    y: number;
  };
  pointerType?: 'mouse' | 'pen' | 'touch';
  durationMs?: number;
  pointerId?: number;
}): void;
```

Simulates canvas input on the fake clock: a press at `at`, then the path, then the release.
'click' releases at `to`. 'drag' moves from `at` to `to` in 16 ms steps of `durationMs`
(one step at 0), ticking the clock through each: one 'drag:move' per step, each with the
pose drawn after `constrain`, dispatched at the next drawn frame. 'longPress' holds
`durationMs` still (an app timer may call [`input.startDrag`](Input.startDrag.md) then), then moves in 4 steps.
'move' has no button pressed and fires 'hover' where the part under it changes (a mouse or
pen only). `pointerType: 'touch'` makes a 'click' a tap (10 CSS px, 300 ms) and never
hovers. `at` and `to`: CSS px. Events dispatch at the next drawn frame (`frame()`, or
`tick(16)`). A press no drag claims is the camera's gesture: with one pointer down, its path
turns the camera as the runtime's orbit controls do, [`CameraLimits.rotateSpeed`](CameraLimits.rotateSpeed.md) × 360° per
element height (a drag to the left raises `azimuthDeg`, a drag down lowers `polarDeg`),
inside the limits, with no damping; 'fixed' mode turns nothing, and 'pan' mode's pan and a
two-pointer pinch move nothing on the fake. Under `CameraLimits.gestures: 'cooperative'` a
'touch' press whose first move past 10 CSS px is more vertical than horizontal is the page's
scroll, as the browser takes it under `touch-action: pan-y`: the camera turns nothing, a
part drag it started ends with `reason` 'cancelled' and no commit, and its release is no
click; a horizontal one, a mouse and a pen behave as under 'greedy'. A real browser may
hand the view the first move past its slop before it cancels the pointer (a few degrees);
the fake turns none.

## Generic-API test (spec 3.1)

| Rule | Result |
| --- | --- |
| 1. Neutral name | pass: `pointer` names no product |
| 2. A precedent | not recorded: no ledger row (coverage.json) names this member or its owner |
| 3. Two apps, or labs | not recorded: no ledger row names this member or its owner |
| 4. The cheaper fix first | not recorded per member (Appendix B decides it per need) |
