From 63cff40baf8c8275f91eea9cd4105d6710f818d3 Mon Sep 17 00:00:00 2001 From: Nicoole Date: Tue, 6 Oct 2026 16:44:11 -0400 Subject: [PATCH 1/6] feat: add Ease landing page and updated banner --- README.md | 2 +- docs/docs/getting-started.mdx | 2 +- docs/docusaurus.config.ts | 4 +- .../components/landing/CopyInstallCommand.tsx | 122 ++++++++ docs/src/components/landing/FeatureList.tsx | 79 +++++ docs/src/components/landing/Illustration.tsx | 10 + docs/src/pages/index.tsx | 270 ++++++++++++++++++ docs/static/fonts/GT-Maru-Bold.ttf | Bin 0 -> 103520 bytes docs/static/fonts/Inter-LICENSE.txt | 92 ++++++ docs/static/fonts/InterVariable.woff2 | Bin 0 -> 352240 bytes docs/static/fonts/JetBrainsMono-OFL.txt | 93 ++++++ docs/static/fonts/JetBrainsMono-Regular.woff2 | Bin 0 -> 92380 bytes docs/static/img/github-banner.png | Bin 0 -> 553841 bytes docs/static/img/landing/copy.svg | 10 + docs/static/img/landing/github.svg | 5 + docs/static/img/landing/mark.svg | 11 + docs/static/img/landing/phone.png | Bin 0 -> 49498 bytes docs/static/img/landing/phone.svg | 5 + docs/static/img/landing/react.svg | 5 + docs/static/img/landing/transition.svg | 5 + 20 files changed, 711 insertions(+), 4 deletions(-) create mode 100644 docs/src/components/landing/CopyInstallCommand.tsx create mode 100644 docs/src/components/landing/FeatureList.tsx create mode 100644 docs/src/components/landing/Illustration.tsx create mode 100644 docs/src/pages/index.tsx create mode 100644 docs/static/fonts/GT-Maru-Bold.ttf create mode 100644 docs/static/fonts/Inter-LICENSE.txt create mode 100644 docs/static/fonts/InterVariable.woff2 create mode 100644 docs/static/fonts/JetBrainsMono-OFL.txt create mode 100644 docs/static/fonts/JetBrainsMono-Regular.woff2 create mode 100644 docs/static/img/github-banner.png create mode 100644 docs/static/img/landing/copy.svg create mode 100644 docs/static/img/landing/github.svg create mode 100644 docs/static/img/landing/mark.svg create mode 100644 docs/static/img/landing/phone.png create mode 100644 docs/static/img/landing/phone.svg create mode 100644 docs/static/img/landing/react.svg create mode 100644 docs/static/img/landing/transition.svg diff --git a/README.md b/README.md index 0a3ead2..2cb9c12 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -react-native-ease by App & Flow +Native Animations with React Native Ease, maintained by App & Flow Lightweight declarative animations powered by platform APIs. Uses Core Animation on iOS and Animator on Android — zero JS overhead. diff --git a/docs/docs/getting-started.mdx b/docs/docs/getting-started.mdx index a8f5d31..c8961c9 100644 --- a/docs/docs/getting-started.mdx +++ b/docs/docs/getting-started.mdx @@ -4,7 +4,7 @@ title: Getting started slug: / --- -![react-native-ease hero](https://github.com/user-attachments/assets/8006ed51-d373-4c97-9e80-9937eb9a569e) +![Native Animations with React Native Ease](/img/github-banner.png) Lightweight declarative animations powered by platform APIs. Uses Core Animation on iOS and Animator on Android — zero JS overhead. diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 98eb5bf..f0c5168 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -21,7 +21,7 @@ const config: Config = { 'classic', { docs: { - routeBasePath: '/', + routeBasePath: '/docs', sidebarPath: './sidebars.ts', editUrl: 'https://github.com/AppAndFlow/react-native-ease/tree/main/docs/', @@ -33,7 +33,7 @@ const config: Config = { ], ], themeConfig: { - image: 'img/opengraph-image.png', + image: 'img/github-banner.png', colorMode: { defaultMode: 'light', disableSwitch: false, diff --git a/docs/src/components/landing/CopyInstallCommand.tsx b/docs/src/components/landing/CopyInstallCommand.tsx new file mode 100644 index 0000000..3c11cf7 --- /dev/null +++ b/docs/src/components/landing/CopyInstallCommand.tsx @@ -0,0 +1,122 @@ +import React, { useEffect, useRef, useState } from 'react'; +import Illustration from './Illustration'; + +export default function CopyInstallCommand({ + command, +}: { + command: string; +}): React.ReactElement { + const [status, setStatus] = useState(''); + const copied = status === 'Copied'; + const timer = useRef | undefined>(undefined); + useEffect(() => () => clearTimeout(timer.current), []); + + async function copy() { + clearTimeout(timer.current); + try { + await navigator.clipboard.writeText(command); + setStatus('Copied'); + timer.current = setTimeout(() => setStatus(''), 2000); + } catch { + setStatus('Select the command and copy it manually.'); + } + } + + return ( +
+
+ + {command} + + +
+ + {status} + +
+ ); +} diff --git a/docs/src/components/landing/FeatureList.tsx b/docs/src/components/landing/FeatureList.tsx new file mode 100644 index 0000000..de42e3a --- /dev/null +++ b/docs/src/components/landing/FeatureList.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import Link from '@docusaurus/Link'; +import Illustration from './Illustration'; + +const features = [ + { + title: 'An API that feels like React', + description: + 'Set your target values with animate and control how they change with transition. EaseView takes children, styles, and standard view props, so you can use it like any other component.', + to: '/docs/usage', + icon: 'react.svg', + }, + { + title: 'Native animation, no JS loop', + description: + 'Ease uses Core Animation on iOS and ObjectAnimator and SpringAnimation on Android. Once an animation starts, the native APIs handle the updates instead of a JavaScript animation loop.', + to: '/docs/how-it-works', + icon: 'phone.svg', + }, + { + title: 'Pick the transition you need', + description: + 'Use an easing curve for a fade, a spring for movement, or different transitions for different properties. Set the duration, damping, stiffness, and delay when you need to fine-tune an animation.', + to: '/docs/usage#per-property-transitions', + icon: 'transition.svg', + }, +]; + +export default function FeatureList(): React.ReactElement { + return ( +
+
+ {features.map(({ title, description, to, icon }) => ( +
+

+ + + {title} + +

+

+ {description} +

+
+ ))} +
+
+ ); +} diff --git a/docs/src/components/landing/Illustration.tsx b/docs/src/components/landing/Illustration.tsx new file mode 100644 index 0000000..db08b5b --- /dev/null +++ b/docs/src/components/landing/Illustration.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +export default function Illustration({ + file, + alt = '', + ...props +}: Omit, 'src'> & { file: string }) { + return {alt}; +} diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx new file mode 100644 index 0000000..52b1efd --- /dev/null +++ b/docs/src/pages/index.tsx @@ -0,0 +1,270 @@ +import React from 'react'; +import Head from '@docusaurus/Head'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import LayoutProvider from '@theme/Layout/Provider'; +import SkipToContent from '@theme/SkipToContent'; +import { + PageMetadata, + SkipToContentFallbackId, +} from '@docusaurus/theme-common'; +import Illustration from '../components/landing/Illustration'; +import FeatureList from '../components/landing/FeatureList'; +import CopyInstallCommand from '../components/landing/CopyInstallCommand'; +import packageJson from '../../../package.json'; + +const github = 'https://github.com/AppAndFlow/react-native-ease'; +const navStyle: React.CSSProperties = { + color: '#828282', + whiteSpace: 'nowrap', +}; + +export default function Home() { + const fontBase = useBaseUrl('/fonts/'); + return ( + + + + {/* Font declarations and breakpoints cannot be expressed as inline styles. */} + + + +
+ + + ); +} diff --git a/docs/static/fonts/GT-Maru-Bold.ttf b/docs/static/fonts/GT-Maru-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..59871bdea37a098373ae9fdf45404be66496fb24 GIT binary patch literal 103520 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