Skip to content

Commit 7e73cb9

Browse files
committed
add MovingMenuTrigger story
1 parent dda3a4f commit 7e73cb9

File tree

2 files changed

+91
-4
lines changed

2 files changed

+91
-4
lines changed

packages/menu/src/Menu.stories.tsx

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable react-hooks/rules-of-hooks */
22

3-
import React, { useState } from 'react';
3+
import React, { useRef, useState } from 'react';
44
import {
55
storybookArgTypes,
66
storybookExcludedControlParams,
@@ -10,7 +10,7 @@ import { StoryObj } from '@storybook/react';
1010
import { fn, userEvent, within } from '@storybook/test';
1111

1212
import Button from '@leafygreen-ui/button';
13-
import { css } from '@leafygreen-ui/emotion';
13+
import { css, cx } from '@leafygreen-ui/emotion';
1414
import Icon from '@leafygreen-ui/icon';
1515
import CaretDown from '@leafygreen-ui/icon/dist/CaretDown';
1616
import 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

3334
const 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+
};

packages/menu/src/Menu/Menu.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,6 @@ export const Menu = React.forwardRef<HTMLDivElement, MenuProps>(function Menu(
217217
}),
218218
} as const;
219219

220-
console.log('[menu] render');
221-
222220
const popoverContent = (
223221
<MenuDescendantsProvider>
224222
<MenuContext.Provider

0 commit comments

Comments
 (0)