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

@dorsk/kakehashi

v0.2.0

Published

Use real Svelte 5 components inside React. A thin bridge — mounts the actual compiled component, keeps its scoped CSS, passes React children through.

Readme

kakehashi

架け橋 — a bridge between two things.

Use real Svelte 5 components inside React. Not a port: the actual compiled component is mounted, so its scoped CSS, effects and internal state all behave exactly as they do in a Svelte app.

npm i -D @dorsk/kakehashi
import { toReact } from '@dorsk/kakehashi';
import ButtonSvelte from './Button.svelte';

const Button = toReact(ButtonSvelte, 'Button');

<Button variant="primary" onclick={save}>Save</Button>

Props stay reactive — updates mutate the component's props rather than remounting it — and React children are passed through as the default snippet.

Named snippets

A React element prop becomes a named snippet. A function prop is treated as an event handler unless you wrap it in snippet(), in which case the Svelte side can {@render name(...args)} and the function receives those arguments.

import { snippet, toReact } from '@dorsk/kakehashi';
import TabsSvelte from './Tabs.svelte';

const Tabs = toReact(TabsSvelte, 'Tabs');

<Tabs
  items={['One', 'Two']}
  item={snippet((label, i) => <span>{i + 1}. {label}</span>)}
  panel={<p>Panel content</p>}
/>

Which props are snippets is decided when the component mounts.

Your bundler must compile Svelte (.svelte and .svelte.js).

Why

Claude Design (claude.ai/design) renders React: its agent builds UI from components exposed on a global, as JSX. A Svelte design system has nothing to hand it — so /design-sync can only ship the styling layer, and the components end up hand-mirrored in React, which drifts from the originals immediately.

This bridge closes that gap. Wrap each Svelte export once and the design agent builds with the real components — same props, same scoped CSS, no second implementation to keep in sync.

Not handled yet

bind: two-way props, SSR.

License

MIT