tia/src/components/ui/Badge.tsx
Mannu c2cabc01d3 feat(g1-g4): design system, memories pipeline, medical tracking, AI brain
G1 — Design System: 14 UI primitives (Button, Card, Modal, Sheet, Input,
Textarea, Select, EmptyState, LoadingShimmer, ConfirmDialog, WashiTape,
Badge, Avatar, Tabs), PageTransition with Framer Motion, sun/moon CSS vars,
Caveat font, /dev/components visual showcase.

G2 — Memories Pipeline: R2 presigned uploads, Sharp thumbnail generation,
LiteLLM vision captions + pgvector embeddings, CSS masonry gallery with
infinite scroll, private toggle, semantic search fallback to ILIKE.

G3 — Medical: dose log + correction audit trail, IAP vaccine bulk import,
emergency escalation page, pediatrician phone in settings.

G4 — AI Brain: keyword guardrail → LLM classifier → structured DB tool-use
(7 tools) → memory search → general parenting handler; ai_usage table;
22-case medical bypass safety test suite.

DB migrations: 0011_memories, 0012_medical_doses, 0013_ai_usage.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 17:48:34 +05:30

40 lines
1.3 KiB
TypeScript

import { ReactNode } from "react";
interface BadgeProps {
children: ReactNode;
variant?: "default" | "success" | "warning" | "danger" | "info" | "rose";
size?: "sm" | "md";
dot?: boolean;
}
const variants = {
default: "bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300",
success: "bg-green-100 dark:bg-green-900/40 text-green-700 dark:text-green-400",
warning: "bg-yellow-100 dark:bg-yellow-900/40 text-yellow-700 dark:text-yellow-400",
danger: "bg-red-100 dark:bg-red-900/40 text-red-700 dark:text-red-400",
info: "bg-blue-100 dark:bg-blue-900/40 text-blue-700 dark:text-blue-400",
rose: "bg-rose-100 dark:bg-rose-900/40 text-rose-600 dark:text-rose-400",
};
const dotColors = {
default: "bg-gray-400",
success: "bg-green-500",
warning: "bg-yellow-500",
danger: "bg-red-500",
info: "bg-blue-500",
rose: "bg-rose-500",
};
const sizes = {
sm: "text-[10px] px-1.5 py-0.5 rounded-md",
md: "text-xs px-2 py-0.5 rounded-lg",
};
export function Badge({ children, variant = "default", size = "md", dot = false }: BadgeProps) {
return (
<span className={`inline-flex items-center gap-1 font-medium ${variants[variant]} ${sizes[size]}`}>
{dot && <span className={`w-1.5 h-1.5 rounded-full ${dotColors[variant]}`} />}
{children}
</span>
);
}