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

Lamp Glow

Лампа над сценой: тонкая перекладина света разгорается из середины, вниз идёт конус, и содержимое стоит в освещённом пятне. Конус — один conic-gradient с вершиной в перекладине, свечение — box-shadow, затухание — статичная маска: ни одного filter: blur, дышит только opacity.

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

Пропсы

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

ПропТипПо умолчаниюЧто это
backdrop?string | falseBACKDROPПодложка под светом: CSS-значение `background` или `false`. `false` нужен, когда запись стоит фоном СЕКЦИИ и подложку задаёт она.
hue?number300Тон света, градусы oklch.
width?number34Длина перекладины, cq-единицы ширины (доля контейнера).
strength?number0.6Яркость свечения (0.2–1).
children?ReactNode—Содержимое в конусе света (в витрине — заголовок, в секции обычно пусто).

Установка

npx shadcn@latest add https://motiva.pages.dev/r/lamp-glow.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

Код

.lg { container-type: size; }

/* лампа: тонкая перекладина света. База = финал: при animation: none лампа горит */
.lg-bar {
  position: absolute;
  left: 50%;
  top: 38cqh;
  width: var(--lg-w);
  height: 5px;
  margin-left: calc(var(--lg-w) / -2);
  border-radius: 999px;
  background: var(--lg-bar);
  /* свечение перекладины — box-shadow, а не blur: растр кешируется композитором */
  box-shadow: 0 0 16px var(--lg-halo1), 0 0 64px var(--lg-halo2);
  opacity: 1;
  animation: lg-bar-in 1.1s cubic-bezier(0.22, 1, 0.36, 1) both;
}

/* конус света вниз от лампы: один conic-gradient с вершиной в перекладине,
   затухание по дальности — статичной маской (не анимируется — перерисовки нет) */
.lg-cone {
  position: absolute;
  left: 50%;
  top: calc(38cqh + 2px);
  width: 160cqw;
  height: 64cqh;
  margin-left: -80cqw;
  background: conic-gradient(
    from 0deg at 50% 0%,
    transparent 142deg,
    var(--lg-cone) 166deg,
    var(--lg-cone) 194deg,
    transparent 218deg
  );
  -webkit-mask-image: linear-gradient(to bottom, #000, transparent 94%);
  mask-image: linear-gradient(to bottom, #000, transparent 94%);
  opacity: 1;
  animation: lg-fade 1.5s ease-out 0.15s both, lg-breathe 9s ease-in-out 1.65s infinite;
}

/* подсвеченный воздух над лампой: света вверх идёт мало — потолок, а не второй конус */
.lg-air {
  position: absolute;
  left: 50%;
  top: 38cqh;
  width: 64cqw;
  height: 17cqh;
  margin-left: -32cqw;
  translate: 0 -100%;
  background: radial-gradient(50% 100% at 50% 100%, var(--lg-halo2), transparent 70%);
  opacity: 0.8;
  animation: lg-fade 1.5s ease-out 0.3s both;
}

@keyframes lg-bar-in {
  from { opacity: 0; scale: 0.25 1; }
  to   { opacity: 1; scale: 1 1; }
}
@keyframes lg-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
/* дыхание — только opacity: композитный канал, растры конуса не перерисовываются */
@keyframes lg-breathe {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.86; }
}

@media (prefers-reduced-motion: reduce) {
  .lg-bar, .lg-cone, .lg-air { animation: none; }
}
лицензия: MITавтор: Motivaисточник: оригинал (Motiva); идея-референс — Aceternity Lamp (код не заимствован: публичного репозитория нет, Terms запрещают)v1.0.0