@luxflow/tokens 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,17 +1,89 @@
1
1
  # @luxflow/tokens
2
2
 
3
- Design tokens for LuxFlow UI system.
3
+ CSS design tokens for LuxFlow. Source de vérité pour toutes les variables `--lf-*`.
4
4
 
5
- ## Usage
5
+ ## Exports
6
6
 
7
- ```tsx
8
- import '@luxflow/tokens/tokens.css';
9
- import '@luxflow/tokens/theme.css';
7
+ | Export | Rôle |
8
+ |--------|------|
9
+ | `@luxflow/tokens/contract.css` | **91 variables `--lf-*` canoniques** — source de vérité |
10
+ | `@luxflow/tokens/compat.css` | Aliases bare (`--bg`, `--primary`, etc.) → `--lf-*` |
11
+ | `@luxflow/tokens/semantics.css` | Classes utilitaires (`.lf-card`, `.lf-btn`, etc.) |
12
+ | `@luxflow/tokens/theme.template.css` | Template d'override projet (couvre 91/91 vars) |
13
+ | `@luxflow/tokens/package.json` | Le manifeste — exporté parce que plusieurs outils le lisent |
14
+
15
+ ### ⛔ Il n'y a PAS de point d'entrée racine, et c'est VOULU
16
+
17
+ `import '@luxflow/tokens'` échoue en `ERR_PACKAGE_PATH_NOT_EXPORTED`. Ce n'est pas un oubli.
18
+
19
+ **[mesuré le 23/08/2026]** Personne n'écrit `from '@luxflow/tokens'` — ni dans le monorepo, ni
20
+ dans les projets consommateurs hors dépôt. Les **95 usages** sont tous des sous-chemins CSS :
21
+
22
+ ```
23
+ 43 @luxflow/tokens/semantics.css 6 @luxflow/tokens/compat.css
24
+ 41 @luxflow/tokens/contract.css 2 @luxflow/tokens/theme.template.css
25
+ 0 @luxflow/tokens ← la racine
26
+ ```
27
+
28
+ Ce paquet ne contient **aucun JavaScript**. Lui donner une clé `.` reviendrait à inventer un
29
+ point d'entrée que personne ne demande, et qui devrait ensuite être maintenu. **L'absence est
30
+ documentée ici précisément pour qu'elle ne se lise pas comme un défaut** — un
31
+ `ERR_PACKAGE_PATH_NOT_EXPORTED` non expliqué finit toujours par être « corrigé ».
32
+
33
+ ### `components.css` n'est PAS exporté — également voulu
34
+
35
+ Il existe dans le tarball (`files: ["src/*.css"]` l'embarque) mais il est **hors carte** : c'est
36
+ un stub *deprecated* (ADR-009), remplacé par `@luxflow/ui/styles/components.css`. Les trois
37
+ mentions qui en restent dans le dépôt sont des **interdictions**, pas des usages.
38
+
39
+ ## Import order canonique
40
+
41
+ ```css
42
+ @import '@luxflow/tokens/contract.css';
43
+ @import '@luxflow/tokens/compat.css';
44
+ @import '@luxflow/ui/styles/components.css';
45
+ @import '@luxflow/tokens/semantics.css';
46
+
47
+ /* Puis dans theme/theme.css : overrides --lf-* uniquement */
48
+ :root {
49
+ --lf-accent: #votre-couleur;
50
+ }
51
+ ```
52
+
53
+ ## Créer un thème projet
54
+
55
+ ```bash
56
+ cp node_modules/@luxflow/tokens/src/theme.template.css theme/theme.css
10
57
  ```
11
58
 
12
- ## Tokens
59
+ ## Tokens disponibles (102 variables `--lf-*`)
60
+
61
+ - **Colors** : `--lf-bg`, `--lf-surface-1/2/3`, `--lf-text`, `--lf-titles`, `--lf-accent`, `--lf-accent-hover/-foreground/-ghost`, `--lf-border`, `--lf-muted`
62
+ - **Status** : `--lf-success`, `--lf-warning`, `--lf-danger`, `--lf-info`, `--lf-on-*`, `--lf-*-bg`
63
+ - **Spacing** : `--lf-gap-*`, `--lf-padding-*`, `--lf-margin-*`, `--lf-padding-section-*`
64
+ - **Containers** : `--lf-container-sm/md/lg/xl/nav`
65
+ - **Typography** : `--lf-font-sans`, `--lf-font-heading`, `--lf-font-mono`, `--lf-text-h1..h6`, `--lf-font-*`, `--lf-leading-tight/normal/relaxed`
66
+ - **Radius** : `--lf-radius-xs/sm/md/lg/xl/2xl/full`
67
+ - **Shadows** : `--lf-shadow-sm/md/lg/xl`
68
+ - **Z-index** : `--lf-z-base/raised/dropdown/sticky/header/modal/overlay/toast`
69
+ - **Motion** : `--lf-motion-duration-*`, `--lf-motion-easing-*`
70
+
71
+ ## Les 11 élargissements du contrat (T-005, 18/08/2026)
72
+
73
+ Le contrat est passé de 91 à 102 variables. Chaque ajout répond à un usage **mesuré dans le
74
+ dépôt**, pas à une anticipation. Les valeurs par défaut sont dérivées quand c'est possible, pour
75
+ qu'un thème qui surcharge `--lf-accent` seul reste cohérent.
76
+
77
+ | Variable | Défaut | Justification |
78
+ | --- | --- | --- |
79
+ | `--lf-success-bg` `--lf-warning-bg` `--lf-danger-bg` `--lf-info-bg` | `color-mix(in srgb, var(--lf-X) 10%, transparent)` | 13 usages réclamaient une **teinte** de statut (`rgba(…, 0.1)` avec la couleur pleine sur la bordure ou le texte). Le contrat avait les couleurs de statut et leurs contrastes, jamais leurs fonds. |
80
+ | `--lf-accent-hover` | `color-mix(in srgb, var(--lf-accent) 90%, black)` | Deux projets l'ont inventée indépendamment (`iae-sport-site`, `test-landing`). **Réserve : ce défaut assombrit.** Un thème sombre dont le survol doit éclaircir la surcharge — `iae-sport-site` le fait déjà (`#e0952a` en clair, `#ffb347` en sombre). |
81
+ | `--lf-accent-foreground` | `#ffffff` | Déclarée par `iae-sport-site`. **Le défaut suppose un accent sombre** ; avec un accent clair il faut le surcharger — `iae-sport-site` utilise `#111111`. |
82
+ | `--lf-accent-ghost` | `color-mix(… 12%, transparent)` | Couvre trois usages distincts d'`apps/os` : anneau de focus, fond de survol, fond d'état actif. |
83
+ | `--lf-font-heading` | `var(--lf-font-sans)` | Défaut neutre : un thème qui ne la surcharge pas garde une seule police. |
84
+ | `--lf-font-mono` | `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace` | Le besoin existait sous trois formes concurrentes, dont six références à un `--font-mono` sans préfixe qui tombaient sur la police système. |
85
+ | `--lf-leading-normal` `--lf-leading-relaxed` | `1.5` `1.7` | Le contrat n'avait que `--lf-leading-tight`. Le `1.7` est le fallback déjà utilisé par les templates. |
86
+
87
+ ## Documentation complète
13
88
 
