Fond de connexion : couleurs nettement plus vives + fix cache navigateur
- Fond génératif beaucoup plus lumineux et coloré (base par scène, taches plus grandes/saturées, scrim réduit à un dégradé directionnel léger côté texte) - le premier essai était encore jugé trop sombre/ invisible par l'utilisateur. - Cause réelle du "rien n'a changé" : le Caddyfile ne fixait aucun Cache-Control, donc le navigateur appliquait sa propre heuristique et gardait l'ancien index.html en cache après un déploiement. Corrigé sur le serveur (Caddyfile) et documenté dans tripoli-edge/deploy/Caddyfile.snippet : `no-cache` sur index.html (revalidation à chaque chargement), cache long `immutable` sur /assets/* (noms hachés par Vite, donc sans risque). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
c5147f5cb0
commit
ecdaf19583
4 changed files with 71 additions and 27 deletions
|
|
@ -5,17 +5,17 @@ export function AuthBackground() {
|
||||||
const activeIndex = useBackgroundCrossfade();
|
const activeIndex = useBackgroundCrossfade();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="absolute inset-0 overflow-hidden bg-[#07080c]">
|
<div className="absolute inset-0 overflow-hidden bg-[#120f24]">
|
||||||
{BACKGROUND_SCENES.map((scene, i) => (
|
{BACKGROUND_SCENES.map((scene, i) => (
|
||||||
<div
|
<div
|
||||||
key={scene.id}
|
key={scene.id}
|
||||||
className="absolute inset-0 transition-opacity duration-[2400ms] ease-in-out"
|
className="absolute inset-0 transition-opacity duration-[2400ms] ease-in-out"
|
||||||
style={{ opacity: i === activeIndex ? 1 : 0 }}
|
style={{ opacity: i === activeIndex ? 1 : 0, background: scene.base }}
|
||||||
>
|
>
|
||||||
{scene.blobs.map((blob, bi) => (
|
{scene.blobs.map((blob, bi) => (
|
||||||
<div
|
<div
|
||||||
key={bi}
|
key={bi}
|
||||||
className="tc-drift absolute rounded-full blur-[90px]"
|
className="tc-drift absolute rounded-full blur-[80px]"
|
||||||
style={{
|
style={{
|
||||||
top: blob.top,
|
top: blob.top,
|
||||||
left: blob.left,
|
left: blob.left,
|
||||||
|
|
@ -31,18 +31,16 @@ export function AuthBackground() {
|
||||||
|
|
||||||
{/* Grain léger : casse l'effet "dégradé plat", donne une texture
|
{/* Grain léger : casse l'effet "dégradé plat", donne une texture
|
||||||
plus organique - technique courante sur les fonds génératifs. */}
|
plus organique - technique courante sur les fonds génératifs. */}
|
||||||
<svg className="absolute inset-0 h-full w-full opacity-[0.05] mix-blend-overlay" aria-hidden="true">
|
<svg className="absolute inset-0 h-full w-full opacity-[0.06] mix-blend-overlay" aria-hidden="true">
|
||||||
<filter id="tc-grain">
|
<filter id="tc-grain">
|
||||||
<feTurbulence type="fractalNoise" baseFrequency="0.85" numOctaves="2" stitchTiles="stitch" />
|
<feTurbulence type="fractalNoise" baseFrequency="0.85" numOctaves="2" stitchTiles="stitch" />
|
||||||
</filter>
|
</filter>
|
||||||
<rect width="100%" height="100%" filter="url(#tc-grain)" />
|
<rect width="100%" height="100%" filter="url(#tc-grain)" />
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
{/* Scrim en deux passes : un voile uniforme (garantit le contraste du
|
{/* Assombrit seulement côté texte (gauche) - le reste du fond reste
|
||||||
texte quelle que soit la position des taches de couleur) plus un
|
vif et visible, pas noyé sous un voile uniforme. */}
|
||||||
dégradé directionnel plus marqué côté texte. */}
|
<div className="absolute inset-0 bg-[linear-gradient(100deg,rgba(9,7,18,0.66)_0%,rgba(9,7,18,0.28)_38%,transparent_66%)]" />
|
||||||
<div className="absolute inset-0 bg-[#07080c]/48" />
|
|
||||||
<div className="absolute inset-0 bg-[linear-gradient(100deg,rgba(6,7,11,0.74)_0%,rgba(6,7,11,0.44)_46%,rgba(6,7,11,0.22)_100%)]" />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import { TripoliLogo, TripoliWordmark } from '../layout/TripoliLogo';
|
||||||
|
|
||||||
export function AuthLayout() {
|
export function AuthLayout() {
|
||||||
return (
|
return (
|
||||||
<div className="relative min-h-screen overflow-hidden bg-[#07080c]">
|
<div className="relative min-h-screen overflow-hidden bg-[#120f24]">
|
||||||
<AuthBackground />
|
<AuthBackground />
|
||||||
|
|
||||||
<div className="relative flex min-h-screen flex-col justify-between gap-11 p-6 sm:p-10 lg:p-[60px]">
|
<div className="relative flex min-h-screen flex-col justify-between gap-11 p-6 sm:p-10 lg:p-[60px]">
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
/**
|
/**
|
||||||
* Scènes du diaporama de fond de l'écran de connexion : de l'art génératif
|
* Scènes du diaporama de fond de l'écran de connexion : art génératif
|
||||||
* (pas de photo tierce, pour rester libre de droits) - deux à trois taches
|
* (pas de photo tierce, pour rester libre de droits) - de larges taches de
|
||||||
* de couleur douces, floutées, qui dérivent lentement (voir `.tc-drift`
|
* couleur saturées, floutées, qui dérivent lentement (voir `.tc-drift` dans
|
||||||
* dans index.css) et s'enchaînent en fondu. Palette "zen" volontairement
|
* index.css) et s'enchaînent en fondu. Volontairement lumineux et coloré,
|
||||||
* sourde : jamais de couleur saturée à pleine opacité.
|
* pas "noir avec une pointe de couleur" - le fond DOIT se voir.
|
||||||
*/
|
*/
|
||||||
export interface BackgroundBlob {
|
export interface BackgroundBlob {
|
||||||
color: string;
|
color: string;
|
||||||
|
|
@ -14,36 +14,46 @@ export interface BackgroundBlob {
|
||||||
|
|
||||||
export interface BackgroundScene {
|
export interface BackgroundScene {
|
||||||
id: string;
|
id: string;
|
||||||
|
/** Couleur de base de la scène - un dégradé de fond, pas du noir plat. */
|
||||||
|
base: string;
|
||||||
blobs: BackgroundBlob[];
|
blobs: BackgroundBlob[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BACKGROUND_SCENES: BackgroundScene[] = [
|
export const BACKGROUND_SCENES: BackgroundScene[] = [
|
||||||
{
|
{
|
||||||
id: 'aube',
|
id: 'aube',
|
||||||
|
base: 'linear-gradient(160deg, #241a3d 0%, #171029 60%, #0d0a18 100%)',
|
||||||
blobs: [
|
blobs: [
|
||||||
{ color: 'rgba(123,148,255,0.42)', top: '-12%', left: '58%', size: '56vw' },
|
{ color: 'rgba(140,163,255,0.62)', top: '-18%', left: '52%', size: '62vw' },
|
||||||
{ color: 'rgba(255,168,140,0.24)', top: '52%', left: '2%', size: '44vw' },
|
{ color: 'rgba(255,140,163,0.42)', top: '46%', left: '-6%', size: '52vw' },
|
||||||
|
{ color: 'rgba(255,196,120,0.28)', top: '62%', left: '62%', size: '40vw' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'nuit',
|
id: 'nuit',
|
||||||
|
base: 'linear-gradient(160deg, #1c1740 0%, #130f2c 60%, #0b0918 100%)',
|
||||||
blobs: [
|
blobs: [
|
||||||
{ color: 'rgba(91,102,255,0.38)', top: '-16%', left: '72%', size: '60vw' },
|
{ color: 'rgba(110,120,255,0.58)', top: '-20%', left: '66%', size: '66vw' },
|
||||||
{ color: 'rgba(124,92,255,0.3)', top: '58%', left: '12%', size: '50vw' },
|
{ color: 'rgba(163,110,255,0.46)', top: '54%', left: '4%', size: '54vw' },
|
||||||
|
{ color: 'rgba(94,214,255,0.22)', top: '4%', left: '2%', size: '36vw' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'foret',
|
id: 'foret',
|
||||||
|
base: 'linear-gradient(160deg, #0f2a2e 0%, #0e1f26 60%, #0a1418 100%)',
|
||||||
blobs: [
|
blobs: [
|
||||||
{ color: 'rgba(94,214,170,0.22)', top: '8%', left: '76%', size: '48vw' },
|
{ color: 'rgba(94,224,180,0.48)', top: '2%', left: '70%', size: '54vw' },
|
||||||
{ color: 'rgba(53,124,132,0.38)', top: '62%', left: '6%', size: '54vw' },
|
{ color: 'rgba(53,150,166,0.5)', top: '58%', left: '-4%', size: '58vw' },
|
||||||
|
{ color: 'rgba(210,255,150,0.2)', top: '70%', left: '68%', size: '38vw' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'braise',
|
id: 'braise',
|
||||||
|
base: 'linear-gradient(160deg, #351a2c 0%, #23122a 60%, #130a1a 100%)',
|
||||||
blobs: [
|
blobs: [
|
||||||
{ color: 'rgba(255,186,128,0.26)', top: '-6%', left: '18%', size: '50vw' },
|
{ color: 'rgba(255,176,110,0.5)', top: '-10%', left: '10%', size: '54vw' },
|
||||||
{ color: 'rgba(179,111,255,0.3)', top: '54%', left: '68%', size: '54vw' },
|
{ color: 'rgba(210,120,255,0.44)', top: '48%', left: '64%', size: '58vw' },
|
||||||
|
{ color: 'rgba(255,120,150,0.26)', top: '68%', left: '10%', size: '40vw' },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,26 @@
|
||||||
# Bloc ajouté à /opt/edge/Caddyfile sur le serveur (fichier partagé avec
|
# Bloc ajouté à /opt/edge/Caddyfile sur le serveur (fichier partagé avec
|
||||||
# les 6 autres projets hébergés, donc pas dans ce dépôt en entier — voir
|
# les 6 autres projets hébergés, donc pas dans ce dépôt en entier — voir
|
||||||
# le README de ce dossier).
|
# le README de ce dossier). Tenu à jour ici pour référence, mais la
|
||||||
|
# source de vérité reste le fichier sur le serveur.
|
||||||
#
|
#
|
||||||
# Pourquoi Caddy et pas tripoli-edge lui-même sur 80/443 : les ports 80 et
|
# Pourquoi Caddy et pas tripoli-edge lui-même sur 80/443 : les ports 80 et
|
||||||
# 443 appartiennent déjà à ce Caddy. tripoli-edge est un service interne
|
# 443 appartiennent déjà à ce Caddy. tripoli-edge est un service interne
|
||||||
# (172.17.0.1:9000, passerelle docker0, jamais exposé publiquement) :
|
# (172.17.0.1:9000, passerelle docker0, jamais exposé publiquement) :
|
||||||
# Caddy fait TLS/ACME et le routage par Host, tripoli-edge fait le reste.
|
# Caddy fait TLS/ACME et le routage par Host, tripoli-edge fait le reste
|
||||||
|
# via /api/*, /healthz et /metrics.
|
||||||
|
#
|
||||||
|
# Le frontend (build statique React) est servi directement par Caddy
|
||||||
|
# depuis /var/www/tripoli-cloud, sans passer par tripoli-edge.
|
||||||
|
#
|
||||||
|
# Cache-Control explicite, sans quoi le navigateur applique sa propre
|
||||||
|
# heuristique - imprévisible, et découvert à nos dépens : un déploiement
|
||||||
|
# de frontend restait invisible pour un navigateur qui avait mis en
|
||||||
|
# cache l'ancien index.html. `no-cache` force la revalidation à chaque
|
||||||
|
# chargement (le fichier change à chaque déploiement) ; les fichiers
|
||||||
|
# sous /assets/ ont un nom haché par leur contenu (Vite), donc peuvent
|
||||||
|
# être mis en cache indéfiniment sans risque.
|
||||||
|
|
||||||
tripoli.cloud, www.tripoli.cloud {
|
tripoli.cloud, www.tripoli.cloud {
|
||||||
reverse_proxy 172.17.0.1:9000
|
|
||||||
|
|
||||||
header {
|
header {
|
||||||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||||
X-Content-Type-Options "nosniff"
|
X-Content-Type-Options "nosniff"
|
||||||
|
|
@ -18,6 +29,31 @@ tripoli.cloud, www.tripoli.cloud {
|
||||||
-Server
|
-Server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handle /api/* {
|
||||||
|
reverse_proxy 172.17.0.1:9000
|
||||||
|
}
|
||||||
|
|
||||||
|
handle /healthz {
|
||||||
|
reverse_proxy 172.17.0.1:9000
|
||||||
|
}
|
||||||
|
|
||||||
|
handle /metrics {
|
||||||
|
reverse_proxy 172.17.0.1:9000
|
||||||
|
}
|
||||||
|
|
||||||
|
handle /assets/* {
|
||||||
|
root * /var/www/tripoli-cloud
|
||||||
|
header Cache-Control "public, max-age=31536000, immutable"
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
root * /var/www/tripoli-cloud
|
||||||
|
header Cache-Control "no-cache"
|
||||||
|
try_files {path} /index.html
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
log {
|
log {
|
||||||
output file /var/log/caddy/tripoli-cloud.log
|
output file /var/log/caddy/tripoli-cloud.log
|
||||||
format json
|
format json
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue