+
Connexion chiffrée (HTTPS), mots de passe hachés (Argon2) — jamais stockés en clair.
diff --git a/app/src/components/auth/Doodle.tsx b/app/src/components/auth/Doodle.tsx
new file mode 100644
index 0000000..63b0333
--- /dev/null
+++ b/app/src/components/auth/Doodle.tsx
@@ -0,0 +1,35 @@
+/** Petits traits dessinés à la main, en accent décoratif - inspirés du
+ * ton "studiocart.co" : jamais informatifs, purement une touche humaine
+ * dans une interface par ailleurs très structurée. */
+export function DoodleSquiggle({ className }: { className?: string }) {
+ return (
+
+
+
+ );
+}
+
+export function DoodleArrow({ className }: { className?: string }) {
+ return (
+
+
+
+
+ );
+}
diff --git a/app/src/components/layout/TripoliLogo.tsx b/app/src/components/layout/TripoliLogo.tsx
index 2690450..c3b7afa 100644
--- a/app/src/components/layout/TripoliLogo.tsx
+++ b/app/src/components/layout/TripoliLogo.tsx
@@ -5,8 +5,8 @@ interface TripoliLogoProps {
/** Minimalist inline SVG mark — no external asset, easy to swap later. */
export function TripoliLogo({ size = 28, variant = 'sidebar' }: TripoliLogoProps) {
- const badgeFill = variant === 'hero' ? 'rgba(255,255,255,0.08)' : 'rgba(91,140,255,0.14)';
- const badgeStroke = variant === 'hero' ? 'rgba(255,255,255,0.22)' : 'rgba(91,140,255,0.36)';
+ const badgeFill = variant === 'hero' ? 'rgba(23,20,14,0.05)' : 'rgba(91,140,255,0.14)';
+ const badgeStroke = variant === 'hero' ? 'rgba(23,20,14,0.16)' : 'rgba(91,140,255,0.36)';
return (
diff --git a/app/src/contexts/ThemeContext.tsx b/app/src/contexts/ThemeContext.tsx
index e9b3d74..9696092 100644
--- a/app/src/contexts/ThemeContext.tsx
+++ b/app/src/contexts/ThemeContext.tsx
@@ -14,7 +14,7 @@ const ThemeContext = createContext(null);
* `dark:` utilities and the CSS-variable tokens in index.css move together.
*/
export function ThemeProvider({ children }: { children: ReactNode }) {
- const [theme, setTheme] = useState('dark');
+ const [theme, setTheme] = useState('light');
useEffect(() => {
document.documentElement.classList.toggle('dark', theme === 'dark');
diff --git a/app/src/index.css b/app/src/index.css
index 2effa0e..ac69d4c 100644
--- a/app/src/index.css
+++ b/app/src/index.css
@@ -1,4 +1,4 @@
-@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Fraunces:ital,opsz,wght@0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,500;1,9..144,600&display=swap');
@tailwind base;
@tailwind components;
@@ -8,17 +8,22 @@
* Theme tokens consumed by tailwind.config.js (colors.bg, colors.panel, ...).
* `.dark` is toggled on by ThemeContext — this is what makes
* Tailwind's `dark:` strategy and these variables move together.
+ *
+ * Thème clair "éditorial" par défaut (papier + encre + citron vert en
+ * accent) plutôt que le coffre-fort sombre d'origine - inspiré du ton
+ * studiocart.co : gros titres serif, cartes blanches nettes, un seul
+ * accent vif utilisé avec parcimonie plutôt que des néons partout.
*/
:root {
- --tc-bg: #f4f6fb;
- --tc-panel: rgba(255, 255, 255, 0.72);
- --tc-panel-2: rgba(255, 255, 255, 0.9);
- --tc-line: rgba(16, 24, 40, 0.1);
- --tc-field: rgba(16, 24, 40, 0.04);
- --tc-selected: rgba(91, 140, 255, 0.12);
- --tc-ink: #101828;
- --tc-ink-2: rgba(16, 24, 40, 0.58);
- --tc-shadow: 0 24px 54px rgba(16, 24, 40, 0.14);
+ --tc-bg: #faf7f1;
+ --tc-panel: #ffffff;
+ --tc-panel-2: #fffefb;
+ --tc-line: rgba(23, 20, 14, 0.12);
+ --tc-field: rgba(23, 20, 14, 0.045);
+ --tc-selected: rgba(196, 255, 82, 0.38);
+ --tc-ink: #171410;
+ --tc-ink-2: rgba(23, 20, 14, 0.58);
+ --tc-shadow: 0 20px 48px rgba(23, 20, 14, 0.09);
}
:root.dark {
@@ -46,6 +51,17 @@ body {
-webkit-font-smoothing: antialiased;
}
+/* Surlignage façon marqueur derrière un fragment de texte - un
+ dégradé plat plutôt qu'un pseudo-élément, pour rester sur une seule
+ classe utilitaire réutilisable n'importe où dans un titre. */
+.tc-highlight {
+ background-image: linear-gradient(transparent 62%, var(--tc-accent, #c8ff52) 62%);
+ background-repeat: no-repeat;
+ padding: 0 0.06em;
+ box-decoration-break: clone;
+ -webkit-box-decoration-break: clone;
+}
+
input::placeholder {
color: var(--tc-ink-2);
opacity: 0.65;
diff --git a/app/src/lib/backgrounds.ts b/app/src/lib/backgrounds.ts
index c2136d9..f013712 100644
--- a/app/src/lib/backgrounds.ts
+++ b/app/src/lib/backgrounds.ts
@@ -1,9 +1,9 @@
/**
* Scènes du diaporama de fond de l'écran de connexion : art génératif
* (pas de photo tierce, pour rester libre de droits) - de larges taches de
- * couleur saturées, floutées, qui dérivent lentement (voir `.tc-drift` dans
- * index.css) et s'enchaînent en fondu. Volontairement lumineux et coloré,
- * pas "noir avec une pointe de couleur" - le fond DOIT se voir.
+ * couleur pastel, floutées, qui dérivent lentement (voir `.tc-drift` dans
+ * index.css) et s'enchaînent en fondu. Palette "papier + pastel", assortie
+ * au thème éditorial clair du reste de l'interface.
*/
export interface BackgroundBlob {
color: string;
@@ -14,46 +14,36 @@ export interface BackgroundBlob {
export interface BackgroundScene {
id: string;
- /** Couleur de base de la scène - un dégradé de fond, pas du noir plat. */
base: string;
blobs: BackgroundBlob[];
}
export const BACKGROUND_SCENES: BackgroundScene[] = [
{
- id: 'aube',
- base: 'linear-gradient(160deg, #241a3d 0%, #171029 60%, #0d0a18 100%)',
+ id: 'lavande',
+ base: 'linear-gradient(160deg, #f4efe6 0%, #efe9de 55%, #eae3d6 100%)',
blobs: [
- { color: 'rgba(140,163,255,0.62)', top: '-18%', left: '52%', size: '62vw' },
- { 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' },
+ { color: 'rgba(196,181,253,0.55)', top: '-16%', left: '55%', size: '58vw' },
+ { color: 'rgba(253,186,203,0.42)', top: '48%', left: '-8%', size: '50vw' },
+ { color: 'rgba(200,255,82,0.28)', top: '64%', left: '62%', size: '36vw' },
],
},
{
- id: 'nuit',
- base: 'linear-gradient(160deg, #1c1740 0%, #130f2c 60%, #0b0918 100%)',
+ id: 'peche',
+ base: 'linear-gradient(160deg, #f6efe4 0%, #f1e9db 55%, #ece1d0 100%)',
blobs: [
- { color: 'rgba(110,120,255,0.58)', top: '-20%', left: '66%', size: '66vw' },
- { 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' },
+ { color: 'rgba(255,196,158,0.5)', top: '-12%', left: '64%', size: '56vw' },
+ { color: 'rgba(255,150,164,0.34)', top: '52%', left: '6%', size: '48vw' },
+ { color: 'rgba(196,181,253,0.26)', top: '6%', left: '4%', size: '34vw' },
],
},
{
- id: 'foret',
- base: 'linear-gradient(160deg, #0f2a2e 0%, #0e1f26 60%, #0a1418 100%)',
+ id: 'menthe',
+ base: 'linear-gradient(160deg, #eef2e6 0%, #eaeee0 55%, #e4e8d8 100%)',
blobs: [
- { color: 'rgba(94,224,180,0.48)', top: '2%', left: '70%', 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',
- base: 'linear-gradient(160deg, #351a2c 0%, #23122a 60%, #130a1a 100%)',
- blobs: [
- { color: 'rgba(255,176,110,0.5)', top: '-10%', left: '10%', 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' },
+ { color: 'rgba(167,229,180,0.5)', top: '4%', left: '68%', size: '52vw' },
+ { color: 'rgba(140,214,214,0.4)', top: '58%', left: '-6%', size: '54vw' },
+ { color: 'rgba(200,255,82,0.24)', top: '70%', left: '66%', size: '34vw' },
],
},
];
diff --git a/app/tailwind.config.js b/app/tailwind.config.js
index b86ea70..fc2669b 100644
--- a/app/tailwind.config.js
+++ b/app/tailwind.config.js
@@ -16,6 +16,10 @@ export default {
extend: {
fontFamily: {
sans: ['Manrope', 'system-ui', 'sans-serif'],
+ // Titres uniquement (voir `.font-display`) - jamais le corps de
+ // texte ni l'UI, pour garder l'interface lisible et rapide à
+ // scanner ; le serif est réservé à l'effet éditorial des titres.
+ display: ['Fraunces', 'Georgia', 'serif'],
},
colors: {
brand: {
@@ -24,6 +28,9 @@ export default {
DEFAULT: '#5b8cff',
soft: '#7ba4ff',
},
+ // Citron vert - l'unique accent vif, utilisé avec parcimonie
+ // (surlignage, badge, détail) plutôt que comme couleur dominante.
+ accent: '#c8ff52',
success: '#4ade80',
danger: '#ff8f7a',
violet: '#b39dff',