14
- - Colors: `--bg`, `--surface`, `--text`, `--titles`, `--border`, `--accent`
15
- - Spacing: `--gap-*`, `--padding-*`
16
- - Radius: `--radius-*`
17
- - Shadows: `--shadow-*`
89
+ `docs/TOKENS_THEME_CONTRACT.md`
package/package.json CHANGED
@@ -1,15 +1,17 @@
1
1
  {
2
2
  "name": "@luxflow/tokens",
3
- "version": "0.2.0",
3
+ "version": "1.0.0",
4
4
  "exports": {
5
5
  "./contract.css": "./src/contract.css",
6
6
  "./semantics.css": "./src/semantics.css",
7
+ "./compat.css": "./src/compat.css",
7
8
  "./theme.template.css": "./src/theme.template.css",
8
- "./vendor-themes.css": "./src/vendor-themes.css",
9
- "./vendor-variables.css": "./src/vendor-variables.css"
9
+ "./package.json": "./package.json"
10
10
  },
11
- "files": ["src/*.css"],
11
+ "files": [
12
+ "src/*.css"
13
+ ],
12
14
  "publishConfig": {
13
15
  "access": "public"
14
16
  }
15
- }
17
+ }
package/src/compat.css CHANGED
@@ -1,12 +1,13 @@
1
1
  /* LuxFlow Compat Aliases: --lf-* → bare (ADR-008) */
2
2
  @import './contract.css';
