Skip to content

Commit f58fd39

Browse files
hassankhannecolas
authored andcommitted
[fix] Correctly propagate pointer-events to children
Corrects `pointer-events` behavior to match what's described at https://reactnative.dev/docs/view#pointerevents. Fixes #2794
1 parent 3c27dec commit f58fd39

File tree

4 files changed

+48
-16
lines changed

4 files changed

+48
-16
lines changed

packages/react-native-web/src/exports/AppRegistry/__tests__/__snapshots__/index-test.js.snap

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ exports[`AppRegistry runApplication styles roots in different documents 1`] = `
1818
".r-pointerEvents-105ug2t {pointer-events: auto !important;}",
1919
".r-pointerEvents-12vffkv * {pointer-events: auto;}",
2020
".r-pointerEvents-12vffkv {pointer-events: none !important;}",
21+
".r-pointerEvents-633pao * {pointer-events: none;}",
2122
".r-pointerEvents-633pao {pointer-events: none !important;}",
22-
".r-pointerEvents-ah5dr5>* {pointer-events: none;}",
23+
".r-pointerEvents-ah5dr5 * {pointer-events: none;}",
2324
".r-pointerEvents-ah5dr5 {pointer-events: auto !important;}",
2425
".r-position-u8s1d {position: absolute;}",
2526
".r-right-zchlnj {right: 0px;}",
@@ -45,8 +46,9 @@ exports[`AppRegistry runApplication styles roots in different documents 2`] = `
4546
".r-pointerEvents-105ug2t {pointer-events: auto !important;}",
4647
".r-pointerEvents-12vffkv * {pointer-events: auto;}",
4748
".r-pointerEvents-12vffkv {pointer-events: none !important;}",
49+
".r-pointerEvents-633pao * {pointer-events: none;}",
4850
".r-pointerEvents-633pao {pointer-events: none !important;}",
49-
".r-pointerEvents-ah5dr5>* {pointer-events: none;}",
51+
".r-pointerEvents-ah5dr5 * {pointer-events: none;}",
5052
".r-pointerEvents-ah5dr5 {pointer-events: auto !important;}",
5153
".r-position-u8s1d {position: absolute;}",
5254
".r-right-zchlnj {right: 0px;}",

