diff --git a/frontend/src/component/common/Truncator/Truncator.tsx b/frontend/src/component/common/Truncator/Truncator.tsx index 77d69b76f7..683522b5fb 100644 --- a/frontend/src/component/common/Truncator/Truncator.tsx +++ b/frontend/src/component/common/Truncator/Truncator.tsx @@ -32,6 +32,7 @@ export type TruncatorProps = { tooltipProps?: OverridableTooltipProps; children: React.ReactNode; onSetTruncated?: (isTruncated: boolean) => void; + wordBreak?: CSSProperties['wordBreak']; } & BoxProps; export const Truncator = ({ @@ -42,6 +43,7 @@ export const Truncator = ({ children, component = 'span', onSetTruncated, + wordBreak, ...props }: TruncatorProps) => { const [isTruncated, setIsTruncated] = useState(false); @@ -73,12 +75,15 @@ export const Truncator = ({ const { title: tooltipTitle, ...otherTooltipProps } = overridableTooltipProps; + const defaultWordBreak = lines === 1 ? 'break-all' : 'break-word'; + return ( {children} diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx index a4320e0a74..cfe28a2012 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx @@ -1,47 +1,30 @@ -import type { IStrategy } from 'interfaces/strategy'; -import { Link } from 'react-router-dom'; -import { - getFeatureStrategyIcon, - formatStrategyName, -} from 'utils/strategyNames'; -import { formatCreateStrategyPath } from 'component/feature/FeatureStrategy/FeatureStrategyCreate/FeatureStrategyCreate'; -import StringTruncator from 'component/common/StringTruncator/StringTruncator'; import { styled } from '@mui/material'; -import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; import { Truncator } from 'component/common/Truncator/Truncator'; - -interface IFeatureStrategyMenuCardProps { - projectId: string; - featureId: string; - environmentId: string; - strategy: Pick & - Partial; - defaultStrategy?: boolean; - onClose: () => void; -} +import type { ReactNode } from 'react'; const StyledIcon = styled('div')(({ theme }) => ({ - width: theme.spacing(3), + display: 'flex', + alignItems: 'center', '& > svg': { - width: theme.spacing(2.25), - height: theme.spacing(2.25), + width: theme.spacing(3.5), + height: theme.spacing(3.5), fill: theme.palette.primary.main, }, })); -const StyledName = styled(StringTruncator)(({ theme }) => ({ +const StyledName = styled(Truncator)(({ theme }) => ({ fontWeight: theme.typography.fontWeightBold, - fontSize: theme.typography.caption.fontSize, - display: 'block', - marginBottom: theme.spacing(0.5), })); -const StyledCard = styled(Link)(({ theme }) => ({ +const StyledCard = styled('div', { + shouldForwardProp: (prop) => prop !== 'isDefault', +})<{ isDefault?: boolean }>(({ theme, isDefault }) => ({ display: 'flex', - flexDirection: 'column', + alignItems: 'center', width: '100%', + height: '100%', maxWidth: '30rem', - padding: theme.spacing(1.5, 2), + padding: theme.spacing(2), color: 'inherit', textDecoration: 'inherit', lineHeight: 1.25, @@ -49,71 +32,79 @@ const StyledCard = styled(Link)(({ theme }) => ({ borderStyle: 'solid', borderColor: theme.palette.divider, borderRadius: theme.spacing(1), + textAlign: 'left', overflow: 'hidden', - '&:hover, &:focus': { - borderColor: theme.palette.primary.main, + position: 'relative', + fontSize: theme.typography.caption.fontSize, + '&:hover .cardContent, &:focus-within .cardContent': { + opacity: 0.4, }, + '&:hover .cardActions, &:focus-within .cardActions': { + opacity: 1, + }, + ...(isDefault && { + backgroundColor: theme.palette.secondary.light, + borderColor: theme.palette.secondary.border, + }), + userSelect: 'none', })); -const StyledTopRow = styled('div')(({ theme }) => ({ +const StyledCardContent = styled('div')(({ theme }) => ({ display: 'flex', - flexDirection: 'row', - alignItems: 'center', - width: '100%', + transition: 'opacity 0.2s ease-in-out', + gap: theme.spacing(2), })); +const StyledCardDescription = styled('div')(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + gap: theme.spacing(0.5), +})); + +const StyledCardActions = styled('div')(({ theme }) => ({ + position: 'absolute', + display: 'flex', + alignItems: 'center', + top: theme.spacing(0), + bottom: theme.spacing(0), + right: theme.spacing(2), + gap: theme.spacing(1), + opacity: 0, + transition: 'opacity 0.1s ease-in-out', +})); + +interface IFeatureStrategyMenuCardProps { + name: string; + description: string; + icon: ReactNode; + isDefault?: boolean; + children: ReactNode; +} + export const FeatureStrategyMenuCard = ({ - projectId, - featureId, - environmentId, - strategy, - defaultStrategy, - onClose, -}: IFeatureStrategyMenuCardProps) => { - const StrategyIcon = getFeatureStrategyIcon(strategy.name); - const strategyName = formatStrategyName(strategy.name); - const { trackEvent } = usePlausibleTracker(); - - const createStrategyPath = formatCreateStrategyPath( - projectId, - featureId, - environmentId, - strategy.name, - defaultStrategy, - ); - - const openStrategyCreationModal = () => { - trackEvent('strategy-add', { - props: { - buttonTitle: strategy.displayName || strategyName, - }, - }); - onClose(); - }; - - return ( - - - - - - - - theme.typography.caption.fontSize, - width: '100%', - }} - > - {strategy.description} - - - ); -}; + name, + description, + icon, + isDefault, + children, +}: IFeatureStrategyMenuCardProps) => ( + + + {icon} + + + {name} + + {description && ( + + {description} + + )} + + + + {children} + + +); diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCardAction.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCardAction.tsx new file mode 100644 index 0000000000..87e445d734 --- /dev/null +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCardAction.tsx @@ -0,0 +1,11 @@ +import { Button, styled, type ButtonProps } from '@mui/material'; + +const StyledActionContainer = styled('div')(({ theme }) => ({ + background: theme.palette.background.paper, +})); + +export const FeatureStrategyMenuCardAction = (props: ButtonProps) => ( + +