Shimmer

Утилиты для добавления эффекта мерцания к текстовым элементам.

buridan add shimmer

Утилита shimmer полностью состоит из CSS и основана на shadcn/shimmer. Никаких расширений для rxconfig.py не требуется, поскольку он использует синтаксис Tailwind v4.

Если ваш проект был настроен с использованием buridan init, мерцание у вас уже есть. Он поставляется с пакетом buridan, который CLI импортирует в ваш глобальный файл CSS.

В противном случае установите пакет buirdan:

uv run buridan init

Вы также можете скопировать и вставить источник shimmer непосредственно в файл globals.css. Убедитесь, что вы также включили правильный импорт, например @tailwind utilities; в верхней части CSS-файла.

@property --shimmer-angle {
    syntax: "<angle>";
    inherits: true;
    initial-value: 20deg;
}
@property --shimmer-image {
    syntax: "*";
    inherits: false;
}
@property --shimmer-text-fill {
    syntax: "*";
    inherits: false;
}

@theme inline {
    @keyframes tw-shimmer {
        from {
            background-position: 100% 0;
        }
        to {
            background-position: 0 0;
        }
    }
}

@utility shimmer {
    --_spread: var(--shimmer-spread, calc(3ch + 40px));
    --_base: currentColor;
    --_highlight: var(
        --shimmer-color,
        oklch(from currentColor l c h / calc(alpha* 0.2))
    );

    background-image: var(
        --shimmer-image,
        linear-gradient(
            calc(90deg + var(--shimmer-angle)),
            var(--_base) calc(50% - var(--_spread)),
            color-mix(in oklch, var(--_highlight), var(--_base) 50%)
                calc(50% - var(--_spread) * 0.5),
            var(--_highlight) 50%,
            color-mix(in oklch, var(--_highlight), var(--_base) 50%)
                calc(50% + var(--_spread) * 0.5),
            var(--_base) calc(50% + var(--_spread))
        )
    );
    background-repeat: no-repeat;
    background-size: calc(200% + var(--_spread) * 2) 100%;
    background-position: 0 0;
    background-clip: text;
    -webkit-background-clip: text;
    -webkit-text-fill-color: var(--shimmer-text-fill, transparent);
    animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;

    @variant dark {
        --_highlight: var(
            --shimmer-color,
            oklch(
                from currentColor max(0.8, calc(l + 0.4)) c h /
                    calc(alpha + 0.4)
            )
        );
    }

    &:where([dir="rtl"], [dir="rtl"] *) {
        animation-direction: reverse;
    }
}

@utility shimmer-once {
    animation-iteration-count: 1;
}

@utility shimmer-reverse {
    animation-direction: reverse;
}

@utility shimmer-none {
    --shimmer-image: none;
    --shimmer-text-fill: currentColor;
}

@utility shimmer-color-* {
    --shimmer-color: --value(--color, [color]);
    --shimmer-color: color-mix(
        in oklch,
        --value(--color, [color]) calc(--modifier(integer) * 1%),
        transparent
    );
}

@utility shimmer-duration-* {
    --shimmer-duration: calc(--value(integer) * 1ms);
}

@utility shimmer-spread-* {
    --shimmer-spread: calc(var(--spacing) * --value(integer));
    --shimmer-spread: --value([length], [percentage]);
}

@utility shimmer-angle-* {
    --shimmer-angle: calc(--value(integer) * 1deg);
}

@media (prefers-reduced-motion: reduce) {
    .shimmer {
        animation: none;
        background-image: none;
        -webkit-text-fill-color: currentColor;
    }
}

Использование

Класс Стили
shimmer background-clip: text;
animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;
shimmer-once animation-iteration-count: 1;
shimmer-reverse animation-direction: reverse;
shimmer-none --shimmer-image: none;
--shimmer-text-fill: currentColor;
shimmer-color-<color> --shimmer-color: <color>;
shimmer-color-[<value>] --shimmer-color: <value>;
shimmer-color-<color>/<pct> --shimmer-color: color-mix(in oklch, <color> <pct>, transparent);
shimmer-duration-<number> --shimmer-duration: calc(<number> * 1ms);
shimmer-spread-<number> --shimmer-spread: calc(var(--spacing) * <number>);
shimmer-spread-[<value>] --shimmer-spread: <value>;
shimmer-angle-<number> --shimmer-angle: calc(<number> * 1deg);

Добавьте мерцание к текстовому элементу.

rx.el.p("Generating response", class_name="shimmer text-muted-foreground w-fit")

Эффект — чистый CSS. Текст окрашен background-clip: text, и выделение плавно перемещается по нему.

Примечание. Если утилита shimmer не работает должным образом, попробуйте добавить w-fit к стилю текста, поскольку это гарантирует, что анимация не будет превышать ширину, наследующую текст.

Цвет

Используйте shimmer-color-<color>, чтобы явно установить цвет выделения. Он принимает цвета темы с дополнительным модификатором непрозрачности или любое произвольное значение цвета.

Error: Reference Target 'мерцающий_цвет' not found

Продолжительность

Используйте shimmer-duration-<number>, чтобы установить продолжительность одной развертки в миллисекундах. По умолчанию используется 2000, т. е. 2s.

Error: Reference Target 'продолжительность_мерцания' not found

Распространение

Используйте shimmer-spread-<number>, чтобы установить ширину полосы выделения с помощью шкалы интервалов. По умолчанию используется calc(3ch + 40px): фиксированная база плюс термин 3ch, который масштабируется в зависимости от размера шрифта.

Generating response...

shimmer-spread-4

Generating response...

shimmer-spread-24

Угол

Используйте shimmer-angle-<number>, чтобы установить наклон полосы подсветки в градусах. По умолчанию — 20.

Error: Reference Target 'мерцающий_угол' not found

Реверс

Используйте shimmer-reverse, чтобы сдвинуть свет в противоположном направлении.

Generating response...

shimmer reverse

Играть один раз

Используйте shimmer-once для воспроизведения одной развертки вместо зацикливания, что полезно в качестве индикатора завершения потоковой передачи. Соедините его с shimmer-duration-<number>, чтобы контролировать продолжительность развертки.

Generating response...

rx.el.p("Response Generated", class_name="shimmer shimmer-duration-1100 shimmer-once")

Отключение мерцания

Используйте shimmer-none, чтобы отключить эффект и нормально отобразить текст. Он работает в любом порядке классов, поэтому типичное использование — адаптивное или с сохранением состояния.

Generating response...

shimmer md:shimmer-none