# Gradient

> Atom — orn-ui

> ⚠️ Requiere <UIProvider>: Este componente (como todos los de orn-ui) debe renderizarse dentro de un ancestro <UIProvider>, o lanza un error en runtime. See https://orn-ui-docs.vercel.app/getting-started.md

> Corre en Expo SDK 54, 55, 56 y 57, y en React Native puro >=0.81 con react >=19.1. Sin módulos nativos — funciona en Expo Go, sin prebuild.

## Instalación

Instala solo este componente (copia el código fuente a tu proyecto, sin dependencia npm)
```bash
npx orn-ui add gradient
```

O instala el paquete completo e impórtalo
```tsx
pnpm add orn-ui
import { Gradient } from 'orn-ui/gradient';
```

Depende de: core (theme + icons)

## Variantes

### direction: vertical / horizontal

```tsx
<View style={{ width: '100%', gap: 12 }}>
  <Gradient colors={['#004cef', '#00cae1']} style={BOX} />
  <Gradient colors={['#004cef', '#00cae1']} direction="horizontal" style={BOX} />
</View>
```

### direction: diagonal / diagonal-reverse

```tsx
<VariantRow>
  <Gradient colors={['#7b2ff7', '#f107a3']} direction="diagonal" style={TILE} />
  <Gradient colors={['#7b2ff7', '#f107a3']} direction="diagonal-reverse" style={TILE} />
</VariantRow>
```

### several stops — one segment per pair of colors

```tsx
<Gradient colors={['#0f9b0f', '#00cae1', '#004cef', '#7b2ff7']} direction="horizontal" style={BOX} />
```

### steps: 3 (visible banding) vs 24 (default)

```tsx
<View style={{ width: '100%', gap: 12 }}>
  <Gradient colors={['#101014', '#00cae1']} steps={3} style={BOX} />
  <Gradient colors={['#101014', '#00cae1']} style={BOX} />
</View>
```

### children stay tappable — the gradient never takes the touch

```tsx
<Gradient
  colors={['#004cef', '#00cae1']}
  direction="diagonal"
  style={{ ...BOX, alignItems: 'center', justifyContent: 'center', gap: 8 }}
>
  <Body style={{ color: colors.white }}>Content sits on top</Body>
  <Button title="Press me" variant="secondary" onPress={() => {}} />
</Gradient>
```

## Código completo del demo

```tsx
const variants: VariantDef[] = [
  {
    label: 'direction: vertical / horizontal',
    content: (
      <View style={{ width: '100%', gap: 12 }}>
        <Gradient colors={['#004cef', '#00cae1']} style={BOX} />
        <Gradient colors={['#004cef', '#00cae1']} direction="horizontal" style={BOX} />
      </View>
    ),
  },
  {
    label: 'direction: diagonal / diagonal-reverse',
    content: (
      <VariantRow>
        <Gradient colors={['#7b2ff7', '#f107a3']} direction="diagonal" style={TILE} />
        <Gradient colors={['#7b2ff7', '#f107a3']} direction="diagonal-reverse" style={TILE} />
      </VariantRow>
    ),
  },
  {
    label: 'several stops — one segment per pair of colors',
    content: <Gradient colors={['#0f9b0f', '#00cae1', '#004cef', '#7b2ff7']} direction="horizontal" style={BOX} />,
  },
  {
    label: 'steps: 3 (visible banding) vs 24 (default)',
    content: (
      <View style={{ width: '100%', gap: 12 }}>
        <Gradient colors={['#101014', '#00cae1']} steps={3} style={BOX} />
        <Gradient colors={['#101014', '#00cae1']} style={BOX} />
      </View>
    ),
  },
  {
    label: 'children stay tappable — the gradient never takes the touch',
    content: (
      <Gradient
        colors={['#004cef', '#00cae1']}
        direction="diagonal"
        style={{ ...BOX, alignItems: 'center', justifyContent: 'center', gap: 8 }}
      >
        <Body style={{ color: colors.white }}>Content sits on top</Body>
        <Button title="Press me" variant="secondary" onPress={() => {}} />
      </Gradient>
    ),
  },
];
```

## Props

| Nombre | Tipo | Por defecto | Descripción |
|---|---|---|---|
| `colors` | `string[]` | — | Paradas del degradado. Uno solo pinta plano; ninguno no pinta nada. |
| `direction?` | `'vertical' \| 'horizontal' \| 'diagonal' \| 'diagonal-reverse'` | vertical | 'vertical' va de arriba a abajo, 'horizontal' de izquierda a derecha, 'diagonal' de arriba-izquierda a abajo-derecha y 'diagonal-reverse' de arriba-derecha a abajo-izquierda. |
| `steps?` | `number` | 24 | Bandas por tramo (un tramo = un par de colores consecutivos). Más bandas = transición más suave y más vistas en el árbol. |
| `children?` | `ReactNode` | — | Contenido por encima del degradado. |
| `style?` | `StyleProp<ViewStyle>` | — | — |
