Task Rows
spectrumui/task-rowsFreeBlock
Live agent task rows with status badges and expandable notes.
Install it
npx shadcn@latest add https://ui.spectrumhq.in/r/task-rows.jsonSource
1'use client';23import { useState } from 'react';4import { Check, ChevronDown, CircleDashed, Loader2, X } from 'lucide-react';5import { cn } from '@/lib/utils';67const KEYFRAMES = `8@keyframes su-pop { 0% { opacity: 0; transform: scale(0.85) } 100% { opacity: 1; transform: none } }9`;1011export type TaskStatus = 'queued' | 'running' | 'completed' | 'failed';1213export interface TaskRow {14 id: string;15 title: string;16 detail?: string;17 status: TaskStatus;18 note?: string;19}2021export type TaskRowsVariant = 'Default' | 'Compact';2223export interface TaskRowsProps {24 tasks: TaskRow[];25 variant?: TaskRowsVariant;26 className?: string;27}2829const BADGE: Record<TaskStatus, string> = {30 queued: 'bg-black/[0.05] text-neutral-500 dark:bg-white/[0.07] dark:text-neutral-400',31 running: 'bg-sky-500/10 text-sky-700 dark:text-sky-400',32 completed: 'bg-emerald-500/10 text-emerald-700 dark:text-emerald-400',33 failed: 'bg-red-500/10 text-red-700 dark:text-red-400',34};3536function StatusIcon({ status }: { status: TaskStatus }) {37 if (status === 'completed')38 return (39 <span className="grid size-5 place-items-center rounded-full bg-emerald-500/15 text-emerald-600 motion-safe:animate-[su-pop_200ms_cubic-bezier(0.23,1,0.32,1)_both] dark:text-emerald-400">40 <Check className="size-3" strokeWidth={3} />41 </span>42 );43 if (status === 'failed')44 return (45 <span className="grid size-5 place-items-center rounded-full bg-red-500/15 text-red-600 motion-safe:animate-[su-pop_200ms_cubic-bezier(0.23,1,0.32,1)_both] dark:text-red-400">46 <X className="size-3" strokeWidth={3} />47 </span>48 );49 if (status === 'running')50 return (51 <Loader2 className="size-4 animate-spin text-sky-600 [animation-duration:800ms] motion-reduce:animate-none dark:text-sky-400" />52 );53 return <CircleDashed className="size-4 text-neutral-300 dark:text-neutral-600" />;54}5556export function TaskRows({ tasks, variant = 'Default', className }: TaskRowsProps) {57 const [openId, setOpenId] = useState<string | null>(null);58 const compact = variant === 'Compact';5960 return (61 <ul62 className={cn(63 'w-full max-w-[480px] divide-y divide-black/[0.05] overflow-hidden rounded-2xl border border-black/[0.07] bg-white shadow-xs dark:divide-white/[0.06] dark:border-white/[0.08] dark:bg-[#0B0B0D]',64 className,65 )}66 >67 <style dangerouslySetInnerHTML={{ __html: KEYFRAMES }} />68 {tasks.map((task) => {69 const open = task.id === openId;70// … truncated
What it pulls in
npm packages
Files it writes
More from spectrumui
All 182 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Agent Planagent-plan | spectrumui | Blocks | Free | 1 dep | |
| Agent Stepsagent-steps | spectrumui | Blocks | Free | 1 dep · 2 files | |
| Approval Cardapproval-card | spectrumui | Blocks | Free | 1 dep | |
| Chat Empty Statechat-empty-state | spectrumui | Blocks | Free | 1 dep · 2 files | |
| Citation Sourcescitation-sources | spectrumui | Blocks | Free | no deps · 2 files | |
| Code Blockcode-block | spectrumui | Blocks | Free | 1 dep | |
| Conversation Listconversation-list | spectrumui | Blocks | Free | 1 dep | |
| Diff Viewdiff-view | spectrumui | Blocks | Free | 1 dep |
