@terminal-blueprint/core 0.1.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/index.css ADDED
@@ -0,0 +1,2389 @@
1
+ /* src/css/tokens.css */
2
+ :root,
3
+ :root[data-theme=dark] {
4
+ --tb-primary: #a7d9ef;
5
+ --tb-bg: #020617;
6
+ --tb-bg-surface: #0f172a;
7
+ --tb-bg-card: rgba(10, 20, 40, 0.85);
8
+ --tb-bg-card-hover: rgba(15, 28, 55, 0.9);
9
+ --tb-bg-input: rgba(15, 23, 42, 0.6);
10
+ --tb-line: rgba(167, 217, 239, 0.15);
11
+ --tb-line-bright: rgba(167, 217, 239, 0.35);
12
+ --tb-glow: rgba(167, 217, 239, 0.4);
13
+ --tb-font:
14
+ "Lexend",
15
+ "JetBrains Mono",
16
+ sans-serif;
17
+ --tb-error: #ef6b6b;
18
+ --tb-error-dim: rgba(239, 107, 107, 0.15);
19
+ --tb-success: #6bcfa0;
20
+ --tb-success-dim: rgba(107, 207, 160, 0.15);
21
+ --tb-warning: #e8c468;
22
+ --tb-warning-dim: rgba(232, 196, 104, 0.15);
23
+ --tb-info: #a7d9ef;
24
+ --tb-text-heading: #ffffff;
25
+ --tb-text-body: #cddbe4;
26
+ --tb-text-label: #9fc3d4;
27
+ --tb-text-muted: #7aaab9;
28
+ --tb-sp-1: 4px;
29
+ --tb-sp-2: 8px;
30
+ --tb-sp-3: 12px;
31
+ --tb-sp-4: 16px;
32
+ --tb-sp-6: 24px;
33
+ --tb-sp-8: 32px;
34
+ --tb-sp-10: 40px;
35
+ --tb-sp-12: 48px;
36
+ --tb-sp-16: 64px;
37
+ --tb-z-base: 0;
38
+ --tb-z-dropdown: 100;
39
+ --tb-z-sticky: 200;
40
+ --tb-z-fixed: 300;
41
+ --tb-z-modal-backdrop: 400;
42
+ --tb-z-modal: 500;
43
+ --tb-z-popover: 600;
44
+ --tb-z-tooltip: 700;
45
+ --tb-z-toast: 800;
46
+ --tb-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
47
+ --tb-ease-enter: cubic-bezier(0, 0, 0.2, 1);
48
+ --tb-ease-exit: cubic-bezier(0.4, 0, 1, 1);
49
+ --tb-duration-fast: 150ms;
50
+ --tb-duration-normal: 300ms;
51
+ --tb-duration-slow: 500ms;
52
+ }
53
+ :root[data-contrast=high],
54
+ :root[data-theme=dark][data-contrast=high] {
55
+ --tb-text-heading: #ffffff;
56
+ --tb-text-body: #d4ecf7;
57
+ --tb-text-label: #a7d9ef;
58
+ --tb-text-muted: #89b8cc;
59
+ }
60
+ :root[data-theme=light] {
61
+ }
62
+ :root[data-theme=light][data-contrast=high] {
63
+ }
64
+
65
+ /* src/css/base.css */
66
+ :root:has(.tb-root) {
67
+ scroll-behavior: smooth;
68
+ scrollbar-color: rgba(167, 217, 239, 0.2) var(--tb-bg);
69
+ }
70
+ :root:has(.tb-root) body {
71
+ margin: 0;
72
+ padding: 0;
73
+ background-color: var(--tb-bg);
74
+ overflow-x: hidden;
75
+ }
76
+ :root:has(.tb-root) ::-webkit-scrollbar {
77
+ width: 6px;
78
+ height: 6px;
79
+ }
80
+ :root:has(.tb-root) ::-webkit-scrollbar-track {
81
+ background: var(--tb-bg);
82
+ }
83
+ :root:has(.tb-root) ::-webkit-scrollbar-thumb {
84
+ background: rgba(167, 217, 239, 0.15);
85
+ border-radius: 0;
86
+ }
87
+ :root:has(.tb-root) ::-webkit-scrollbar-thumb:hover {
88
+ background: rgba(167, 217, 239, 0.3);
89
+ }
90
+ .tb-root *,
91
+ .tb-root *::before,
92
+ .tb-root *::after {
93
+ box-sizing: border-box;
94
+ }
95
+ .tb-root {
96
+ font-family: var(--tb-font);
97
+ background-color: var(--tb-bg);
98
+ color: var(--tb-text-body);
99
+ line-height: 1.6;
100
+ text-transform: uppercase;
101
+ letter-spacing: 0.1em;
102
+ min-height: 100vh;
103
+ background-image:
104
+ linear-gradient(rgba(167, 217, 239, 0.025) 1px, transparent 1px),
105
+ linear-gradient(
106
+ 90deg,
107
+ rgba(167, 217, 239, 0.025) 1px,
108
+ transparent 1px);
109
+ background-size: 40px 40px;
110
+ }
111
+ .tb-root a {
112
+ color: var(--tb-text-label);
113
+ text-decoration: none;
114
+ transition: text-shadow var(--tb-duration-normal) ease, color var(--tb-duration-normal) ease;
115
+ }
116
+ .tb-root a:hover {
117
+ color: var(--tb-text-heading);
118
+ text-shadow: 0 0 12px var(--tb-glow), 0 0 24px rgba(167, 217, 239, 0.2);
119
+ }
120
+ .tb-root h1,
121
+ .tb-root h2,
122
+ .tb-root h3,
123
+ .tb-root h4,
124
+ .tb-root h5,
125
+ .tb-root h6 {
126
+ color: var(--tb-text-heading);
127
+ }
128
+ .tb-root input,
129
+ .tb-root textarea,
130
+ .tb-root select {
131
+ text-transform: none;
132
+ }
133
+ .tb-root *:focus-visible {
134
+ outline: 2px solid var(--tb-primary);
135
+ outline-offset: 2px;
136
+ }
137
+ .tb-root :focus:not(:focus-visible) {
138
+ outline: none;
139
+ }
140
+ .tb-root input:focus-visible,
141
+ .tb-root textarea:focus-visible,
142
+ .tb-root select:focus-visible {
143
+ outline: none;
144
+ border-color: var(--tb-primary) !important;
145
+ box-shadow: 0 0 0 3px rgba(167, 217, 239, 0.15), 0 0 15px rgba(167, 217, 239, 0.1);
146
+ }
147
+ @media (prefers-reduced-motion: reduce) {
148
+ .tb-root *,
149
+ .tb-root *::before,
150
+ .tb-root *::after {
151
+ animation-duration: 0.01ms !important;
152
+ animation-iteration-count: 1 !important;
153
+ transition-duration: 0.01ms !important;
154
+ }
155
+ }
156
+ @media (max-width: 480px) {
157
+ .tb-root {
158
+ letter-spacing: 0.05em;
159
+ line-height: 1.5;
160
+ }
161
+ }
162
+
163
+ /* src/css/components/button.css */
164
+ .tb-btn {
165
+ display: inline-flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ gap: var(--tb-sp-2);
169
+ height: 44px;
170
+ padding: 0 var(--tb-sp-6);
171
+ font-family: var(--tb-font);
172
+ font-size: 0.6rem;
173
+ font-weight: 500;
174
+ letter-spacing: 0.4em;
175
+ text-transform: uppercase;
176
+ text-decoration: none;
177
+ border: 1px solid var(--tb-line-bright);
178
+ background: transparent;
179
+ color: var(--tb-primary);
180
+ cursor: pointer;
181
+ transition: all var(--tb-duration-normal) var(--tb-ease-standard);
182
+ position: relative;
183
+ white-space: nowrap;
184
+ }
185
+ .tb-btn:hover {
186
+ border-color: var(--tb-primary);
187
+ color: #fff;
188
+ text-shadow: 0 0 15px var(--tb-glow);
189
+ background: rgba(167, 217, 239, 0.05);
190
+ }
191
+ .tb-btn:active {
192
+ transform: scale(0.97);
193
+ text-shadow: 0 0 20px var(--tb-glow);
194
+ }
195
+ .tb-btn--primary {
196
+ background: var(--tb-primary);
197
+ color: var(--tb-bg);
198
+ border-color: var(--tb-primary);
199
+ }
200
+ .tb-btn--primary:hover {
201
+ background: #fff;
202
+ color: var(--tb-bg);
203
+ text-shadow: none;
204
+ box-shadow: 0 0 20px var(--tb-glow);
205
+ }
206
+ .tb-btn--secondary {
207
+ border-color: var(--tb-line-bright);
208
+ color: var(--tb-primary);
209
+ }
210
+ .tb-btn--secondary:hover {
211
+ border-color: var(--tb-primary);
212
+ color: #fff;
213
+ text-shadow: 0 0 15px var(--tb-glow);
214
+ background: rgba(167, 217, 239, 0.05);
215
+ }
216
+ .tb-btn--danger {
217
+ border-color: rgba(239, 107, 107, 0.4);
218
+ color: var(--tb-error);
219
+ }
220
+ .tb-btn--danger:hover {
221
+ border-color: var(--tb-error);
222
+ color: #fff;
223
+ text-shadow: 0 0 15px rgba(239, 107, 107, 0.4);
224
+ background: rgba(239, 107, 107, 0.08);
225
+ }
226
+ .tb-btn--ghost {
227
+ border-color: transparent;
228
+ background: transparent;
229
+ color: var(--tb-text-label);
230
+ }
231
+ .tb-btn--ghost:hover {
232
+ border-color: var(--tb-line);
233
+ color: var(--tb-primary);
234
+ background: rgba(167, 217, 239, 0.03);
235
+ }
236
+ .tb-btn[disabled],
237
+ .tb-btn--disabled {
238
+ opacity: 0.25;
239
+ cursor: not-allowed;
240
+ pointer-events: none;
241
+ }
242
+ .tb-btn--loading {
243
+ pointer-events: none;
244
+ color: transparent !important;
245
+ position: relative;
246
+ }
247
+ .tb-btn--loading::before,
248
+ .tb-btn--loading::after {
249
+ content: "";
250
+ position: absolute;
251
+ top: 50%;
252
+ left: 50%;
253
+ border-style: solid;
254
+ border-color: var(--tb-primary);
255
+ }
256
+ .tb-btn--loading::before {
257
+ width: 14px;
258
+ height: 14px;
259
+ margin: -7px 0 0 -7px;
260
+ border-width: 1.5px;
261
+ animation: tb-spin-cw 2.5s linear infinite;
262
+ }
263
+ .tb-btn--loading::after {
264
+ width: 8px;
265
+ height: 8px;
266
+ margin: -4px 0 0 -4px;
267
+ border-width: 1px;
268
+ opacity: 0.45;
269
+ animation: tb-spin-ccw 1.6s linear infinite;
270
+ }
271
+ .tb-btn--primary.tb-btn--loading::before,
272
+ .tb-btn--primary.tb-btn--loading::after {
273
+ border-color: var(--tb-bg);
274
+ }
275
+ .tb-btn--loading-text {
276
+ color: inherit;
277
+ }
278
+ .tb-btn__icon {
279
+ display: inline-flex;
280
+ align-items: center;
281
+ flex-shrink: 0;
282
+ }
283
+ .tb-btn__spinner {
284
+ position: absolute;
285
+ top: 50%;
286
+ left: 50%;
287
+ transform: translate(-50%, -50%);
288
+ width: 16px;
289
+ height: 16px;
290
+ }
291
+ .tb-btn__spinner .tb-btn__spinner-square {
292
+ position: absolute;
293
+ inset: 0;
294
+ border: 1.5px solid currentColor;
295
+ }
296
+ .tb-btn__spinner .tb-btn__spinner-square:nth-child(1) {
297
+ animation: tb-spin-cw 2s linear infinite;
298
+ }
299
+ .tb-btn__spinner .tb-btn__spinner-square:nth-child(2) {
300
+ animation: tb-spin-ccw 3s linear infinite;
301
+ }
302
+ .tb-btn__spinner .tb-btn__spinner-square:nth-child(3) {
303
+ animation: tb-spin-cw 4s linear infinite;
304
+ }
305
+ .tb-btn:focus-visible {
306
+ outline: 2px solid var(--tb-primary);
307
+ outline-offset: 2px;
308
+ }
309
+ .tb-btn--sm {
310
+ height: 32px;
311
+ padding: 0 var(--tb-sp-4);
312
+ font-size: 0.5rem;
313
+ }
314
+ .tb-btn--lg {
315
+ height: 52px;
316
+ padding: 0 var(--tb-sp-8);
317
+ font-size: 0.65rem;
318
+ }
319
+ @keyframes tb-spin-cw {
320
+ from {
321
+ transform: rotate(0deg);
322
+ }
323
+ to {
324
+ transform: rotate(360deg);
325
+ }
326
+ }
327
+ @keyframes tb-spin-ccw {
328
+ from {
329
+ transform: rotate(0deg);
330
+ }
331
+ to {
332
+ transform: rotate(-360deg);
333
+ }
334
+ }
335
+ @media (max-width: 480px) {
336
+ .tb-btn {
337
+ letter-spacing: 0.2em;
338
+ padding-left: var(--tb-sp-4);
339
+ padding-right: var(--tb-sp-4);
340
+ }
341
+ }
342
+
343
+ /* src/css/components/input.css */
344
+ .tb-label {
345
+ font-size: 0.55rem;
346
+ font-weight: 500;
347
+ letter-spacing: 0.4em;
348
+ text-transform: uppercase;
349
+ color: var(--tb-text-body);
350
+ }
351
+ .tb-label__required {
352
+ color: var(--tb-error);
353
+ margin-left: var(--tb-sp-1);
354
+ }
355
+ .tb-input {
356
+ height: 44px;
357
+ padding: 0 var(--tb-sp-4);
358
+ font-family: var(--tb-font);
359
+ font-size: 0.7rem;
360
+ font-weight: 400;
361
+ letter-spacing: 0.1em;
362
+ color: var(--tb-text-body);
363
+ background: var(--tb-bg-input);
364
+ border: 1px solid var(--tb-line);
365
+ transition: border-color var(--tb-duration-normal) ease, box-shadow var(--tb-duration-normal) ease;
366
+ }
367
+ .tb-input::placeholder {
368
+ color: var(--tb-text-muted);
369
+ text-transform: uppercase;
370
+ letter-spacing: 0.2em;
371
+ font-size: 0.6rem;
372
+ }
373
+ .tb-input:hover {
374
+ border-color: var(--tb-line-bright);
375
+ }
376
+ .tb-input:focus {
377
+ outline: none;
378
+ border-color: var(--tb-primary);
379
+ box-shadow: 0 0 0 3px rgba(167, 217, 239, 0.1), 0 0 20px rgba(167, 217, 239, 0.05);
380
+ }
381
+ .tb-input:focus-visible {
382
+ outline: none;
383
+ }
384
+ .tb-input--error {
385
+ border-color: rgba(239, 107, 107, 0.5) !important;
386
+ }
387
+ .tb-input--error:focus {
388
+ border-color: var(--tb-error) !important;
389
+ box-shadow: 0 0 0 3px rgba(239, 107, 107, 0.1), 0 0 20px rgba(239, 107, 107, 0.05);
390
+ }
391
+ .tb-input--success {
392
+ border-color: rgba(107, 207, 160, 0.5) !important;
393
+ }
394
+ .tb-input:disabled {
395
+ opacity: 0.3;
396
+ cursor: not-allowed;
397
+ background: rgba(15, 23, 42, 0.3);
398
+ }
399
+ .tb-input__error {
400
+ display: flex;
401
+ align-items: center;
402
+ gap: var(--tb-sp-2);
403
+ font-size: 0.5rem;
404
+ font-weight: 400;
405
+ letter-spacing: 0.2em;
406
+ text-transform: uppercase;
407
+ color: var(--tb-error);
408
+ }
409
+ .tb-input__hint {
410
+ font-size: 0.5rem;
411
+ font-weight: 400;
412
+ letter-spacing: 0.15em;
413
+ text-transform: uppercase;
414
+ color: var(--tb-text-muted);
415
+ }
416
+ .tb-input--sm {
417
+ height: 32px;
418
+ font-size: 0.6rem;
419
+ padding: 0 var(--tb-sp-3);
420
+ }
421
+ .tb-input--lg {
422
+ height: 52px;
423
+ font-size: 0.8rem;
424
+ padding: 0 var(--tb-sp-6);
425
+ }
426
+ .tb-form-group {
427
+ display: flex;
428
+ flex-direction: column;
429
+ gap: 6px;
430
+ }
431
+ .tb-input-wrapper {
432
+ position: relative;
433
+ display: flex;
434
+ align-items: center;
435
+ }
436
+ .tb-input-wrapper .tb-input {
437
+ width: 100%;
438
+ }
439
+ .tb-input-wrapper--icon-left .tb-input {
440
+ padding-left: 36px;
441
+ }
442
+ .tb-input-wrapper--icon-right .tb-input {
443
+ padding-right: 36px;
444
+ }
445
+ .tb-input__icon {
446
+ position: absolute;
447
+ display: flex;
448
+ align-items: center;
449
+ pointer-events: none;
450
+ color: var(--tb-text-muted);
451
+ }
452
+ .tb-input-wrapper--icon-left .tb-input__icon {
453
+ left: 10px;
454
+ }
455
+ .tb-input-wrapper--icon-right .tb-input__icon {
456
+ right: 10px;
457
+ }
458
+
459
+ /* src/css/components/textarea.css */
460
+ .tb-textarea {
461
+ min-height: 100px;
462
+ padding: var(--tb-sp-3) var(--tb-sp-4);
463
+ resize: vertical;
464
+ font-family: var(--tb-font);
465
+ font-size: 0.7rem;
466
+ font-weight: 400;
467
+ letter-spacing: 0.1em;
468
+ color: var(--tb-primary);
469
+ background: var(--tb-bg-input);
470
+ border: 1px solid var(--tb-line);
471
+ transition: border-color var(--tb-duration-normal) ease, box-shadow var(--tb-duration-normal) ease;
472
+ line-height: 1.8;
473
+ }
474
+ .tb-textarea::placeholder {
475
+ color: var(--tb-text-muted);
476
+ text-transform: uppercase;
477
+ letter-spacing: 0.2em;
478
+ font-size: 0.6rem;
479
+ }
480
+ .tb-textarea:hover {
481
+ border-color: var(--tb-line-bright);
482
+ }
483
+ .tb-textarea:focus {
484
+ outline: none;
485
+ border-color: var(--tb-primary);
486
+ box-shadow: 0 0 0 3px rgba(167, 217, 239, 0.1), 0 0 20px rgba(167, 217, 239, 0.05);
487
+ }
488
+ .tb-textarea--error {
489
+ border-color: rgba(239, 107, 107, 0.5) !important;
490
+ }
491
+ .tb-textarea--error:focus {
492
+ border-color: var(--tb-error) !important;
493
+ box-shadow: 0 0 0 3px rgba(239, 107, 107, 0.1), 0 0 20px rgba(239, 107, 107, 0.05);
494
+ }
495
+ .tb-textarea:disabled {
496
+ opacity: 0.3;
497
+ cursor: not-allowed;
498
+ background: rgba(15, 23, 42, 0.3);
499
+ }
500
+ .tb-textarea--sm {
501
+ min-height: 64px;
502
+ font-size: 0.6rem;
503
+ padding: var(--tb-sp-2) var(--tb-sp-3);
504
+ }
505
+ .tb-textarea--lg {
506
+ min-height: 160px;
507
+ font-size: 0.8rem;
508
+ padding: var(--tb-sp-4) var(--tb-sp-6);
509
+ }
510
+ .tb-textarea__error {
511
+ color: var(--tb-error);
512
+ font-size: 0.75rem;
513
+ letter-spacing: 0.05em;
514
+ text-transform: uppercase;
515
+ }
516
+ .tb-textarea__hint {
517
+ color: var(--tb-text-muted);
518
+ font-size: 0.75rem;
519
+ letter-spacing: 0.05em;
520
+ text-transform: uppercase;
521
+ }
522
+
523
+ /* src/css/components/card.css */
524
+ .tb-card {
525
+ position: relative;
526
+ border: 1px solid var(--tb-line);
527
+ background: var(--tb-bg-card);
528
+ padding: var(--tb-sp-6);
529
+ transition: border-color var(--tb-duration-normal) ease, background var(--tb-duration-normal) ease;
530
+ }
531
+ .tb-card--hoverable:hover {
532
+ border-color: var(--tb-line-bright);
533
+ background: var(--tb-bg-card-hover);
534
+ }
535
+ .tb-card__header {
536
+ display: flex;
537
+ align-items: center;
538
+ gap: var(--tb-sp-3);
539
+ margin-bottom: var(--tb-sp-6);
540
+ }
541
+ .tb-card__title {
542
+ font-size: 0.75rem;
543
+ font-weight: 700;
544
+ letter-spacing: 0.1em;
545
+ text-transform: uppercase;
546
+ color: var(--tb-text-heading);
547
+ margin-bottom: var(--tb-sp-3);
548
+ }
549
+ .tb-card__body {
550
+ margin-bottom: var(--tb-sp-6);
551
+ }
552
+ .tb-card__body p {
553
+ font-size: 0.6rem;
554
+ letter-spacing: 0.12em;
555
+ color: var(--tb-text-body);
556
+ line-height: 2;
557
+ text-transform: uppercase;
558
+ font-weight: 400;
559
+ }
560
+ .tb-card__tags {
561
+ display: flex;
562
+ flex-wrap: wrap;
563
+ gap: var(--tb-sp-2);
564
+ margin-top: var(--tb-sp-4);
565
+ }
566
+ .tb-card__footer {
567
+ display: flex;
568
+ gap: var(--tb-sp-4);
569
+ padding-top: var(--tb-sp-4);
570
+ border-top: 1px solid var(--tb-line);
571
+ margin-top: var(--tb-sp-6);
572
+ }
573
+ .tb-card__footer a {
574
+ font-size: 0.55rem;
575
+ letter-spacing: 0.2em;
576
+ color: var(--tb-text-muted);
577
+ display: flex;
578
+ align-items: center;
579
+ gap: var(--tb-sp-1);
580
+ transition: color var(--tb-duration-fast) var(--tb-ease-standard);
581
+ }
582
+ .tb-card__footer a:hover {
583
+ color: var(--tb-primary);
584
+ }
585
+ .tb-card--bracketed {
586
+ position: relative;
587
+ }
588
+ .tb-card--bracketed .tb-card__bracket {
589
+ position: absolute;
590
+ width: 18px;
591
+ height: 18px;
592
+ border-color: var(--tb-primary);
593
+ border-style: solid;
594
+ border-width: 0;
595
+ opacity: 0;
596
+ transition: transform var(--tb-duration-normal) var(--tb-ease-standard), opacity var(--tb-duration-normal) ease;
597
+ }
598
+ .tb-card--bracketed .tb-card__bracket--tl {
599
+ top: -1px;
600
+ left: -1px;
601
+ border-top-width: 2px;
602
+ border-left-width: 2px;
603
+ }
604
+ .tb-card--bracketed .tb-card__bracket--tr {
605
+ top: -1px;
606
+ right: -1px;
607
+ border-top-width: 2px;
608
+ border-right-width: 2px;
609
+ }
610
+ .tb-card--bracketed .tb-card__bracket--bl {
611
+ bottom: -1px;
612
+ left: -1px;
613
+ border-bottom-width: 2px;
614
+ border-left-width: 2px;
615
+ }
616
+ .tb-card--bracketed .tb-card__bracket--br {
617
+ bottom: -1px;
618
+ right: -1px;
619
+ border-bottom-width: 2px;
620
+ border-right-width: 2px;
621
+ }
622
+ .tb-card--bracketed:hover .tb-card__bracket {
623
+ opacity: 1;
624
+ }
625
+ .tb-card--bracketed:hover .tb-card__bracket--tl {
626
+ transform: translate(-6px, -6px);
627
+ }
628
+ .tb-card--bracketed:hover .tb-card__bracket--tr {
629
+ transform: translate(6px, -6px);
630
+ }
631
+ .tb-card--bracketed:hover .tb-card__bracket--bl {
632
+ transform: translate(-6px, 6px);
633
+ }
634
+ .tb-card--bracketed:hover .tb-card__bracket--br {
635
+ transform: translate(6px, 6px);
636
+ }
637
+ .tb-card--pulse .tb-card__bracket {
638
+ animation: tb-bracket-glow 2.5s ease-in-out infinite;
639
+ }
640
+ .tb-card--pulse .tb-card__bracket--tr {
641
+ animation-delay: 0.15s;
642
+ }
643
+ .tb-card--pulse .tb-card__bracket--bl {
644
+ animation-delay: 0.3s;
645
+ }
646
+ .tb-card--pulse .tb-card__bracket--br {
647
+ animation-delay: 0.45s;
648
+ }
649
+
650
+ /* src/css/components/badge.css */
651
+ .tb-badge {
652
+ display: inline-flex;
653
+ align-items: center;
654
+ gap: var(--tb-sp-2);
655
+ padding: var(--tb-sp-1) var(--tb-sp-3);
656
+ font-size: 0.5rem;
657
+ font-weight: 500;
658
+ letter-spacing: 0.35em;
659
+ text-transform: uppercase;
660
+ border: 1px solid;
661
+ border-color: var(--tb-line-bright);
662
+ color: var(--tb-text-body);
663
+ }
664
+ .tb-badge--success {
665
+ border-color: rgba(107, 207, 160, 0.3);
666
+ color: var(--tb-success);
667
+ }
668
+ .tb-badge--warning {
669
+ border-color: rgba(232, 196, 104, 0.3);
670
+ color: var(--tb-warning);
671
+ }
672
+ .tb-badge--error {
673
+ border-color: rgba(239, 107, 107, 0.3);
674
+ color: var(--tb-error);
675
+ }
676
+ .tb-badge--filled {
677
+ background: var(--tb-primary);
678
+ color: var(--tb-bg);
679
+ border-color: var(--tb-primary);
680
+ }
681
+ .tb-badge__dot {
682
+ width: 6px;
683
+ height: 6px;
684
+ border-radius: 50%;
685
+ background: currentColor;
686
+ flex-shrink: 0;
687
+ }
688
+ .tb-badge--pulse .tb-badge__dot {
689
+ animation: tb-pulse 2.5s ease-in-out infinite;
690
+ }
691
+ @keyframes tb-pulse {
692
+ 0%, 100% {
693
+ opacity: 1;
694
+ }
695
+ 50% {
696
+ opacity: 0.2;
697
+ }
698
+ }
699
+
700
+ /* src/css/components/tag.css */
701
+ .tb-tag {
702
+ display: inline-flex;
703
+ align-items: center;
704
+ gap: var(--tb-sp-1);
705
+ padding: var(--tb-sp-1) var(--tb-sp-3);
706
+ font-size: 0.5rem;
707
+ font-weight: 400;
708
+ letter-spacing: 0.25em;
709
+ text-transform: uppercase;
710
+ border: 1px solid var(--tb-line);
711
+ color: var(--tb-text-label);
712
+ transition: color var(--tb-duration-fast) ease, border-color var(--tb-duration-fast) ease;
713
+ }
714
+ .tb-tag:hover {
715
+ color: var(--tb-text-heading);
716
+ border-color: var(--tb-line-bright);
717
+ }
718
+
719
+ /* src/css/components/title-line.css */
720
+ .tb-title-line {
721
+ display: flex;
722
+ align-items: center;
723
+ gap: var(--tb-sp-6);
724
+ margin-bottom: var(--tb-sp-10);
725
+ }
726
+ .tb-title-line::before,
727
+ .tb-title-line::after {
728
+ content: "";
729
+ height: 1px;
730
+ flex: 1;
731
+ background: var(--tb-line);
732
+ }
733
+ .tb-title-line__label {
734
+ font-size: 0.65rem;
735
+ font-weight: 400;
736
+ letter-spacing: 0.5em;
737
+ text-transform: uppercase;
738
+ color: var(--tb-text-heading);
739
+ white-space: nowrap;
740
+ }
741
+ @media (max-width: 480px) {
742
+ .tb-title-line__label {
743
+ letter-spacing: 0.2em;
744
+ }
745
+ }
746
+
747
+ /* src/css/components/brackets.css */
748
+ .tb-brackets {
749
+ position: relative;
750
+ }
751
+ .tb-brackets__corner {
752
+ position: absolute;
753
+ width: 18px;
754
+ height: 18px;
755
+ border-color: var(--tb-primary);
756
+ border-style: solid;
757
+ border-width: 0;
758
+ opacity: 0;
759
+ transition: transform var(--tb-duration-normal) var(--tb-ease-standard), opacity var(--tb-duration-normal) ease;
760
+ }
761
+ .tb-brackets__corner--tl {
762
+ top: -1px;
763
+ left: -1px;
764
+ border-top-width: 2px;
765
+ border-left-width: 2px;
766
+ }
767
+ .tb-brackets__corner--tr {
768
+ top: -1px;
769
+ right: -1px;
770
+ border-top-width: 2px;
771
+ border-right-width: 2px;
772
+ }
773
+ .tb-brackets__corner--bl {
774
+ bottom: -1px;
775
+ left: -1px;
776
+ border-bottom-width: 2px;
777
+ border-left-width: 2px;
778
+ }
779
+ .tb-brackets__corner--br {
780
+ bottom: -1px;
781
+ right: -1px;
782
+ border-bottom-width: 2px;
783
+ border-right-width: 2px;
784
+ }
785
+ .tb-brackets:hover .tb-brackets__corner {
786
+ opacity: 1;
787
+ }
788
+ .tb-brackets:hover .tb-brackets__corner--tl {
789
+ transform: translate(-6px, -6px);
790
+ }
791
+ .tb-brackets:hover .tb-brackets__corner--tr {
792
+ transform: translate(6px, -6px);
793
+ }
794
+ .tb-brackets:hover .tb-brackets__corner--bl {
795
+ transform: translate(-6px, 6px);
796
+ }
797
+ .tb-brackets:hover .tb-brackets__corner--br {
798
+ transform: translate(6px, 6px);
799
+ }
800
+ .tb-brackets--pulse .tb-brackets__corner--tl,
801
+ .tb-brackets--pulse .tb-brackets__corner--tr,
802
+ .tb-brackets--pulse .tb-brackets__corner--bl,
803
+ .tb-brackets--pulse .tb-brackets__corner--br {
804
+ animation: tb-bracket-glow 2.5s ease-in-out infinite;
805
+ }
806
+ .tb-brackets--pulse .tb-brackets__corner--tr {
807
+ animation-delay: 0.15s;
808
+ }
809
+ .tb-brackets--pulse .tb-brackets__corner--bl {
810
+ animation-delay: 0.3s;
811
+ }
812
+ .tb-brackets--pulse .tb-brackets__corner--br {
813
+ animation-delay: 0.45s;
814
+ }
815
+ @keyframes tb-bracket-glow {
816
+ 0%, 100% {
817
+ border-color: var(--tb-primary);
818
+ opacity: 0.4;
819
+ filter: drop-shadow(0 0 0 transparent);
820
+ }
821
+ 50% {
822
+ border-color: #fff;
823
+ opacity: 1;
824
+ filter: drop-shadow(0 0 6px rgba(167, 217, 239, 0.5));
825
+ }
826
+ }
827
+
828
+ /* src/css/components/select.css */
829
+ .tb-select {
830
+ position: relative;
831
+ }
832
+ .tb-select__trigger {
833
+ width: 100%;
834
+ font-family: var(--tb-font);
835
+ font-size: 0.6rem;
836
+ letter-spacing: 0.2em;
837
+ text-transform: uppercase;
838
+ height: 44px;
839
+ padding: 0 var(--tb-sp-4);
840
+ background: var(--tb-bg-card);
841
+ border: 1px solid var(--tb-line);
842
+ color: var(--tb-primary);
843
+ cursor: pointer;
844
+ display: flex;
845
+ align-items: center;
846
+ justify-content: space-between;
847
+ transition: border-color var(--tb-duration-normal) ease;
848
+ }
849
+ .tb-select__trigger:hover {
850
+ border-color: var(--tb-line-bright);
851
+ }
852
+ .tb-select__chevron {
853
+ display: inline-flex;
854
+ align-items: center;
855
+ font-size: 16px;
856
+ opacity: 0.6;
857
+ transition: transform var(--tb-duration-fast) var(--tb-ease-standard);
858
+ }
859
+ .tb-select__dropdown {
860
+ position: absolute;
861
+ top: calc(100% + 4px);
862
+ left: 0;
863
+ right: 0;
864
+ background: var(--tb-bg-surface);
865
+ border: 1px solid var(--tb-line-bright);
866
+ z-index: var(--tb-z-dropdown);
867
+ max-height: 200px;
868
+ overflow-y: auto;
869
+ opacity: 0;
870
+ visibility: hidden;
871
+ transform: translateY(-4px);
872
+ transition:
873
+ opacity var(--tb-duration-normal) ease,
874
+ visibility var(--tb-duration-normal) ease,
875
+ transform var(--tb-duration-normal) ease;
876
+ }
877
+ .tb-select__dropdown--open {
878
+ opacity: 1;
879
+ visibility: visible;
880
+ transform: translateY(0);
881
+ }
882
+ .tb-select__option {
883
+ padding: var(--tb-sp-3) var(--tb-sp-4);
884
+ font-family: var(--tb-font);
885
+ font-size: 0.6rem;
886
+ letter-spacing: 0.2em;
887
+ text-transform: uppercase;
888
+ cursor: pointer;
889
+ color: var(--tb-text-label);
890
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
891
+ border-left: 2px solid transparent;
892
+ }
893
+ .tb-select__option:hover {
894
+ color: var(--tb-text-heading);
895
+ background: rgba(167, 217, 239, 0.06);
896
+ border-left-color: var(--tb-primary);
897
+ }
898
+ .tb-select__option--selected {
899
+ color: var(--tb-text-heading);
900
+ background: rgba(167, 217, 239, 0.06);
901
+ border-left-color: var(--tb-primary);
902
+ }
903
+ .tb-select__trigger:focus-visible {
904
+ outline: 2px solid var(--tb-primary);
905
+ outline-offset: 2px;
906
+ }
907
+ .tb-select__option:focus-visible {
908
+ outline: none;
909
+ background: rgba(167, 217, 239, 0.03);
910
+ border-left-color: var(--tb-primary);
911
+ }
912
+ .tb-select--error .tb-select__trigger {
913
+ border-color: var(--tb-error);
914
+ box-shadow: 0 0 0 1px var(--tb-error-dim);
915
+ }
916
+
917
+ /* src/css/components/modal.css */
918
+ .tb-modal-overlay {
919
+ position: fixed;
920
+ inset: 0;
921
+ background: rgba(2, 6, 23, 0.85);
922
+ z-index: var(--tb-z-modal-backdrop);
923
+ display: flex;
924
+ align-items: center;
925
+ justify-content: center;
926
+ opacity: 0;
927
+ visibility: hidden;
928
+ transition: opacity var(--tb-duration-normal) var(--tb-ease-standard), visibility var(--tb-duration-normal) var(--tb-ease-standard);
929
+ }
930
+ .tb-modal-overlay--open {
931
+ opacity: 1;
932
+ visibility: visible;
933
+ backdrop-filter: blur(8px);
934
+ }
935
+ .tb-modal {
936
+ background: var(--tb-bg-card);
937
+ border: 1px solid var(--tb-line);
938
+ padding: var(--tb-sp-8);
939
+ max-width: 520px;
940
+ width: 90%;
941
+ position: relative;
942
+ z-index: var(--tb-z-modal);
943
+ transform: translateY(20px) scale(0.97);
944
+ transition: transform var(--tb-duration-normal) var(--tb-ease-standard), opacity var(--tb-duration-normal) var(--tb-ease-standard);
945
+ }
946
+ .tb-modal-overlay--open .tb-modal {
947
+ transform: translateY(0) scale(1);
948
+ }
949
+ .tb-modal__close {
950
+ position: absolute;
951
+ top: var(--tb-sp-4);
952
+ right: var(--tb-sp-4);
953
+ background: none;
954
+ border: none;
955
+ color: var(--tb-primary);
956
+ cursor: pointer;
957
+ opacity: 0.4;
958
+ transition: opacity var(--tb-duration-fast) var(--tb-ease-standard);
959
+ }
960
+ .tb-modal__close:hover {
961
+ opacity: 1;
962
+ }
963
+ .tb-modal__close:focus-visible {
964
+ outline: 2px solid var(--tb-primary);
965
+ outline-offset: 2px;
966
+ }
967
+ .tb-modal__title {
968
+ font-size: 0.75rem;
969
+ font-weight: 700;
970
+ letter-spacing: 0.15em;
971
+ text-transform: uppercase;
972
+ color: var(--tb-text-heading);
973
+ margin-bottom: var(--tb-sp-4);
974
+ }
975
+ .tb-modal__description {
976
+ font-size: 0.6rem;
977
+ color: var(--tb-text-body);
978
+ line-height: 2;
979
+ letter-spacing: 0.12em;
980
+ text-transform: uppercase;
981
+ font-weight: 400;
982
+ margin-bottom: var(--tb-sp-6);
983
+ }
984
+ .tb-modal__body {
985
+ margin-bottom: var(--tb-sp-6);
986
+ }
987
+ .tb-modal__footer {
988
+ display: flex;
989
+ align-items: center;
990
+ gap: var(--tb-sp-3);
991
+ justify-content: flex-end;
992
+ border-top: 1px solid var(--tb-line);
993
+ padding-top: var(--tb-sp-6);
994
+ }
995
+
996
+ /* src/css/components/tabs.css */
997
+ .tb-tabs {
998
+ }
999
+ .tb-tabs__list {
1000
+ display: flex;
1001
+ border-bottom: 1px solid var(--tb-line);
1002
+ margin-bottom: var(--tb-sp-8);
1003
+ }
1004
+ .tb-tabs__trigger {
1005
+ font-family: var(--tb-font);
1006
+ font-size: 0.55rem;
1007
+ letter-spacing: 0.4em;
1008
+ text-transform: uppercase;
1009
+ padding: var(--tb-sp-3) var(--tb-sp-6);
1010
+ background: none;
1011
+ border: none;
1012
+ border-bottom: 2px solid transparent;
1013
+ color: var(--tb-text-label);
1014
+ cursor: pointer;
1015
+ margin-bottom: -1px;
1016
+ transition: all var(--tb-duration-normal) var(--tb-ease-standard);
1017
+ }
1018
+ .tb-tabs__trigger:hover {
1019
+ color: var(--tb-text-body);
1020
+ background: rgba(10, 20, 40, 0.8);
1021
+ }
1022
+ .tb-tabs__trigger--active {
1023
+ color: var(--tb-text-heading);
1024
+ border-bottom-color: var(--tb-primary);
1025
+ }
1026
+ .tb-tabs__trigger:focus-visible {
1027
+ outline: 2px solid var(--tb-primary);
1028
+ outline-offset: -2px;
1029
+ }
1030
+ .tb-tabs__content {
1031
+ display: none;
1032
+ }
1033
+ .tb-tabs__content--active {
1034
+ display: block;
1035
+ }
1036
+
1037
+ /* src/css/components/toast.css */
1038
+ .tb-toast-container {
1039
+ position: fixed;
1040
+ z-index: var(--tb-z-toast);
1041
+ display: flex;
1042
+ flex-direction: column;
1043
+ gap: var(--tb-sp-3);
1044
+ pointer-events: none;
1045
+ }
1046
+ .tb-toast-container--top-right {
1047
+ top: var(--tb-sp-8);
1048
+ right: var(--tb-sp-8);
1049
+ align-items: flex-end;
1050
+ }
1051
+ .tb-toast-container--top-center {
1052
+ top: var(--tb-sp-8);
1053
+ left: 50%;
1054
+ transform: translateX(-50%);
1055
+ align-items: center;
1056
+ }
1057
+ .tb-toast-container--bottom-right {
1058
+ bottom: var(--tb-sp-8);
1059
+ right: var(--tb-sp-8);
1060
+ align-items: flex-end;
1061
+ }
1062
+ .tb-toast-container--bottom-center {
1063
+ bottom: var(--tb-sp-8);
1064
+ left: 50%;
1065
+ transform: translateX(-50%);
1066
+ align-items: center;
1067
+ }
1068
+ .tb-toast {
1069
+ font-family: var(--tb-font);
1070
+ font-size: 0.55rem;
1071
+ letter-spacing: 0.2em;
1072
+ text-transform: uppercase;
1073
+ padding: var(--tb-sp-3) var(--tb-sp-4);
1074
+ border: 1px solid;
1075
+ display: flex;
1076
+ align-items: center;
1077
+ gap: var(--tb-sp-3);
1078
+ pointer-events: auto;
1079
+ opacity: 0;
1080
+ transform: translateY(16px);
1081
+ transition: all var(--tb-duration-slow) var(--tb-ease-enter);
1082
+ }
1083
+ .tb-toast--show {
1084
+ opacity: 1;
1085
+ transform: translateY(0);
1086
+ animation: tb-toast-slide-in var(--tb-duration-slow) var(--tb-ease-enter);
1087
+ }
1088
+ .tb-toast--success {
1089
+ border-color: rgba(107, 207, 160, 0.3);
1090
+ background: var(--tb-success-dim);
1091
+ color: var(--tb-success);
1092
+ }
1093
+ .tb-toast--error {
1094
+ border-color: rgba(239, 107, 107, 0.3);
1095
+ background: var(--tb-error-dim);
1096
+ color: var(--tb-error);
1097
+ }
1098
+ .tb-toast--warning {
1099
+ border-color: rgba(232, 196, 104, 0.3);
1100
+ background: var(--tb-warning-dim);
1101
+ color: var(--tb-warning);
1102
+ }
1103
+ .tb-toast--info {
1104
+ border-color: rgba(167, 217, 239, 0.3);
1105
+ background: rgba(167, 217, 239, 0.08);
1106
+ color: var(--tb-primary);
1107
+ }
1108
+ .tb-toast--inverted {
1109
+ background: var(--tb-primary);
1110
+ color: var(--tb-bg);
1111
+ border-color: var(--tb-primary);
1112
+ }
1113
+ .tb-toast__icon {
1114
+ display: inline-flex;
1115
+ align-items: center;
1116
+ font-size: 16px;
1117
+ flex-shrink: 0;
1118
+ }
1119
+ .tb-toast__message {
1120
+ flex: 1;
1121
+ }
1122
+ .tb-toast__dismiss {
1123
+ display: inline-flex;
1124
+ align-items: center;
1125
+ background: none;
1126
+ border: none;
1127
+ color: inherit;
1128
+ cursor: pointer;
1129
+ opacity: 0.5;
1130
+ transition: opacity var(--tb-duration-fast) var(--tb-ease-standard);
1131
+ padding: 0;
1132
+ margin-left: auto;
1133
+ }
1134
+ .tb-toast__dismiss:hover {
1135
+ opacity: 1;
1136
+ }
1137
+ @keyframes tb-toast-slide-in {
1138
+ from {
1139
+ opacity: 0;
1140
+ transform: translateY(16px);
1141
+ }
1142
+ to {
1143
+ opacity: 1;
1144
+ transform: translateY(0);
1145
+ }
1146
+ }
1147
+ @keyframes tb-toast-slide-out {
1148
+ from {
1149
+ opacity: 1;
1150
+ transform: translateY(0);
1151
+ }
1152
+ to {
1153
+ opacity: 0;
1154
+ transform: translateY(-16px);
1155
+ }
1156
+ }
1157
+
1158
+ /* src/css/components/tooltip.css */
1159
+ .tb-tooltip-wrap {
1160
+ position: relative;
1161
+ display: inline-block;
1162
+ }
1163
+ .tb-tooltip {
1164
+ position: absolute;
1165
+ background: var(--tb-bg-card);
1166
+ border: 1px solid var(--tb-line);
1167
+ font-size: 0.5rem;
1168
+ letter-spacing: 0.25em;
1169
+ text-transform: uppercase;
1170
+ padding: var(--tb-sp-2) var(--tb-sp-3);
1171
+ white-space: nowrap;
1172
+ opacity: 0;
1173
+ visibility: hidden;
1174
+ pointer-events: none;
1175
+ transition:
1176
+ opacity var(--tb-duration-fast) ease,
1177
+ transform var(--tb-duration-fast) ease,
1178
+ visibility var(--tb-duration-fast) ease;
1179
+ z-index: var(--tb-z-tooltip);
1180
+ }
1181
+ .tb-tooltip-wrap:hover .tb-tooltip,
1182
+ .tb-tooltip-wrap:focus-within .tb-tooltip {
1183
+ opacity: 1;
1184
+ visibility: visible;
1185
+ }
1186
+ .tb-tooltip--top {
1187
+ bottom: calc(100% + 10px);
1188
+ left: 50%;
1189
+ transform: translateX(-50%) translateY(4px);
1190
+ }
1191
+ .tb-tooltip-wrap:hover .tb-tooltip--top {
1192
+ transform: translateX(-50%) translateY(0);
1193
+ }
1194
+ .tb-tooltip--top::after {
1195
+ content: "";
1196
+ position: absolute;
1197
+ top: 100%;
1198
+ left: 50%;
1199
+ transform: translateX(-50%);
1200
+ border: 5px solid transparent;
1201
+ border-top-color: var(--tb-line);
1202
+ }
1203
+ .tb-tooltip--bottom {
1204
+ top: calc(100% + 10px);
1205
+ left: 50%;
1206
+ transform: translateX(-50%) translateY(-4px);
1207
+ }
1208
+ .tb-tooltip-wrap:hover .tb-tooltip--bottom {
1209
+ transform: translateX(-50%) translateY(0);
1210
+ }
1211
+ .tb-tooltip--left {
1212
+ right: calc(100% + 10px);
1213
+ top: 50%;
1214
+ transform: translateY(-50%) translateX(4px);
1215
+ }
1216
+ .tb-tooltip-wrap:hover .tb-tooltip--left {
1217
+ transform: translateY(-50%) translateX(0);
1218
+ }
1219
+ .tb-tooltip--right {
1220
+ left: calc(100% + 10px);
1221
+ top: 50%;
1222
+ transform: translateY(-50%) translateX(-4px);
1223
+ }
1224
+ .tb-tooltip-wrap:hover .tb-tooltip--right {
1225
+ transform: translateY(-50%) translateX(0);
1226
+ }
1227
+ @media (max-width: 480px) {
1228
+ .tb-tooltip {
1229
+ white-space: normal;
1230
+ max-width: min(300px, 90vw);
1231
+ }
1232
+ }
1233
+
1234
+ /* src/css/components/nav-dropdown.css */
1235
+ .tb-nav-item {
1236
+ position: relative;
1237
+ }
1238
+ .tb-nav-item__trigger {
1239
+ display: flex;
1240
+ align-items: center;
1241
+ gap: 4px;
1242
+ background: none;
1243
+ border: none;
1244
+ padding: 0;
1245
+ font-family: inherit;
1246
+ cursor: pointer;
1247
+ font-size: 0.65rem;
1248
+ font-weight: 400;
1249
+ letter-spacing: 0.15em;
1250
+ text-transform: uppercase;
1251
+ color: var(--tb-text-label);
1252
+ transition: color var(--tb-duration-fast) var(--tb-ease-standard);
1253
+ }
1254
+ .tb-nav-item--open .tb-nav-item__trigger {
1255
+ color: var(--tb-text-heading);
1256
+ }
1257
+ @media (hover: hover) {
1258
+ .tb-nav-item:hover .tb-nav-item__trigger {
1259
+ color: var(--tb-text-heading);
1260
+ }
1261
+ }
1262
+ .tb-nav-item__chevron {
1263
+ display: inline-block;
1264
+ width: 0;
1265
+ height: 0;
1266
+ border-left: 4px solid transparent;
1267
+ border-right: 4px solid transparent;
1268
+ border-top: 4px solid currentColor;
1269
+ opacity: 0.5;
1270
+ transition: transform var(--tb-duration-fast) var(--tb-ease-standard);
1271
+ }
1272
+ .tb-nav-item--open .tb-nav-item__chevron {
1273
+ transform: rotate(180deg);
1274
+ }
1275
+ @media (hover: hover) {
1276
+ .tb-nav-item:hover .tb-nav-item__chevron {
1277
+ transform: rotate(180deg);
1278
+ }
1279
+ }
1280
+ .tb-nav-dropdown {
1281
+ position: absolute;
1282
+ top: 100%;
1283
+ left: 0;
1284
+ margin-top: 10px;
1285
+ transform: translateY(8px);
1286
+ background: var(--tb-bg-surface);
1287
+ border: 1px solid var(--tb-line);
1288
+ min-width: 220px;
1289
+ opacity: 0;
1290
+ pointer-events: none;
1291
+ transition: all var(--tb-duration-normal) var(--tb-ease-standard);
1292
+ z-index: var(--tb-z-dropdown);
1293
+ padding-top: var(--tb-sp-2);
1294
+ }
1295
+ .tb-nav-item--align-center .tb-nav-dropdown {
1296
+ left: 50%;
1297
+ transform: translateX(-50%) translateY(8px);
1298
+ }
1299
+ .tb-nav-item--align-right .tb-nav-dropdown {
1300
+ left: auto;
1301
+ right: 0;
1302
+ }
1303
+ .tb-nav-dropdown::before {
1304
+ content: "";
1305
+ position: absolute;
1306
+ top: calc(-10px - var(--tb-sp-2));
1307
+ left: 0;
1308
+ right: 0;
1309
+ height: calc(10px + var(--tb-sp-2));
1310
+ }
1311
+ .tb-nav-dropdown--open {
1312
+ opacity: 1;
1313
+ pointer-events: auto;
1314
+ transform: translateY(0);
1315
+ }
1316
+ .tb-nav-item--align-center .tb-nav-dropdown--open {
1317
+ transform: translateX(-50%) translateY(0);
1318
+ }
1319
+ @media (hover: hover) {
1320
+ .tb-nav-item:hover .tb-nav-dropdown {
1321
+ opacity: 1;
1322
+ pointer-events: auto;
1323
+ transform: translateY(0);
1324
+ }
1325
+ .tb-nav-item--align-center:hover .tb-nav-dropdown {
1326
+ transform: translateX(-50%) translateY(0);
1327
+ }
1328
+ }
1329
+ .tb-nav-dropdown__item {
1330
+ display: flex;
1331
+ align-items: center;
1332
+ gap: var(--tb-sp-2);
1333
+ padding: var(--tb-sp-3) var(--tb-sp-4);
1334
+ font-size: 0.6rem;
1335
+ font-weight: 400;
1336
+ letter-spacing: 0.12em;
1337
+ text-transform: uppercase;
1338
+ text-decoration: none;
1339
+ color: var(--tb-text-label);
1340
+ border-left: 3px solid transparent;
1341
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
1342
+ }
1343
+ .tb-nav-dropdown__item:hover {
1344
+ background: rgba(167, 217, 239, 0.05);
1345
+ border-left-color: var(--tb-primary);
1346
+ color: var(--tb-text-heading);
1347
+ }
1348
+ @media (max-width: 480px) {
1349
+ .tb-nav-dropdown {
1350
+ min-width: min(220px, 90vw);
1351
+ }
1352
+ }
1353
+
1354
+ /* src/css/components/checkbox.css */
1355
+ .tb-checkbox {
1356
+ display: flex;
1357
+ align-items: center;
1358
+ gap: var(--tb-sp-3);
1359
+ cursor: pointer;
1360
+ font-size: 0.6rem;
1361
+ letter-spacing: 0.25em;
1362
+ text-transform: uppercase;
1363
+ color: var(--tb-text-body);
1364
+ }
1365
+ .tb-checkbox input {
1366
+ appearance: none;
1367
+ -webkit-appearance: none;
1368
+ width: 18px;
1369
+ height: 18px;
1370
+ border: 1px solid var(--tb-line-bright);
1371
+ background: var(--tb-bg-input);
1372
+ cursor: pointer;
1373
+ position: relative;
1374
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
1375
+ flex-shrink: 0;
1376
+ }
1377
+ .tb-checkbox input:checked {
1378
+ border-color: var(--tb-primary);
1379
+ background: var(--tb-primary);
1380
+ }
1381
+ .tb-checkbox input:checked::after {
1382
+ content: "";
1383
+ position: absolute;
1384
+ top: 2px;
1385
+ left: 5px;
1386
+ width: 5px;
1387
+ height: 9px;
1388
+ border: 2px solid var(--tb-bg);
1389
+ border-width: 0 2px 2px 0;
1390
+ transform: rotate(45deg);
1391
+ }
1392
+ .tb-checkbox input:disabled {
1393
+ opacity: 0.3;
1394
+ cursor: not-allowed;
1395
+ border-color: var(--tb-error);
1396
+ background: transparent;
1397
+ }
1398
+ .tb-checkbox input:disabled::before {
1399
+ content: "";
1400
+ position: absolute;
1401
+ top: 3px;
1402
+ left: 3px;
1403
+ width: 10px;
1404
+ height: 10px;
1405
+ background:
1406
+ linear-gradient(
1407
+ 45deg,
1408
+ transparent 42%,
1409
+ var(--tb-error) 42%,
1410
+ var(--tb-error) 58%,
1411
+ transparent 58%),
1412
+ linear-gradient(
1413
+ -45deg,
1414
+ transparent 42%,
1415
+ var(--tb-error) 42%,
1416
+ var(--tb-error) 58%,
1417
+ transparent 58%);
1418
+ }
1419
+ .tb-checkbox input:focus-visible {
1420
+ outline: 2px solid var(--tb-primary);
1421
+ outline-offset: 2px;
1422
+ }
1423
+ .tb-checkbox--error input {
1424
+ border-color: var(--tb-error);
1425
+ }
1426
+
1427
+ /* src/css/components/toggle.css */
1428
+ .tb-toggle {
1429
+ display: flex;
1430
+ align-items: center;
1431
+ gap: var(--tb-sp-3);
1432
+ cursor: pointer;
1433
+ font-size: 0.6rem;
1434
+ letter-spacing: 0.25em;
1435
+ text-transform: uppercase;
1436
+ color: var(--tb-text-body);
1437
+ }
1438
+ .tb-toggle__input {
1439
+ display: none;
1440
+ }
1441
+ .tb-toggle__track {
1442
+ width: 40px;
1443
+ height: 20px;
1444
+ border: 1px solid var(--tb-line-bright);
1445
+ background: var(--tb-bg-input);
1446
+ position: relative;
1447
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
1448
+ flex-shrink: 0;
1449
+ }
1450
+ .tb-toggle__thumb,
1451
+ .tb-toggle__track::after {
1452
+ content: "";
1453
+ position: absolute;
1454
+ top: 3px;
1455
+ left: 3px;
1456
+ width: 12px;
1457
+ height: 12px;
1458
+ background: var(--tb-primary);
1459
+ opacity: 0.4;
1460
+ transition: left var(--tb-duration-fast) var(--tb-ease-standard), opacity var(--tb-duration-fast) var(--tb-ease-standard);
1461
+ }
1462
+ .tb-toggle__track:has(.tb-toggle__thumb)::after {
1463
+ display: none;
1464
+ }
1465
+ .tb-toggle__input:checked + .tb-toggle__track {
1466
+ border-color: var(--tb-primary);
1467
+ background: rgba(167, 217, 239, 0.1);
1468
+ }
1469
+ .tb-toggle__input:checked + .tb-toggle__track .tb-toggle__thumb,
1470
+ .tb-toggle__input:checked + .tb-toggle__track::after {
1471
+ left: 23px;
1472
+ opacity: 1;
1473
+ }
1474
+ .tb-toggle__label {
1475
+ font-size: 0.6rem;
1476
+ letter-spacing: 0.25em;
1477
+ text-transform: uppercase;
1478
+ color: var(--tb-text-body);
1479
+ }
1480
+ .tb-toggle__input:focus-visible + .tb-toggle__track {
1481
+ outline: 2px solid var(--tb-primary);
1482
+ outline-offset: 2px;
1483
+ }
1484
+ .tb-toggle--disabled {
1485
+ opacity: 0.25;
1486
+ cursor: not-allowed;
1487
+ pointer-events: none;
1488
+ }
1489
+
1490
+ /* src/css/components/radio.css */
1491
+ .tb-radio-group {
1492
+ display: flex;
1493
+ flex-direction: column;
1494
+ gap: var(--tb-sp-3);
1495
+ }
1496
+ .tb-radio-group--horizontal {
1497
+ flex-direction: row;
1498
+ }
1499
+ .tb-radio {
1500
+ display: flex;
1501
+ align-items: center;
1502
+ gap: var(--tb-sp-3);
1503
+ cursor: pointer;
1504
+ font-size: 0.6rem;
1505
+ letter-spacing: 0.25em;
1506
+ text-transform: uppercase;
1507
+ color: var(--tb-text-body);
1508
+ }
1509
+ .tb-radio input {
1510
+ appearance: none;
1511
+ -webkit-appearance: none;
1512
+ width: 18px;
1513
+ height: 18px;
1514
+ border: 1px solid var(--tb-line-bright);
1515
+ border-radius: 50%;
1516
+ background: var(--tb-bg-input);
1517
+ cursor: pointer;
1518
+ position: relative;
1519
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
1520
+ flex-shrink: 0;
1521
+ }
1522
+ .tb-radio input:checked {
1523
+ border-color: var(--tb-primary);
1524
+ }
1525
+ .tb-radio input:checked::after {
1526
+ content: "";
1527
+ position: absolute;
1528
+ top: 4px;
1529
+ left: 4px;
1530
+ width: 8px;
1531
+ height: 8px;
1532
+ border-radius: 50%;
1533
+ background: var(--tb-primary);
1534
+ }
1535
+ .tb-radio input:focus-visible {
1536
+ outline: 2px solid var(--tb-primary);
1537
+ outline-offset: 2px;
1538
+ }
1539
+ .tb-radio input:disabled {
1540
+ opacity: 0.3;
1541
+ cursor: not-allowed;
1542
+ }
1543
+
1544
+ /* src/css/components/progress.css */
1545
+ .tb-progress {
1546
+ margin-bottom: var(--tb-sp-4);
1547
+ }
1548
+ .tb-progress__header {
1549
+ display: flex;
1550
+ justify-content: space-between;
1551
+ margin-bottom: var(--tb-sp-2);
1552
+ }
1553
+ .tb-progress__label {
1554
+ font-size: 0.5rem;
1555
+ letter-spacing: 0.3em;
1556
+ text-transform: uppercase;
1557
+ color: var(--tb-text-label);
1558
+ }
1559
+ .tb-progress__value {
1560
+ font-size: 0.5rem;
1561
+ letter-spacing: 0.3em;
1562
+ text-transform: uppercase;
1563
+ color: var(--tb-text-label);
1564
+ }
1565
+ .tb-progress__track {
1566
+ height: 4px;
1567
+ background: var(--tb-line);
1568
+ position: relative;
1569
+ overflow: hidden;
1570
+ }
1571
+ .tb-progress__fill {
1572
+ height: 100%;
1573
+ background: var(--tb-primary);
1574
+ transition: width var(--tb-duration-slow) var(--tb-ease-standard);
1575
+ position: relative;
1576
+ overflow: hidden;
1577
+ }
1578
+ .tb-progress__fill--animated::after {
1579
+ content: "";
1580
+ position: absolute;
1581
+ inset: 0;
1582
+ background:
1583
+ linear-gradient(
1584
+ 90deg,
1585
+ transparent 0%,
1586
+ rgba(255, 255, 255, 0.25) 50%,
1587
+ transparent 100%);
1588
+ background-size: 200% 100%;
1589
+ animation: tb-progress-shimmer 2s ease-in-out infinite;
1590
+ }
1591
+ .tb-progress__fill--success {
1592
+ background: var(--tb-success);
1593
+ }
1594
+ .tb-progress__fill--warning {
1595
+ background: var(--tb-warning);
1596
+ }
1597
+ .tb-progress__fill--error {
1598
+ background: var(--tb-error);
1599
+ }
1600
+ .tb-progress--indeterminate .tb-progress__fill {
1601
+ width: 30%;
1602
+ animation: tb-progress-indeterminate 1.5s var(--tb-ease-standard) infinite;
1603
+ }
1604
+ @keyframes tb-progress-shimmer {
1605
+ 0% {
1606
+ background-position: 200% 0;
1607
+ }
1608
+ 100% {
1609
+ background-position: -200% 0;
1610
+ }
1611
+ }
1612
+ @keyframes tb-progress-indeterminate {
1613
+ 0% {
1614
+ transform: translateX(-100%);
1615
+ }
1616
+ 100% {
1617
+ transform: translateX(400%);
1618
+ }
1619
+ }
1620
+
1621
+ /* src/css/components/battery.css */
1622
+ .tb-battery {
1623
+ display: flex;
1624
+ flex-direction: column;
1625
+ width: 48px;
1626
+ }
1627
+ .tb-battery__track {
1628
+ border: 1px solid var(--tb-line);
1629
+ padding: 3px;
1630
+ display: flex;
1631
+ flex-direction: column;
1632
+ gap: 2px;
1633
+ }
1634
+ .tb-battery__segment {
1635
+ flex: 1;
1636
+ background: rgba(167, 217, 239, 0.08);
1637
+ transition: background var(--tb-duration-normal) var(--tb-ease-standard);
1638
+ }
1639
+ .tb-battery__segment--filled {
1640
+ background: var(--tb-primary);
1641
+ opacity: 0.7;
1642
+ }
1643
+ .tb-battery__segment--filled.tb-battery__segment--success {
1644
+ background: var(--tb-success);
1645
+ }
1646
+ .tb-battery__segment--filled.tb-battery__segment--warning {
1647
+ background: var(--tb-warning);
1648
+ }
1649
+ .tb-battery__segment--filled.tb-battery__segment--error {
1650
+ background: var(--tb-error);
1651
+ }
1652
+ .tb-battery__cap {
1653
+ width: 10px;
1654
+ height: 6px;
1655
+ border: 1px solid var(--tb-line);
1656
+ align-self: center;
1657
+ margin-top: -1px;
1658
+ }
1659
+ .tb-battery__label {
1660
+ font-size: 0.6rem;
1661
+ letter-spacing: 0.2em;
1662
+ text-transform: uppercase;
1663
+ color: var(--tb-text-label);
1664
+ }
1665
+ .tb-battery__value {
1666
+ font-size: 0.6rem;
1667
+ letter-spacing: 0.2em;
1668
+ text-transform: uppercase;
1669
+ color: var(--tb-text-label);
1670
+ }
1671
+ .tb-battery--inline {
1672
+ flex-direction: row;
1673
+ align-items: center;
1674
+ gap: var(--tb-sp-3);
1675
+ width: auto;
1676
+ }
1677
+ .tb-battery--inline .tb-battery__track {
1678
+ flex: 1;
1679
+ height: 20px;
1680
+ flex-direction: row;
1681
+ }
1682
+ .tb-battery--inline .tb-battery__cap {
1683
+ width: 6px;
1684
+ height: 10px;
1685
+ margin-top: 0;
1686
+ margin-left: -1px;
1687
+ }
1688
+ .tb-battery--inline .tb-battery__label {
1689
+ min-width: 100px;
1690
+ }
1691
+ .tb-battery--inline .tb-battery__value {
1692
+ min-width: 40px;
1693
+ text-align: right;
1694
+ }
1695
+ .tb-battery--animated .tb-battery__segment--filled {
1696
+ animation: tb-battery-fill 3s ease-in-out infinite;
1697
+ }
1698
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(1) {
1699
+ animation-delay: 0s;
1700
+ }
1701
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(2) {
1702
+ animation-delay: 0.1s;
1703
+ }
1704
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(3) {
1705
+ animation-delay: 0.2s;
1706
+ }
1707
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(4) {
1708
+ animation-delay: 0.3s;
1709
+ }
1710
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(5) {
1711
+ animation-delay: 0.4s;
1712
+ }
1713
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(6) {
1714
+ animation-delay: 0.5s;
1715
+ }
1716
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(7) {
1717
+ animation-delay: 0.6s;
1718
+ }
1719
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(8) {
1720
+ animation-delay: 0.7s;
1721
+ }
1722
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(9) {
1723
+ animation-delay: 0.8s;
1724
+ }
1725
+ .tb-battery--animated .tb-battery__segment--filled:nth-child(10) {
1726
+ animation-delay: 0.9s;
1727
+ }
1728
+ @keyframes tb-battery-fill {
1729
+ 0%, 5% {
1730
+ opacity: 0;
1731
+ transform: scaleY(0);
1732
+ }
1733
+ 15%, 85% {
1734
+ opacity: 0.8;
1735
+ transform: scaleY(1);
1736
+ }
1737
+ 95%, 100% {
1738
+ opacity: 0;
1739
+ }
1740
+ }
1741
+ @media (max-width: 480px) {
1742
+ .tb-battery--inline .tb-battery__label {
1743
+ min-width: 60px;
1744
+ }
1745
+ }
1746
+
1747
+ /* src/css/components/table.css */
1748
+ .tb-table__wrapper {
1749
+ width: 100%;
1750
+ overflow-x: auto;
1751
+ -webkit-overflow-scrolling: touch;
1752
+ }
1753
+ .tb-table {
1754
+ width: 100%;
1755
+ border-collapse: collapse;
1756
+ font-size: 0.6rem;
1757
+ letter-spacing: 0.15em;
1758
+ text-transform: uppercase;
1759
+ }
1760
+ .tb-table th {
1761
+ text-align: left;
1762
+ font-size: 0.5rem;
1763
+ letter-spacing: 0.35em;
1764
+ padding: var(--tb-sp-3) var(--tb-sp-4);
1765
+ border-bottom: 1px solid var(--tb-line-bright);
1766
+ color: var(--tb-text-heading);
1767
+ font-weight: 500;
1768
+ }
1769
+ .tb-table td {
1770
+ padding: var(--tb-sp-3) var(--tb-sp-4);
1771
+ border-bottom: 1px solid var(--tb-line);
1772
+ color: var(--tb-text-body);
1773
+ }
1774
+ .tb-table tbody tr {
1775
+ transition: background var(--tb-duration-fast) ease;
1776
+ }
1777
+ .tb-table tr:hover td {
1778
+ opacity: 1;
1779
+ background: rgba(167, 217, 239, 0.03);
1780
+ }
1781
+ @media (max-width: 480px) {
1782
+ .tb-table {
1783
+ font-size: 0.55rem;
1784
+ letter-spacing: 0.08em;
1785
+ }
1786
+ }
1787
+
1788
+ /* src/css/components/skeleton.css */
1789
+ .tb-skeleton {
1790
+ background:
1791
+ linear-gradient(
1792
+ 90deg,
1793
+ var(--tb-line) 25%,
1794
+ rgba(167, 217, 239, 0.08) 50%,
1795
+ var(--tb-line) 75%);
1796
+ background-size: 200% 100%;
1797
+ animation: tb-shimmer 1.5s infinite;
1798
+ }
1799
+ .tb-skeleton--text {
1800
+ height: 12px;
1801
+ margin-bottom: var(--tb-sp-2);
1802
+ }
1803
+ .tb-skeleton--heading {
1804
+ height: 20px;
1805
+ margin-bottom: var(--tb-sp-4);
1806
+ }
1807
+ .tb-skeleton--avatar {
1808
+ width: 40px;
1809
+ height: 40px;
1810
+ }
1811
+ .tb-skeleton--card {
1812
+ height: 200px;
1813
+ width: 100%;
1814
+ border: 1px solid var(--tb-line);
1815
+ padding: var(--tb-sp-6);
1816
+ display: flex;
1817
+ flex-direction: column;
1818
+ gap: var(--tb-sp-3);
1819
+ }
1820
+ .tb-skeleton--w-40 {
1821
+ width: 40%;
1822
+ }
1823
+ .tb-skeleton--w-60 {
1824
+ width: 60%;
1825
+ }
1826
+ .tb-skeleton--w-80 {
1827
+ width: 80%;
1828
+ }
1829
+ .tb-skeleton--w-100 {
1830
+ width: 100%;
1831
+ }
1832
+ @keyframes tb-shimmer {
1833
+ 0% {
1834
+ background-position: 200% 0;
1835
+ }
1836
+ 100% {
1837
+ background-position: -200% 0;
1838
+ }
1839
+ }
1840
+
1841
+ /* src/css/components/spinners.css */
1842
+ .tb-spinner {
1843
+ position: relative;
1844
+ display: inline-block;
1845
+ width: 24px;
1846
+ height: 24px;
1847
+ }
1848
+ .tb-spinner--sm {
1849
+ width: 16px;
1850
+ height: 16px;
1851
+ }
1852
+ .tb-spinner--md {
1853
+ width: 24px;
1854
+ height: 24px;
1855
+ }
1856
+ .tb-spinner--lg {
1857
+ width: 40px;
1858
+ height: 40px;
1859
+ }
1860
+ .tb-spinner--multi-square .tb-spinner__square {
1861
+ position: absolute;
1862
+ inset: 0;
1863
+ border: 1.5px solid var(--tb-primary);
1864
+ }
1865
+ .tb-spinner--multi-square .tb-spinner__square:nth-child(1) {
1866
+ animation: tb-spin-cw 4s linear infinite;
1867
+ }
1868
+ .tb-spinner--multi-square .tb-spinner__square:nth-child(2) {
1869
+ opacity: 0.75;
1870
+ animation: tb-spin-ccw 2.8s linear infinite;
1871
+ }
1872
+ .tb-spinner--multi-square .tb-spinner__square:nth-child(3) {
1873
+ opacity: 0.55;
1874
+ animation: tb-spin-cw 1.9s linear infinite;
1875
+ }
1876
+ .tb-spinner--multi-square .tb-spinner__square:nth-child(4) {
1877
+ opacity: 0.35;
1878
+ animation: tb-spin-ccw 5.5s linear infinite;
1879
+ }
1880
+ .tb-spinner--multi-square .tb-spinner__square:nth-child(5) {
1881
+ opacity: 0.2;
1882
+ animation: tb-spin-cw 3.3s linear infinite;
1883
+ }
1884
+ .tb-spinner--bracket {
1885
+ animation: tb-bracket-rotate 6s ease-in-out infinite;
1886
+ }
1887
+ .tb-spinner--bracket::before,
1888
+ .tb-spinner--bracket::after {
1889
+ content: "";
1890
+ position: absolute;
1891
+ inset: 0;
1892
+ }
1893
+ .tb-spinner--bracket::before {
1894
+ border-bottom: 2px solid var(--tb-primary);
1895
+ border-left: 2px solid var(--tb-primary);
1896
+ animation: tb-bracket-split-a 6s ease-in-out infinite;
1897
+ }
1898
+ .tb-spinner--bracket::after {
1899
+ border-top: 2px solid var(--tb-primary);
1900
+ border-right: 2px solid var(--tb-primary);
1901
+ animation: tb-bracket-split-b 6s ease-in-out infinite;
1902
+ }
1903
+ .tb-spinner--sm.tb-spinner--bracket::before,
1904
+ .tb-spinner--sm.tb-spinner--bracket::after {
1905
+ border-width: 1.5px;
1906
+ }
1907
+ .tb-spinner--lg.tb-spinner--bracket::before,
1908
+ .tb-spinner--lg.tb-spinner--bracket::after {
1909
+ border-width: 3px;
1910
+ }
1911
+ @keyframes tb-bracket-rotate {
1912
+ 0%, 10% {
1913
+ transform: rotate(0deg);
1914
+ }
1915
+ 15%, 35% {
1916
+ transform: rotate(45deg);
1917
+ }
1918
+ 40%, 60% {
1919
+ transform: rotate(90deg);
1920
+ }
1921
+ 65%, 85% {
1922
+ transform: rotate(135deg);
1923
+ }
1924
+ 90%, 100% {
1925
+ transform: rotate(180deg);
1926
+ }
1927
+ }
1928
+ @keyframes tb-bracket-split-a {
1929
+ 0%, 5% {
1930
+ transform: translate(0, 0);
1931
+ }
1932
+ 10%, 15% {
1933
+ transform: translate(-5px, 5px);
1934
+ }
1935
+ 20%, 30% {
1936
+ transform: translate(0, 0);
1937
+ }
1938
+ 35%, 40% {
1939
+ transform: translate(-5px, 5px);
1940
+ }
1941
+ 45%, 55% {
1942
+ transform: translate(0, 0);
1943
+ }
1944
+ 60%, 65% {
1945
+ transform: translate(-5px, 5px);
1946
+ }
1947
+ 70%, 80% {
1948
+ transform: translate(0, 0);
1949
+ }
1950
+ 85%, 90% {
1951
+ transform: translate(-5px, 5px);
1952
+ }
1953
+ 95%, 100% {
1954
+ transform: translate(0, 0);
1955
+ }
1956
+ }
1957
+ @keyframes tb-bracket-split-b {
1958
+ 0%, 5% {
1959
+ transform: translate(0, 0);
1960
+ }
1961
+ 10%, 15% {
1962
+ transform: translate(5px, -5px);
1963
+ }
1964
+ 20%, 30% {
1965
+ transform: translate(0, 0);
1966
+ }
1967
+ 35%, 40% {
1968
+ transform: translate(5px, -5px);
1969
+ }
1970
+ 45%, 55% {
1971
+ transform: translate(0, 0);
1972
+ }
1973
+ 60%, 65% {
1974
+ transform: translate(5px, -5px);
1975
+ }
1976
+ 70%, 80% {
1977
+ transform: translate(0, 0);
1978
+ }
1979
+ 85%, 90% {
1980
+ transform: translate(5px, -5px);
1981
+ }
1982
+ 95%, 100% {
1983
+ transform: translate(0, 0);
1984
+ }
1985
+ }
1986
+
1987
+ /* src/css/components/pagination.css */
1988
+ .tb-pagination {
1989
+ display: flex;
1990
+ gap: var(--tb-sp-2);
1991
+ align-items: center;
1992
+ }
1993
+ .tb-pagination__btn {
1994
+ display: flex;
1995
+ align-items: center;
1996
+ justify-content: center;
1997
+ width: 32px;
1998
+ height: 32px;
1999
+ border: 1px solid var(--tb-line);
2000
+ background: transparent;
2001
+ color: var(--tb-primary);
2002
+ font-family: var(--tb-font);
2003
+ font-size: 0.6rem;
2004
+ letter-spacing: 0.1em;
2005
+ cursor: pointer;
2006
+ transition: all var(--tb-duration-fast) var(--tb-ease-standard);
2007
+ }
2008
+ .tb-pagination__btn:hover {
2009
+ border-color: var(--tb-primary);
2010
+ color: #fff;
2011
+ text-shadow: 0 0 15px var(--tb-glow);
2012
+ }
2013
+ .tb-pagination__btn:focus-visible {
2014
+ outline: 2px solid var(--tb-primary);
2015
+ outline-offset: 2px;
2016
+ }
2017
+ .tb-pagination__btn--active {
2018
+ background: var(--tb-primary);
2019
+ border-color: var(--tb-primary);
2020
+ color: var(--tb-bg);
2021
+ }
2022
+ .tb-pagination__btn--active:hover {
2023
+ background: var(--tb-primary);
2024
+ color: var(--tb-bg);
2025
+ text-shadow: none;
2026
+ }
2027
+ .tb-pagination__btn--disabled {
2028
+ opacity: 0.25;
2029
+ cursor: not-allowed;
2030
+ pointer-events: none;
2031
+ }
2032
+ .tb-pagination__ellipsis {
2033
+ font-size: 0.6rem;
2034
+ letter-spacing: 0.2em;
2035
+ opacity: 0.4;
2036
+ padding: 0 var(--tb-sp-1);
2037
+ }
2038
+
2039
+ /* src/css/components/breadcrumbs.css */
2040
+ .tb-breadcrumbs {
2041
+ font-size: 0.55rem;
2042
+ letter-spacing: 0.3em;
2043
+ padding: var(--tb-sp-3) 0;
2044
+ }
2045
+ .tb-breadcrumbs__list {
2046
+ display: flex;
2047
+ align-items: center;
2048
+ gap: var(--tb-sp-2);
2049
+ list-style: none;
2050
+ padding: 0;
2051
+ margin: 0;
2052
+ }
2053
+ .tb-breadcrumbs__item {
2054
+ display: flex;
2055
+ align-items: center;
2056
+ gap: var(--tb-sp-2);
2057
+ }
2058
+ .tb-breadcrumbs__separator {
2059
+ opacity: 0.2;
2060
+ }
2061
+ .tb-breadcrumbs__link {
2062
+ color: var(--tb-text-label);
2063
+ transition: color var(--tb-duration-fast) var(--tb-ease-standard);
2064
+ }
2065
+ .tb-breadcrumbs__link:hover {
2066
+ color: var(--tb-text-body);
2067
+ }
2068
+ .tb-breadcrumbs__current {
2069
+ color: var(--tb-text-heading);
2070
+ }
2071
+
2072
+ /* src/css/components/toolbar.css */
2073
+ .tb-toolbar {
2074
+ display: flex;
2075
+ align-items: center;
2076
+ gap: var(--tb-sp-3);
2077
+ background: var(--tb-bg-card);
2078
+ border: 1px solid var(--tb-line-bright);
2079
+ padding: var(--tb-sp-2) var(--tb-sp-3);
2080
+ backdrop-filter: blur(12px);
2081
+ -webkit-backdrop-filter: blur(12px);
2082
+ font-family: var(--tb-font);
2083
+ color: var(--tb-primary);
2084
+ }
2085
+ .tb-toolbar--fixed {
2086
+ position: fixed;
2087
+ z-index: calc(var(--tb-z-toast) + 10);
2088
+ }
2089
+ .tb-toolbar--bottom-right {
2090
+ bottom: var(--tb-sp-6);
2091
+ right: var(--tb-sp-6);
2092
+ }
2093
+ .tb-toolbar--bottom-left {
2094
+ bottom: var(--tb-sp-6);
2095
+ left: var(--tb-sp-6);
2096
+ }
2097
+ .tb-toolbar--top-right {
2098
+ top: var(--tb-sp-6);
2099
+ right: var(--tb-sp-6);
2100
+ }
2101
+ .tb-toolbar--top-left {
2102
+ top: var(--tb-sp-6);
2103
+ left: var(--tb-sp-6);
2104
+ }
2105
+ .tb-toolbar__label {
2106
+ font-size: 0.5rem;
2107
+ letter-spacing: 0.3em;
2108
+ text-transform: uppercase;
2109
+ color: var(--tb-text-muted);
2110
+ white-space: nowrap;
2111
+ }
2112
+ .tb-toolbar__divider {
2113
+ width: 1px;
2114
+ height: 16px;
2115
+ background: var(--tb-line);
2116
+ flex-shrink: 0;
2117
+ }
2118
+ .tb-toolbar__select {
2119
+ position: relative;
2120
+ display: inline-block;
2121
+ }
2122
+ .tb-toolbar__trigger {
2123
+ display: flex;
2124
+ align-items: center;
2125
+ gap: var(--tb-sp-2);
2126
+ height: 32px;
2127
+ padding: 0 var(--tb-sp-3);
2128
+ background: var(--tb-bg-surface);
2129
+ border: 1px solid var(--tb-line);
2130
+ color: var(--tb-primary);
2131
+ font-family: var(--tb-font);
2132
+ font-size: 0.6rem;
2133
+ letter-spacing: 0.1em;
2134
+ text-transform: uppercase;
2135
+ cursor: pointer;
2136
+ white-space: nowrap;
2137
+ transition: border-color var(--tb-duration-fast) ease;
2138
+ min-width: 160px;
2139
+ justify-content: space-between;
2140
+ }
2141
+ .tb-toolbar__trigger:hover {
2142
+ border-color: var(--tb-line-bright);
2143
+ }
2144
+ .tb-toolbar__chevron {
2145
+ display: inline-block;
2146
+ width: 0;
2147
+ height: 0;
2148
+ border-left: 4px solid transparent;
2149
+ border-right: 4px solid transparent;
2150
+ border-top: 4px solid currentColor;
2151
+ opacity: 0.5;
2152
+ transition: transform var(--tb-duration-fast) ease;
2153
+ flex-shrink: 0;
2154
+ }
2155
+ .tb-toolbar__select--open .tb-toolbar__chevron {
2156
+ transform: rotate(180deg);
2157
+ }
2158
+ .tb-toolbar__dropdown {
2159
+ position: absolute;
2160
+ bottom: calc(100% + 4px);
2161
+ left: 0;
2162
+ right: 0;
2163
+ background: var(--tb-bg-surface);
2164
+ border: 1px solid var(--tb-line);
2165
+ z-index: 10;
2166
+ opacity: 0;
2167
+ visibility: hidden;
2168
+ transform: translateY(4px);
2169
+ transition:
2170
+ opacity var(--tb-duration-fast) ease,
2171
+ visibility var(--tb-duration-fast) ease,
2172
+ transform var(--tb-duration-fast) ease;
2173
+ max-height: 280px;
2174
+ overflow-y: auto;
2175
+ }
2176
+ .tb-toolbar__select--open .tb-toolbar__dropdown {
2177
+ opacity: 1;
2178
+ visibility: visible;
2179
+ transform: translateY(0);
2180
+ }
2181
+ .tb-toolbar__dropdown--down {
2182
+ bottom: auto;
2183
+ top: calc(100% + 4px);
2184
+ transform: translateY(-4px);
2185
+ }
2186
+ .tb-toolbar__select--open .tb-toolbar__dropdown--down {
2187
+ transform: translateY(0);
2188
+ }
2189
+ .tb-toolbar__option {
2190
+ padding: var(--tb-sp-2) var(--tb-sp-3);
2191
+ font-size: 0.6rem;
2192
+ letter-spacing: 0.1em;
2193
+ text-transform: uppercase;
2194
+ cursor: pointer;
2195
+ color: var(--tb-text-label);
2196
+ border-left: 2px solid transparent;
2197
+ transition: all var(--tb-duration-fast) ease;
2198
+ white-space: nowrap;
2199
+ }
2200
+ .tb-toolbar__option:hover {
2201
+ color: var(--tb-primary);
2202
+ background: rgba(167, 217, 239, 0.05);
2203
+ border-left-color: var(--tb-primary);
2204
+ }
2205
+ .tb-toolbar__option--active {
2206
+ color: var(--tb-primary);
2207
+ border-left-color: var(--tb-primary);
2208
+ }
2209
+ .tb-toolbar__option-meta {
2210
+ display: block;
2211
+ font-size: 0.45rem;
2212
+ color: var(--tb-text-muted);
2213
+ letter-spacing: 0.15em;
2214
+ margin-top: 2px;
2215
+ }
2216
+ @media (max-width: 480px) {
2217
+ .tb-toolbar__trigger {
2218
+ min-width: 100px;
2219
+ }
2220
+ .tb-toolbar__label {
2221
+ letter-spacing: 0.15em;
2222
+ }
2223
+ }
2224
+
2225
+ /* src/css/components/sidenav.css */
2226
+ .tb-sidenav {
2227
+ display: flex;
2228
+ flex-direction: column;
2229
+ }
2230
+ .tb-sidenav__item {
2231
+ display: flex;
2232
+ align-items: center;
2233
+ gap: var(--tb-sp-2);
2234
+ width: 100%;
2235
+ padding: var(--tb-sp-2) var(--tb-sp-6);
2236
+ color: var(--tb-text-label);
2237
+ text-decoration: none;
2238
+ font-family: var(--tb-font);
2239
+ font-size: 0.6rem;
2240
+ letter-spacing: 0.25em;
2241
+ text-transform: uppercase;
2242
+ font-weight: 400;
2243
+ background: none;
2244
+ border: none;
2245
+ border-left: 2px solid transparent;
2246
+ cursor: pointer;
2247
+ transition:
2248
+ color var(--tb-duration-fast) ease,
2249
+ background var(--tb-duration-fast) ease,
2250
+ border-color var(--tb-duration-fast) ease;
2251
+ }
2252
+ .tb-sidenav__item:hover {
2253
+ color: var(--tb-text-body);
2254
+ background: rgba(167, 217, 239, 0.03);
2255
+ }
2256
+ .tb-sidenav .tb-sidenav__item--active {
2257
+ color: var(--tb-text-heading);
2258
+ border-left-color: var(--tb-primary);
2259
+ background: rgba(167, 217, 239, 0.05);
2260
+ }
2261
+ .tb-sidenav__icon {
2262
+ display: inline-flex;
2263
+ align-items: center;
2264
+ font-size: 16px;
2265
+ opacity: 0.6;
2266
+ flex-shrink: 0;
2267
+ }
2268
+ .tb-sidenav__item--active .tb-sidenav__icon {
2269
+ opacity: 0.9;
2270
+ }
2271
+ .tb-sidenav--icon-right .tb-sidenav__icon {
2272
+ order: 1;
2273
+ }
2274
+ .tb-sidenav--border-right .tb-sidenav__item {
2275
+ border-left: none;
2276
+ border-right: 2px solid transparent;
2277
+ }
2278
+ .tb-sidenav--border-right .tb-sidenav__item--active {
2279
+ border-right-color: var(--tb-primary);
2280
+ }
2281
+ .tb-sidenav__group-trigger {
2282
+ display: flex;
2283
+ align-items: center;
2284
+ gap: var(--tb-sp-2);
2285
+ width: 100%;
2286
+ padding: var(--tb-sp-2) var(--tb-sp-6);
2287
+ color: var(--tb-text-label);
2288
+ font-family: var(--tb-font);
2289
+ font-size: 0.6rem;
2290
+ letter-spacing: 0.25em;
2291
+ text-transform: uppercase;
2292
+ font-weight: 400;
2293
+ background: none;
2294
+ border: none;
2295
+ border-left: 2px solid transparent;
2296
+ cursor: pointer;
2297
+ transition: color var(--tb-duration-fast) ease, background var(--tb-duration-fast) ease;
2298
+ }
2299
+ .tb-sidenav__group-trigger:hover {
2300
+ color: var(--tb-text-body);
2301
+ background: rgba(167, 217, 239, 0.03);
2302
+ }
2303
+ .tb-sidenav__group-chevron {
2304
+ display: inline-flex;
2305
+ align-items: center;
2306
+ font-size: 16px;
2307
+ opacity: 0.4;
2308
+ margin-left: auto;
2309
+ transition: transform var(--tb-duration-fast) var(--tb-ease-standard);
2310
+ }
2311
+ .tb-sidenav__group--open > .tb-sidenav__group-trigger .tb-sidenav__group-chevron {
2312
+ transform: rotate(180deg);
2313
+ }
2314
+ .tb-sidenav__group-content {
2315
+ display: none;
2316
+ }
2317
+ .tb-sidenav__group--open > .tb-sidenav__group-content {
2318
+ display: flex;
2319
+ flex-direction: column;
2320
+ }
2321
+ .tb-sidenav__group-content .tb-sidenav__item {
2322
+ padding-left: var(--tb-sp-10);
2323
+ }
2324
+ .tb-sidenav__item:focus-visible,
2325
+ .tb-sidenav__group-trigger:focus-visible {
2326
+ outline: 2px solid var(--tb-primary);
2327
+ outline-offset: -2px;
2328
+ }
2329
+
2330
+ /* src/css/components/code-block.css */
2331
+ .tb-code-block {
2332
+ position: relative;
2333
+ background: var(--tb-bg);
2334
+ border: 1px solid var(--tb-line);
2335
+ padding: var(--tb-sp-4);
2336
+ font-family: "JetBrains Mono", monospace;
2337
+ font-size: 0.65rem;
2338
+ letter-spacing: 0.05em;
2339
+ line-height: 1.8;
2340
+ color: var(--tb-text-label);
2341
+ text-transform: none;
2342
+ overflow-x: auto;
2343
+ -webkit-overflow-scrolling: touch;
2344
+ }
2345
+ .tb-code-block__copy {
2346
+ position: absolute;
2347
+ top: var(--tb-sp-2);
2348
+ right: var(--tb-sp-2);
2349
+ display: inline-flex;
2350
+ align-items: center;
2351
+ justify-content: center;
2352
+ width: 28px;
2353
+ height: 28px;
2354
+ background: var(--tb-bg-surface);
2355
+ border: 1px solid var(--tb-line);
2356
+ color: var(--tb-text-muted);
2357
+ cursor: pointer;
2358
+ opacity: 0;
2359
+ transition:
2360
+ opacity var(--tb-duration-fast) ease,
2361
+ color var(--tb-duration-fast) ease,
2362
+ border-color var(--tb-duration-fast) ease;
2363
+ }
2364
+ .tb-code-block:hover .tb-code-block__copy {
2365
+ opacity: 1;
2366
+ }
2367
+ .tb-code-block__copy:hover {
2368
+ color: var(--tb-text-heading);
2369
+ border-color: var(--tb-line-bright);
2370
+ }
2371
+ .tb-code-block__copy--copied {
2372
+ color: var(--tb-success);
2373
+ opacity: 1;
2374
+ }
2375
+ .tb-code-block .prompt {
2376
+ color: var(--tb-success);
2377
+ }
2378
+ .tb-code-block .key {
2379
+ color: var(--tb-warning);
2380
+ }
2381
+ .tb-code-block .string {
2382
+ color: var(--tb-primary);
2383
+ }
2384
+ .tb-code-block .comment {
2385
+ color: var(--tb-text-muted);
2386
+ }
2387
+
2388
+ /* src/css/index.css */
2389
+ /*# sourceMappingURL=index.css.map */