@tapizlabs/ui 0.2.1 → 0.2.4

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/dist/theme.css CHANGED
@@ -1,418 +1,425 @@
1
- /* stylelint-disable */
2
- @theme {
3
- /* Core ink ramp kept for backwards compatibility with existing Tailwind classes. */
4
- --color-ink-000: #050608;
5
- --color-ink-100: #06080c;
6
- --color-ink-200: #0c0f16;
7
- --color-ink-300: #11151e;
8
- --color-ink-400: #1d222d;
9
- --color-ink-500: #262d3b;
10
- --color-border: #1d2330;
11
- --color-border-hi: #2a3346;
12
- --color-txt-1: #f1f4f9;
13
- --color-txt-2: #aab3c2;
14
- --color-txt-3: #7f8a9b;
15
- --color-txt-4: #667185;
16
-
17
- --color-primary-50: #e8fbff;
18
- --color-primary-100: #c7f5ff;
19
- --color-primary-200: #99eeff;
20
- --color-primary-300: #5ee7ff;
21
- --color-primary-400: #38d4f0;
22
- --color-primary-500: #1eb5d4;
23
- --color-primary-600: #1496b3;
24
- --color-primary-700: #0e7088;
25
- --color-primary-800: #0a4f60;
26
- --color-primary-900: #062f3b;
27
- --color-primary-950: #03161c;
28
-
29
- --color-signal-300: #e4ff66;
30
- --color-signal-400: #d4ff3a;
31
- --color-signal-500: #b8e620;
32
-
33
- --color-warn: #ff7a4d;
34
- --color-good: #4dd6a3;
35
-
36
- --font-display: 'IBM Plex Sans', system-ui, sans-serif;
37
- --font-body: 'IBM Plex Sans', system-ui, sans-serif;
38
- --font-mono: 'IBM Plex Mono', ui-monospace, monospace;
39
-
40
- --radius-none: 0;
41
- --radius-sm: 0;
42
- --radius-md: 0;
43
- --radius-lg: 0;
44
- --radius-xl: 0;
45
- --radius-2xl: 0;
46
- --radius-full: 9999px;
47
-
48
- --animate-fade-in-up: fade-in-up 0.5s ease both;
49
- --animate-fade-in-down: fade-in-down 0.4s ease both;
50
- --animate-fade-in: fade-in 0.3s ease both;
51
- --animate-fade-out: fade-out 0.25s ease both;
52
- --animate-count-up: count-up 0.5s ease both;
53
- --animate-slide-in-right: slide-in-right 0.35s ease both;
54
- --animate-slide-in-left: slide-in-left 0.35s ease both;
55
- --animate-scale-in: scale-in 0.3s cubic-bezier(0.34,1.56,0.64,1) both;
56
- --animate-progress-fill: progress-fill 1s ease both;
57
- --animate-pulse-soft: pulse-soft 2s ease-in-out infinite;
58
- --animate-shake: shake 0.4s ease both;
59
- --animate-bounce-in: bounce-in 0.5s cubic-bezier(0.34,1.56,0.64,1) both;
60
- --animate-flip-in: flip-in 0.4s ease both;
61
- --animate-blur-in: blur-in 0.35s ease both;
62
- --animate-slide-up-fade: slide-up-fade 0.3s ease both;
63
-
64
- @keyframes fade-in-up { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:translateY(0); } }
65
- @keyframes fade-in-down { from { opacity:0; transform:translateY(-12px); } to { opacity:1; transform:translateY(0); } }
66
- @keyframes fade-in { from { opacity:0; } to { opacity:1; } }
67
- @keyframes fade-out { from { opacity:1; } to { opacity:0; } }
68
- @keyframes count-up { from { opacity:0; transform:scale(0.85); } to { opacity:1; transform:scale(1); } }
69
- @keyframes slide-in-right { from { opacity:0; transform:translateX(20px); } to { opacity:1; transform:translateX(0); } }
70
- @keyframes slide-in-left { from { opacity:0; transform:translateX(-20px); } to { opacity:1; transform:translateX(0); } }
71
- @keyframes scale-in { from { opacity:0; transform:scale(0.88); } to { opacity:1; transform:scale(1); } }
72
- @keyframes progress-fill { from { width: 0%; } }
73
- @keyframes pulse-soft { 0%,100% { opacity:1; } 50% { opacity:0.6; } }
74
- @keyframes shake { 0%,100% { transform:translateX(0); } 20% { transform:translateX(-6px); } 40% { transform:translateX(6px); } 60% { transform:translateX(-4px); } 80% { transform:translateX(4px); } }
75
- @keyframes bounce-in { from { opacity:0; transform:scale(0.7); } to { opacity:1; transform:scale(1); } }
76
- @keyframes flip-in { from { opacity:0; transform:rotateX(-30deg) translateY(8px); } to { opacity:1; transform:rotateX(0deg) translateY(0); } }
77
- @keyframes blur-in { from { opacity:0; filter:blur(6px); transform:scale(0.97); } to { opacity:1; filter:blur(0px); transform:scale(1); } }
78
- @keyframes slide-up-fade { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }
79
- @keyframes skeleton-shimmer { 0% { background-position:-400px 0; } 100% { background-position:400px 0; } }
80
- }
81
-
82
- :root {
83
- color-scheme: dark;
84
-
85
- /* Semantic design tokens: use these in new components and app code. */
86
- --tapiz-bg-canvas: var(--color-ink-100);
87
- --tapiz-bg-page: var(--color-ink-100);
88
- --tapiz-bg-surface: var(--color-ink-200);
89
- --tapiz-bg-surface-muted: var(--color-ink-300);
90
- --tapiz-bg-surface-raised: #10151f;
91
- --tapiz-bg-surface-inverse: #f8fafc;
92
- --tapiz-bg-overlay: rgba(5, 6, 8, 0.74);
93
-
94
- --tapiz-border-subtle: var(--color-border);
95
- --tapiz-border-strong: var(--color-border-hi);
96
- --tapiz-border-focus: var(--color-primary-300);
97
-
98
- --tapiz-text-primary: var(--color-txt-1);
99
- --tapiz-text-secondary: var(--color-txt-2);
100
- --tapiz-text-muted: var(--color-txt-3);
101
- --tapiz-text-disabled: var(--color-txt-4);
102
- --tapiz-text-inverse: #050608;
103
-
104
- --tapiz-accent: var(--color-primary-300);
105
- --tapiz-accent-hover: var(--color-primary-400);
106
- --tapiz-accent-soft: color-mix(in srgb, var(--color-primary-300) 12%, transparent);
107
- --tapiz-accent-contrast: #000000;
108
- --tapiz-signal: var(--color-signal-400);
109
- --tapiz-signal-soft: color-mix(in srgb, var(--color-signal-400) 14%, transparent);
110
-
111
- --tapiz-success: var(--color-good);
112
- --tapiz-success-soft: color-mix(in srgb, var(--color-good) 12%, transparent);
113
- --tapiz-warning: #ffb020;
114
- --tapiz-warning-soft: rgba(255, 176, 32, 0.12);
115
- --tapiz-danger: var(--color-warn);
116
- --tapiz-danger-soft: rgba(255, 122, 77, 0.12);
117
- --tapiz-info: var(--color-primary-300);
118
- --tapiz-info-soft: color-mix(in srgb, var(--color-primary-300) 12%, transparent);
119
-
120
- --tapiz-shadow-sm: 0 1px 0 rgba(255,255,255,0.04);
121
- --tapiz-shadow-md: 0 16px 44px rgba(0,0,0,0.24);
122
- --tapiz-shadow-lg: 0 28px 80px rgba(0,0,0,0.34);
123
- --tapiz-shadow-brutal: 4px 4px 0 var(--tapiz-border-strong);
124
- --tapiz-shadow-brutal-lg: 8px 8px 0 var(--tapiz-border-strong);
125
-
126
- --tapiz-brutal-border: 2px solid var(--tapiz-border-strong);
127
- --tapiz-brutal-shadow: var(--tapiz-shadow-brutal);
128
- --tapiz-brutal-shadow-lg: var(--tapiz-shadow-brutal-lg);
129
-
130
- --tapiz-space-page-x: clamp(1rem, 2vw, 2rem);
131
- --tapiz-space-section-y: clamp(3rem, 7vw, 6rem);
132
- --tapiz-motion-fast: 120ms ease;
133
- --tapiz-motion-base: 180ms ease;
134
- --tapiz-motion-spring: 240ms cubic-bezier(.2, .8, .2, 1);
135
-
136
- --tapiz-surface-grid:
137
- linear-gradient(var(--tapiz-border-subtle) 1px, transparent 1px),
138
- linear-gradient(90deg, var(--tapiz-border-subtle) 1px, transparent 1px);
139
- --tapiz-surface-noise:
140
- radial-gradient(circle at 20% 20%, color-mix(in srgb, var(--tapiz-accent) 14%, transparent), transparent 28rem),
141
- radial-gradient(circle at 80% 0%, color-mix(in srgb, var(--tapiz-signal) 10%, transparent), transparent 24rem);
142
-
143
- --color-icon-bg: var(--color-primary-950);
144
- --btn-primary-color: var(--tapiz-accent-contrast);
145
- }
146
-
147
- html:not(.dark) {
148
- color-scheme: light;
149
-
150
- --color-ink-000: #ffffff;
151
- --color-ink-100: #f7f8fb;
152
- --color-ink-200: #ffffff;
153
- --color-ink-300: #eef1f6;
154
- --color-ink-400: #d9dee8;
155
- --color-ink-500: #bcc5d3;
156
- --color-border: #d7dce6;
157
- --color-border-hi: #aeb7c8;
158
- --color-txt-1: #0b1020;
159
- --color-txt-2: #263145;
160
- --color-txt-3: #566276;
161
- --color-txt-4: #7a8496;
162
-
163
- --color-primary-300: #087d9c;
164
- --color-primary-400: #066d89;
165
- --color-primary-500: #075e75;
166
- --color-signal-300: #6f950b;
167
- --color-signal-400: #53720b;
168
- --color-signal-500: #3f5a08;
169
- --color-warn: #c4481f;
170
- --color-good: #047857;
171
-
172
- --tapiz-bg-canvas: #f7f8fb;
173
- --tapiz-bg-page: #f7f8fb;
174
- --tapiz-bg-surface: #ffffff;
175
- --tapiz-bg-surface-muted: #eef1f6;
176
- --tapiz-bg-surface-raised: #ffffff;
177
- --tapiz-bg-surface-inverse: #050608;
178
- --tapiz-bg-overlay: rgba(11, 16, 32, 0.45);
179
-
180
- --tapiz-border-subtle: #d7dce6;
181
- --tapiz-border-strong: #0b1020;
182
- --tapiz-border-focus: var(--color-primary-300);
183
-
184
- --tapiz-text-primary: #0b1020;
185
- --tapiz-text-secondary: #263145;
186
- --tapiz-text-muted: #566276;
187
- --tapiz-text-disabled: #7a8496;
188
- --tapiz-text-inverse: #ffffff;
189
-
190
- --tapiz-accent: var(--color-primary-300);
191
- --tapiz-accent-hover: var(--color-primary-400);
192
- --tapiz-accent-soft: color-mix(in srgb, var(--color-primary-300) 10%, transparent);
193
- --tapiz-accent-contrast: #ffffff;
194
- --tapiz-signal: var(--color-signal-400);
195
- --tapiz-signal-soft: color-mix(in srgb, var(--color-signal-400) 12%, transparent);
196
-
197
- --tapiz-success: var(--color-good);
198
- --tapiz-success-soft: rgba(4, 120, 87, 0.10);
199
- --tapiz-warning: #b45309;
200
- --tapiz-warning-soft: rgba(180, 83, 9, 0.10);
201
- --tapiz-danger: var(--color-warn);
202
- --tapiz-danger-soft: rgba(196, 72, 31, 0.10);
203
- --tapiz-info: var(--color-primary-300);
204
- --tapiz-info-soft: color-mix(in srgb, var(--color-primary-300) 10%, transparent);
205
-
206
- --tapiz-shadow-sm: 0 1px 0 rgba(11,16,32,0.08);
207
- --tapiz-shadow-md: 0 18px 42px rgba(11,16,32,0.08);
208
- --tapiz-shadow-lg: 0 26px 80px rgba(11,16,32,0.12);
209
- --tapiz-shadow-brutal: 4px 4px 0 #0b1020;
210
- --tapiz-shadow-brutal-lg: 8px 8px 0 #0b1020;
211
- --tapiz-brutal-border: 2px solid #0b1020;
212
-
213
- --color-icon-bg: color-mix(in srgb, var(--color-primary-300) 12%, var(--color-ink-200));
214
- --btn-primary-color: var(--tapiz-accent-contrast);
215
- }
216
-
217
- @layer base {
218
- *, ::after, ::before, ::backdrop, ::file-selector-button {
219
- border-color: var(--tapiz-border-subtle, currentcolor);
220
- border-radius: 0 !important;
221
- }
222
-
223
- html, body {
224
- background: var(--tapiz-bg-page);
225
- color: var(--tapiz-text-primary);
226
- font-family: var(--font-body);
227
- letter-spacing: 0;
228
- -webkit-font-smoothing: antialiased;
229
- }
230
-
231
- h1, h2, h3, h4 {
232
- font-family: var(--font-display);
233
- font-weight: 600;
234
- letter-spacing: -0.03em;
235
- }
236
-
237
- [class*="rounded"] { border-radius: 0 !important; }
238
-
239
- html *:not([class*="animate-"]):not(.sliding-logo):not(.pulse-line) {
240
- transition:
241
- background-color var(--tapiz-motion-base),
242
- border-color var(--tapiz-motion-base),
243
- color var(--tapiz-motion-fast),
244
- box-shadow var(--tapiz-motion-base),
245
- transform var(--tapiz-motion-base);
246
- }
247
-
248
- input, textarea, select {
249
- background-color: var(--tapiz-bg-surface) !important;
250
- border-color: var(--tapiz-border-strong) !important;
251
- color: var(--tapiz-text-primary) !important;
252
- }
253
- input::placeholder, textarea::placeholder { color: var(--tapiz-text-disabled) !important; }
254
- input:focus, textarea:focus, select:focus {
255
- border-color: var(--tapiz-border-focus) !important;
256
- box-shadow: inset 3px 0 0 0 var(--tapiz-signal), 0 0 0 1px var(--tapiz-border-focus) !important;
257
- outline: none !important;
258
- }
259
-
260
- table { color: var(--tapiz-text-secondary) !important; }
261
- thead, thead tr { background-color: var(--tapiz-bg-surface-muted) !important; }
262
- thead th {
263
- background-color: var(--tapiz-bg-surface-muted) !important;
264
- color: var(--tapiz-text-muted) !important;
265
- border-color: var(--tapiz-border-subtle) !important;
266
- font-family: var(--font-mono);
267
- font-size: 10px;
268
- letter-spacing: 0.18em;
269
- text-transform: uppercase;
270
- font-weight: 600;
271
- }
272
- tbody tr { background-color: var(--tapiz-bg-surface) !important; border-color: var(--tapiz-border-subtle) !important; }
273
- tbody tr:nth-child(even) { background-color: color-mix(in srgb, var(--tapiz-bg-surface-muted) 36%, var(--tapiz-bg-surface)) !important; }
274
- tbody tr:hover { background-color: var(--tapiz-bg-surface-muted) !important; }
275
- tbody td, tbody th { color: var(--tapiz-text-secondary) !important; border-color: var(--tapiz-border-subtle) !important; }
276
-
277
- .bg-white { background-color: var(--tapiz-bg-surface) !important; }
278
- .bg-gray-50 { background-color: var(--tapiz-bg-page) !important; }
279
- .bg-gray-100 { background-color: var(--tapiz-bg-surface-muted) !important; }
280
- .bg-gray-200 { background-color: var(--color-ink-400) !important; }
281
- .border-gray-100, .border-gray-200, .border-gray-300 { border-color: var(--tapiz-border-subtle) !important; }
282
- hr { border-color: var(--tapiz-border-subtle) !important; }
283
- .text-gray-900, .text-gray-800 { color: var(--tapiz-text-primary) !important; }
284
- .text-gray-700, .text-gray-600 { color: var(--tapiz-text-secondary) !important; }
285
- .text-gray-500, .text-gray-400 { color: var(--tapiz-text-muted) !important; }
286
- .text-gray-300 { color: var(--tapiz-text-disabled) !important; }
287
-
288
- .card, .stat-card {
289
- background-color: var(--tapiz-bg-surface) !important;
290
- border-color: var(--tapiz-border-subtle) !important;
291
- }
292
- }
293
-
294
- .kicker {
295
- font-family: var(--font-mono);
296
- font-size: 10px;
297
- letter-spacing: 0.18em;
298
- text-transform: uppercase;
299
- font-weight: 700;
300
- color: var(--tapiz-accent);
301
- }
302
-
303
- .font-mono { font-family: var(--font-mono) !important; }
304
- .font-display { font-family: var(--font-display) !important; }
305
-
306
- .grid-bg, .tapiz-grid-bg {
307
- background-image: var(--tapiz-surface-grid);
308
- background-size: 24px 24px;
309
- background-position: -1px -1px;
310
- }
311
-
312
- .tapiz-noise-bg { background-image: var(--tapiz-surface-noise); }
313
- .tapiz-enterprise-shell { background: var(--tapiz-bg-page); color: var(--tapiz-text-primary); }
314
- .tapiz-focus-ring:focus-visible { outline: 2px solid var(--tapiz-border-focus); outline-offset: 2px; }
315
-
316
- @utility btn-primary {
317
- display: inline-flex;
318
- align-items: center;
319
- justify-content: center;
320
- padding: 0.5rem 1rem;
321
- background: var(--tapiz-accent);
322
- color: var(--btn-primary-color);
323
- font-family: var(--font-display);
324
- font-size: 0.875rem;
325
- font-weight: 700;
326
- border: 1px solid var(--tapiz-border-strong);
327
- box-shadow: var(--tapiz-brutal-shadow);
328
- cursor: pointer;
329
- &:hover { transform: translate(-1px,-1px); box-shadow: var(--tapiz-brutal-shadow-lg); }
330
- &:active { transform: translate(1px,1px); box-shadow: 2px 2px 0 var(--tapiz-border-strong); }
331
- &:disabled { opacity: 0.4; cursor: not-allowed; transform: none; box-shadow: none; }
332
- }
333
-
334
- @utility btn-secondary {
335
- display: inline-flex;
336
- align-items: center;
337
- justify-content: center;
338
- padding: 0.5rem 1rem;
339
- background: var(--tapiz-bg-surface);
340
- color: var(--tapiz-text-secondary);
341
- font-family: var(--font-mono);
342
- font-size: 0.875rem;
343
- font-weight: 600;
344
- border: 1px solid var(--tapiz-border-strong);
345
- cursor: pointer;
346
- &:hover { color: var(--tapiz-text-primary); border-color: var(--tapiz-accent); }
347
- &:active { background: var(--tapiz-bg-surface-muted); }
348
- &:disabled { opacity: 0.4; cursor: not-allowed; }
349
- }
350
-
351
- @utility btn-danger {
352
- display: inline-flex;
353
- align-items: center;
354
- justify-content: center;
355
- background: transparent;
356
- color: var(--tapiz-danger);
357
- font-family: var(--font-mono);
358
- border: 1px solid var(--tapiz-danger);
359
- cursor: pointer;
360
- &:hover { background: var(--tapiz-danger-soft); }
361
- }
362
-
363
- @utility input-field {
364
- display: block;
365
- width: 100%;
366
- padding: 0.625rem 0.875rem;
367
- background: var(--tapiz-bg-surface);
368
- border: 1px solid var(--tapiz-border-strong);
369
- font-size: 0.875rem;
370
- color: var(--tapiz-text-primary);
371
- outline: none;
372
- &::placeholder { color: var(--tapiz-text-disabled); }
373
- &:focus { border-color: var(--tapiz-border-focus); box-shadow: inset 3px 0 0 0 var(--tapiz-signal); }
374
- }
375
-
376
- @utility skeleton {
377
- background: linear-gradient(90deg, var(--color-ink-300) 25%, var(--color-ink-400) 50%, var(--color-ink-300) 75%);
378
- background-size: 800px 100%;
379
- animation: skeleton-shimmer 1.5s infinite linear;
380
- }
381
-
382
- @utility card {
383
- background: var(--tapiz-bg-surface);
384
- border: 1px solid var(--tapiz-border-subtle);
385
- box-shadow: var(--tapiz-shadow-sm);
386
- padding: 1.25rem;
387
- }
388
-
389
- @utility form-panel {
390
- background: var(--tapiz-bg-surface);
391
- border: 1px solid var(--tapiz-border-strong);
392
- border-top: 2px solid var(--tapiz-accent);
393
- box-shadow: var(--tapiz-shadow-sm);
394
- padding: 1.25rem;
395
- }
396
-
397
- @utility stat-card {
398
- background: var(--tapiz-bg-surface);
399
- border: 1px solid var(--tapiz-border-subtle);
400
- box-shadow: var(--tapiz-shadow-sm);
401
- padding: 1rem;
402
- }
403
-
404
- @utility card-hover {
405
- &:hover { border-color: var(--tapiz-border-strong); box-shadow: var(--tapiz-shadow-md); transform: translateY(-1px); }
406
- }
407
-
408
- @utility tapiz-brutal-card {
409
- background: var(--tapiz-bg-surface);
410
- border: var(--tapiz-brutal-border);
411
- box-shadow: var(--tapiz-brutal-shadow);
412
- }
413
-
414
- @utility tapiz-enterprise-card {
415
- background: var(--tapiz-bg-surface);
416
- border: 1px solid var(--tapiz-border-subtle);
417
- box-shadow: var(--tapiz-shadow-md);
418
- }
1
+ /* stylelint-disable */
2
+ @theme {
3
+ /* Core ink ramp kept for backwards compatibility with existing Tailwind classes. */
4
+ --color-ink-000: #050608;
5
+ --color-ink-100: #06080c;
6
+ --color-ink-200: #0c0f16;
7
+ --color-ink-300: #11151e;
8
+ --color-ink-400: #1d222d;
9
+ --color-ink-500: #262d3b;
10
+ --color-border: #1d2330;
11
+ --color-border-hi: #2a3346;
12
+ --color-txt-1: #f1f4f9;
13
+ --color-txt-2: #aab3c2;
14
+ --color-txt-3: #7f8a9b;
15
+ --color-txt-4: #667185;
16
+
17
+ --color-primary-50: #e8fbff;
18
+ --color-primary-100: #c7f5ff;
19
+ --color-primary-200: #99eeff;
20
+ --color-primary-300: #5ee7ff;
21
+ --color-primary-400: #38d4f0;
22
+ --color-primary-500: #1eb5d4;
23
+ --color-primary-600: #1496b3;
24
+ --color-primary-700: #0e7088;
25
+ --color-primary-800: #0a4f60;
26
+ --color-primary-900: #062f3b;
27
+ --color-primary-950: #03161c;
28
+
29
+ --color-signal-300: #e4ff66;
30
+ --color-signal-400: #d4ff3a;
31
+ --color-signal-500: #b8e620;
32
+
33
+ --color-warn: #ff7a4d;
34
+ --color-good: #4dd6a3;
35
+
36
+ --font-display: 'IBM Plex Sans', system-ui, sans-serif;
37
+ --font-body: 'IBM Plex Sans', system-ui, sans-serif;
38
+ --font-mono: 'IBM Plex Mono', ui-monospace, monospace;
39
+
40
+ --radius-none: 0;
41
+ --radius-sm: 0;
42
+ --radius-md: 0;
43
+ --radius-lg: 0;
44
+ --radius-xl: 0;
45
+ --radius-2xl: 0;
46
+ --radius-full: 9999px;
47
+
48
+ --animate-fade-in-up: fade-in-up 0.5s ease both;
49
+ --animate-fade-in-down: fade-in-down 0.4s ease both;
50
+ --animate-fade-in: fade-in 0.3s ease both;
51
+ --animate-fade-out: fade-out 0.25s ease both;
52
+ --animate-count-up: count-up 0.5s ease both;
53
+ --animate-slide-in-right: slide-in-right 0.35s ease both;
54
+ --animate-slide-in-left: slide-in-left 0.35s ease both;
55
+ --animate-scale-in: scale-in 0.3s cubic-bezier(0.34,1.56,0.64,1) both;
56
+ --animate-progress-fill: progress-fill 1s ease both;
57
+ --animate-pulse-soft: pulse-soft 2s ease-in-out infinite;
58
+ --animate-shake: shake 0.4s ease both;
59
+ --animate-bounce-in: bounce-in 0.5s cubic-bezier(0.34,1.56,0.64,1) both;
60
+ --animate-flip-in: flip-in 0.4s ease both;
61
+ --animate-blur-in: blur-in 0.35s ease both;
62
+ --animate-slide-up-fade: slide-up-fade 0.3s ease both;
63
+
64
+ @keyframes fade-in-up { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:translateY(0); } }
65
+ @keyframes fade-in-down { from { opacity:0; transform:translateY(-12px); } to { opacity:1; transform:translateY(0); } }
66
+ @keyframes fade-in { from { opacity:0; } to { opacity:1; } }
67
+ @keyframes fade-out { from { opacity:1; } to { opacity:0; } }
68
+ @keyframes count-up { from { opacity:0; transform:scale(0.85); } to { opacity:1; transform:scale(1); } }
69
+ @keyframes slide-in-right { from { opacity:0; transform:translateX(20px); } to { opacity:1; transform:translateX(0); } }
70
+ @keyframes slide-in-left { from { opacity:0; transform:translateX(-20px); } to { opacity:1; transform:translateX(0); } }
71
+ @keyframes scale-in { from { opacity:0; transform:scale(0.88); } to { opacity:1; transform:scale(1); } }
72
+ @keyframes progress-fill { from { width: 0%; } }
73
+ @keyframes pulse-soft { 0%,100% { opacity:1; } 50% { opacity:0.6; } }
74
+ @keyframes shake { 0%,100% { transform:translateX(0); } 20% { transform:translateX(-6px); } 40% { transform:translateX(6px); } 60% { transform:translateX(-4px); } 80% { transform:translateX(4px); } }
75
+ @keyframes bounce-in { from { opacity:0; transform:scale(0.7); } to { opacity:1; transform:scale(1); } }
76
+ @keyframes flip-in { from { opacity:0; transform:rotateX(-30deg) translateY(8px); } to { opacity:1; transform:rotateX(0deg) translateY(0); } }
77
+ @keyframes blur-in { from { opacity:0; filter:blur(6px); transform:scale(0.97); } to { opacity:1; filter:blur(0px); transform:scale(1); } }
78
+ @keyframes slide-up-fade { from { opacity:0; transform:translateY(6px); } to { opacity:1; transform:translateY(0); } }
79
+ @keyframes skeleton-shimmer { 0% { background-position:-400px 0; } 100% { background-position:400px 0; } }
80
+ }
81
+
82
+ :root {
83
+ color-scheme: dark;
84
+
85
+ /* Semantic design tokens: use these in new components and app code. */
86
+ --tapiz-bg-canvas: var(--color-ink-100);
87
+ --tapiz-bg-page: var(--color-ink-100);
88
+ --tapiz-bg-surface: var(--color-ink-200);
89
+ --tapiz-bg-surface-muted: var(--color-ink-300);
90
+ --tapiz-bg-surface-raised: #10151f;
91
+ --tapiz-bg-surface-inverse: #f8fafc;
92
+ --tapiz-bg-overlay: rgba(5, 6, 8, 0.74);
93
+
94
+ --tapiz-border-subtle: var(--color-border);
95
+ --tapiz-border-strong: var(--color-border-hi);
96
+ --tapiz-border-focus: var(--color-primary-300);
97
+
98
+ --tapiz-text-primary: var(--color-txt-1);
99
+ --tapiz-text-secondary: var(--color-txt-2);
100
+ --tapiz-text-muted: var(--color-txt-3);
101
+ --tapiz-text-disabled: var(--color-txt-4);
102
+ --tapiz-text-inverse: #050608;
103
+
104
+ --tapiz-accent: var(--color-primary-300);
105
+ --tapiz-accent-hover: var(--color-primary-400);
106
+ --tapiz-accent-soft: color-mix(in srgb, var(--color-primary-300) 12%, transparent);
107
+ --tapiz-accent-contrast: #000000;
108
+ --tapiz-signal: var(--color-signal-400);
109
+ --tapiz-signal-soft: color-mix(in srgb, var(--color-signal-400) 14%, transparent);
110
+
111
+ --tapiz-success: var(--color-good);
112
+ --tapiz-success-soft: color-mix(in srgb, var(--color-good) 12%, transparent);
113
+ --tapiz-warning: #ffb020;
114
+ --tapiz-warning-soft: rgba(255, 176, 32, 0.12);
115
+ --tapiz-danger: var(--color-warn);
116
+ --tapiz-danger-soft: rgba(255, 122, 77, 0.12);
117
+ --tapiz-info: var(--color-primary-300);
118
+ --tapiz-info-soft: color-mix(in srgb, var(--color-primary-300) 12%, transparent);
119
+
120
+ --tapiz-shadow-sm: 0 1px 0 rgba(255,255,255,0.04);
121
+ --tapiz-shadow-md: 0 16px 44px rgba(0,0,0,0.24);
122
+ --tapiz-shadow-lg: 0 28px 80px rgba(0,0,0,0.34);
123
+ --tapiz-shadow-brutal: 4px 4px 0 var(--tapiz-border-strong);
124
+ --tapiz-shadow-brutal-lg: 8px 8px 0 var(--tapiz-border-strong);
125
+
126
+ --tapiz-brutal-border: 2px solid var(--tapiz-border-strong);
127
+ --tapiz-brutal-shadow: var(--tapiz-shadow-brutal);
128
+ --tapiz-brutal-shadow-lg: var(--tapiz-shadow-brutal-lg);
129
+
130
+ --tapiz-space-page-x: clamp(1rem, 2vw, 2rem);
131
+ --tapiz-space-section-y: clamp(3rem, 7vw, 6rem);
132
+ --tapiz-motion-fast: 120ms ease;
133
+ --tapiz-motion-base: 180ms ease;
134
+ --tapiz-motion-spring: 240ms cubic-bezier(.2, .8, .2, 1);
135
+
136
+ --tapiz-surface-grid:
137
+ linear-gradient(var(--tapiz-border-subtle) 1px, transparent 1px),
138
+ linear-gradient(90deg, var(--tapiz-border-subtle) 1px, transparent 1px);
139
+ --tapiz-surface-noise:
140
+ radial-gradient(circle at 20% 20%, color-mix(in srgb, var(--tapiz-accent) 14%, transparent), transparent 28rem),
141
+ radial-gradient(circle at 80% 0%, color-mix(in srgb, var(--tapiz-signal) 10%, transparent), transparent 24rem);
142
+
143
+ --color-icon-bg: var(--color-primary-950);
144
+ --btn-primary-color: var(--tapiz-accent-contrast);
145
+ }
146
+
147
+ html:not(.dark) {
148
+ color-scheme: light;
149
+
150
+ --color-ink-000: #ffffff;
151
+ --color-ink-100: #f7f8fb;
152
+ --color-ink-200: #ffffff;
153
+ --color-ink-300: #eef1f6;
154
+ --color-ink-400: #d9dee8;
155
+ --color-ink-500: #bcc5d3;
156
+ --color-border: #d7dce6;
157
+ --color-border-hi: #aeb7c8;
158
+ --color-txt-1: #0b1020;
159
+ --color-txt-2: #263145;
160
+ --color-txt-3: #566276;
161
+ --color-txt-4: #7a8496;
162
+
163
+ --color-primary-300: #087d9c;
164
+ --color-primary-400: #066d89;
165
+ --color-primary-500: #075e75;
166
+ --color-signal-300: #6f950b;
167
+ --color-signal-400: #53720b;
168
+ --color-signal-500: #3f5a08;
169
+ --color-warn: #c4481f;
170
+ --color-good: #047857;
171
+
172
+ --tapiz-bg-canvas: #f7f8fb;
173
+ --tapiz-bg-page: #f7f8fb;
174
+ --tapiz-bg-surface: #ffffff;
175
+ --tapiz-bg-surface-muted: #eef1f6;
176
+ --tapiz-bg-surface-raised: #ffffff;
177
+ --tapiz-bg-surface-inverse: #050608;
178
+ --tapiz-bg-overlay: rgba(11, 16, 32, 0.45);
179
+
180
+ --tapiz-border-subtle: #d7dce6;
181
+ --tapiz-border-strong: #0b1020;
182
+ --tapiz-border-focus: var(--color-primary-300);
183
+
184
+ --tapiz-text-primary: #0b1020;
185
+ --tapiz-text-secondary: #263145;
186
+ --tapiz-text-muted: #566276;
187
+ --tapiz-text-disabled: #7a8496;
188
+ --tapiz-text-inverse: #ffffff;
189
+
190
+ --tapiz-accent: var(--color-primary-300);
191
+ --tapiz-accent-hover: var(--color-primary-400);
192
+ --tapiz-accent-soft: color-mix(in srgb, var(--color-primary-300) 10%, transparent);
193
+ --tapiz-accent-contrast: #ffffff;
194
+ --tapiz-signal: var(--color-signal-400);
195
+ --tapiz-signal-soft: color-mix(in srgb, var(--color-signal-400) 12%, transparent);
196
+
197
+ --tapiz-success: var(--color-good);
198
+ --tapiz-success-soft: rgba(4, 120, 87, 0.10);
199
+ --tapiz-warning: #b45309;
200
+ --tapiz-warning-soft: rgba(180, 83, 9, 0.10);
201
+ --tapiz-danger: var(--color-warn);
202
+ --tapiz-danger-soft: rgba(196, 72, 31, 0.10);
203
+ --tapiz-info: var(--color-primary-300);
204
+ --tapiz-info-soft: color-mix(in srgb, var(--color-primary-300) 10%, transparent);
205
+
206
+ --tapiz-shadow-sm: 0 1px 0 rgba(11,16,32,0.08);
207
+ --tapiz-shadow-md: 0 18px 42px rgba(11,16,32,0.08);
208
+ --tapiz-shadow-lg: 0 26px 80px rgba(11,16,32,0.12);
209
+ --tapiz-shadow-brutal: 4px 4px 0 #0b1020;
210
+ --tapiz-shadow-brutal-lg: 8px 8px 0 #0b1020;
211
+ --tapiz-brutal-border: 2px solid #0b1020;
212
+
213
+ --color-icon-bg: color-mix(in srgb, var(--color-primary-300) 12%, var(--color-ink-200));
214
+ --btn-primary-color: var(--tapiz-accent-contrast);
215
+ }
216
+
217
+ @layer base {
218
+ *, ::after, ::before, ::backdrop, ::file-selector-button {
219
+ border-color: var(--tapiz-border-subtle, currentcolor);
220
+ border-radius: 0 !important;
221
+ }
222
+
223
+ html, body {
224
+ background: var(--tapiz-bg-page);
225
+ color: var(--tapiz-text-primary);
226
+ font-family: var(--font-body);
227
+ letter-spacing: 0;
228
+ -webkit-font-smoothing: antialiased;
229
+ }
230
+
231
+ h1, h2, h3, h4 {
232
+ font-family: var(--font-display);
233
+ font-weight: 600;
234
+ letter-spacing: -0.03em;
235
+ }
236
+
237
+ [class*="rounded"] { border-radius: 0 !important; }
238
+
239
+ html *:not([class*="animate-"]):not(.sliding-logo):not(.pulse-line) {
240
+ transition:
241
+ background-color var(--tapiz-motion-base),
242
+ border-color var(--tapiz-motion-base),
243
+ color var(--tapiz-motion-fast),
244
+ box-shadow var(--tapiz-motion-base),
245
+ transform var(--tapiz-motion-base);
246
+ }
247
+
248
+ /* Tokom promene teme per-element tranzicije prave "pola svetlo / pola tamno" lag
249
+ (svaki element animira boje za sebe). Aplikacija pri toggle-u doda klasu
250
+ `theme-switching` na <html> i skine je sledeći frame — tema se menja odjednom. */
251
+ html.theme-switching *:not([class*="animate-"]):not(.sliding-logo):not(.pulse-line) {
252
+ transition: none !important;
253
+ }
254
+
255
+ input, textarea, select {
256
+ background-color: var(--tapiz-bg-surface) !important;
257
+ border-color: var(--tapiz-border-strong) !important;
258
+ color: var(--tapiz-text-primary) !important;
259
+ }
260
+ input::placeholder, textarea::placeholder { color: var(--tapiz-text-disabled) !important; }
261
+ input:focus, textarea:focus, select:focus {
262
+ border-color: var(--tapiz-border-focus) !important;
263
+ box-shadow: inset 3px 0 0 0 var(--tapiz-signal), 0 0 0 1px var(--tapiz-border-focus) !important;
264
+ outline: none !important;
265
+ }
266
+
267
+ table { color: var(--tapiz-text-secondary) !important; }
268
+ thead, thead tr { background-color: var(--tapiz-bg-surface-muted) !important; }
269
+ thead th {
270
+ background-color: var(--tapiz-bg-surface-muted) !important;
271
+ color: var(--tapiz-text-muted) !important;
272
+ border-color: var(--tapiz-border-subtle) !important;
273
+ font-family: var(--font-mono);
274
+ font-size: 10px;
275
+ letter-spacing: 0.18em;
276
+ text-transform: uppercase;
277
+ font-weight: 600;
278
+ }
279
+ tbody tr { background-color: var(--tapiz-bg-surface) !important; border-color: var(--tapiz-border-subtle) !important; }
280
+ tbody tr:nth-child(even) { background-color: color-mix(in srgb, var(--tapiz-bg-surface-muted) 36%, var(--tapiz-bg-surface)) !important; }
281
+ tbody tr:hover { background-color: var(--tapiz-bg-surface-muted) !important; }
282
+ tbody td, tbody th { color: var(--tapiz-text-secondary) !important; border-color: var(--tapiz-border-subtle) !important; }
283
+
284
+ .bg-white { background-color: var(--tapiz-bg-surface) !important; }
285
+ .bg-gray-50 { background-color: var(--tapiz-bg-page) !important; }
286
+ .bg-gray-100 { background-color: var(--tapiz-bg-surface-muted) !important; }
287
+ .bg-gray-200 { background-color: var(--color-ink-400) !important; }
288
+ .border-gray-100, .border-gray-200, .border-gray-300 { border-color: var(--tapiz-border-subtle) !important; }
289
+ hr { border-color: var(--tapiz-border-subtle) !important; }
290
+ .text-gray-900, .text-gray-800 { color: var(--tapiz-text-primary) !important; }
291
+ .text-gray-700, .text-gray-600 { color: var(--tapiz-text-secondary) !important; }
292
+ .text-gray-500, .text-gray-400 { color: var(--tapiz-text-muted) !important; }
293
+ .text-gray-300 { color: var(--tapiz-text-disabled) !important; }
294
+
295
+ .card, .stat-card {
296
+ background-color: var(--tapiz-bg-surface) !important;
297
+ border-color: var(--tapiz-border-subtle) !important;
298
+ }
299
+ }
300
+
301
+ .kicker {
302
+ font-family: var(--font-mono);
303
+ font-size: 10px;
304
+ letter-spacing: 0.18em;
305
+ text-transform: uppercase;
306
+ font-weight: 700;
307
+ color: var(--tapiz-accent);
308
+ }
309
+
310
+ .font-mono { font-family: var(--font-mono) !important; }
311
+ .font-display { font-family: var(--font-display) !important; }
312
+
313
+ .grid-bg, .tapiz-grid-bg {
314
+ background-image: var(--tapiz-surface-grid);
315
+ background-size: 24px 24px;
316
+ background-position: -1px -1px;
317
+ }
318
+
319
+ .tapiz-noise-bg { background-image: var(--tapiz-surface-noise); }
320
+ .tapiz-enterprise-shell { background: var(--tapiz-bg-page); color: var(--tapiz-text-primary); }
321
+ .tapiz-focus-ring:focus-visible { outline: 2px solid var(--tapiz-border-focus); outline-offset: 2px; }
322
+
323
+ @utility btn-primary {
324
+ display: inline-flex;
325
+ align-items: center;
326
+ justify-content: center;
327
+ padding: 0.5rem 1rem;
328
+ background: var(--tapiz-accent);
329
+ color: var(--btn-primary-color);
330
+ font-family: var(--font-display);
331
+ font-size: 0.875rem;
332
+ font-weight: 700;
333
+ border: 1px solid var(--tapiz-border-strong);
334
+ box-shadow: var(--tapiz-brutal-shadow);
335
+ cursor: pointer;
336
+ &:hover { transform: translate(-1px,-1px); box-shadow: var(--tapiz-brutal-shadow-lg); }
337
+ &:active { transform: translate(1px,1px); box-shadow: 2px 2px 0 var(--tapiz-border-strong); }
338
+ &:disabled { opacity: 0.4; cursor: not-allowed; transform: none; box-shadow: none; }
339
+ }
340
+
341
+ @utility btn-secondary {
342
+ display: inline-flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ padding: 0.5rem 1rem;
346
+ background: var(--tapiz-bg-surface);
347
+ color: var(--tapiz-text-secondary);
348
+ font-family: var(--font-mono);
349
+ font-size: 0.875rem;
350
+ font-weight: 600;
351
+ border: 1px solid var(--tapiz-border-strong);
352
+ cursor: pointer;
353
+ &:hover { color: var(--tapiz-text-primary); border-color: var(--tapiz-accent); }
354
+ &:active { background: var(--tapiz-bg-surface-muted); }
355
+ &:disabled { opacity: 0.4; cursor: not-allowed; }
356
+ }
357
+
358
+ @utility btn-danger {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ background: transparent;
363
+ color: var(--tapiz-danger);
364
+ font-family: var(--font-mono);
365
+ border: 1px solid var(--tapiz-danger);
366
+ cursor: pointer;
367
+ &:hover { background: var(--tapiz-danger-soft); }
368
+ }
369
+
370
+ @utility input-field {
371
+ display: block;
372
+ width: 100%;
373
+ padding: 0.625rem 0.875rem;
374
+ background: var(--tapiz-bg-surface);
375
+ border: 1px solid var(--tapiz-border-strong);
376
+ font-size: 0.875rem;
377
+ color: var(--tapiz-text-primary);
378
+ outline: none;
379
+ &::placeholder { color: var(--tapiz-text-disabled); }
380
+ &:focus { border-color: var(--tapiz-border-focus); box-shadow: inset 3px 0 0 0 var(--tapiz-signal); }
381
+ }
382
+
383
+ @utility skeleton {
384
+ background: linear-gradient(90deg, var(--color-ink-300) 25%, var(--color-ink-400) 50%, var(--color-ink-300) 75%);
385
+ background-size: 800px 100%;
386
+ animation: skeleton-shimmer 1.5s infinite linear;
387
+ }
388
+
389
+ @utility card {
390
+ background: var(--tapiz-bg-surface);
391
+ border: 1px solid var(--tapiz-border-subtle);
392
+ box-shadow: var(--tapiz-shadow-sm);
393
+ padding: 1.25rem;
394
+ }
395
+
396
+ @utility form-panel {
397
+ background: var(--tapiz-bg-surface);
398
+ border: 1px solid var(--tapiz-border-strong);
399
+ border-top: 2px solid var(--tapiz-accent);
400
+ box-shadow: var(--tapiz-shadow-sm);
401
+ padding: 1.25rem;
402
+ }
403
+
404
+ @utility stat-card {
405
+ background: var(--tapiz-bg-surface);
406
+ border: 1px solid var(--tapiz-border-subtle);
407
+ box-shadow: var(--tapiz-shadow-sm);
408
+ padding: 1rem;
409
+ }
410
+
411
+ @utility card-hover {
412
+ &:hover { border-color: var(--tapiz-border-strong); box-shadow: var(--tapiz-shadow-md); transform: translateY(-1px); }
413
+ }
414
+
415
+ @utility tapiz-brutal-card {
416
+ background: var(--tapiz-bg-surface);
417
+ border: var(--tapiz-brutal-border);
418
+ box-shadow: var(--tapiz-brutal-shadow);
419
+ }
420
+
421
+ @utility tapiz-enterprise-card {
422
+ background: var(--tapiz-bg-surface);
423
+ border: 1px solid var(--tapiz-border-subtle);
424
+ box-shadow: var(--tapiz-shadow-md);
425
+ }