Motiva
Мои коллекции
← каталог

Retro Grid

Ретро-сетка: клетчатая плоскость уходит к горизонту и едет на камеру. Одна CSS-перспектива вместо WebGL, бесшовный цикл — сдвиг ровно на клетку.

cssautobasicreduced-motion ✓
↗
🎛 Настройки — крути и копируй

Пропсы

Разобрано из кода записи: обязательные — без «?», у остальных показано значение по умолчанию.

ПропТипПо умолчаниюЧто это
backdrop?string | falseBACKDROPПодложка (база под сеткой): CSS-значение `background` или `false`. `false` нужен, когда запись стоит фоном СЕКЦИИ и подложку задаёт она.
hue?number300Тон линий сетки, градусы oklch (0–360).
angle?number64Наклон плоскости, градусы (50–78: меньше — площе, больше — «пол под ногами»).
cell?number48Шаг сетки, px.
speed?number1.6Скорость: секунд на одну клетку.
children?ReactNode—Содержимое поверх. В витрине — подпись, в секции обычно пусто.

Установка

npx shadcn@latest add https://motiva.pages.dev/r/retro-grid.json
Что нужно в проекте до установки
  1. Файл components.json в корне

    Из него CLI узнаёт, куда класть файлы. Алиасы — в такой форме:

    "aliases": { "components": "@/components", "lib": "@/lib" }

    Нет файла — установка не начнётся вовсе.

  2. Алиас @ объявлен дважды

    В корневом tsconfig.json и в конфиге сборщика. В Vite корневой tsconfig часто содержит только references — этого мало.

    "paths": { "@/*": ["./src/*"] }        // tsconfig.json
    resolve.alias = { "@": "/src" }        // vite.config.ts

    Без paths CLI молча создаёт папку с именем @.

  3. Токены подключены один раз на приложение

    Они приезжают вместе с записью — достаточно импортировать их в точке входа:

    import "@/styles/motiva-tokens.css";

    Без них блок потеряет цвета, ритм и тему.

  4. Своя типографика не спорит с блоком

    Наследуемые свойства протекают внутрь: text-align: center на обёртке отцентрует содержимое секции. То же касается font-familyи line-height.

  5. Проект без TypeScript? всё равно нужен tsconfig

    CLI грузит tsconfig.json безусловно, а при "tsx": false идёт за jsconfig.json и падает так же. Минимум — файл с pathsи "tsx": true в components.json.

    Приехавший рядом .tsx можно не трогать — вам нужен .vanilla.js.

Экспорт

↓ Скачать .zip

Код

/* размерный контейнер: плоскость меряется в РОДИТЕЛЕ (cqw/cqh), не во вьюпорте —
   контракт слоя BUILDER 3.5 */
.rg { container-type: size; }
/* камера: линия горизонта на 35% высоты; растворение у горизонта — маской,
   а не заливкой поверх, чтобы фон секции просвечивал */
.rg-cam {
  position: absolute; inset: 0;
  perspective: 200px;
  perspective-origin: 50% 35%;
  mask-image: linear-gradient(180deg, transparent 32%, #000 46%);
  -webkit-mask-image: linear-gradient(180deg, transparent 32%, #000 46%);
}
.rg-plane {
  position: absolute; left: 50%; top: 35%;
  width: 300cqw; height: 180cqh;
  transform: translateX(-50%) rotateX(var(--rg-angle));
  transform-origin: top center;
}
/* едет ВНУТРЕННИЙ бегунок трансформом (композитор), а не background-position
   (перекраска каждый кадр); запас сверху в одну клетку закрывает исходное положение */
.rg-run {
  position: absolute; inset: calc(-1 * var(--rg-cell)) 0 0 0;
  background:
    repeating-linear-gradient(180deg, var(--rg-line) 0 1px, transparent 1px var(--rg-cell)),
    repeating-linear-gradient(90deg, var(--rg-line) 0 1px, transparent 1px var(--rg-cell));
  animation: rg-move var(--rg-speed) linear infinite;
}
@keyframes rg-move { to { transform: translate3d(0, var(--rg-cell), 0); } }
@media (prefers-reduced-motion: reduce) { .rg-run { animation: none; } }
лицензия: MITавтор: Motivaисточник: оригинал (Motiva)v1.0.0