Meniscus: React glass с преломлением по закону Снеллиуса — как это работает и зачем

#React#UI#graphics#webgl#front-end

Мне всегда нравились UI-эффекты, которые не просто красивы, а ещё и физически обоснованы. Недавно наткнулся на Meniscus — React-библиотеку, которая рисует стеклянные поверхности с преломлением контента за ними по закону Снеллиуса. Не размытие и светлая кайма, а реальное bending содержимого под стеклом с учётом угла падения света и индекса преломления.

Это не «еще один blur-фильтр», а попытка сделать glassmorphism с настоящей оптикой на фронте. В статье разберу, как это реализовано, какие ограничения и где Meniscus реально полезен.

Преломление вместо размытия: почему это важно

Большинство эффектов стекла на вебе — это размытие фона (backdrop-filter: blur) плюс светлая кайма. Вроде бы неплохо, но визуально это больше похоже на мутное стекло, чем на реально искривляющую свет поверхность. Особенно если хочешь сделать что-то вроде линзы или выпуклого стекла, где картинка за ней искажается.

Meniscus идёт дальше и вычисляет, как преломляются лучи света через «стекло» с некоторой толщиной и кривизной, используя закон Снеллиуса (Snell’s law). В итоге содержимое за компонентом как бы искривляется — это по-настоящему «жидкое стекло».

На практике это выглядит органично, особенно в интерфейсах с 3D-эффектами, интерактивными линзами — например, чтобы выделять часть страницы искажающимся «луповым» эффектом.

Как устроен Meniscus: кратко по коду

Основной компонент — <Glass> из пакета meniscus. В простом случае выглядит так:

import { Glass } from 'meniscus';

<Glass radius="capsule" interactive>
  <button>Search</button>
</Glass>

radius задаёт форму рамки (capsule — овальная), а interactive позволяет взаимодействовать с вложенным элементом. Внутри можно рендерить кнопки, табы, формы — библиотека поддерживает нативные controls и кастомные UI-элементы.

За визуал отвечает WebGL-шейдер, который:

В демо можно менять профиль линзы, угол падения света, индекс преломления, накладывать слои с текстом или видео — всё живо реагирует.

Поддержка браузеров и fallback

Meniscus честно заявляет, что пока полноценное преломление работает только в Chromium-подобных браузерах (Chrome, Edge). Там WebGL и современные API позволяют делать real-time преломление живого DOM-содержимого.

Safari и Firefox пока не могут так же свободно работать с DOM за стеклом, поэтому для них есть fallback:

Это сделано через SSR: при серверном рендере компонент показывает frosted glass, а после гидратации в браузере переключается на сложный вариант, если браузер поддерживает. При этом стили импортировать не нужно — всё self-contained.

Такой подход честен и полезен, т.к. не ломает UX в неподдерживаемых браузерах, но и не теряет эффекта там, где можно.

Где Meniscus круче привычных решений

Ограничения и подводные камни

Пример: интерактивная линза с изменяемым индексом преломления

Я попробовал сделать на базе Meniscus простую линзу, которая меняет коэффициент преломления при наведении мыши — чтобы визуально выделять часть страницы.

import React, { useState } from 'react';
import { Glass } from 'meniscus';

export default function InteractiveLens() {
  const [refrIndex, setRefrIndex] = useState(1.5);

  return (
    <Glass 
      radius="capsule" 
      interactive 
      indexOfRefraction={refrIndex}
      style={{ width: 200, height: 100 }}
      onMouseEnter={() => setRefrIndex(2)}
      onMouseLeave={() => setRefrIndex(1.5)}
    >
      <button>Search</button>
    </Glass>
  );
}

Такое поведение даёт subtle, но заметный эффект усиления искажения. При этом кнопка остаётся интерактивной.

Итоги и рекомендации

Meniscus — отличный эксперимент для тех, кто хочет вывести UI-эффекты стекла на новый уровень, с реальной физикой преломления. Это не просто красивый фильтр, а попытка сделать glassmorphism с оптической точностью.

Кому стоит попробовать:

Где осторожнее:

Дальше можно поиграться с параметрами линзы, попробовать интегрировать с агентами (agentic workflows) для динамического управления эффектами, или комбинировать с RAG-стратегиями, где визуальный feedback помогает в работе с AI.

Ссылки:

Если любите прокачивать UI с помощью реальных физических моделей — Meniscus стоит в списке экспериментов. Но не ждите, что он заменит привычные blur-эффекты на всех устройствах прямо сейчас.


Попробуй сам: Cursor — AI-редактор для разработчиков.


Источник: https://www.reddit.com/r/reactjs/comments/1wouf7j/meniscus_react_glass_that_refracts_the_page_using/