feat(ui): implement 'Twilight Velvet' dark theme and fix visibility issues

- Add 'Twilight Velvet' color palette to globals.css with OKLCH values
- Update SettingsPage headers, cards, and dialogs to use semantic theme variables
- Update HistoryCard, HistoryFeed, and DraftContent to support dark mode
- Update ProviderSelector and ProviderList to use custom card background (#2A2A3D)
- Add ThemeToggle component with improved visibility
- Ensure consistent use of 'bg-card', 'text-foreground', and 'text-muted-foreground'
This commit is contained in:
Max
2026-01-27 11:03:55 +07:00
parent e9e6fadb1d
commit 9b79856827
49 changed files with 2411 additions and 878 deletions

View File

@@ -0,0 +1,20 @@
import { faker } from '@faker-js/faker';
export interface UserSettings {
theme: 'light' | 'dark' | 'system';
fontSize: number;
reduceMotion: boolean;
language: string;
notificationsEnabled: boolean;
}
export const createSettings = (overrides: Partial<UserSettings> = {}): UserSettings => {
return {
theme: faker.helpers.arrayElement(['light', 'dark', 'system']),
fontSize: faker.number.int({ min: 12, max: 24 }),
reduceMotion: faker.datatype.boolean(),
language: 'en-US',
notificationsEnabled: faker.datatype.boolean(),
...overrides,
};
};

View File

@@ -0,0 +1,37 @@
import { faker } from '@faker-js/faker';
/**
* UserFactory
*
* Handles creation and cleanup of test users.
* Note: Since this is a local-first app without a real backend API for user creation yet,
* this factory currently generates mock data. adapting to real API calls later.
*/
export class UserFactory {
// In a real app, we would track IDs here for cleanup
// private createdUserIds: string[] = [];
async createUser(overrides = {}) {
const user = {
id: faker.string.uuid(),
email: faker.internet.email(),
name: faker.person.fullName(),
password: faker.internet.password(),
createdAt: new Date().toISOString(),
...overrides,
};
// Placeholder: In a real app, you would POST to API here
// const response = await fetch(\`\${process.env.API_URL}/users\`, ...);
return user;
}
async cleanup() {
// Placeholder: In a real app, you would DELETE users here
// for (const id of this.createdUserIds) { ... }
// For now, no cleanup needed for transient mock data
return Promise.resolve();
}
}