chore: ARTEX 初始化

ARTEX — AI 自主渗透测试系统(Go 后端 + Next.js 前端,单二进制内嵌)。

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Autumn-27andClaude Opus 4.8 committed 2026-07-26 04:27:45 -04:00
commit 0ef8561411
287 files changed
+70178

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
"use client";
import { useEffect, useState } from "react";
import { auth, type CurrentUser } from "@/lib/auth";
const FALLBACK: CurrentUser = { id: "1", name: "ARTEX", username: "artex", email: "", avatar: "", role: "operator" };
export function useCurrentUser(): CurrentUser {
const [user, setUser] = useState<CurrentUser>(FALLBACK);
useEffect(() => {
const u = auth.getCurrentUser();
if (u) setUser(u);
}, []);
return user;
}
+19
View File
@@ -0,0 +1,19 @@
import * as React from "react";
const LG_BREAKPOINT = 1024;
export function useIsLg() {
const [isLg, setIsLg] = React.useState<boolean | undefined>(undefined);
React.useEffect(() => {
const mql = window.matchMedia(`(min-width: ${LG_BREAKPOINT}px)`);
const onChange = () => {
setIsLg(window.innerWidth >= LG_BREAKPOINT);
};
mql.addEventListener("change", onChange);
setIsLg(window.innerWidth >= LG_BREAKPOINT);
return () => mql.removeEventListener("change", onChange);
}, []);
return !!isLg;
}
+19
View File
@@ -0,0 +1,19 @@
import * as React from "react";
const MOBILE_BREAKPOINT = 768;
export function useIsMobile() {
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined);
React.useEffect(() => {
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
const onChange = () => {
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
};
mql.addEventListener("change", onChange);
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
return () => mql.removeEventListener("change", onChange);
}, []);
return !!isMobile;
}