diff --git a/nx-dev/nx-dev/pages/index.tsx b/nx-dev/nx-dev/pages/index.tsx index cf8bfa09ab..7d5e379f0c 100644 --- a/nx-dev/nx-dev/pages/index.tsx +++ b/nx-dev/nx-dev/pages/index.tsx @@ -1,8 +1,9 @@ -import { CallToAction, DefaultLayout, TrustedBy } from '@nx/nx-dev/ui-common'; +import { CallToAction, DefaultLayout } from '@nx/nx-dev/ui-common'; import { NextSeo } from 'next-seo'; import { CiForMonorepos, Hero, + HetznerCloudTestimonial, SmarterToolsForMonorepos, Statistics, TeamAndCommunity, @@ -43,7 +44,7 @@ export default function Index(): JSX.Element {
- +
diff --git a/nx-dev/ui-common/src/index.ts b/nx-dev/ui-common/src/index.ts index 96bd69079a..92bec176c8 100644 --- a/nx-dev/ui-common/src/index.ts +++ b/nx-dev/ui-common/src/index.ts @@ -25,6 +25,7 @@ export * from './lib/square-dotted-pattern'; export * from './lib/live-stream-notifier'; export * from './lib/webinar-notifier'; export * from './lib/hubspot-form'; +export * from './lib/video-modal'; export { resourceMenuItems } from './lib/headers/menu-items'; export { eventItems } from './lib/headers/menu-items'; diff --git a/nx-dev/ui-enterprise/src/lib/video-modal.tsx b/nx-dev/ui-common/src/lib/video-modal.tsx similarity index 100% rename from nx-dev/ui-enterprise/src/lib/video-modal.tsx rename to nx-dev/ui-common/src/lib/video-modal.tsx diff --git a/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx b/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx index 6e38460a10..4d5e5655de 100644 --- a/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx +++ b/nx-dev/ui-enterprise/src/lib/hetzner-cloud-testimonial.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, Fragment, ReactElement, useState } from 'react'; +import { ComponentProps, ReactElement, useState } from 'react'; import { Button, SectionHeading } from '@nx/nx-dev/ui-common'; import { HetznerCloudIcon } from '@nx/nx-dev/ui-icons'; import Link from 'next/link'; @@ -8,7 +8,7 @@ import { motion } from 'framer-motion'; import { PlayIcon } from '@heroicons/react/24/outline'; import Image from 'next/image'; import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; -import { VideoModal } from './video-modal'; +import { VideoModal } from '@nx/nx-dev/ui-common'; function PlayButton({ className, diff --git a/nx-dev/ui-enterprise/src/lib/testimonial-carousel.tsx b/nx-dev/ui-enterprise/src/lib/testimonial-carousel.tsx index 4a3e0edc31..2cd8a3220b 100644 --- a/nx-dev/ui-enterprise/src/lib/testimonial-carousel.tsx +++ b/nx-dev/ui-enterprise/src/lib/testimonial-carousel.tsx @@ -8,7 +8,7 @@ import { import { PayfitIcon, UkgIcon } from '@nx/nx-dev/ui-icons'; import { PlayIcon } from '@heroicons/react/24/outline'; import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; -import { VideoModal } from './video-modal'; +import { VideoModal } from '@nx/nx-dev/ui-common'; export function Carousel({ items, diff --git a/nx-dev/ui-home/src/index.ts b/nx-dev/ui-home/src/index.ts index c90ff726c4..8513843105 100644 --- a/nx-dev/ui-home/src/index.ts +++ b/nx-dev/ui-home/src/index.ts @@ -1,5 +1,6 @@ export * from './lib/ci-for-monorepos'; export * from './lib/hero'; +export * from './lib/hetzner-cloud-testimonial'; export * from './lib/smarter-tools-for-monorepos'; export * from './lib/statistics'; export * from './lib/team-and-community'; diff --git a/nx-dev/ui-home/src/lib/hetzner-cloud-testimonial.tsx b/nx-dev/ui-home/src/lib/hetzner-cloud-testimonial.tsx new file mode 100644 index 0000000000..0d82e07114 --- /dev/null +++ b/nx-dev/ui-home/src/lib/hetzner-cloud-testimonial.tsx @@ -0,0 +1,214 @@ +import { ComponentProps, ReactElement, useState } from 'react'; +import { Button, SectionHeading } from '@nx/nx-dev/ui-common'; +import { HetznerCloudIcon } from '@nx/nx-dev/ui-icons'; +import Link from 'next/link'; +import { cx } from '@nx/nx-dev/ui-primitives'; +import { MovingBorder } from '@nx/nx-dev/ui-animations'; +import { motion } from 'framer-motion'; +import { PlayIcon } from '@heroicons/react/24/outline'; +import Image from 'next/image'; +import { sendCustomEvent } from '@nx/nx-dev/feature-analytics'; +import { VideoModal } from '@nx/nx-dev/ui-common/src/lib/video-modal'; + +function PlayButton({ + className, + ...props +}: ComponentProps<'div'>): ReactElement { + const parent = { + initial: { + width: 82, + transition: { + when: 'afterChildren', + }, + }, + hover: { + width: 296, + transition: { + duration: 0.125, + type: 'tween', + ease: 'easeOut', + }, + }, + }; + const child = { + initial: { + opacity: 0, + x: -6, + }, + hover: { + x: 0, + opacity: 1, + transition: { + duration: 0.015, + type: 'tween', + ease: 'easeOut', + }, + }, + }; + + return ( +
+
+ +
+ +
+ + +
+ ); +} + +export function HetznerCloudTestimonial(): ReactElement { + const [isOpen, setIsOpen] = useState(false); + + return ( +
+
+ + Nx Enterprise{' '} + + speeds build and test times + {' '} + as Hetzner Cloud{' '} + + scales up + {' '} + product offering + +
+
+
+ video still + +
+ { + setIsOpen(true); + sendCustomEvent( + 'hetzner-cloud-testimonial-video-click', + 'hetzner-cloud-testimonial', + 'homepage' + ); + }} + /> +
+
+
+ +
+
+ + +
+

+ Featured client +

+ +

+ Nx is speed and scalability. Before we only had a few features + and CI was slow and now it’s fast with way more features. + That’s a huge win for us. +

+
+ +
+ pavlo grosse +
+
Pavlo Grosse
+
+ Senior Software Engineer, Hetzner Cloud +
+
+
+ +
+ + + See our customers + +
+
+
+
+
+ + setIsOpen(false)} + videoUrl="https://youtu.be/2BLqiNnBPuU" + /> +
+ ); +}