Port more content to website-next (#1435)

Summary:
This builds upon https://github.com/facebook/yoga/pull/1433 and starts porting over and fixing some of the code in website-next.

1. Create a hero similar to current https://yogalayout.com hero
2. Start moving from `antd` and harcoded colors to [Infima](https://infima.dev/docs/getting-started/introduction/) primitives provided by Docusaurus
3. Replaced some more stock docusaurus assets, links, and text with the ones for Yoga.

There is still a lot to do here (not the least, adding real content), but it's beginning to look like a website, and is already pretty snappy. Eventually I want to get SSR working correctly with Playground, which is still a little broken in the port.

Pull Request resolved: https://github.com/facebook/yoga/pull/1435

Test Plan:
**Gatsby Original**
<img width="1795" alt="image" src="https://github.com/facebook/yoga/assets/835219/7670d53a-00a8-4146-a100-e4a05dd77488">

**New (light mode)**
<img width="800" alt="image" src="https://github.com/facebook/yoga/assets/835219/ebe11d15-5f6f-445f-bcc8-9ec51ecfac62">

**New (dark mode)**
<img width="800" alt="image" src="https://github.com/facebook/yoga/assets/835219/ca44a492-46df-410a-8303-baec3029ec49">

Reviewed By: yungsters

Differential Revision: D50523462

Pulled By: NickGerleman

fbshipit-source-id: 61b4610104f695a4e38a7d4bb6a0c2488bd6f89e
This commit is contained in:
Nick Gerleman
2023-11-03 05:23:56 -07:00
committed by Facebook GitHub Bot
parent a20559063e
commit 92860077f9
31 changed files with 3105 additions and 3332 deletions

View File

@@ -10,47 +10,151 @@
* and scoped locally.
*/
html[data-theme='light'] {
--yg-color-playound-background: var(--ifm-color-gray-200);
}
html[data-theme='dark'] {
--yg-color-playound-background: var(--ifm-color-background);
}
.heroBanner {
padding: 4rem 0;
text-align: center;
position: relative;
overflow: hidden;
flex: 1;
display: flex;
flex-direction: row;
justify-content: center;
}
@media screen and (max-width: 996px) {
.heroBanner {
padding: 2rem;
}
.heroRow {
align-items: center;
}
.buttons {
.blueprintColumn {
display: flex;
align-items: center;
justify-content: center;
}
.playgroundFallback {
height: 500px;
width: 100%;
background: linear-gradient(-90deg, rgba(0, 0, 0, 0.02) 1px, transparent 1px),
linear-gradient(rgba(0, 0, 0, 0.02) 1px, transparent 1px),
linear-gradient(-90deg, rgba(0, 0, 0, 0.03) 1px, transparent 1px),
linear-gradient(rgba(0, 0, 0, 0.03) 1px, transparent 1px),
linear-gradient(
transparent 4px,
#f5f5f5 4px,
#f5f5f5 97px,
transparent 97px
),
linear-gradient(-90deg, #e5e5e5 1px, transparent 1px),
linear-gradient(
-90deg,
transparent 4px,
#f5f5f5 4px,
#f5f5f5 97px,
transparent 97px
),
linear-gradient(#e5e5e5 1px, transparent 1px), #f5f5f5;
background-size: 10px 10px, 10px 10px, 100px 100px, 100px 100px, 100px 100px,
100px 100px, 100px 100px, 100px 100px;
@media (max-width: 996px) {
.blueprintColumn {
display: none;
}
}
.blueprint {
--blueprint-gap: 5%;
--fadein-duration: 500ms;
box-shadow: var(--ifm-global-shadow-tl);
background-color: var(--ifm-background-surface-color);
border-radius: 0.5rem;
}
.blueprintContainer {
position: relative;
width: var(--ifm-col-width);
aspect-ratio: 1.0;
background-color: var(--ifm-color-primary-lighter);
box-shadow: var(--ifm-global-shadow-lw);
}
.blueprintAvatar {
position: absolute;
left: 0;
top: 0;
margin: var(--blueprint-gap) 0 0 var(--blueprint-gap);
width: calc(25% - (var(--blueprint-gap)));
height: calc(25% - (var(--blueprint-gap)));
animation: avatar-fadein var(--fadein-duration) ease;
}
@keyframes avatar-fadein {
0% {
transform: scale(1.1);
opacity: 0%;
}
50% {
transform: scale(1.0);
opacity: 100%;
}
}
.blueprintTitle {
position: absolute;
left: 25%;
top: 0;
right: 10%;
margin: var(--blueprint-gap) var(--blueprint-gap) 0 var(--blueprint-gap);
height: calc(10% - (var(--blueprint-gap)));
animation: title-fadein var(--fadein-duration) ease;
}
.blueprintSubtitle {
position: absolute;
left: 25%;
top: 10%;
right: 30%;
margin: var(--blueprint-gap);
height: calc(10% - (var(--blueprint-gap)));
animation: title-fadein var(--fadein-duration) ease;
}
@keyframes title-fadein {
0% {
transform: scale(1.1);
opacity: 0%;
}
25% {
transform: scale(1.1);
opacity: 0%;
}
75% {
transform: scale(1.0);
opacity: 100%;
}
}
.blueprintContent {
box-sizing: border-box;
position: absolute;
bottom: 0;
margin: var(--blueprint-gap);
width: calc(100% - (var(--blueprint-gap) * 2));
height: calc(75% - (var(--blueprint-gap) * 2));
animation: content-fadein var(--fadein-duration) ease;
}
@keyframes content-fadein {
0% {
transform: scale(1.1);
opacity: 0%;
}
50% {
transform: scale(1.1);
opacity: 0%;
}
100% {
transform: scale(1.0);
opacity: 100%;
}
}
.playgroundSection {
display: flex;
flex-direction: column;
justify-content: center;
height: 600px;
width: 100%;
background-color: var(--yg-color-playound-background);
}
@media (max-width: 996px) {
.playgroundSection {
display: none;
}
}

View File

@@ -8,59 +8,82 @@
import React, {Suspense} from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import HomepageFeatures from '@site/src/components/HomepageFeatures';
import BrowserOnly from '@docusaurus/BrowserOnly';
import styles from './index.module.css';
function HomepageHeader() {
const {siteConfig} = useDocusaurusContext();
function HeroSection() {
return (
<header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container">
<h1 className="hero__title">{siteConfig.title}</h1>
<p className="hero__subtitle">{siteConfig.tagline}</p>
<div className={styles.buttons}>
<Link
className="button button--secondary button--lg"
to="/docs/intro">
Docusaurus Tutorial - 5min
<header className={clsx('hero', styles.heroBanner)}>
<div className={clsx('row', 'container', styles.heroRow)}>
<div className="col col--6">
<h1 className="hero__title">Yoga Layout</h1>
<p className="hero__subtitle">
A portable and perfomant layout engine targeting web standards
</p>
<Link className="button button--primary button--lg" to="/docs/intro">
Learn more
</Link>
</div>
<div className={clsx(['col col--6', styles.blueprintColumn])}>
<div className={clsx([styles.blueprint, styles.blueprintContainer])}>
<div className={styles.blueprintHeader}>
<div
className={clsx([styles.blueprint, styles.blueprintAvatar])}
/>
<div
className={clsx([styles.blueprint, styles.blueprintTitle])}
/>
<div
className={clsx([styles.blueprint, styles.blueprintSubtitle])}
/>
</div>
<div
className={clsx([styles.blueprint, styles.blueprintContent])}
/>
</div>
</div>
</div>
</header>
);
}
const LazyPlayground = React.lazy(() => import('../components/Playground'));
function ClientPlayground() {
const fallback = <div className={styles.playgroundFallback} />;
const LazyPlayground = React.lazy(
() => import('../components/Playground/Playground'),
);
// Docusaurus SSR does not correctly support top-level await
// 1. https://github.com/facebook/docusaurus/issues/7238
// 2. https://github.com/facebook/docusaurus/issues/9468
function BrowserOnlyPlayground() {
return (
<BrowserOnly fallback={fallback}>
<BrowserOnly fallback={null}>
{() => (
<Suspense fallback={fallback}>
<LazyPlayground />
<Suspense fallback={null}>
<LazyPlayground className={styles.playground} />
</Suspense>
)}
</BrowserOnly>
);
}
export default function Home(): JSX.Element {
const {siteConfig} = useDocusaurusContext();
function PlaygroundSection() {
return (
<Layout
title={`Hello from ${siteConfig.title}`}
description="Description will go into a meta tag in <head />">
<HomepageHeader />
<main>
<HomepageFeatures />
<ClientPlayground />
</main>
<main className={styles.playgroundSection}>
<div className="container">
<BrowserOnlyPlayground />
</div>
</main>
);
}
export default function Home(): JSX.Element {
return (
<Layout title="Yoga Layout | A cross-platform layout engine">
<HeroSection />
<PlaygroundSection />
</Layout>
);
}