UNPKG

simple-liquid-glass

Version:

A React component for creating liquid glass morphism effects with customizable distortion and blur

234 lines (186 loc) 7.98 kB
# Simple Liquid Glass A tiny, zero-dependency React component that renders a beautiful “liquid” glassmorphism panel using an SVG displacement map. It supports chromatic aberration, adjustable saturation, gradient borders, a configurable semi‑transparent glass color, and automatic text color based on the surrounding background. ![npm version](https://img.shields.io/npm/v/simple-liquid-glass) ![license](https://img.shields.io/npm/l/simple-liquid-glass) ![bundle size](https://deno.bundlejs.com/badge?q=simple-liquid-glass) ## Features - **Liquid glassmorphism** with SVG displacement - **Auto text color**: detects dark/light backgrounds to keep text legible - **Custom glass color**: accepts only semi‑transparent colors (`rgba`, `hsla`, hex with alpha) - **Chromatic dispersion** and **blur** with fine‑grained controls - **Adjustable saturation** to boost or tame color vibrancy - **Chromatic aberration intensity** control to tune the vividness of the edge colors - **Gradient border** with masking - **Responsive** and content‑agnostic - **TypeScript** and tree‑shakable builds (ESM and CJS) ## Installation ```bash npm install simple-liquid-glass ``` or with yarn: ```bash yarn add simple-liquid-glass ``` ## Usage ### Basic Usage ```jsx import React from 'react'; import { LiquidGlass } from 'simple-liquid-glass'; function App() { return ( <div style={{ width: '300px', height: '200px' }}> <LiquidGlass autoTextColor glassColor="rgba(255,255,255,0.4)"> <div style={{ padding: '20px' }}> <h2>Your Content Here</h2> <p>This content has a liquid glass effect!</p> </div> </LiquidGlass> </div> ); } ``` ### Advanced Usage with Custom Settings ```jsx import React from 'react'; import { LiquidGlass } from 'simple-liquid-glass'; function App() { return ( <div style={{ width: '400px', height: '300px' }}> <LiquidGlass mode="custom" scale={200} radius={20} border={0.1} lightness={60} displace={0.5} alpha={0.8} blur={10} dispersion={30} frost={0.2} glassColor="rgba(255,255,255,0.4)" autoTextColor textOnDark="#ffffff" textOnLight="#111111" forceTextColor borderColor="rgba(255, 255, 255, 0.5)" className="my-glass-container" style={{ boxShadow: '0 8px 32px rgba(0, 0, 0, 0.1)' }} > <div style={{ padding: '30px' }}> <h1>Custom Glass Effect</h1> <p>Fully customized liquid glass morphism</p> </div> </LiquidGlass> </div> ); } ``` ### Preset Mode The component comes with a beautiful preset that works out of the box: ```jsx <LiquidGlass mode="preset"> <YourContent /> </LiquidGlass> ``` Note: In `preset` mode, incoming props still override the preset defaults (e.g., `scale`, `radius`, `blur`, etc.). On iOS, when `iosBlurMode` is `'auto'`, a minimal blur (`iosMinBlur`, default 2px) is applied even if `blur` is 0 to ensure a visible fallback effect. ## Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `children` | `ReactNode` | - | Content to display inside the glass effect | | `mode` | `'preset' \| 'custom'` | `'preset'` | Use preset values or custom configuration | | `scale` | `number` | `160` | Scale of the displacement effect (-360 to 360) | | `radius` | `number` | `50` | Border radius of the glass effect | | `border` | `number` | `0.05` | Border thickness (0 to 0.5) | | `lightness` | `number` | `53` | Lightness of the glass (0 to 100) | | `displace` | `number` | `5` | Displacement blur amount (0 to 10) | | `alpha` | `number` | `0.9` | Alpha transparency (0 to 1) | | `blur` | `number` | `0` | Blur amount for the glass effect | | `dispersion` | `number` | `50` | Chromatic dispersion amount | | `saturation` | `number` | `140` | Color saturation multiplier (%) applied via CSS `saturate()` | | `aberrationIntensity` | `number` | `2` | Multiplier for chromatic aberration (red/blue separation) | | `frost` | `number` | `0.1` | Frost effect intensity (0 to 1) | | `borderColor` | `string` | `'rgba(120, 120, 120, 0.7)'` | Border color in CSS format | | `glassColor` | `string` | – | Semi‑transparent glass color (`rgba`, `hsla`, `hsl(.../a)`, `#RGBA`, `#RRGGBBAA`). Invalid/opaque values fall back to frost‑based default | | `autoTextColor` | `boolean` | `true` | Automatically detect background luminance and set text color | | `textOnDark` | `string` | `'#ffffff'` | Text color used when background is detected as dark | | `textOnLight` | `string` | `'#111111'` | Text color used when background is detected as light | | `forceTextColor` | `boolean` | `false` | Force the computed text color on all descendants (`!important`) to override nested styles | | `className` | `string` | - | Additional CSS class names | | `style` | `CSSProperties` | - | Additional inline styles | ## Examples ### Card with Glass Effect ```jsx <div className="card-container" style={{ width: '350px', height: '200px', background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' }}> <LiquidGlass radius={15} frost={0.15} autoTextColor glassColor="rgba(255,255,255,0.35)"> <div style={{ padding: '24px', height: '100%' }}> <h3 style={{ marginBottom: '12px' }}> Glass Card </h3> <p> This is a beautiful glass morphism card with liquid distortion effects. </p> </div> </LiquidGlass> </div> ``` ### Overlay Effect ```jsx <div style={{ position: 'relative', width: '100%', height: '400px' }}> <img src="background.jpg" alt="Background" style={{ width: '100%', height: '100%', objectFit: 'cover' }} /> <div style={{ position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '300px', height: '150px' }}> <LiquidGlass autoTextColor glassColor="rgba(255,255,255,0.4)"> <div style={{ padding: '20px', textAlign: 'center' }}> <h2>Overlay Content</h2> <p>Glass effect over image</p> </div> </LiquidGlass> </div> </div> ``` ## Browser Support - Chrome (latest) - Firefox (latest) - Safari (latest) - Edge (latest) The component leverages modern CSS (`backdrop-filter`) and SVG filters. Older browsers may not support all effects. ## Performance Tips 1. The component uses `ResizeObserver` to adapt to size changes efficiently 2. SVG filters are hardware-accelerated in modern browsers 3. For best performance, avoid animating the glass parameters rapidly 4. Use the `preset` mode for optimal default settings ## Accessibility - `autoTextColor` uses computed styles from the nearest opaque ancestor to decide between `textOnDark` and `textOnLight`. This helps maintain readable contrast automatically. You can set `forceTextColor` to enforce the computed color on deeply nested content. ## Storybook Run a live playground: ```bash npm run storybook ``` Switch the Backgrounds toolbar between light/dark to see text color adapt in real time. ## License MIT © [lucaperullo] ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. 1. Fork the repository 2. Create your feature branch (`git checkout -b feature/AmazingFeature`) 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## Support If you find this package helpful, please consider giving it a star on GitHub! ## Keywords react, react component, react ui, glassmorphism, glass morphism, liquid glass, liquid-glass, glass effect, frosted glass, frosted-glass, blur, blur effect, backdrop-filter, svg filter, displacement, displacement map, chromatic aberration, ui effects, card, overlay, glass ui, glass card, glass panel, glassmorphism react For issues and feature requests, please [create an issue](https://github.com/lucaperullo/simple-liquid-glass/issues).