Initial commit: TaskPool React panel

- React frontend with route-level code splitting
- Backend rebranded from Baihu to TaskPool
- DB brand migration script and local compatibility
This commit is contained in:
2026-07-26 08:43:52 +08:00
commit e6956aa001
397 changed files with 73621 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
import { cn } from '@/lib/utils'
export function Tabs({
value,
onValueChange,
items,
className,
}: {
value: string
onValueChange: (v: string) => void
items: { value: string; label: string }[]
className?: string
}) {
return (
<div
className={cn(
'flex max-w-full items-center gap-1.5 overflow-x-auto rounded-lg border border-[var(--border)] bg-[var(--bg-tertiary)] p-1.5',
'[scrollbar-width:thin]',
className,
)}
role="tablist"
>
{items.map((item) => {
const active = value === item.value
return (
<button
key={item.value}
type="button"
role="tab"
aria-selected={active}
className={cn(
'relative shrink-0 rounded-md px-3.5 py-1.5 text-[13px] font-medium whitespace-nowrap transition-colors',
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]',
active
? 'bg-[var(--bg-secondary)] text-[var(--text-primary)] shadow-[var(--shadow-sm)] ring-1 ring-[var(--border)]'
: 'text-[var(--text-muted)] hover:bg-[var(--bg-hover)]/60 hover:text-[var(--text-secondary)]',
)}
onClick={() => onValueChange(item.value)}
>
{item.label}
</button>
)
})}
</div>
)
}