Skip to content

Commit c7d98f0

Browse files
fix(core): suppress canvas touch callouts
1 parent 7fa39fb commit c7d98f0

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

modules/core/src/lib/deck.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ function noop() {}
5959

6060
const getCursor = ({isDragging}) => (isDragging ? 'grabbing' : 'grab');
6161

62+
const DEFAULT_CANVAS_STYLE = {
63+
userSelect: 'none'
64+
} as const;
65+
66+
const DEFAULT_CANVAS_CSS_PROPERTIES = {
67+
'-webkit-user-select': 'none',
68+
'-webkit-touch-callout': 'none',
69+
'-webkit-tap-highlight-color': 'transparent'
70+
} as const;
71+
6272
export type DeckMetrics = {
6373
fps: number;
6474
setPropsTime: number;
@@ -1041,7 +1051,10 @@ export default class Deck<ViewsT extends ViewOrViews = null> {
10411051
parent.appendChild(canvas);
10421052
}
10431053

1044-
Object.assign(canvas.style, props.style);
1054+
for (const [key, value] of Object.entries(DEFAULT_CANVAS_CSS_PROPERTIES)) {
1055+
canvas.style.setProperty(key, value);
1056+
}
1057+
Object.assign(canvas.style, DEFAULT_CANVAS_STYLE, props.style);
10451058

10461059
return canvas;
10471060
}

test/modules/core/lib/deck.spec.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,37 @@ test('Deck#constructor', async () => {
131131
console.log('Deck constructor did not throw');
132132
});
133133

134+
test('Deck#auto-created canvas disables touch selection callouts', () => {
135+
const parent = document.createElement('div');
136+
const deck = Object.create(Deck.prototype) as {
137+
_createCanvas: (props: {
138+
parent?: HTMLElement;
139+
id?: string;
140+
width?: number;
141+
height?: number;
142+
canvas?: HTMLCanvasElement | string | null;
143+
style?: Partial<CSSStyleDeclaration> | null;
144+
}) => HTMLCanvasElement;
145+
};
146+
147+
const canvas = deck._createCanvas({
148+
parent,
149+
id: 'deck-canvas-style-test',
150+
width: 1,
151+
height: 1,
152+
canvas: null,
153+
style: null
154+
});
155+
expect(canvas.style.userSelect, 'auto-created canvas is not selectable').toBe('none');
156+
157+
const styledCanvas = document.createElement('canvas');
158+
deck._createCanvas({
159+
canvas: styledCanvas,
160+
style: {userSelect: 'text'}
161+
});
162+
expect(styledCanvas.style.userSelect, 'user canvas style can override defaults').toBe('text');
163+
});
164+
134165
test('Deck#abort', async () => {
135166
const deck = new Deck({
136167
device,

0 commit comments

Comments
 (0)