11/* eslint-disable react-hooks/rules-of-hooks */
22
3- import React , { useState } from 'react' ;
3+ import React , { useRef , useState } from 'react' ;
44import {
55 storybookArgTypes ,
66 storybookExcludedControlParams ,
@@ -10,7 +10,7 @@ import { StoryObj } from '@storybook/react';
1010import { fn , userEvent , within } from '@storybook/test' ;
1111
1212import Button from '@leafygreen-ui/button' ;
13- import { css } from '@leafygreen-ui/emotion' ;
13+ import { css , cx } from '@leafygreen-ui/emotion' ;
1414import Icon from '@leafygreen-ui/icon' ;
1515import CaretDown from '@leafygreen-ui/icon/dist/CaretDown' ;
1616import CloudIcon from '@leafygreen-ui/icon/dist/Cloud' ;
@@ -29,6 +29,7 @@ import {
2929 MenuVariant ,
3030 SubMenu ,
3131} from '.' ;
32+ import { useEventListener } from '@leafygreen-ui/hooks' ;
3233
3334const getDecoratorStyles = ( args : Partial < MenuProps > ) => {
3435 return css `
@@ -477,3 +478,91 @@ export const InitialLongMenuOpen: InitialLongMenuOpenStory = {
477478 ) ,
478479 ] ,
479480} ;
481+
482+ export const MovingMenuTrigger = ( ) => {
483+ const markerStyles = css `
484+ position : absolute;
485+ color : black;
486+ text-align : center;
487+ /* width: 30px;
488+ height: 20px; */
489+ outline : 1px solid black;
490+ cursor : default;
491+ ` ;
492+
493+ const [ open , setOpen ] = useState ( false ) ;
494+ const [ position , setPosition ] = useState ( { top : 0 , left : 0 } ) ;
495+ const anchorRef = useRef < HTMLDivElement > ( null ) ;
496+ useEventListener (
497+ 'contextmenu' ,
498+ event => {
499+ event . preventDefault ( ) ;
500+ const { clientX, clientY } = event ;
501+ setOpen ( true ) ;
502+ setPosition ( { top : clientY , left : clientX } ) ;
503+ } ,
504+ { dependencies : [ setPosition , setOpen ] } ,
505+ ) ;
506+ useEventListener (
507+ 'click' ,
508+ event => {
509+ event . preventDefault ( ) ;
510+ if ( event . buttons === 2 ) return ;
511+ setOpen ( false ) ;
512+ } ,
513+ { dependencies : [ setOpen ] } ,
514+ ) ;
515+
516+ return (
517+ < div className = "App" >
518+ < div
519+ ref = { anchorRef }
520+ style = { { position : 'absolute' , width : 1 , height : 1 , ...position } }
521+ />
522+ < div
523+ className = { cx (
524+ markerStyles ,
525+ css `
526+ top : 40vh ;
527+ left : 50vw ;
528+ ` ,
529+ ) }
530+ >
531+ Click here for a shorter menu
532+ </ div >
533+ < div
534+ className = { cx (
535+ markerStyles ,
536+ css `
537+ top : 10vh ;
538+ left : 50vw ;
539+ ` ,
540+ ) }
541+ >
542+ Click here for a long menu
543+ </ div >
544+ < Menu refEl = { anchorRef } open = { open } maxHeight = { Number . MAX_SAFE_INTEGER } >
545+ < MenuItem > Item #1</ MenuItem >
546+ < MenuItem > Item #2</ MenuItem >
547+ < MenuItem > Item #3</ MenuItem >
548+ < MenuItem > Item #4</ MenuItem >
549+ < MenuItem > Item #5</ MenuItem >
550+ < MenuItem > Item #6</ MenuItem >
551+ < MenuItem > Item #7</ MenuItem >
552+ < MenuItem > Item #8</ MenuItem >
553+ < MenuItem > Item #9</ MenuItem >
554+ < MenuItem > Item #10</ MenuItem >
555+ < MenuItem > Item #11</ MenuItem >
556+ < MenuItem > Item #12</ MenuItem >
557+ < MenuItem > Item #13</ MenuItem >
558+ < MenuItem > Item #14</ MenuItem >
559+ < MenuItem > Item #15</ MenuItem >
560+ < MenuItem > Item #16</ MenuItem >
561+ < MenuItem > Item #17</ MenuItem >
562+ < MenuItem > Item #18</ MenuItem >
563+ < MenuItem > Item #19</ MenuItem >
564+ < MenuItem > Item #20</ MenuItem >
565+ </ Menu >
566+ </ div >
567+ ) ;
568+ } ;
0 commit comments