refactor(cms): deduplicate shared admin components and fix studio batch completion

- fix(studio): stop markBatchDone infinite recursion so batches complete
- refactor(api): merge api-response into api and drop the duplicate module
- refactor(media): extract shared media loader and URL validator
- refactor(ui): extract shared LoadingSpinner for site and admin groups
- refactor(dates): consolidate raw date formatting into formatDate util
- refactor(logs): share a single generic log-list loader across tables
- refactor(theme): merge both ColorField components and reuse contrast helpers
- refactor(import): extract shared ImportErrorBanner and SearchInput
- chore(): remove dead theme-editor-tabs after inlining tab components
This commit is contained in:
openhands committed 2026-09-05 20:58:42 +02:00
1 parent b12e405b34
commit 8c12fc6c60
93 files changed
+1447 -1005

No files matched your search

@@ -1,42 +0,0 @@
"use client";
import { useState } from "react";
export function ColorField({
name,
label,
description,
defaultValue,
}: {
name: string;
label: string;
description: string;
defaultValue: string;
backgroundColorKey?: string;
}) {
const [val, setVal] = useState(defaultValue);
return (
<div className="rounded-lg p-2">
<div className="flex items-start gap-2">
<input
type="color"
name={name}
value={val}
onChange={(e) => setVal(e.target.value)}
className="w-[42px] h-[36px] p-0 border-none bg-none cursor-pointer flex-shrink-0 rounded"
/>
<div className="flex flex-col min-w-0 flex-1">
<div className="flex items-baseline justify-between gap-2">
<span className="text-sm font-semibold text-[var(--admin-text)] leading-tight">
{label}
</span>
</div>
<span className="text-xs text-[var(--admin-text-muted)] leading-snug line-clamp-2">
{description}
</span>
</div>
</div>
</div>
);
}
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff