# tunnel-rat

> non gratum anus rodentum

Latest version **0.1.2** (published 2023-04-04) · MIT license · 0 weekly downloads

## Install

```sh
npm install tunnel-rat
pnpm add tunnel-rat
yarn add tunnel-rat
bun add tunnel-rat
```

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.2 |
| Published | 2023-04-04 |
| First published | 2022-01-21 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 1 |
| Unpacked size | 25.7 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 447 |
| Author | Paul Henschel |
| Maintainers | drcmda |
| Keywords | react, portal, tunnel |

## Links

- npm: https://www.npmjs.com/package/tunnel-rat
- Repository: https://github.com/pmndrs/tunnel-rat
- Homepage: https://github.com/pmndrs/tunnel-rat#readme
- Issues: https://github.com/pmndrs/tunnel-rat/issues
- npm.io page: https://npm.io/package/tunnel-rat

## Dependencies (1)

- [zustand](https://npm.io/package/zustand.md) ^4.3.2

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 0.1.2 (latest) — 2023-04-04
- 0.1.1 — 2023-02-28
- 0.1.0 — 2022-09-12
- 0.0.4 — 2022-06-30
- 0.0.3 — 2022-03-16
- 0.0.2 — 2022-01-21
- 0.0.1 — 2022-01-21
- 0.0.0 — 2022-01-21

## README

<p align="center">
    <img src="https://user-images.githubusercontent.com/1061/185432665-ddfe409a-d399-4059-bd2f-bfefc2a97db1.png" alt="Tunnel Rat" height="600">
</p>

[![Version](https://img.shields.io/npm/v/tunnel-rat?style=for-the-badge)](https://www.npmjs.com/package/tunnel-rat)
[![Downloads](https://img.shields.io/npm/dt/tunnel-rat.svg?style=for-the-badge)](https://www.npmjs.com/package/tunnel-rat)
[![Bundle Size](https://img.shields.io/bundlephobia/min/tunnel-rat?label=bundle%20size&style=for-the-badge)](https://bundlephobia.com/result?p=tunnel-rat)

## Tunnel Rat

- Digs tunnels for React elements to **go in** and **appear somewhere else**!
- Works across **separate renderers** &ndash; use it to easily **render HTML elements from within your @react-three/fiber application**!
- Squeak! 🐀

## Examples & Sandboxes

- https://codesandbox.io/s/basic-demo-forked-kxq8g
- https://codesandbox.io/s/tunnel-rat-demo-ceupre

## Usage

Create a tunnel:

```tsx
import tunnel from 'tunnel-rat'
const t = tunnel()
```

Use the tunnel's `In` component to send one or more elements into the tunnel:

```tsx
<t.In>
  <h1>Very cool!</h1>
  <p>These will appear somewhere else!</p>
</t.In>
```

Somewhere else, use the tunnel's `Out` component to render them:

```tsx
<t.Out />
```

## Examples

This example describes a simple React app that has both a HTML UI as well as a @react-three/fiber 3D scene. Each of these is rendered using separate React renderers, which traditionally makes emitting HTML from within the Canvas a bit of a pain; but thanks to tunnel-rat, this is now super easy!

```jsx
import { Canvas } from '@react-three/fiber'
import tunnel from 'tunnel-rat'

/* Create a tunnel. */
const ui = tunnel()

const App = () => (
  <div>
    <div id="ui">
      {/* Anything that goes into the tunnel, we want to render here. */}
      <ui.Out />
    </div>

    {/* Here we're entering the part of the app that is driven by
    @react-three/fiber, where all children of the <Canvas> component
    are rendered by an entirely separate React renderer, which would
    typically not allow the use of HTML tags. */}
    <Canvas>
      {/* Let's send something into the tunnel! */}
      <ui.In>
        <p>Hi, I'm a cube!</p>
      </ui.In>

      <mesh>
        <boxGeometry />
        <meshBasicMaterial />
      </mesh>

      {/* You can send multiple things through the tunnel, and
      they will all show up in the order that you've defined them in! */}
      <ui.In>
        <p>And I'm a sphere!</p>
      </ui.In>

      <mesh>
        <sphereGeometry />
        <meshBasicMaterial />
      </mesh>
    </Canvas>
  </div>
)
```

Of course, the whole thing also works the other way around:

```jsx
import { Canvas } from '@react-three/fiber'
import tunnel from 'tunnel-rat'

/* Create a tunnel. */
const three = tunnel()

const App = () => (
  <div>
    <div id="ui">
      {/* Let's beam something into the R3F Canvas! */}
      <three.In>
        <mesh>
          <sphereGeometry />
          <meshBasicMaterial />
        </mesh>
      </three.In>
    </div>

    <Canvas>
      {/* Render anything sent through the tunnel! */}
      <three.Out />
    </Canvas>
  </div>
)
```

---
_Source: https://npm.io/package/tunnel-rat · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
