Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge release/v1.4.0 to develop #5565

Merged
merged 19 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
ac8e9d3
teams -> enterprise
sashankaryal Feb 21, 2025
fa77602
add enterprise button
sashankaryal Mar 7, 2025
7ff7d16
fix light mode
sashankaryal Mar 7, 2025
7d6dc79
fix YOLO kwargs syntax
brimoor Mar 10, 2025
cdc6cb2
special case for pw where we don't show teams popover
sashankaryal Mar 10, 2025
2c9be2d
Merge pull request #5508 from voxel51/refactor/enterprise
sashankaryal Mar 10, 2025
cee47e5
Fix recomputing frames on a video dataset (#5554)
benjaminpkane Mar 10, 2025
471b011
fix slow compute metadata on PNGs due to getexif on png (#5564)
CamronStaley Mar 10, 2025
44c6d48
replace capital Teams
swheaton Feb 27, 2025
120a7be
PR review: navbar consistency, teams_plugins->plugins, FiftyOne Open …
swheaton Mar 11, 2025
fa1290c
Merge pull request #5562 from voxel51/bugfix/ultralytics-docs
brimoor Mar 11, 2025
eee32c4
Merge pull request #5526 from voxel51/docs/teams-to-enterprise-make-i…
brimoor Mar 11, 2025
b0c6bf4
Merge branch 'release/v1.4.0' into merge/release/v1.4.0
benjaminpkane Mar 11, 2025
071dd71
enhancement for empty values for list and str types
imanjra Mar 11, 2025
662fbc1
fix python panel state change from DynamicIO
imanjra Mar 10, 2025
fcf3bcc
enhancement for empty values for list and str types
imanjra Mar 11, 2025
0292f24
fix python panel state change from DynamicIO
imanjra Mar 10, 2025
34f9a96
Merge branch 'merge/release/v1.4.0' of https://github.com/voxel51/fif…
voxel51-bot Mar 11, 2025
574fc92
Merge branch 'release/v1.4.0' of https://github.com/voxel51/fiftyone …
voxel51-bot Mar 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ data quality more efficiently than ever before 🤝

If you're looking to scale to production-grade, collaborative, cloud-native
enterprise workloads, check out
**[FiftyOne Teams](http://voxel51.com/enterprise)** 🚀
**[FiftyOne Enterprise](http://voxel51.com/enterprise)** 🚀

![------------------------------------------------------------------](https://github.com/user-attachments/assets/fb0573d0-bb56-40ff-9ae1-a5e8f62f5f42)

Expand Down Expand Up @@ -455,8 +455,8 @@ https://github.com/user-attachments/assets/c7ed496d-0cf7-45d6-9853-e349f1abd6f8

## <img src="https://user-images.githubusercontent.com/25985824/106288517-2422e000-6216-11eb-871d-26ad2e7b1e59.png" height="20px"> &nbsp; additional resources &nbsp; 🚁

| [FiftyOne Teams](https://voxel51.com/enterprise) | [VoxelGPT](https://github.com/voxel51/voxelgpt) | [Plugins](https://voxel51.com/plugins) | [Vector Search](https://voxel51.com/blog/the-computer-vision-interface-for-vector-search) | [Dataset Zoo](https://docs.voxel51.com/dataset_zoo/index.html) | [Model Zoo](https://docs.voxel51.com/model_zoo/index.html) | [FiftyOne Brain](https://docs.voxel51.com/brain.html) |
| ------------------------------------------------ | ----------------------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------------- |
| [FiftyOne Enterprise](https://voxel51.com/enterprise) | [VoxelGPT](https://github.com/voxel51/voxelgpt) | [Plugins](https://voxel51.com/plugins) | [Vector Search](https://voxel51.com/blog/the-computer-vision-interface-for-vector-search) | [Dataset Zoo](https://docs.voxel51.com/dataset_zoo/index.html) | [Model Zoo](https://docs.voxel51.com/model_zoo/index.html) | [FiftyOne Brain](https://docs.voxel51.com/brain.html) |
| ----------------------------------------------------- | ----------------------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------------- |

</div>

Expand All @@ -478,11 +478,11 @@ Full documentation for FiftyOne is available at

<div id='fiftyone-teams'/>

## <img src="https://user-images.githubusercontent.com/25985824/106288517-2422e000-6216-11eb-871d-26ad2e7b1e59.png" height="20px"> &nbsp; FiftyOne Teams &nbsp; 🏎️
## <img src="https://user-images.githubusercontent.com/25985824/106288517-2422e000-6216-11eb-871d-26ad2e7b1e59.png" height="20px"> &nbsp; FiftyOne Enterprise &nbsp; 🏎️

Want to securely collaborate on billions of samples in the cloud and connect to
your compute resources to automate your workflows? Check out
[FiftyOne Teams](https://voxel51.com/enterprise).
[FiftyOne Enterprise](https://voxel51.com/enterprise).

![------------------------------------------------------------------](https://github.com/user-attachments/assets/fb0573d0-bb56-40ff-9ae1-a5e8f62f5f42)

Expand Down
329 changes: 321 additions & 8 deletions app/packages/app/src/components/Teams.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,325 @@
import { Button, ExternalLink } from "@fiftyone/components";
import React from "react";
import { Button, ExternalLink, useTheme } from "@fiftyone/components";
import AutoAwesomeIcon from "@mui/icons-material/AutoAwesome";
import {
Box,
Button as MuiButton,
Popover,
Stack,
Typography,
useColorScheme,
} from "@mui/material";
import React, { useCallback, useEffect, useState } from "react";
import styled, { css, keyframes } from "styled-components";

const ENTERPRISE_TOOLTIP_LS = "fiftyone-enterprise-tooltip-seen";
const ENTERPRISE_BUTTON_ID = "fo-cta-enterprise-button";

const DARK_BG_COLOR = "#333333";
const LIGHT_BG_COLOR = "#FFFFFF";

const GRADIENT_START_COLOR = "#FF6D04";
const GRADIENT_END_COLOR = "#B681FF";

// subtle pulse animation for the sparkles icon
const pulse = keyframes`
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1);
opacity: 0.9;
}
100% {
transform: scale(1);
opacity: 1;
}
`;

// styles that will be applied to the icon container
const pulseAnimation = css`
animation: ${pulse} 1.5s ease-in-out infinite;
`;

const IconContainer = styled.div`
display: flex;
align-items: center;
transition: all 0.3s ease;
`;

// https://stackoverflow.com/questions/65282139/adding-a-linear-gradient-to-material-ui-icon
const GradientAutoAwesomeIcon = () => (
<>
<svg width={0} height={0} aria-label="Gradient" aria-labelledby="gradient">
<title>Gradient</title>
<defs>
<linearGradient id="gradient1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop
offset="0%"
style={{ stopColor: GRADIENT_START_COLOR, stopOpacity: 1 }}
/>
<stop
offset="100%"
style={{ stopColor: GRADIENT_END_COLOR, stopOpacity: 1 }}
/>
</linearGradient>
</defs>
</svg>
<IconContainer className="fo-teams-cta-pulse-animation">
<AutoAwesomeIcon
sx={{
fontSize: { xs: 16, sm: 20 },
mr: 1,
fill: "url(#gradient1)",
}}
/>
</IconContainer>
</>
);

const ButtonContainer = styled.div<{ bgColor: string }>`
background-color: ${({ bgColor }) => bgColor};
border-radius: 16px;

&:hover {
background-color: transparent;
}
`;

const StyledExternalLink = styled(ExternalLink)`
text-decoration: none;

&:hover {
text-decoration: none;
}
`;

const BaseEnterpriseButton = styled(Button)<{
borderColor: string;
isLightMode?: boolean;
}>`
background: linear-gradient(45deg, #ff6d04 0%, #b681ff 100%);
background-clip: text;
-webkit-background-clip: text;
text-fill-color: transparent;
-webkit-text-fill-color: transparent;
display: flex;
align-items: center;
gap: 2px;
padding: 6px 12px;
border-radius: 16px;
font-weight: 500;
text-transform: none;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
text-decoration: none;
font-size: 16px;
position: relative;
overflow: hidden;
border: 1px solid ${({ borderColor }) => borderColor};
outline: none;
box-shadow: none;

@media (max-width: 767px) {
font-size: 14px;
padding: 4px 10px;
}

&:before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: ${({ isLightMode }) => (isLightMode ? "150%" : "100%")};
height: 100%;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(255, 255, 255, ${({ isLightMode }) => (isLightMode ? "0.3" : "0.2")})
50%,
rgba(255, 255, 255, 0) 100%
);
transition: all ${({ isLightMode }) => (isLightMode ? "0.8s" : "0.6s")} ease;
z-index: 1;
}

&:hover,
&:focus,
&:active {
transform: scale(1.03);
text-decoration: none;
border: 1px solid ${({ borderColor }) => borderColor} !important;
outline: none;
box-shadow: none;

background: linear-gradient(45deg, #ff6d04 0%, #b681ff 100%) !important;
background-clip: text !important;
-webkit-background-clip: text !important;
text-fill-color: transparent !important;
-webkit-text-fill-color: transparent !important;

&:before {
left: 100%;
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0) 0%,
rgba(
255,
255,
255,
${({ isLightMode }) => (isLightMode ? "0.6" : "0.2")}
)
50%,
rgba(255, 255, 255, 0) 100%
);
}

.fo-teams-cta-pulse-animation {
${pulseAnimation}
}
}
`;

const PopoverContent = styled(Box)`
padding: 16px;
width: 310px;
position: relative;
display: flex;
flex-direction: column;
gap: 12px;
`;

const PopoverHeading = styled(Typography)`
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
margin-bottom: 12px;
`;

const PopoverBody = styled(Typography)`
position: relative;
color: var(--fo-palette-text-secondary);
font-size: 15px !important;
`;

const PopoverFooter = styled(Stack)`
margin-top: 16px;
`;

export default function Teams({
disablePopover = false,
}: { disablePopover?: boolean }) {
const [showPopover, setShowPopover] = useState(false);

const { mode } = useColorScheme();
const theme = useTheme();

const bgColor = mode === "light" ? LIGHT_BG_COLOR : DARK_BG_COLOR;

useEffect(() => {
const hasSeenTooltip = window.localStorage.getItem(ENTERPRISE_TOOLTIP_LS);

// don't show intro popoverif we're in playwright
const isPlaywright = window["IS_PLAYWRIGHT"];

if (!hasSeenTooltip && !isPlaywright) {
setShowPopover(true);
}
}, []);

const markTooltipSeen = useCallback(() => {
localStorage.setItem(ENTERPRISE_TOOLTIP_LS, "true");
}, []);

const handlePopoverClose = useCallback(() => {
markTooltipSeen();
setShowPopover(false);
}, [markTooltipSeen]);

const handleExplore = useCallback(() => {
markTooltipSeen();
setShowPopover(false);
window.open(
"https://voxel51.com/why-upgrade?utm_source=FiftyOneApp",
"_blank"
);
}, [markTooltipSeen]);

export default function Teams() {
return (
<ExternalLink
href={"https://voxel51.com/book-a-demo/?utm_source=FiftyOneApp"}
>
<Button>Have a Team?</Button>
</ExternalLink>
<>
<ButtonContainer bgColor={mode === "light" ? "transparent" : bgColor}>
<StyledExternalLink href="https://voxel51.com/why-upgrade?utm_source=FiftyOneApp">
<BaseEnterpriseButton
borderColor={mode === "dark" ? DARK_BG_COLOR : theme.divider}
isLightMode={mode === "light"}
id={ENTERPRISE_BUTTON_ID}
>
<GradientAutoAwesomeIcon />
Explore Enterprise
</BaseEnterpriseButton>
</StyledExternalLink>
</ButtonContainer>

{showPopover && !disablePopover && (
<Popover
open
anchorEl={document.getElementById(ENTERPRISE_BUTTON_ID)}
onClose={handlePopoverClose}
anchorOrigin={{
vertical: "bottom",
horizontal: "center",
}}
transformOrigin={{
vertical: -12,
horizontal: "center",
}}
elevation={3}
>
<PopoverContent
style={{
backgroundColor:
mode === "light" ? LIGHT_BG_COLOR : DARK_BG_COLOR,
}}
>
<PopoverHeading variant="h6">
<GradientAutoAwesomeIcon />
<Typography variant="h6" letterSpacing={0.3}>
Accelerate your workflow
</Typography>
</PopoverHeading>

<PopoverBody variant="body2">
With FiftyOne Enterprise you can connect to your data lake,
automate your data curation and model analysis tasks, securely
collaborate with your team, and more.
</PopoverBody>

<PopoverFooter direction="row" spacing={2}>
<MuiButton
variant="contained"
onClick={handleExplore}
size="large"
sx={{
boxShadow: "none",
}}
>
Explore Enterprise
</MuiButton>
<MuiButton
variant="outlined"
color="secondary"
onClick={handlePopoverClose}
size="large"
sx={{
boxShadow: "none",
}}
>
Dismiss
</MuiButton>
</PopoverFooter>
</PopoverContent>
</Popover>
)}
</>
);
}
Loading
Loading