Moodinary/UI

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

shadcn
npx shadcn@latest add https://design.moodinary.com/r/niebla-overlay.json
import
import { 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.

Niebla

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
overlay.tsx
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.

Con 5 pulsos no alcanza para sacar conclusiones. Cuando haya 8 o más, te mostramos la tendencia.
Nivel promedio
3,2
provisorio
Pulsos
5
necesitamos 8 para leer la semana
Pulsos vs meta
—
Sin meta semanal · definir
Código
provisional.tsx
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

PropTipoDefaultDescripción
titleReactNode-Motivo obligatorio, renderizado como h4.
badgeReactNode-Etiqueta de Niebla, normalmente ClimaChip.
descriptionReactNode-Muestra, período y próximo paso.
actionReactNode-Control para compartir o invitar a responder.
childrenReactNode-Fondo decorativo desenfocado, inert y aria-hidden. Nunca datos restringidos.
classNamestring-Clases de Card. Reservá altura suficiente para el mensaje superpuesto.

Cuándo sí y cuándo no

Hacé
  • Decí cuántos pulsos hay y en qué período.
  • Separá promedio provisorio de tendencia.
  • Usá contenido decorativo detrás del velo.
Evitá
  • 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.