{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "daily-standup-summary",
  "title": "Daily Standup Summary",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-vue/blocks/daily-standup-summary/DailyStandupSummary.vue",
      "content": "<script setup lang=\"ts\">\nimport { computed, ref, type HTMLAttributes } from 'vue'\nimport {\n  AlertCircle,\n  AlertTriangle,\n  ArrowRight,\n  Bot,\n  Calendar,\n  Check,\n  CheckCircle2,\n  ChevronDown,\n  Clock,\n  Copy,\n  ExternalLink,\n  Flame,\n  Globe,\n  Handshake,\n  Heart,\n  HelpCircle,\n  MessageSquare,\n  MessageSquarePlus,\n  Plus,\n  Radio,\n  RefreshCw,\n  Rocket,\n  Search,\n  Send,\n  ShieldAlert,\n  ShieldCheck,\n  Smile,\n  Target,\n  ThumbsUp,\n  Users,\n} from 'lucide-vue-next'\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  class?: HTMLAttributes['class']\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\nconst props = withDefaults(defineProps<DailyStandupSummaryProps>(), {\n  teamName: 'Core Registry Squad',\n  date: 'Today · Friday, Aug 21, 2026',\n  initialFilter: 'all',\n})\n\nconst activeMetrics = computed(() => props.pulseMetrics ?? defaultPulseMetrics)\nconst activeBlockerAlert = computed(() => (props.blockerAlert !== undefined ? props.blockerAlert : defaultBlockerAlert))\nconst activeFilter = ref<'all' | StandupStatus>(props.initialFilter ?? 'all')\nconst standupSubmitted = ref(false)\nconst copiedSummary = ref(false)\nconst escalatedBlocker = ref(false)\nconst localMembers = ref<StandupMember[]>(JSON.parse(JSON.stringify(props.members ?? defaultMembers)))\n\nconst filteredMembers = computed(() => {\n  if (activeFilter.value === 'all') return localMembers.value\n  return localMembers.value.filter((m) => m.status === activeFilter.value)\n})\n\nconst countAll = computed(() => localMembers.value.length)\nconst countBlocked = computed(() => localMembers.value.filter((m) => m.status === 'blocked').length)\nconst countNeedsReview = computed(() => localMembers.value.filter((m) => m.status === 'needs-review').length)\nconst countOnTrack = computed(() => localMembers.value.filter((m) => m.status === 'on-track').length)\n\nconst toggleReaction = (memberIndex: number, reactionIndex: number) => {\n  const member = localMembers.value[memberIndex]\n  if (!member) return\n  const r = member.reactions[reactionIndex]\n  if (!r) return\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\nconst copySummary = async () => {\n  try {\n    const text = `${props.teamName} Standup Summary — ${props.date}\\n\\nSubmissions: ${activeMetrics.value.submissionsCount}/${activeMetrics.value.totalMembers} (${Math.round((activeMetrics.value.submissionsCount / activeMetrics.value.totalMembers) * 100)}%)\\nActive Blockers: ${activeMetrics.value.activeBlockersCount}\\nGoals on Track: ${activeMetrics.value.goalsOnTrackCount}/${activeMetrics.value.totalGoals}\\nPlanned Releases: ${activeMetrics.value.deploymentsPlannedCount}`\n    await navigator.clipboard.writeText(text)\n    copiedSummary.value = true\n    setTimeout(() => {\n      copiedSummary.value = false\n    }, 2000)\n  } catch {}\n}\n</script>\n\n<template>\n  <div data-slot=\"daily-standup-summary\" :class=\"cn('bg-background text-foreground w-full space-y-6', props.class)\">\n    <!-- Header Section -->\n    <header\n      class=\"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    >\n      <div class=\"space-y-1.5\">\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <div class=\"bg-primary/10 text-primary flex size-8 items-center justify-center rounded-lg\">\n            <Bot class=\"size-4.5\" aria-hidden=\"true\" />\n          </div>\n          <h1 class=\"text-xl font-bold tracking-tight sm:text-2xl\">Daily Engineering Standup</h1>\n          <Badge variant=\"secondary\" class=\"border-info/20 bg-info/10 text-info text-xs font-medium\">\n            <span class=\"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 class=\"text-muted-foreground flex flex-wrap items-center gap-2 text-xs sm:text-sm\">\n          <span class=\"text-foreground flex items-center gap-1 font-medium\">\n            <Calendar class=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n            {{ props.date }}\n          </span>\n          <span class=\"flex items-center gap-1\">\n            <Users class=\"size-3.5\" aria-hidden=\"true\" />\n            {{ props.teamName }} · {{ activeMetrics.totalMembers }} Members\n          </span>\n        </div>\n      </div>\n\n      <!-- Action Controls -->\n      <div class=\"flex flex-wrap items-center gap-2.5\">\n        <Button variant=\"outline\" size=\"sm\" class=\"h-9 gap-1.5 text-xs font-medium\" @click=\"copySummary\">\n          <Check v-if=\"copiedSummary\" class=\"text-success size-3.5\" aria-hidden=\"true\" />\n          <Copy v-else class=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n          {{ copiedSummary ? 'Summary Copied' : 'Copy Summary' }}\n        </Button>\n        <Button\n          :variant=\"standupSubmitted ? 'outline' : 'default'\"\n          size=\"sm\"\n          class=\"h-9 gap-1.5 text-xs font-semibold transition\"\n          @click=\"standupSubmitted = !standupSubmitted\"\n        >\n          <CheckCircle2 v-if=\"standupSubmitted\" class=\"text-success size-4\" aria-hidden=\"true\" />\n          <Send v-else class=\"size-4\" aria-hidden=\"true\" />\n          {{ standupSubmitted ? 'Standup Submitted' : 'Submit My Standup' }}\n        </Button>\n      </div>\n    </header>\n\n    <!-- 4 Squad Pulse Summary Cards -->\n    <div class=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n      <!-- 1. Total Submissions -->\n      <Card class=\"border-border shadow-xs\">\n        <CardHeader class=\"pb-2\">\n          <div class=\"flex items-center justify-between\">\n            <CardDescription class=\"text-xs font-medium\">Total Submissions</CardDescription>\n            <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n              <CheckCircle2 class=\"size-3.5\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <CardTitle class=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n            {{ activeMetrics.submissionsCount }} / {{ activeMetrics.totalMembers }}\n            <Badge\n              variant=\"secondary\"\n              class=\"border-success/20 bg-success/10 text-success text-success text-xs font-semibold tabular-nums\"\n            >\n              {{ Math.round((activeMetrics.submissionsCount / activeMetrics.totalMembers) * 100) }}% In\n            </Badge>\n          </CardTitle>\n        </CardHeader>\n        <CardContent class=\"pt-0\">\n          <div class=\"bg-muted mb-2 h-1.5 w-full overflow-hidden rounded-full\">\n            <div\n              class=\"bg-success h-full transition-[width] duration-500\"\n              :style=\"{ width: `${(activeMetrics.submissionsCount / activeMetrics.totalMembers) * 100}%` }\"\n            />\n          </div>\n          <p v-if=\"activeMetrics.pendingMemberName\" class=\"text-muted-foreground truncate text-xs\">\n            Pending: {{ activeMetrics.pendingMemberName }}\n          </p>\n        </CardContent>\n      </Card>\n\n      <!-- 2. Active Blockers -->\n      <Card\n        class=\"border-border shadow-xs\"\n        :class=\"{ 'border-destructive/40 bg-destructive/5': activeMetrics.activeBlockersCount > 0 }\"\n      >\n        <CardHeader class=\"pb-2\">\n          <div class=\"flex items-center justify-between\">\n            <CardDescription class=\"text-xs font-medium\">Active Blockers</CardDescription>\n            <div\n              class=\"flex size-7 items-center justify-center rounded-md\"\n              :class=\"\n                activeMetrics.activeBlockersCount > 0\n                  ? 'bg-destructive/10 text-destructive'\n                  : 'bg-success/10 text-success'\n              \"\n            >\n              <AlertTriangle class=\"size-3.5\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <CardTitle class=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n            {{ activeMetrics.activeBlockersCount }}\n            {{ activeMetrics.activeBlockersCount === 1 ? 'Critical' : 'Active' }}\n            <Badge v-if=\"activeMetrics.activeBlockersCount > 0\" variant=\"destructive\" class=\"text-xs font-semibold\">\n              <span class=\"mr-1 inline-block size-1.5 rounded-full bg-white\" />\n              Action Req.\n            </Badge>\n            <Badge\n              v-else\n              variant=\"secondary\"\n              class=\"border-success/20 bg-success/10 text-success text-xs font-semibold\"\n            >\n              Clear\n            </Badge>\n          </CardTitle>\n        </CardHeader>\n        <CardContent class=\"pt-0\">\n          <p class=\"text-muted-foreground truncate text-xs\">\n            {{ activeMetrics.blockersHighlight || 'All squad paths currently unblocked' }}\n          </p>\n        </CardContent>\n      </Card>\n\n      <!-- 3. Sprint Goals On Track -->\n      <Card class=\"border-border shadow-xs\">\n        <CardHeader class=\"pb-2\">\n          <div class=\"flex items-center justify-between\">\n            <CardDescription class=\"text-xs font-medium\">Sprint Goals On Track</CardDescription>\n            <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n              <Target class=\"size-3.5\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <CardTitle class=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n            {{ activeMetrics.goalsOnTrackCount }} / {{ activeMetrics.totalGoals }}\n            <Badge\n              variant=\"secondary\"\n              class=\"bg-primary/10 text-primary border-primary/20 text-xs font-semibold tabular-nums\"\n            >\n              {{ Math.round((activeMetrics.goalsOnTrackCount / activeMetrics.totalGoals) * 100) }}% Velocity\n            </Badge>\n          </CardTitle>\n        </CardHeader>\n        <CardContent class=\"pt-0\">\n          <p class=\"text-muted-foreground truncate text-xs\">\n            {{ activeMetrics.sprintName || 'Sprint on schedule' }}\n          </p>\n        </CardContent>\n      </Card>\n\n      <!-- 4. Today's Deployments -->\n      <Card class=\"border-border shadow-xs\">\n        <CardHeader class=\"pb-2\">\n          <div class=\"flex items-center justify-between\">\n            <CardDescription class=\"text-xs font-medium\">Planned Deployments</CardDescription>\n            <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n              <Rocket class=\"size-3.5\" aria-hidden=\"true\" />\n            </div>\n          </div>\n          <CardTitle class=\"mt-1 flex items-baseline gap-2 text-xl font-bold tabular-nums\">\n            {{ activeMetrics.deploymentsPlannedCount }} Releases\n            <Badge variant=\"outline\" class=\"text-xs font-semibold\"> Today </Badge>\n          </CardTitle>\n        </CardHeader>\n        <CardContent class=\"pt-0\">\n          <p class=\"text-muted-foreground truncate text-xs\">\n            {{ activeMetrics.deploymentsHighlight || 'Targeting staging & edge production' }}\n          </p>\n        </CardContent>\n      </Card>\n    </div>\n\n    <!-- Active Blockers Alert Card (Highlighted Banner) -->\n    <div\n      v-if=\"activeBlockerAlert\"\n      class=\"border-destructive/30 bg-destructive/5 dark:bg-destructive/10 relative overflow-hidden rounded-xl border p-5 shadow-xs\"\n    >\n      <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n        <div class=\"flex items-start gap-3.5\">\n          <div\n            class=\"bg-destructive/15 text-destructive mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-lg\"\n          >\n            <ShieldAlert class=\"size-5\" aria-hidden=\"true\" />\n          </div>\n          <div class=\"space-y-1.5\">\n            <div class=\"flex flex-wrap items-center gap-2\">\n              <Badge variant=\"destructive\" class=\"text-xs font-semibold\">\n                <span class=\"mr-1.5 inline-block size-1.5 animate-pulse rounded-full bg-white\" />\n                Critical Blocker\n              </Badge>\n              <Badge variant=\"outline\" class=\"font-mono text-xs\">\n                {{ activeBlockerAlert.ticketId }}\n              </Badge>\n              <span class=\"text-muted-foreground text-xs\">\n                Reported by <strong class=\"text-foreground font-medium\">{{ activeBlockerAlert.authorName }}</strong> ({{\n                  activeBlockerAlert.authorRole\n                }}) · {{ activeBlockerAlert.reportedAt }}\n              </span>\n            </div>\n            <h2 class=\"text-foreground text-base leading-snug font-semibold\">\n              {{ activeBlockerAlert.title }}\n            </h2>\n            <p class=\"text-muted-foreground text-xs sm:text-sm\">\n              {{ activeBlockerAlert.description }}\n            </p>\n            <div class=\"flex flex-wrap items-center gap-3 pt-1 text-xs\">\n              <span class=\"text-muted-foreground\"\n                >Scope: <span class=\"text-foreground font-medium\">{{ activeBlockerAlert.scope }}</span></span\n              >\n              <span class=\"text-muted-foreground\"\n                >Assigned: <span class=\"text-primary font-medium\">{{ activeBlockerAlert.assignedSquad }}</span></span\n              >\n            </div>\n          </div>\n        </div>\n\n        <div class=\"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            class=\"h-8 text-xs font-semibold\"\n            @click=\"escalatedBlocker = !escalatedBlocker\"\n          >\n            <Check v-if=\"escalatedBlocker\" class=\"text-success mr-1 size-3.5\" />\n            <Flame v-else class=\"mr-1 size-3.5\" />\n            {{ escalatedBlocker ? 'Escalated to SecOps' : 'Escalate Blocker' }}\n          </Button>\n          <Button variant=\"outline\" size=\"sm\" class=\"h-8 text-xs font-medium\">\n            <MessageSquare class=\"text-muted-foreground mr-1 size-3.5\" />\n            Open Thread (4)\n          </Button>\n        </div>\n      </div>\n    </div>\n\n    <!-- Standup Submissions Section -->\n    <div class=\"space-y-4\">\n      <!-- Section Header & Filter Controls -->\n      <div class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"flex items-center gap-2\">\n          <h2 class=\"text-base font-semibold tracking-tight\">Standup Submissions</h2>\n          <Badge variant=\"secondary\" class=\"font-mono text-xs tabular-nums\">\n            {{ filteredMembers.length }}\n          </Badge>\n        </div>\n\n        <!-- Filter Segmented Pills -->\n        <div class=\"bg-muted border-border flex items-center gap-1 rounded-lg border p-1 text-xs\">\n          <button\n            type=\"button\"\n            class=\"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            :class=\"\n              activeFilter === 'all'\n                ? 'bg-background text-foreground font-semibold shadow-xs'\n                : 'text-muted-foreground hover:text-foreground'\n            \"\n            @click=\"activeFilter = 'all'\"\n          >\n            All ({{ countAll }})\n          </button>\n          <button\n            type=\"button\"\n            class=\"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            :class=\"\n              activeFilter === 'blocked'\n                ? 'bg-background text-destructive font-semibold shadow-xs'\n                : 'text-muted-foreground hover:text-destructive'\n            \"\n            @click=\"activeFilter = 'blocked'\"\n          >\n            Blocked ({{ countBlocked }})\n          </button>\n          <button\n            type=\"button\"\n            class=\"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            :class=\"\n              activeFilter === 'needs-review'\n                ? 'bg-background text-warning text-warning font-semibold shadow-xs'\n                : 'text-muted-foreground hover:text-foreground'\n            \"\n            @click=\"activeFilter = 'needs-review'\"\n          >\n            Needs Review ({{ countNeedsReview }})\n          </button>\n          <button\n            type=\"button\"\n            class=\"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            :class=\"\n              activeFilter === 'on-track'\n                ? 'bg-background text-success text-success font-semibold shadow-xs'\n                : 'text-muted-foreground hover:text-foreground'\n            \"\n            @click=\"activeFilter = 'on-track'\"\n          >\n            On Track ({{ countOnTrack }})\n          </button>\n        </div>\n      </div>\n\n      <!-- Member Standup Cards List -->\n      <div class=\"space-y-4\">\n        <Card\n          v-for=\"(member, mIdx) in filteredMembers\"\n          :key=\"member.id\"\n          class=\"border-border hover:border-border/80 shadow-xs transition\"\n          :class=\"{\n            'border-destructive/30': member.status === 'blocked',\n            'border-warning/30': member.status === 'needs-review',\n          }\"\n        >\n          <!-- Member Card Header -->\n          <CardHeader class=\"pb-4\">\n            <div class=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n              <div class=\"flex items-center gap-3.5\">\n                <Avatar class=\"size-10 border\">\n                  <AvatarImage :src=\"member.avatar\" :alt=\"member.name\" />\n                  <AvatarFallback class=\"bg-primary/10 text-primary text-xs font-semibold\">{{\n                    member.fallback\n                  }}</AvatarFallback>\n                </Avatar>\n                <div>\n                  <div class=\"flex flex-wrap items-center gap-2\">\n                    <h3 class=\"text-sm font-semibold tracking-tight\">{{ member.name }}</h3>\n                    <Badge\n                      :variant=\"member.status === 'blocked' ? 'destructive' : 'secondary'\"\n                      class=\"text-xs font-medium\"\n                      :class=\"{\n                        'border-success/20 bg-success/10 text-success': member.status === 'on-track',\n                        'border-warning/20 bg-warning/10 text-warning': member.status === 'needs-review',\n                      }\"\n                    >\n                      {{ member.statusLabel }}\n                    </Badge>\n                  </div>\n                  <p class=\"text-muted-foreground text-xs\">\n                    {{ member.role }} · <span class=\"text-muted-foreground/80\">{{ member.timezone }}</span>\n                  </p>\n                </div>\n              </div>\n\n              <!-- Timestamp & Quick Member Actions -->\n              <div class=\"flex items-center gap-2 self-start text-xs sm:self-auto\">\n                <span class=\"text-muted-foreground flex items-center gap-1 tabular-nums\">\n                  <Clock class=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                  {{ member.submittedAt }}\n                </span>\n              </div>\n            </div>\n          </CardHeader>\n\n          <CardContent class=\"space-y-4 pt-0\">\n            <Separator />\n\n            <!-- Three-Part Standup Structure -->\n            <div class=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n              <!-- 1. Accomplished Yesterday -->\n              <div class=\"bg-muted/30 border-border/60 space-y-2 rounded-lg border p-3.5\">\n                <h4\n                  class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\"\n                >\n                  <CheckCircle2 class=\"text-success size-3.5 shrink-0\" aria-hidden=\"true\" />\n                  Yesterday's Output\n                </h4>\n                <ul class=\"space-y-1.5 text-xs leading-relaxed\">\n                  <li v-for=\"(item, idx) in member.yesterday\" :key=\"idx\" class=\"flex items-start gap-1.5\">\n                    <span class=\"text-success mt-0.5 font-bold\">✓</span>\n                    <span class=\"text-foreground/90\">{{ item }}</span>\n                  </li>\n                </ul>\n              </div>\n\n              <!-- 2. Focusing on Today -->\n              <div class=\"bg-muted/30 border-border/60 space-y-2 rounded-lg border p-3.5\">\n                <h4\n                  class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\"\n                >\n                  <ArrowRight class=\"text-primary size-3.5 shrink-0\" aria-hidden=\"true\" />\n                  Today's Focus\n                </h4>\n                <ul class=\"space-y-1.5 text-xs leading-relaxed\">\n                  <li v-for=\"(item, idx) in member.today\" :key=\"idx\" class=\"flex items-start gap-1.5\">\n                    <span class=\"text-primary mt-0.5 font-bold\">→</span>\n                    <span class=\"text-foreground/90\">{{ item }}</span>\n                  </li>\n                </ul>\n              </div>\n\n              <!-- 3. Blockers or Risks -->\n              <div\n                class=\"space-y-2 rounded-lg border p-3.5\"\n                :class=\"\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\n                  class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wider uppercase\"\n                >\n                  <AlertTriangle\n                    v-if=\"member.blockers\"\n                    class=\"size-3.5 shrink-0\"\n                    :class=\"member.status === 'blocked' ? 'text-destructive' : 'text-warning'\"\n                    aria-hidden=\"true\"\n                  />\n                  <ShieldCheck v-else class=\"text-success size-3.5 shrink-0\" aria-hidden=\"true\" />\n                  Blockers & Risks\n                </h4>\n\n                <div v-if=\"member.blockers\" class=\"text-xs leading-relaxed\">\n                  <p :class=\"member.status === 'blocked' ? 'text-destructive font-medium' : 'text-warning font-medium'\">\n                    {{ member.blockers }}\n                  </p>\n                </div>\n                <div v-else class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n                  <span class=\"text-success font-medium\">No blockers</span>\n                  <span>— Clear path to sprint goals</span>\n                </div>\n              </div>\n            </div>\n\n            <!-- Footer: Slack-style Reactions & Quick Actions -->\n            <div class=\"border-border/60 flex flex-wrap items-center justify-between gap-3 border-t pt-3\">\n              <!-- Reactions Pills -->\n              <div class=\"flex flex-wrap items-center gap-1.5\">\n                <button\n                  v-for=\"(reaction, rIdx) in member.reactions\"\n                  :key=\"rIdx\"\n                  type=\"button\"\n                  class=\"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                  :class=\"\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                  @click=\"toggleReaction(mIdx, rIdx)\"\n                >\n                  <span>{{ reaction.emoji }}</span>\n                  <span class=\"font-semibold tabular-nums\">{{ reaction.count }}</span>\n                </button>\n                <button\n                  type=\"button\"\n                  class=\"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                  @click=\"toggleReaction(mIdx, 0)\"\n                >\n                  <Smile class=\"size-3.5\" aria-hidden=\"true\" />\n                </button>\n              </div>\n\n              <!-- Quick Action Buttons -->\n              <div class=\"flex flex-wrap items-center gap-2\">\n                <Button\n                  variant=\"ghost\"\n                  size=\"sm\"\n                  class=\"text-muted-foreground hover:text-foreground h-8 gap-1.5 text-xs\"\n                >\n                  <Handshake class=\"size-3.5\" aria-hidden=\"true\" />\n                  Offer Help\n                </Button>\n                <Button variant=\"outline\" size=\"sm\" class=\"h-8 gap-1.5 text-xs font-medium\">\n                  <MessageSquare class=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n                  <span>Reply in Thread</span>\n                  <span\n                    v-if=\"member.threadCount\"\n                    class=\"bg-muted text-foreground py-0.2 ml-0.5 rounded px-1.5 font-mono text-xs font-bold tabular-nums\"\n                  >\n                    {{ member.threadCount }}\n                  </span>\n                </Button>\n              </div>\n            </div>\n          </CardContent>\n        </Card>\n      </div>\n    </div>\n  </div>\n</template>\n",
      "type": "registry:block",
      "target": "~/app/components/blocks/DailyStandupSummary.vue"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/avatar.json",
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/card.json",
    "https://uipkge.dev/r/vue/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"
  ]
}