large update
This commit is contained in:
1 parent
2ed952f19c
commit
65e85135c1
111 files changed
+3936
-2933
No files matched your search
@@ -1,40 +1,5 @@
|
||||
import type { DesktopEvent } from "@shared/types";
|
||||
|
||||
// --- Legacy simple batcher -- kept for backward compatibility ---
|
||||
|
||||
type BatchCallback = () => void;
|
||||
|
||||
export function createEventBatcher(callback: BatchCallback, windowMs = 50) {
|
||||
let timer: ReturnType<typeof setTimeout> | null = null;
|
||||
|
||||
function schedule() {
|
||||
if (timer !== null) return; // already scheduled -- coalesce
|
||||
timer = setTimeout(() => {
|
||||
timer = null;
|
||||
callback();
|
||||
}, windowMs);
|
||||
}
|
||||
|
||||
function flush() {
|
||||
if (timer !== null) {
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
function dispose() {
|
||||
if (timer !== null) {
|
||||
clearTimeout(timer);
|
||||
timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
return { schedule, flush, dispose };
|
||||
}
|
||||
|
||||
// --- Enhanced batcher for granular events ---
|
||||
|
||||
export interface GranularEventEntry {
|
||||
type: string;
|
||||
entityId: string;
|
||||
|
||||
@@ -1,14 +1,3 @@
|
||||
/**
|
||||
* Keyboard navigation utilities for virtualized lists.
|
||||
* Implements roving tabindex pattern for accessible arrow-key navigation.
|
||||
*
|
||||
* The useRovingTabIndex hook can be used in two ways:
|
||||
* 1. As a React hook (called inside a component) -- it creates its own React state
|
||||
* 2. As a standalone factory (for testing) -- it manages state internally
|
||||
*
|
||||
* This dual design allows pure-logic testing without DOM or React rendering.
|
||||
*/
|
||||
|
||||
interface RovingTabIndexResult {
|
||||
containerRef: { current: HTMLDivElement | null };
|
||||
focusedIndex: number;
|
||||
@@ -17,26 +6,7 @@ interface RovingTabIndexResult {
|
||||
getTabIndex: (index: number) => 0 | -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Roving tabindex hook for keyboard navigation in lists.
|
||||
*
|
||||
* Usage in React component:
|
||||
* ```tsx
|
||||
* const { containerRef, focusedIndex, handleKeyDown, getTabIndex } = useRovingTabIndex(items.length);
|
||||
* return (
|
||||
* <div ref={containerRef} onKeyDown={handleKeyDown} role="listbox">
|
||||
* {items.map((item, i) => (
|
||||
* <div key={item.id} tabIndex={getTabIndex(i)} data-index={i} role="option">
|
||||
* ...
|
||||
* </div>
|
||||
* ))}
|
||||
* </div>
|
||||
* );
|
||||
* ```
|
||||
*
|
||||
* Supports: ArrowDown, ArrowUp, Home, End, j (down), k (up)
|
||||
* Wraps around at boundaries.
|
||||
*/
|
||||
/** Roving tabindex for keyboard nav in lists. Supports Arrow/Home/End/j/k with wrap-around. */
|
||||
export function useRovingTabIndex(itemCount: number): RovingTabIndexResult {
|
||||
// Use internal mutable state for testability outside React
|
||||
// In a React component context, this still works correctly because
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/**
|
||||
* Canonical status & priority color definitions.
|
||||
*
|
||||
* Every component that renders a status indicator (StatusIcon, StatusBadge,
|
||||
* agent status dots, etc.) should import from here so colors stay consistent.
|
||||
*/
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Issue status colors
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/** StatusIcon circle: text + border classes */
|
||||
export const issueStatusIcon: Record<string, string> = {
|
||||
backlog: "text-muted-foreground border-muted-foreground",
|
||||
todo: "text-blue-600 border-blue-600 dark:text-blue-400 dark:border-blue-400",
|
||||
in_progress: "text-yellow-600 border-yellow-600 dark:text-yellow-400 dark:border-yellow-400",
|
||||
in_review: "text-violet-600 border-violet-600 dark:text-violet-400 dark:border-violet-400",
|
||||
done: "text-green-600 border-green-600 dark:text-green-400 dark:border-green-400",
|
||||
cancelled: "text-neutral-500 border-neutral-500",
|
||||
blocked: "text-red-600 border-red-600 dark:text-red-400 dark:border-red-400",
|
||||
};
|
||||
|
||||
export const issueStatusIconDefault = "text-muted-foreground border-muted-foreground";
|
||||
|
||||
/** Text-only color for issue statuses (dropdowns, labels) */
|
||||
export const issueStatusText: Record<string, string> = {
|
||||
backlog: "text-muted-foreground",
|
||||
todo: "text-blue-600 dark:text-blue-400",
|
||||
in_progress: "text-yellow-600 dark:text-yellow-400",
|
||||
in_review: "text-violet-600 dark:text-violet-400",
|
||||
done: "text-green-600 dark:text-green-400",
|
||||
cancelled: "text-neutral-500",
|
||||
blocked: "text-red-600 dark:text-red-400",
|
||||
};
|
||||
|
||||
export const issueStatusTextDefault = "text-muted-foreground";
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Badge colors — used by StatusBadge for all entity types
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const statusBadge: Record<string, string> = {
|
||||
// Agent statuses
|
||||
active: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
running: "bg-cyan-100 text-cyan-700 dark:bg-cyan-900/50 dark:text-cyan-300",
|
||||
paused: "bg-orange-100 text-orange-700 dark:bg-orange-900/50 dark:text-orange-300",
|
||||
idle: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/50 dark:text-yellow-300",
|
||||
archived: "bg-muted text-muted-foreground",
|
||||
|
||||
// Goal statuses
|
||||
planned: "bg-muted text-muted-foreground",
|
||||
achieved: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
completed: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
|
||||
// Run statuses
|
||||
failed: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
|
||||
timed_out: "bg-orange-100 text-orange-700 dark:bg-orange-900/50 dark:text-orange-300",
|
||||
succeeded: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
error: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
|
||||
terminated: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
|
||||
pending: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/50 dark:text-yellow-300",
|
||||
|
||||
// Approval statuses
|
||||
pending_approval: "bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300",
|
||||
revision_requested: "bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300",
|
||||
approved: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
rejected: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
|
||||
|
||||
// Issue statuses — consistent hues with issueStatusIcon above
|
||||
backlog: "bg-muted text-muted-foreground",
|
||||
todo: "bg-blue-100 text-blue-700 dark:bg-blue-900/50 dark:text-blue-300",
|
||||
in_progress: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/50 dark:text-yellow-300",
|
||||
in_review: "bg-violet-100 text-violet-700 dark:bg-violet-900/50 dark:text-violet-300",
|
||||
blocked: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
|
||||
done: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
|
||||
cancelled: "bg-muted text-muted-foreground",
|
||||
};
|
||||
|
||||
export const statusBadgeDefault = "bg-muted text-muted-foreground";
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Agent status dot — solid background for small indicator dots
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const agentStatusDot: Record<string, string> = {
|
||||
running: "bg-cyan-400 animate-pulse",
|
||||
active: "bg-green-400",
|
||||
paused: "bg-yellow-400",
|
||||
idle: "bg-yellow-400",
|
||||
pending_approval: "bg-amber-400",
|
||||
error: "bg-red-400",
|
||||
archived: "bg-neutral-400",
|
||||
};
|
||||
|
||||
export const agentStatusDotDefault = "bg-neutral-400";
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Priority colors
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const priorityColor: Record<string, string> = {
|
||||
critical: "text-red-600 dark:text-red-400",
|
||||
high: "text-orange-600 dark:text-orange-400",
|
||||
medium: "text-yellow-600 dark:text-yellow-400",
|
||||
low: "text-blue-600 dark:text-blue-400",
|
||||
};
|
||||
|
||||
export const priorityColorDefault = "text-yellow-600 dark:text-yellow-400";
|
||||
Reference in new issue
Block a user