diff --git a/docs/nx-cloud/concepts/cache-security.md b/docs/nx-cloud/concepts/cache-security.md
index 0469f9c9bd..2a2367132b 100644
--- a/docs/nx-cloud/concepts/cache-security.md
+++ b/docs/nx-cloud/concepts/cache-security.md
@@ -48,8 +48,8 @@ Nx Cloud guarantees your cache entries will remain immutable - once they've been
### Use An On-Premise Version of Nx Cloud If Needed
-If you need to have all cache artifacts on servers that you control, there is an on-premise version of Nx Cloud that you can use as part of the [Enterprise plan](https://nx.app/enterprise).
+If you need to have all cache artifacts on servers that you control, there is an on-premise version of Nx Cloud that you can use as part of the [Enterprise plan](/enterprise).
## Security Decisions
-In any security discussion, there is a trade off between convenience and security. It could be that some of these threats do not apply to your organization. If that is the case you could relax some of the security precautions and gain the performance benefits of more task results being stored in the remote cache. Every organization is different and Nx can be adapted to best meet your needs without opening up vulnerabilities. If you would Nx team members to help your organization fine tune your set up, [talk to us about Nx Enterprise](https://nx.app/enterprise).
+In any security discussion, there is a trade off between convenience and security. It could be that some of these threats do not apply to your organization. If that is the case you could relax some of the security precautions and gain the performance benefits of more task results being stored in the remote cache. Every organization is different and Nx can be adapted to best meet your needs without opening up vulnerabilities. If you would Nx team members to help your organization fine tune your set up, [talk to us about Nx Enterprise](/enterprise).
diff --git a/docs/nx-cloud/concepts/parallelization-distribution.md b/docs/nx-cloud/concepts/parallelization-distribution.md
index 71add1b446..dd421d523c 100644
--- a/docs/nx-cloud/concepts/parallelization-distribution.md
+++ b/docs/nx-cloud/concepts/parallelization-distribution.md
@@ -100,4 +100,4 @@ In the same way that Nx efficiently assigns tasks to parallel processes on a sin
If your repo is starting to grow large enough that CI times are suffering, or if your parallelization strategy is growing too complex to manage effectively, try [setting up Nx Agents](/ci/features/distribute-task-execution). You can [generate a simple workflow](/nx-api/workspace/generators/ci-workflow) for common CI providers with a `nx g ci-workflow` or follow one of the [CI setup recipes](/ci/recipes/set-up).
-Organizations that want extra help setting up Nx Cloud or getting the most out of Nx can [sign up for Nx Enterprise](https://nx.app/enterprise/). This package comes with extra support from the Nx team and the option to host Nx Cloud on your own servers.
+Organizations that want extra help setting up Nx Cloud or getting the most out of Nx can [sign up for Nx Enterprise](/enterprise). This package comes with extra support from the Nx team and the option to host Nx Cloud on your own servers.
diff --git a/docs/nx-cloud/enterprise/dte/azure-dte.md b/docs/nx-cloud/enterprise/dte/azure-dte.md
index f4d7955fd0..14be65d2f8 100644
--- a/docs/nx-cloud/enterprise/dte/azure-dte.md
+++ b/docs/nx-cloud/enterprise/dte/azure-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on Azure Pipelines
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Run Custom Agents on Azure Pipelines
diff --git a/docs/nx-cloud/enterprise/dte/bitbucket-dte.md b/docs/nx-cloud/enterprise/dte/bitbucket-dte.md
index a3ace765b4..1c558b2451 100644
--- a/docs/nx-cloud/enterprise/dte/bitbucket-dte.md
+++ b/docs/nx-cloud/enterprise/dte/bitbucket-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on Bitbucket Pipelines
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Run Custom Agents on Bitbucket Pipelines
diff --git a/docs/nx-cloud/enterprise/dte/circle-ci-dte.md b/docs/nx-cloud/enterprise/dte/circle-ci-dte.md
index c843835117..46e229bf47 100644
--- a/docs/nx-cloud/enterprise/dte/circle-ci-dte.md
+++ b/docs/nx-cloud/enterprise/dte/circle-ci-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on Circle CI
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Run Custom Agents on Circle CI
diff --git a/docs/nx-cloud/enterprise/dte/github-dte.md b/docs/nx-cloud/enterprise/dte/github-dte.md
index 00f4c7d678..79810a7856 100644
--- a/docs/nx-cloud/enterprise/dte/github-dte.md
+++ b/docs/nx-cloud/enterprise/dte/github-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on Github Actions
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Run Custom Agents on GitHub
diff --git a/docs/nx-cloud/enterprise/dte/gitlab-dte.md b/docs/nx-cloud/enterprise/dte/gitlab-dte.md
index 7589cb23d0..4fa83d1a29 100644
--- a/docs/nx-cloud/enterprise/dte/gitlab-dte.md
+++ b/docs/nx-cloud/enterprise/dte/gitlab-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on GitLab
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Run Custom Agents on GitLab
diff --git a/docs/nx-cloud/enterprise/dte/jenkins-dte.md b/docs/nx-cloud/enterprise/dte/jenkins-dte.md
index ffe587aa92..3ce43132eb 100644
--- a/docs/nx-cloud/enterprise/dte/jenkins-dte.md
+++ b/docs/nx-cloud/enterprise/dte/jenkins-dte.md
@@ -1,6 +1,6 @@
# Custom Distributed Task Execution on Jenkins
-Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](https://nx.app/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
+Using [Nx Agents](/ci/features/distribute-task-execution) is the easiest way to distribute task execution, but it your organization may not be able to use hosted Nx Agents. With an [enterprise license](/enterprise), you can set up distributed task execution on your own CI provider using the recipe below.
## Distribute Tasks Across Custom Agents on Jenkins
diff --git a/docs/nx-cloud/features/nx-enterprise-on-prem.md b/docs/nx-cloud/features/nx-enterprise-on-prem.md
index 32cc76983b..c6798bfda4 100644
--- a/docs/nx-cloud/features/nx-enterprise-on-prem.md
+++ b/docs/nx-cloud/features/nx-enterprise-on-prem.md
@@ -2,7 +2,7 @@
We offer multiple ways of running Nx Cloud for our Enterprise customers. The below options are listed in recommended order, from easiest to most complex in terms of set-up and maintenance for your team. Please carefully consider your organization's requirements and level of infrastructure expertise before deciding on a deployment option.
-{% call-to-action title="Get in Touch" icon="nxcloud" description="Get the package that best fits your needs" url="https://nx.app/enterprise?utm_source=nx.dev" /%}
+{% call-to-action title="Get in Touch" icon="nxcloud" description="Get the package that best fits your needs" url="/enterprise" /%}
## Managed Setup
diff --git a/docs/nx-cloud/intro/ci-with-nx.md b/docs/nx-cloud/intro/ci-with-nx.md
index d2a750f6fd..80c5f3e929 100644
--- a/docs/nx-cloud/intro/ci-with-nx.md
+++ b/docs/nx-cloud/intro/ci-with-nx.md
@@ -55,7 +55,7 @@ npx nx g ci-workflow
Connect on our channels and with the Nx Community to ask questions, get help and keep up to date with the latest news.
-- Reach out for [Enterprise Support](https://nx.app/enterprise)
+- Reach out for [Enterprise Support](/enterprise)
- Join our [Discord Community](https://go.nx.dev/community)
- Subscribe to our [Youtube Channel](https://www.youtube.com/@nxdevtools)
- Follow us on [Twitter](https://twitter.com/nxdevtools)
diff --git a/nx-dev/nx-dev/pages/enterprise.tsx b/nx-dev/nx-dev/pages/enterprise.tsx
new file mode 100644
index 0000000000..f4fe423d69
--- /dev/null
+++ b/nx-dev/nx-dev/pages/enterprise.tsx
@@ -0,0 +1,75 @@
+import { useRouter } from 'next/router';
+import { NextSeo } from 'next-seo';
+import { DefaultLayout } from '@nx/nx-dev/ui-common';
+import {
+ CallToAction,
+ DownloadEbook,
+ EnterpriseAddons,
+ Hero,
+ MetricsAndCustomers,
+ ScaleYourPeople,
+ Security,
+ TrustedBy,
+ SolveYourCi,
+} from '@nx/nx-dev/ui-enterprise';
+
+export function Enterprise(): JSX.Element {
+ const router = useRouter();
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+export default Enterprise;
diff --git a/nx-dev/nx-dev/public/images/enterprise/graphs.jpg b/nx-dev/nx-dev/public/images/enterprise/graphs.jpg
new file mode 100644
index 0000000000..302291d130
Binary files /dev/null and b/nx-dev/nx-dev/public/images/enterprise/graphs.jpg differ
diff --git a/nx-dev/nx-dev/public/images/white-paper-ebook.avif b/nx-dev/nx-dev/public/images/white-paper-ebook.avif
new file mode 100644
index 0000000000..02869c2018
Binary files /dev/null and b/nx-dev/nx-dev/public/images/white-paper-ebook.avif differ
diff --git a/nx-dev/nx-dev/tailwind.config.js b/nx-dev/nx-dev/tailwind.config.js
index d64ea4667c..2599ad4a2b 100644
--- a/nx-dev/nx-dev/tailwind.config.js
+++ b/nx-dev/nx-dev/tailwind.config.js
@@ -60,7 +60,6 @@ module.exports = {
require('@tailwindcss/aspect-ratio'),
require('@tailwindcss/typography'),
require('@tailwindcss/forms'),
- require('@tailwindcss/line-clamp'),
FlipAnimation,
],
};
diff --git a/nx-dev/ui-common/src/index.ts b/nx-dev/ui-common/src/index.ts
index 1b28c1eca7..3fbb8dc66b 100644
--- a/nx-dev/ui-common/src/index.ts
+++ b/nx-dev/ui-common/src/index.ts
@@ -4,9 +4,12 @@ export * from './lib/breadcrumbs';
export * from './lib/button';
export * from './lib/champion-card';
export * from './lib/champion-perks';
+export * from './lib/default-layout';
export * from './lib/headers/header';
export * from './lib/flip-card';
+export * from './lib/nx-agents-icon';
export * from './lib/nx-cloud-icon';
+export * from './lib/nx-replay-icon';
export * from './lib/footer';
export * from './lib/sidebar-container';
export * from './lib/sidebar';
diff --git a/nx-dev/ui-common/src/lib/default-layout.tsx b/nx-dev/ui-common/src/lib/default-layout.tsx
new file mode 100644
index 0000000000..0c8d1f0088
--- /dev/null
+++ b/nx-dev/ui-common/src/lib/default-layout.tsx
@@ -0,0 +1,27 @@
+import { Footer } from './footer';
+import { Header } from './headers/header';
+import { PropsWithChildren } from 'react';
+
+export function DefaultLayout({ children }: PropsWithChildren): JSX.Element {
+ return (
+
+ );
+}
diff --git a/nx-dev/ui-common/src/lib/footer.tsx b/nx-dev/ui-common/src/lib/footer.tsx
index 832292c167..e1df2e01f7 100644
--- a/nx-dev/ui-common/src/lib/footer.tsx
+++ b/nx-dev/ui-common/src/lib/footer.tsx
@@ -5,6 +5,7 @@ import Link from 'next/link';
export function Footer(): JSX.Element {
const navigation = {
solutions: [
+ { name: 'Nx Enterprise', href: '/enterprise' },
{ name: 'Nx', href: 'https://nx.dev' },
{ name: 'Nx Cloud', href: 'https://nx.app/?utm_source=nx.dev' },
],
@@ -155,7 +156,7 @@ export function Footer(): JSX.Element {
-
+
+
{/*DESKTOP*/}
{/*PRIMARY NAVIGATION*/}
@@ -156,14 +156,14 @@ export function Header(): JSX.Element {
Documentation
Blog
@@ -171,7 +171,7 @@ export function Header(): JSX.Element {
href="https://nx.app/pricing"
title="Nx Cloud"
target="_blank"
- className="hidden gap-2 px-3 py-2 font-medium leading-tight hover:text-blue-500 dark:text-slate-200 dark:hover:text-sky-500 md:inline-flex"
+ className="hidden gap-2 px-3 py-2 font-medium leading-tight hover:text-blue-500 md:inline-flex dark:text-slate-200 dark:hover:text-sky-500"
>
CI Pricing
@@ -225,7 +225,7 @@ export function Header(): JSX.Element {
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 9cb6b72799..709b7ee4bc 100644
--- a/nx-dev/ui-common/src/lib/headers/menu-items.ts
+++ b/nx-dev/ui-common/src/lib/headers/menu-items.ts
@@ -110,7 +110,7 @@ export const plans: MenuItem[] = [
name: 'Nx Enterprise',
description:
'The ultimate Nx & Nx Cloud toolchain, tailored to your needs.',
- href: 'https://nx.app/enterprise',
+ href: '/enterprise',
icon: null,
isNew: false,
isHighlight: false,
diff --git a/nx-dev/ui-common/src/lib/sidebar.tsx b/nx-dev/ui-common/src/lib/sidebar.tsx
index 181da47f3f..abf31b7754 100644
--- a/nx-dev/ui-common/src/lib/sidebar.tsx
+++ b/nx-dev/ui-common/src/lib/sidebar.tsx
@@ -92,7 +92,7 @@ function SidebarSectionItems({ item }: { item: MenuItem }): JSX.Element {
data-testid={`section-h5:${item.id}`}
className={cx(
'flex py-2',
- 'text-sm font-semibold uppercase tracking-wide text-slate-800 dark:text-slate-200 lg:text-xs',
+ 'text-sm font-semibold uppercase tracking-wide text-slate-800 lg:text-xs dark:text-slate-200',
item.disableCollapsible ? 'cursor-text' : 'cursor-pointer'
)}
onClick={handleCollapseToggle}
@@ -193,12 +193,12 @@ export function SidebarMobile({
{ name: 'Launch Nx', href: '/launch-nx', current: false },
{
name: 'Contact',
- href: 'https://nx.app/enterprise?utm_source=nx.dev&utm_medium=header-menu',
+ href: '/contact',
current: false,
},
{
name: 'Go to app',
- href: 'https://nx.app/?utm_source=nx.dev&utm_medium=header-menu',
+ href: 'https://cloud.nx.app',
current: false,
},
],
diff --git a/nx-dev/ui-contact/src/lib/talk-to-our-sales-team.tsx b/nx-dev/ui-contact/src/lib/talk-to-our-sales-team.tsx
index abe9e589e7..566e0a5373 100644
--- a/nx-dev/ui-contact/src/lib/talk-to-our-sales-team.tsx
+++ b/nx-dev/ui-contact/src/lib/talk-to-our-sales-team.tsx
@@ -23,6 +23,7 @@ export function TalkToOurSalesTeam(): JSX.Element {
- Cisco
-
+ Caterpillar
+
diff --git a/nx-dev/ui-enterprise/.babelrc b/nx-dev/ui-enterprise/.babelrc
new file mode 100644
index 0000000000..1ea870ead4
--- /dev/null
+++ b/nx-dev/ui-enterprise/.babelrc
@@ -0,0 +1,12 @@
+{
+ "presets": [
+ [
+ "@nx/react/babel",
+ {
+ "runtime": "automatic",
+ "useBuiltIns": "usage"
+ }
+ ]
+ ],
+ "plugins": []
+}
diff --git a/nx-dev/ui-enterprise/.eslintrc.json b/nx-dev/ui-enterprise/.eslintrc.json
new file mode 100644
index 0000000000..a39ac5d057
--- /dev/null
+++ b/nx-dev/ui-enterprise/.eslintrc.json
@@ -0,0 +1,18 @@
+{
+ "extends": ["plugin:@nx/react", "../../.eslintrc.json"],
+ "ignorePatterns": ["!**/*"],
+ "overrides": [
+ {
+ "files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.ts", "*.tsx"],
+ "rules": {}
+ },
+ {
+ "files": ["*.js", "*.jsx"],
+ "rules": {}
+ }
+ ]
+}
diff --git a/nx-dev/ui-enterprise/README.md b/nx-dev/ui-enterprise/README.md
new file mode 100644
index 0000000000..7e8b2c6d8f
--- /dev/null
+++ b/nx-dev/ui-enterprise/README.md
@@ -0,0 +1,7 @@
+# nx-dev-ui-enterprise
+
+This library was generated with [Nx](https://nx.dev).
+
+## Running unit tests
+
+Run `nx test nx-dev-ui-enterprise` to execute the unit tests via [Jest](https://jestjs.io).
diff --git a/nx-dev/ui-enterprise/jest.config.ts b/nx-dev/ui-enterprise/jest.config.ts
new file mode 100644
index 0000000000..3781add29b
--- /dev/null
+++ b/nx-dev/ui-enterprise/jest.config.ts
@@ -0,0 +1,10 @@
+/* eslint-disable */
+export default {
+ displayName: 'nx-dev-ui-enterprise',
+ transform: {
+ '^.+\\.[tj]sx?$': 'babel-jest',
+ },
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
+ coverageDirectory: '../../coverage/nx-dev/ui-enterprise',
+ preset: '../../jest.preset.js',
+};
diff --git a/nx-dev/ui-enterprise/project.json b/nx-dev/ui-enterprise/project.json
new file mode 100644
index 0000000000..46638cd026
--- /dev/null
+++ b/nx-dev/ui-enterprise/project.json
@@ -0,0 +1,11 @@
+{
+ "name": "nx-dev-ui-enterprise",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "nx-dev/ui-enterprise/src",
+ "projectType": "library",
+ "tags": ["scope:nx-dev", "type:ui"],
+ "targets": {
+ "lint": {},
+ "test": {}
+ }
+}
diff --git a/nx-dev/ui-enterprise/src/index.ts b/nx-dev/ui-enterprise/src/index.ts
new file mode 100644
index 0000000000..b9a6c7abff
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/index.ts
@@ -0,0 +1,10 @@
+export * from './lib/call-to-action';
+export * from './lib/download-case-study';
+export * from './lib/download-ebook';
+export * from './lib/enterprise-addons';
+export * from './lib/hero';
+export * from './lib/metrics-and-customers';
+export * from './lib/scale-your-people';
+export * from './lib/security';
+export * from './lib/trusted-by';
+export * from './lib/solve-your-ci';
diff --git a/nx-dev/ui-enterprise/src/lib/bento-grid.tsx b/nx-dev/ui-enterprise/src/lib/bento-grid.tsx
new file mode 100644
index 0000000000..f1a529fdd9
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/bento-grid.tsx
@@ -0,0 +1,77 @@
+import Link from 'next/link';
+import { ReactNode } from 'react';
+import { cx } from '@nx/nx-dev/ui-primitives';
+
+export const BentoGrid = ({
+ className,
+ children,
+}: {
+ className?: string;
+ children?: ReactNode;
+}) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export const BentoGridItem = ({
+ className,
+ title = null,
+ description = null,
+ header,
+ url = null,
+ icon,
+}: {
+ className?: string;
+ title?: string | ReactNode | null;
+ description?: string | ReactNode | null;
+ header: ReactNode;
+ icon?: ReactNode;
+ url?: string | null;
+}) => {
+ return (
+
+ {header}
+
+
+
+ {icon} {title}
+
+ {description && (
+
+ {description}
+
+ )}
+
+ {url ? (
+
+
+
+
+ →
+
+
+ ) : null}
+
+
+ );
+};
diff --git a/nx-dev/ui-enterprise/src/lib/call-to-action.tsx b/nx-dev/ui-enterprise/src/lib/call-to-action.tsx
new file mode 100644
index 0000000000..f60699fba3
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/call-to-action.tsx
@@ -0,0 +1,84 @@
+import Link from 'next/link';
+
+export function CallToAction(): JSX.Element {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Your organization's transformation
+
+ starts now
+
+
+
+ Contact us
+
+ {/* */}
+ {/* Contact us{' '}*/}
+ {/* */}
+ {/* →*/}
+ {/* */}
+ {/**/}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/download-case-study.tsx b/nx-dev/ui-enterprise/src/lib/download-case-study.tsx
new file mode 100644
index 0000000000..1decb9eba0
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/download-case-study.tsx
@@ -0,0 +1,31 @@
+import { ButtonLink } from '@nx/nx-dev/ui-common';
+
+export function DownloadCaseStudy(): JSX.Element {
+ return (
+
+
+
+ Our case study
+
+
+
+
+ See how a $7B bank saved money, reduced CI times by 62% and
+ improved developer productivity.
+
+
+
+
+ Download (pdf)
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/download-ebook.tsx b/nx-dev/ui-enterprise/src/lib/download-ebook.tsx
new file mode 100644
index 0000000000..7db2dc1961
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/download-ebook.tsx
@@ -0,0 +1,63 @@
+import { ButtonLink } from '@nx/nx-dev/ui-common';
+
+export function DownloadEbook(): JSX.Element {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Download
+
+ Fast CI for monorepos
+
+
+ Discover how to scale your organization without feeling the pain of
+ CI, while having a better developer experience and fitting your
+ requirements.
+
+
+
+ Download {' '}
+ (pdf)
+
+
+
+
+
+
+ ebook
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx b/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx
new file mode 100644
index 0000000000..22f9bd1e79
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/enterprise-addons.tsx
@@ -0,0 +1,79 @@
+import { SectionHeading } from './temp/typography';
+import {
+ BoltIcon,
+ ChevronDoubleRightIcon,
+ UsersIcon,
+ WrenchIcon,
+} from '@heroicons/react/24/outline';
+
+export function EnterpriseAddons(): JSX.Element {
+ return (
+
+
+
+
+ Partner with the Nx team
+
+
+
+
+
+
+
+
+
+ Move fast, move together
+
+
+
+ We know Nx, you know your code. Together, we can build your
+ ultimate developer platform, tailored to your team.
+
+
+
+
+
+
+
+
+ No trial and error necessary
+
+
+
+ With the help of the developers of Nx, you'll use Nx and Nx
+ Cloud to its full potential, the first time. No matter how
+ long you've been using Nx, we'll find ways to make it more
+ powerful.
+
+
+
+
+
+
+
+
+ Migrate to Nx & Nx Cloud
+
+
+
+ Wherever your team is at in their Nx journey, our experts will
+ make it easy to move ahead and capture the full value of Nx
+ and Nx Cloud.
+
+
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/hero.tsx b/nx-dev/ui-enterprise/src/lib/hero.tsx
new file mode 100644
index 0000000000..433b0e4ab1
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/hero.tsx
@@ -0,0 +1,49 @@
+import { SectionHeading } from './temp/typography';
+import { ButtonLink } from '@nx/nx-dev/ui-common';
+import Link from 'next/link';
+
+export function Hero(): JSX.Element {
+ return (
+
+
+
+
+ Nx Enterprise
+
+
+ Accelerate your organization's journey to tighter collaboration,
+ better developer experience, and speed…lots of speed.
+
+
+
+ Contact sales
+
+
+ {/* */}
+ {/* Book a demo{' '}*/}
+ {/* */}
+ {/* →*/}
+ {/* */}
+ {/**/}
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/logos/7eleven.tsx b/nx-dev/ui-enterprise/src/lib/logos/7eleven.tsx
new file mode 100644
index 0000000000..6c75f8a8a5
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/7eleven.tsx
@@ -0,0 +1,38 @@
+import { FC, SVGProps } from 'react';
+
+export const SevenElevenIcon: FC> = (props) => (
+
+ 7eleven
+
+
+);
+
+export const SevenElevenColoredIcon: FC> = (props) => (
+
+ 7eleven
+
+
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/american-airlines.tsx b/nx-dev/ui-enterprise/src/lib/logos/american-airlines.tsx
new file mode 100644
index 0000000000..0b3accf872
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/american-airlines.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#0071CE` for a colored version.
+ */
+export const AmericanAirlinesIcon: FC> = (props) => (
+
+ American Airlines
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/aws-amplify.tsx b/nx-dev/ui-enterprise/src/lib/logos/aws-amplify.tsx
new file mode 100644
index 0000000000..a8d540cbd7
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/aws-amplify.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#FF9900` for a colored version.
+ */
+export const AwsAmplifyIcon: FC> = (props) => (
+
+ AWS Amplify
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/bill.tsx b/nx-dev/ui-enterprise/src/lib/logos/bill.tsx
new file mode 100644
index 0000000000..5972a7eb2e
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/bill.tsx
@@ -0,0 +1,34 @@
+import { FC, SVGProps } from 'react';
+
+export const BillIcon: FC> = (props) => (
+
+ bill
+
+
+);
+
+export const BillColoredIcon: FC> = (props) => (
+
+ bill
+
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/capital-one.tsx b/nx-dev/ui-enterprise/src/lib/logos/capital-one.tsx
new file mode 100644
index 0000000000..a8dea3a475
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/capital-one.tsx
@@ -0,0 +1,38 @@
+import { FC, SVGProps } from 'react';
+
+export const CapitalOneIcon: FC> = (props) => (
+
+ Capital One
+
+
+);
+
+export const CapitalOneColoredIcon: FC> = (props) => (
+
+ 7eleven
+
+
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/caterpillar.tsx b/nx-dev/ui-enterprise/src/lib/logos/caterpillar.tsx
new file mode 100644
index 0000000000..3272eb89e2
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/caterpillar.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#FFCD11` for a colored version.
+ */
+export const CaterpillarIcon: FC> = (props) => (
+
+ Caterpillar
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/cisco.tsx b/nx-dev/ui-enterprise/src/lib/logos/cisco.tsx
new file mode 100644
index 0000000000..00c076bfa9
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/cisco.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#1BA0D7` for a colored version.
+ */
+export const CiscoIcon: FC> = (props) => (
+
+ Cisco
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/fico.tsx b/nx-dev/ui-enterprise/src/lib/logos/fico.tsx
new file mode 100644
index 0000000000..38919e8bc5
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/fico.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#0A6DE6` for a colored version.
+ */
+export const FicoIcon: FC> = (props) => (
+
+ Fico
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/hilton.tsx b/nx-dev/ui-enterprise/src/lib/logos/hilton.tsx
new file mode 100644
index 0000000000..92e979babe
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/hilton.tsx
@@ -0,0 +1,14 @@
+import { FC, SVGProps } from 'react';
+
+export const HiltonIcon: FC> = (props) => (
+
+ Hilton
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/man.tsx b/nx-dev/ui-enterprise/src/lib/logos/man.tsx
new file mode 100644
index 0000000000..722c594f24
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/man.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#E40045` for a colored version.
+ */
+export const ManIcon: FC> = (props) => (
+
+ MAN
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/react-query.tsx b/nx-dev/ui-enterprise/src/lib/logos/react-query.tsx
new file mode 100644
index 0000000000..a551e8c557
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/react-query.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#FF4154` for a colored version.
+ */
+export const ReactQueryIcon: FC> = (props) => (
+
+ React Query
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/redwood-js.tsx b/nx-dev/ui-enterprise/src/lib/logos/redwood-js.tsx
new file mode 100644
index 0000000000..10bd42d978
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/redwood-js.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#BF4722` for a colored version.
+ */
+export const RedwoodJsIcon: FC> = (props) => (
+
+ RedwoodJS
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/royal-bank-of-canada.tsx b/nx-dev/ui-enterprise/src/lib/logos/royal-bank-of-canada.tsx
new file mode 100644
index 0000000000..9042b49e62
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/royal-bank-of-canada.tsx
@@ -0,0 +1,52 @@
+import { FC, SVGProps } from 'react';
+
+export const RoyalBankOfCanadaIcon: FC> = (props) => (
+
+ Royal Bank of Canada
+
+
+);
+
+export const RoyalBankOfCanadaColoredIcon: FC> = (
+ props
+) => (
+
+ Royal Bank of Canada
+
+
+ {/* */}
+
+
+
+
+
+
+
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/shopify.tsx b/nx-dev/ui-enterprise/src/lib/logos/shopify.tsx
new file mode 100644
index 0000000000..50e7ff84f1
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/shopify.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#7AB55C` for a colored version.
+ */
+export const ShopifyIcon: FC> = (props) => (
+
+ Shopify
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/storybook.tsx b/nx-dev/ui-enterprise/src/lib/logos/storybook.tsx
new file mode 100644
index 0000000000..7537caa47e
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/storybook.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#FF4785` for a colored version.
+ */
+export const StorybookIcon: FC> = (props) => (
+
+ Storybook
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/vmware.tsx b/nx-dev/ui-enterprise/src/lib/logos/vmware.tsx
new file mode 100644
index 0000000000..51dc77679c
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/vmware.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#607078` for a colored version.
+ */
+export const VmwareIcon: FC> = (props) => (
+
+ VMware
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/logos/wallmart.tsx b/nx-dev/ui-enterprise/src/lib/logos/wallmart.tsx
new file mode 100644
index 0000000000..bd51fb6f3a
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/logos/wallmart.tsx
@@ -0,0 +1,17 @@
+import { FC, SVGProps } from 'react';
+
+/**
+ * Use `#0078D2` for a colored version.
+ */
+export const WalmartIcon: FC> = (props) => (
+
+ Walmart
+
+
+);
diff --git a/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx b/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx
new file mode 100644
index 0000000000..70ccb23c7d
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/metrics-and-customers.tsx
@@ -0,0 +1,180 @@
+import { motion, Variants } from 'framer-motion';
+import { DownloadCaseStudy } from './download-case-study';
+import { RoyalBankOfCanadaColoredIcon } from './logos/royal-bank-of-canada';
+import { ManIcon } from './logos/man';
+import { ShopifyIcon } from './logos/shopify';
+import { CapitalOneIcon } from './logos/capital-one';
+import { VmwareIcon } from './logos/vmware';
+import { StorybookIcon } from './logos/storybook';
+import { RedwoodJsIcon } from './logos/redwood-js';
+import { CaterpillarIcon } from './logos/caterpillar';
+import { SevenElevenColoredIcon } from './logos/7eleven';
+import { BillColoredIcon } from './logos/bill';
+import { FicoIcon } from './logos/fico';
+import { HiltonIcon } from './logos/hilton';
+import { CiscoIcon } from './logos/cisco';
+
+export function MetricsAndCustomers(): JSX.Element {
+ const downloadElement: Variants = {
+ hidden: {
+ opacity: 0,
+ translateY: 90,
+ },
+ visible: {
+ opacity: 1,
+ translateY: 0,
+ transition: {
+ duration: 1,
+ ease: 'easeInOut',
+ type: 'tween',
+ },
+ },
+ };
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Speed
+
+
+ 30-70% Faster
+
+
+
+
+
Infra Cost
+
+
+ 40-75% Cheaper
+
+
+
+
+
Compute
+
+
+ 30-60% Less
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/scale-ci-and-teams.tsx b/nx-dev/ui-enterprise/src/lib/scale-ci-and-teams.tsx
new file mode 100644
index 0000000000..41bb8fc30e
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/scale-ci-and-teams.tsx
@@ -0,0 +1,62 @@
+import { BoltIcon, UserGroupIcon } from '@heroicons/react/24/outline';
+import {
+ NxAgentsIcon,
+ NxReplayIcon,
+ SectionHeading,
+} from '@nx/nx-dev/ui-common';
+
+const features = [
+ {
+ name: 'Cache with Nx Replay',
+ description:
+ 'Quis tellus eget adipiscing convallis sit sit eget aliquet quis. Suspendisse eget egestas a elementum pulvinar et feugiat blandit at. In mi viverra elit nunc.',
+ icon: NxReplayIcon,
+ },
+ {
+ name: 'Distribution with Nx Agents',
+ description:
+ 'Quis tellus eget adipiscing convallis sit sit eget aliquet quis. Suspendisse eget egestas a elementum pulvinar et feugiat blandit at. In mi viverra elit nunc.',
+ icon: NxAgentsIcon,
+ },
+ {
+ name: 'Split tasks with Atomizer',
+ description:
+ 'Quis tellus eget adipiscing convallis sit sit eget aliquet quis. Suspendisse eget egestas a elementum pulvinar et feugiat blandit at. In mi viverra elit nunc.',
+ icon: BoltIcon,
+ },
+];
+
+export function ScaleCiAndTeams(): JSX.Element {
+ return (
+
+
+
+ Scale CI & teams
+
+
+ Quis tellus eget adipiscing convallis sit sit eget aliquet quis.
+ Suspendisse eget egestas a elementum pulvinar et feugiat blandit at.
+ In mi viverra elit nunc.
+
+
+
+
+ {features.map((feature) => (
+
+
+
+ {feature.name}
+
+
+ {feature.description}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx b/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx
new file mode 100644
index 0000000000..235e6fb3ff
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/scale-your-people.tsx
@@ -0,0 +1,278 @@
+import {
+ BuildingOffice2Icon,
+ Cog6ToothIcon,
+ CubeTransparentIcon,
+ IdentificationIcon,
+ PhotoIcon,
+ SquaresPlusIcon,
+ UserGroupIcon,
+} from '@heroicons/react/24/outline';
+import { SectionHeading } from './temp/typography';
+
+export function ScaleYourPeople(): JSX.Element {
+ return (
+
+
+
+
+ Scale your people
+
+
+
+ Build big things with the efficiency of a small team by increasing
+ collaboration and developer mobility, reducing wait time and
+ duplication, and establishing clear ownership.
+
+
+
+
+
+ Visibility
+
+
+
+
+
+
+
+
+
+
+
+ Ownership
+
+
+
+
+
+
+
+
+
+
+
+ Control
+
+
+
+
+
+
+
+
+
+
+
+ Automation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ coming soon
+
+
+
+
+
+
+
+
+ Monorepo, polyrepo, multi-monorepo?
+
+
+ Whatever you’re working with, Nx Enterprise will give you the
+ visibility you need to understand what they have in common,
+ how they relate, and how they differ.
+
+
+
+
+
+
+
+
+
+ Monorepo experience in a polyrepo environment
+
+
+ Nx Enterprise will support optional monorepo-like constraints
+ to be applied across Nx Workspace boundaries in a seamless and
+ flexible way. Move fast with confidence.
+
+
+
+
+
+
+
+
+
+ Automation over coordination
+
+
+ Testing and cross-repo coordination can be left to Nx
+ Enterprise tooling instead of manual human intervention to
+ test and enforce cross-repo dependencies & constraints.
+
+
+
+
+
+ {/*
*/}
+ {/*
*/}
+ {/* */}
+ {/* */}
+ {/*
*/}
+ {/*
*/}
+ {/* Crystal clear organizations*/}
+ {/* */}
+ {/*
*/}
+ {/* Regardless of how many Nx Workspaces your company has, Nx Enterprise*/}
+ {/* can give you the visibility you need to understand what they have in*/}
+ {/* common, how they relate, and how they differ. Developers are no*/}
+ {/* longer relegated to contributing to one Nx Workspace.*/}
+ {/*
*/}
+ {/*
*/}
+ {/*
*/}
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/security.tsx b/nx-dev/ui-enterprise/src/lib/security.tsx
new file mode 100644
index 0000000000..407d692d01
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/security.tsx
@@ -0,0 +1,112 @@
+import { SectionHeading } from './temp/typography';
+
+export function Security(): JSX.Element {
+ return (
+
+
+
+
+
+ Security
+
+
+ Nx Cloud is certified to the industry standards, is constantly
+ monitored and{' '}
+
+ issue security Trust Reports powered by Vanta
+
+ .
+
+
+
+
+
+
+
+
+ SSAE18/SOC 2 type 1 and type 2 reports
+
+
+
+ European Union
+
+
+ GDPR compliance
+
+
+
+
+
+
+ Dedicated infrastructure
+
+
+ We can support you to self-host Nx Cloud within your own
+ infrastructure or, depending on your needs, run Nx Cloud on
+ managed hosts within our cloud.
+
+
+
+
+ Application security
+
+
+ We consistently review our security policies and collaborate
+ with third parties for penetration testing to promptly identify
+ and mitigate potential risks.
+
+
+
+
+ US & EU instances available
+
+
+ We support region specific hosting of Nx Cloud in the event IT
+ security or data protection policies restrict international
+ transfers.
+
+
+
+
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/solve-your-ci.tsx b/nx-dev/ui-enterprise/src/lib/solve-your-ci.tsx
new file mode 100644
index 0000000000..1240510cc9
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/solve-your-ci.tsx
@@ -0,0 +1,825 @@
+import {
+ ArrowsRightLeftIcon,
+ BanknotesIcon,
+ ChartBarSquareIcon,
+ ChevronRightIcon,
+ ClipboardDocumentIcon,
+ CloudArrowDownIcon,
+ CursorArrowRaysIcon,
+ LightBulbIcon,
+ SparklesIcon,
+ Square3Stack3DIcon,
+} from '@heroicons/react/24/outline';
+import { animate, motion, useMotionValue, useTransform } from 'framer-motion';
+import { useEffect } from 'react';
+import { SectionHeading } from './temp/typography';
+import { BentoGrid, BentoGridItem } from './bento-grid';
+import { cx } from '@nx/nx-dev/ui-primitives';
+
+export function SolveYourCi(): JSX.Element {
+ return (
+
+
+
+
+ Solve your CI
+
+
+
+ Monorepos help you scale your people but they can also make CI a
+ challenge. Nx Enterprise solves it by providing efficient, fast and
+ reliable CI that can handle workflows of any size.
+
+ {/*FEATURES CONTAINER*/}
+
+ {items.map((item, i) => (
+ p:text-lg]', item.className)}
+ icon={item.icon}
+ url={item.url}
+ />
+ ))}
+
+
+ {/*TEXT*/}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Both faster and cheaper
+
+
+ Current CI providers aren’t made for monorepos. They’re
+ low-level and static in their configuration. The combination
+ of Nx Agents and Nx Replay lets you reuse computation from
+ other runs and utilizes the allocated VMs in the most optimal
+ way.
+
+
+
+
+
+
+
+
+
+ Solving E2E tests
+
+
+ Atomizer splits large e2e projects into fine-grained test
+ runs, enabling more efficient distribution and dramatically
+ reducing CI times. It also identifies flaky e2e tests at the
+ file level and re-runs those specific tests.
+
+
+
+
+
+
+
+
+
+ What, not how
+
+
+ Nx Enterprise simplifies CI configuration, emphasizing which
+ tasks to execute over how with no need to tweak your CI
+ scripts as your monorepo evolves. This simplified
+ configuration cuts down on CI maintenance and increases
+ stability.
+
+
+
+
+
+
+
+ );
+}
+
+const Caching = () => {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: {
+ opacity: 1,
+ },
+ };
+ const items = [
+ {
+ cache: 'remote',
+ target: 'build',
+ project: 'website',
+ },
+ {
+ cache: 'remote',
+ target: 'test',
+ project: 'express',
+ },
+ {
+ cache: 'remote',
+ target: 'build',
+ project: 'eslint',
+ },
+ {
+ cache: 'remote',
+ target: 'lint',
+ project: 'autoloan',
+ },
+ {
+ cache: 'remote',
+ target: 'test',
+ project: 'website',
+ },
+ {
+ cache: 'remote',
+ target: 'lint',
+ project: 'website',
+ },
+ {
+ cache: 'remote',
+ target: 'build-base',
+ project: 'express',
+ },
+ {
+ cache: 'remote',
+ target: 'build',
+ project: 'express',
+ },
+ {
+ cache: 'remote',
+ target: 'lint',
+ project: 'express',
+ },
+ {
+ cache: 'remote',
+ target: 'test',
+ project: 'autoloan',
+ },
+ ];
+ return (
+
+
+
+
+
+
+ tasks replayed instantly with cache
+
+
+ {items.map((i, idx) => (
+
+
+
+
+ {i.cache}
+
+
+
+ {i.project}:{i.target}
+
+
< 1s
+
+ ))}
+
+
+ );
+};
+
+const Atomizer = () => {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: {
+ opacity: 1,
+ },
+ };
+ const itemVariants = {
+ visible: (i: number) => ({
+ opacity: 1,
+ x: 0,
+ transition: {
+ delay: i * 0.2,
+ duration: 0.275,
+ ease: 'easeOut',
+ when: 'beforeChildren',
+ staggerChildren: 0.3,
+ },
+ }),
+ hidden: {
+ opacity: 0,
+ x: -100,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ };
+ const uiDialogsTests = ['e2e-ui-cdk:e2e', 'e2e-ui-layout:e2e'];
+ const loansTests = [
+ 'loans-front-store:e2e',
+ 'loans-loans:e2e',
+ 'loans-credit-card:e2e',
+ 'loans-workflows:e2e',
+ 'loans-mortgage:e2e',
+ 'loans-submission:e2e',
+ ];
+ const DefaultConnector = () => (
+ <>
+
+
+ >
+ );
+ const BottomConnector = () => (
+ <>
+
+
+ >
+ );
+
+ return (
+
+
+ Running
+
+ nx affected --targets=e2e
+
+
+
+
+
+
+
+ In progress
+
+
+
+
+ E2E {'>'} CI
+
+
+ {uiDialogsTests.map((i, idx) => (
+
+ {uiDialogsTests.length === idx + 1 ? (
+
+ ) : (
+
+ )}
+
+
+
{i}
+
+ ))}
+
+
+
+
+ miss
+
+
+
+ website:e2e
+
+
+ flaky
+
+
+ 1 retry
+
+
+
+
+
+
+
+ In progress
+
+
+
+
+ loans {'>'} e2e
+
+
+ {loansTests.map((i, idx) => (
+
+ {loansTests.length === idx + 1 ? (
+
+ ) : (
+
+ )}
+
+
+
{i}
+
+ ))}
+
+
+ );
+};
+
+const TaskDistribution = () => {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: {
+ opacity: 1,
+ },
+ };
+ const itemVariants = {
+ visible: (i: number) => ({
+ opacity: 1,
+ x: 0,
+ transition: {
+ delay: i * 0.2,
+ duration: 0.275,
+ ease: 'easeOut',
+ when: 'beforeChildren',
+ staggerChildren: 0.3,
+ },
+ }),
+ hidden: {
+ opacity: 0,
+ x: -100,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ };
+ const agent1Items = ['website:build-base', 'website:build'];
+ const agent2Items = ['docs:lint', 'express:test', 'website:lint'];
+ const agent3Items = ['graph-client:build', 'plugin:test'];
+ const nxReplayItems = [
+ 'graph-client:lint',
+ 'plugin:lint',
+ 'website:test',
+ 'vite:test',
+ 'vite:build',
+ ];
+
+ const notStartedTasks = ['js:build', 'js:lint'];
+ return (
+
+
+
+
+ Main Workflow
+
+
+
+ nx affected --target=build,lint,test
+
+
+
+ {notStartedTasks.map((i, idx) => (
+
+ {i}
+
+ ))}
+
+
+
+
+
+ Nx Agents
+
+
+
+
+
+
+ Agent 1
+
{agent1Items.length}
+
+
+
+ {agent1Items.map((i, idx) => (
+
+ {i}
+
+ ))}
+
+
+
+
+
+
+ Agent 2
+
{agent2Items.length}
+
+
+
+ {agent2Items.map((i, idx) => (
+
+ {i}
+
+ ))}
+
+
+
+
+
+
+ Agent 3
+
{agent3Items.length}
+
+
+
+ {agent3Items.map((i, idx) => (
+
+ {i}
+
+ ))}
+
+
+
+
+
+
+ Nx Replay
+
+
+ {nxReplayItems.map((i, idx) => (
+
+ {i}
+
+ ))}
+
+
+
+
+ );
+};
+
+const IncreasedVisibility = () => {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: {
+ opacity: 1,
+ },
+ };
+
+ return (
+
+
+ {/*STATUS*/}
+
+
+
+ Failed
+
+ with code: 1
+
+
+ {/*COMPARE & FLAKY*/}
+ {/*
+
+ Compare to similar tasks
+
+
+ Set as "not flaky"
+
+
*/}
+
+
+
+
+ Attempt 1
+
+
+ Attempt 2
+
+
+
+
+ Feb 23, 2024 08:57:49 - 08:57:54 (4s)
+
+
+
+
+ nx run nx-dev:build
+
+
+
+
+
+
+
+
+ {`nx run nx-dev:sitemap ✨ [next-sitemap]
+Loading next-sitemap config:file:///home/workflows/workspace/nx-dev/nx-dev/next-sitemap.config.js
+❌ [next-sitemap] Unable to find export-maker.
+ Make sure to build the project using "next build" command
+ node:internal/process/promises:289
+ triggerUncaughtException(err, true /* fromPromise */); ^
+ [Error:ENOENT: no such file or directory, stat '/home/workflows/workspace/dist/nx-dev/nx-dev/.next/export-marker.json']
+ errno: -2, code: 'ENOENT', syscall: 'stat', path: '/home/workflows/workspace/dist/nx-dev/nx-dev/.next/export-marker.json'
+Node.js v20.9.0 Warning: command "pnpm next-sitemap --config
+./nx-dev/nx-dev/next-sitemap.config.js" exited with non-zero status code`}
+
+
+
+
+ );
+};
+
+export function Counter({
+ value,
+ duration = 2,
+}: {
+ value: number;
+ duration?: number;
+}) {
+ const count = useMotionValue(0);
+ const rounded = useTransform(count, Math.round);
+
+ useEffect(() => {
+ const animation = animate(count, value, {
+ type: 'tween',
+ ease: 'easeOut',
+ duration,
+ });
+
+ return animation.stop;
+ }, []);
+
+ return {rounded} ;
+}
+
+const items = [
+ {
+ title: 'Nx Agents: seamless task distribution',
+ header: ,
+ className: 'md:col-span-2',
+ icon: ,
+ url: '/ci/features/distribute-task-execution',
+ },
+ {
+ title: 'Nx Replay: secure computation cache',
+ header: ,
+ className: 'md:col-span-1',
+ icon: ,
+ url: '/ci/features/remote-cache',
+ },
+ {
+ title: 'Increased visibility',
+ header: ,
+ className: 'md:col-span-1',
+ icon: ,
+ },
+ {
+ title: 'Atomizer: task splitting & flaky rerun',
+ description: null,
+ header: ,
+ className: 'md:col-span-2',
+ icon: ,
+ url: '/ci/features/split-e2e-tasks',
+ },
+];
diff --git a/nx-dev/ui-enterprise/src/lib/statistics.tsx b/nx-dev/ui-enterprise/src/lib/statistics.tsx
new file mode 100644
index 0000000000..05a921930a
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/statistics.tsx
@@ -0,0 +1,150 @@
+import { motion } from 'framer-motion';
+import { useEffect, useState } from 'react';
+import { SectionHeading } from './temp/typography';
+
+/**
+ * Calculate the total number of years worth of compute.
+ *
+ * @param {number} millis - The total number of seconds.
+ * @return {number} The total number of years.
+ */
+function getTotalYears(millis: number): number {
+ /**
+ * The number of millis in a year is approximately:
+ * 86 400 000 millis/day * 365.25 days/year ≈ 31 557 600 000 seconds/year.
+ */
+ const yearMillis = Number(31557600000);
+ return Math.round(millis / yearMillis);
+}
+
+/**
+ * Fetches the time saved from a remote API.
+ *
+ * @returns {Promise} A promise that resolves to an object containing the time saved data.
+ * @returns {Date} The date the time saved data was retrieved.
+ * @returns {number} The time saved in the last 7 days.
+ * @returns {number} The time saved in the last 30 days.
+ * @returns {number} The time's saved since the start.
+ */
+function fetchTimeSaved(): Promise<{
+ date: Date;
+ last7days: number;
+ last30days: number;
+ sinceStart: number;
+}> {
+ const apiUrl = 'https://cloud.nx.app/time-saved';
+
+ return fetch(apiUrl)
+ .then((response) => response.json())
+ .catch(() => ({
+ date: new Date(),
+ last7days: Math.round(Math.random() * 1000000000),
+ last30days: Math.round(Math.random() * 100000000000),
+ sinceStart: Math.round(Math.random() * 10000000000000),
+ }));
+}
+
+const stats = [
+ {
+ id: 1,
+ name: 'Developers using Nx',
+ value: 2,
+ suffix: 'M+',
+ },
+ {
+ id: 3,
+ name: 'Active workspaces',
+ value: '4k',
+ suffix: '+',
+ },
+ { id: 2, name: 'Compute time saved', value: 800, suffix: '+ years' },
+ { id: 4, name: 'Runs daily', value: 100, suffix: 'k+' },
+];
+
+export function Statistics(): JSX.Element {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: (i: number) => ({
+ opacity: 1,
+ transition: {
+ delay: i || 0,
+ },
+ }),
+ };
+ const itemVariants = {
+ visible: (i: number) => ({
+ opacity: 1,
+ y: 0,
+ transition: {
+ delay: i * 0.25,
+ duration: 0.65,
+ ease: 'easeOut',
+ when: 'beforeChildren',
+ staggerChildren: 0.3,
+ },
+ }),
+ hidden: {
+ opacity: 0,
+ y: 4,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ };
+ const [timeSaved, setTimeSaved] = useState(800);
+
+ useEffect(() => {
+ let ignore = false;
+ fetchTimeSaved().then((data) => {
+ if (!ignore) {
+ setTimeSaved(getTotalYears(data.sinceStart));
+ }
+ });
+ return () => {
+ ignore = true;
+ };
+ }, []);
+
+ return (
+
+
+
+ Trusted by startups and Fortune 500 companies
+
+ {/**/}
+ {/* Nx Cloud provides plans for open source projects, startups, and large*/}
+ {/* enterprises.*/}
+ {/* */}
+
+
+ {stats.map((stat, idx) => (
+
+
+ {stat.name}
+
+
+ {stat.name === 'Compute time saved' ? timeSaved : stat.value}
+ {stat.suffix}
+
+
+ ))}
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/temp/typography.tsx b/nx-dev/ui-enterprise/src/lib/temp/typography.tsx
new file mode 100644
index 0000000000..8006bca766
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/temp/typography.tsx
@@ -0,0 +1,59 @@
+import { cx } from '@nx/nx-dev/ui-primitives';
+import { ElementType, ReactNode } from 'react';
+
+type AllowedVariants = 'title' | 'display' | 'subtitle';
+
+type Headings = {
+ as: ElementType;
+ className?: string;
+ children: ReactNode | ReactNode[];
+ id?: string;
+ variant: AllowedVariants;
+};
+
+type Description = {
+ as: ElementType;
+ className?: string;
+ children: ReactNode | ReactNode[];
+ id?: string;
+};
+
+const variants: Record = {
+ title:
+ 'text-3xl font-medium tracking-tight text-slate-950 dark:text-white sm:text-5xl',
+ display:
+ 'text-4xl font-medium tracking-tight text-slate-950 dark:text-white sm:text-7xl',
+ subtitle: 'text-lg leading-8 text-slate-700 dark:text-slate-300 sm:text-2xl',
+};
+
+export function SectionHeading({
+ as = 'div',
+ children,
+ className,
+ variant,
+ ...rest
+}: Headings): JSX.Element {
+ const Tag = as;
+ return (
+
+ {children}
+
+ );
+}
+
+export function SectionDescription({
+ as = 'div',
+ children,
+ className,
+ ...rest
+}: Description): JSX.Element {
+ const Tag = as;
+ return (
+
+ {children}
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/src/lib/trusted-by.tsx b/nx-dev/ui-enterprise/src/lib/trusted-by.tsx
new file mode 100644
index 0000000000..da51aabca1
--- /dev/null
+++ b/nx-dev/ui-enterprise/src/lib/trusted-by.tsx
@@ -0,0 +1,220 @@
+import { AwsAmplifyIcon } from './logos/aws-amplify';
+import { RoyalBankOfCanadaColoredIcon } from './logos/royal-bank-of-canada';
+import { CiscoIcon } from './logos/cisco';
+import { ManIcon } from './logos/man';
+import { CapitalOneIcon } from './logos/capital-one';
+import { ShopifyIcon } from './logos/shopify';
+import { VmwareIcon } from './logos/vmware';
+import { StorybookIcon } from './logos/storybook';
+import { FicoIcon } from './logos/fico';
+import { CaterpillarIcon } from './logos/caterpillar';
+import { SectionHeading } from './temp/typography';
+import { motion } from 'framer-motion';
+import { AmericanAirlinesIcon } from './logos/american-airlines';
+import { BillColoredIcon } from './logos/bill';
+import { SevenElevenColoredIcon } from './logos/7eleven';
+import { HiltonIcon } from './logos/hilton';
+import { RedwoodJsIcon } from './logos/redwood-js';
+import { ReactQueryIcon } from './logos/react-query';
+
+export function TrustedBy(): JSX.Element {
+ const variants = {
+ hidden: {
+ opacity: 0,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ visible: (i: number) => ({
+ opacity: 1,
+ transition: {
+ delay: i || 0,
+ },
+ }),
+ };
+ const itemVariants = {
+ visible: (i: number) => ({
+ opacity: 1,
+ y: 0,
+ transition: {
+ delay: i * 0.25,
+ duration: 0.65,
+ ease: 'easeOut',
+ when: 'beforeChildren',
+ staggerChildren: 0.3,
+ },
+ }),
+ hidden: {
+ opacity: 0,
+ y: 4,
+ transition: {
+ when: 'afterChildren',
+ },
+ },
+ };
+
+ return (
+
+
+ {/*
*/}
+ {/* */}
+ {/* Trusted by startups and Fortune 500 companies*/}
+ {/* */}
+ {/*
*/}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/**/}
+ {/* */}
+ {/* */}
+
+
+
+ );
+}
diff --git a/nx-dev/ui-enterprise/tsconfig.json b/nx-dev/ui-enterprise/tsconfig.json
new file mode 100644
index 0000000000..4c089585ed
--- /dev/null
+++ b/nx-dev/ui-enterprise/tsconfig.json
@@ -0,0 +1,25 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "allowJs": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.lib.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ }
+ ]
+}
diff --git a/nx-dev/ui-enterprise/tsconfig.lib.json b/nx-dev/ui-enterprise/tsconfig.lib.json
new file mode 100644
index 0000000000..54f71b5019
--- /dev/null
+++ b/nx-dev/ui-enterprise/tsconfig.lib.json
@@ -0,0 +1,24 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "types": ["node"],
+ "lib": ["dom"]
+ },
+ "files": [
+ "../../node_modules/@nx/react/typings/cssmodule.d.ts",
+ "../../node_modules/@nx/react/typings/image.d.ts"
+ ],
+ "exclude": [
+ "**/*.spec.ts",
+ "**/*.test.ts",
+ "**/*.spec.tsx",
+ "**/*.test.tsx",
+ "**/*.spec.js",
+ "**/*.test.js",
+ "**/*.spec.jsx",
+ "**/*.test.jsx",
+ "jest.config.ts"
+ ],
+ "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"]
+}
diff --git a/nx-dev/ui-enterprise/tsconfig.spec.json b/nx-dev/ui-enterprise/tsconfig.spec.json
new file mode 100644
index 0000000000..a85d573fcf
--- /dev/null
+++ b/nx-dev/ui-enterprise/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc",
+ "module": "commonjs",
+ "types": ["jest", "node"]
+ },
+ "include": [
+ "**/*.test.ts",
+ "**/*.spec.ts",
+ "**/*.test.tsx",
+ "**/*.spec.tsx",
+ "**/*.test.js",
+ "**/*.spec.js",
+ "**/*.test.jsx",
+ "**/*.spec.jsx",
+ "**/*.d.ts",
+ "jest.config.ts"
+ ]
+}
diff --git a/package.json b/package.json
index a38ef15069..a6bd8b2984 100644
--- a/package.json
+++ b/package.json
@@ -309,16 +309,15 @@
},
"dependencies": {
"@docsearch/react": "^3.3.0",
- "@headlessui/react": "^1.7.3",
- "@heroicons/react": "^2.0.12",
+ "@headlessui/react": "^1.7.19",
+ "@heroicons/react": "^2.1.3",
"@markdoc/markdoc": "0.2.2",
"@monaco-editor/react": "^4.4.6",
"@napi-rs/canvas": "^0.1.19",
"@swc/helpers": "~0.5.2",
"@tailwindcss/aspect-ratio": "^0.4.2",
- "@tailwindcss/forms": "^0.5.3",
- "@tailwindcss/line-clamp": "^0.4.2",
- "@tailwindcss/typography": "^0.5.7",
+ "@tailwindcss/forms": "^0.5.7",
+ "@tailwindcss/typography": "^0.5.12",
"@types/license-checker": "^25.0.3",
"@types/minimatch": "^5.1.2",
"@widgetbot/react-embed": "^1.9.0",
@@ -350,7 +349,7 @@
"send": "0.17.1",
"string-width": "^4.2.3",
"strong-log-transformer": "^2.1.0",
- "tailwind-merge": "^1.8.1",
+ "tailwind-merge": "^2.3.0",
"tailwindcss": "3.4.3",
"tslib": "^2.3.0",
"weak-napi": "^2.0.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 341e3d00db..1fec3d180a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -13,11 +13,11 @@ dependencies:
specifier: ^3.3.0
version: 3.3.0(@algolia/client-search@4.22.1)(@types/react@18.2.33)(react-dom@18.2.0)(react@18.2.0)
'@headlessui/react':
- specifier: ^1.7.3
- version: 1.7.3(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^1.7.19
+ version: 1.7.19(react-dom@18.2.0)(react@18.2.0)
'@heroicons/react':
- specifier: ^2.0.12
- version: 2.0.12(react@18.2.0)
+ specifier: ^2.1.3
+ version: 2.1.3(react@18.2.0)
'@markdoc/markdoc':
specifier: 0.2.2
version: 0.2.2(@types/react@18.2.33)(react@18.2.0)
@@ -34,14 +34,11 @@ dependencies:
specifier: ^0.4.2
version: 0.4.2(tailwindcss@3.4.3)
'@tailwindcss/forms':
- specifier: ^0.5.3
- version: 0.5.3(tailwindcss@3.4.3)
- '@tailwindcss/line-clamp':
- specifier: ^0.4.2
- version: 0.4.2(tailwindcss@3.4.3)
- '@tailwindcss/typography':
specifier: ^0.5.7
version: 0.5.7(tailwindcss@3.4.3)
+ '@tailwindcss/typography':
+ specifier: ^0.5.12
+ version: 0.5.12(tailwindcss@3.4.3)
'@types/license-checker':
specifier: ^25.0.3
version: 25.0.3
@@ -136,8 +133,8 @@ dependencies:
specifier: ^2.1.0
version: 2.1.0
tailwind-merge:
- specifier: ^1.8.1
- version: 1.8.1
+ specifier: ^2.3.0
+ version: 2.3.0
tailwindcss:
specifier: 3.4.3
version: 3.4.3(ts-node@10.9.1)
@@ -4809,13 +4806,6 @@ packages:
regenerator-runtime: 0.14.0
dev: true
- /@babel/runtime@7.23.9:
- resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==}
- engines: {node: '>=6.9.0'}
- dependencies:
- regenerator-runtime: 0.14.0
- dev: true
-
/@babel/runtime@7.24.0:
resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==}
engines: {node: '>=6.9.0'}
@@ -4823,6 +4813,13 @@ packages:
regenerator-runtime: 0.14.0
dev: true
+ /@babel/runtime@7.24.4:
+ resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.14.0
+ dev: false
+
/@babel/standalone@7.23.10:
resolution: {integrity: sha512-xqWviI/pt1Zb/d+6ilWa5IDL2mkDzsBnlHbreqnfyP3/QB/ofQ1bNVcHj8YQX154Rf/xZKR6y0s1ydVF3nAS8g==}
engines: {node: '>=6.9.0'}
@@ -6543,19 +6540,21 @@ packages:
resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==}
dev: true
- /@headlessui/react@1.7.3(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-LGp06SrGv7BMaIQlTs8s2G06moqkI0cb0b8stgq7KZ3xcHdH3qMP+cRyV7qe5x4XEW/IGY48BW4fLesD6NQLng==}
+ /@headlessui/react@1.7.19(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==}
engines: {node: '>=10'}
peerDependencies:
react: ^16 || ^17 || ^18
react-dom: ^16 || ^17 || ^18
dependencies:
+ '@tanstack/react-virtual': 3.4.0(react-dom@18.2.0)(react@18.2.0)
+ client-only: 0.0.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
- /@heroicons/react@2.0.12(react@18.2.0):
- resolution: {integrity: sha512-FZxKh3i9aKIDxyALTgIpSF2t6V6/eZfF5mRu41QlwkX3Oxzecdm1u6dpft6PQGxIBwO7TKYWaMAYYL8mp/EaOg==}
+ /@heroicons/react@2.1.3(react@18.2.0):
+ resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==}
peerDependencies:
react: '>= 16'
dependencies:
@@ -12614,8 +12613,8 @@ packages:
tailwindcss: 3.4.3(ts-node@10.9.1)
dev: false
- /@tailwindcss/forms@0.5.3(tailwindcss@3.4.3):
- resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
+ /@tailwindcss/forms@0.5.7(tailwindcss@3.4.3):
+ resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==}
peerDependencies:
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
dependencies:
@@ -12623,16 +12622,8 @@ packages:
tailwindcss: 3.4.3(ts-node@10.9.1)
dev: false
- /@tailwindcss/line-clamp@0.4.2(tailwindcss@3.4.3):
- resolution: {integrity: sha512-HFzAQuqYCjyy/SX9sLGB1lroPzmcnWv1FHkIpmypte10hptf4oPUfucryMKovZh2u0uiS9U5Ty3GghWfEJGwVw==}
- peerDependencies:
- tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1'
- dependencies:
- tailwindcss: 3.4.3(ts-node@10.9.1)
- dev: false
-
- /@tailwindcss/typography@0.5.7(tailwindcss@3.4.3):
- resolution: {integrity: sha512-JTTSTrgZfp6Ki4svhPA4mkd9nmQ/j9EfE7SbHJ1cLtthKkpW2OxsFXzSmxbhYbEkfNIyAyhle5p4SYyKRbz/jg==}
+ /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3):
+ resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==}
peerDependencies:
tailwindcss: '>=3.0.0 || insiders'
dependencies:
@@ -12643,12 +12634,27 @@ packages:
tailwindcss: 3.4.3(ts-node@10.9.1)
dev: false
+ /@tanstack/react-virtual@3.4.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@tanstack/virtual-core': 3.4.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /@tanstack/virtual-core@3.4.0:
+ resolution: {integrity: sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q==}
+ dev: false
+
/@testing-library/dom@9.3.4:
resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==}
engines: {node: '>=14'}
dependencies:
'@babel/code-frame': 7.23.5
- '@babel/runtime': 7.23.9
+ '@babel/runtime': 7.24.0
'@types/aria-query': 5.0.4
aria-query: 5.1.3
chalk: 4.1.2
@@ -28953,7 +28959,6 @@ packages:
/regenerator-runtime@0.14.0:
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
- dev: true
/regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
@@ -30867,8 +30872,10 @@ packages:
resolution: {integrity: sha512-SYJSIgeyXW7EuX1ytdneO5e8jip42oHWg9xl/o3oTYhmXusZVgiA+VlPvjIN+kHii9v90AmzTZEBcsEvuAY+TA==}
dev: true
- /tailwind-merge@1.8.1:
- resolution: {integrity: sha512-+fflfPxvHFr81hTJpQ3MIwtqgvefHZFUHFiIHpVIRXvG/nX9+gu2P7JNlFu2bfDMJ+uHhi/pUgzaYacMoXv+Ww==}
+ /tailwind-merge@2.3.0:
+ resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==}
+ dependencies:
+ '@babel/runtime': 7.24.4
dev: false
/tailwindcss@3.4.3(ts-node@10.9.1):
diff --git a/tsconfig.base.json b/tsconfig.base.json
index c0f0703281..d0f9d3a462 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -93,6 +93,7 @@
"@nx/nx-dev/ui-community": ["nx-dev/ui-community/src/index.ts"],
"@nx/nx-dev/ui-conference": ["nx-dev/ui-conference/src/index.ts"],
"@nx/nx-dev/ui-contact": ["nx-dev/ui-contact/src/index.ts"],
+ "@nx/nx-dev/ui-enterprise": ["nx-dev/ui-enterprise/src/index.ts"],
"@nx/nx-dev/ui-fence": ["nx-dev/ui-fence/src/index.ts"],
"@nx/nx-dev/ui-home": ["nx-dev/ui-home/src/index.ts"],
"@nx/nx-dev/ui-markdoc": ["nx-dev/ui-markdoc/src/index.ts"],