{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "daily-standup-summary",
  "title": "Daily Standup Summary",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/daily-standup-summary/DailyStandupSummary.tsx",
      "content": "'use client'\n\nimport { useState } from 'react'\nimport {\n  AlertTriangle,\n  ArrowRight,\n  Bot,\n  Calendar,\n  Check,\n  CheckCircle2,\n  Clock,\n  Copy,\n  Flame,\n  Handshake,\n  MessageSquare,\n  Rocket,\n  Send,\n  ShieldAlert,\n  ShieldCheck,\n  Smile,\n  Target,\n  Users,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Separator } from '@/components/ui/separator'\n\nexport type StandupStatus = 'on-track' | 'blocked' | 'needs-review'\n\nexport interface StandupReaction {\n  emoji: string\n  count: number\n  active?: boolean\n}\n\nexport interface StandupMember {\n  id: string\n  name: string\n  role: string\n  avatar: string\n  fallback: string\n  submittedAt: string\n  timezone: string\n  status: StandupStatus\n  statusLabel: string\n  yesterday: string[]\n  today: string[]\n  blockers?: string | null\n  blockerSeverity?: 'critical' | 'moderate' | 'low'\n  reactions: StandupReaction[]\n  threadCount?: number\n}\n\nexport interface BlockerAlert {\n  id: string\n  title: string\n  description: string\n  authorName: string\n  authorRole: string\n  reportedAt: string\n  ticketId?: string\n  scope: string\n  assignedSquad: string\n}\n\nexport interface StandupPulseMetrics {\n  submissionsCount: number\n  totalMembers: number\n  pendingMemberName?: string\n  activeBlockersCount: number\n  blockersHighlight?: string\n  goalsOnTrackCount: number\n  totalGoals: number\n  sprintName?: string\n  deploymentsPlannedCount: number\n  deploymentsHighlight?: string\n}\n\nexport interface DailyStandupSummaryProps {\n  teamName?: string\n  date?: string\n  pulseMetrics?: StandupPulseMetrics\n  blockerAlert?: BlockerAlert | null\n  members?: StandupMember[]\n  initialFilter?: 'all' | StandupStatus\n  className?: string\n}\n\nconst defaultPulseMetrics: StandupPulseMetrics = {\n  submissionsCount: 5,\n  totalMembers: 6,\n  pendingMemberName: 'Alex Rivera (PTO / Vacation)',\n  activeBlockersCount: 1,\n  blockersHighlight: 'AWS IAM KMS staging rotation',\n  goalsOnTrackCount: 8,\n  totalGoals: 10,\n  sprintName: 'Sprint 42 · 3 days left',\n  deploymentsPlannedCount: 3,\n  deploymentsHighlight: '2 staging · 1 production (v2.4.0)',\n}\n\nconst defaultBlockerAlert: BlockerAlert = {\n  id: 'blk-aws-kms-01',\n  title: 'Blocked on AWS IAM permission grant for KMS rotation in staging',\n  description:\n    'Unable to complete cryptographic secret rotation automated test suite for the v2.4 staging cluster. Ticket SEC-9104 is currently pending approval from the Security Operations squad.',\n  authorName: 'Marcus Vance',\n  authorRole: 'DevOps & Cloud Architect',\n  reportedAt: '42m ago',\n  ticketId: 'SEC-9104',\n  scope: 'Staging Pipeline',\n  assignedSquad: '#sec-ops-triage',\n}\n\nconst defaultMembers: StandupMember[] = [\n  {\n    id: 'mem-1',\n    name: 'Elena Rostova',\n    role: 'Principal Engineer',\n    avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&auto=format&fit=crop&q=80',\n    fallback: 'ER',\n    submittedAt: '09:15 AM',\n    timezone: 'UTC+2 · Berlin',\n    status: 'on-track',\n    statusLabel: 'On Track',\n    yesterday: [\n      'Merged RFC #142 for headless multi-token theme engine architecture',\n      'Reviewed and approved 6 PRs across core UI primitive components',\n      'Mentored frontend team on Reka UI polymorphic asChild slot bindings',\n    ],\n    today: [\n      'Finalizing async tree-shaking benchmarking suite for monorepo components (#PERF-892)',\n      'Kicking off Design Tokens v4 migration RFC discussion thread with design systems team',\n      'Pairing with Sarah on virtualized combobox keyboard focus trap resolution',\n    ],\n    blockers: null,\n    reactions: [\n      { emoji: '👍', count: 4, active: true },\n      { emoji: '🚀', count: 2, active: false },\n      { emoji: '👀', count: 3, active: false },\n      { emoji: '🧠', count: 1, active: false },\n    ],\n    threadCount: 3,\n  },\n  {\n    id: 'mem-2',\n    name: 'Marcus Vance',\n    role: 'DevOps & Cloud Architect',\n    avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&auto=format&fit=crop&q=80',\n    fallback: 'MV',\n    submittedAt: '09:28 AM',\n    timezone: 'UTC-5 · New York',\n    status: 'blocked',\n    statusLabel: 'Blocked',\n    blockerSeverity: 'critical',\n    yesterday: [\n      'Provisioned ephemeral preview environments for automated PR test runners',\n      'Automated Cloudflare Pages edge cache invalidation hooks in GitHub Actions',\n    ],\n    today: [\n      'Rolling out canary release v2.4.0 to EU cluster once KMS permissions clear (#OPS-419)',\n      'Setting up Prometheus edge exporter for SSR latency and cache hit ratios',\n    ],\n    blockers:\n      'Blocked on AWS IAM permission grant for KMS rotation in staging. Escalated to Security Ops in #sec-ops-triage (Ticket SEC-9104).',\n    reactions: [\n      { emoji: '🚨', count: 3, active: true },\n      { emoji: '💬', count: 4, active: false },\n      { emoji: '🤝', count: 2, active: false },\n      { emoji: '🙏', count: 1, active: false },\n    ],\n    threadCount: 4,\n  },\n  {\n    id: 'mem-3',\n    name: 'David Chen',\n    role: 'Full-Stack Engineer',\n    avatar: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=150&auto=format&fit=crop&q=80',\n    fallback: 'DC',\n    submittedAt: '09:42 AM',\n    timezone: 'UTC-7 · San Francisco',\n    status: 'on-track',\n    statusLabel: 'On Track',\n    yesterday: [\n      'Implemented Nitro rate-limiting telemetry parser and token bucket middleware',\n      'Wrote 34 unit tests for zero-allocation token stringifier algorithm',\n    ],\n    today: [\n      'Implementing HMAC-SHA256 webhook signature validation generator (#CORE-331)',\n      'Writing OpenAPI 3.1 documentation with interactive curl playground snippets',\n    ],\n    blockers: null,\n    reactions: [\n      { emoji: '🔥', count: 5, active: false },\n      { emoji: '👍', count: 3, active: true },\n      { emoji: '⚡', count: 2, active: false },\n    ],\n    threadCount: 1,\n  },\n  {\n    id: 'mem-4',\n    name: 'Sarah Jenkins',\n    role: 'Frontend Specialist',\n    avatar: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&auto=format&fit=crop&q=80',\n    fallback: 'SJ',\n    submittedAt: '09:55 AM',\n    timezone: 'UTC+1 · London',\n    status: 'needs-review',\n    statusLabel: 'Needs Review',\n    yesterday: [\n      'Completed accessible combobox keyboard navigation and roving tabindex support',\n      'Audited dark mode OKLCH contrast ratios on table headers and badges',\n    ],\n    today: [\n      'Benchmarking spring physics motion transition framerates on mobile viewports (#UI-204)',\n      'Crafting comprehensive story demos for Daily Standup Summary block',\n    ],\n    blockers: 'Awaiting PR review on PR #884 (Reka roving focus patch) from Elena or David to merge.',\n    reactions: [\n      { emoji: '✨', count: 6, active: true },\n      { emoji: '👍', count: 4, active: false },\n      { emoji: '🚀', count: 1, active: false },\n    ],\n    threadCount: 2,\n  },\n]\n\nexport function DailyStandupSummary({\n  teamName = 'Core Registry Squad',\n  date = 'Today · Friday, Aug 21, 2026',\n  pulseMetrics = defaultPulseMetrics,\n  blockerAlert = defaultBlockerAlert,\n  members = defaultMembers,\n  initialFilter = 'all',\n  className,\n}: DailyStandupSummaryProps) {\n  const [activeFilter, setActiveFilter] = useState<'all' | StandupStatus>(initialFilter)\n  const [standupSubmitted, setStandupSubmitted] = useState(false)\n  const [copiedSummary, setCopiedSummary] = useState(false)\n  const [escalatedBlocker, setEscalatedBlocker] = useState(false)\n  const [localMembers, setLocalMembers] = useState<StandupMember[]>(members)\n\n  const filteredMembers = localMembers.filter((m) => {\n    if (activeFilter === 'all') return true\n    return m.status === activeFilter\n  })\n\n  const countAll = localMembers.length\n  const countBlocked = localMembers.filter((m) => m.status === 'blocked').length\n  const countNeedsReview = localMembers.filter((m) => m.status === 'needs-review').length\n  const countOnTrack = localMembers.filter((m) => m.status === 'on-track').length\n\n  const toggleReaction = (memberIndex: number, reactionIndex: number) => {\n    setLocalMembers((prev) => {\n      const next = [...prev]\n      const member = { ...next[memberIndex] }\n      const reactions = [...member.reactions]\n      const r = { ...reactions[reactionIndex] }\n\n      if (r.active) {\n        r.count -= 1\n        r.active = false\n      } else {\n        r.count += 1\n        r.active = true\n      }\n\n      reactions[reactionIndex] = r\n      member.reactions = reactions\n      next[memberIndex] = member\n      return next\n    })\n  }\n\n  const copySummary = async () => {\n    try {\n      const text = `${teamName} Standup Summary — ${date}\\n\\nSubmissions: ${pulseMetrics.submissionsCount}/${pulseMetrics.totalMembers} (${Math.round((pulseMetrics.submissionsCount / pulseMetrics.totalMembers) * 100)}%)\\nActive Blockers: ${pulseMetrics.activeBlockersCount}\\nGoals on Track: ${pulseMetrics.goalsOnTrackCount}/${pulseMetrics.totalGoals}\\nPlanned Releases: ${pulseMetrics.deploymentsPlannedCount}`\n      await navigator.clipboard.writeText(text)\n      setCopiedSummary(true)\n      setTimeout(() => {\n        setCopiedSummary(false)\n      }, 2000)\n    } catch {}\n  }\n\n  return (\n    <div data-slot=\"daily-standup-summary\" className={cn('bg-background text-foreground w-full space-y-6', className)}>\n      {/* Header Section */}\n      <header className=\"bg-card border-border flex flex-col gap-4 rounded-xl border p-5 shadow-xs sm:p-6 lg:flex-row lg:items-center lg:justify-between\">\n        <div className=\"space-y-1.5\">\n          <div className=\"flex flex-wrap items-center gap-2.5\">\n            <div className=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n              <Bot className=\"size-4.5\" aria-hidden=\"true\" />\n            </div>\n            <h1 className=\"text-xl font-bold tracking-tight sm:text-2xl\">Daily Engineering Standup</h1>\n            <Badge variant=\"secondary\" className=\"border-info/20 bg-info/10 text-info text-xs font-medium\">\n              <span className=\"bg-info mr-1.5 inline-block size-1.5 animate-pulse rounded-full\" />\n              Synced with #eng-standups\n            </Badge>\n          </div>\n          <div className=\"text-muted-foreground flex flex-wrap items-center gap-2 text-xs sm:text-sm\">\n            <span className=\"text-foreground flex items-center gap-1 font-medium\">\n              <Calendar className=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n              {date}\n            </span>\n            <span className=\"flex items-center gap-1\">\n              <Users className=\"size-3.5\" aria-hidden=\"true\" />\n              {teamName} · {pulseMetrics.totalMembers} Members\n            </span>\n          </div>\n        </div>\n\n        {/* Action Controls */}\n        <div className=\"flex flex-wrap items-center gap-2.5\">\n          <Button variant=\"outline\" size=\"sm\" className=\"h-9 gap-1.5 text-xs font-medium\" onClick={copySummary}>\n            {copiedSummary ? (\n              <Check className=\"text-success size-3.5\" aria-hidden=\"true\" />\n            ) : (\n              <Copy className=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n            )}\n            {copiedSummary ? 'Summary Copied' : 'Copy Summary'}\n          </Button>\n          <Button\n            variant={standupSubmitted ? 'outline' : 'default'}\n            size=\"sm\"\n            className=\"h-9 gap-1.5 text-xs font-semibold transition\"\n            onClick={() => setStandupSubmitted(!standupSubmitted)}\n          >\n            {standupSubmitted ? (\n              <CheckCircle2 className=\"text-success size-4\" aria-hidden=\"true\" />\n            ) : (\n              <Send className=\"size-4\" aria-hidden=\"true\" />\n            )}\n            {standupSubmitted ? 'Standup Submitted' : 'Submit My Standup'}\n          </Button>\n        </div>\n      </header>\n\n      {/* 4 Squad Pulse Summary Cards */}\n      <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        {/* 1. Total Submissions */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-xs font-medium\">Total Submissions</CardDescription>\n              <div className=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n                <CheckCircle2 className=\"size-3.5\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <CardTitle className=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n              {pulseMetrics.submissionsCount} / {pulseMetrics.totalMembers}\n              <Badge\n                variant=\"secondary\"\n                className=\"border-success/20 bg-success/10 text-success text-success text-xs font-semibold tabular-nums\"\n              >\n                {Math.round((pulseMetrics.submissionsCount / pulseMetrics.totalMembers) * 100)}% In\n              </Badge>\n            </CardTitle>\n          </CardHeader>\n          <CardContent className=\"pt-0\">\n            <div className=\"bg-muted mb-2 h-1.5 w-full overflow-hidden rounded-full\">\n              <div\n                className=\"bg-success h-full transition-[width] duration-500\"\n                style={{ width: `${(pulseMetrics.submissionsCount / pulseMetrics.totalMembers) * 100}%` }}\n              />\n            </div>\n            {pulseMetrics.pendingMemberName && (\n              <p className=\"text-muted-foreground truncate text-xs\">Pending: {pulseMetrics.pendingMemberName}</p>\n            )}\n          </CardContent>\n        </Card>\n\n        {/* 2. Active Blockers */}\n        <Card\n          className={cn(\n            'border-border shadow-xs',\n            pulseMetrics.activeBlockersCount > 0 && 'border-destructive/40 bg-destructive/5',\n          )}\n        >\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-xs font-medium\">Active Blockers</CardDescription>\n              <div\n                className={cn(\n                  'flex size-7 items-center justify-center rounded-md',\n                  pulseMetrics.activeBlockersCount > 0\n                    ? 'bg-destructive/10 text-destructive'\n                    : 'bg-success/10 text-success',\n                )}\n              >\n                <AlertTriangle className=\"size-3.5\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <CardTitle className=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n              {pulseMetrics.activeBlockersCount} {pulseMetrics.activeBlockersCount === 1 ? 'Critical' : 'Active'}\n              {pulseMetrics.activeBlockersCount > 0 ? (\n                <Badge variant=\"destructive\" className=\"text-xs font-semibold\">\n                  <span className=\"mr-1 inline-block size-1.5 rounded-full bg-white\" />\n                  Action Req.\n                </Badge>\n              ) : (\n                <Badge\n                  variant=\"secondary\"\n                  className=\"border-success/20 bg-success/10 text-success text-xs font-semibold\"\n                >\n                  Clear\n                </Badge>\n              )}\n            </CardTitle>\n          </CardHeader>\n          <CardContent className=\"pt-0\">\n            <p className=\"text-muted-foreground truncate text-xs\">\n              {pulseMetrics.blockersHighlight || 'All squad paths currently unblocked'}\n            </p>\n          </CardContent>\n        </Card>\n\n        {/* 3. Sprint Goals On Track */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-xs font-medium\">Sprint Goals On Track</CardDescription>\n              <div className=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n                <Target className=\"size-3.5\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <CardTitle className=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n              {pulseMetrics.goalsOnTrackCount} / {pulseMetrics.totalGoals}\n              <Badge\n                variant=\"secondary\"\n                className=\"bg-primary/10 text-primary border-primary/20 text-xs font-semibold tabular-nums\"\n              >\n                {Math.round((pulseMetrics.goalsOnTrackCount / pulseMetrics.totalGoals) * 100)}% Velocity\n              </Badge>\n            </CardTitle>\n          </CardHeader>\n          <CardContent className=\"pt-0\">\n            <p className=\"text-muted-foreground truncate text-xs\">{pulseMetrics.sprintName || 'Sprint on schedule'}</p>\n          </CardContent>\n        </Card>\n\n        {/* 4. Today's Deployments */}\n        <Card className=\"border-border shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-xs font-medium\">Planned Deployments</CardDescription>\n              <div className=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n                <Rocket className=\"size-3.5\" aria-hidden=\"true\" />\n              </div>\n            </div>\n            <CardTitle className=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n              {pulseMetrics.deploymentsPlannedCount} Releases\n              <Badge variant=\"outline\" className=\"text-xs font-semibold\">\n                Today\n              </Badge>\n            </CardTitle>\n          </CardHeader>\n          <CardContent className=\"pt-0\">\n            <p className=\"text-muted-foreground truncate text-xs\">\n              {pulseMetrics.deploymentsHighlight || 'Targeting staging & edge production'}\n            </p>\n          </CardContent>\n        </Card>\n      </div>\n\n      {/* Active Blockers Alert Card (Highlighted Banner) */}\n      {blockerAlert && (\n        <div className=\"border-destructive/30 bg-destructive/5 dark:bg-destructive/10 relative overflow-hidden rounded-xl border p-5 shadow-xs\">\n          <div className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n            <div className=\"flex items-start gap-3.5\">\n              <div className=\"bg-destructive/15 text-destructive mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-lg\">\n                <ShieldAlert className=\"size-5\" aria-hidden=\"true\" />\n              </div>\n              <div className=\"space-y-1.5\">\n                <div className=\"flex flex-wrap items-center gap-2\">\n                  <Badge variant=\"destructive\" className=\"text-xs font-semibold\">\n                    <span className=\"mr-1.5 inline-block size-1.5 animate-pulse rounded-full bg-white\" />\n                    Critical Blocker\n                  </Badge>\n                  <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                    {blockerAlert.ticketId}\n                  </Badge>\n                  <span className=\"text-muted-foreground text-xs\">\n                    Reported by <strong className=\"text-foreground font-medium\">{blockerAlert.authorName}</strong> (\n                    {blockerAlert.authorRole}) · {blockerAlert.reportedAt}\n                  </span>\n                </div>\n                <h2 className=\"text-foreground text-base leading-snug font-semibold\">{blockerAlert.title}</h2>\n                <p className=\"text-muted-foreground text-xs sm:text-sm\">{blockerAlert.description}</p>\n                <div className=\"flex flex-wrap items-center gap-3 pt-1 text-xs\">\n                  <span className=\"text-muted-foreground\">\n                    Scope: <span className=\"text-foreground font-medium\">{blockerAlert.scope}</span>\n                  </span>\n                  <span className=\"text-muted-foreground\">\n                    Assigned: <span className=\"text-primary font-medium\">{blockerAlert.assignedSquad}</span>\n                  </span>\n                </div>\n              </div>\n            </div>\n\n            <div className=\"flex shrink-0 flex-wrap items-center gap-2 md:flex-col md:items-end\">\n              <Button\n                size=\"sm\"\n                variant={escalatedBlocker ? 'outline' : 'destructive'}\n                className=\"h-8 text-xs font-semibold\"\n                onClick={() => setEscalatedBlocker(!escalatedBlocker)}\n              >\n                {escalatedBlocker ? (\n                  <>\n                    <Check className=\"text-success mr-1 size-3.5\" />\n                    Escalated to SecOps\n                  </>\n                ) : (\n                  <>\n                    <Flame className=\"mr-1 size-3.5\" />\n                    Escalate Blocker\n                  </>\n                )}\n              </Button>\n              <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs font-medium\">\n                <MessageSquare className=\"text-muted-foreground mr-1 size-3.5\" />\n                Open Thread (4)\n              </Button>\n            </div>\n          </div>\n        </div>\n      )}\n\n      {/* Standup Submissions Section */}\n      <div className=\"space-y-4\">\n        {/* Section Header & Filter Controls */}\n        <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n          <div className=\"flex items-center gap-2\">\n            <h2 className=\"text-base font-semibold tracking-tight\">Standup Submissions</h2>\n            <Badge variant=\"secondary\" className=\"font-mono text-xs tabular-nums\">\n              {filteredMembers.length}\n            </Badge>\n          </div>\n\n          {/* Filter Segmented Pills */}\n          <div className=\"bg-muted border-border flex items-center gap-1 rounded-lg border p-1 text-xs\">\n            <button\n              type=\"button\"\n              className={cn(\n                'focus-visible:ring-ring min-h-6 rounded-md px-2.5 py-1 font-medium transition focus-visible:ring-2 focus-visible:outline-none',\n                activeFilter === 'all'\n                  ? 'bg-background text-foreground font-semibold shadow-xs'\n                  : 'text-muted-foreground hover:text-foreground',\n              )}\n              onClick={() => setActiveFilter('all')}\n            >\n              All ({countAll})\n            </button>\n            <button\n              type=\"button\"\n              className={cn(\n                'focus-visible:ring-ring min-h-6 rounded-md px-2.5 py-1 font-medium transition focus-visible:ring-2 focus-visible:outline-none',\n                activeFilter === 'blocked'\n                  ? 'bg-background text-destructive font-semibold shadow-xs'\n                  : 'text-muted-foreground hover:text-destructive',\n              )}\n              onClick={() => setActiveFilter('blocked')}\n            >\n              Blocked ({countBlocked})\n            </button>\n            <button\n              type=\"button\"\n              className={cn(\n                'focus-visible:ring-ring min-h-6 rounded-md px-2.5 py-1 font-medium transition focus-visible:ring-2 focus-visible:outline-none',\n                activeFilter === 'needs-review'\n                  ? 'bg-background text-warning text-warning font-semibold shadow-xs'\n                  : 'text-muted-foreground hover:text-foreground',\n              )}\n              onClick={() => setActiveFilter('needs-review')}\n            >\n              Needs Review ({countNeedsReview})\n            </button>\n            <button\n              type=\"button\"\n              className={cn(\n                'focus-visible:ring-ring min-h-6 rounded-md px-2.5 py-1 font-medium transition focus-visible:ring-2 focus-visible:outline-none',\n                activeFilter === 'on-track'\n                  ? 'bg-background text-success text-success font-semibold shadow-xs'\n                  : 'text-muted-foreground hover:text-foreground',\n              )}\n              onClick={() => setActiveFilter('on-track')}\n            >\n              On Track ({countOnTrack})\n            </button>\n          </div>\n        </div>\n\n        {/* Member Standup Cards List */}\n        <div className=\"space-y-4\">\n          {filteredMembers.map((member, mIdx) => (\n            <Card\n              key={member.id}\n              className={cn(\n                'border-border hover:border-border/80 shadow-xs transition',\n                member.status === 'blocked' && 'border-destructive/30',\n                member.status === 'needs-review' && 'border-warning/30',\n              )}\n            >\n              {/* Member Card Header */}\n              <CardHeader className=\"pb-4\">\n                <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n                  <div className=\"flex items-center gap-3.5\">\n                    <Avatar className=\"size-10 border\">\n                      <AvatarImage src={member.avatar} alt={member.name} />\n                      <AvatarFallback className=\"bg-primary/10 text-primary text-xs font-semibold\">\n                        {member.fallback}\n                      </AvatarFallback>\n                    </Avatar>\n                    <div>\n                      <div className=\"flex flex-wrap items-center gap-2\">\n                        <h3 className=\"text-sm font-semibold tracking-tight\">{member.name}</h3>\n                        <Badge\n                          variant={member.status === 'blocked' ? 'destructive' : 'secondary'}\n                          className={cn(\n                            'text-xs font-medium',\n                            member.status === 'on-track' && 'border-success/20 bg-success/10 text-success',\n                            member.status === 'needs-review' && 'border-warning/20 bg-warning/10 text-warning',\n                          )}\n                        >\n                          {member.statusLabel}\n                        </Badge>\n                      </div>\n                      <p className=\"text-muted-foreground text-xs\">\n                        {member.role} · <span className=\"text-muted-foreground/80\">{member.timezone}</span>\n                      </p>\n                    </div>\n                  </div>\n\n                  {/* Timestamp */}\n                  <div className=\"flex items-center gap-2 self-start text-xs sm:self-auto\">\n                    <span className=\"text-muted-foreground flex items-center gap-1 tabular-nums\">\n                      <Clock className=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                      {member.submittedAt}\n                    </span>\n                  </div>\n                </div>\n              </CardHeader>\n\n              <CardContent className=\"space-y-4 pt-0\">\n                <Separator />\n\n                {/* Three-Part Standup Structure */}\n                <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n                  {/* 1. Accomplished Yesterday */}\n                  <div className=\"bg-muted/30 border-border/60 space-y-2 rounded-lg border p-3.5\">\n                    <h4 className=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\">\n                      <CheckCircle2 className=\"text-success size-3.5 shrink-0\" aria-hidden=\"true\" />\n                      Yesterday's Output\n                    </h4>\n                    <ul className=\"space-y-1.5 text-xs leading-relaxed\">\n                      {member.yesterday.map((item, idx) => (\n                        <li key={idx} className=\"flex items-start gap-1.5\">\n                          <span className=\"text-success mt-0.5 font-bold\">✓</span>\n                          <span className=\"text-foreground/90\">{item}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n\n                  {/* 2. Focusing on Today */}\n                  <div className=\"bg-muted/30 border-border/60 space-y-2 rounded-lg border p-3.5\">\n                    <h4 className=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\">\n                      <ArrowRight className=\"text-primary size-3.5 shrink-0\" aria-hidden=\"true\" />\n                      Today's Focus\n                    </h4>\n                    <ul className=\"space-y-1.5 text-xs leading-relaxed\">\n                      {member.today.map((item, idx) => (\n                        <li key={idx} className=\"flex items-start gap-1.5\">\n                          <span className=\"text-primary mt-0.5 font-bold\">→</span>\n                          <span className=\"text-foreground/90\">{item}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n\n                  {/* 3. Blockers or Risks */}\n                  <div\n                    className={cn(\n                      'space-y-2 rounded-lg border p-3.5',\n                      member.blockers\n                        ? member.status === 'blocked'\n                          ? 'border-destructive/30 bg-destructive/5 dark:bg-destructive/10'\n                          : 'border-warning/30 bg-warning/5'\n                        : 'border-border/60 bg-muted/30',\n                    )}\n                  >\n                    <h4 className=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\">\n                      {member.blockers ? (\n                        <AlertTriangle\n                          className={cn(\n                            'size-3.5 shrink-0',\n                            member.status === 'blocked' ? 'text-destructive' : 'text-warning',\n                          )}\n                          aria-hidden=\"true\"\n                        />\n                      ) : (\n                        <ShieldCheck className=\"text-success size-3.5 shrink-0\" aria-hidden=\"true\" />\n                      )}\n                      Blockers & Risks\n                    </h4>\n\n                    {member.blockers ? (\n                      <div className=\"text-xs leading-relaxed\">\n                        <p\n                          className={\n                            member.status === 'blocked' ? 'text-destructive font-medium' : 'text-warning font-medium'\n                          }\n                        >\n                          {member.blockers}\n                        </p>\n                      </div>\n                    ) : (\n                      <div className=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n                        <span className=\"text-success font-medium\">No blockers</span>\n                        <span>— Clear path to sprint goals</span>\n                      </div>\n                    )}\n                  </div>\n                </div>\n\n                {/* Footer: Slack-style Reactions & Quick Actions */}\n                <div className=\"border-border/60 flex flex-wrap items-center justify-between gap-3 border-t pt-3\">\n                  {/* Reactions Pills */}\n                  <div className=\"flex flex-wrap items-center gap-1.5\">\n                    {member.reactions.map((reaction, rIdx) => (\n                      <button\n                        key={rIdx}\n                        type=\"button\"\n                        className={cn(\n                          'focus-visible:ring-ring flex min-h-6 items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium transition focus-visible:ring-2 focus-visible:outline-none',\n                          reaction.active\n                            ? 'bg-primary/10 border-primary/40 text-primary'\n                            : 'bg-muted/40 border-border text-muted-foreground hover:bg-muted hover:text-foreground',\n                        )}\n                        onClick={() => toggleReaction(mIdx, rIdx)}\n                      >\n                        <span>{reaction.emoji}</span>\n                        <span className=\"font-semibold tabular-nums\">{reaction.count}</span>\n                      </button>\n                    ))}\n                    <button\n                      type=\"button\"\n                      className=\"focus-visible:ring-ring text-muted-foreground hover:text-foreground hover:bg-muted flex size-7 items-center justify-center rounded-full border border-dashed transition focus-visible:ring-2 focus-visible:outline-none\"\n                      title=\"Add reaction\"\n                      aria-label=\"Add reaction\"\n                      onClick={() => toggleReaction(mIdx, 0)}\n                    >\n                      <Smile className=\"size-3.5\" aria-hidden=\"true\" />\n                    </button>\n                  </div>\n\n                  {/* Quick Action Buttons */}\n                  <div className=\"flex flex-wrap items-center gap-2\">\n                    <Button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      className=\"text-muted-foreground hover:text-foreground h-8 gap-1.5 text-xs\"\n                    >\n                      <Handshake className=\"size-3.5\" aria-hidden=\"true\" />\n                      Offer Help\n                    </Button>\n                    <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-1.5 text-xs font-medium\">\n                      <MessageSquare className=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n                      <span>Reply in Thread</span>\n                      {member.threadCount !== undefined && member.threadCount > 0 && (\n                        <span className=\"bg-muted text-foreground py-0.2 ml-0.5 rounded px-1.5 font-mono text-xs font-bold tabular-nums\">\n                          {member.threadCount}\n                        </span>\n                      )}\n                    </Button>\n                  </div>\n                </div>\n              </CardContent>\n            </Card>\n          ))}\n        </div>\n      </div>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/DailyStandupSummary.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/avatar.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/separator.json"
  ],
  "description": "Slack and Geekbot style async engineering daily standup summary with squad pulse cards, critical blocker alert callout, structured yesterday/today/blockers submission entries, reaction counts, and thread actions.",
  "categories": [
    "productivity",
    "collaboration",
    "dashboard",
    "app"
  ]
}