diff --git a/nx-dev/nx-dev/pages/solutions/engineering.tsx b/nx-dev/nx-dev/pages/solutions/engineering.tsx new file mode 100644 index 0000000000000..9dbe1bb6467aa --- /dev/null +++ b/nx-dev/nx-dev/pages/solutions/engineering.tsx @@ -0,0 +1,82 @@ +import { useRouter } from 'next/router'; +import { NextSeo } from 'next-seo'; +import { ButtonLinkProps, DefaultLayout } from '@nx/nx-dev/ui-common'; +import { + AllSpeedNoStress, + CustomerLogos, + DeveloperExperienceThatWorksForYou, + HetznerCloudTestimonial, + SolutionsBottomCallToAction, + SolutionsEngineeringHero, + SolutionsEngineeringTestimonials, + SolutionsFaq, + SolutionsTopCallToAction, +} from '@nx/nx-dev/ui-enterprise'; +import { type ReactElement } from 'react'; + +export function EnterpriseSolutionsEngineering(): ReactElement { + const router = useRouter(); + + const headerCTAConfig: ButtonLinkProps[] = [ + { + href: '/contact', + variant: 'secondary', + size: 'small', + title: 'Contact us', + children: 'Contact us', + }, + ]; + + return ( + <> + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + ); +} + +export default EnterpriseSolutionsEngineering; diff --git a/nx-dev/nx-dev/pages/solutions/leadership.tsx b/nx-dev/nx-dev/pages/solutions/leadership.tsx new file mode 100644 index 0000000000000..419ea9c59fb67 --- /dev/null +++ b/nx-dev/nx-dev/pages/solutions/leadership.tsx @@ -0,0 +1,86 @@ +import { useRouter } from 'next/router'; +import { NextSeo } from 'next-seo'; +import { ButtonLinkProps, DefaultLayout } from '@nx/nx-dev/ui-common'; +import { + BuildAModernEngineeringOrganization, + CustomerLogos, + HetznerCloudTestimonial, + MaximizeRoi, + ScaleSafely, + SolutionsBottomCallToAction, + SolutionsFaq, + SolutionsLeadershipHero, + SolutionsLeadershipTestimonials, + SolutionsTopCallToAction, +} from '@nx/nx-dev/ui-enterprise'; +import { type ReactElement } from 'react'; + +export function EnterpriseSolutionsLeadership(): ReactElement { + const router = useRouter(); + + const headerCTAConfig: ButtonLinkProps[] = [ + { + href: '/contact', + variant: 'secondary', + size: 'small', + title: 'Contact us', + children: 'Contact us', + }, + ]; + + return ( + <> + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + ); +} + +export default EnterpriseSolutionsLeadership; diff --git a/nx-dev/nx-dev/pages/solutions/management.tsx b/nx-dev/nx-dev/pages/solutions/management.tsx new file mode 100644 index 0000000000000..497fffcad35f6 --- /dev/null +++ b/nx-dev/nx-dev/pages/solutions/management.tsx @@ -0,0 +1,85 @@ +import { useRouter } from 'next/router'; +import { NextSeo } from 'next-seo'; +import { ButtonLinkProps, DefaultLayout } from '@nx/nx-dev/ui-common'; +import { + CustomerLogos, + CutDownEngineeringWaste, + HetznerCloudTestimonial, + KeepTeamsAligned, + ScaleWithEase, + SolutionsManagementHero, + SolutionsBottomCallToAction, + SolutionsManagementTestimonials, + SolutionsFaq, + SolutionsTopCallToAction, +} from '@nx/nx-dev/ui-enterprise'; +import { type ReactElement } from 'react'; + +export function EnterpriseSolutionsManagement(): ReactElement { + const router = useRouter(); + + const headerCTAConfig: ButtonLinkProps[] = [ + { + href: '/contact', + variant: 'secondary', + size: 'small', + title: 'Contact us', + children: 'Contact us', + }, + ]; + + return ( + <> + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + ); +} + +export default EnterpriseSolutionsManagement; diff --git a/nx-dev/nx-dev/pages/solutions/platform.tsx b/nx-dev/nx-dev/pages/solutions/platform.tsx new file mode 100644 index 0000000000000..d8bb98b3fd752 --- /dev/null +++ b/nx-dev/nx-dev/pages/solutions/platform.tsx @@ -0,0 +1,85 @@ +import { useRouter } from 'next/router'; +import { NextSeo } from 'next-seo'; +import { ButtonLinkProps, DefaultLayout } from '@nx/nx-dev/ui-common'; +import { + CostEfficientCompute, + CustomerLogos, + EasyToAdoptEasyToMaintain, + HetznerCloudTestimonial, + ReliableByDesign, + SolutionsBottomCallToAction, + SolutionsFaq, + SolutionsPlatformHero, + SolutionsPlatformTestimonials, + SolutionsTopCallToAction, +} from '@nx/nx-dev/ui-enterprise'; +import { type ReactElement } from 'react'; + +export function EnterpriseSolutionsPlatform(): ReactElement { + const router = useRouter(); + + const headerCTAConfig: ButtonLinkProps[] = [ + { + href: '/contact', + variant: 'secondary', + size: 'small', + title: 'Contact us', + children: 'Contact us', + }, + ]; + + return ( + <> + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + ); +} + +export default EnterpriseSolutionsPlatform; diff --git a/nx-dev/ui-common/src/lib/headers/header.tsx b/nx-dev/ui-common/src/lib/headers/header.tsx index 6fbeb81d934cc..31397313f07be 100644 --- a/nx-dev/ui-common/src/lib/headers/header.tsx +++ b/nx-dev/ui-common/src/lib/headers/header.tsx @@ -25,7 +25,11 @@ import { useState, } from 'react'; import { ButtonLink, ButtonLinkProps } from '../button'; -import { enterpriseItems, resourceMenuItems } from './menu-items'; +import { + enterpriseItems, + resourceMenuItems, + solutionsItems, +} from './menu-items'; import { MobileMenuItem } from './mobile-menu-item'; import { SectionsMenu } from './sections-menu'; import { AlgoliaSearch } from '@nx/nx-dev/feature-search'; @@ -120,6 +124,50 @@ export function Header({ ctaButtons }: HeaderProps): ReactElement { > Blog + {/*SOLUTIONS*/} + + {({ open }) => ( + <> + + + Solutions + + + + + + + + + + )} + {/*RESOURCES*/} {({ open }) => ( @@ -186,6 +234,7 @@ export function Header({ ctaButtons }: HeaderProps): ReactElement { Pricing
+ {/*ENTERPRISE*/} {({ open }) => ( <> @@ -379,7 +428,46 @@ export function Header({ ctaButtons }: HeaderProps): ReactElement { > Blog - {/*Resources*/} + {/*SOLUTIONS*/} + + {({ open }) => ( + <> + + Solutions + + + {Object.values(solutionsItems) + .flat() + .map((item) => ( + + ))} + + + )} + + {/*RESOURCES*/} {({ open }) => ( <> diff --git a/nx-dev/ui-common/src/lib/headers/menu-items.ts b/nx-dev/ui-common/src/lib/headers/menu-items.ts index 14b895fca67de..ad250988428ab 100644 --- a/nx-dev/ui-common/src/lib/headers/menu-items.ts +++ b/nx-dev/ui-common/src/lib/headers/menu-items.ts @@ -19,6 +19,9 @@ import { LifebuoyIcon, BookOpenIcon, ShieldCheckIcon, + ServerStackIcon, + ArrowTrendingUpIcon, + CommandLineIcon, } from '@heroicons/react/24/outline'; import { FC, SVGProps } from 'react'; import { DiscordIcon } from '../discord-icon'; @@ -233,6 +236,44 @@ export const eventItems: MenuItem[] = [ }, ]; +export const solutionsItems: MenuItem[] = [ + { + name: 'Developers', + description: + 'Accelerate your CI with Nx: smart cache sharing, flaky-test auto‑retries, parallel runs & dynamic agents.', + href: '/solutions/engineering', + icon: CommandLineIcon, + isNew: false, + isHighlight: false, + }, + { + name: 'Engineering Managers', + description: + 'Boost efficiency with powerful monorepos and intelligent CI. Build, test, and deploy faster, freeing teams to innovate.', + href: '/solutions/management', + icon: BoltIcon, + isNew: false, + isHighlight: false, + }, + { + name: 'Platform & DevOps Teams', + description: + 'Get dependable, out-of-the-box CI that scales effortlessly. Cut costs and boost speed with smart caching, distribution, and enhanced security.', + icon: ServerStackIcon, + href: '/solutions/platform', + isNew: false, + isHighlight: false, + }, + { + name: 'CTOs & VPs of Engineering', + description: + 'Supercharge engineering ROI with faster delivery, lower CI costs, and fewer risks. Scale safely and future-proof your stack.', + icon: ArrowTrendingUpIcon, + href: '/solutions/leadership', + isNew: false, + isHighlight: false, + }, +]; export const companyItems: MenuItem[] = [ { name: 'About Us', @@ -261,9 +302,9 @@ export const companyItems: MenuItem[] = [ ]; export const enterpriseItems: MenuItem[] = [ { - name: 'Solutions', + name: 'Overview', description: - "Accelerate your organization's journey to tighter collaboration, better developer experience, and speed.", + "Accelerate your organization's journey to tighter collaboration, better developer experience, and speed…lots of speed.", href: '/enterprise', icon: BuildingOfficeIcon, isNew: false, diff --git a/nx-dev/ui-common/src/lib/headers/mobile-menu-item.tsx b/nx-dev/ui-common/src/lib/headers/mobile-menu-item.tsx index f64b2c1c88002..bdc13f0ae6656 100644 --- a/nx-dev/ui-common/src/lib/headers/mobile-menu-item.tsx +++ b/nx-dev/ui-common/src/lib/headers/mobile-menu-item.tsx @@ -1,4 +1,4 @@ -import { ElementType } from 'react'; +import type { ElementType, ReactElement } from 'react'; import type { MenuItem } from './menu-items'; import cx from 'classnames'; import Link from 'next/link'; @@ -12,21 +12,21 @@ export function MobileMenuItem({ as?: ElementType; className?: string; item: MenuItem; -}): JSX.Element { +}): ReactElement { const hasExternalLink = item.href.startsWith('http') || item.href.startsWith('//'); const Tag = as; return ( {item.icon ? ( -