Import Tripoli Cloud frontend prototype

React/TypeScript/Vite/Tailwind prototype from the design session (login,
dashboard, photos, backups, settings views with mocked API layer).
Infra work (Rust services, Ansible, OpenTofu) follows in subsequent commits.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-09-16 21:21:43 +02:00
commit 5dbd3b96f6
73 changed files with 4789 additions and 0 deletions

View file

@ -0,0 +1,10 @@
/**
* Auth-screen background layers. Replace each entry with
* `url('/assets/bg-1.jpg') center/cover no-repeat` for real photography —
* the crossfade logic in useBackgroundCrossfade doesn't change.
*/
export const BACKGROUND_IMAGES: string[] = [
'radial-gradient(120% 95% at 22% 12%, #2b3340 0%, #121620 55%, #070910 100%)',
'radial-gradient(120% 95% at 78% 18%, #2f2b3f 0%, #16131f 55%, #08070d 100%)',
'radial-gradient(130% 100% at 45% 85%, #1f3340 0%, #0f161c 55%, #070a0d 100%)',
];

15
app/src/lib/gradients.ts Normal file
View file

@ -0,0 +1,15 @@
/** Shared placeholder-thumbnail gradients — swap for real thumbnails once assets exist. */
export function tone(a: string, b: string): string {
return `linear-gradient(140deg, ${a} 0%, ${b} 100%)`;
}
export const THUMB_TONES = [
tone('#3b4a63', '#1b2230'),
tone('#4a3f5f', '#221c2e'),
tone('#5a4436', '#261d18'),
tone('#33505a', '#182428'),
tone('#46384f', '#1f1a24'),
tone('#3d4a41', '#1b211d'),
tone('#3a4560', '#1a1f2c'),
tone('#51413a', '#241d19'),
] as const;

View file

@ -0,0 +1,9 @@
const EMAIL_RE = /^[^@\s]+@[^@\s]+\.[a-z]{2,}$/i;
export function isValidEmail(value: string): boolean {
return EMAIL_RE.test(value);
}
export function isValidPassword(value: string): boolean {
return value.length >= 8;
}