packages/storybook/stories/dom-pointer-event.stories.tsx (59 lines of code) (raw):

import React, { useEffect, useRef } from 'react' export const DOMPointerEvent: React.FC = () => { const ref = useRef<HTMLDivElement | null>(null) useEffect(() => { const { current: a } = ref if (!a) { return } const b = a.querySelector('#b') as HTMLElement const c = a.querySelector('#c') as HTMLElement const handleEvent = (event: MouseEvent) => { const target = event.target as HTMLDivElement console.info(event.type, target.id, `${event.offsetX}, ${event.offsetY}`) } const addListeners = (el: HTMLElement) => { el.addEventListener('pointerenter', handleEvent) el.addEventListener('pointerleave', handleEvent) el.addEventListener('pointerenter', handleEvent) el.addEventListener('pointerout', handleEvent) el.addEventListener('pointermove', handleEvent) el.addEventListener('pointerdown', handleEvent) el.addEventListener('pointerup', handleEvent) el.addEventListener('wheel', handleEvent) } const removeListeners = (el: HTMLElement) => { el.addEventListener('pointerenter', handleEvent) el.addEventListener('pointerleave', handleEvent) el.addEventListener('pointerenter', handleEvent) el.addEventListener('pointerout', handleEvent) el.addEventListener('pointermove', handleEvent) el.addEventListener('pointerdown', handleEvent) el.addEventListener('pointerup', handleEvent) el.addEventListener('wheel', handleEvent) } addListeners(a) addListeners(b) addListeners(c) return () => { removeListeners(a) removeListeners(b) removeListeners(c) } }, [ref]) return ( <> <div id='a' style={{ backgroundColor: 'red', width: 100, height: 100 }} ref={ref}> <div id="b" style={{ backgroundColor: 'black', width: 80, height: 80 }}> <div id="c" style={{ backgroundColor: 'yellow', width: 60, height: 60 }}> </div> </div> </div> </> ) } export default { title: 'core/dom', component: DOMPointerEvent, decorators: [(Story: React.ComponentType) => <div style={{ backgroundColor: '#efefef', width: '100%', height: '100vh' }}><Story /></div>], }