@zero-studio/library 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ztl.css ADDED
@@ -0,0 +1,1875 @@
1
+ /*! @zero-studio/library v1.0.0 | MIT */
2
+ /*! ZERO Technology Library (ZTL) v1.0.0 | MIT License | https://zero-tech.dev */
3
+
4
+ /* =============================================================================
5
+ TABLE OF CONTENTS
6
+ 1. CSS Custom Properties (Design Tokens)
7
+ 2. Reset & Base
8
+ 3. Typography
9
+ 4. Buttons
10
+ 5. Badges
11
+ 6. Inputs & Forms
12
+ 7. Cards
13
+ 8. Alerts
14
+ 9. Avatar
15
+ 10. Progress
16
+ 11. Toggle / Switch
17
+ 12. Checkbox & Radio
18
+ 13. Tabs
19
+ 14. Dropdown
20
+ 15. Table
21
+ 16. Tooltip
22
+ 17. Modal
23
+ 18. Toast / Snackbar
24
+ 19. Loader / Spinner
25
+ 20. Timeline
26
+ 21. Tags / Chips
27
+ 22. Code Block
28
+ 23. Navbar
29
+ 24. Sidebar
30
+ 25. Utility Classes
31
+ 26. Animations
32
+ 27. Dark Theme (Default)
33
+ 28. Light Theme Override
34
+ 29. RTL Support
35
+ ============================================================================= */
36
+
37
+ /* -----------------------------------------------------------------------------
38
+ 1. CSS CUSTOM PROPERTIES (Design Tokens)
39
+ ----------------------------------------------------------------------------- */
40
+ :root {
41
+ /* Colors */
42
+ --ztl-bg: #050508;
43
+ --ztl-surface: #0d0d14;
44
+ --ztl-surface-2: #13131e;
45
+ --ztl-surface-3: #1a1a28;
46
+ --ztl-border: #1e1e30;
47
+ --ztl-border-2: #2a2a40;
48
+
49
+ /* Brand / Accent */
50
+ --ztl-accent: #00f5a0;
51
+ --ztl-accent-2: #7c3aed;
52
+ --ztl-accent-3: #f59e0b;
53
+
54
+ /* Semantic */
55
+ --ztl-success: #00f5a0;
56
+ --ztl-danger: #ef4444;
57
+ --ztl-warning: #f59e0b;
58
+ --ztl-info: #3b82f6;
59
+
60
+ /* Text */
61
+ --ztl-text: #e8e8f0;
62
+ --ztl-text-muted: #5a5a7a;
63
+ --ztl-text-faint: #2e2e48;
64
+
65
+ /* Shadows */
66
+ --ztl-glow: 0 0 20px rgba(0, 245, 160, 0.3);
67
+ --ztl-glow-2: 0 0 20px rgba(124, 58, 237, 0.4);
68
+ --ztl-shadow-sm: 0 4px 12px rgba(0, 0, 0, 0.3);
69
+ --ztl-shadow: 0 10px 30px rgba(0, 0, 0, 0.4);
70
+ --ztl-shadow-lg: 0 20px 50px rgba(0, 0, 0, 0.5);
71
+
72
+ /* Spacing */
73
+ --ztl-space-1: 4px;
74
+ --ztl-space-2: 8px;
75
+ --ztl-space-3: 12px;
76
+ --ztl-space-4: 16px;
77
+ --ztl-space-5: 20px;
78
+ --ztl-space-6: 24px;
79
+ --ztl-space-8: 32px;
80
+ --ztl-space-10: 40px;
81
+ --ztl-space-12: 48px;
82
+
83
+ /* Radii */
84
+ --ztl-radius-sm: 6px;
85
+ --ztl-radius: 10px;
86
+ --ztl-radius-lg: 16px;
87
+ --ztl-radius-xl: 24px;
88
+ --ztl-radius-full: 9999px;
89
+
90
+ /* Typography */
91
+ --ztl-font-sans: 'Inter', 'Segoe UI', system-ui, sans-serif;
92
+ --ztl-font-mono: 'Space Mono', 'Fira Code', 'Cascadia Code', monospace;
93
+ --ztl-font-ar: 'Noto Kufi Arabic', 'Cairo', sans-serif;
94
+
95
+ --ztl-text-xs: 11px;
96
+ --ztl-text-sm: 13px;
97
+ --ztl-text-base: 15px;
98
+ --ztl-text-lg: 18px;
99
+ --ztl-text-xl: 22px;
100
+ --ztl-text-2xl: 28px;
101
+ --ztl-text-3xl: 36px;
102
+
103
+ /* Transitions */
104
+ --ztl-transition: all 0.25s ease;
105
+ --ztl-transition-fast: all 0.15s ease;
106
+ --ztl-transition-slow: all 0.4s ease;
107
+
108
+ /* Z-index layers */
109
+ --ztl-z-dropdown: 100;
110
+ --ztl-z-modal: 500;
111
+ --ztl-z-toast: 1000;
112
+ --ztl-z-tooltip: 200;
113
+ }
114
+
115
+ /* Light theme override */
116
+ [data-ztl-theme="light"] {
117
+ --ztl-bg: #f0f0f8;
118
+ --ztl-surface: #ffffff;
119
+ --ztl-surface-2: #f5f5fa;
120
+ --ztl-surface-3: #eeeef5;
121
+ --ztl-border: #e0e0ee;
122
+ --ztl-border-2: #d0d0e0;
123
+ --ztl-text: #0d0d20;
124
+ --ztl-text-muted: #6b6b90;
125
+ --ztl-text-faint: #c0c0d5;
126
+ --ztl-glow: 0 0 20px rgba(0, 200, 130, 0.2);
127
+ --ztl-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
128
+ }
129
+
130
+ /* -----------------------------------------------------------------------------
131
+ 2. RESET & BASE
132
+ ----------------------------------------------------------------------------- */
133
+ .ztl-scope *,
134
+ .ztl-scope *::before,
135
+ .ztl-scope *::after {
136
+ box-sizing: border-box;
137
+ }
138
+
139
+ /* Use .ztl-body to apply base styles to the page */
140
+ .ztl-body {
141
+ font-family: var(--ztl-font-sans);
142
+ font-size: var(--ztl-text-base);
143
+ background-color: var(--ztl-bg);
144
+ color: var(--ztl-text);
145
+ line-height: 1.6;
146
+ -webkit-font-smoothing: antialiased;
147
+ -moz-osx-font-smoothing: grayscale;
148
+ }
149
+
150
+ /* Arabic locale */
151
+ [lang="ar"] .ztl-body,
152
+ .ztl-ar {
153
+ font-family: var(--ztl-font-ar);
154
+ direction: rtl;
155
+ }
156
+
157
+ /* Custom scrollbar */
158
+ .ztl-scroll::-webkit-scrollbar { width: 5px; height: 5px; }
159
+ .ztl-scroll::-webkit-scrollbar-track { background: var(--ztl-bg); }
160
+ .ztl-scroll::-webkit-scrollbar-thumb { background: var(--ztl-border-2); border-radius: 4px; }
161
+ .ztl-scroll::-webkit-scrollbar-thumb:hover { background: var(--ztl-text-muted); }
162
+
163
+ /* -----------------------------------------------------------------------------
164
+ 3. TYPOGRAPHY
165
+ ----------------------------------------------------------------------------- */
166
+ .ztl-h1 { font-size: var(--ztl-text-3xl); font-weight: 800; line-height: 1.1; letter-spacing: -1px; }
167
+ .ztl-h2 { font-size: var(--ztl-text-2xl); font-weight: 700; line-height: 1.2; }
168
+ .ztl-h3 { font-size: var(--ztl-text-xl); font-weight: 700; line-height: 1.3; }
169
+ .ztl-h4 { font-size: var(--ztl-text-lg); font-weight: 600; line-height: 1.4; }
170
+ .ztl-h5 { font-size: var(--ztl-text-base);font-weight: 600; }
171
+ .ztl-h6 { font-size: var(--ztl-text-sm); font-weight: 600; }
172
+
173
+ .ztl-text { font-size: var(--ztl-text-base); color: var(--ztl-text); }
174
+ .ztl-text-sm { font-size: var(--ztl-text-sm); }
175
+ .ztl-text-xs { font-size: var(--ztl-text-xs); }
176
+ .ztl-muted { color: var(--ztl-text-muted); }
177
+ .ztl-mono { font-family: var(--ztl-font-mono); }
178
+ .ztl-accent { color: var(--ztl-accent); }
179
+ .ztl-lead { font-size: var(--ztl-text-lg); color: var(--ztl-text-muted); line-height: 1.7; }
180
+ .ztl-label { font-size: var(--ztl-text-xs); font-family: var(--ztl-font-mono); letter-spacing: 2px; text-transform: uppercase; color: var(--ztl-text-muted); }
181
+
182
+ /* -----------------------------------------------------------------------------
183
+ 4. BUTTONS
184
+ ----------------------------------------------------------------------------- */
185
+ .ztl-btn {
186
+ display: inline-flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ gap: 8px;
190
+ padding: 10px 20px;
191
+ border-radius: var(--ztl-radius-sm);
192
+ font-size: var(--ztl-text-sm);
193
+ font-weight: 600;
194
+ font-family: inherit;
195
+ line-height: 1;
196
+ cursor: pointer;
197
+ border: 1px solid transparent;
198
+ text-decoration: none;
199
+ white-space: nowrap;
200
+ user-select: none;
201
+ transition: var(--ztl-transition);
202
+ position: relative;
203
+ overflow: hidden;
204
+ }
205
+
206
+ .ztl-btn:disabled,
207
+ .ztl-btn[aria-disabled="true"] {
208
+ opacity: 0.4;
209
+ cursor: not-allowed;
210
+ pointer-events: none;
211
+ }
212
+
213
+ .ztl-btn:active { transform: scale(0.97); }
214
+
215
+ /* Sizes */
216
+ .ztl-btn-xs { padding: 5px 10px; font-size: var(--ztl-text-xs); }
217
+ .ztl-btn-sm { padding: 7px 14px; font-size: var(--ztl-text-xs); }
218
+ .ztl-btn-lg { padding: 13px 28px; font-size: var(--ztl-text-base); }
219
+ .ztl-btn-xl { padding: 16px 36px; font-size: var(--ztl-text-lg); }
220
+ .ztl-btn-icon { padding: 9px; aspect-ratio: 1; }
221
+ .ztl-btn-full { width: 100%; }
222
+
223
+ /* Variants */
224
+ .ztl-btn-primary {
225
+ background: var(--ztl-accent);
226
+ color: #050508;
227
+ border-color: var(--ztl-accent);
228
+ }
229
+ .ztl-btn-primary:hover {
230
+ box-shadow: var(--ztl-glow);
231
+ filter: brightness(1.08);
232
+ }
233
+
234
+ .ztl-btn-secondary {
235
+ background: transparent;
236
+ color: var(--ztl-accent);
237
+ border-color: var(--ztl-accent);
238
+ }
239
+ .ztl-btn-secondary:hover { background: rgba(0, 245, 160, 0.08); }
240
+
241
+ .ztl-btn-purple {
242
+ background: var(--ztl-accent-2);
243
+ color: #fff;
244
+ border-color: var(--ztl-accent-2);
245
+ }
246
+ .ztl-btn-purple:hover { box-shadow: var(--ztl-glow-2); }
247
+
248
+ .ztl-btn-ghost {
249
+ background: var(--ztl-surface-2);
250
+ color: var(--ztl-text);
251
+ border-color: var(--ztl-border);
252
+ }
253
+ .ztl-btn-ghost:hover { border-color: var(--ztl-border-2); }
254
+
255
+ .ztl-btn-danger {
256
+ background: var(--ztl-danger);
257
+ color: #fff;
258
+ border-color: var(--ztl-danger);
259
+ }
260
+ .ztl-btn-danger:hover { box-shadow: 0 0 20px rgba(239, 68, 68, 0.4); }
261
+
262
+ .ztl-btn-success {
263
+ background: var(--ztl-success);
264
+ color: #050508;
265
+ border-color: var(--ztl-success);
266
+ }
267
+
268
+ .ztl-btn-outline {
269
+ background: transparent;
270
+ color: var(--ztl-text);
271
+ border-color: var(--ztl-border-2);
272
+ }
273
+ .ztl-btn-outline:hover { border-color: var(--ztl-text-muted); }
274
+
275
+ .ztl-btn-link {
276
+ background: transparent;
277
+ color: var(--ztl-accent);
278
+ border-color: transparent;
279
+ padding-left: 0;
280
+ padding-right: 0;
281
+ text-decoration: underline;
282
+ text-underline-offset: 3px;
283
+ }
284
+
285
+ /* Button Group */
286
+ .ztl-btn-group { display: inline-flex; }
287
+ .ztl-btn-group .ztl-btn { border-radius: 0; border-left-width: 0; }
288
+ .ztl-btn-group .ztl-btn:first-child { border-radius: var(--ztl-radius-sm) 0 0 var(--ztl-radius-sm); border-left-width: 1px; }
289
+ .ztl-btn-group .ztl-btn:last-child { border-radius: 0 var(--ztl-radius-sm) var(--ztl-radius-sm) 0; }
290
+
291
+ /* Loading state */
292
+ .ztl-btn-loading { pointer-events: none; }
293
+ .ztl-btn-loading::after {
294
+ content: '';
295
+ width: 14px; height: 14px;
296
+ border: 2px solid currentColor;
297
+ border-top-color: transparent;
298
+ border-radius: 50%;
299
+ animation: ztl-spin 0.7s linear infinite;
300
+ margin-right: 4px;
301
+ }
302
+
303
+ /* -----------------------------------------------------------------------------
304
+ 5. BADGES
305
+ ----------------------------------------------------------------------------- */
306
+ .ztl-badge {
307
+ display: inline-flex;
308
+ align-items: center;
309
+ gap: 5px;
310
+ padding: 3px 10px;
311
+ border-radius: var(--ztl-radius-full);
312
+ font-size: var(--ztl-text-xs);
313
+ font-weight: 600;
314
+ font-family: var(--ztl-font-mono);
315
+ letter-spacing: 0.5px;
316
+ border: 1px solid transparent;
317
+ white-space: nowrap;
318
+ }
319
+
320
+ .ztl-badge-dot {
321
+ width: 6px; height: 6px;
322
+ border-radius: 50%;
323
+ background: currentColor;
324
+ flex-shrink: 0;
325
+ }
326
+
327
+ .ztl-badge-dot.ztl-pulse { animation: ztl-pulse-dot 2s infinite; }
328
+
329
+ /* Badge Variants */
330
+ .ztl-badge-success { background: rgba(0,245,160,0.12); color: var(--ztl-accent); border-color: rgba(0,245,160,0.25); }
331
+ .ztl-badge-danger { background: rgba(239,68,68,0.12); color: #f87171; border-color: rgba(239,68,68,0.25); }
332
+ .ztl-badge-warning { background: rgba(245,158,11,0.12); color: var(--ztl-accent-3); border-color: rgba(245,158,11,0.25); }
333
+ .ztl-badge-info { background: rgba(59,130,246,0.12); color: #60a5fa; border-color: rgba(59,130,246,0.25); }
334
+ .ztl-badge-purple { background: rgba(124,58,237,0.15); color: #a78bfa; border-color: rgba(124,58,237,0.25); }
335
+ .ztl-badge-neutral { background: var(--ztl-surface-2); color: var(--ztl-text-muted); border-color: var(--ztl-border); }
336
+
337
+ /* Badge Sizes */
338
+ .ztl-badge-sm { padding: 2px 7px; font-size: 9px; }
339
+ .ztl-badge-lg { padding: 5px 14px; font-size: 12px; }
340
+
341
+ /* Counter badge (pill on element) */
342
+ .ztl-badge-counter {
343
+ position: absolute;
344
+ top: -6px;
345
+ right: -6px;
346
+ min-width: 18px;
347
+ height: 18px;
348
+ padding: 0 5px;
349
+ border-radius: var(--ztl-radius-full);
350
+ background: var(--ztl-danger);
351
+ color: #fff;
352
+ font-size: 9px;
353
+ font-weight: 700;
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: center;
357
+ border: 2px solid var(--ztl-bg);
358
+ }
359
+
360
+ /* -----------------------------------------------------------------------------
361
+ 6. INPUTS & FORMS
362
+ ----------------------------------------------------------------------------- */
363
+ .ztl-field {
364
+ display: flex;
365
+ flex-direction: column;
366
+ gap: 6px;
367
+ }
368
+
369
+ .ztl-label-text {
370
+ font-size: var(--ztl-text-xs);
371
+ color: var(--ztl-text-muted);
372
+ font-family: var(--ztl-font-mono);
373
+ letter-spacing: 1px;
374
+ }
375
+
376
+ .ztl-label-text .ztl-required {
377
+ color: var(--ztl-danger);
378
+ margin-right: 2px;
379
+ }
380
+
381
+ .ztl-input,
382
+ .ztl-textarea,
383
+ .ztl-select {
384
+ background: var(--ztl-surface-2);
385
+ border: 1px solid var(--ztl-border);
386
+ border-radius: var(--ztl-radius-sm);
387
+ padding: 10px 14px;
388
+ font-family: inherit;
389
+ font-size: var(--ztl-text-sm);
390
+ color: var(--ztl-text);
391
+ outline: none;
392
+ width: 100%;
393
+ transition: var(--ztl-transition);
394
+ appearance: none;
395
+ }
396
+
397
+ .ztl-input::placeholder,
398
+ .ztl-textarea::placeholder {
399
+ color: var(--ztl-text-muted);
400
+ opacity: 0.7;
401
+ }
402
+
403
+ .ztl-input:focus,
404
+ .ztl-textarea:focus,
405
+ .ztl-select:focus {
406
+ border-color: var(--ztl-accent);
407
+ box-shadow: 0 0 0 3px rgba(0, 245, 160, 0.12);
408
+ background: var(--ztl-surface);
409
+ }
410
+
411
+ .ztl-input:disabled,
412
+ .ztl-textarea:disabled {
413
+ opacity: 0.5;
414
+ cursor: not-allowed;
415
+ }
416
+
417
+ /* States */
418
+ .ztl-input-error { border-color: var(--ztl-danger) !important; }
419
+ .ztl-input-error:focus { box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.12) !important; }
420
+
421
+ .ztl-input-success { border-color: var(--ztl-success) !important; }
422
+ .ztl-input-success:focus { box-shadow: 0 0 0 3px rgba(0, 245, 160, 0.12) !important; }
423
+
424
+ /* Input with icon */
425
+ .ztl-input-wrap { position: relative; }
426
+ .ztl-input-wrap .ztl-input { padding-right: 40px; }
427
+ .ztl-input-icon-right {
428
+ position: absolute;
429
+ right: 12px;
430
+ top: 50%;
431
+ transform: translateY(-50%);
432
+ color: var(--ztl-text-muted);
433
+ pointer-events: none;
434
+ display: flex;
435
+ align-items: center;
436
+ }
437
+ [dir="rtl"] .ztl-input-wrap .ztl-input { padding-right: 14px; padding-left: 40px; }
438
+ [dir="rtl"] .ztl-input-icon-right { right: auto; left: 12px; }
439
+
440
+ /* Textarea */
441
+ .ztl-textarea { resize: vertical; min-height: 80px; }
442
+
443
+ /* Select */
444
+ .ztl-select {
445
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%235a5a7a' stroke-width='1.5' fill='none'/%3E%3C/svg%3E");
446
+ background-repeat: no-repeat;
447
+ background-position: left 12px center;
448
+ background-size: 12px;
449
+ padding-left: 32px;
450
+ cursor: pointer;
451
+ }
452
+ [dir="rtl"] .ztl-select {
453
+ background-position: right 12px center;
454
+ padding-left: 14px;
455
+ padding-right: 32px;
456
+ }
457
+
458
+ /* Field helpers */
459
+ .ztl-field-hint { font-size: var(--ztl-text-xs); color: var(--ztl-text-muted); }
460
+ .ztl-field-error { font-size: var(--ztl-text-xs); color: #f87171; }
461
+ .ztl-field-count { font-size: var(--ztl-text-xs); color: var(--ztl-text-muted); text-align: right; }
462
+
463
+ /* Form grid */
464
+ .ztl-form-grid { display: grid; gap: 16px; }
465
+ .ztl-form-grid-2 { grid-template-columns: 1fr 1fr; }
466
+ .ztl-form-grid-3 { grid-template-columns: 1fr 1fr 1fr; }
467
+
468
+ /* Range input */
469
+ .ztl-range {
470
+ appearance: none;
471
+ width: 100%;
472
+ height: 4px;
473
+ background: var(--ztl-border);
474
+ border-radius: var(--ztl-radius-full);
475
+ outline: none;
476
+ cursor: pointer;
477
+ }
478
+ .ztl-range::-webkit-slider-thumb {
479
+ appearance: none;
480
+ width: 18px; height: 18px;
481
+ border-radius: 50%;
482
+ background: var(--ztl-accent);
483
+ box-shadow: var(--ztl-glow);
484
+ cursor: pointer;
485
+ transition: transform 0.2s;
486
+ }
487
+ .ztl-range::-webkit-slider-thumb:hover { transform: scale(1.2); }
488
+
489
+ /* Search input */
490
+ .ztl-search-wrap { position: relative; }
491
+ .ztl-search-icon {
492
+ position: absolute;
493
+ left: 12px;
494
+ top: 50%;
495
+ transform: translateY(-50%);
496
+ color: var(--ztl-text-muted);
497
+ }
498
+ [dir="rtl"] .ztl-search-icon { left: auto; right: 12px; }
499
+ .ztl-search-wrap .ztl-input { padding-left: 38px; }
500
+ [dir="rtl"] .ztl-search-wrap .ztl-input { padding-left: 14px; padding-right: 38px; }
501
+
502
+ /* -----------------------------------------------------------------------------
503
+ 7. CARDS
504
+ ----------------------------------------------------------------------------- */
505
+ .ztl-card {
506
+ background: var(--ztl-surface);
507
+ border: 1px solid var(--ztl-border);
508
+ border-radius: var(--ztl-radius);
509
+ overflow: hidden;
510
+ transition: var(--ztl-transition);
511
+ }
512
+
513
+ .ztl-card:hover {
514
+ border-color: rgba(0, 245, 160, 0.2);
515
+ transform: translateY(-3px);
516
+ box-shadow: var(--ztl-shadow);
517
+ }
518
+
519
+ .ztl-card-flat { background: var(--ztl-surface-2); }
520
+ .ztl-card-flat:hover { transform: none; }
521
+
522
+ .ztl-card-header {
523
+ padding: 16px 20px;
524
+ border-bottom: 1px solid var(--ztl-border);
525
+ display: flex;
526
+ align-items: center;
527
+ justify-content: space-between;
528
+ gap: 12px;
529
+ }
530
+
531
+ .ztl-card-body { padding: 20px; }
532
+ .ztl-card-body-sm { padding: 14px; }
533
+
534
+ .ztl-card-footer {
535
+ padding: 14px 20px;
536
+ border-top: 1px solid var(--ztl-border);
537
+ display: flex;
538
+ align-items: center;
539
+ justify-content: space-between;
540
+ gap: 12px;
541
+ }
542
+
543
+ .ztl-card-title { font-size: var(--ztl-text-base); font-weight: 700; }
544
+ .ztl-card-subtitle { font-size: var(--ztl-text-sm); color: var(--ztl-text-muted); }
545
+
546
+ /* Media card */
547
+ .ztl-card-media {
548
+ height: 160px;
549
+ background: linear-gradient(135deg, var(--ztl-accent-2), var(--ztl-accent));
550
+ display: flex;
551
+ align-items: center;
552
+ justify-content: center;
553
+ font-size: 48px;
554
+ overflow: hidden;
555
+ flex-shrink: 0;
556
+ }
557
+
558
+ /* Stat card */
559
+ .ztl-stat-card {
560
+ background: var(--ztl-surface-2);
561
+ border: 1px solid var(--ztl-border);
562
+ border-radius: var(--ztl-radius);
563
+ padding: 20px;
564
+ }
565
+
566
+ .ztl-stat-value {
567
+ font-size: 32px;
568
+ font-weight: 800;
569
+ color: var(--ztl-accent);
570
+ line-height: 1;
571
+ margin: 8px 0 4px;
572
+ }
573
+
574
+ .ztl-stat-change { font-size: var(--ztl-text-xs); font-family: var(--ztl-font-mono); }
575
+ .ztl-stat-change-up { color: var(--ztl-success); }
576
+ .ztl-stat-change-down { color: var(--ztl-danger); }
577
+
578
+ /* Card grid layouts */
579
+ .ztl-cards-grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
580
+ .ztl-cards-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
581
+ .ztl-cards-grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
582
+ .ztl-cards-auto { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; }
583
+
584
+ /* -----------------------------------------------------------------------------
585
+ 8. ALERTS
586
+ ----------------------------------------------------------------------------- */
587
+ .ztl-alert {
588
+ display: flex;
589
+ align-items: flex-start;
590
+ gap: 12px;
591
+ padding: 14px 16px;
592
+ border-radius: var(--ztl-radius-sm);
593
+ border: 1px solid;
594
+ position: relative;
595
+ overflow: hidden;
596
+ }
597
+
598
+ .ztl-alert::before {
599
+ content: '';
600
+ position: absolute;
601
+ right: 0;
602
+ top: 0;
603
+ bottom: 0;
604
+ width: 3px;
605
+ background: currentColor;
606
+ }
607
+
608
+ [dir="rtl"] .ztl-alert::before { right: auto; left: 0; }
609
+
610
+ .ztl-alert-icon { font-size: 18px; flex-shrink: 0; margin-top: 1px; }
611
+ .ztl-alert-body { flex: 1; }
612
+ .ztl-alert-title { font-size: var(--ztl-text-sm); font-weight: 700; margin-bottom: 3px; }
613
+ .ztl-alert-text { font-size: var(--ztl-text-xs); opacity: 0.75; line-height: 1.5; }
614
+
615
+ .ztl-alert-close {
616
+ background: none;
617
+ border: none;
618
+ color: currentColor;
619
+ cursor: pointer;
620
+ opacity: 0.5;
621
+ font-size: 16px;
622
+ line-height: 1;
623
+ padding: 2px;
624
+ flex-shrink: 0;
625
+ transition: opacity 0.2s;
626
+ }
627
+ .ztl-alert-close:hover { opacity: 1; }
628
+
629
+ .ztl-alert-success { background: rgba(0,245,160,0.06); border-color: rgba(0,245,160,0.25); color: var(--ztl-accent); }
630
+ .ztl-alert-danger { background: rgba(239,68,68,0.06); border-color: rgba(239,68,68,0.25); color: #f87171; }
631
+ .ztl-alert-warning { background: rgba(245,158,11,0.06); border-color: rgba(245,158,11,0.25); color: var(--ztl-accent-3); }
632
+ .ztl-alert-info { background: rgba(59,130,246,0.06); border-color: rgba(59,130,246,0.25); color: #60a5fa; }
633
+
634
+ /* Inline alert (no border-left bar) */
635
+ .ztl-alert-inline::before { display: none; }
636
+
637
+ /* -----------------------------------------------------------------------------
638
+ 9. AVATAR
639
+ ----------------------------------------------------------------------------- */
640
+ .ztl-avatar {
641
+ border-radius: 50%;
642
+ display: inline-flex;
643
+ align-items: center;
644
+ justify-content: center;
645
+ font-weight: 700;
646
+ font-family: var(--ztl-font-mono);
647
+ flex-shrink: 0;
648
+ position: relative;
649
+ overflow: hidden;
650
+ border: 2px solid var(--ztl-border);
651
+ user-select: none;
652
+ transition: var(--ztl-transition);
653
+ background: var(--ztl-surface-2);
654
+ color: var(--ztl-text-muted);
655
+ }
656
+
657
+ .ztl-avatar:hover { border-color: var(--ztl-accent); }
658
+
659
+ /* Sizes */
660
+ .ztl-avatar-xs { width: 24px; height: 24px; font-size: 9px; }
661
+ .ztl-avatar-sm { width: 32px; height: 32px; font-size: 11px; }
662
+ .ztl-avatar-md { width: 44px; height: 44px; font-size: 14px; }
663
+ .ztl-avatar-lg { width: 60px; height: 60px; font-size: 20px; }
664
+ .ztl-avatar-xl { width: 80px; height: 80px; font-size: 26px; }
665
+
666
+ /* Colors */
667
+ .ztl-avatar-green { background: rgba(0,245,160,0.12); color: var(--ztl-accent); }
668
+ .ztl-avatar-purple { background: rgba(124,58,237,0.18); color: #a78bfa; }
669
+ .ztl-avatar-amber { background: rgba(245,158,11,0.14); color: var(--ztl-accent-3); }
670
+ .ztl-avatar-blue { background: rgba(59,130,246,0.14); color: #60a5fa; }
671
+ .ztl-avatar-red { background: rgba(239,68,68,0.14); color: #f87171; }
672
+
673
+ /* Avatar image */
674
+ .ztl-avatar img {
675
+ width: 100%;
676
+ height: 100%;
677
+ object-fit: cover;
678
+ border-radius: 50%;
679
+ }
680
+
681
+ /* Status dot */
682
+ .ztl-avatar-status {
683
+ position: absolute;
684
+ bottom: 1px;
685
+ right: 1px;
686
+ width: 10px; height: 10px;
687
+ border-radius: 50%;
688
+ border: 2px solid var(--ztl-bg);
689
+ }
690
+ .ztl-status-online { background: var(--ztl-success); }
691
+ .ztl-status-offline { background: var(--ztl-text-muted); }
692
+ .ztl-status-busy { background: var(--ztl-danger); }
693
+ .ztl-status-away { background: var(--ztl-warning); }
694
+
695
+ /* Avatar group */
696
+ .ztl-avatar-group { display: flex; flex-direction: row-reverse; }
697
+ .ztl-avatar-group .ztl-avatar { margin-left: -10px; border: 2px solid var(--ztl-bg); }
698
+ .ztl-avatar-group .ztl-avatar:last-child { margin-left: 0; }
699
+ [dir="rtl"] .ztl-avatar-group { flex-direction: row; }
700
+ [dir="rtl"] .ztl-avatar-group .ztl-avatar { margin-left: 0; margin-right: -10px; }
701
+ [dir="rtl"] .ztl-avatar-group .ztl-avatar:last-child { margin-right: 0; }
702
+
703
+ /* -----------------------------------------------------------------------------
704
+ 10. PROGRESS
705
+ ----------------------------------------------------------------------------- */
706
+ .ztl-progress {
707
+ height: 6px;
708
+ background: var(--ztl-surface-2);
709
+ border-radius: var(--ztl-radius-full);
710
+ overflow: hidden;
711
+ }
712
+
713
+ .ztl-progress-fill {
714
+ height: 100%;
715
+ border-radius: var(--ztl-radius-full);
716
+ transition: width 0.6s ease;
717
+ position: relative;
718
+ overflow: hidden;
719
+ }
720
+
721
+ .ztl-progress-fill::after {
722
+ content: '';
723
+ position: absolute;
724
+ inset: 0;
725
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.25), transparent);
726
+ animation: ztl-shimmer 2s infinite;
727
+ }
728
+
729
+ /* Thickness */
730
+ .ztl-progress-sm { height: 3px; }
731
+ .ztl-progress-lg { height: 10px; }
732
+ .ztl-progress-xl { height: 14px; border-radius: 4px; }
733
+
734
+ /* Colors */
735
+ .ztl-progress-success { background: linear-gradient(90deg, var(--ztl-accent), #00c97a); }
736
+ .ztl-progress-purple { background: linear-gradient(90deg, var(--ztl-accent-2), #9333ea); }
737
+ .ztl-progress-warning { background: linear-gradient(90deg, var(--ztl-accent-3), #d97706); }
738
+ .ztl-progress-info { background: linear-gradient(90deg, var(--ztl-info), #1d4ed8); }
739
+ .ztl-progress-danger { background: linear-gradient(90deg, var(--ztl-danger), #dc2626); }
740
+
741
+ /* Striped */
742
+ .ztl-progress-striped::after {
743
+ background-image: repeating-linear-gradient(
744
+ 45deg,
745
+ rgba(255,255,255,0.1) 0px,
746
+ rgba(255,255,255,0.1) 8px,
747
+ transparent 8px,
748
+ transparent 16px
749
+ );
750
+ animation: ztl-stripe-move 1s linear infinite;
751
+ }
752
+
753
+ @keyframes ztl-stripe-move {
754
+ 0% { background-position: 0 0; }
755
+ 100% { background-position: 32px 0; }
756
+ }
757
+
758
+ /* Progress with label */
759
+ .ztl-progress-wrap { display: flex; flex-direction: column; gap: 6px; }
760
+ .ztl-progress-info-row {
761
+ display: flex;
762
+ justify-content: space-between;
763
+ align-items: center;
764
+ font-size: var(--ztl-text-xs);
765
+ color: var(--ztl-text-muted);
766
+ }
767
+
768
+ /* Circular progress */
769
+ .ztl-progress-circle {
770
+ position: relative;
771
+ display: inline-flex;
772
+ align-items: center;
773
+ justify-content: center;
774
+ width: 80px;
775
+ height: 80px;
776
+ }
777
+
778
+ .ztl-progress-circle svg {
779
+ transform: rotate(-90deg);
780
+ position: absolute;
781
+ inset: 0;
782
+ }
783
+
784
+ .ztl-progress-circle-track { stroke: var(--ztl-border); fill: none; }
785
+ .ztl-progress-circle-fill {
786
+ stroke: var(--ztl-accent);
787
+ fill: none;
788
+ stroke-linecap: round;
789
+ transition: stroke-dashoffset 0.6s ease;
790
+ filter: drop-shadow(0 0 6px var(--ztl-accent));
791
+ }
792
+
793
+ .ztl-progress-circle-label {
794
+ font-size: var(--ztl-text-sm);
795
+ font-weight: 700;
796
+ font-family: var(--ztl-font-mono);
797
+ color: var(--ztl-text);
798
+ z-index: 1;
799
+ }
800
+
801
+ /* -----------------------------------------------------------------------------
802
+ 11. TOGGLE / SWITCH
803
+ ----------------------------------------------------------------------------- */
804
+ .ztl-switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; }
805
+ .ztl-switch input { display: none; }
806
+
807
+ .ztl-switch-track {
808
+ position: relative;
809
+ width: 44px;
810
+ height: 24px;
811
+ background: var(--ztl-surface-2);
812
+ border: 1px solid var(--ztl-border);
813
+ border-radius: var(--ztl-radius-full);
814
+ transition: var(--ztl-transition);
815
+ flex-shrink: 0;
816
+ }
817
+
818
+ .ztl-switch-track::after {
819
+ content: '';
820
+ position: absolute;
821
+ top: 3px;
822
+ right: 3px;
823
+ width: 16px; height: 16px;
824
+ background: var(--ztl-text-muted);
825
+ border-radius: 50%;
826
+ transition: var(--ztl-transition);
827
+ }
828
+
829
+ .ztl-switch input:checked + .ztl-switch-track {
830
+ background: rgba(0, 245, 160, 0.15);
831
+ border-color: var(--ztl-accent);
832
+ }
833
+
834
+ .ztl-switch input:checked + .ztl-switch-track::after {
835
+ right: auto;
836
+ left: 3px;
837
+ background: var(--ztl-accent);
838
+ box-shadow: var(--ztl-glow);
839
+ }
840
+
841
+ [dir="rtl"] .ztl-switch-track::after { right: auto; left: 3px; }
842
+ [dir="rtl"] .ztl-switch input:checked + .ztl-switch-track::after { left: auto; right: 3px; }
843
+
844
+ .ztl-switch-label { font-size: var(--ztl-text-sm); color: var(--ztl-text); }
845
+
846
+ /* Size variants */
847
+ .ztl-switch-sm .ztl-switch-track { width: 34px; height: 18px; }
848
+ .ztl-switch-sm .ztl-switch-track::after { width: 12px; height: 12px; }
849
+ .ztl-switch-lg .ztl-switch-track { width: 56px; height: 30px; }
850
+ .ztl-switch-lg .ztl-switch-track::after { width: 22px; height: 22px; }
851
+
852
+ /* -----------------------------------------------------------------------------
853
+ 12. CHECKBOX & RADIO
854
+ ----------------------------------------------------------------------------- */
855
+ .ztl-checkbox,
856
+ .ztl-radio {
857
+ display: inline-flex;
858
+ align-items: center;
859
+ gap: 8px;
860
+ cursor: pointer;
861
+ user-select: none;
862
+ }
863
+
864
+ .ztl-checkbox input,
865
+ .ztl-radio input { display: none; }
866
+
867
+ .ztl-checkbox-box {
868
+ width: 18px; height: 18px;
869
+ border-radius: 4px;
870
+ border: 1.5px solid var(--ztl-border-2);
871
+ background: var(--ztl-surface-2);
872
+ display: flex; align-items: center; justify-content: center;
873
+ transition: var(--ztl-transition);
874
+ flex-shrink: 0;
875
+ font-size: 11px;
876
+ font-weight: 900;
877
+ color: transparent;
878
+ }
879
+
880
+ .ztl-checkbox input:checked + .ztl-checkbox-box {
881
+ background: var(--ztl-accent);
882
+ border-color: var(--ztl-accent);
883
+ color: #050508;
884
+ box-shadow: var(--ztl-glow);
885
+ }
886
+
887
+ .ztl-radio-box {
888
+ width: 18px; height: 18px;
889
+ border-radius: 50%;
890
+ border: 1.5px solid var(--ztl-border-2);
891
+ background: var(--ztl-surface-2);
892
+ display: flex; align-items: center; justify-content: center;
893
+ transition: var(--ztl-transition);
894
+ flex-shrink: 0;
895
+ }
896
+
897
+ .ztl-radio input:checked + .ztl-radio-box { border-color: var(--ztl-accent); }
898
+
899
+ .ztl-radio input:checked + .ztl-radio-box::after {
900
+ content: '';
901
+ width: 8px; height: 8px;
902
+ background: var(--ztl-accent);
903
+ border-radius: 50%;
904
+ box-shadow: var(--ztl-glow);
905
+ }
906
+
907
+ .ztl-check-label { font-size: var(--ztl-text-sm); color: var(--ztl-text); }
908
+
909
+ /* Indeterminate */
910
+ .ztl-checkbox input:indeterminate + .ztl-checkbox-box {
911
+ background: var(--ztl-accent-2);
912
+ border-color: var(--ztl-accent-2);
913
+ color: #fff;
914
+ }
915
+
916
+ /* -----------------------------------------------------------------------------
917
+ 13. TABS
918
+ ----------------------------------------------------------------------------- */
919
+ .ztl-tabs { display: flex; flex-direction: column; }
920
+
921
+ .ztl-tabs-nav {
922
+ display: flex;
923
+ border-bottom: 1px solid var(--ztl-border);
924
+ overflow-x: auto;
925
+ }
926
+
927
+ .ztl-tabs-nav::-webkit-scrollbar { height: 0; }
928
+
929
+ .ztl-tab-btn {
930
+ padding: 10px 20px;
931
+ background: none;
932
+ border: none;
933
+ color: var(--ztl-text-muted);
934
+ font-family: var(--ztl-font-mono);
935
+ font-size: var(--ztl-text-xs);
936
+ cursor: pointer;
937
+ border-bottom: 2px solid transparent;
938
+ margin-bottom: -1px;
939
+ transition: var(--ztl-transition-fast);
940
+ white-space: nowrap;
941
+ letter-spacing: 1px;
942
+ }
943
+
944
+ .ztl-tab-btn:hover { color: var(--ztl-text); }
945
+ .ztl-tab-btn.ztl-active { color: var(--ztl-accent); border-bottom-color: var(--ztl-accent); }
946
+
947
+ .ztl-tab-panel { display: none; padding: 20px 0; }
948
+ .ztl-tab-panel.ztl-active { display: block; }
949
+
950
+ /* Pill tabs */
951
+ .ztl-tabs-pills .ztl-tabs-nav {
952
+ border-bottom: none;
953
+ gap: 4px;
954
+ background: var(--ztl-surface-2);
955
+ padding: 4px;
956
+ border-radius: var(--ztl-radius-sm);
957
+ display: inline-flex;
958
+ }
959
+
960
+ .ztl-tabs-pills .ztl-tab-btn {
961
+ border-bottom: none;
962
+ border-radius: var(--ztl-radius-sm);
963
+ margin-bottom: 0;
964
+ }
965
+
966
+ .ztl-tabs-pills .ztl-tab-btn.ztl-active {
967
+ background: var(--ztl-surface);
968
+ color: var(--ztl-text);
969
+ border-color: transparent;
970
+ box-shadow: var(--ztl-shadow-sm);
971
+ }
972
+
973
+ /* -----------------------------------------------------------------------------
974
+ 14. DROPDOWN
975
+ ----------------------------------------------------------------------------- */
976
+ .ztl-dropdown { position: relative; display: inline-block; }
977
+
978
+ .ztl-dropdown-menu {
979
+ position: absolute;
980
+ top: calc(100% + 8px);
981
+ left: 0;
982
+ min-width: 180px;
983
+ background: var(--ztl-surface);
984
+ border: 1px solid var(--ztl-border);
985
+ border-radius: var(--ztl-radius-sm);
986
+ overflow: hidden;
987
+ opacity: 0;
988
+ transform: translateY(-8px) scale(0.97);
989
+ pointer-events: none;
990
+ transition: var(--ztl-transition-fast);
991
+ z-index: var(--ztl-z-dropdown);
992
+ box-shadow: var(--ztl-shadow);
993
+ }
994
+
995
+ .ztl-dropdown-menu-right { left: auto; right: 0; }
996
+
997
+ .ztl-dropdown.ztl-open .ztl-dropdown-menu {
998
+ opacity: 1;
999
+ transform: translateY(0) scale(1);
1000
+ pointer-events: all;
1001
+ }
1002
+
1003
+ .ztl-dropdown-item {
1004
+ display: flex;
1005
+ align-items: center;
1006
+ gap: 10px;
1007
+ padding: 10px 14px;
1008
+ font-size: var(--ztl-text-sm);
1009
+ color: var(--ztl-text-muted);
1010
+ cursor: pointer;
1011
+ transition: var(--ztl-transition-fast);
1012
+ border: none;
1013
+ background: none;
1014
+ width: 100%;
1015
+ text-align: left;
1016
+ font-family: inherit;
1017
+ }
1018
+
1019
+ [dir="rtl"] .ztl-dropdown-item { text-align: right; }
1020
+
1021
+ .ztl-dropdown-item:hover { background: rgba(0, 245, 160, 0.05); color: var(--ztl-accent); }
1022
+ .ztl-dropdown-item-danger:hover { background: rgba(239, 68, 68, 0.06); color: #f87171; }
1023
+
1024
+ .ztl-dropdown-divider { height: 1px; background: var(--ztl-border); margin: 4px 0; }
1025
+ .ztl-dropdown-header { padding: 8px 14px; font-size: var(--ztl-text-xs); color: var(--ztl-text-muted); font-family: var(--ztl-font-mono); letter-spacing: 1px; }
1026
+
1027
+ /* -----------------------------------------------------------------------------
1028
+ 15. TABLE
1029
+ ----------------------------------------------------------------------------- */
1030
+ .ztl-table-wrap { overflow-x: auto; }
1031
+
1032
+ .ztl-table {
1033
+ width: 100%;
1034
+ border-collapse: collapse;
1035
+ font-size: var(--ztl-text-sm);
1036
+ }
1037
+
1038
+ .ztl-table th {
1039
+ background: var(--ztl-surface-2);
1040
+ padding: 12px 16px;
1041
+ text-align: left;
1042
+ font-size: var(--ztl-text-xs);
1043
+ font-family: var(--ztl-font-mono);
1044
+ letter-spacing: 1px;
1045
+ color: var(--ztl-text-muted);
1046
+ border-bottom: 1px solid var(--ztl-border);
1047
+ font-weight: 400;
1048
+ white-space: nowrap;
1049
+ }
1050
+
1051
+ [dir="rtl"] .ztl-table th { text-align: right; }
1052
+
1053
+ .ztl-table td {
1054
+ padding: 13px 16px;
1055
+ border-bottom: 1px solid var(--ztl-border);
1056
+ color: var(--ztl-text);
1057
+ transition: background 0.15s;
1058
+ }
1059
+
1060
+ .ztl-table tbody tr:hover td { background: rgba(0, 245, 160, 0.03); }
1061
+ .ztl-table tbody tr:last-child td { border-bottom: none; }
1062
+
1063
+ /* Striped */
1064
+ .ztl-table-striped tbody tr:nth-child(even) td { background: var(--ztl-surface-2); }
1065
+
1066
+ /* Compact */
1067
+ .ztl-table-sm th,
1068
+ .ztl-table-sm td { padding: 8px 12px; }
1069
+
1070
+ /* Bordered */
1071
+ .ztl-table-bordered td,
1072
+ .ztl-table-bordered th { border: 1px solid var(--ztl-border); }
1073
+
1074
+ /* Sortable th */
1075
+ .ztl-table th[data-sort] { cursor: pointer; }
1076
+ .ztl-table th[data-sort]:hover { color: var(--ztl-accent); }
1077
+
1078
+ /* -----------------------------------------------------------------------------
1079
+ 16. TOOLTIP
1080
+ ----------------------------------------------------------------------------- */
1081
+ [data-ztl-tip] { position: relative; }
1082
+
1083
+ [data-ztl-tip]::before {
1084
+ content: attr(data-ztl-tip);
1085
+ position: absolute;
1086
+ bottom: calc(100% + 8px);
1087
+ left: 50%;
1088
+ transform: translateX(-50%);
1089
+ background: var(--ztl-text);
1090
+ color: var(--ztl-bg);
1091
+ padding: 5px 10px;
1092
+ border-radius: var(--ztl-radius-sm);
1093
+ font-size: var(--ztl-text-xs);
1094
+ font-family: var(--ztl-font-mono);
1095
+ white-space: nowrap;
1096
+ opacity: 0;
1097
+ pointer-events: none;
1098
+ transition: var(--ztl-transition-fast);
1099
+ z-index: var(--ztl-z-tooltip);
1100
+ box-shadow: var(--ztl-shadow);
1101
+ }
1102
+
1103
+ [data-ztl-tip]::after {
1104
+ content: '';
1105
+ position: absolute;
1106
+ bottom: calc(100% + 3px);
1107
+ left: 50%;
1108
+ transform: translateX(-50%);
1109
+ border: 5px solid transparent;
1110
+ border-top-color: var(--ztl-text);
1111
+ opacity: 0;
1112
+ transition: var(--ztl-transition-fast);
1113
+ pointer-events: none;
1114
+ z-index: var(--ztl-z-tooltip);
1115
+ }
1116
+
1117
+ [data-ztl-tip]:hover::before,
1118
+ [data-ztl-tip]:hover::after { opacity: 1; }
1119
+
1120
+ /* Tooltip positions */
1121
+ [data-ztl-tip-pos="bottom"]::before { bottom: auto; top: calc(100% + 8px); }
1122
+ [data-ztl-tip-pos="bottom"]::after { bottom: auto; top: calc(100% + 3px); border-top-color: transparent; border-bottom-color: var(--ztl-text); }
1123
+ [data-ztl-tip-pos="right"]::before { bottom: auto; left: calc(100% + 8px); top: 50%; transform: translateY(-50%); }
1124
+ [data-ztl-tip-pos="left"]::before { bottom: auto; right: calc(100% + 8px); left: auto; top: 50%; transform: translateY(-50%); }
1125
+
1126
+ /* -----------------------------------------------------------------------------
1127
+ 17. MODAL
1128
+ ----------------------------------------------------------------------------- */
1129
+ .ztl-overlay {
1130
+ position: fixed;
1131
+ inset: 0;
1132
+ background: rgba(5, 5, 8, 0.82);
1133
+ backdrop-filter: blur(8px);
1134
+ -webkit-backdrop-filter: blur(8px);
1135
+ z-index: var(--ztl-z-modal);
1136
+ display: flex;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ padding: 20px;
1140
+ opacity: 0;
1141
+ pointer-events: none;
1142
+ transition: opacity 0.3s;
1143
+ }
1144
+
1145
+ .ztl-overlay.ztl-open {
1146
+ opacity: 1;
1147
+ pointer-events: all;
1148
+ }
1149
+
1150
+ .ztl-modal {
1151
+ background: var(--ztl-surface);
1152
+ border: 1px solid var(--ztl-border);
1153
+ border-radius: var(--ztl-radius-lg);
1154
+ width: 100%;
1155
+ max-width: 480px;
1156
+ transform: scale(0.92) translateY(16px);
1157
+ transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
1158
+ overflow: hidden;
1159
+ box-shadow: var(--ztl-shadow-lg);
1160
+ }
1161
+
1162
+ .ztl-overlay.ztl-open .ztl-modal {
1163
+ transform: scale(1) translateY(0);
1164
+ }
1165
+
1166
+ .ztl-modal-sm { max-width: 340px; }
1167
+ .ztl-modal-lg { max-width: 640px; }
1168
+ .ztl-modal-xl { max-width: 800px; }
1169
+ .ztl-modal-full { max-width: calc(100vw - 40px); max-height: calc(100vh - 40px); }
1170
+
1171
+ .ztl-modal-header {
1172
+ padding: 22px 24px 18px;
1173
+ border-bottom: 1px solid var(--ztl-border);
1174
+ display: flex;
1175
+ align-items: center;
1176
+ justify-content: space-between;
1177
+ gap: 12px;
1178
+ }
1179
+
1180
+ .ztl-modal-title { font-size: var(--ztl-text-lg); font-weight: 700; }
1181
+ .ztl-modal-body { padding: 22px 24px; max-height: 60vh; overflow-y: auto; }
1182
+ .ztl-modal-footer {
1183
+ padding: 16px 24px;
1184
+ border-top: 1px solid var(--ztl-border);
1185
+ display: flex;
1186
+ align-items: center;
1187
+ justify-content: flex-end;
1188
+ gap: 10px;
1189
+ }
1190
+
1191
+ /* -----------------------------------------------------------------------------
1192
+ 18. TOAST / SNACKBAR
1193
+ ----------------------------------------------------------------------------- */
1194
+ .ztl-toast-stack {
1195
+ position: fixed;
1196
+ z-index: var(--ztl-z-toast);
1197
+ display: flex;
1198
+ flex-direction: column;
1199
+ gap: 10px;
1200
+ pointer-events: none;
1201
+ }
1202
+
1203
+ .ztl-toast-stack-br { bottom: 24px; right: 24px; align-items: flex-end; }
1204
+ .ztl-toast-stack-bl { bottom: 24px; left: 24px; align-items: flex-start; }
1205
+ .ztl-toast-stack-tr { top: 24px; right: 24px; align-items: flex-end; }
1206
+ .ztl-toast-stack-tl { top: 24px; left: 24px; align-items: flex-start; }
1207
+ .ztl-toast-stack-tc { top: 24px; left: 50%; transform: translateX(-50%); align-items: center; }
1208
+
1209
+ .ztl-toast {
1210
+ background: var(--ztl-surface);
1211
+ border: 1px solid var(--ztl-border);
1212
+ border-radius: var(--ztl-radius-sm);
1213
+ padding: 13px 16px;
1214
+ display: flex;
1215
+ align-items: center;
1216
+ gap: 12px;
1217
+ box-shadow: var(--ztl-shadow);
1218
+ font-size: var(--ztl-text-sm);
1219
+ pointer-events: all;
1220
+ max-width: 340px;
1221
+ width: max-content;
1222
+ animation: ztl-toast-in 0.3s ease;
1223
+ }
1224
+
1225
+ .ztl-toast.ztl-removing { animation: ztl-toast-out 0.3s ease forwards; }
1226
+
1227
+ .ztl-toast-icon { font-size: 18px; flex-shrink: 0; }
1228
+ .ztl-toast-text { flex: 1; }
1229
+ .ztl-toast-close {
1230
+ background: none; border: none;
1231
+ color: var(--ztl-text-muted);
1232
+ cursor: pointer; font-size: 16px;
1233
+ line-height: 1; padding: 2px;
1234
+ flex-shrink: 0;
1235
+ transition: color 0.2s;
1236
+ }
1237
+ .ztl-toast-close:hover { color: var(--ztl-text); }
1238
+
1239
+ .ztl-toast-success { border-right: 3px solid var(--ztl-success); }
1240
+ .ztl-toast-danger { border-right: 3px solid var(--ztl-danger); }
1241
+ .ztl-toast-warning { border-right: 3px solid var(--ztl-warning); }
1242
+ .ztl-toast-info { border-right: 3px solid var(--ztl-info); }
1243
+
1244
+ /* Progress bar on toast */
1245
+ .ztl-toast-progress {
1246
+ position: absolute;
1247
+ bottom: 0; left: 0;
1248
+ height: 2px;
1249
+ background: var(--ztl-accent);
1250
+ border-radius: 0 0 var(--ztl-radius-sm) var(--ztl-radius-sm);
1251
+ animation: ztl-toast-progress linear forwards;
1252
+ }
1253
+
1254
+ /* -----------------------------------------------------------------------------
1255
+ 19. LOADER / SPINNER
1256
+ ----------------------------------------------------------------------------- */
1257
+ .ztl-spinner {
1258
+ display: inline-block;
1259
+ border: 3px solid var(--ztl-border);
1260
+ border-top-color: var(--ztl-accent);
1261
+ border-radius: 50%;
1262
+ animation: ztl-spin 0.8s linear infinite;
1263
+ }
1264
+
1265
+ .ztl-spinner-xs { width: 16px; height: 16px; border-width: 2px; }
1266
+ .ztl-spinner-sm { width: 22px; height: 22px; border-width: 2px; }
1267
+ .ztl-spinner-md { width: 32px; height: 32px; }
1268
+ .ztl-spinner-lg { width: 48px; height: 48px; border-width: 4px; }
1269
+
1270
+ .ztl-spinner-purple { border-top-color: var(--ztl-accent-2); }
1271
+ .ztl-spinner-warning { border-top-color: var(--ztl-warning); }
1272
+
1273
+ /* Dots loader */
1274
+ .ztl-dots {
1275
+ display: inline-flex;
1276
+ gap: 6px;
1277
+ align-items: center;
1278
+ }
1279
+
1280
+ .ztl-dot {
1281
+ width: 8px; height: 8px;
1282
+ background: var(--ztl-accent);
1283
+ border-radius: 50%;
1284
+ animation: ztl-dot-bounce 1.2s ease infinite;
1285
+ }
1286
+
1287
+ .ztl-dot:nth-child(2) { animation-delay: 0.2s; }
1288
+ .ztl-dot:nth-child(3) { animation-delay: 0.4s; }
1289
+
1290
+ /* Pulse loader */
1291
+ .ztl-pulse {
1292
+ display: inline-block;
1293
+ width: 32px; height: 32px;
1294
+ background: var(--ztl-accent);
1295
+ border-radius: 50%;
1296
+ animation: ztl-pulse-ring 1.5s ease infinite;
1297
+ }
1298
+
1299
+ /* Skeleton */
1300
+ .ztl-skeleton {
1301
+ background: linear-gradient(
1302
+ 90deg,
1303
+ var(--ztl-surface-2) 25%,
1304
+ var(--ztl-surface-3) 50%,
1305
+ var(--ztl-surface-2) 75%
1306
+ );
1307
+ background-size: 200% 100%;
1308
+ animation: ztl-shimmer 1.5s infinite;
1309
+ border-radius: var(--ztl-radius-sm);
1310
+ }
1311
+
1312
+ .ztl-skeleton-text { height: 14px; width: 100%; }
1313
+ .ztl-skeleton-title { height: 22px; width: 60%; }
1314
+ .ztl-skeleton-avatar { border-radius: 50%; }
1315
+ .ztl-skeleton-card { height: 160px; border-radius: var(--ztl-radius); }
1316
+
1317
+ /* Bar loader */
1318
+ .ztl-bar-loader {
1319
+ width: 100%;
1320
+ height: 3px;
1321
+ background: var(--ztl-border);
1322
+ border-radius: var(--ztl-radius-full);
1323
+ overflow: hidden;
1324
+ }
1325
+
1326
+ .ztl-bar-loader::after {
1327
+ content: '';
1328
+ display: block;
1329
+ height: 100%;
1330
+ background: var(--ztl-accent);
1331
+ border-radius: var(--ztl-radius-full);
1332
+ animation: ztl-bar-slide 1.6s ease infinite;
1333
+ width: 40%;
1334
+ }
1335
+
1336
+ /* -----------------------------------------------------------------------------
1337
+ 20. TIMELINE
1338
+ ----------------------------------------------------------------------------- */
1339
+ .ztl-timeline {
1340
+ display: flex;
1341
+ flex-direction: column;
1342
+ position: relative;
1343
+ padding-right: 12px;
1344
+ }
1345
+
1346
+ .ztl-timeline::before {
1347
+ content: '';
1348
+ position: absolute;
1349
+ right: 11px;
1350
+ top: 0; bottom: 0;
1351
+ width: 1px;
1352
+ background: var(--ztl-border);
1353
+ }
1354
+
1355
+ [dir="rtl"] .ztl-timeline { padding-right: 0; padding-left: 12px; }
1356
+ [dir="rtl"] .ztl-timeline::before { right: auto; left: 11px; }
1357
+
1358
+ .ztl-tl-item {
1359
+ display: flex;
1360
+ gap: 20px;
1361
+ padding-bottom: 24px;
1362
+ position: relative;
1363
+ }
1364
+
1365
+ .ztl-tl-dot {
1366
+ width: 24px; height: 24px;
1367
+ border-radius: 50%;
1368
+ background: var(--ztl-surface-2);
1369
+ border: 2px solid var(--ztl-border);
1370
+ display: flex; align-items: center; justify-content: center;
1371
+ flex-shrink: 0;
1372
+ z-index: 1;
1373
+ font-size: var(--ztl-text-xs);
1374
+ font-weight: 700;
1375
+ transition: var(--ztl-transition);
1376
+ }
1377
+
1378
+ .ztl-tl-dot.ztl-active {
1379
+ background: var(--ztl-accent);
1380
+ border-color: var(--ztl-accent);
1381
+ color: #050508;
1382
+ box-shadow: var(--ztl-glow);
1383
+ }
1384
+
1385
+ .ztl-tl-item:hover .ztl-tl-dot { border-color: var(--ztl-accent); }
1386
+
1387
+ .ztl-tl-content { flex: 1; padding-top: 2px; }
1388
+ .ztl-tl-title { font-size: var(--ztl-text-sm); font-weight: 600; margin-bottom: 4px; }
1389
+ .ztl-tl-text { font-size: var(--ztl-text-xs); color: var(--ztl-text-muted); line-height: 1.6; }
1390
+ .ztl-tl-date { font-size: var(--ztl-text-xs); color: var(--ztl-text-muted); font-family: var(--ztl-font-mono); margin-top: 6px; }
1391
+
1392
+ /* -----------------------------------------------------------------------------
1393
+ 21. TAGS / CHIPS
1394
+ ----------------------------------------------------------------------------- */
1395
+ .ztl-tag {
1396
+ display: inline-flex;
1397
+ align-items: center;
1398
+ gap: 6px;
1399
+ padding: 5px 12px;
1400
+ border-radius: var(--ztl-radius-sm);
1401
+ background: var(--ztl-surface-2);
1402
+ border: 1px solid var(--ztl-border);
1403
+ font-size: var(--ztl-text-xs);
1404
+ color: var(--ztl-text);
1405
+ cursor: default;
1406
+ transition: var(--ztl-transition-fast);
1407
+ }
1408
+
1409
+ .ztl-tag-removable { cursor: pointer; }
1410
+ .ztl-tag-removable:hover { border-color: rgba(239, 68, 68, 0.4); color: #f87171; }
1411
+
1412
+ .ztl-tag-remove {
1413
+ color: var(--ztl-text-muted);
1414
+ line-height: 1;
1415
+ font-size: 14px;
1416
+ transition: color 0.2s;
1417
+ }
1418
+
1419
+ .ztl-tag-removable:hover .ztl-tag-remove { color: var(--ztl-danger); }
1420
+
1421
+ .ztl-tag-accent { background: rgba(0,245,160,0.1); border-color: rgba(0,245,160,0.2); color: var(--ztl-accent); }
1422
+ .ztl-tag-purple { background: rgba(124,58,237,0.1); border-color: rgba(124,58,237,0.2); color: #a78bfa; }
1423
+
1424
+ .ztl-tags-wrap { display: flex; flex-wrap: wrap; gap: 8px; }
1425
+
1426
+ /* Input tag */
1427
+ .ztl-tag-input-wrap {
1428
+ display: flex;
1429
+ flex-wrap: wrap;
1430
+ gap: 6px;
1431
+ align-items: center;
1432
+ background: var(--ztl-surface-2);
1433
+ border: 1px solid var(--ztl-border);
1434
+ border-radius: var(--ztl-radius-sm);
1435
+ padding: 8px 12px;
1436
+ cursor: text;
1437
+ min-height: 44px;
1438
+ transition: var(--ztl-transition);
1439
+ }
1440
+ .ztl-tag-input-wrap:focus-within { border-color: var(--ztl-accent); box-shadow: 0 0 0 3px rgba(0,245,160,0.1); }
1441
+ .ztl-tag-input-wrap input { background: none; border: none; outline: none; font-family: inherit; font-size: var(--ztl-text-sm); color: var(--ztl-text); min-width: 80px; flex: 1; }
1442
+
1443
+ /* -----------------------------------------------------------------------------
1444
+ 22. CODE BLOCK
1445
+ ----------------------------------------------------------------------------- */
1446
+ .ztl-code-block {
1447
+ background: #06060c;
1448
+ border: 1px solid var(--ztl-border);
1449
+ border-radius: var(--ztl-radius-sm);
1450
+ padding: 20px;
1451
+ font-family: var(--ztl-font-mono);
1452
+ font-size: 13px;
1453
+ line-height: 1.9;
1454
+ overflow-x: auto;
1455
+ position: relative;
1456
+ tab-size: 2;
1457
+ }
1458
+
1459
+ .ztl-code-block pre { margin: 0; }
1460
+ .ztl-code-block code { font-family: inherit; }
1461
+
1462
+ /* Syntax tokens */
1463
+ .ztl-kw { color: #c792ea; }
1464
+ .ztl-str { color: var(--ztl-accent); }
1465
+ .ztl-fn { color: #82aaff; }
1466
+ .ztl-cmt { color: var(--ztl-text-muted); font-style: italic; }
1467
+ .ztl-num { color: var(--ztl-accent-3); }
1468
+ .ztl-tag-html { color: #f07178; }
1469
+ .ztl-attr { color: #ffcb6b; }
1470
+
1471
+ .ztl-code-copy {
1472
+ position: absolute;
1473
+ top: 12px;
1474
+ right: 12px;
1475
+ background: var(--ztl-surface-2);
1476
+ border: 1px solid var(--ztl-border);
1477
+ color: var(--ztl-text-muted);
1478
+ padding: 4px 10px;
1479
+ border-radius: 4px;
1480
+ font-size: var(--ztl-text-xs);
1481
+ cursor: pointer;
1482
+ font-family: var(--ztl-font-mono);
1483
+ transition: var(--ztl-transition-fast);
1484
+ }
1485
+
1486
+ .ztl-code-copy:hover { color: var(--ztl-accent); border-color: var(--ztl-accent); }
1487
+
1488
+ /* Code header with filename */
1489
+ .ztl-code-header {
1490
+ display: flex;
1491
+ align-items: center;
1492
+ justify-content: space-between;
1493
+ padding: 10px 16px;
1494
+ background: var(--ztl-surface-2);
1495
+ border: 1px solid var(--ztl-border);
1496
+ border-bottom: none;
1497
+ border-radius: var(--ztl-radius-sm) var(--ztl-radius-sm) 0 0;
1498
+ font-family: var(--ztl-font-mono);
1499
+ font-size: var(--ztl-text-xs);
1500
+ color: var(--ztl-text-muted);
1501
+ }
1502
+
1503
+ .ztl-code-header + .ztl-code-block {
1504
+ border-top-left-radius: 0;
1505
+ border-top-right-radius: 0;
1506
+ }
1507
+
1508
+ /* Inline code */
1509
+ .ztl-code-inline {
1510
+ background: var(--ztl-surface-2);
1511
+ border: 1px solid var(--ztl-border);
1512
+ border-radius: 4px;
1513
+ padding: 1px 6px;
1514
+ font-family: var(--ztl-font-mono);
1515
+ font-size: 0.85em;
1516
+ color: var(--ztl-accent);
1517
+ }
1518
+
1519
+ /* -----------------------------------------------------------------------------
1520
+ 23. NAVBAR
1521
+ ----------------------------------------------------------------------------- */
1522
+ .ztl-navbar {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ gap: 16px;
1526
+ padding: 0 24px;
1527
+ height: 60px;
1528
+ background: var(--ztl-surface);
1529
+ border-bottom: 1px solid var(--ztl-border);
1530
+ position: sticky;
1531
+ top: 0;
1532
+ z-index: calc(var(--ztl-z-dropdown) - 1);
1533
+ }
1534
+
1535
+ .ztl-navbar-brand {
1536
+ font-family: var(--ztl-font-mono);
1537
+ font-size: 18px;
1538
+ font-weight: 700;
1539
+ color: var(--ztl-accent);
1540
+ text-decoration: none;
1541
+ text-shadow: var(--ztl-glow);
1542
+ white-space: nowrap;
1543
+ }
1544
+
1545
+ .ztl-navbar-nav {
1546
+ display: flex;
1547
+ align-items: center;
1548
+ gap: 4px;
1549
+ flex: 1;
1550
+ }
1551
+
1552
+ .ztl-nav-link {
1553
+ padding: 7px 14px;
1554
+ border-radius: var(--ztl-radius-sm);
1555
+ font-size: var(--ztl-text-sm);
1556
+ color: var(--ztl-text-muted);
1557
+ text-decoration: none;
1558
+ transition: var(--ztl-transition-fast);
1559
+ white-space: nowrap;
1560
+ }
1561
+
1562
+ .ztl-nav-link:hover,
1563
+ .ztl-nav-link.ztl-active { color: var(--ztl-accent); background: rgba(0, 245, 160, 0.07); }
1564
+
1565
+ .ztl-navbar-end { display: flex; align-items: center; gap: 10px; margin-right: auto; }
1566
+ [dir="ltr"] .ztl-navbar-end { margin-right: 0; margin-left: auto; }
1567
+
1568
+ /* -----------------------------------------------------------------------------
1569
+ 24. SIDEBAR
1570
+ ----------------------------------------------------------------------------- */
1571
+ .ztl-sidebar {
1572
+ position: fixed;
1573
+ top: 0; right: 0;
1574
+ width: 260px;
1575
+ height: 100vh;
1576
+ background: var(--ztl-surface);
1577
+ border-left: 1px solid var(--ztl-border);
1578
+ display: flex;
1579
+ flex-direction: column;
1580
+ overflow: hidden;
1581
+ z-index: 90;
1582
+ }
1583
+
1584
+ [dir="ltr"] .ztl-sidebar { right: auto; left: 0; border-left: none; border-right: 1px solid var(--ztl-border); }
1585
+
1586
+ .ztl-sidebar-header {
1587
+ padding: 22px 20px;
1588
+ border-bottom: 1px solid var(--ztl-border);
1589
+ flex-shrink: 0;
1590
+ }
1591
+
1592
+ .ztl-sidebar-body { flex: 1; overflow-y: auto; padding: 8px 0 20px; }
1593
+
1594
+ .ztl-sidebar-section {
1595
+ padding: 14px 20px 6px;
1596
+ font-size: var(--ztl-text-xs);
1597
+ font-family: var(--ztl-font-mono);
1598
+ letter-spacing: 2px;
1599
+ color: var(--ztl-text-muted);
1600
+ text-transform: uppercase;
1601
+ }
1602
+
1603
+ .ztl-sidebar-link {
1604
+ display: flex;
1605
+ align-items: center;
1606
+ gap: 10px;
1607
+ padding: 9px 20px;
1608
+ font-size: var(--ztl-text-sm);
1609
+ color: var(--ztl-text-muted);
1610
+ text-decoration: none;
1611
+ border-right: 2px solid transparent;
1612
+ transition: var(--ztl-transition-fast);
1613
+ cursor: pointer;
1614
+ }
1615
+
1616
+ [dir="ltr"] .ztl-sidebar-link { border-right: none; border-left: 2px solid transparent; }
1617
+
1618
+ .ztl-sidebar-link:hover,
1619
+ .ztl-sidebar-link.ztl-active {
1620
+ color: var(--ztl-accent);
1621
+ background: rgba(0, 245, 160, 0.05);
1622
+ border-right-color: var(--ztl-accent);
1623
+ }
1624
+
1625
+ [dir="ltr"] .ztl-sidebar-link:hover,
1626
+ [dir="ltr"] .ztl-sidebar-link.ztl-active { border-left-color: var(--ztl-accent); }
1627
+
1628
+ /* Sidebar with content area */
1629
+ .ztl-sidebar-layout {
1630
+ display: flex;
1631
+ min-height: 100vh;
1632
+ }
1633
+
1634
+ .ztl-sidebar-content {
1635
+ flex: 1;
1636
+ margin-right: 260px;
1637
+ overflow-x: hidden;
1638
+ }
1639
+
1640
+ [dir="ltr"] .ztl-sidebar-content { margin-right: 0; margin-left: 260px; }
1641
+
1642
+ /* -----------------------------------------------------------------------------
1643
+ 25. UTILITY CLASSES
1644
+ ----------------------------------------------------------------------------- */
1645
+ /* Display */
1646
+ .ztl-flex { display: flex; }
1647
+ .ztl-grid { display: grid; }
1648
+ .ztl-block { display: block; }
1649
+ .ztl-inline { display: inline; }
1650
+ .ztl-hidden { display: none; }
1651
+ .ztl-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }
1652
+
1653
+ /* Flex helpers */
1654
+ .ztl-items-center { align-items: center; }
1655
+ .ztl-items-start { align-items: flex-start; }
1656
+ .ztl-items-end { align-items: flex-end; }
1657
+ .ztl-justify-center { justify-content: center; }
1658
+ .ztl-justify-end { justify-content: flex-end; }
1659
+ .ztl-justify-between { justify-content: space-between; }
1660
+ .ztl-flex-wrap { flex-wrap: wrap; }
1661
+ .ztl-flex-col { flex-direction: column; }
1662
+ .ztl-flex-1 { flex: 1; }
1663
+ .ztl-gap-1 { gap: var(--ztl-space-1); }
1664
+ .ztl-gap-2 { gap: var(--ztl-space-2); }
1665
+ .ztl-gap-3 { gap: var(--ztl-space-3); }
1666
+ .ztl-gap-4 { gap: var(--ztl-space-4); }
1667
+ .ztl-gap-6 { gap: var(--ztl-space-6); }
1668
+ .ztl-gap-8 { gap: var(--ztl-space-8); }
1669
+
1670
+ /* Spacing */
1671
+ .ztl-p-0 { padding: 0; }
1672
+ .ztl-p-2 { padding: var(--ztl-space-2); }
1673
+ .ztl-p-4 { padding: var(--ztl-space-4); }
1674
+ .ztl-p-6 { padding: var(--ztl-space-6); }
1675
+ .ztl-p-8 { padding: var(--ztl-space-8); }
1676
+ .ztl-m-0 { margin: 0; }
1677
+ .ztl-m-auto { margin: auto; }
1678
+ .ztl-mt-4 { margin-top: var(--ztl-space-4); }
1679
+ .ztl-mb-4 { margin-bottom: var(--ztl-space-4); }
1680
+ .ztl-mt-6 { margin-top: var(--ztl-space-6); }
1681
+ .ztl-mb-6 { margin-bottom: var(--ztl-space-6); }
1682
+
1683
+ /* Sizing */
1684
+ .ztl-w-full { width: 100%; }
1685
+ .ztl-h-full { height: 100%; }
1686
+ .ztl-w-auto { width: auto; }
1687
+ .ztl-min-w-0 { min-width: 0; }
1688
+
1689
+ /* Divider */
1690
+ .ztl-divider {
1691
+ height: 1px;
1692
+ background: var(--ztl-border);
1693
+ margin: var(--ztl-space-4) 0;
1694
+ }
1695
+
1696
+ .ztl-divider-text {
1697
+ display: flex;
1698
+ align-items: center;
1699
+ gap: 12px;
1700
+ color: var(--ztl-text-muted);
1701
+ font-size: var(--ztl-text-xs);
1702
+ font-family: var(--ztl-font-mono);
1703
+ }
1704
+ .ztl-divider-text::before,
1705
+ .ztl-divider-text::after { content: ''; flex: 1; height: 1px; background: var(--ztl-border); }
1706
+
1707
+ /* Surface */
1708
+ .ztl-surface { background: var(--ztl-surface); }
1709
+ .ztl-surface-2 { background: var(--ztl-surface-2); }
1710
+
1711
+ /* Borders */
1712
+ .ztl-border { border: 1px solid var(--ztl-border); }
1713
+ .ztl-border-top { border-top: 1px solid var(--ztl-border); }
1714
+ .ztl-border-bottom { border-bottom: 1px solid var(--ztl-border); }
1715
+ .ztl-rounded { border-radius: var(--ztl-radius); }
1716
+ .ztl-rounded-sm { border-radius: var(--ztl-radius-sm); }
1717
+ .ztl-rounded-full { border-radius: var(--ztl-radius-full); }
1718
+
1719
+ /* Overflow */
1720
+ .ztl-overflow-hidden { overflow: hidden; }
1721
+ .ztl-overflow-auto { overflow: auto; }
1722
+
1723
+ /* Position */
1724
+ .ztl-relative { position: relative; }
1725
+ .ztl-absolute { position: absolute; }
1726
+ .ztl-fixed { position: fixed; }
1727
+ .ztl-sticky { position: sticky; top: 0; }
1728
+
1729
+ /* Text */
1730
+ .ztl-text-center { text-align: center; }
1731
+ .ztl-text-right { text-align: right; }
1732
+ .ztl-text-left { text-align: left; }
1733
+ .ztl-truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1734
+ .ztl-nowrap { white-space: nowrap; }
1735
+ .ztl-break-all { word-break: break-all; }
1736
+
1737
+ /* Opacity */
1738
+ .ztl-opacity-50 { opacity: 0.5; }
1739
+ .ztl-opacity-75 { opacity: 0.75; }
1740
+
1741
+ /* Cursor */
1742
+ .ztl-cursor-pointer { cursor: pointer; }
1743
+ .ztl-cursor-default { cursor: default; }
1744
+
1745
+ /* Glow effects */
1746
+ .ztl-glow { box-shadow: var(--ztl-glow); }
1747
+ .ztl-glow-text { text-shadow: var(--ztl-glow); }
1748
+ .ztl-glow-purple { box-shadow: var(--ztl-glow-2); }
1749
+
1750
+ /* Gradient text */
1751
+ .ztl-gradient-text {
1752
+ background: linear-gradient(135deg, var(--ztl-accent), var(--ztl-accent-2));
1753
+ -webkit-background-clip: text;
1754
+ background-clip: text;
1755
+ -webkit-text-fill-color: transparent;
1756
+ }
1757
+
1758
+ /* -----------------------------------------------------------------------------
1759
+ 26. ANIMATIONS
1760
+ ----------------------------------------------------------------------------- */
1761
+ @keyframes ztl-spin {
1762
+ to { transform: rotate(360deg); }
1763
+ }
1764
+
1765
+ @keyframes ztl-pulse-dot {
1766
+ 0%, 100% { opacity: 1; transform: scale(1); }
1767
+ 50% { opacity: 0.5; transform: scale(0.75); }
1768
+ }
1769
+
1770
+ @keyframes ztl-pulse-ring {
1771
+ 0% { transform: scale(0.8); opacity: 0.5; box-shadow: 0 0 0 0 rgba(0, 245, 160, 0.5); }
1772
+ 70% { transform: scale(1); opacity: 1; box-shadow: 0 0 0 14px rgba(0, 245, 160, 0); }
1773
+ 100% { transform: scale(0.8); opacity: 0.5; }
1774
+ }
1775
+
1776
+ @keyframes ztl-shimmer {
1777
+ 0% { background-position: 200% 0; }
1778
+ 100% { background-position: -200% 0; }
1779
+ }
1780
+
1781
+ @keyframes ztl-dot-bounce {
1782
+ 0%, 80%, 100% { transform: translateY(0); opacity: 0.3; }
1783
+ 40% { transform: translateY(-10px); opacity: 1; }
1784
+ }
1785
+
1786
+ @keyframes ztl-toast-in {
1787
+ from { transform: translateX(40px); opacity: 0; }
1788
+ to { transform: translateX(0); opacity: 1; }
1789
+ }
1790
+
1791
+ @keyframes ztl-toast-out {
1792
+ to { transform: translateX(40px); opacity: 0; }
1793
+ }
1794
+
1795
+ @keyframes ztl-toast-progress {
1796
+ from { width: 100%; }
1797
+ to { width: 0%; }
1798
+ }
1799
+
1800
+ @keyframes ztl-bar-slide {
1801
+ 0% { transform: translateX(-100%); }
1802
+ 100% { transform: translateX(350%); }
1803
+ }
1804
+
1805
+ @keyframes ztl-fade-in {
1806
+ from { opacity: 0; }
1807
+ to { opacity: 1; }
1808
+ }
1809
+
1810
+ @keyframes ztl-slide-up {
1811
+ from { transform: translateY(16px); opacity: 0; }
1812
+ to { transform: translateY(0); opacity: 1; }
1813
+ }
1814
+
1815
+ @keyframes ztl-scale-in {
1816
+ from { transform: scale(0.92); opacity: 0; }
1817
+ to { transform: scale(1); opacity: 1; }
1818
+ }
1819
+
1820
+ /* Animation utility classes */
1821
+ .ztl-animate-fade-in { animation: ztl-fade-in 0.4s ease; }
1822
+ .ztl-animate-slide-up { animation: ztl-slide-up 0.4s ease; }
1823
+ .ztl-animate-scale-in { animation: ztl-scale-in 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); }
1824
+ .ztl-animate-spin { animation: ztl-spin 1s linear infinite; }
1825
+
1826
+ /* Stagger animation helper */
1827
+ .ztl-stagger > * { animation: ztl-slide-up 0.4s ease both; }
1828
+ .ztl-stagger > *:nth-child(1) { animation-delay: 0.05s; }
1829
+ .ztl-stagger > *:nth-child(2) { animation-delay: 0.10s; }
1830
+ .ztl-stagger > *:nth-child(3) { animation-delay: 0.15s; }
1831
+ .ztl-stagger > *:nth-child(4) { animation-delay: 0.20s; }
1832
+ .ztl-stagger > *:nth-child(5) { animation-delay: 0.25s; }
1833
+
1834
+ /* Hover animations */
1835
+ .ztl-hover-lift:hover { transform: translateY(-4px); box-shadow: var(--ztl-shadow); }
1836
+ .ztl-hover-glow:hover { box-shadow: var(--ztl-glow); }
1837
+ .ztl-hover-scale:hover { transform: scale(1.03); }
1838
+
1839
+ /* Transition */
1840
+ .ztl-transition { transition: var(--ztl-transition); }
1841
+ .ztl-transition-fast { transition: var(--ztl-transition-fast); }
1842
+
1843
+ /* -----------------------------------------------------------------------------
1844
+ 27. RESPONSIVE
1845
+ ----------------------------------------------------------------------------- */
1846
+ @media (max-width: 1024px) {
1847
+ .ztl-cards-grid-4 { grid-template-columns: repeat(2, 1fr); }
1848
+ }
1849
+
1850
+ @media (max-width: 768px) {
1851
+ .ztl-sidebar { display: none; }
1852
+ .ztl-sidebar-content { margin-right: 0 !important; margin-left: 0 !important; }
1853
+ .ztl-cards-grid-2,
1854
+ .ztl-cards-grid-3,
1855
+ .ztl-cards-grid-4 { grid-template-columns: 1fr; }
1856
+ .ztl-form-grid-2,
1857
+ .ztl-form-grid-3 { grid-template-columns: 1fr; }
1858
+ .ztl-navbar-nav { display: none; }
1859
+ .ztl-toast { max-width: calc(100vw - 48px); }
1860
+ }
1861
+
1862
+ @media (max-width: 480px) {
1863
+ :root {
1864
+ --ztl-text-3xl: 28px;
1865
+ --ztl-text-2xl: 22px;
1866
+ }
1867
+ }
1868
+
1869
+ /* Print */
1870
+ @media print {
1871
+ .ztl-sidebar,
1872
+ .ztl-navbar,
1873
+ .ztl-toast-stack { display: none !important; }
1874
+ .ztl-sidebar-content { margin: 0 !important; }
1875
+ }