npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@sdevs/react-glow

v1.1.6

Published

Add a mouse-tracing glow effect to React components

Downloads

20

Readme

React glow

Add a mouse-tracing glow effect to React components.

gif of glow effect

The glow effect will only work using the mouse as the pointer. Touch events will not trigger it.

See it live on codaworks.com.

Installation

Install the package with npm:

npm i @sdevs/react-glow

Usage

Wrap any number of <Glow> components in a <GlowCapture> which will be used to track the mouse location.

<GlowCapture>
  <span>This won't glow</span>
  <Glow color='purple'>
    <span className='text-black glow:text-glow/50 glow:bg-red-100'>
      This will glow purple when the mouse is passed over
    </span>
  </Glow>
</GlowCapture>

Children of <Glow> can style themselves how to look when glowing. You might choose to leave some children unchanged, or highlight them with the glow: variant style.

The value of color will be available as a CSS variable --glow-color, as well as the Tailwind glow color. You can pass any valid CSS color, including hsl() values etc. Of course, you might choose to use any other color; you can leave out the color prop entirely.

Tailwind

Add the tailwind plugin to unlock the glow: variant and glow color

tailwind.config.js

module.exports = {
  ...
  plugins: [
    require('@sdevs/react-glow/tailwind')
  ]
}

As with all colors in Tailwind, you may add opacity by appending a percentage after the color, such as bg-glow/20 for 20% opacity.

Vanilla CSS

You can style the glow effect with vanilla CSS:

<GlowCapture>
  <span>This won't glow</span>
  <Glow color='hsl(338.69 100% 48.04%)'>
    <span className='glowable-text'>
      This will glow pink when the mouse is passed over
    </span>
  </Glow>
</GlowCapture>
.glowable-text {
  color: black;
}

[glow] .glowable-text {
  color: var(--glow-color);
}

How does it work?

The <Glow> component clones the children tree. The cloned tree is then stacked on top of the original tree.

The overlay tree is transparent, and we only reveal parts using a CSS radial gradient mask. The mask position is updated by tracking the mouse position. When you use the glow: variant or [glow] attribute selector, it only targets the overlay.

In order to not block mouse events, the overlay is set to pointer-events: none.

We use the <GlowCapture> to track the mouse; the <Glow> itself also keeps track of its position inside the <GlowCapture>.

Best practices

diagram

The fact that we clone the children tree has some implications that is important to keep in mind:

  • <Glow> children should never have side effects. Since we duplicate the children, the effects will run twice.
  • Keep the <Glow> children small. Use a separate <Glow> for each logical set of children (such as a single card).
  • Don't apply layout styles to glow:. Keep the glow styles to just visuals, such as colors, opacity, and a slight scale might also work sometimes.
  • Use callback refs: When you pass a ref to a glow child, the cloned version will "steal" the ref. Use a callback ref, and check if it is already set before assigning.
  • It might be challenging to get it to correctly work with forms, especially if you have required fields. The cloned fields will also be marked as required and failing the validation.
  • Use a single <GlowCapture> for a group of related glows. This allows you to get an overflowing glow effect when the mouse is between 2 glows.
  • Apply some padding between the capture and the children, to show the glow even when you leave the <Glow> instead of abruptly cutting off the effect.

Attribution

Fork of this package Inspired by this tweet.