diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureReleasePlanCard/FeatureReleasePlanCard.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureReleasePlanCard/FeatureReleasePlanCard.tsx index 532fed2c21..a6bcf8d244 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureReleasePlanCard/FeatureReleasePlanCard.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureReleasePlanCard/FeatureReleasePlanCard.tsx @@ -5,21 +5,12 @@ import type { IReleasePlanTemplate } from 'interfaces/releasePlans'; import { Truncator } from 'component/common/Truncator/Truncator'; const StyledIcon = styled('div')(({ theme }) => ({ - width: theme.spacing(4), - height: 'auto', + width: theme.spacing(3), '& > svg': { + width: theme.spacing(2.25), + height: theme.spacing(2.25), fill: theme.palette.primary.main, }, - '& > div': { - height: theme.spacing(2), - marginLeft: '-.75rem', - color: theme.palette.primary.main, - }, -})); - -const StyledContentContainer = styled('div')(() => ({ - overflow: 'hidden', - width: '100%', })); const StyledName = styled(StringTruncator)(({ theme }) => ({ @@ -30,11 +21,11 @@ const StyledName = styled(StringTruncator)(({ theme }) => ({ })); const StyledCard = styled(Button)(({ theme }) => ({ - display: 'grid', - gridTemplateColumns: '2.5rem 1fr', + display: 'flex', + flexDirection: 'column', width: '100%', maxWidth: '30rem', - padding: theme.spacing(2), + padding: theme.spacing(1.5, 2), color: 'inherit', textDecoration: 'inherit', lineHeight: 1.25, @@ -49,6 +40,13 @@ const StyledCard = styled(Button)(({ theme }) => ({ }, })); +const StyledTopRow = styled('div')(({ theme }) => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + width: '100%', +})); + interface IFeatureReleasePlanCardProps { template: IReleasePlanTemplate; onClick: () => void; @@ -62,25 +60,24 @@ export const FeatureReleasePlanCard = ({ return ( - - - - + + + + - theme.typography.caption.fontSize, - fontWeight: (theme) => - theme.typography.fontWeightRegular, - width: '100%', - }} - > - {description} - - + + theme.typography.caption.fontSize, + fontWeight: (theme) => theme.typography.fontWeightRegular, + width: '100%', + }} + > + {description} + ); }; diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu.tsx index 7c4a54c75c..f52b3cf6e9 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenu.tsx @@ -226,6 +226,11 @@ export const FeatureStrategyMenu = ({ vertical: 'top', horizontal: 'left', }} + PaperProps={{ + sx: (theme) => ({ + maxWidth: '45vw', + }), + }} disableScrollLock={true} > {newStrategyDropdownEnabled ? ( diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx index 3b847cfd07..e876db8579 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCard/FeatureStrategyMenuCard.tsx @@ -20,23 +20,12 @@ interface IFeatureStrategyMenuCardProps { } const StyledIcon = styled('div')(({ theme }) => ({ - width: theme.spacing(4), - height: 'auto', + width: theme.spacing(3), '& > svg': { - // Styling for SVG icons. + width: theme.spacing(2.25), + height: theme.spacing(2.25), fill: theme.palette.primary.main, }, - '& > div': { - // Styling for the Rollout icon. - height: theme.spacing(2), - marginLeft: '-.75rem', - color: theme.palette.primary.main, - }, -})); - -const StyledContentContainer = styled('div')(() => ({ - overflow: 'hidden', - width: '100%', })); const StyledName = styled(StringTruncator)(({ theme }) => ({ @@ -47,11 +36,11 @@ const StyledName = styled(StringTruncator)(({ theme }) => ({ })); const StyledCard = styled(Link)(({ theme }) => ({ - display: 'grid', - gridTemplateColumns: '2.5rem 1fr', + display: 'flex', + flexDirection: 'column', width: '100%', maxWidth: '30rem', - padding: theme.spacing(2), + padding: theme.spacing(1.5, 2), color: 'inherit', textDecoration: 'inherit', lineHeight: 1.25, @@ -65,6 +54,13 @@ const StyledCard = styled(Link)(({ theme }) => ({ }, })); +const StyledTopRow = styled('div')(({ theme }) => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + width: '100%', +})); + export const FeatureStrategyMenuCard = ({ projectId, featureId, @@ -94,27 +90,27 @@ export const FeatureStrategyMenuCard = ({ return ( - - - - + + + + - theme.typography.caption.fontSize, - width: '100%', - }} - > - {strategy.description} - - + + theme.typography.caption.fontSize, + width: '100%', + }} + > + {strategy.description} + ); }; diff --git a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCards/FeatureStrategyMenuCards.tsx b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCards/FeatureStrategyMenuCards.tsx index 7370ba99a9..cfe4e015d2 100644 --- a/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCards/FeatureStrategyMenuCards.tsx +++ b/frontend/src/component/feature/FeatureStrategy/FeatureStrategyMenu/FeatureStrategyMenuCards/FeatureStrategyMenuCards.tsx @@ -15,6 +15,7 @@ import type { IReleasePlanTemplate } from 'interfaces/releasePlans'; import { useNavigate } from 'react-router-dom'; import CloseIcon from '@mui/icons-material/Close'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; +import FactCheckOutlinedIcon from '@mui/icons-material/FactCheckOutlined'; interface IFeatureStrategyMenuCardsProps { projectId: string; @@ -89,6 +90,51 @@ const StyledInfoIcon = styled(InfoOutlinedIcon)(({ theme }) => ({ color: theme.palette.text.secondary, })); +const StyledIcon = styled('div')(({ theme }) => ({ + width: theme.spacing(3), + '& > svg': { + fill: theme.palette.primary.main, + width: theme.spacing(2.25), + height: theme.spacing(2.25), + }, + display: 'flex', + alignItems: 'center', +})); + +// Empty state styling +const EmptyStateContainer = styled(Box)(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-start', + justifyContent: 'flex-start', + backgroundColor: theme.palette.neutral.light, + borderRadius: theme.shape.borderRadiusMedium, + padding: theme.spacing(3), + margin: theme.spacing(0, 2), + width: 'auto', +})); + +const EmptyStateTitle = styled(Typography)(({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + fontWeight: theme.typography.fontWeightBold, + marginBottom: theme.spacing(1), + display: 'flex', + alignItems: 'center', +})); + +const EmptyStateDescription = styled(Typography)(({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + color: theme.palette.text.secondary, +})); + +const ClickableBoldText = styled(Link)(({ theme }) => ({ + fontWeight: theme.typography.fontWeightBold, + cursor: 'pointer', + '&:hover': { + textDecoration: 'underline', + }, +})); + export const FeatureStrategyMenuCards = ({ projectId, featureId, @@ -199,6 +245,29 @@ export const FeatureStrategyMenuCards = ({ } + elseShow={ + + + + + + Create your own templates + + + Standardize how you do rollouts and make it more + efficient without having to set up the same + stategies from time to time. You find it in the + sidemenu under{' '} + + navigate('/release-templates') + } + > + Configure > Release templates + + + + } />