Merge branch worktree-neo-surveillance-redesign into main — Neo Surveillance redesign

Full frontend redesign with glassmorphic dark theme, floating top nav,
Live2D mascot, split-pane messages, and Ops Center dashboard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com
This commit is contained in:
Developer
2026-07-28 14:32:47 +07:00
co-authored by Claude Opus 4.8 (1M context) <noreply@anthropic.com
parent 102b3bac1f
commit 3f4fa42098
25 changed files with 2102 additions and 96 deletions
@@ -20,7 +20,6 @@ import {
SelectValue,
} from "@/components/ui/select";
import {
useGuilds,
useImages,
useLoadMore,
useMessageDetail,
@@ -56,8 +55,16 @@ export default function MessagesPage() {
const ws = useWebSocket();
const { data: channels = [] } = useTextChannels(guildId);
const { data: messages, isLoading, error, refetch } = useMessages(guildId, selectedChannel || undefined);
const { data: cursorData } = useMessagesHasMore(guildId, selectedChannel || undefined);
const {
data: messages,
isLoading,
error,
refetch,
} = useMessages(guildId, selectedChannel || undefined);
const { data: cursorData } = useMessagesHasMore(
guildId,
selectedChannel || undefined,
);
const loadMoreMut = useLoadMore();
const { data: images } = useImages(guildId);
const { data: reviews } = useReview(selectedChannel || undefined);
@@ -132,8 +139,10 @@ export default function MessagesPage() {
</SelectTrigger>
<SelectContent>
<SelectItem value="">All channels</SelectItem>
{channels.map((ch: any) => (
<SelectItem key={ch.id} value={ch.id}># {ch.name}</SelectItem>
{channels.map((ch) => (
<SelectItem key={ch.id} value={ch.id}>
# {ch.name}
</SelectItem>
))}
</SelectContent>
</Select>
@@ -10,8 +10,6 @@ import type { VoiceRecording } from "@/lib/types";
type RecordingsTab = "library" | "stats";
type RecordingsTab = "library" | "stats";
export default function RecordingsPage() {
const { data: recordings, isLoading, error, refetch } = useRecordings();
const [playingId, setPlayingId] = useState<string | null>(null);