Moodinary/UI

Moderated comment

Comentarios anónimos. Siempre con equipo, día y ánimo; los marcados por la moderación se ocultan para revisar.

Comentario anónimo con ánimo, equipo y fecha. La moderación tiene tres modos: Permisivo, Cauteloso y Estricto. El componente muestra el estado que recibe, no modera. El producto analiza después de guardar: un comentario puede verse brevemente antes de ser marcado. En la app se usa la variante quote en la tarjeta Comentarios de Inicio; la variante card no aparece hoy en el dashboard.

Instalación

shadcn
npx shadcn@latest add https://design.moodinary.com/r/moderated-comment.json
import
import { ModeratedComment } from "@moodinary/ui/components/moderated-comment";
import { CommentQuote } from "@moodinary/ui/components/comment-quote";

Ejemplos

Tarjeta Comentarios

Como en Inicio: hasta dos comentarios ya revisados, tag Moderados y la aclaración de anonimato. Equipo y fecha llevan a Pulsos filtrado.

Comentarios

ModeradosVer pulsos →

Anónimos. Solo mostramos comentarios revisados de equipos con 5 pulsos o más.

Código
moderated.tsx
import { ShieldCheck as ShieldCheckIcon } from "@moodinary/ui/components/icons";
import { ModeratedComment } from "@moodinary/ui/components/moderated-comment";
import { RailCard } from "@moodinary/ui/components/rail-card";

/* Tarjeta Comentarios de Inicio (inicio-rail.tsx): hasta 2 comentarios ya moderados, tag Moderados. */
export default function CommentModerated() {
	return (
		<RailCard
			action={
				<span className="flex items-center gap-2.5">
					<span className="inline-flex items-center gap-1 text-[11.5px] text-ink-3">
						<ShieldCheckIcon aria-hidden className="size-3" />
						Moderados
					</span>
					<a href="#pulsos">Ver pulsos →</a>
				</span>
			}
			className="w-[340px] max-w-full"
			title="Comentarios"
		>
			<ul className="m-0 grid list-none gap-3 p-0">
				<li>
					<ModeratedComment
						level={4}
						team={<a href="#pulsos">Administración</a>}
						variant="quote"
						when={<a href="#pulsos">5 oct</a>}
					>
						Por fin se ordenaron los turnos, se nota.
					</ModeratedComment>
				</li>
				<li>
					<ModeratedComment
						level={2}
						team={<a href="#pulsos">5.º B</a>}
						variant="quote"
						when={<a href="#pulsos">2 oct</a>}
					>
						Muchas entregas juntas esta semana.
					</ModeratedComment>
				</li>
			</ul>
			<p className="m-0 text-ink-3 text-xs">
				Anónimos. Solo mostramos comentarios revisados de equipos con 5 pulsos o
				más.
			</p>
		</RailCard>
	);
}

Sin comentarios

Estado vacío real de la tarjeta. hidden (solo en card) desenfoca visualmente: no protege contenido sensible ni reemplaza permisos.

Comentarios

ModeradosVer pulsos →

Todavía no hay comentarios para mostrar.

Anónimos. Solo mostramos comentarios revisados de equipos con 5 pulsos o más.

Código
review.tsx
import { ShieldCheck as ShieldCheckIcon } from "@moodinary/ui/components/icons";
import { RailCard } from "@moodinary/ui/components/rail-card";

/* Estado vacío real de la tarjeta Comentarios: todavía no hay comentarios moderados para mostrar. */
export default function CommentReview() {
	return (
		<RailCard
			action={
				<span className="flex items-center gap-2.5">
					<span className="inline-flex items-center gap-1 text-[11.5px] text-ink-3">
						<ShieldCheckIcon aria-hidden className="size-3" />
						Moderados
					</span>
					<a href="#pulsos">Ver pulsos →</a>
				</span>
			}
			className="w-[340px] max-w-full"
			title="Comentarios"
		>
			<p className="m-0 text-ink-3 text-xs">
				Todavía no hay comentarios para mostrar.
			</p>
			<p className="m-0 text-ink-3 text-xs">
				Anónimos. Solo mostramos comentarios revisados de equipos con 5 pulsos o
				más.
			</p>
		</RailCard>
	);
}

Cita compacta

La variante quote lleva la cita primero y el contexto debajo, con fecha corta. CommentQuote agrega sus propias comillas.

  • Me gustó que nos preguntaran cómo llegábamos antes de la prueba.
    4.º A · 5 oct
  • La semana estuvo pesada, pero el equipo se bancó.
    Ventas · 3 oct
Código
quote.tsx
import { ModeratedComment } from "@moodinary/ui/components/moderated-comment";

/* variant="quote" como en RecentComments (inicio-rail.tsx): equipo y fecha corta son links a Pulsos filtrado. */
export default function CommentQuoteVariant() {
	return (
		<ul className="m-0 grid w-[320px] max-w-full list-none gap-3 p-0">
			<li>
				<ModeratedComment
					level={4}
					team={<a href="#pulsos">4.º A</a>}
					variant="quote"
					when={
						<a href="#pulsos" title="Ver pulsos de ese día">
							5 oct
						</a>
					}
				>
					Me gustó que nos preguntaran cómo llegábamos antes de la prueba.
				</ModeratedComment>
			</li>
			<li>
				<ModeratedComment
					level={3}
					team={<a href="#pulsos">Ventas</a>}
					variant="quote"
					when={
						<a href="#pulsos" title="Ver pulsos de ese día">
							3 oct
						</a>
					}
				>
					La semana estuvo pesada, pero el equipo se bancó.
				</ModeratedComment>
			</li>
		</ul>
	);
}

Props

ModeratedComment

PropTipoDefaultDescripción
variant"card" | "quote""card"Tarjeta completa o cita compacta. quote no muestra status ni actions y no aplica hidden.
level1 | 2 | 3 | 4 | 5-Ánimo obligatorio del pulso.
teamReactNode-Equipo, sin identificar a la persona.
whenReactNode-Fecha o tiempo relativo, obligatorio.
statusReactNode-Etiqueta de moderación en la tarjeta.
hiddenboolean-Desenfoca la cita en card; el contenido sigue en el DOM.
actionsReactNode-Controles de lectura o revisión en card.
childrenReactNode-Texto del comentario o placeholder autorizado.
classNamestring-Clases del contenedor.

CommentQuote

PropTipoDefaultDescripción
size"sm" | "md" | "lg""md"Tamaño de la cita en Newsreader.
childrenReactNode-Texto sin comillas externas.
classNamestring-Clases del blockquote.

Cuándo sí y cuándo no

Hacé
  • Mostrá equipo, fecha y ánimo sin identificar participantes.
  • Pedí autorización en la API antes de recuperar contenido restringido.
  • Nombrá el estado de moderación con texto.
Evitá
  • No prometas que todo comentario queda oculto antes de moderarse.
  • No uses blur ni hidden como control de acceso.
  • No agregues avatares o nombres de participantes.

Accesibilidad

  • Los botones de revisión se recorren con Tab y se activan con Enter o Espacio.
  • Cuando ocultes contenido sensible, reemplazalo por texto legible, no solo por desenfoque.
  • quote solo muestra un punto decorativo: agregá el nombre accesible del ánimo en when o en la composición.