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 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-native-lisse

v0.2.0

Published

React Native components and hooks for Lisse smooth corners

Readme

react-native-lisse

React Native components powered by Lisse. The package uses the DOM-free @lisse/core/path entrypoint, so its squircle, arc, superellipse, and clothoid paths match the web packages. On iOS, native children are clipped with an exact CAShapeLayer path. Android and unlinked iOS builds use the SVG mask fallback.

Install

npm install react-native-lisse @react-native-masked-view/masked-view react-native-svg
npx pod-install

The pod step is required for bare iOS projects. Expo projects can use the usual Expo-compatible installs for the two native peer dependencies.

npm install react-native-lisse
npx expo install @react-native-masked-view/masked-view react-native-svg

Component

import { Text } from "react-native";
import { SmoothCorners } from "react-native-lisse";

export function Card() {
  return (
    <SmoothCorners
      corners={{ radius: 24, smoothing: 0.6 }}
      innerBorder={{ width: 1, color: "#fff", opacity: 0.2 }}
      shadow={{
        offsetX: 0,
        offsetY: 8,
        blur: 16,
        spread: 0,
        color: "#000",
        opacity: 0.18,
      }}
      style={{ width: 300, padding: 24, backgroundColor: "#2563eb" }}
    >
      <Text style={{ color: "#fff" }}>Hello, squircle</Text>
    </SmoothCorners>
  );
}

style keeps normal React Native layout behavior. The renderer moves backgroundColor into the masked layer and splits outer layout styles from inner content styles, so padding and intrinsic content height continue to work. Uniform borderWidth, borderColor, and supported native shadow objects are converted when autoEffects is enabled. With autoEffects={false}, native border and shadow styles stay on the outer View; those platform effects use the native rounded-rectangle silhouette and may not match the Lisse curve exactly.

The component supports per-corner configuration, all four Lisse curve families, inner, middle, and outer borders, gradient borders, the six Lisse border styles, drop shadows, inner shadows, responsive layout, and forwarded View refs.

The default renderStrategy="auto" uses the native clip view on iOS when CocoaPods has linked it. Use renderStrategy="mask" to force the previous cross-platform renderer during migration or visual comparisons. renderStrategy="native" requests the native renderer but still falls back safely when it is unavailable.

Hook

React Native has no DOM element that a hook can mutate with clip-path, so the hook returns measured geometry instead:

const geometry = useSmoothCorners(
  { radius: 24, smoothing: 0.6 },
  { initialSize: { width: 200, height: 120 } },
);

return <View onLayout={geometry.onLayout}>{geometry.path}</View>;

The result contains width, height, path, ready, and onLayout. Use it with react-native-svg, Skia, or another custom renderer.

Platform notes

  • iOS and Android are supported. React Native Web should keep using @lisse/react, because @react-native-masked-view/masked-view does not support web.
  • iOS uses a CAShapeLayer mask for the content clip while SVG remains responsible for borders and shadows. This removes one MaskedView and SVG mask subtree from every ordinary smooth-corner container without approximating the Lisse curve.
  • Android defaults to androidRenderingMode="software", because the path changes when layout changes. A truly static card can opt into "hardware" for cheaper compositing.
  • Animated width, height, radius, or smoothing values need ordinary React updates so the JavaScript path can be regenerated. Reanimated worklet-only styles cannot update this component's SVG path by themselves.
  • as and asChild are DOM composition APIs and are intentionally absent. Wrap SmoothCorners in Pressable, or put a Pressable inside it.

Local verification

The automated suite covers core-path parity, layout measurement, style and effect extraction, edge-case geometry, component rendering, type declarations, and package exports.

npm install
npm run check
npm pack --dry-run