From 0ebe791a75018c74401f0a0447437fd9101d8c09 Mon Sep 17 00:00:00 2001 From: Melinda Fekete Date: Thu, 23 Jan 2025 14:05:41 +0100 Subject: [PATCH] docs: new landing page (#9087) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New landing page design for the docs with custom card components. [Design file](https://www.figma.com/design/7BXV5qZrmrI4H1Yk8FVW9T/Marketing?node-id=5330-8333&t=eKa3NYwKpzane9ey-0) [Docs Preview](https://unleash-docs-git-alvin-new-docs-homepage-unleash-team.vercel.app/) --------- Co-authored-by: Alvin Bryan Co-authored-by: Nuno Góis --- website/docs/welcome.md | 42 ---------- website/docs/welcome.mdx | 12 +++ .../src/components/Homepage/HomepageCards.tsx | 73 ++++++++++++++++ .../components/Homepage/HomepageContent.tsx | 39 +++++++++ .../src/components/Homepage/cards.module.css | 78 ++++++++++++++++++ .../components/Homepage/content.module.css | 22 +++++ .../src/components/Homepage/icons/academy.svg | 3 + .../Homepage/icons/get-in-touch.svg | 3 + .../Homepage/icons/integrations.svg | 12 +++ .../components/Homepage/icons/quickstart.svg | 3 + .../src/components/Homepage/icons/sdks.svg | 5 ++ .../components/Homepage/icons/tutorials.svg | 13 +++ website/src/components/Homepage/index.ts | 2 + website/src/css/academy.css | 1 - website/src/css/custom.css | 40 +++++++++ website/static/img/card-hover-bg.png | Bin 0 -> 14188 bytes 16 files changed, 305 insertions(+), 43 deletions(-) delete mode 100644 website/docs/welcome.md create mode 100644 website/docs/welcome.mdx create mode 100644 website/src/components/Homepage/HomepageCards.tsx create mode 100644 website/src/components/Homepage/HomepageContent.tsx create mode 100644 website/src/components/Homepage/cards.module.css create mode 100644 website/src/components/Homepage/content.module.css create mode 100644 website/src/components/Homepage/icons/academy.svg create mode 100644 website/src/components/Homepage/icons/get-in-touch.svg create mode 100644 website/src/components/Homepage/icons/integrations.svg create mode 100644 website/src/components/Homepage/icons/quickstart.svg create mode 100644 website/src/components/Homepage/icons/sdks.svg create mode 100644 website/src/components/Homepage/icons/tutorials.svg create mode 100644 website/src/components/Homepage/index.ts create mode 100644 website/static/img/card-hover-bg.png diff --git a/website/docs/welcome.md b/website/docs/welcome.md deleted file mode 100644 index 278954e8eb..0000000000 --- a/website/docs/welcome.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -slug: / -title: Feature Management Platform -description: 'Unleash is the largest open-source feature management platform. In our documentation, you’ll find everything from core Unleash concepts and feature flag best practices to detailed SDK and API guides—giving you all the resources you need to get the most out of Unleash.' -displayed_sidebar: documentation ---- - -# Unleash Documentation - -Unleash is a **private**, **secure**, and **scalable feature management platform** built to reduce the risk of releasing new features and accelerate software development. - -Whether you’re a small team or a large enterprise, Unleash enables you to **innovate faster** and make data-driven decisions that **enhance your user experience**. - -With market-leading data governance, robust change and access controls, SaaS or self-hosted deployment options, multi-region support, and the flexibility of **open-source**, you have the freedom to choose the setup that works best for you while maintaining full control over your data. - -## Quickstart - -[Get up and running](/quickstart) with Unleash in less than 5 minutes. - -## Tutorials and guides - -Explore [best practices](/topics) and step-by-step [tutorials](/feature-flag-tutorials), organized by programming languages and frameworks, to help you integrate Unleash into your stack. - -## SDKs - -With over 30 [SDKs](/reference/sdks), we enable fast and secure feature flagging across all major programming languages so you can deploy confidently in any environment. - -## Unleash Academy - -Enroll in [Unleash Academy](/unleash-academy/introduction) to learn the core concepts and best practices, earn certifications, and gain the expertise needed to manage feature flags. - -## Integrations - -[Connect Unleash](/reference/integrations) to your existing workflows. Integrate with popular tools like GitHub, Slack, CI/CD pipelines, and more. - -## Get in touch - -Have questions or ideas? We’d love to hear from you! Join our active [Slack community](https://slack.unleash.run/), contribute on [GitHub](https://github.com/orgs/Unleash), or [schedule a conversation](https://www.getunleash.io/plans/enterprise) with our team. - -You can also follow us on [Twitter](https://twitter.com/getunleash 'Unleash on Twitter'), [LinkedIn](https://www.linkedin.com/company/getunleash/ 'Unleash on LinkedIn'), and [visit our website](https://getunleash.io/) for ongoing updates and content. - - diff --git a/website/docs/welcome.mdx b/website/docs/welcome.mdx new file mode 100644 index 0000000000..727f4e20a8 --- /dev/null +++ b/website/docs/welcome.mdx @@ -0,0 +1,12 @@ +--- +slug: / +title: Unleash Documentation +description: "Unleash is the largest open-source feature management platform. In our documentation, you’ll find everything from core Unleash concepts and feature flag best practices to detailed SDK and API guides—giving you all the resources you need to get the most out of Unleash." +displayed_sidebar: documentation +--- + +import { Content, Cards } from "@site/src/components/Homepage/"; + + + + diff --git a/website/src/components/Homepage/HomepageCards.tsx b/website/src/components/Homepage/HomepageCards.tsx new file mode 100644 index 0000000000..789f6d9179 --- /dev/null +++ b/website/src/components/Homepage/HomepageCards.tsx @@ -0,0 +1,73 @@ +import styles from './cards.module.css'; +import QuickstartIcon from './icons/quickstart.svg'; +import TutorialsIcon from './icons/tutorials.svg'; +import SdksIcon from './icons/sdks.svg'; +import AcademyIcon from './icons/academy.svg'; +import IntegrationsIcon from './icons/integrations.svg'; +import GetInTouchIcon from './icons/get-in-touch.svg'; + +const cardsData = [ + { + title: 'Quickstart', + description: 'Get up and running with Unleash in less than 5 minutes.', + icon: , + href: '/quickstart', + }, + { + title: 'Tutorials and Guides', + description: + 'Explore best practices and step-by-step tutorials to help you integrate Unleash into your stack.', + icon: , + href: '/feature-flag-tutorials/use-cases/gradual-rollout', + }, + { + title: 'SDKs', + description: + 'With over 30 SDKs, we enable fast and secure feature flagging across all major programming languages.', + icon: , + href: '/reference/sdks', + }, + { + title: 'Unleash Academy', + description: + 'Enroll in Unleash Academy to learn core concepts and best practices and gain feature flag expertise.', + icon: , + href: '/unleash-academy/introduction', + }, + { + title: 'Integrations', + description: + 'Connect Unleash to your existing workflows. Integrate with popular tools like GitHub, Slack, CI/CD pipelines.', + icon: , + href: '/reference/integrations', + }, + { + title: 'Get in touch', + description: 'Reach out to us for any questions or support.', + icon: , + href: 'https://www.getunleash.io/support', + }, +]; + +const HomepageCards = () => { + return ( +
+ {cardsData.map((card, index) => ( + +
+
+
+ {card.icon} +

{card.title}

+
+ +

{card.description}

+
+
+
+ ))} +
+ ); +}; + +export default HomepageCards; diff --git a/website/src/components/Homepage/HomepageContent.tsx b/website/src/components/Homepage/HomepageContent.tsx new file mode 100644 index 0000000000..171414c660 --- /dev/null +++ b/website/src/components/Homepage/HomepageContent.tsx @@ -0,0 +1,39 @@ +import styles from './content.module.css'; +import VideoContent from '@site/src/components/VideoContent.jsx'; + +const HomepageContent = () => { + return ( +
+
+

+ Unleash is a private,{' '} + secure, and{' '} + scalable feature management platform built + to reduce the risk of releasing new features and accelerate + software development. +

+

+ Whether you’re a small team or a large enterprise, Unleash + enables you to innovate faster and make + data-driven decisions that{' '} + enhance your user experience. +

+

+ With market-leading data governance, robust change and + access controls, SaaS or self-hosted deployment options, + multi-region support, and the flexibility of{' '} + open-source, you have the freedom to choose + the setup that works best for you while maintaining full + control over your data. +

+
+
+ +
+
+ ); +}; + +export default HomepageContent; diff --git a/website/src/components/Homepage/cards.module.css b/website/src/components/Homepage/cards.module.css new file mode 100644 index 0000000000..0118f7cbf1 --- /dev/null +++ b/website/src/components/Homepage/cards.module.css @@ -0,0 +1,78 @@ +.container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 20px; + margin-top: 60px; +} + +.container > a { + text-decoration: none; +} + +.card { + background-color: var(--ifm-background-color); + height: 250px; + border-radius: 12px; + border: 1px solid #e1e1e3; + border-bottom: 12px solid #6c65e5; + padding: 30px; + padding-top: 50px; + position: relative; + transition: background-color 0.2s ease-in-out; +} + +html[data-theme="dark"] .card { + border: 1px solid var(--ifm-color-emphasis-300); + border-bottom: 12px solid #6c65e5; +} + +.card::before { + content: ""; + background-image: url("/img/card-hover-bg.png"); + position: absolute; + z-index: 0; + top: 0; + right: 0; + width: 60%; + height: 85%; + background-size: cover; + border-top-right-radius: 12px; +} + +html[data-theme="dark"] .card::before { + opacity: 0.2; +} + +.card:hover { + background-color: var(--unleash-color-welcome-card-hover); +} + +.cardbody { + z-index: 10; + position: relative; +} + +.cardbody > p { + font-size: 14px; + color: var(--ifm-font-color-base); +} + +.cardbody > .title { + display: flex; + align-items: center; + gap: 6px; + margin-bottom: 16px; + color: var(--unleash-color-welcome-strong); +} + +.cardbody > .title > svg { + width: 30px; + height: 30px; + fill: var(--unleash-color-welcome-strong); +} + +.cardbody > .title > h3 { + margin-bottom: 0; + font-size: 18px; + line-height: 18px; +} diff --git a/website/src/components/Homepage/content.module.css b/website/src/components/Homepage/content.module.css new file mode 100644 index 0000000000..c4a5e6e2e7 --- /dev/null +++ b/website/src/components/Homepage/content.module.css @@ -0,0 +1,22 @@ +.content { + display: flex; + gap: 20px; + align-items: center; + justify-content: space-between; + font-size: 16px; + line-height: 24px; +} + +.content > * { + flex: 1; +} + +.content > .video { + width: 100%; +} + +@media screen and (max-width: 768px) { + .content { + flex-direction: column; + } +} diff --git a/website/src/components/Homepage/icons/academy.svg b/website/src/components/Homepage/icons/academy.svg new file mode 100644 index 0000000000..6b7fe130cf --- /dev/null +++ b/website/src/components/Homepage/icons/academy.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/components/Homepage/icons/get-in-touch.svg b/website/src/components/Homepage/icons/get-in-touch.svg new file mode 100644 index 0000000000..af7a20c6fb --- /dev/null +++ b/website/src/components/Homepage/icons/get-in-touch.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/components/Homepage/icons/integrations.svg b/website/src/components/Homepage/icons/integrations.svg new file mode 100644 index 0000000000..20670c4381 --- /dev/null +++ b/website/src/components/Homepage/icons/integrations.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/website/src/components/Homepage/icons/quickstart.svg b/website/src/components/Homepage/icons/quickstart.svg new file mode 100644 index 0000000000..dc1f43fdc3 --- /dev/null +++ b/website/src/components/Homepage/icons/quickstart.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/src/components/Homepage/icons/sdks.svg b/website/src/components/Homepage/icons/sdks.svg new file mode 100644 index 0000000000..7be3fc421b --- /dev/null +++ b/website/src/components/Homepage/icons/sdks.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/website/src/components/Homepage/icons/tutorials.svg b/website/src/components/Homepage/icons/tutorials.svg new file mode 100644 index 0000000000..24d7c8a2ed --- /dev/null +++ b/website/src/components/Homepage/icons/tutorials.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/website/src/components/Homepage/index.ts b/website/src/components/Homepage/index.ts new file mode 100644 index 0000000000..f7722b9e22 --- /dev/null +++ b/website/src/components/Homepage/index.ts @@ -0,0 +1,2 @@ +export { default as Cards } from './HomepageCards'; +export { default as Content } from './HomepageContent'; diff --git a/website/src/css/academy.css b/website/src/css/academy.css index 71ab37e8ef..0522a8729d 100644 --- a/website/src/css/academy.css +++ b/website/src/css/academy.css @@ -254,4 +254,3 @@ html[data-theme="dark"] .unleash-academy-level-badge { border-color: var(--ifm-link-color); color: var(--ifm-link-color); } - diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 1e3a4ea0e8..58b0d8c282 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -54,6 +54,11 @@ html[data-theme="light"] { --unleash-color-table-of-contents-header-background: #eef0f1; --unleash-color-table-of-contents-header-color: #244049; --unleash-color-navigation-background-active: #f4f3fd; + + --unleash-color-welcome-title: #1e373f; + --unleash-color-welcome-strong: #1a4049; + + --unleash-color-welcome-card-hover: #f7f7fa; } html[data-theme="dark"] { @@ -91,6 +96,10 @@ html[data-theme="dark"] { --unleash-color-navigation-background-active: var( --ifm-breadcrumb-item-background-active ); + + --unleash-color-welcome-title: var(--ifm-font-color-base); + --unleash-color-welcome-strong: var(--ifm-font-color-base); + --unleash-color-welcome-card-hover: #2b2a3c; } /* navbar */ @@ -350,3 +359,34 @@ main .theme-doc-breadcrumbs { } /* end video content container */ + +/* welcome page */ + +.docs-doc-id-welcome main .container { + background-color: transparent; +} + +@media (min-width: 997px) { + .docs-doc-id-welcome main .container > .row > .col { + max-width: 100% !important; + } +} + +.docs-doc-id-welcome main .theme-doc-breadcrumbs { + display: none; +} + +.docs-doc-id-welcome .markdown h1:first-child { + color: var(--unleash-color-welcome-title); + font-size: 40px; + line-height: 32px; + font-weight: 700; + margin-top: 40px; + margin-bottom: 40px; +} + +.docs-doc-id-welcome .markdown strong { + color: var(--unleash-color-welcome-strong); +} + +/* end welcome page */ diff --git a/website/static/img/card-hover-bg.png b/website/static/img/card-hover-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf2360a73d998321703a9fdd3a5d55f84d3157c GIT binary patch literal 14188 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 literal 0 HcmV?d00001