diff --git a/app/globals.css b/app/globals.css index b0d037c..afcb0b5 100644 --- a/app/globals.css +++ b/app/globals.css @@ -83,3 +83,23 @@ footer{margin:88px 0 0; border-top:1px solid var(--rule); padding:24px 0 0} .nav{order:3; flex-basis:100%; gap:8px 20px; font-size:14px} section{padding-top:56px} } +/* ---------- появление при прокрутке (RevealOnScroll) ---------- */ +/* body .reveal — специфичность 11, побеждает .project (10) и гарантирует работу на /projects/ */ +body .reveal { + transition: opacity .7s ease, transform .7s cubic-bezier(.2,.8,.2,1); + transition-delay: var(--d, 0s); +} +body .reveal.pending { + opacity: 0; + transform: translateY(16px); + transition: none; +} + +@media (prefers-reduced-motion: reduce) { + .reveal, + .reveal.pending { + opacity: 1; + transform: none; + transition: none; + } +} diff --git a/components/HomePage.tsx b/components/HomePage.tsx index 02b4378..03129c9 100644 --- a/components/HomePage.tsx +++ b/components/HomePage.tsx @@ -1,3 +1,4 @@ +import type { CSSProperties } from "react"; import type { Metadata } from "next"; import { SITE_URL, localePath, type Lang } from "@/lib/i18n"; import { pageMetadata } from "@/lib/seo"; @@ -6,6 +7,7 @@ import { members } from "@/content/people"; import { contribute, hero, meta, mission, people, principles, projectsIntro, stats } from "@/content/home"; import { Header } from "./Header"; import { Footer } from "./Footer"; +import { RevealOnScroll } from "./RevealOnScroll"; import "./home.css"; export function homeMetadata(lang: Lang): Metadata { @@ -52,7 +54,7 @@ export function HomePage({ lang }: { lang: Lang }) { -
+

{mission.label[lang]}

{mission.paragraphs.map((p, i) => ( @@ -62,10 +64,10 @@ export function HomePage({ lang }: { lang: Lang }) {
-

{principles.label[lang]}

+

{principles.label[lang]}

{principles.items.map((item, i) => ( -
+

{item.title[lang]}

{item.text[lang]}

@@ -73,7 +75,7 @@ export function HomePage({ lang }: { lang: Lang }) {
-
+

{projectsIntro.label[lang]}

{projectsIntro.paragraphs.map((p, i) => ( @@ -87,13 +89,13 @@ export function HomePage({ lang }: { lang: Lang }) {
-

{people.label[lang]}

+

{people.label[lang]}

-

{people.text[lang]}

+

{people.text[lang]}

- {members.map((m) => ( -
+ {members.map((m, i) => ( +
@@ -111,13 +113,13 @@ export function HomePage({ lang }: { lang: Lang }) {
-

{contribute.label[lang]}

+

{contribute.label[lang]}

    {contribute.steps.map((s, i) => ( -
  1. {s[lang]}
  2. +
  3. {s[lang]}
  4. ))}
-
+

{contribute.promiseTitle[lang]}

    @@ -133,7 +135,7 @@ export function HomePage({ lang }: { lang: Lang }) {

-
+ @@ -141,6 +143,7 @@ export function HomePage({ lang }: { lang: Lang }) {
); } diff --git a/components/projects.css b/components/projects.css index c2f9727..ed90807 100644 --- a/components/projects.css +++ b/components/projects.css @@ -64,21 +64,11 @@ .star .n:empty{display:none} .star .n::after{content:" · "; font-weight:400; color:var(--muted)} -/* ---------- появление при прокрутке ---------- */ -/* Прячутся только карточки ниже первого экрана (класс .pending ставит RevealOnScroll). - Без JS, до загрузки JS и при reduced motion всё видно сразу. */ -.project.reveal{ - transition:opacity .7s ease, transform .7s cubic-bezier(.2,.8,.2,1); - transition-delay:var(--d,0s); -} -.project.reveal.pending{opacity:0; transform:translateY(16px); transition:none} - /* ---------- завершение ---------- */ .after{padding:64px 0 0} .after p{margin:0; font-size:16.5px; max-width:60ch} @media (prefers-reduced-motion:reduce){ - .project.reveal,.project.reveal.pending{opacity:1; transform:none; transition:none} .status.live::before{animation:none} .project,.project .icon{transition:none} .project:hover,.project:hover .icon{transform:none}