Low-data / Niebla overlay
Menos de 8 pulsos en los últimos 7 días. Velamos el dato para cuidar el anonimato y decimos cómo destrabarlo.
Niebla es la semana con pocos datos. En la app no se tapa nada: Inicio muestra un Note con la escena de niebla y los números atenuados (StatStrip muted), con el promedio marcado como provisorio. NieblaOverlay es el velo de la galería y hoy no se usa en la app. El umbral vigente es menos de 8 pulsos en los últimos 7 días, no 5. El producto puede mostrar un promedio provisorio si hay respuestas, sin presentar una tendencia firme. La capa visual no es un mecanismo de privacidad.
Instalación
npx shadcn@latest add https://design.moodinary.com/r/niebla-overlay.jsonimport { NieblaOverlay } from "@moodinary/ui/components/niebla-overlay";Ejemplos
Velo (galería)
Variante de la galería sin uso en la app. Si la usás, que el fondo sea decorativo: nunca tapes datos reales. El QR del diálogo es de ejemplo y no escanea.
Faltan respuestas para ver el clima
2.º B tiene 3 de los 8 pulsos que hacen falta en 7 días. Compartí el link o el QR con el grupo.
Código
import { Button } from "@moodinary/ui/components/button";
import { ClimaChip } from "@moodinary/ui/components/clima-chip";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@moodinary/ui/components/dialog";
import { CloudFog, QrCodeIcon } from "@moodinary/ui/components/icons";
import { NieblaOverlay } from "@moodinary/ui/components/niebla-overlay";
import { QrShare } from "@moodinary/ui/components/qr-share";
function Decoy() {
return (
<div className="grid gap-2">
{[70, 45, 85, 55, 65].map((w) => (
<div
className="h-3 rounded bg-line-2"
key={w}
style={{ width: `${w}%` }}
/>
))}
</div>
);
}
export default function NieblaExample() {
return (
<NieblaOverlay
action={
<Dialog>
<DialogTrigger render={<Button size="sm" />}>
<QrCodeIcon />
Compartir pulso
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Compartir el pulso de 2.º B</DialogTitle>
<DialogDescription>
Mandá el link o mostrá el QR al grupo.
</DialogDescription>
</DialogHeader>
<QrShare
extra={
<span className="text-[12px] text-ink-3">
QR de ejemplo, no escaneable.
</span>
}
onPrint={() => window.print()}
qr={
<QrCodeIcon
aria-label="QR de ejemplo, no escaneable"
className="text-ink"
role="img"
/>
}
title="Pulso de 2.º B"
url="https://pulses.moodinary.com/ejemplo-2b"
/>
</DialogContent>
</Dialog>
}
badge={<ClimaChip icon={<CloudFog />} label="Niebla" />}
className="min-h-[260px]"
description="2.º B tiene 3 de los 8 pulsos que hacen falta en 7 días. Compartí el link o el QR con el grupo."
title="Faltan respuestas para ver el clima"
>
<Decoy />
</NieblaOverlay>
);
}Niebla en Inicio
Como en la app: aviso con la escena de niebla y el texto real, y debajo las tres métricas atenuadas con el promedio provisorio a la vista. Sin tendencia hasta llegar a 8 pulsos. Los pulsos no tienen una frecuencia obligatoria.
Código
import { Note } from "@moodinary/ui/components/note";
import { PixelScene } from "@moodinary/ui/components/pixel-scene";
import { Stat, StatStrip } from "@moodinary/ui/components/stat";
/*
* Niebla real de Inicio (inicio-hero.tsx): un aviso con la escena de niebla que acompaña,
* nunca tapa los números. El promedio queda a la vista como provisorio.
*/
export default function NieblaProvisional() {
return (
<div className="grid w-full gap-3">
<Note>
<PixelScene
className="shrink-0"
label="Niebla"
scene="niebla"
size="sm"
still
/>
<span>
Con 5 pulsos no alcanza para sacar conclusiones. Cuando haya 8 o más,
te mostramos la tendencia.
</span>
</Note>
<StatStrip className="w-full" muted>
<Stat detail="provisorio" label="Nivel promedio" value="3,2" />
<Stat
detail="necesitamos 8 para leer la semana"
label="Pulsos"
value="5"
/>
<Stat
detail={
<>
Sin meta semanal ·{" "}
<a className="underline underline-offset-2" href="#definir">
definir
</a>
</>
}
label="Pulsos vs meta"
value="—"
/>
</StatStrip>
</div>
);
}Props
NieblaOverlay
| Prop | Tipo | Default | Descripción |
|---|---|---|---|
| title | ReactNode | - | Motivo obligatorio, renderizado como h4. |
| badge | ReactNode | - | Etiqueta de Niebla, normalmente ClimaChip. |
| description | ReactNode | - | Muestra, período y próximo paso. |
| action | ReactNode | - | Control para compartir o invitar a responder. |
| children | ReactNode | - | Fondo decorativo desenfocado, inert y aria-hidden. Nunca datos restringidos. |
| className | string | - | Clases de Card. Reservá altura suficiente para el mensaje superpuesto. |
Cuándo sí y cuándo no
- Decí cuántos pulsos hay y en qué período.
- Separá promedio provisorio de tendencia.
- Usá contenido decorativo detrás del velo.
- No uses el umbral viejo de 5 pulsos.
- No confundas pocos datos con ánimo bajo.
- No envíes datos privados al navegador para luego desenfocarlos.
Accesibilidad
- El fondo es inert y aria-hidden: no se lee ni recibe foco.
- El mensaje usa role=status; mantené el texto breve y legible.
- La acción se enfoca con Tab. Si abre un diálogo, Escape lo cierra y devuelve el foco al disparador.