3
3
  :root {
4
- --bg: var(--lf-bg); --surface: var(--lf-surface-1); --text: var(--lf-text);
4
+ --bg: var(--lf-bg); --surface: var(--lf-surface-1); --surface-2: var(--lf-surface-2); --surface-3: var(--lf-surface-3); --text: var(--lf-text);
5
5
  --foreground: var(--lf-foreground); --titles: var(--lf-titles);
6
6
  --muted: var(--lf-muted); --muted-foreground: var(--lf-muted-foreground);
7
7
  --border: var(--lf-border); --primary: var(--lf-accent); --accent: var(--lf-accent);
8
8
  --ring: var(--lf-ring); --success: var(--lf-success); --warning: var(--lf-warning);
9
9
  --error: var(--lf-danger); --destructive: var(--lf-danger); --info: var(--lf-info);
10
+ --on-success: var(--lf-on-success); --on-warning: var(--lf-on-warning); --on-error: var(--lf-on-error);
10
11
  --gap-2xs: var(--lf-gap-2xs); --gap-xs: var(--lf-gap-xs); --gap-sm: var(--lf-gap-sm);
11
12
  --gap-md: var(--lf-gap-md); --gap-lg: var(--lf-gap-lg); --gap-xl: var(--lf-gap-xl);
12
13
  --padding-sm: var(--lf-padding-sm); --padding-md: var(--lf-padding-md);
@@ -19,12 +20,14 @@
19
20
  --padding-section-xl: var(--lf-padding-section-xl);
20
21
  --container-sm: var(--lf-container-sm); --container-md: var(--lf-container-md);
21
22
  --container-lg: var(--lf-container-lg); --container-xl: var(--lf-container-xl);
23
+ --container-nav: var(--lf-container-nav);
22
24
  --text-h1: var(--lf-text-h1); --text-h2: var(--lf-text-h2);
23
25
  --text-h3: var(--lf-text-h3); --text-h4: var(--lf-text-h4);
24
26
  --text-h5: var(--lf-text-h5); --text-h6: var(--lf-text-h6);
25
27
  --text-display-lg: var(--lf-text-display-lg);
26
28
  --text-body: var(--lf-text-body); --text-body-lg: var(--lf-text-body-lg);
27
29
  --text-small: var(--lf-text-small); --text-tiny: var(--lf-text-tiny);
30
+ --text-form: var(--lf-text-form);
28
31
  --font-light: var(--lf-font-light); --font-normal: var(--lf-font-normal);
29
32
  --font-medium: var(--lf-font-medium); --font-semibold: var(--lf-font-semibold);
30
33
  --font-bold: var(--lf-font-bold); --leading-tight: var(--lf-leading-tight);
package/src/contract.css CHANGED
@@ -18,6 +18,13 @@
18
18
  --lf-border: #2a2a2a;
19
19
  --lf-accent: #4a90e2;
20
20
  --lf-ring: var(--lf-accent);
21
+ /* Accent nuances — derived, so overriding --lf-accent alone stays coherent.
22
+ Reserve: the hover default darkens. A dark theme whose hover should LIGHTEN
23
+ must override it, as iae-sport-site does (#e0952a light / #ffb347 dark). */
24
+ --lf-accent-hover: color-mix(in srgb, var(--lf-accent) 90%, black);
25
+ /* Default assumes a dark accent. Override with a light accent — iae-sport-site uses #111111. */
26
+ --lf-accent-foreground: #ffffff;
27
+ --lf-accent-ghost: color-mix(in srgb, var(--lf-accent) 12%, transparent);
21
28
 
22
29
  /* Status */
23
30
  --lf-success: #10b981;
@@ -25,6 +32,17 @@
25
32
  --lf-danger: #ef4444;
26
33
  --lf-info: #3b82f6;
27
34
 
35
+ /* Status backgrounds — ~10% tint, paired with the full status colour on text or border */
36
+ --lf-success-bg: color-mix(in srgb, var(--lf-success) 10%, transparent);
37
+ --lf-warning-bg: color-mix(in srgb, var(--lf-warning) 10%, transparent);
38
+ --lf-danger-bg: color-mix(in srgb, var(--lf-danger) 10%, transparent);
39
+ --lf-info-bg: color-mix(in srgb, var(--lf-info) 10%, transparent);
40
+
41
+ /* Status contrast (text on status backgrounds) */
42
+ --lf-on-success: #ffffff;
43
+ --lf-on-warning: #ffffff;
44
+ --lf-on-error: #ffffff;
45
+
28
46
  /* ==================== SPACING ==================== */
29
47
  --lf-gap-2xs: 0.125rem;
30
48
  --lf-gap-xs: 0.25rem;
@@ -53,9 +71,13 @@
53
71
  --lf-container-md: 768px;
54
72
  --lf-container-lg: 1024px;
55
73
  --lf-container-xl: 1280px;
74
+ --lf-container-nav: 1200px;
56
75
 
57
76
  /* ==================== TYPOGRAPHY ==================== */
58
77
  --lf-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
78
+ /* Defaults to the body font: a theme that does not override it keeps a single typeface. */
79
+ --lf-font-heading: var(--lf-font-sans);
80
+ --lf-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
59
81
 
60
82
  --lf-text-h1: 3rem;
61
83
  --lf-text-h2: 2.5rem;
@@ -68,6 +90,7 @@
68
90
  --lf-text-body-lg: 1.5rem;
69
91
  --lf-text-small: 1rem;
70
92
  --lf-text-tiny: 0.75rem;
93
+ --lf-text-form: 0.875rem;
71
94
 
72
95
  --lf-font-light: 300;
73
96
  --lf-font-normal: 400;
@@ -76,6 +99,8 @@
76
99
  --lf-font-bold: 700;
77
100
 
78
101
  --lf-leading-tight: 1.25;
102
+ --lf-leading-normal: 1.5;
103
+ --lf-leading-relaxed: 1.7;
79
104
 
80
105
  /* ==================== BORDER RADIUS ==================== */
81
106
  --lf-radius-xs: 0.125rem;
@@ -1,112 +1,165 @@
1
1
  /**
2
- * LuxFlow Theme Template (Vendor-like Structure)
3
- * Copy this file to your app and customize values.
4
- * Import AFTER contract.css and semantics.css.
5
- *
6
- * Inspired by Vendor design system structure while maintaining LuxFlow contract.
2
+ * LuxFlow Theme Template
3
+ * ─────────────────────────────────────────────────────────────
4
+ * Copy this file to your project as `theme/theme.css`.
5
+ * Customize the values in :root to match your brand.
6
+ *
7
+ * Import order (in your project's CSS entry point):
8
+ * 1. @import '@luxflow/tokens/contract.css';
9
+ * 2. @import '@luxflow/tokens/compat.css';
10
+ * 3. @import '@luxflow/ui/styles/components.css';
11
+ * 4. @import '@luxflow/tokens/semantics.css';
12
+ * 5. @import './theme/theme.css'; ← this file (pure overrides)
13
+ *
14
+ * Rules:
15
+ * - Only override variables declared in contract.css
16
+ * - Never add variables outside the --lf-* contract here
17
+ * - Never import vendor-themes.css or vendor-variables.css
18
+ *
19
+ * See: docs/TOKENS_THEME_CONTRACT.md
7
20
  */
8
21
 
9
22
  :root {
10
- /* ============================================
11
- BASE COLORS (Dark Theme Default)
12
- ============================================ */
13
-
23
+ /* ==================== COLORS ==================== */
24
+
14
25
  --lf-bg: #0b0b0d;
15
26
  --lf-surface-1: #141317;
16
27
  --lf-surface-2: #1a1a1e;
17
28
  --lf-surface-3: #202024;
18
29
  --lf-text: #c5ccd6;
30
+ --lf-foreground: var(--lf-text);
19
31
  --lf-titles: #ffffff;
20
32
  --lf-muted: #9ca3af;
33
+ --lf-muted-foreground: var(--lf-muted);
21
34
  --lf-border: #1f1f23;
22
-
23
- /* ============================================
24
- BRAND / ACCENT
25
- ============================================ */
26
-
27
35
  --lf-accent: #5cb9f2;
28
-
29
- /* ============================================
30
- NEUTRAL VARIANTS (Subtle backgrounds)
31
- ============================================ */
32
-
33
- --lf-neutral-1: #111216;
34
- --lf-neutral-2: #1a1b20;
35
- --lf-neutral-3: #22232a;
36
-
37
- /* ============================================
38
- STATUS COLORS
39
- ============================================ */
40
-
36
+ --lf-ring: var(--lf-accent);
37
+ --lf-accent-hover: color-mix(in srgb, var(--lf-accent) 90%, black);
38
+ --lf-accent-foreground: #ffffff;
39
+ --lf-accent-ghost: color-mix(in srgb, var(--lf-accent) 12%, transparent);
40
+
41
+ /* ==================== STATUS ==================== */
42
+
41
43
  --lf-success: #10b981;
42
44
  --lf-warning: #f59e0b;
43
45
  --lf-danger: #ef4444;
44
46
  --lf-info: #3b82f6;
45
-
46
- /* ============================================
47
- SPACING (8px-based scale)
48
- ============================================ */
49
-
50
- --lf-gap-sm: 0.5rem; /* 8px */
51
- --lf-gap-md: 1rem; /* 16px */
52
- --lf-gap-lg: 1.5rem; /* 24px */
53
- --lf-gap-xl: 2rem; /* 32px */
54
-
47
+ --lf-success-bg: color-mix(in srgb, var(--lf-success) 10%, transparent);
48
+ --lf-warning-bg: color-mix(in srgb, var(--lf-warning) 10%, transparent);
49
+ --lf-danger-bg: color-mix(in srgb, var(--lf-danger) 10%, transparent);
50
+ --lf-info-bg: color-mix(in srgb, var(--lf-info) 10%, transparent);
51
+ --lf-on-success: #ffffff;
52
+ --lf-on-warning: #ffffff;
53
+ --lf-on-error: #ffffff;
54
+
55
+ /* ==================== SPACING ==================== */
56
+
57
+ --lf-gap-2xs: 0.125rem;
58
+ --lf-gap-xs: 0.25rem;
59
+ --lf-gap-sm: 0.5rem;
60
+ --lf-gap-md: 1rem;
61
+ --lf-gap-lg: 1.5rem;
62
+ --lf-gap-xl: 2rem;
63
+
55
64
  --lf-padding-sm: 0.5rem;
56
65
  --lf-padding-md: 1rem;
57
66
  --lf-padding-lg: 1.5rem;
58
67
  --lf-padding-xl: 2rem;
59
-
60
- /* Extended spacing (optional) */
61
- --lf-space-1: 0.25rem; /* 4px */
62
- --lf-space-2: 0.5rem; /* 8px */
63
- --lf-space-3: 0.75rem; /* 12px */
64
- --lf-space-4: 1rem; /* 16px */
65
- --lf-space-5: 1.25rem; /* 20px */
66
- --lf-space-6: 1.5rem; /* 24px */
67
- --lf-space-8: 2rem; /* 32px */
68
- --lf-space-10: 2.5rem; /* 40px */
69
- --lf-space-12: 3rem; /* 48px */
70
-
71
- /* ============================================
72
- BORDER RADIUS
73
- ============================================ */
74
-
75
- --lf-radius-sm: 0.25rem; /* 4px */
76
- --lf-radius-md: 0.5rem; /* 8px */
77
- --lf-radius-lg: 0.75rem; /* 12px */
78
- --lf-radius-xl: 1rem; /* 16px */
79
- --lf-radius-2xl: 1.25rem; /* 20px */
80
-
81
- /* ============================================
82
- SHADOWS
83
- ============================================ */
84
-
68
+
69
+ --lf-margin-sm: 0.5rem;
70
+ --lf-margin-md: 1rem;
71
+ --lf-margin-lg: 2rem;
72
+ --lf-margin-xl: 3rem;
73
+
74
+ /* ==================== CONTAINERS ==================== */
75
+
76
+ --lf-padding-container: 4rem;
77
+ --lf-padding-section-sm: 2rem;
78
+ --lf-padding-section-md: 4rem;
79
+ --lf-padding-section-lg: 6rem;
80
+ --lf-padding-section-xl: 8rem;
81
+
82
+ --lf-container-sm: 640px;
83
+ --lf-container-md: 768px;
84
+ --lf-container-lg: 1024px;
85
+ --lf-container-xl: 1280px;
86
+ --lf-container-nav: 1200px;
87
+
88
+ /* ==================== TYPOGRAPHY ==================== */
89
+
90
+ --lf-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
91
+ --lf-font-heading: var(--lf-font-sans);
92
+ --lf-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
93
+
94
+ --lf-text-h1: 3rem;
95
+ --lf-text-h2: 2.5rem;
96
+ --lf-text-h3: 1.5rem;
97
+ --lf-text-h4: 1.25rem;
98
+ --lf-text-h5: 1.125rem;
99
+ --lf-text-h6: 1rem;
100
+ --lf-text-display-lg: 6rem;
101
+ --lf-text-body: 1rem;
102
+ --lf-text-body-lg: 1.5rem;
103
+ --lf-text-small: 1rem;
104
+ --lf-text-tiny: 0.75rem;
105
+ --lf-text-form: 0.875rem;
106
+
107
+ --lf-font-light: 300;
108
+ --lf-font-normal: 400;
109
+ --lf-font-medium: 500;
110
+ --lf-font-semibold: 600;
111
+ --lf-font-bold: 700;
112
+
113
+ --lf-leading-tight: 1.25;
114
+ --lf-leading-normal: 1.5;
115
+ --lf-leading-relaxed: 1.7;
116
+
117
+ /* ==================== BORDER RADIUS ==================== */
118
+
119
+ --lf-radius-xs: 0.125rem;
120
+ --lf-radius-sm: 0.25rem;
121
+ --lf-radius-md: 0.5rem;
122
+ --lf-radius-lg: 0.75rem;
123
+ --lf-radius-xl: 1rem;
124
+ --lf-radius-2xl: 1.5rem;
125
+ --lf-radius-full: 9999px;
126
+
127
+ /* ==================== SHADOWS ==================== */
128
+
85
129
  --lf-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
86
130
  --lf-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
87
131
  --lf-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
88
132
  --lf-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
89
- --lf-shadow-card: 0 10px 30px rgba(0, 0, 0, 0.28);
90
-
91
- /* ============================================
92
- EFFECTS
93
- ============================================ */
94
-
133
+
134
+ /* ==================== EFFECTS ==================== */
135
+
95
136
  --lf-blur-md: blur(8px);
96
137
  --lf-transition: all 0.2s ease;
97
-
98
- /* ============================================
99
- Z-INDEX
100
- ============================================ */
101
-
138
+
139
+ /* ==================== Z-INDEX ==================== */
140
+
141
+ --lf-z-base: 0;
142
+ --lf-z-raised: 10;
143
+ --lf-z-dropdown: 20;
144
+ --lf-z-sticky: 30;
145
+ --lf-z-header: 40;
102
146
  --lf-z-modal: 50;
103
147
  --lf-z-overlay: 60;
104
148
  --lf-z-toast: 70;
149
+
150
+ /* ==================== MOTION ==================== */
151
+
152
+ --lf-motion-duration-fast: 0.1s;
153
+ --lf-motion-duration-normal: 0.2s;
154
+ --lf-motion-duration-slow: 0.4s;
155
+ --lf-motion-easing-default: ease;
156
+ --lf-motion-easing-in: ease-in;
157
+ --lf-motion-easing-out: ease-out;
158
+ --lf-motion-easing-in-out: ease-in-out;
159
+ --lf-motion-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
105
160
  }
106
161
 
107
- /* ============================================
108
- LIGHT THEME (Optional)
109
- ============================================ */
162
+ /* ==================== LIGHT THEME (Optional override) ==================== */
110
163
 
111
164
  /*
112
165
  [data-theme="light"] {
@@ -118,34 +171,17 @@
118
171
  --lf-titles: #111111;
119
172
  --lf-muted: #666666;
120
173
  --lf-border: #e5e7eb;
121
-
122
- --lf-neutral-1: #f1f2f4;
123
- --lf-neutral-2: #e6e8eb;
124
- --lf-neutral-3: #d1d5db;
174
+ --lf-accent: #5cb9f2;
125
175
  }
126
176
  */
127
177
 
128
- /* ============================================
129
- MULTI-BRAND (Optional, Not Default)
130
- ============================================
131
-
132
- Use [data-brand="..."] for multi-tenant or
133
- white-label apps. Single-brand apps should
134
- NOT use this pattern.
135
-
136
- See: docs/MULTIBRAND_OPTION.md
137
- */
138
-
178
+ /* ==================== MULTI-BRAND (Optional) ==================== */
139
179
  /*
180
+ Use [data-brand="..."] for multi-tenant or white-label apps only.
181
+ Single-brand apps MUST NOT use this pattern.
182
+ See: docs/TOKENS_THEME_CONTRACT.md
183
+
140
184
  [data-brand="alt"] {
141
185
  --lf-accent: #ff6b6b;
142
186
  }
143
-
144
- [data-brand="pro"] {
145
- --lf-accent: #9333ea;
146
- }
147
-
148
- [data-brand="enterprise"] {
149
- --lf-accent: #0ea5e9;
150
- }
151
187
  */
@@ -1,723 +0,0 @@
1
- /* ============================================
2
- Vendor Design System - Core Themes & Variables
3
- Architecture: Modulaire (composants dans src/components/)
4
- ============================================ */
5
-
6
- /* ==================== BRAND COLORS ==================== */
7
- [data-brand="vendor-app"] { --primary: #ededed; }
8
- [data-brand="muzidev"] { --primary: #5cb9f2; }
9
- [data-brand="muzipics"] { --primary: #ff2d55; }
10
- [data-brand="muziweb"] { --primary: #9802eb; }
11
- [data-brand="muzimerch"] { --primary: #ff9d00; }
12
- [data-brand="muzibase"] { --primary: #2fad66; }
13
- [data-brand="muzisystem"] { --primary: #bfbfbf; }
14
- [data-brand="muzitools"] { --primary: #07e7c6; }
15
-
16
- :root {
17
- /* ==================== 1. COLORS (Sémantiques) ==================== */
18
- /* Base colors - Dark mode (default) */
19
- --bg: #0b0b0d;
20
- --surface: #141317;
21
- --text: #c5ccd6;
22
- --foreground: var(--text);
23
- --titles: #ffffff;
24
- --muted: #9ca3af;
25
- --muted-foreground: var(--muted);
26
- --border: #1f1f23;
27
- --accent: var(--primary);
28
-
29
- /* Dark mode fixed values (for light theme overrides) */
30
- --dark-bg: #0b0b0d;
31
- --dark-surface: #141317;
32
- --dark-text: #c5ccd6;
33
- --dark-titles: #ffffff;
34
- --dark-muted: #9ca3af;
35
- --dark-border: #1f1f23;
36
-
37
- /* Component colors */
38
- --card: var(--surface);
39
- --card-foreground: var(--text);
40
- --on-primary: #0b0b0d;
41
- --ring: var(--primary);
42
-
43
- /* Status colors */
44
- --success: #10b981;
45
- --warning: #f59e0b;
46
- --error: #ef4444;
47
- --destructive: var(--error);
48
- --info: #3b82f6;
49
-
50
- /* Navbar/Footer colors (simplified - use base tokens) */
51
- --navbar-bg: var(--bg);
52
- --navbar-surface: var(--surface);
53
- --navbar-border: var(--border);
54
- --navbar-text: var(--titles);
55
- --footer-bg: var(--bg);
56
- --footer-surface: var(--surface);
57
- --footer-border: var(--border);
58
- --footer-text: var(--titles);
59
-
60
- /* ==================== 2. SPACING (Sémantiques) ==================== */
61
- /* Layout spacing */
62
- --padding-container: 4rem;
63
- --padding-section-sm: 2rem;
64
- --padding-section-md: 4rem;
65
- --padding-section-lg: 6rem;
66
- --padding-section-xl: 8rem;
67
-
68
- /* Component spacing - Gap (between elements) */
69
- --gap-2xs: 0.125rem; /* 2px */
70
- --gap-xs: 0.25rem; /* 4px */
71
- --gap-sm: 0.5rem; /* 8px */
72
- --gap-md: 1rem; /* 16px */
73
- --gap-lg: 1.5rem; /* 24px */
74
- --gap-xl: 2rem; /* 32px */
75
-
76
- /* Component spacing - Margin (around elements) */
77
- --margin-sm: 0.5rem;
78
- --margin-md: 1rem;
79
- --margin-lg: 2rem;
80
- --margin-xl: 3rem;
81
-
82
- /* Component spacing - Padding (inside elements) */
83
- --padding-xs: 0.25rem; /* 4px */
84
- --padding-sm: 0.5rem; /* 8px */
85
- --padding-md: 1rem; /* 16px */
86
- --padding-lg: 1.5rem; /* 24px */
87
- --padding-xl: 2rem; /* 32px */
88
- --padding-2xl: 3rem; /* 48px */
89
-
90
- /* ==================== 3. TYPOGRAPHY (Sémantiques) ==================== */
91
- /* Font families */
92
- --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif;
93
- --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
94
-
95
- /* Headings */
96
- --text-h1: 3rem; /* 56px */
97
- --text-h2: 2.5rem; /* 48px */
98
- --text-h3: 1.5rem; /* 24px */
99
- --text-h4: 1.25rem; /* 20px */
100
- --text-h5: 1.125rem; /* 18px */
101
- --text-h6: 1rem; /* 16px */
102
-
103
- /* Display (hero titles) */
104
- --text-display-sm: 3.75rem; /* 60px */
105
- --text-display-md: 4.5rem; /* 72px */
106
- --text-display-lg: 6rem; /* 96px */
107
-
108
- /* Body text (paragraphs) */
109
- --text-body: 1rem; /* 16px */
110
- --text-body-sm: 0.875rem; /* 14px - Small paragraphs */
111
- --text-body-lg: 1.5rem; /* 24px - Large paragraphs */
112
-
113
- /* Utility text (labels, captions, metadata) */
114
- --text-small: 1rem; /* 14px - Labels, captions */
115
- --text-tiny: 0.75rem; /* 12px - Metadata, badges */
116
-
117
- /* Font weights */
118
- --font-thin: 100;
119
- --font-extralight: 200;
120
- --font-light: 300;
121
- --font-normal: 400;
122
- --font-medium: 500;
123
- --font-semibold: 600;
124
- --font-bold: 700;
125
- --font-extrabold: 800;
126
- --font-black: 900;
127
-
128
- /* Line heights */
129
- --leading-none: 1;
130
- --leading-tight: 1.25;
131
- --leading-snug: 1.375;
132
- --leading-normal: 1.5;
133
- --leading-relaxed: 1.625;
134
- --leading-loose: 2;
135
-
136
- /* Letter spacing */
137
- --tracking-tighter: -0.05em;
138
- --tracking-tight: -0.025em;
139
- --tracking-normal: 0em;
140
- --tracking-wide: 0.025em;
141
- --tracking-wider: 0.05em;
142
- --tracking-widest: 0.1em;
143
-
144
- /* ==================== 4. DESIGN TOKENS ==================== */
145
- /* Border radius */
146
- --radius-xs: 0.125rem;
147
- --radius-sm: 0.25rem;
148
- --radius-md: 0.5rem;
149
- --radius-lg: 0.75rem;
150
- --radius-xl: 1rem;
151
- --radius-2xl: 1.5rem;
152
- --radius-full: 9999px;
153
-
154
- /* Shadows */
155
- --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
156
- --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
157
- --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
158
- --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
159
-
160
- /* Z-index */
161
- --z-drawer: 40;
162
- --z-modal: 50;
163
- --z-popover: 60;
164
- --z-toast: 70;
165
-
166
- /* Motion */
167
- --duration-100: 100ms;
168
- --duration-150: 150ms;
169
- --duration-200: 200ms;
170
- --duration-300: 300ms;
171
- --duration-500: 500ms;
172
- --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
173
-
174
- --transition-all: all 0.2s ease;
175
- --transition-colors: color, background-color, border-color 0.2s ease;
176
-
177
- /* ==================== 5. COMPONENT SIZES ==================== */
178
- /* Widths */
179
- --width-xs: 20rem; /* 320px */
180
- --width-sm: 24rem; /* 384px */
181
- --width-md: 28rem; /* 448px */
182
- --width-lg: 32rem; /* 512px */
183
- --width-xl: 36rem; /* 576px */
184
- --width-2xl: 42rem; /* 672px */
185
- --width-3xl: 48rem; /* 768px */
186
- --width-4xl: 56rem; /* 896px */
187
- --width-5xl: 64rem; /* 1024px */
188
- --width-6xl: 72rem; /* 1152px */
189
- --width-7xl: 80rem; /* 1280px */
190
- --width-full: 100%;
191
- --width-screen: 100vw;
192
-
193
- /* Heights */
194
- --height-xs: 20rem; /* 320px */
195
- --height-sm: 24rem; /* 384px */
196
- --height-md: 28rem; /* 448px */
197
- --height-lg: 32rem; /* 512px */
198
- --height-xl: 36rem; /* 576px */
199
- --height-2xl: 42rem; /* 672px */
200
- --height-3xl: 48rem; /* 768px */
201
- --height-full: 100%;
202
- --height-screen: 100vh;
203
-
204
- /* Border widths */
205
- --border-width-0: 0;
206
- --border-width-1: 1px;
207
- --border-width-2: 2px;
208
- --border-width-3: 3px;
209
- --border-width-4: 4px;
210
- --border-width-8: 8px;
211
-
212
- /* Opacity */
213
- --opacity-0: 0;
214
- --opacity-5: 0.05;
215
- --opacity-10: 0.1;
216
- --opacity-20: 0.2;
217
- --opacity-25: 0.25;
218
- --opacity-30: 0.3;
219
- --opacity-40: 0.4;
220
- --opacity-50: 0.5;
221
- --opacity-60: 0.6;
222
- --opacity-70: 0.7;
223
- --opacity-75: 0.75;
224
- --opacity-80: 0.8;
225
- --opacity-90: 0.9;
226
- --opacity-95: 0.95;
227
- --opacity-100: 1;
228
- }
229
-
230
- /* ==================== LIGHT THEME (Override base colors) ==================== */
231
- [data-theme="light"] {
232
- --bg: #f7f8fa;
233
- --surface: #ffffff;
234
- --text: #1f2937;
235
- --foreground: var(--text);
236
- --titles: #0E1116;
237
- --muted: #6b7280;
238
- --muted-foreground: var(--muted);
239
- --border: #e5e7eb;
240
- }
241
-
242
- /* ==================== LIGHT THEME - SPECIAL RULES ==================== */
243
-
244
- /* Light brands (vendor-app, muzisystem) - Primary buttons */
245
- /* Primary buttons need dark background to be visible on light bg */
246
- [data-theme="light"][data-brand="vendor-app"] .btn-primary,
247
- [data-theme="light"][data-brand="muzisystem"] .btn-primary {
248
- background-color: var(--dark-bg) !important;
249
- color: var(--dark-titles) !important;
250
- }
251
-
252
- /* Semi-light rule: Force dark navbar and footer in light theme */
253
- [data-theme="light"] .navbar,
254
- [data-theme="light"] .footer {
255
- background-color: var(--dark-bg) !important;
256
- border-bottom-color: var(--dark-border) !important;
257
- border-top-color: var(--dark-border) !important;
258
- /* Force dark theme variables for footer text colors */
259
- --text: var(--dark-text);
260
- --muted: var(--dark-muted);
261
- --titles: var(--dark-titles);
262
- }
263
-
264
- /* Textes navbar - Sélecteurs spécifiques (blanc) */
265
- [data-theme="light"] .navbar-brand,
266
- [data-theme="light"] .navbar-link,
267
- [data-theme="light"] .navbar-menu-link,
268
- [data-theme="light"] .navbar-toggle,
269
- [data-theme="light"] .navbar select,
270
- [data-theme="light"] .navbar input,
271
- [data-theme="light"] .navbar label,
272
- [data-theme="light"] .navbar span,
273
- [data-theme="light"] .navbar p,
274
- [data-theme="light"] .navbar a {
275
- color: #ffffff !important;
276
- }
277
-
278
- /* Footer - Titres et liens en blanc, textes gardent var(--text)/var(--muted) */
279
- [data-theme="light"] .footer-logo,
280
- [data-theme="light"] .footer-link,
281
- [data-theme="light"] .footer-column-title {
282
- color: #ffffff !important;
283
- }
284
-
285
- /* Liens hover */
286
- [data-theme="light"] .navbar-link:hover,
287
- [data-theme="light"] .navbar-menu-link:hover,
288
- [data-theme="light"] .footer-link:hover {
289
- color: var(--primary) !important;
290
- }
291
-
292
- /* Borders dark dans navbar/footer */
293
- [data-theme="light"] .navbar-menu,
294
- [data-theme="light"] .footer-top {
295
- background-color: var(--dark-bg) !important;
296
- border-color: #1f1f23 !important;
297
- }
298
-
299
- [data-theme="light"] .footer-separator {
300
- background: #1f1f23 !important;
301
- }
302
-
303
- [data-theme="light"] .navbar-menu-link:hover {
304
- background-color: #141317 !important;
305
- }
306
-
307
- /* Force dark inputs, selects in navbar/footer */
308
- [data-theme="light"] .navbar input,
309
- [data-theme="light"] .navbar select,
310
- [data-theme="light"] .footer input,
311
- [data-theme="light"] .footer select,
312
- [data-theme="light"] .footer-newsletter-input {
313
- background-color: #141317 !important;
314
- border-color: #1f1f23 !important;
315
- color: #ffffff !important;
316
- }
317
-
318
- /* Buttons in navbar (except primary) */
319
- [data-theme="light"] .navbar button:not(.btn-primary),
320
- [data-theme="light"] .footer button:not(.btn-primary):not(.footer-newsletter-button) {
321
- background-color: #141317 !important;
322
- border-color: #1f1f23 !important;
323
- color: #ffffff !important;
324
- }
325
-
326
- /* Primary buttons keep their brand color */
327
- [data-theme="light"] .footer .btn-primary,
328
- [data-theme="light"] .footer-newsletter-button {
329
- background-color: var(--primary) !important;
330
- border-color: var(--primary) !important;
331
- }
332
-
333
- /* Light brands need dark text for contrast */
334
- [data-theme="light"][data-brand="vendor-app"] .footer .btn-primary,
335
- [data-theme="light"][data-brand="vendor-app"] .footer-newsletter-button,
336
- [data-theme="light"][data-brand="muzisystem"] .footer .btn-primary,
337
- [data-theme="light"][data-brand="muzisystem"] .footer-newsletter-button {
338
- color: #0b0b0d !important;
339
- }
340
-
341
- /* Dark brands can use white text */
342
- [data-theme="light"][data-brand="muzidev"] .footer .btn-primary,
343
- [data-theme="light"][data-brand="muzidev"] .footer-newsletter-button,
344
- [data-theme="light"][data-brand="muzipics"] .footer .btn-primary,
345
- [data-theme="light"][data-brand="muzipics"] .footer-newsletter-button,
346
- [data-theme="light"][data-brand="muziweb"] .footer .btn-primary,
347
- [data-theme="light"][data-brand="muziweb"] .footer-newsletter-button,
348
- [data-theme="light"][data-brand="muzimerch"] .footer .btn-primary,
349
- [data-theme="light"][data-brand="muzimerch"] .footer-newsletter-button,
350
- [data-theme="light"][data-brand="muzibase"] .footer .btn-primary,
351
- [data-theme="light"][data-brand="muzibase"] .footer-newsletter-button {
352
- color: #ffffff !important;
353
- }
354
-
355
- /* Privacy Policy et autres liens dans disclaimer toujours en primary */
356
- [data-theme="light"] .footer-newsletter-disclaimer a,
357
- .footer-newsletter-disclaimer a {
358
- color: var(--primary) !important;
359
- }
360
-
361
- [data-theme="light"] .navbar-toggle {
362
- background-color: transparent !important;
363
- }
364
-
365
- [data-theme="light"] .navbar-toggle span {
366
- background-color: var(--primary) !important;
367
- }
368
-
369
- [data-theme="light"] .navbar-menu-actions {
370
- border-top-color: #1f1f23 !important;
371
- }
372
-
373
- /* ==================== GLOBAL STYLES ==================== */
374
- *,
375
- *::before,
376
- *::after {
377
- box-sizing: border-box;
378
- margin: 0;
379
- padding: 0;
380
- }
381
-
382
- html {
383
- -webkit-font-smoothing: antialiased;
384
- -moz-osx-font-smoothing: grayscale;
385
- text-rendering: optimizeLegibility;
386
- }
387
-
388
- body {
389
- font-family: var(--font-sans);
390
- background-color: var(--bg);
391
- color: var(--text);
392
- line-height: 1.5;
393
- min-height: 100vh;
394
- }
395
-
396
- /* ==================== ANIMATIONS ==================== */
397
- @keyframes spin {
398
- from { transform: rotate(0deg); }
399
- to { transform: rotate(360deg); }
400
- }
401
-
402
- @keyframes fade-in {
403
- from { opacity: 0; }
404
- to { opacity: 1; }
405
- }
406
-
407
- @keyframes slide-up {
408
- from {
409
- opacity: 0;
410
- transform: translateY(1rem);
411
- }
412
- to {
413
- opacity: 1;
414
- transform: translateY(0);
415
- }
416
- }
417
-
418
- /* ==================== UTILITY CLASSES ==================== */
419
-
420
- /* Screen reader only */
421
- .sr-only {
422
- position: absolute;
423
- width: 1px;
424
- height: 1px;
425
- padding: 0;
426
- margin: -1px;
427
- overflow: hidden;
428
- clip: rect(0, 0, 0, 0);
429
- white-space: nowrap;
430
- border-width: 0;
431
- }
432
-
433
- /* Typography utilities */
434
- .text-xs { font-size: var(--text-tiny); }
435
- .text-sm { font-size: var(--text-small); }
436
- .text-base { font-size: var(--text-body); }
437
- .text-lg { font-size: var(--text-body-lg); }
438
- .text-xl { font-size: var(--text-h5); }
439
- .text-2xl { font-size: var(--text-h4); }
440
- .text-3xl { font-size: var(--text-h3); }
441
- .text-6xl { font-size: var(--text-display-sm); }
442
-
443
- /* Font weight utilities */
444
- .font-normal { font-weight: var(--font-normal); }
445
- .font-medium { font-weight: var(--font-medium); }
446
- .font-semibold { font-weight: var(--font-semibold); }
447
- .font-bold { font-weight: var(--font-bold); }
448
-
449
- /* Border radius utilities */
450
- .rounded-sm { border-radius: var(--radius-sm); }
451
- .rounded-md { border-radius: var(--radius-md); }
452
- .rounded-lg { border-radius: var(--radius-lg); }
453
- .rounded-xl { border-radius: var(--radius-xl); }
454
- .rounded-full { border-radius: var(--radius-full); }
455
-
456
- /* Shadow utilities */
457
- .shadow-sm { box-shadow: var(--shadow-sm); }
458
- .shadow-md { box-shadow: var(--shadow-md); }
459
- .shadow-lg { box-shadow: var(--shadow-lg); }
460
- .shadow-xl { box-shadow: var(--shadow-xl); }
461
-
462
- /* Color utilities for status */
463
- .bg-error { background-color: var(--error); }
464
- .bg-success { background-color: var(--success); }
465
- .bg-warning { background-color: var(--warning); }
466
- .bg-info { background-color: var(--info); }
467
-
468
- .text-error { color: var(--error); }
469
- .text-success { color: var(--success); }
470
- .text-warning { color: var(--warning); }
471
- .text-info { color: var(--info); }
472
-
473
- /* ============================================
474
- LAYOUT UTILITIES (Finsweet Structure)
475
- ============================================ */
476
-
477
- /* Container - Max width + horizontal padding */
478
- .container {
479
- max-width: var(--container-max-width, 1280px) !important;
480
- margin-left: auto !important;
481
- margin-right: auto !important;
482
- padding-left: var(--gap-md) !important;
483
- padding-right: var(--gap-md) !important;
484
- }
485
-
486
- @media (min-width: 768px) {
487
- .container {
488
- padding-left: var(--gap-xl) !important;
489
- padding-right: var(--gap-xl) !important;
490
- }
491
- }
492
-
493
- @media (min-width: 1024px) {
494
- .container {
495
- padding-left: var(--padding-container) !important;
496
- padding-right: var(--padding-container) !important;
497
- }
498
- }
499
-
500
- /* Section - Vertical spacing */
501
- .section {
502
- padding-top: var(--padding-section-md);
503
- padding-bottom: var(--padding-section-md);
504
- }
505
-
506
- .section--sm {
507
- padding-top: var(--padding-section-sm);
508
- padding-bottom: var(--padding-section-sm);
509
- }
510
-
511
- .section--lg {
512
- padding-top: var(--padding-section-lg);
513
- padding-bottom: var(--padding-section-lg);
514
- }
515
-
516
- .section--xl {
517
- padding-top: var(--padding-section-xl);
518
- padding-bottom: var(--padding-section-xl);
519
- }
520
-
521
- /* Section actions (CTA buttons at bottom of sections) */
522
- .section-actions {
523
- display: flex;
524
- justify-content: center;
525
- align-items: center;
526
- gap: var(--gap-md);
527
- margin-top: var(--gap-xl);
528
- flex-wrap: wrap;
529
- }
530
-
531
- /* Grid utilities */
532
- .grid-2 {
533
- display: grid;
534
- grid-template-columns: repeat(2, 1fr);
535
- gap: var(--gap-xl);
536
- }
537
-
538
- .grid-3 {
539
- display: grid;
540
- grid-template-columns: repeat(3, 1fr);
541
- gap: var(--gap-xl);
542
- }
543
-
544
- .grid-4 {
545
- display: grid;
546
- grid-template-columns: repeat(4, 1fr);
547
- gap: var(--gap-xl);
548
- }
549
-
550
- @media (max-width: 768px) {
551
- .grid-2,
552
- .grid-3,
553
- .grid-4 {
554
- grid-template-columns: 1fr;
555
- }
556
- }
557
-
558
- /* ============================================
559
- Component styles are in src/components/
560
- Import via src/index.css
561
- ============================================ */
562
-
563
- /* ============================================
564
- LEGACY ALIASES (⚠️ DEPRECATED - COMMENTED OUT)
565
- Kept for reference only - DO NOT UNCOMMENT
566
- Use semantic names instead:
567
- - Spacing: --gap-*, --padding-*, --margin-*
568
- - Typography: --text-h*, --text-body*, --text-display-*
569
- - Colors: --foreground, --muted-foreground, --destructive
570
- ============================================ */
571
-
572
- /*
573
- :root {
574
- Legacy spacing
575
- --space-2: 0.125rem;
576
- --space-4: 0.25rem;
577
- --space-6: 0.375rem;
578
- --space-8: 0.5rem;
579
- --space-12: 0.75rem;
580
- --space-16: 1rem;
581
- --space-20: 1.25rem;
582
- --space-24: 1.5rem;
583
- --space-32: 2rem;
584
- --space-48: 3rem;
585
- --space-64: 4rem;
586
- --space-80: 5rem;
587
- --space-96: 6rem;
588
- --space-global-x: var(--padding-container);
589
- --space-section-sm: var(--padding-section-sm);
590
- --space-section-md: var(--padding-section-md);
591
- --space-section-lg: var(--padding-section-lg);
592
- --space-section-xl: var(--padding-section-xl);
593
-
594
- Legacy typography
595
- --text-xs: var(--text-tiny);
596
- --text-sm: var(--text-small);
597
- --text-base: var(--text-body);
598
- --text-lg: var(--text-body-lg);
599
- --text-xl: var(--text-h5);
600
- --text-2xl: var(--text-h4);
601
- --text-3xl: var(--text-h3);
602
- --text-4xl: var(--text-h2);
603
- --text-5xl: var(--text-h1);
604
- --text-6xl: var(--text-display-sm);
605
- --text-7xl: var(--text-display-md);
606
- --text-8xl: var(--text-display-lg);
607
- }
608
- */
609
- .tag-cloud {
610
- display: flex;
611
- flex-wrap: wrap;
612
- gap: var(--gap-md);
613
- justify-content: center;
614
- margin-bottom: var(--gap-xl);
615
- }
616
-
617
- /* ==================== ACCOUNT CENTER ==================== */
618
- .account-card {
619
- max-width: 56rem;
620
- }
621
-
622
- .account-logo {
623
- display: flex;
624
- justify-content: center;
625
- margin-bottom: var(--space-16);
626
- }
627
-
628
- .account-header-centered {
629
- text-align: center;
630
- margin-bottom: var(--space-32);
631
- }
632
-
633
- .account-tabs {
634
- display: flex;
635
- gap: var(--space-8);
636
- margin-bottom: var(--space-24);
637
- justify-content: center;
638
- }
639
-
640
- .account-profile-grid {
641
- display: grid;
642
- gap: var(--space-24);
643
- }
644
-
645
- .account-profile-field {
646
- display: flex;
647
- flex-direction: column;
648
- gap: var(--space-8);
649
- }
650
-
651
- .account-profile-label {
652
- font-size: 0.875rem;
653
- opacity: 0.7;
654
- }
655
-
656
- .account-profile-value {
657
- font-size: 1rem;
658
- }
659
-
660
- .account-empty-state {
661
- text-align: center;
662
- padding: var(--space-48) var(--space-24);
663
- }
664
-
665
- .account-empty-text {
666
- font-size: 0.875rem;
667
- opacity: 0.5;
668
- }
669
-
670
- .account-subscription-list {
671
- display: grid;
672
- gap: var(--space-16);
673
- }
674
-
675
- .account-subscription-header {
676
- display: flex;
677
- justify-content: space-between;
678
- align-items: center;
679
- margin-bottom: var(--space-12);
680
- }
681
-
682
- .account-subscription-name {
683
- font-size: 1.125rem;
684
- font-weight: 600;
685
- }
686
-
687
- .account-subscription-details {
688
- display: flex;
689
- flex-direction: column;
690
- gap: var(--space-8);
691
- }
692
-
693
- .account-subscription-info {
694
- font-size: 0.875rem;
695
- opacity: 0.7;
696
- }
697
-
698
- .account-subscription-warning {
699
- font-size: 0.875rem;
700
- color: var(--error);
701
- }
702
-
703
- .account-section {
704
- margin-bottom: var(--space-24);
705
- }
706
-
707
- .account-section-title {
708
- font-size: 1.25rem;
709
- font-weight: 600;
710
- margin-bottom: var(--space-16);
711
- }
712
-
713
- .account-separator {
714
- height: 1px;
715
- background: var(--border);
716
- margin: var(--gap-md) 0;
717
- }
718
-
719
- .account-footer {
720
- margin-top: var(--gap-md);
721
- display: flex;
722
- justify-content: center;
723
- }
@@ -1,98 +0,0 @@
1
- /* Extended CSS Variables - Factorized values */
2
-
3
- :root {
4
- /* Animation variables - centralized timing */
5
- --animation-duration: 0.2s;
6
- --animation-duration-slow: 0.3s;
7
- --animation-duration-fast: 0.15s;
8
- --animation-easing: ease;
9
- --animation-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
10
- --animation-easing-smooth: cubic-bezier(0.4, 0, 0.2, 1);
11
-
12
- /* Shadow variables - consistent elevation */
13
- --shadow-1: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
14
- --shadow-2: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
15
- --shadow-3: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
16
- --shadow-4: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
17
- --shadow-5: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
18
- --shadow-6: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
19
-
20
- /* Z-index scale - consistent layering */
21
- --z-dropdown: 1000;
22
- --z-sticky: 1020;
23
- --z-fixed: 1030;
24
- --z-modal-backdrop: 1040;
25
- --z-modal: 1050;
26
- --z-popover: 1060;
27
- --z-tooltip: 1070;
28
- --z-toast: 1080;
29
-
30
- /* Border variables */
31
- --border-width: 1px;
32
- --border-width-thick: 2px;
33
- --border-style: solid;
34
-
35
- /* Opacity scale */
36
- --opacity-disabled: 0.5;
37
- --opacity-hover: 0.8;
38
- --opacity-pressed: 0.9;
39
-
40
- /* Transition patterns */
41
- --transition-colors: color var(--animation-duration) var(--animation-easing),
42
- background-color var(--animation-duration) var(--animation-easing),
43
- border-color var(--animation-duration) var(--animation-easing);
44
-
45
- --transition-transform: transform var(--animation-duration) var(--animation-easing);
46
-
47
- --transition-opacity: opacity var(--animation-duration) var(--animation-easing);
48
-
49
- --transition-all: all var(--animation-duration) var(--animation-easing);
50
-
51
- /* Status colors - semantic meaning */
52
- --color-success: #4ade80;
53
- --color-success-bg: rgba(34, 197, 94, 0.15);
54
-
55
- --color-warning: #fbbf24;
56
- --color-warning-bg: rgba(245, 158, 11, 0.15);
57
-
58
- --color-error: #f87171;
59
- --color-error-bg: rgba(239, 68, 68, 0.15);
60
-
61
- --color-info: #60a5fa;
62
- --color-info-bg: rgba(59, 130, 246, 0.15);
63
-
64
- /* Component sizing scale */
65
- --size-xs: 1.5rem; /* 24px */
66
- --size-sm: 2rem; /* 32px */
67
- --size-md: 2.5rem; /* 40px */
68
- --size-lg: 3rem; /* 48px */
69
- --size-xl: 3.5rem; /* 56px */
70
- --size-2xl: 4rem; /* 64px */
71
-
72
- /* Content width constraints */
73
- --content-width-xs: 20rem; /* 320px */
74
- --content-width-sm: 24rem; /* 384px */
75
- --content-width-md: 28rem; /* 448px */
76
- --content-width-lg: 32rem; /* 512px */
77
- --content-width-xl: 36rem; /* 576px */
78
- --content-width-2xl: 42rem; /* 672px */
79
- --content-width-3xl: 48rem; /* 768px */
80
- --content-width-4xl: 56rem; /* 896px */
81
- --content-width-5xl: 64rem; /* 1024px */
82
- --content-width-6xl: 72rem; /* 1152px */
83
- --content-width-7xl: 80rem; /* 1280px */
84
-
85
- /* Aspect ratios */
86
- --aspect-square: 1 / 1;
87
- --aspect-video: 16 / 9;
88
- --aspect-photo: 4 / 3;
89
- --aspect-golden: 1.618 / 1;
90
-
91
- /* Line heights - typography scale */
92
- --leading-none: 1;
93
- --leading-tight: 1.25;
94
- --leading-snug: 1.375;
95
- --leading-normal: 1.5;
96
- --leading-relaxed: 1.625;
97
- --leading-loose: 2;
98
- }