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