@stratixlabs/core 1.7.1

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/src/base.css ADDED
@@ -0,0 +1,41 @@
1
+ body {
2
+ font-family: var(--font-family-base);
3
+ font-size: var(--font-size-md);
4
+ font-weight: var(--font-weight-regular);
5
+ line-height: var(--line-height-normal);
6
+ color: var(--neutral-900);
7
+ background-color: var(--neutral-0);
8
+ margin: 0;
9
+ }
10
+
11
+ /* ==============================
12
+ Typography
13
+ ============================== */
14
+
15
+ h1 {
16
+ font-size: var(--font-size-2xl);
17
+ font-weight: var(--font-weight-bold);
18
+ line-height: var(--line-height-tight);
19
+ margin-bottom: var(--space-3);
20
+ }
21
+
22
+ h2 {
23
+ font-size: var(--font-size-xl);
24
+ font-weight: var(--font-weight-semibold);
25
+ line-height: var(--line-height-normal);
26
+ margin-bottom: var(--space-3);
27
+ margin-top: 40px;
28
+ }
29
+
30
+ h3 {
31
+ font-size: var(--font-size-lg);
32
+ font-weight: var(--font-weight-semibold);
33
+ margin-bottom: var(--space-3);
34
+ margin-top: var(--space-6);
35
+ }
36
+
37
+ h4 {
38
+ font-size: var(--font-size-md);
39
+ font-weight: var(--font-weight-medium);
40
+ margin-bottom: var(--space-3);
41
+ }
@@ -0,0 +1,279 @@
1
+ /* Proofs of concept built directly on top of tokens. */
2
+
3
+
4
+ /* ==============================
5
+ Typography
6
+ ============================== */
7
+
8
+ .text-default {
9
+ font-size: var(--font-size-md);
10
+ color: var(--neutral-900);
11
+ }
12
+
13
+ .text-secondary {
14
+ font-size: var(--font-size-sm);
15
+ color: var(--neutral-600);
16
+ }
17
+
18
+ .text-small {
19
+ font-size: var(--font-size-xs);
20
+ color: var(--neutral-500);
21
+ }
22
+
23
+
24
+ /* ==============================
25
+ Card
26
+ ============================== */
27
+
28
+ .card {
29
+ background-color: var(--neutral-50);
30
+ border: var(--border-width) solid var(--border-color);
31
+ border-radius: var(--radius-lg);
32
+ padding: var(--space-4);
33
+ }
34
+
35
+ .card .banner {
36
+ width: 100%;
37
+ min-height: 100px;
38
+ border-radius: var(--radius-md);
39
+ background-color: var(--neutral-200);
40
+ }
41
+
42
+ .card .banner img {
43
+ width: 100%;
44
+ object-fit: cover;
45
+ }
46
+
47
+
48
+ /* ==============================
49
+ Users List
50
+ ============================== */
51
+
52
+ .users-list {
53
+ background-color: var(--neutral-50);
54
+ border: var(--border-width) solid var(--border-color);
55
+ border-radius: var(--radius-lg);
56
+ overflow: hidden;
57
+ }
58
+
59
+ .users-list-item {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: var(--space-4);
63
+ padding: var(--space-4);
64
+ }
65
+
66
+ .users-list-item+.users-list-item {
67
+ border-top: var(--border-width) solid var(--border-color);
68
+ }
69
+
70
+ .users-list-avatar {
71
+ width: 48px;
72
+ height: 48px;
73
+ background-color: var(--neutral-200);
74
+ border-radius: 50%;
75
+ }
76
+
77
+ .users-list-name {
78
+ font-weight: var(--font-weight-medium);
79
+ color: var(--neutral-900);
80
+ }
81
+
82
+ .users-list-bio {
83
+ font-size: var(--font-size-sm);
84
+ color: var(--neutral-600);
85
+ }
86
+
87
+
88
+ /* ==============================
89
+ Form
90
+ ============================== */
91
+
92
+ .form-group {
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: var(--space-2);
96
+ margin-bottom: var(--space-4);
97
+ font-size: var(--font-size-sm);
98
+ }
99
+
100
+ .form-label {
101
+ font-size: var(--font-size-sm);
102
+ font-weight: var(--font-weight-medium);
103
+ color: var(--neutral-700);
104
+ }
105
+
106
+ .form-input {
107
+ padding: var(--space-3);
108
+ font-size: var(--font-size-sm);
109
+ border-radius: var(--radius-md);
110
+ border: var(--border-width) solid var(--border-color);
111
+ font-family: var(--font-family-base);
112
+ }
113
+
114
+ .form-input:focus {
115
+ outline: none;
116
+ border-color: var(--brand-500);
117
+ }
118
+
119
+
120
+ /* Button */
121
+
122
+ .form-button {
123
+ align-self: flex-start;
124
+ padding: var(--space-3) var(--space-5);
125
+ font-size: var(--font-size-sm);
126
+ font-weight: var(--font-weight-medium);
127
+ color: var(--neutral-0);
128
+ background-color: var(--brand-500);
129
+ border: none;
130
+ border-radius: var(--radius-md);
131
+ cursor: pointer;
132
+ }
133
+
134
+ .form-button:hover {
135
+ background-color: var(--brand-700);
136
+ }
137
+
138
+
139
+ /* Options */
140
+
141
+ .form-options {
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: var(--space-2);
145
+ }
146
+
147
+ .form-option {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: var(--space-2);
151
+ font-size: var(--font-size-sm);
152
+ color: var(--neutral-700);
153
+ cursor: pointer;
154
+ }
155
+
156
+
157
+ /* Hide native */
158
+
159
+ .form-option input {
160
+ appearance: none;
161
+ width: 16px;
162
+ height: 16px;
163
+ border: var(--border-width) solid var(--border-color);
164
+ background: var(--neutral-0);
165
+ display: grid;
166
+ place-content: center;
167
+ }
168
+
169
+
170
+ /* Checkbox */
171
+
172
+ .form-option input[type="checkbox"] {
173
+ border-radius: var(--radius-sm);
174
+ }
175
+
176
+ .form-option input[type="checkbox"]::before {
177
+ content: "";
178
+ width: 10px;
179
+ height: 10px;
180
+ transform: scale(0);
181
+ background: var(--brand-500);
182
+ border-radius: 2px;
183
+ transition: transform 0.12s ease;
184
+ }
185
+
186
+ .form-option input[type="checkbox"]:checked::before {
187
+ transform: scale(1);
188
+ }
189
+
190
+
191
+ /* Radio */
192
+
193
+ .form-option input[type="radio"] {
194
+ border-radius: 50%;
195
+ }
196
+
197
+ .form-option input[type="radio"]::before {
198
+ content: "";
199
+ width: 8px;
200
+ height: 8px;
201
+ background: var(--brand-500);
202
+ border-radius: 50%;
203
+ transform: scale(0);
204
+ transition: transform 0.12s ease;
205
+ }
206
+
207
+ .form-option input[type="radio"]:checked::before {
208
+ transform: scale(1);
209
+ }
210
+
211
+
212
+ /* Focus */
213
+
214
+ .form-option input:focus-visible {
215
+ outline: 2px solid var(--brand-300);
216
+ outline-offset: 2px;
217
+ }
218
+
219
+
220
+ /* Select */
221
+
222
+ .form-select-wrapper {
223
+ position: relative;
224
+ display: flex;
225
+ }
226
+
227
+ .form-select {
228
+ width: 100%;
229
+ padding: var(--space-3);
230
+ padding-right: var(--space-6);
231
+ font-size: var(--font-size-sm);
232
+ font-family: var(--font-family-base);
233
+ color: var(--neutral-900);
234
+ background-color: var(--neutral-0);
235
+ border: var(--border-width) solid var(--border-color);
236
+ border-radius: var(--radius-md);
237
+ appearance: none;
238
+ cursor: pointer;
239
+ }
240
+
241
+ .form-select:focus {
242
+ outline: none;
243
+ border-color: var(--brand-500);
244
+ }
245
+
246
+ /* Chevron */
247
+ .form-select-wrapper::after {
248
+ content: "";
249
+ position: absolute;
250
+ right: var(--space-4);
251
+ top: 50%;
252
+ width: 8px;
253
+ height: 8px;
254
+ border-right: 2px solid var(--neutral-500);
255
+ border-bottom: 2px solid var(--neutral-500);
256
+ transform: translateY(-60%) rotate(45deg);
257
+ pointer-events: none;
258
+ }
259
+
260
+
261
+ /* Textarea */
262
+
263
+ .form-textarea {
264
+ width: 100%;
265
+ min-height: 96px;
266
+ padding: var(--space-2);
267
+ font-size: var(--font-size-sm);
268
+ border: var(--border-width) solid var(--border-color);
269
+ border-radius: var(--radius-md);
270
+ background: var(--neutral-0);
271
+ color: var(--neutral-900);
272
+ box-sizing: border-box;
273
+ resize: vertical;
274
+ }
275
+
276
+ .form-textarea:focus {
277
+ outline: none;
278
+ border-color: var(--brand-500);
279
+ }
@@ -0,0 +1,22 @@
1
+ /*
2
+ Plain CSS Consumption
3
+ Directly uses CSS Variables defined in Substrata.
4
+ */
5
+
6
+ .card {
7
+ padding: var(--space-4);
8
+ background: var(--color-surface);
9
+ color: var(--color-text-primary);
10
+ border-radius: var(--radius-md);
11
+ box-shadow: var(--shadow-sm);
12
+ }
13
+
14
+ .button {
15
+ padding: var(--space-2) var(--space-4);
16
+ background-color: var(--color-brand-primary);
17
+ color: var(--color-text-inverse);
18
+ font-family: var(--font-family-base);
19
+ font-weight: var(--font-weight-medium);
20
+ border: none;
21
+ border-radius: var(--radius-sm);
22
+ }
@@ -0,0 +1,30 @@
1
+ /*
2
+ Sass / SCSS Consumption
3
+ Preprocessors don't transform CSS variables, they just pass them through.
4
+ */
5
+
6
+ .card {
7
+ padding: var(--space-4);
8
+ background: var(--color-surface);
9
+ color: var(--color-text-primary);
10
+ border-radius: var(--radius-md);
11
+
12
+ // Nesting is handled by Sass
13
+ .card-header {
14
+ margin-bottom: var(--space-2);
15
+ font-size: var(--font-size-lg);
16
+ font-weight: var(--font-weight-bold);
17
+ }
18
+ }
19
+
20
+ @mixin button-styles {
21
+ padding: var(--space-2) var(--space-4);
22
+ border-radius: var(--radius-sm);
23
+ font-family: var(--font-family-base);
24
+ }
25
+
26
+ .button-primary {
27
+ @include button-styles;
28
+ background-color: var(--color-brand-primary);
29
+ color: var(--color-text-inverse);
30
+ }
@@ -0,0 +1,28 @@
1
+ /*
2
+ CSS-in-JS Consumption (styled-components / emotion)
3
+ Uses tokens as strings within template literals.
4
+ */
5
+
6
+ import styled from 'styled-components';
7
+
8
+ export const Card = styled.div`
9
+ padding: var(--space-4);
10
+ background: var(--color-surface);
11
+ color: var(--color-text-primary);
12
+ border-radius: var(--radius-md);
13
+ box-shadow: var(--shadow-sm);
14
+ `;
15
+
16
+ export const Button = styled.button`
17
+ padding: var(--space-2) var(--space-4);
18
+ background: var(--color-brand-primary);
19
+ color: var(--color-text-inverse);
20
+ font-family: var(--font-family-base);
21
+ border-radius: var(--radius-sm);
22
+ border: none;
23
+ cursor: pointer;
24
+
25
+ &:hover {
26
+ background: var(--color-brand-hover);
27
+ }
28
+ `;
@@ -0,0 +1,44 @@
1
+ /*
2
+ Tailwind CSS Consumption
3
+ Maps Substrata tokens to Tailwind theme configuration.
4
+ */
5
+
6
+ /** @type {import('tailwindcss').Config} */
7
+ module.exports = {
8
+ content: ["./src/**/*.{html,js}"],
9
+ theme: {
10
+ extend: {
11
+ colors: {
12
+ brand: {
13
+ 300: "var(--brand-300)",
14
+ 500: "var(--brand-500)",
15
+ 700: "var(--brand-700)",
16
+ },
17
+ neutral: {
18
+ 0: "var(--neutral-0)",
19
+ 900: "var(--neutral-900)",
20
+ },
21
+ surface: "var(--color-surface)",
22
+ text: "var(--color-text-primary)",
23
+ },
24
+ spacing: {
25
+ 1: "var(--space-1)",
26
+ 2: "var(--space-2)",
27
+ 3: "var(--space-3)",
28
+ 4: "var(--space-4)",
29
+ 5: "var(--space-5)",
30
+ 6: "var(--space-6)",
31
+ },
32
+ borderRadius: {
33
+ sm: "var(--radius-sm)",
34
+ md: "var(--radius-md)",
35
+ lg: "var(--radius-lg)",
36
+ },
37
+ fontFamily: {
38
+ body: "var(--font-family-base)",
39
+ heading: "var(--font-family-heading)",
40
+ },
41
+ },
42
+ },
43
+ plugins: [],
44
+ };
@@ -0,0 +1,28 @@
1
+ /*
2
+ vanilla-extract Consumption
3
+ Uses tokens as string values in type-safe style definitions.
4
+ */
5
+
6
+ import { style } from '@vanilla-extract/css';
7
+
8
+ export const card = style({
9
+ padding: 'var(--space-4)',
10
+ background: 'var(--color-surface)',
11
+ color: 'var(--color-text-primary)',
12
+ borderRadius: 'var(--radius-md)',
13
+ boxShadow: 'var(--shadow-sm)',
14
+ });
15
+
16
+ export const button = style({
17
+ padding: 'var(--space-2) var(--space-4)',
18
+ backgroundColor: 'var(--color-brand-primary)',
19
+ color: 'var(--color-text-inverse)',
20
+ fontFamily: 'var(--font-family-base)',
21
+ borderRadius: 'var(--radius-sm)',
22
+ border: 'none',
23
+ selectors: {
24
+ '&:hover': {
25
+ backgroundColor: 'var(--color-brand-hover)',
26
+ }
27
+ }
28
+ });
@@ -0,0 +1,11 @@
1
+ @import "tokens/typography.css";
2
+ @import "tokens/spacing.css";
3
+ @import "tokens/colors.css";
4
+ @import "tokens/radius-and-borders.css";
5
+ @import "tokens/elevation.css";
6
+ @import "tokens/motion.css";
7
+ @import "tokens/opacity.css";
8
+ @import "tokens/breakpoints.css";
9
+ @import "tokens/semantic-aliases.css";
10
+
11
+ @import "./base.css";
@@ -0,0 +1,7 @@
1
+ :root {
2
+
3
+ --breakpoint-lg: 1024px;
4
+ --breakpoint-md: 768px;
5
+ --breakpoint-sm: 640px;
6
+
7
+ }
@@ -0,0 +1,21 @@
1
+ :root {
2
+
3
+ --brand-300: #93c5fd;
4
+ --brand-500: #3b82f6;
5
+ --brand-700: #1d4ed8;
6
+ --color-danger: #ef4444;
7
+ --color-success: #22c55e;
8
+ --color-warning: #eab308;
9
+ --neutral-0: #ffffff;
10
+ --neutral-100: #f1f5f9;
11
+ --neutral-200: #e2e8f0;
12
+ --neutral-300: #cbd5e1;
13
+ --neutral-400: #94a3b8;
14
+ --neutral-50: #f8fafc;
15
+ --neutral-500: #64748b;
16
+ --neutral-600: #475569;
17
+ --neutral-700: #334155;
18
+ --neutral-800: #1e293b;
19
+ --neutral-900: #0f172a;
20
+
21
+ }
@@ -0,0 +1,7 @@
1
+ :root {
2
+
3
+ --shadow-lg: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.2);
4
+ --shadow-md: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
5
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
6
+
7
+ }
@@ -0,0 +1,7 @@
1
+ :root {
2
+
3
+ --motion-fast: 200ms;
4
+ --motion-normal: 300ms;
5
+ --motion-slow: 400ms;
6
+
7
+ }
@@ -0,0 +1,7 @@
1
+ :root {
2
+
3
+ --opacity-disabled: 0.4;
4
+ --opacity-muted: 0.6;
5
+ --opacity-overlay: 0.9;
6
+
7
+ }
@@ -0,0 +1,9 @@
1
+ :root {
2
+
3
+ --border-color: var(--neutral-200);
4
+ --border-width: 1px;
5
+ --radius-lg: 0.75rem;
6
+ --radius-md: 0.5rem;
7
+ --radius-sm: 0.375rem;
8
+
9
+ }
@@ -0,0 +1,12 @@
1
+ :root {
2
+
3
+ --color-bg: var(--neutral-50);
4
+ --color-border: var(--neutral-200);
5
+ --color-brand-hover: var(--brand-700);
6
+ --color-brand-primary: var(--brand-500);
7
+ --color-surface: var(--neutral-50);
8
+ --color-text-inverse: var(--neutral-0);
9
+ --color-text-primary: var(--neutral-900);
10
+ --color-text-secondary: var(--neutral-700);
11
+
12
+ }
@@ -0,0 +1,10 @@
1
+ :root {
2
+
3
+ --space-1: 0.25rem;
4
+ --space-2: 0.5rem;
5
+ --space-3: 0.75rem;
6
+ --space-4: 1rem;
7
+ --space-5: 1.5rem;
8
+ --space-6: 2rem;
9
+
10
+ }
@@ -0,0 +1,18 @@
1
+ :root {
2
+
3
+ --font-family-base: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
4
+ --font-size-2xl: 2rem;
5
+ --font-size-lg: 1.25rem;
6
+ --font-size-md: 1rem;
7
+ --font-size-sm: 0.875rem;
8
+ --font-size-xl: 1.5rem;
9
+ --font-size-xs: 0.75rem;
10
+ --font-weight-bold: 700;
11
+ --font-weight-medium: 500;
12
+ --font-weight-regular: 400;
13
+ --font-weight-semibold: 600;
14
+ --line-height-normal: 1.5;
15
+ --line-height-relaxed: 1.75;
16
+ --line-height-tight: 1.25;
17
+
18
+ }
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ tokens: './src/tokens',
3
+ output: './tokens.json'
4
+ };