@mars-stack/ui 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.
@@ -0,0 +1,126 @@
1
+ /* MARS Design System: Layer 1 -- Primitive Palette
2
+ * Raw colour scales. Components never use these directly.
3
+ * The brand palette is generated from app.config.ts primaryColor. */
4
+
5
+ :root {
6
+ /* Gray scale (neutral UI surfaces and text) */
7
+ --gray-50: oklch(0.985 0.002 247);
8
+ --gray-100: oklch(0.967 0.003 264);
9
+ --gray-200: oklch(0.928 0.006 264);
10
+ --gray-300: oklch(0.872 0.01 258);
11
+ --gray-400: oklch(0.707 0.015 261);
12
+ --gray-500: oklch(0.551 0.018 264);
13
+ --gray-600: oklch(0.446 0.018 264);
14
+ --gray-700: oklch(0.372 0.017 259);
15
+ --gray-800: oklch(0.278 0.015 264);
16
+ --gray-900: oklch(0.21 0.012 264);
17
+ --gray-950: oklch(0.13 0.01 264);
18
+
19
+ /* Brand primary (default: blue -- swap via CLI or config) */
20
+ --brand-50: oklch(0.97 0.014 254);
21
+ --brand-100: oklch(0.932 0.032 255);
22
+ --brand-200: oklch(0.882 0.059 254);
23
+ --brand-300: oklch(0.809 0.105 251);
24
+ --brand-400: oklch(0.714 0.153 248);
25
+ --brand-500: oklch(0.623 0.214 259);
26
+ --brand-600: oklch(0.546 0.245 263);
27
+ --brand-700: oklch(0.488 0.243 264);
28
+ --brand-800: oklch(0.424 0.199 265);
29
+ --brand-900: oklch(0.379 0.146 265);
30
+ --brand-950: oklch(0.283 0.111 264);
31
+
32
+ /* Feedback colours (fixed across themes) */
33
+ --red-50: oklch(0.971 0.013 17);
34
+ --red-500: oklch(0.637 0.237 25);
35
+ --red-600: oklch(0.577 0.245 27);
36
+ --red-700: oklch(0.505 0.213 27);
37
+
38
+ --amber-50: oklch(0.987 0.022 95);
39
+ --amber-500: oklch(0.769 0.188 70);
40
+ --amber-600: oklch(0.666 0.179 58);
41
+
42
+ --emerald-50: oklch(0.979 0.021 166);
43
+ --emerald-500: oklch(0.696 0.17 163);
44
+ --emerald-600: oklch(0.596 0.145 163);
45
+ --emerald-700: oklch(0.527 0.124 163);
46
+
47
+ --blue-50: oklch(0.97 0.014 254);
48
+ --blue-500: oklch(0.623 0.214 259);
49
+ --blue-600: oklch(0.546 0.245 263);
50
+ --blue-700: oklch(0.488 0.243 264);
51
+
52
+ /* Accent palette (default: amber -- swap via CLI or config) */
53
+ --accent-50: oklch(0.987 0.022 95);
54
+ --accent-100: oklch(0.962 0.059 95);
55
+ --accent-200: oklch(0.924 0.12 95);
56
+ --accent-300: oklch(0.879 0.169 84);
57
+ --accent-400: oklch(0.828 0.189 75);
58
+ --accent-500: oklch(0.769 0.188 70);
59
+ --accent-600: oklch(0.666 0.179 58);
60
+ --accent-700: oklch(0.555 0.163 48);
61
+ --accent-800: oklch(0.473 0.137 46);
62
+ --accent-900: oklch(0.414 0.112 45);
63
+ --accent-950: oklch(0.279 0.077 45);
64
+
65
+ /* Border radius */
66
+ --radius-none: 0;
67
+ --radius-sm: 0.25rem;
68
+ --radius-md: 0.375rem;
69
+ --radius-lg: 0.5rem;
70
+ --radius-xl: 0.75rem;
71
+ --radius-2xl: 1rem;
72
+ --radius-full: 9999px;
73
+
74
+ /* Spacing (base 4px grid) */
75
+ --space-0: 0;
76
+ --space-1: 0.25rem;
77
+ --space-2: 0.5rem;
78
+ --space-3: 0.75rem;
79
+ --space-4: 1rem;
80
+ --space-5: 1.25rem;
81
+ --space-6: 1.5rem;
82
+ --space-8: 2rem;
83
+ --space-10: 2.5rem;
84
+ --space-12: 3rem;
85
+ --space-16: 4rem;
86
+
87
+ /* Typography scale */
88
+ --text-xs: 0.75rem;
89
+ --text-sm: 0.875rem;
90
+ --text-base: 1rem;
91
+ --text-lg: 1.125rem;
92
+ --text-xl: 1.25rem;
93
+ --text-2xl: 1.5rem;
94
+ --text-3xl: 1.875rem;
95
+ --text-4xl: 2.25rem;
96
+
97
+ --leading-tight: 1.25;
98
+ --leading-normal: 1.5;
99
+ --leading-relaxed: 1.625;
100
+
101
+ --tracking-tight: -0.025em;
102
+ --tracking-normal: 0;
103
+ --tracking-wide: 0.025em;
104
+
105
+ --font-weight-normal: 400;
106
+ --font-weight-medium: 500;
107
+ --font-weight-semibold: 600;
108
+ --font-weight-bold: 700;
109
+
110
+ /* Animation */
111
+ --duration-fast: 150ms;
112
+ --duration-normal: 250ms;
113
+ --duration-slow: 400ms;
114
+
115
+ --ease-default: cubic-bezier(0.4, 0, 0.2, 1);
116
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
117
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
118
+ --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
119
+
120
+ /* Z-index scale */
121
+ --z-dropdown: 10;
122
+ --z-sticky: 20;
123
+ --z-modal: 30;
124
+ --z-toast: 40;
125
+ --z-tooltip: 50;
126
+ }
@@ -0,0 +1,116 @@
1
+ /* MARS Design System: Tailwind 4 @theme Integration
2
+ * Maps semantic tokens to Tailwind utility classes.
3
+ * Usage: bg-surface-card, text-text-primary, border-border-input, etc. */
4
+
5
+ @theme {
6
+ /* Surfaces -> bg-surface-* */
7
+ --color-surface-background: var(--surface-background);
8
+ --color-surface-card: var(--surface-card);
9
+ --color-surface-elevated: var(--surface-elevated);
10
+ --color-surface-overlay: var(--surface-overlay);
11
+ --color-surface-sidebar: var(--surface-sidebar);
12
+ --color-surface-input: var(--surface-input);
13
+ --color-surface-selected: var(--surface-selected);
14
+ --color-surface-hover: var(--surface-hover);
15
+ --color-surface-active: var(--surface-active);
16
+ --color-surface-disabled: var(--surface-disabled);
17
+ --color-surface-skeleton: var(--surface-skeleton);
18
+ --color-surface-code: var(--surface-code);
19
+ --color-surface-tooltip: var(--surface-tooltip);
20
+
21
+ /* Text -> text-text-* */
22
+ --color-text-primary: var(--text-primary);
23
+ --color-text-secondary: var(--text-secondary);
24
+ --color-text-muted: var(--text-muted);
25
+ --color-text-inverse: var(--text-inverse);
26
+ --color-text-link: var(--text-link);
27
+ --color-text-link-hover: var(--text-link-hover);
28
+ --color-text-on-brand: var(--text-on-brand);
29
+ --color-text-on-danger: var(--text-on-danger);
30
+ --color-text-success: var(--text-success);
31
+ --color-text-warning: var(--text-warning);
32
+ --color-text-error: var(--text-error);
33
+ --color-text-info: var(--text-info);
34
+ --color-text-tooltip: var(--text-tooltip);
35
+ --color-text-badge: var(--text-badge);
36
+ --color-text-code: var(--text-code);
37
+
38
+ /* Borders -> border-border-* */
39
+ --color-border-default: var(--border-default);
40
+ --color-border-strong: var(--border-strong);
41
+ --color-border-input: var(--border-input);
42
+ --color-border-input-hover: var(--border-input-hover);
43
+ --color-border-focus: var(--border-focus);
44
+ --color-border-error: var(--border-error);
45
+ --color-border-success: var(--border-success);
46
+ --color-border-divider: var(--border-divider);
47
+ --color-border-selected: var(--border-selected);
48
+
49
+ /* Brand -> bg-brand-*, text-brand-* */
50
+ --color-brand-primary: var(--brand-primary);
51
+ --color-brand-primary-hover: var(--brand-primary-hover);
52
+ --color-brand-primary-active: var(--brand-primary-active);
53
+ --color-brand-primary-muted: var(--brand-primary-muted);
54
+ --color-brand-primary-muted-hover: var(--brand-primary-muted-hover);
55
+ --color-brand-secondary: var(--brand-secondary);
56
+ --color-brand-secondary-hover: var(--brand-secondary-hover);
57
+ --color-brand-secondary-text: var(--brand-secondary-text);
58
+
59
+ /* Feedback -> bg-success, text-error, etc. */
60
+ --color-success: var(--success);
61
+ --color-success-hover: var(--success-hover);
62
+ --color-success-muted: var(--success-muted);
63
+ --color-warning: var(--warning);
64
+ --color-warning-hover: var(--warning-hover);
65
+ --color-warning-muted: var(--warning-muted);
66
+ --color-error: var(--error);
67
+ --color-error-hover: var(--error-hover);
68
+ --color-error-muted: var(--error-muted);
69
+ --color-info: var(--info);
70
+ --color-info-hover: var(--info-hover);
71
+ --color-info-muted: var(--info-muted);
72
+
73
+ /* Interactive states */
74
+ --color-ghost-hover: var(--ghost-hover);
75
+ --color-ghost-active: var(--ghost-active);
76
+ --color-outline-border: var(--outline-border);
77
+ --color-outline-hover: var(--outline-hover);
78
+ --color-danger-bg: var(--danger-bg);
79
+ --color-danger-hover: var(--danger-hover);
80
+ --color-danger-muted-bg: var(--danger-muted-bg);
81
+ --color-ring-focus: var(--ring-focus);
82
+
83
+ /* Navigation */
84
+ --color-nav-item: var(--nav-item);
85
+ --color-nav-item-hover: var(--nav-item-hover);
86
+ --color-nav-item-active: var(--nav-item-active);
87
+ --color-nav-item-active-bg: var(--nav-item-active-bg);
88
+ --color-nav-group-label: var(--nav-group-label);
89
+
90
+ /* Table */
91
+ --color-table-header-bg: var(--table-header-bg);
92
+ --color-table-header-text: var(--table-header-text);
93
+ --color-table-row-hover: var(--table-row-hover);
94
+ --color-table-row-selected: var(--table-row-selected);
95
+ --color-table-row-stripe: var(--table-row-stripe);
96
+ --color-table-border: var(--table-border);
97
+
98
+ /* Avatar */
99
+ --color-avatar-bg: var(--avatar-bg);
100
+ --color-avatar-text: var(--avatar-text);
101
+ --color-avatar-ring: var(--avatar-ring);
102
+ --color-avatar-status-online: var(--avatar-status-online);
103
+ --color-avatar-status-offline: var(--avatar-status-offline);
104
+ --color-avatar-status-busy: var(--avatar-status-busy);
105
+
106
+ /* Shadows */
107
+ --shadow-xs: var(--shadow-xs);
108
+ --shadow-sm: var(--shadow-sm);
109
+ --shadow-md: var(--shadow-md);
110
+ --shadow-lg: var(--shadow-lg);
111
+ --shadow-xl: var(--shadow-xl);
112
+ --shadow-inner: var(--shadow-inner);
113
+
114
+ /* Font family */
115
+ --font-sans: var(--font-sans), ui-sans-serif, system-ui, sans-serif;
116
+ }
@@ -0,0 +1,240 @@
1
+ /* MARS Design System: Layer 2 -- Semantic Tokens
2
+ * What colours MEAN. Light and dark themes swap these values. */
3
+
4
+ /* ===== SURFACES ===== */
5
+ :root {
6
+ --surface-background: var(--gray-50);
7
+ --surface-card: white;
8
+ --surface-elevated: white;
9
+ --surface-overlay: oklch(0 0 0 / 0.5);
10
+ --surface-sidebar: var(--gray-50);
11
+ --surface-input: white;
12
+ --surface-selected: var(--brand-50);
13
+ --surface-hover: var(--gray-100);
14
+ --surface-active: var(--gray-200);
15
+ --surface-disabled: var(--gray-100);
16
+ --surface-skeleton: var(--gray-200);
17
+ --surface-code: var(--gray-100);
18
+ --surface-tooltip: var(--gray-900);
19
+ }
20
+
21
+ .dark {
22
+ --surface-background: var(--gray-950);
23
+ --surface-card: var(--gray-900);
24
+ --surface-elevated: var(--gray-800);
25
+ --surface-sidebar: var(--gray-900);
26
+ --surface-input: var(--gray-800);
27
+ --surface-selected: var(--brand-950);
28
+ --surface-hover: var(--gray-800);
29
+ --surface-active: var(--gray-700);
30
+ --surface-disabled: var(--gray-800);
31
+ --surface-skeleton: var(--gray-700);
32
+ --surface-code: var(--gray-800);
33
+ --surface-tooltip: var(--gray-700);
34
+ }
35
+
36
+ /* ===== TEXT ===== */
37
+ :root {
38
+ --text-primary: var(--gray-900);
39
+ --text-secondary: var(--gray-600);
40
+ --text-muted: var(--gray-400);
41
+ --text-inverse: white;
42
+ --text-on-tooltip: white;
43
+ --text-link: var(--brand-600);
44
+ --text-link-hover: var(--brand-700);
45
+ --text-on-brand: white;
46
+ --text-on-danger: white;
47
+ --text-success: var(--emerald-600);
48
+ --text-warning: var(--amber-600);
49
+ --text-error: var(--red-600);
50
+ --text-info: var(--blue-600);
51
+ --text-tooltip: white;
52
+ --text-badge: var(--brand-700);
53
+ --text-code: var(--brand-700);
54
+ }
55
+
56
+ .dark {
57
+ --text-primary: var(--gray-100);
58
+ --text-secondary: var(--gray-400);
59
+ --text-muted: var(--gray-500);
60
+ --text-inverse: var(--gray-900);
61
+ --text-link: var(--brand-400);
62
+ --text-link-hover: var(--brand-300);
63
+ --text-success: var(--emerald-500);
64
+ --text-warning: var(--amber-500);
65
+ --text-error: var(--red-500);
66
+ --text-info: var(--blue-500);
67
+ --text-badge: var(--brand-300);
68
+ --text-code: var(--brand-300);
69
+ --text-tooltip: var(--gray-100);
70
+ }
71
+
72
+ /* ===== BORDERS ===== */
73
+ :root {
74
+ --border-default: var(--gray-200);
75
+ --border-strong: var(--gray-300);
76
+ --border-input: var(--gray-300);
77
+ --border-input-hover: var(--gray-400);
78
+ --border-focus: var(--brand-500);
79
+ --border-error: var(--red-500);
80
+ --border-success: var(--emerald-500);
81
+ --border-warning: var(--amber-500);
82
+ --border-info: var(--blue-500);
83
+ --border-divider: var(--gray-200);
84
+ --border-selected: var(--brand-600);
85
+ }
86
+
87
+ .dark {
88
+ --border-default: var(--gray-800);
89
+ --border-strong: var(--gray-700);
90
+ --border-input: var(--gray-700);
91
+ --border-input-hover: var(--gray-600);
92
+ --border-divider: var(--gray-800);
93
+ }
94
+
95
+ /* ===== BRAND (interactive) ===== */
96
+ :root {
97
+ --brand-primary: var(--brand-600);
98
+ --brand-primary-hover: var(--brand-700);
99
+ --brand-primary-active: var(--brand-800);
100
+ --brand-primary-muted: var(--brand-50);
101
+ --brand-primary-muted-hover: var(--brand-100);
102
+ --brand-secondary: var(--brand-100);
103
+ --brand-secondary-hover: var(--brand-200);
104
+ --brand-secondary-text: var(--brand-700);
105
+ }
106
+
107
+ .dark {
108
+ --brand-primary: var(--brand-500);
109
+ --brand-primary-hover: var(--brand-400);
110
+ --brand-primary-active: var(--brand-300);
111
+ --brand-primary-muted: var(--brand-950);
112
+ --brand-primary-muted-hover: var(--brand-900);
113
+ --brand-secondary: var(--brand-900);
114
+ --brand-secondary-hover: var(--brand-800);
115
+ --brand-secondary-text: var(--brand-300);
116
+ }
117
+
118
+ /* ===== FEEDBACK ===== */
119
+ :root {
120
+ --success: var(--emerald-600);
121
+ --success-hover: var(--emerald-700);
122
+ --success-muted: var(--emerald-50);
123
+ --warning: var(--amber-500);
124
+ --warning-hover: var(--amber-600);
125
+ --warning-muted: var(--amber-50);
126
+ --error: var(--red-600);
127
+ --error-hover: var(--red-700);
128
+ --error-muted: var(--red-50);
129
+ --info: var(--blue-600);
130
+ --info-hover: var(--blue-700);
131
+ --info-muted: var(--blue-50);
132
+ }
133
+
134
+ .dark {
135
+ --success: var(--emerald-500);
136
+ --success-hover: var(--emerald-600);
137
+ --success-muted: oklch(0.596 0.145 163 / 0.15);
138
+ --warning: var(--amber-500);
139
+ --warning-hover: var(--amber-600);
140
+ --warning-muted: oklch(0.666 0.179 58 / 0.15);
141
+ --error: var(--red-500);
142
+ --error-hover: var(--red-600);
143
+ --error-muted: oklch(0.577 0.245 27 / 0.15);
144
+ --info: var(--blue-500);
145
+ --info-hover: var(--blue-600);
146
+ --info-muted: oklch(0.546 0.245 263 / 0.15);
147
+ }
148
+
149
+ /* ===== INTERACTIVE STATES ===== */
150
+ :root {
151
+ --ghost-hover: var(--gray-100);
152
+ --ghost-active: var(--gray-200);
153
+ --outline-border: var(--gray-300);
154
+ --outline-hover: var(--gray-50);
155
+ --danger-bg: var(--red-600);
156
+ --danger-hover: var(--red-700);
157
+ --danger-muted-bg: var(--red-50);
158
+ --ring-focus: var(--brand-500);
159
+ --ring-focus-shadow: 0 0 0 3px oklch(0.546 0.245 263 / 0.25);
160
+ --disabled-opacity: 0.5;
161
+ }
162
+
163
+ .dark {
164
+ --ghost-hover: var(--gray-800);
165
+ --ghost-active: var(--gray-700);
166
+ --outline-border: var(--gray-600);
167
+ --outline-hover: var(--gray-800);
168
+ --danger-muted-bg: oklch(0.577 0.245 27 / 0.15);
169
+ }
170
+
171
+ /* ===== NAVIGATION ===== */
172
+ :root {
173
+ --nav-item: var(--gray-600);
174
+ --nav-item-hover: var(--gray-900);
175
+ --nav-item-active: var(--brand-600);
176
+ --nav-item-active-bg: var(--brand-50);
177
+ --nav-group-label: var(--gray-400);
178
+ }
179
+
180
+ .dark {
181
+ --nav-item: var(--gray-400);
182
+ --nav-item-hover: var(--gray-100);
183
+ --nav-item-active: var(--brand-400);
184
+ --nav-item-active-bg: var(--brand-950);
185
+ --nav-group-label: var(--gray-500);
186
+ }
187
+
188
+ /* ===== TABLE ===== */
189
+ :root {
190
+ --table-header-bg: var(--gray-50);
191
+ --table-header-text: var(--gray-600);
192
+ --table-row-hover: var(--gray-50);
193
+ --table-row-selected: var(--brand-50);
194
+ --table-row-stripe: var(--gray-50);
195
+ --table-border: var(--gray-200);
196
+ }
197
+
198
+ .dark {
199
+ --table-header-bg: var(--gray-800);
200
+ --table-header-text: var(--gray-400);
201
+ --table-row-hover: var(--gray-800);
202
+ --table-row-selected: var(--brand-950);
203
+ --table-row-stripe: var(--gray-900);
204
+ --table-border: var(--gray-800);
205
+ }
206
+
207
+ /* ===== AVATAR ===== */
208
+ :root {
209
+ --avatar-bg: var(--brand-100);
210
+ --avatar-text: var(--brand-700);
211
+ --avatar-ring: white;
212
+ --avatar-status-online: var(--emerald-500);
213
+ --avatar-status-offline: var(--gray-400);
214
+ --avatar-status-busy: var(--red-500);
215
+ }
216
+
217
+ .dark {
218
+ --avatar-bg: var(--brand-900);
219
+ --avatar-text: var(--brand-300);
220
+ --avatar-ring: var(--gray-900);
221
+ --avatar-status-offline: var(--gray-600);
222
+ }
223
+
224
+ /* ===== SHADOWS ===== */
225
+ :root {
226
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
227
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
228
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
229
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
230
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
231
+ --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);
232
+ }
233
+
234
+ .dark {
235
+ --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.3);
236
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.4), 0 1px 2px -1px rgb(0 0 0 / 0.3);
237
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.4), 0 2px 4px -2px rgb(0 0 0 / 0.3);
238
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.3);
239
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.5), 0 8px 10px -6px rgb(0 0 0 / 0.4);
240
+ }