feat: standardize input styling with tier system, add depth and admin features

- Define 4 input tier CSS classes (input-standard, input-search, input-embedded, input-danger)
  in globals.css, migrating ~50 inputs across ~28 component files to use them
- Add subtle border and inset shadow to solid input tiers for resting-state visibility
- Fix focus ring clipping in settings panel scroll container
- Fix phantom Tailwind tokens (border-border-primary, placeholder-txt-muted)
- Add admin user management panel, storage management, and account deletion utilities
This commit is contained in:
Jannis Braun
2026-03-14 13:49:32 +01:00
parent afbc4b5e31
commit 836f0acef6
45 changed files with 1478 additions and 235 deletions
+60
View File
@@ -561,3 +561,63 @@ export interface DeleteAccountRequest {
password: string;
username: string; // Must match — confirmation safeguard
}
// ─── Storage Management Types ─────────────────────────────────────────────
export interface StorageBreakdown {
type: string; // 'image' | 'video' | 'audio' | 'document' | 'other'
count: number;
size: number;
}
export interface StorageStats {
totalFiles: number;
totalSize: number;
referencedFiles: number;
referencedSize: number;
orphanedFiles: number;
orphanedSize: number;
unlinkedAttachments: number;
unlinkedSize: number;
breakdown: StorageBreakdown[];
}
export interface OrphanedFile {
filename: string;
size: number;
modifiedAt: number;
}
export interface CleanupResult {
dryRun: boolean;
deletedFiles: number;
freedBytes: number;
deletedAttachmentRecords: number;
errors: string[];
}
// ─── Admin User Management Types ──────────────────────────────────────────
export interface AdminUser {
id: string;
username: string;
displayName: string | null;
avatar: string | null;
avatarColor: string | null;
status: string;
isAdmin: boolean;
isDeleted: boolean;
homeInstance: string | null;
createdAt: number;
}
export interface AdminUserListResponse {
users: AdminUser[];
total: number;
page: number;
pageSize: number;
}
export interface AdminResetPasswordResponse {
temporaryPassword: string;
}