diff --git a/src/@next/Menu/Menu.stories.tsx b/src/@next/Menu/Menu.stories.tsx
index dce89f7da..76b2b95bc 100644
--- a/src/@next/Menu/Menu.stories.tsx
+++ b/src/@next/Menu/Menu.stories.tsx
@@ -32,8 +32,12 @@ const options = [
active: false,
disabled: false,
id: '2',
- label: 'Completed',
- value: 'Completed',
+ label: 'Tooltip Added',
+ value: 'Tooltip Added',
+ tooltip: {
+ content: 'Sample Tooltip',
+ preferredPosition: 'right-middle',
+ },
},
{
active: false,
@@ -84,8 +88,12 @@ Basic.parameters = {
active: false,
disabled: false,
id: '2',
- label: 'Completed',
- value: 'Completed',
+ label: 'Tooltip Added',
+ value: 'Tooltip Added',
+ tooltip: {
+ content: "Sample Tooltip",
+ preferredPosition: 'right-middle'
+ }
},
{
active: false,
@@ -169,8 +177,12 @@ AllowMultiple.parameters = {
active: false,
disabled: false,
id: '2',
- label: 'Completed',
- value: 'Completed',
+ label: 'Tooltip Added',
+ value: 'Tooltip Added',
+ tooltip: {
+ content: "Sample Tooltip",
+ preferredPosition: 'right-middle'
+ }
},
{
active: false,
diff --git a/src/@next/Menu/Menu.tsx b/src/@next/Menu/Menu.tsx
index 5862d7734..329b9507e 100644
--- a/src/@next/Menu/Menu.tsx
+++ b/src/@next/Menu/Menu.tsx
@@ -2,10 +2,17 @@ import React from 'react';
import nextId from 'react-id-generator';
import { Typography } from '../Typography';
import { Neutral } from '../utilities/colors';
-import { StyledMenu, StyledSections, TitleContainer } from './MenuStyle';
+import {
+ StyledMenu,
+ StyledSections,
+ StyledTooltip,
+ TitleContainer,
+ TitleNodeContainer,
+} from './MenuStyle';
import { MenuOptionLabel } from './components/MenuOptionLabel';
import { MenuOption } from './components/MenuOption';
import { MenuOptionCheckbox } from './components/MenuOptionCheckbox';
+import { TooltipPosition } from '../Tooltip/Tooltip';
export interface Option {
disabled?: boolean;
@@ -13,10 +20,14 @@ export interface Option {
label: string | React.ReactNode;
sublabel?: React.ReactNode;
value: string;
+ tooltip?: {
+ content: React.ReactNode;
+ preferredPosition?: TooltipPosition;
+ };
}
export interface Section {
- title?: string;
+ title?: string | React.ReactNode;
options: Option[];
}
export interface MenuProps {
@@ -25,7 +36,7 @@ export interface MenuProps {
options?: Option[];
/** Selected value based on Option.value */
selectedValues?: string[];
- title?: string;
+ title?: string | React.ReactNode;
allowMultiple?: boolean;
sections?: Section[];
}
@@ -42,7 +53,10 @@ export const Menu = ({
const randomId = nextId('glints-menu');
const menuId = id ? id : randomId;
- const renderTitle = ({ title }: { title: string }) => {
+ const renderTitle = ({ title }: { title: string | React.ReactNode }) => {
+ if (React.isValidElement(title)) {
+ return {title};
+ }
return (
@@ -56,12 +70,12 @@ export const Menu = ({
return (
{options?.map((option: Option) => {
- const { value, label, sublabel, disabled, id } = option;
+ const { value, label, sublabel, disabled, id, tooltip } = option;
const randomId = nextId('glints-menu-option');
const menuOptionId = id ? id : randomId;
const isSelected = selectedValues?.includes(value);
- return (
+ const menuOption = (
);
+
+ return tooltip ? (
+
+ {menuOption}
+
+ ) : (
+ menuOption
+ );
})}
);
@@ -82,12 +107,12 @@ export const Menu = ({
return (
{options?.map((option: Option) => {
- const { value, label, disabled, id } = option;
+ const { value, label, disabled, id, tooltip } = option;
const randomId = nextId('glints-menu-option');
const menuOptionId = id ? id : randomId;
const isSelected = selectedValues?.includes(value);
- return (
+ const menuOption = (
);
+
+ return tooltip ? (
+
+ {menuOption}
+
+ ) : (
+ menuOption
+ );
})}
);
diff --git a/src/@next/Menu/MenuStyle.ts b/src/@next/Menu/MenuStyle.ts
index c0d219dff..4ce8106af 100644
--- a/src/@next/Menu/MenuStyle.ts
+++ b/src/@next/Menu/MenuStyle.ts
@@ -4,6 +4,7 @@ import { Blue, Neutral } from '../utilities/colors';
import { space16, space4, space8 } from '../utilities/spacing';
import { MenuProps } from './Menu';
+import { Tooltip } from '../Tooltip/Tooltip';
export const StyledMenu = styled.ul`
list-style: none;
@@ -73,6 +74,13 @@ export const StyledMenu = styled.ul`
}
`;
+export const StyledTooltip = styled(Tooltip).attrs({
+ zIndex: 500,
+})`
+ display: block;
+ width: 100%;
+`;
+
export const TitleContainer = styled.div`
margin: ${space8} 0 ${space4};
padding: ${space8} ${space16};
@@ -82,6 +90,10 @@ export const TitleContainer = styled.div`
}
`;
+export const TitleNodeContainer = styled.div`
+ margin: ${space8} 0 ${space4};
+`;
+
export const ListContainer = styled.div`
padding: 0 ${space8};
`;
diff --git a/test/e2e/menu/menu.spec.ts b/test/e2e/menu/menu.spec.ts
index ca63342aa..a9d722124 100644
--- a/test/e2e/menu/menu.spec.ts
+++ b/test/e2e/menu/menu.spec.ts
@@ -3,7 +3,7 @@ import { MenuPage } from './menuPage';
test('Menu - basic without title', async ({ page }) => {
const menuPage = new MenuPage(page);
- await menuPage.goto('args=title:');
+ await menuPage.goto('args=title:!null');
await expect(menuPage.canvas).toHaveScreenshot(
'menu-basic-without-title.png'
);
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png
index 2167431b9..395c3ed6c 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-hover-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png
index e8a1b03c4..164eb9103 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multi-option-selected-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png
index c30c9f1bf..47e82f80f 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-allow-multiple-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png
index 7e7ca1004..b3b7c5d84 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-hover-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png
index bcd6a3bbc..4b34844f2 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-option-selected-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png
index b31759852..b553a5105 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-with-disabled-option-chromium-linux.png differ
diff --git a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png
index 8b0850f04..9d385d1d8 100755
Binary files a/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png and b/test/e2e/menu/menu.spec.ts-snapshots/menu-basic-without-title-chromium-linux.png differ