`pointerdown`에서 시작 시각을 기록하고 `requestAnimationFrame`으로 경과 시간을 재면서 진행률을 시각적으로 채운다(원형 또는 채움 애니메이션). 진행률이 100%(보통 500~1000ms)에 닿으면 메뉴를 띄운다.
핵심은 취소 조건이다 — `pointerup`이나 `pointercancel`, 혹은 누른 채로 일정 거리 이상 움직이면(스크롤/드래그로 오인) 즉시 타이머를 멈추고 진행률을 0으로 되돌려야 한다. 그렇지 않으면 스크롤하려던 사용자에게 엉뚱한 메뉴가 뜬다.
터치에서는 브라우저 기본 롱프레스(텍스트 선택, 컨텍스트 메뉴)와 충돌하므로 `touch-action: none`이나 `-webkit-touch-callout: none`으로 기본 동작을 억제해야 한다.
언제 쓰나
메시지 앱의 반응 선택, 아이콘 편집 모드 진입처럼 "부가 동작"을 숨겨둘 때 씁니다. 유일한 진입 경로로 쓰면 발견성이 낮으니 다른 경로도 함께 둡니다.