Skip to content

Commit 00fa1d7

Browse files
committed
docs: add dragOutside documentation and test
- Add comprehensive usage example with code snippets - Create test file for dragOutside functionality - Document browser support and benefits
1 parent 003059f commit 00fa1d7

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

DRAG_OUTSIDE_EXAMPLE.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# dragOutside Feature Example
2+
3+
The `dragOutside` option allows dragging to continue even when the mouse/pointer leaves the canvas or browser window.
4+
5+
## Basic Usage
6+
7+
```javascript
8+
import { Viewport } from 'pixi-viewport';
9+
10+
const viewport = new Viewport({
11+
screenWidth: window.innerWidth,
12+
screenHeight: window.innerHeight,
13+
worldWidth: 2000,
14+
worldHeight: 2000,
15+
events: app.renderer.events
16+
});
17+
18+
// Enable dragOutside
19+
viewport.drag({
20+
dragOutside: true
21+
});
22+
```
23+
24+
## Options
25+
26+
```javascript
27+
viewport.drag({
28+
dragOutside: true, // Enable dragging outside canvas (default: false)
29+
clampWheel: false, // Other options work as usual
30+
mouseButtons: 'all' // Still respects button configuration
31+
});
32+
```
33+
34+
## How it Works
35+
36+
When `dragOutside: true` is enabled:
37+
38+
1. **Normal behavior inside canvas**: Works exactly like before
39+
2. **Outside canvas**: Uses document-level event listeners to track mouse movement
40+
3. **Cross-window dragging**: Continues panning even when mouse leaves browser window
41+
4. **Proper cleanup**: Automatically removes document listeners when drag ends
42+
43+
## Benefits
44+
45+
- **Better UX**: No more frustrating drag interruptions
46+
- **Small canvases**: Enables large mouse movements for fine control
47+
- **Interactive overlays**: Doesn't stop when mouse moves over UI elements
48+
- **Backward compatible**: Default `false` maintains existing behavior
49+
50+
## Demo
51+
52+
The development server demo at `http://localhost:5175` shows `dragOutside` in action.
53+
Look for the green indicator in the top-right corner!
54+
55+
## Browser Support
56+
57+
Works in all modern browsers that support pointer events (IE11+, all evergreen browsers).

test/drag-outside.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
require('./node-shim');
2+
const assert = require('chai').assert;
3+
const Viewport = require('../').Viewport;
4+
5+
describe('drag-outside', () => {
6+
let viewport;
7+
8+
beforeEach(() => {
9+
viewport = new Viewport();
10+
});
11+
12+
afterEach(() => {
13+
viewport.destroy();
14+
});
15+
16+
it('dragOutside option defaults to false', () => {
17+
const drag = viewport.drag();
18+
assert.isFalse(drag.options.dragOutside);
19+
});
20+
21+
it('dragOutside option can be enabled', () => {
22+
const drag = viewport.drag({ dragOutside: true });
23+
assert.isTrue(drag.options.dragOutside);
24+
});
25+
26+
it('dragOutside option is included in default options', () => {
27+
const drag = viewport.drag({ dragOutside: true });
28+
assert.property(drag.options, 'dragOutside');
29+
assert.isBoolean(drag.options.dragOutside);
30+
});
31+
32+
it('dragOutside works with other options', () => {
33+
const drag = viewport.drag({
34+
dragOutside: true,
35+
clampWheel: true,
36+
factor: 2
37+
});
38+
assert.isTrue(drag.options.dragOutside);
39+
assert.isTrue(drag.options.clampWheel);
40+
assert.equal(drag.options.factor, 2);
41+
});
42+
43+
it('dragOutside properly sets up internal state', () => {
44+
viewport.drag({ dragOutside: true });
45+
const drag = viewport.plugins.get('drag');
46+
47+
// Check that internal properties are initialized
48+
assert.isFalse(drag.isDragOutside);
49+
assert.isUndefined(drag.dragOutsideStartPosition);
50+
});
51+
});

0 commit comments

Comments
 (0)