Add tweakcn custom theme import

Adds a browser-local custom tweakcn theme slot while preserving the existing built-in themes.

Includes:
- tweakcn share-link import, validation, persistence, and custom theme rendering
- Custom option in Appearance and Quick Settings
- responsive/config toolbar and chat tool-card polish from follow-up review
- security hardening for bounded fetches, CSS token validation, redirect handling, and fail-closed unreadable payloads

Verification:
- OPENCLAW_LOCAL_CHECK=0 pnpm check:changed
- GitHub CI clean on 6ff13a1b33
This commit is contained in:
Val Alexander
2026-04-24 20:36:45 -05:00
committed by GitHub
parent 835c4e053c
commit ead8be96fd
23 changed files with 2199 additions and 55 deletions

View File

@@ -747,7 +747,7 @@ function classifyTarget(arg, cwd) {
if (relative.startsWith("src/plugins/")) {
return "plugin";
}
if (relative.startsWith("ui/src/ui/")) {
if (relative.startsWith("ui/src/")) {
return "ui";
}
if (relative.startsWith("src/utils/")) {
@@ -776,6 +776,17 @@ function resolveLightLaneIncludePatterns(kind, targetArg, cwd) {
return null;
}
function shouldUseWholeConfigTarget(kind, targetArg, cwd) {
if (isVitestConfigTargetForKind(kind, targetArg, cwd)) {
return true;
}
if (kind !== "ui") {
return false;
}
const relative = toRepoRelativeTarget(targetArg, cwd);
return relative.startsWith("ui/src/") && !relative.startsWith("ui/src/ui/");
}
function createVitestArgs(params) {
return [
"exec",
@@ -956,7 +967,7 @@ export function buildVitestRunPlans(
(kind === "default" &&
grouped.every((targetArg) => isFileLikeTarget(toRepoRelativeTarget(targetArg, cwd))));
const useWholeConfigTarget = grouped.some((targetArg) =>
isVitestConfigTargetForKind(kind, targetArg, cwd),
shouldUseWholeConfigTarget(kind, targetArg, cwd),
);
const includePatterns = useCliTargetArgs
? null