# Eclipse

> The next appearance crosses the page like an eclipse.

- Type: Component (actions)
- Access: Free, open source
- Page: https://uiarc.dev/components/theme-switch-eclipse
- Markdown: https://uiarc.dev/components/theme-switch-eclipse/markdown
- Registry item: https://uiarc.dev/r/theme-switch-eclipse.json
- Source file: `registry/components/theme-switch/theme-switch.tsx`
- Dependencies: motion, lucide-react
- Keywords: theme, appearance, motion, react theme switch, eclipse theme transition, dark mode toggle animation, view transition dark mode, theme sweep

## When to use

- Marketing or showcase pages where the theme change should feel like an event.
- Layouts where a directional sweep across the page reads naturally.

## When not to use

- Use theme-switch-rise for everyday product chrome where a calmer change fits.
- Use theme-switch-split when the button sits in the center and direction should not matter.

## Installation

### CLI

Run one of these in a project set up with `shadcn init`:

```bash
npx shadcn@latest add @uiarc/theme-switch-eclipse
pnpm dlx shadcn@latest add @uiarc/theme-switch-eclipse
yarn dlx shadcn@latest add @uiarc/theme-switch-eclipse
bunx --bun shadcn@latest add @uiarc/theme-switch-eclipse
```

The `@uiarc` name needs `"registries": { "@uiarc": "https://uiarc.dev/r/{name}.json" }` in `components.json`. Without it, use the full URL:

```bash
npx shadcn@latest add https://uiarc.dev/r/theme-switch-eclipse.json
```

### Manual

1. Install the dependencies:

```bash
npm install motion lucide-react
```

2. Copy the source into your project. Main file: `registry/components/theme-switch/theme-switch.tsx`

   The source is in the registry item: https://uiarc.dev/r/theme-switch-eclipse.json

3. Arc imports use the `@/` alias for `registry/` and `lib/`. Keep the same folders or update the import paths.

## Usage

```tsx
import { ThemeSwitch } from "@/registry/components/theme-switch/theme-switch";

<ThemeSwitch
  theme={theme}
  variant="eclipse"
  onThemeChange={(next, variant, trigger) => runThemeTransition(next, variant, trigger)}
/>
```

## API reference

### ThemeSwitch

A secondary Button that swaps a sun and moon icon and reports the next theme. The page transition itself is yours to run.

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `theme` (required) | `"light" \| "dark"` | – | The current theme. Drives the icon and aria-pressed. |
| `onThemeChange` (required) | `(next: Theme, variant: ThemeSwitchVariant, trigger: HTMLElement) => void` | – | Called on press with the opposite theme, the variant, and the button, so the page transition can start from it. |
| `variant` | `"reveal" \| "eclipse" \| "split" \| "rise"` | `"reveal"` | Names the page transition and sets the small icon nudge that matches it. |
| `label` | `string` | – | Accessible name. Defaults to "Switch to dark mode" or "Switch to light mode". |
| `iconOnly` | `boolean` | `false` | Hides the "Switch theme" text and renders a 38px square button. |

## Keyboard interactions

| Keys | Action |
| --- | --- |
| Enter / Space | Toggles the theme. |

## Accessibility

- Same button as theme-switch: aria-pressed reflects dark mode and the label names the next theme.
- Keep the eclipse sweep off for reduced motion and swap the theme directly.

## Motion

- variant="eclipse": the next appearance crosses the page like an eclipse; run it in onThemeChange with a view transition.
- The icon shifts 2px left in dark mode to lean into the sweep.
- Reduced motion removes the nudge and swaps the icon with a fade.

## Responsive behavior

- The labelled button fits a desktop top bar; pass iconOnly for a fixed 38px square on narrow headers and mobile.
- Hover styles apply only on hover-capable fine pointers, so touch taps do not leave a stuck hover state.

## Performance

- The button itself is tiny: one icon swap on a spring, and the first theme after hydration applies without animating.
- The page transition is yours; a full-page view transition snapshots the whole document, so keep it short and skip it for reduced motion.

## Notes for AI

- Select with variant="eclipse". The prop only styles the icon nudge and is passed back to onThemeChange; the page animation is your code.
- Pick eclipse for a dramatic, directional change on marketing or showcase pages; rise suits product chrome better.

## Related

- [Theme switcher](https://uiarc.dev/components/theme-switch/markdown): Four smooth ways to move between light and dark appearance.
- [Split](https://uiarc.dev/components/theme-switch-split/markdown): The next appearance opens from a slim center seam.
- [Rise](https://uiarc.dev/components/theme-switch-rise/markdown): The next appearance rises into place.

## Guidance for AI tools

Eclipse: The next appearance crosses the page like an eclipse. Follow the declared prop types and do not invent props. Keep keyboard access, reduced motion support, and both light and dark themes intact when adapting it.

Full library index: https://uiarc.dev/llms.txt
