diff --git a/src/components/Insights/InsightsCatalog/index.tsx b/src/components/Insights/InsightsCatalog/index.tsx index c07862275..2a678d7dc 100644 --- a/src/components/Insights/InsightsCatalog/index.tsx +++ b/src/components/Insights/InsightsCatalog/index.tsx @@ -84,7 +84,7 @@ export const InsightsCatalog = (props: InsightsCatalogProps) => { <> { setSearchInputValue(val); }} diff --git a/src/components/Insights/index.tsx b/src/components/Insights/index.tsx index 491dc1a81..e2f38cc7e 100644 --- a/src/components/Insights/index.tsx +++ b/src/components/Insights/index.tsx @@ -358,7 +358,8 @@ export const Insights = (props: InsightsProps) => { {infoToOpenJiraTicket && ( - {config.userRegistrationEmail ? ( + {/* {config.userRegistrationEmail ? ( */} + {true ? ( // eslint-disable-line no-constant-condition renderInsightTicket( infoToOpenJiraTicket, handleJiraTicketPopupClose diff --git a/src/components/Navigation/CodeButtonMenu/index.tsx b/src/components/Navigation/CodeButtonMenu/index.tsx index 1304d799d..5b6378618 100644 --- a/src/components/Navigation/CodeButtonMenu/index.tsx +++ b/src/components/Navigation/CodeButtonMenu/index.tsx @@ -3,8 +3,8 @@ import { actions } from "../../../actions"; import { isString } from "../../../typeGuards/isString"; import { sendTrackingEvent } from "../../../utils/sendTrackingEvent"; import { NewButton } from "../../common/NewButton"; -import { Tooltip } from "../../common/Tooltip"; import { CodeIcon } from "../../common/icons/16px/CodeIcon"; +import { Tooltip } from "../../common/v3/Tooltip"; import { MenuList } from "../common/MenuList"; import { Popup } from "../common/Popup"; import { trackingEvents } from "../tracking"; diff --git a/src/components/Navigation/EnvironmentBar/index.tsx b/src/components/Navigation/EnvironmentBar/index.tsx index 3a0915b69..d9684a534 100644 --- a/src/components/Navigation/EnvironmentBar/index.tsx +++ b/src/components/Navigation/EnvironmentBar/index.tsx @@ -1,9 +1,9 @@ import { sendTrackingEvent } from "../../../utils/sendTrackingEvent"; import { EnvironmentIcon } from "../../common/EnvironmentIcon"; -import { Tooltip } from "../../common/Tooltip"; import { ChevronIcon } from "../../common/icons/16px/ChevronIcon"; import { GlobeIcon } from "../../common/icons/16px/GlobeIcon"; import { Direction } from "../../common/icons/types"; +import { Tooltip } from "../../common/v3/Tooltip"; import { trackingEvents } from "../tracking"; import * as s from "./styles"; import { EnvironmentBarProps } from "./types"; diff --git a/src/components/Navigation/ScopeBar/index.tsx b/src/components/Navigation/ScopeBar/index.tsx index 4e7d34e56..52460ac24 100644 --- a/src/components/Navigation/ScopeBar/index.tsx +++ b/src/components/Navigation/ScopeBar/index.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import { sendTrackingEvent } from "../../../utils/sendTrackingEvent"; import { CodeDetails, Scope } from "../../common/App/types"; import { NewPopover } from "../../common/NewPopover"; -import { Tooltip } from "../../common/Tooltip"; import { CrosshairIcon } from "../../common/icons/16px/CrosshairIcon"; import { HomeIcon } from "../../common/icons/16px/HomeIcon"; +import { Tooltip } from "../../common/v3/Tooltip"; import { actions } from "../actions"; import { Popup } from "../common/Popup"; import { trackingEvents } from "../tracking"; diff --git a/src/components/Navigation/Tabs/index.tsx b/src/components/Navigation/Tabs/index.tsx index aea759e94..5240a8efe 100644 --- a/src/components/Navigation/Tabs/index.tsx +++ b/src/components/Navigation/Tabs/index.tsx @@ -2,7 +2,7 @@ import { useContext } from "react"; import { sendTrackingEvent } from "../../../utils/sendTrackingEvent"; import { ConfigContext } from "../../common/App/ConfigContext"; import { Scope } from "../../common/App/types"; -import { Tooltip } from "../../common/Tooltip"; +import { Tooltip } from "../../common/v3/Tooltip"; import { trackingEvents } from "../tracking"; import { TabData } from "../types"; import * as s from "./styles"; diff --git a/src/components/Navigation/common/MenuList/index.tsx b/src/components/Navigation/common/MenuList/index.tsx index a68e96181..61732a3b9 100644 --- a/src/components/Navigation/common/MenuList/index.tsx +++ b/src/components/Navigation/common/MenuList/index.tsx @@ -2,7 +2,7 @@ import { ReactElement } from "react"; import { isBoolean } from "../../../../typeGuards/isBoolean"; import { groupBy } from "../../../../utils/groupBy"; import { intersperse } from "../../../../utils/intersperse"; -import { Tooltip } from "../../../common/Tooltip"; +import { Tooltip } from "../../../common/v3/Tooltip"; import * as s from "./styles"; import { MenuListProps } from "./types"; diff --git a/src/components/Navigation/index.tsx b/src/components/Navigation/index.tsx index aeedf1361..0d7ba56c2 100644 --- a/src/components/Navigation/index.tsx +++ b/src/components/Navigation/index.tsx @@ -9,9 +9,9 @@ import { ConfigContext } from "../common/App/ConfigContext"; import { Environment, Scope } from "../common/App/types"; import { EnvironmentIcon } from "../common/EnvironmentIcon"; import { NewPopover } from "../common/NewPopover"; -import { Tooltip } from "../common/Tooltip"; import { FourSquaresIcon } from "../common/icons/FourSquaresIcon"; import { ThreeDotsIcon } from "../common/icons/ThreeDotsIcon"; +import { Tooltip } from "../common/v3/Tooltip"; import { CodeButton } from "./CodeButton"; import { CodeButtonMenu } from "./CodeButtonMenu"; import { EnvironmentBar } from "./EnvironmentBar"; diff --git a/src/components/Tests/index.tsx b/src/components/Tests/index.tsx index c7bcc25a6..7b5105fbe 100644 --- a/src/components/Tests/index.tsx +++ b/src/components/Tests/index.tsx @@ -323,7 +323,8 @@ export const Tests = (props: TestsProps) => { {testToOpenTicketPopup && ( - {config.userRegistrationEmail ? ( + {/* {config.userRegistrationEmail ? ( */} + {true ? ( // eslint-disable-line no-constant-condition ; export const Default: Story = { args: { content: - }, - parameters: { - design: { - type: "figma" - } } }; @@ -31,11 +26,6 @@ export const HighlightString: Story = { args: { type: "highlight", content: ~30ms - }, - parameters: { - design: { - type: "figma" - } } }; @@ -43,11 +33,6 @@ export const HighSeverity: Story = { args: { type: "highSeverity", content: input - }, - parameters: { - design: { - type: "figma" - } } }; @@ -55,11 +40,6 @@ export const MediumSeverity: Story = { args: { type: "mediumSeverity", content: input - }, - parameters: { - design: { - type: "figma" - } } }; @@ -67,11 +47,6 @@ export const LowSeverity: Story = { args: { type: "lowSeverity", content: Input - }, - parameters: { - design: { - type: "figma" - } } }; @@ -79,10 +54,5 @@ export const Success: Story = { args: { type: "success", content: 10ms - }, - parameters: { - design: { - type: "figma" - } } }; diff --git a/src/components/common/v3/Tag/index.tsx b/src/components/common/v3/Tag/index.tsx index 0d43d9ea0..dd3055985 100644 --- a/src/components/common/v3/Tag/index.tsx +++ b/src/components/common/v3/Tag/index.tsx @@ -1,10 +1,8 @@ import * as s from "./styles"; import { TagProps } from "./types"; -export const Tag = (props: TagProps) => { - return ( - - {props.content} - - ); -}; +export const Tag = (props: TagProps) => ( + + {props.content} + +); diff --git a/src/components/common/v3/Tooltip/Tooltip.stories.tsx b/src/components/common/v3/Tooltip/Tooltip.stories.tsx new file mode 100644 index 000000000..4bdfb5977 --- /dev/null +++ b/src/components/common/v3/Tooltip/Tooltip.stories.tsx @@ -0,0 +1,23 @@ +import { Meta, StoryObj } from "@storybook/react"; +import { Tooltip } from "."; + +// More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction +const meta: Meta = { + title: "Common/v3/Tooltip", + component: Tooltip, + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/react/configure/story-layout + layout: "fullscreen" + } +}; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + args: { + children: Hover me, + title: "Tooltip title" + } +}; diff --git a/src/components/common/v3/Tooltip/index.tsx b/src/components/common/v3/Tooltip/index.tsx new file mode 100644 index 000000000..00ea88873 --- /dev/null +++ b/src/components/common/v3/Tooltip/index.tsx @@ -0,0 +1,154 @@ +import { + FloatingArrow, + FloatingPortal, + Placement, + arrow, + autoUpdate, + flip, + offset, + shift, + useFloating, + useHover, + useInteractions, + useTransitionStyles +} from "@floating-ui/react"; +import { CSSProperties, Children, cloneElement, useRef, useState } from "react"; +import { useTheme } from "styled-components"; +import { isBoolean } from "../../../../typeGuards/isBoolean"; +import { isString } from "../../../../typeGuards/isString"; +import * as s from "./styles"; +import { TooltipProps } from "./types"; + +// in pixels +const ARROW_MARGIN = -4; +const ARROW_HEIGHT = 9; +const ARROW_WIDTH = ARROW_HEIGHT; +const GAP = 8; + +const getArrowStyles = (placement: Placement, dropShadow: boolean) => { + let styles: CSSProperties = dropShadow + ? { filter: "drop-shadow(0 0 6px rgb(0 0 0 / 15%))", zIndex: -1 } + : {}; + + switch (placement) { + case "top": + case "top-start": + case "top-end": + styles = { + ...styles, + marginTop: ARROW_MARGIN + }; + break; + case "right": + case "right-start": + case "right-end": + styles = { + ...styles, + marginRight: ARROW_MARGIN + }; + break; + case "bottom": + case "bottom-start": + case "bottom-end": + styles = { + ...styles, + marginBottom: ARROW_MARGIN + }; + break; + case "left": + case "left-start": + case "left-end": + styles = { + ...styles, + marginLeft: ARROW_MARGIN + }; + } + + return styles; +}; + +export const Tooltip = (props: TooltipProps) => { + const [isOpen, setIsOpen] = useState(false); + const arrowRef = useRef(null); + + const theme = useTheme(); + + const placement = props.placement || "top"; + + const { refs, floatingStyles, context } = useFloating({ + whileElementsMounted: autoUpdate, + placement, + open: isBoolean(props.isOpen) ? props.isOpen : isOpen, + onOpenChange: isBoolean(props.isOpen) ? undefined : setIsOpen, + middleware: [ + offset(GAP + ARROW_HEIGHT + ARROW_MARGIN), + flip(), + shift(), + arrow({ + element: arrowRef + }) + ] + }); + + const { isMounted, styles: transitionStyles } = useTransitionStyles(context, { + common: { + transitionTimingFunction: "ease-in-out" + }, + duration: 150 + }); + + const hover = useHover(context, { + delay: { open: 1000, close: 0 }, + enabled: !isBoolean(props.isOpen) + }); + + const { getReferenceProps, getFloatingProps } = useInteractions([hover]); + + const renderArrow = (withShadow: boolean) => ( + + ); + + return ( + <> + {Children.map(props.children, (child) => + cloneElement(child, { + ref: refs.setReference, + ...getReferenceProps() + }) + )} + {(isBoolean(props.isOpen) ? props.isOpen && isMounted : isMounted) && ( + + + {renderArrow(true)} + {renderArrow(false)} + {props.title} + + + )} + + ); +}; diff --git a/src/components/common/v3/Tooltip/styles.ts b/src/components/common/v3/Tooltip/styles.ts new file mode 100644 index 000000000..8c6335ea6 --- /dev/null +++ b/src/components/common/v3/Tooltip/styles.ts @@ -0,0 +1,16 @@ +import styled from "styled-components"; +import { LAYERS } from "../../App/styles"; + +export const TooltipContainer = styled.div` + z-index: ${LAYERS.TOOLTIP}; +`; + +export const Tooltip = styled.div` + padding: 4px; + border-radius: 4px; + box-shadow: 0 0 6px 0 rgb(0 0 0 / 15%); + font-size: 14px; + word-break: break-all; + color: ${({ theme }) => theme.colors.v3.text.primary}; + background: ${({ theme }) => theme.colors.v3.surface.secondary}; +`; diff --git a/src/components/common/v3/Tooltip/types.ts b/src/components/common/v3/Tooltip/types.ts new file mode 100644 index 000000000..f20bb78b9 --- /dev/null +++ b/src/components/common/v3/Tooltip/types.ts @@ -0,0 +1,15 @@ +import { Placement } from "@floating-ui/react"; +import { ReactElement, ReactNode } from "react"; + +export interface TooltipThemeColors { + background: string; + text: string; +} + +export interface TooltipProps { + children: ReactElement; + title: ReactNode; + placement?: Placement; + style?: React.CSSProperties; + isOpen?: boolean; +} diff --git a/src/types.ts b/src/types.ts index 9ea98502e..d0ad271a9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,8 +10,6 @@ export enum FeatureFlag { export enum InsightType { TopErrorFlows = "TopErrorFlows", - SpanDurationChange = "SpanDurationChange", - SpanUsageStatus = "SpanUsageStatus", HotSpot = "HotSpot", Errors = "Errors", SlowEndpoint = "SlowEndpoint", diff --git a/src/utils/getInsightTypeOrderPriority.ts b/src/utils/getInsightTypeOrderPriority.ts index e54ae623e..68fd09209 100644 --- a/src/utils/getInsightTypeOrderPriority.ts +++ b/src/utils/getInsightTypeOrderPriority.ts @@ -27,7 +27,6 @@ export const getInsightTypeOrderPriority = (type: string): number => { [InsightType.SpanScalingBadly]: 63, [InsightType.SpanScalingWell]: 64, [InsightType.SpanNPlusOne]: 65, - [InsightType.SpanDurationChange]: 66, [InsightType.SpanEndpointBottleneck]: 67, [InsightType.SpanDurationBreakdown]: 68, [InsightType.SpanNexus]: 69,