@luxflow/tokens 0.2.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 ADDED
@@ -0,0 +1,17 @@
1
+ # @luxflow/tokens
2
+
3
+ Design tokens for LuxFlow UI system.
4
+
5
+ ## Usage
6
+
7
+ ```tsx
8
+ import '@luxflow/tokens/tokens.css';
9
+ import '@luxflow/tokens/theme.css';
10
+ ```
11
+
12
+ ## Tokens
13
+
14
+ - Colors: `--bg`, `--surface`, `--text`, `--titles`, `--border`, `--accent`
15
+ - Spacing: `--gap-*`, `--padding-*`
16
+ - Radius: `--radius-*`
17
+ - Shadows: `--shadow-*`
package/package.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@luxflow/tokens",
3
+ "version": "0.2.0",
4
+ "exports": {
5
+ "./contract.css": "./src/contract.css",
6
+ "./semantics.css": "./src/semantics.css",
7
+ "./theme.template.css": "./src/theme.template.css",
8
+ "./vendor-themes.css": "./src/vendor-themes.css",
9
+ "./vendor-variables.css": "./src/vendor-variables.css"
10
+ },
11
+ "files": ["src/*.css"],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ }
15
+ }
package/src/compat.css ADDED
@@ -0,0 +1,51 @@
1
+ /* LuxFlow Compat Aliases: --lf-* → bare (ADR-008) */
2
+ @import './contract.css';
3
+ :root {
4
+ --bg: var(--lf-bg); --surface: var(--lf-surface-1); --text: var(--lf-text);
5
+ --foreground: var(--lf-foreground); --titles: var(--lf-titles);
6
+ --muted: var(--lf-muted); --muted-foreground: var(--lf-muted-foreground);
7
+ --border: var(--lf-border); --primary: var(--lf-accent); --accent: var(--lf-accent);
8
+ --ring: var(--lf-ring); --success: var(--lf-success); --warning: var(--lf-warning);
9
+ --error: var(--lf-danger); --destructive: var(--lf-danger); --info: var(--lf-info);
10
+ --gap-2xs: var(--lf-gap-2xs); --gap-xs: var(--lf-gap-xs); --gap-sm: var(--lf-gap-sm);
11
+ --gap-md: var(--lf-gap-md); --gap-lg: var(--lf-gap-lg); --gap-xl: var(--lf-gap-xl);
12
+ --padding-sm: var(--lf-padding-sm); --padding-md: var(--lf-padding-md);
13
+ --padding-lg: var(--lf-padding-lg); --padding-xl: var(--lf-padding-xl);
14
+ --margin-sm: var(--lf-margin-sm); --margin-lg: var(--lf-margin-lg);
15
+ --padding-container: var(--lf-padding-container);
16
+ --padding-section-sm: var(--lf-padding-section-sm);
17
+ --padding-section-md: var(--lf-padding-section-md);
18
+ --padding-section-lg: var(--lf-padding-section-lg);
19
+ --padding-section-xl: var(--lf-padding-section-xl);
20
+ --container-sm: var(--lf-container-sm); --container-md: var(--lf-container-md);
21
+ --container-lg: var(--lf-container-lg); --container-xl: var(--lf-container-xl);
22
+ --text-h1: var(--lf-text-h1); --text-h2: var(--lf-text-h2);
23
+ --text-h3: var(--lf-text-h3); --text-h4: var(--lf-text-h4);
24
+ --text-h5: var(--lf-text-h5); --text-h6: var(--lf-text-h6);
25
+ --text-display-lg: var(--lf-text-display-lg);
26
+ --text-body: var(--lf-text-body); --text-body-lg: var(--lf-text-body-lg);
27
+ --text-small: var(--lf-text-small); --text-tiny: var(--lf-text-tiny);
28
+ --font-light: var(--lf-font-light); --font-normal: var(--lf-font-normal);
29
+ --font-medium: var(--lf-font-medium); --font-semibold: var(--lf-font-semibold);
30
+ --font-bold: var(--lf-font-bold); --leading-tight: var(--lf-leading-tight);
31
+ --radius-xs: var(--lf-radius-xs);
32
+ --radius-sm: var(--lf-radius-sm); --radius-md: var(--lf-radius-md);
33
+ --radius-lg: var(--lf-radius-lg); --radius-xl: var(--lf-radius-xl);
34
+ --radius-2xl: var(--lf-radius-2xl); --radius-full: var(--lf-radius-full);
35
+ --shadow-sm: var(--lf-shadow-sm); --shadow-md: var(--lf-shadow-md);
36
+ --shadow-lg: var(--lf-shadow-lg); --shadow-xl: var(--lf-shadow-xl);
37
+ --z-base: var(--lf-z-base); --z-raised: var(--lf-z-raised);
38
+ --z-dropdown: var(--lf-z-dropdown); --z-sticky: var(--lf-z-sticky);
39
+ --z-header: var(--lf-z-header); --z-modal: var(--lf-z-modal);
40
+ --z-overlay: var(--lf-z-overlay); --z-toast: var(--lf-z-toast);
41
+ --font-sans: var(--lf-font-sans);
42
+ --margin-md: var(--lf-margin-md); --margin-xl: var(--lf-margin-xl);
43
+ --motion-duration-fast: var(--lf-motion-duration-fast);
44
+ --motion-duration-normal: var(--lf-motion-duration-normal);
45
+ --motion-duration-slow: var(--lf-motion-duration-slow);
46
+ --motion-easing-default: var(--lf-motion-easing-default);
47
+ --motion-easing-in: var(--lf-motion-easing-in);
48
+ --motion-easing-out: var(--lf-motion-easing-out);
49
+ --motion-easing-in-out: var(--lf-motion-easing-in-out);
50
+ --transition-all: var(--lf-transition);
51
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @luxflow/tokens/components.css — DEPRECATED (ADR-009)
3
+ *
4
+ * Component CSS has been MOVED to @luxflow/ui/styles/components.css.
5
+ *
6
+ * @luxflow/tokens NOW OWNS ONLY:
7
+ * - contract.css (canonical --lf-* variables)
8
+ * - compat.css (bare aliases → --lf-*)
9
+ * - semantics.css (utility classes consuming --lf-*)
10
+ * - theme.template.css (project theme starter)
11
+ *
12
+ * MIGRATION (required):
13
+ * - Replace `@import '@luxflow/tokens/components.css'`
14
+ * with `@import '@luxflow/ui/styles/components.css'`
15
+ *
16
+ * This stub remains empty intentionally. Anything still importing it
17
+ * will lose component styles — surface the migration loudly.
18
+ *
19
+ * Removal target: next minor release of @luxflow/tokens.
20
+ */
21
+
@@ -0,0 +1,118 @@
1
+ /**
2
+ * LuxFlow Tokens Contract
3
+ * Defines the CANONICAL --lf-* variables that all LuxFlow themes must provide.
4
+ * See: ADR-008-theme-variable-canon-luxflow.md
5
+ */
6
+
7
+ :root {
8
+ /* ==================== COLORS ==================== */
9
+ --lf-bg: #0a0a0a;
10
+ --lf-surface-1: #121212;
11
+ --lf-surface-2: #1a1a1a;
12
+ --lf-surface-3: #222222;
13
+ --lf-text: #cccccc;
14
+ --lf-foreground: var(--lf-text);
15
+ --lf-titles: #ffffff;
16
+ --lf-muted: #999999;
17
+ --lf-muted-foreground: var(--lf-muted);
18
+ --lf-border: #2a2a2a;
19
+ --lf-accent: #4a90e2;
20
+ --lf-ring: var(--lf-accent);
21
+
22
+ /* Status */
23
+ --lf-success: #10b981;
24
+ --lf-warning: #f59e0b;
25
+ --lf-danger: #ef4444;
26
+ --lf-info: #3b82f6;
27
+
28
+ /* ==================== SPACING ==================== */
29
+ --lf-gap-2xs: 0.125rem;
30
+ --lf-gap-xs: 0.25rem;
31
+ --lf-gap-sm: 0.5rem;
32
+ --lf-gap-md: 1rem;
33
+ --lf-gap-lg: 1.5rem;
34
+ --lf-gap-xl: 2rem;
35
+
36
+ --lf-padding-sm: 0.5rem;
37
+ --lf-padding-md: 1rem;
38
+ --lf-padding-lg: 1.5rem;
39
+ --lf-padding-xl: 2rem;
40
+
41
+ --lf-margin-sm: 0.5rem;
42
+ --lf-margin-md: 1rem;
43
+ --lf-margin-lg: 2rem;
44
+ --lf-margin-xl: 3rem;
45
+
46
+ --lf-padding-container: 4rem;
47
+ --lf-padding-section-sm: 2rem;
48
+ --lf-padding-section-md: 4rem;
49
+ --lf-padding-section-lg: 6rem;
50
+ --lf-padding-section-xl: 8rem;
51
+
52
+ --lf-container-sm: 640px;
53
+ --lf-container-md: 768px;
54
+ --lf-container-lg: 1024px;
55
+ --lf-container-xl: 1280px;
56
+
57
+ /* ==================== TYPOGRAPHY ==================== */
58
+ --lf-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
59
+
60
+ --lf-text-h1: 3rem;
61
+ --lf-text-h2: 2.5rem;
62
+ --lf-text-h3: 1.5rem;
63
+ --lf-text-h4: 1.25rem;
64
+ --lf-text-h5: 1.125rem;
65
+ --lf-text-h6: 1rem;
66
+ --lf-text-display-lg: 6rem;
67
+ --lf-text-body: 1rem;
68
+ --lf-text-body-lg: 1.5rem;
69
+ --lf-text-small: 1rem;
70
+ --lf-text-tiny: 0.75rem;
71
+
72
+ --lf-font-light: 300;
73
+ --lf-font-normal: 400;
74
+ --lf-font-medium: 500;
75
+ --lf-font-semibold: 600;
76
+ --lf-font-bold: 700;
77
+
78
+ --lf-leading-tight: 1.25;
79
+
80
+ /* ==================== BORDER RADIUS ==================== */
81
+ --lf-radius-xs: 0.125rem;
82
+ --lf-radius-sm: 0.25rem;
83
+ --lf-radius-md: 0.5rem;
84
+ --lf-radius-lg: 0.75rem;
85
+ --lf-radius-xl: 1rem;
86
+ --lf-radius-2xl: 1.5rem;
87
+ --lf-radius-full: 9999px;
88
+
89
+ /* ==================== SHADOWS ==================== */
90
+ --lf-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
91
+ --lf-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
92
+ --lf-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
93
+ --lf-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
94
+
95
+ /* ==================== EFFECTS ==================== */
96
+ --lf-blur-md: blur(8px);
97
+ --lf-transition: all 0.2s ease;
98
+
99
+ /* ==================== Z-INDEX ==================== */
100
+ --lf-z-base: 0;
101
+ --lf-z-raised: 10;
102
+ --lf-z-dropdown: 20;
103
+ --lf-z-sticky: 30;
104
+ --lf-z-header: 40;
105
+ --lf-z-modal: 50;
106
+ --lf-z-overlay: 60;
107
+ --lf-z-toast: 70;
108
+
109
+ /* ==================== MOTION ==================== */
110
+ --lf-motion-duration-fast: 0.1s;
111
+ --lf-motion-duration-normal: 0.2s;
112
+ --lf-motion-duration-slow: 0.4s;
113
+ --lf-motion-easing-default: ease;
114
+ --lf-motion-easing-in: ease-in;
115
+ --lf-motion-easing-out: ease-out;
116
+ --lf-motion-easing-in-out: ease-in-out;
117
+ --lf-motion-easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
118
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * LuxFlow Semantic Classes
3
+ * UI components use these classes which reference contract variables.
4
+ */
5
+
6
+ @import './contract.css';
7
+
8
+ /* Base */
9
+ body {
10
+ font-family: Inter, system-ui, sans-serif;
11
+ background: var(--lf-bg);
12
+ color: var(--lf-text);
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+
17
+ h1, h2, h3, h4, h5, h6 {
18
+ color: var(--lf-titles);
19
+ }
20
+
21
+ /* Layout */
22
+ .lf-app {
23
+ background: var(--lf-bg);
24
+ color: var(--lf-text);
25
+ }
26
+
27
+ .lf-surface {
28
+ background: var(--lf-surface-1);
29
+ border: 1px solid var(--lf-border);
30
+ }
31
+
32
+ .lf-surface-2 {
33
+ background: var(--lf-surface-2);
34
+ }
35
+
36
+ .lf-surface-3 {
37
+ background: var(--lf-surface-3);
38
+ }
39
+
40
+ .lf-card {
41
+ background: var(--lf-surface-1);
42
+ border: 1px solid var(--lf-border);
43
+ border-radius: var(--lf-radius-md);
44
+ padding: var(--lf-padding-lg);
45
+ }
46
+
47
+ .lf-panel {
48
+ background: var(--lf-surface-1);
49
+ border: 1px solid var(--lf-border);
50
+ padding: var(--lf-padding-md);
51
+ }
52
+
53
+ /* Typography */
54
+ .lf-text {
55
+ color: var(--lf-text);
56
+ }
57
+
58
+ .lf-titles {
59
+ color: var(--lf-titles);
60
+ }
61
+
62
+ .lf-muted {
63
+ color: var(--lf-muted);
64
+ }
65
+
66
+ /* Button */
67
+ .lf-btn {
68
+ padding: var(--lf-padding-sm) var(--lf-padding-md);
69
+ border-radius: var(--lf-radius-sm);
70
+ font-family: inherit;
71
+ font-size: 1rem;
72
+ cursor: pointer;
73
+ transition: var(--lf-transition);
74
+ border: 1px solid transparent;
75
+ }
76
+
77
+ .lf-btn-primary {
78
+ background: var(--lf-accent);
79
+ color: #ffffff;
80
+ border-color: var(--lf-accent);
81
+ }
82
+
83
+ .lf-btn-primary:hover {
84
+ opacity: 0.9;
85
+ }
86
+
87
+ .lf-btn-secondary {
88
+ background: var(--lf-surface-1);
89
+ color: var(--lf-text);
90
+ border-color: var(--lf-border);
91
+ }
92
+
93
+ .lf-btn-secondary:hover {
94
+ background: var(--lf-surface-2);
95
+ }
96
+
97
+ .lf-btn-ghost {
98
+ background: transparent;
99
+ color: var(--lf-text);
100
+ }
101
+
102
+ .lf-btn-ghost:hover {
103
+ background: var(--lf-surface-1);
104
+ }
105
+
106
+ /* Badge */
107
+ .lf-badge {
108
+ padding: 0.25rem 0.75rem;
109
+ border-radius: var(--lf-radius-sm);
110
+ font-size: 0.875rem;
111
+ display: inline-block;
112
+ }
113
+
114
+ .lf-badge-success {
115
+ background: var(--lf-success);
116
+ color: #ffffff;
117
+ }
118
+
119
+ .lf-badge-warning {
120
+ background: var(--lf-warning);
121
+ color: #ffffff;
122
+ }
123
+
124
+ .lf-badge-danger {
125
+ background: var(--lf-danger);
126
+ color: #ffffff;
127
+ }
128
+
129
+ .lf-badge-default {
130
+ background: var(--lf-muted);
131
+ color: #ffffff;
132
+ }
133
+
134
+ /* Border */
135
+ .lf-border {
136
+ border-color: var(--lf-border);
137
+ }
138
+
139
+ /* Modal */
140
+ .lf-modal-backdrop {
141
+ background: rgba(0, 0, 0, 0.7);
142
+ backdrop-filter: var(--lf-blur-md);
143
+ }
144
+
145
+ .lf-modal {
146
+ background: var(--lf-surface-1);
147
+ border: 1px solid var(--lf-border);
148
+ border-radius: var(--lf-radius-lg);
149
+ box-shadow: var(--lf-shadow-xl);
150
+ }
@@ -0,0 +1,151 @@
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.
7
+ */
8
+
9
+ :root {
10
+ /* ============================================
11
+ BASE COLORS (Dark Theme Default)
12
+ ============================================ */
13
+
14
+ --lf-bg: #0b0b0d;
15
+ --lf-surface-1: #141317;
16
+ --lf-surface-2: #1a1a1e;
17
+ --lf-surface-3: #202024;
18
+ --lf-text: #c5ccd6;
19
+ --lf-titles: #ffffff;
20
+ --lf-muted: #9ca3af;
21
+ --lf-border: #1f1f23;
22
+
23
+ /* ============================================
24
+ BRAND / ACCENT
25
+ ============================================ */
26
+
27
+ --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
+
41
+ --lf-success: #10b981;
42
+ --lf-warning: #f59e0b;
43
+ --lf-danger: #ef4444;
44
+ --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
+
55
+ --lf-padding-sm: 0.5rem;
56
+ --lf-padding-md: 1rem;
57
+ --lf-padding-lg: 1.5rem;
58
+ --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
+
85
+ --lf-shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
86
+ --lf-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
87
+ --lf-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
88
+ --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
+
95
+ --lf-blur-md: blur(8px);
96
+ --lf-transition: all 0.2s ease;
97
+
98
+ /* ============================================
99
+ Z-INDEX
100
+ ============================================ */
101
+
102
+ --lf-z-modal: 50;
103
+ --lf-z-overlay: 60;
104
+ --lf-z-toast: 70;
105
+ }
106
+
107
+ /* ============================================
108
+ LIGHT THEME (Optional)
109
+ ============================================ */
110
+
111
+ /*
112
+ [data-theme="light"] {
113
+ --lf-bg: #f8f8f8;
114
+ --lf-surface-1: #ffffff;
115
+ --lf-surface-2: #f5f5f5;
116
+ --lf-surface-3: #eeeeee;
117
+ --lf-text: #333333;
118
+ --lf-titles: #111111;
119
+ --lf-muted: #666666;
120
+ --lf-border: #e5e7eb;
121
+
122
+ --lf-neutral-1: #f1f2f4;
123
+ --lf-neutral-2: #e6e8eb;
124
+ --lf-neutral-3: #d1d5db;
125
+ }
126
+ */
127
+
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
+
139
+ /*
140
+ [data-brand="alt"] {
141
+ --lf-accent: #ff6b6b;
142
+ }
143
+
144
+ [data-brand="pro"] {
145
+ --lf-accent: #9333ea;
146
+ }
147
+
148
+ [data-brand="enterprise"] {
149
+ --lf-accent: #0ea5e9;
150
+ }
151
+ */
@@ -0,0 +1,723 @@
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
+ }
@@ -0,0 +1,98 @@
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
+ }