packages/react-native-web/src/exports/AppRegistry/__tests__/index-test.node.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ describe('AppRegistry', () => {
6363
.r-pointerEvents-105ug2t{pointer-events:auto!important;}
6464
.r-pointerEvents-12vffkv * {pointer-events:auto;}
6565
.r-pointerEvents-12vffkv{pointer-events:none!important;}
66+
.r-pointerEvents-633pao * {pointer-events:none;}
6667
.r-pointerEvents-633pao{pointer-events:none!important;}
67-
.r-pointerEvents-ah5dr5>*{pointer-events:none;}
68+
.r-pointerEvents-ah5dr5 * {pointer-events:none;}
6869
.r-pointerEvents-ah5dr5{pointer-events:auto!important;}
6970
.r-position-u8s1d{position:absolute;}
7071
.r-right-zchlnj{right:0px;}
@@ -121,8 +122,9 @@ describe('AppRegistry', () => {
121122
.r-pointerEvents-105ug2t{pointer-events:auto!important;}
122123
.r-pointerEvents-12vffkv * {pointer-events:auto;}
123124
.r-pointerEvents-12vffkv{pointer-events:none!important;}
125+
.r-pointerEvents-633pao * {pointer-events:none;}
124126
.r-pointerEvents-633pao{pointer-events:none!important;}
125-
.r-pointerEvents-ah5dr5>*{pointer-events:none;}
127+
.r-pointerEvents-ah5dr5 * {pointer-events:none;}
126128
.r-pointerEvents-ah5dr5{pointer-events:auto!important;}
127129
.r-position-u8s1d{position:absolute;}
128130
.r-right-zchlnj{right:0px;}
@@ -172,8 +174,9 @@ describe('AppRegistry', () => {
172174
.r-pointerEvents-105ug2t{pointer-events:auto!important;}
173175
.r-pointerEvents-12vffkv * {pointer-events:auto;}
174176
.r-pointerEvents-12vffkv{pointer-events:none!important;}
177+
.r-pointerEvents-633pao * {pointer-events:none;}
175178
.r-pointerEvents-633pao{pointer-events:none!important;}
176-
.r-pointerEvents-ah5dr5>*{pointer-events:none;}
179+
.r-pointerEvents-ah5dr5 * {pointer-events:none;}
177180
.r-pointerEvents-ah5dr5{pointer-events:auto!important;}
178181
.r-position-u8s1d{position:absolute;}
179182
.r-right-zchlnj{right:0px;}

packages/react-native-web/src/exports/StyleSheet/__tests__/compiler-test.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ describe('StyleSheet/compile', () => {
142142
],
143143
[
144144
[
145-
".r-pointerEvents-ah5dr5>*{pointer-events:none;}",
145+
".r-pointerEvents-ah5dr5 * {pointer-events:none;}",
146146
".r-pointerEvents-ah5dr5{pointer-events:auto!important;}",
147147
],
148148
3,
@@ -177,6 +177,30 @@ describe('StyleSheet/compile', () => {
177177
`);
178178
});
179179

180+
test('when parent is pointer-events=none, pointer-events=none applied to children', () => {
181+
const result = atomic({
182+
pointerEvents: 'none'
183+
});
184+
185+
expect(result).toMatchInlineSnapshot(`
186+
[
187+
{
188+
"$$css": true,
189+
"pointerEvents": "r-pointerEvents-633pao",
190+
},
191+
[
192+
[
193+
[
194+
".r-pointerEvents-633pao * {pointer-events:none;}",
195+
".r-pointerEvents-633pao{pointer-events:none!important;}",
196+
],
197+
3,
198+
],
199+
],
200+
]
201+
`);
202+
});
203+
180204
test('when parent is pointer-events=box-none, pointer-events=auto applied to children', () => {
181205
const result = atomic({
182206
pointerEvents: 'box-none'

packages/react-native-web/src/exports/StyleSheet/compiler/index.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -379,20 +379,23 @@ function createAtomicRules(identifier: string, property, value): Rules {
379379

380380
// Polyfill for additional 'pointer-events' values
381381
// See d13f78622b233a0afc0c7a200c0a0792c8ca9e58
382+
// See https://reactnative.dev/docs/view#pointerevents
382383
case 'pointerEvents': {
383384
let finalValue = value;
384-
if (value === 'auto' || value === 'box-only') {
385+
if (value === 'auto') {
385386
finalValue = 'auto!important';
386-
if (value === 'box-only') {
387-
const block = createDeclarationBlock({ pointerEvents: 'none' });
388-
rules.push(`${selector}>*${block}`);
389-
}
390-
} else if (value === 'none' || value === 'box-none') {
387+
} else if (value === 'none') {
391388
finalValue = 'none!important';
392-
if (value === 'box-none') {
393-
const block = createDeclarationBlock({ pointerEvents: 'auto' });
394-
rules.push(`${selector} * ${block}`);
395-
}
389+
const block = createDeclarationBlock({ pointerEvents: 'none' });
390+
rules.push(`${selector} * ${block}`);
391+
} else if (value === 'box-none') {
392+
finalValue = 'none!important';
393+
const block = createDeclarationBlock({ pointerEvents: 'auto' });
394+
rules.push(`${selector} * ${block}`);
395+
} else if (value === 'box-only') {
396+
finalValue = 'auto!important';
397+
const block = createDeclarationBlock({ pointerEvents: 'none' });
398+
rules.push(`${selector} * ${block}`);
396399
}
397400
const block = createDeclarationBlock({ pointerEvents: finalValue });
398401
rules.push(`${selector}${block}`);

0 commit comments

Comments
 (0)