open-index/open-npm huggingface dataset:
npm package: @replit/vite-plugin-dev-banner
Description: A Vite plugin that injects a development preview banner on `*.replit.dev` domains during development. The banner warns users that they're viewing a temporary development preview.
Latest version: 0.1.2

# @replit/vite-plugin-dev-banner

A Vite plugin that injects a development preview banner on `*.replit.dev` domains during development. The banner warns users that they're viewing a temporary development preview.

## Features

- **Development-only**: Only injects the banner when running in development mode (`vite serve`)
- **Domain-specific**: Only displays on `*.replit.dev` domains
- **Frame-aware**: Automatically hides when the app is embedded in an iframe
- **Persistent dismissal**: Users can close the banner and it stays closed using localStorage
- **Responsive design**: Adapts to mobile and desktop screens
- **Zero production impact**: No code is included in production builds

## Installation

```bash
npm install @replit/vite-plugin-dev-banner
# or
pnpm add @replit/vite-plugin-dev-banner
```

## Usage

Add the plugin to your `vite.config.ts`:

```typescript
import { defineConfig } from 'vite';
import { devBanner } from '@replit/vite-plugin-dev-banner';

export default defineConfig({
 plugins: [
    ...(process.env.NODE_ENV !== "production" &&
    process.env.REPL_ID !== undefined
      ? [
          await import("@replit/vite-plugin-dev-banner").then((m) =>
            m.devBanner(),
          ),
        ]
      : []),
    // other plugins
  ],
});
```

That's it! The banner will automatically appear when:
1. Running in development mode (`vite dev` or `vite serve`)
2. Accessing the app via a `*.replit.dev` domain
3. The app is not embedded in an iframe
4. The user hasn't previously dismissed the banner

## How it works

The plugin:
1. Serves a banner script at `/@vite-plugin-dev-banner/banner-script.js` via Vite's dev server
2. Injects a `<script>` tag in the HTML head that loads this script
3. The script checks the current domain and conditions before displaying the banner
4. Users can dismiss the banner, and this preference is stored in localStorage