@jjlmoya/utils-chrono 1.7.0 → 1.9.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.
Files changed (32) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -1
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +1 -1
  6. package/src/tool/telemeter-calculator/audio.ts +59 -0
  7. package/src/tool/telemeter-calculator/bibliography.astro +16 -0
  8. package/src/tool/telemeter-calculator/bibliography.ts +16 -0
  9. package/src/tool/telemeter-calculator/client.ts +269 -0
  10. package/src/tool/telemeter-calculator/component.astro +15 -0
  11. package/src/tool/telemeter-calculator/components/TelemeterPanel.astro +224 -0
  12. package/src/tool/telemeter-calculator/entry.ts +53 -0
  13. package/src/tool/telemeter-calculator/helpers.ts +80 -0
  14. package/src/tool/telemeter-calculator/i18n/de.ts +57 -0
  15. package/src/tool/telemeter-calculator/i18n/en.ts +114 -0
  16. package/src/tool/telemeter-calculator/i18n/es.ts +114 -0
  17. package/src/tool/telemeter-calculator/i18n/fr.ts +57 -0
  18. package/src/tool/telemeter-calculator/i18n/id.ts +57 -0
  19. package/src/tool/telemeter-calculator/i18n/it.ts +57 -0
  20. package/src/tool/telemeter-calculator/i18n/ja.ts +57 -0
  21. package/src/tool/telemeter-calculator/i18n/ko.ts +57 -0
  22. package/src/tool/telemeter-calculator/i18n/nl.ts +57 -0
  23. package/src/tool/telemeter-calculator/i18n/pl.ts +57 -0
  24. package/src/tool/telemeter-calculator/i18n/pt.ts +57 -0
  25. package/src/tool/telemeter-calculator/i18n/ru.ts +57 -0
  26. package/src/tool/telemeter-calculator/i18n/sv.ts +57 -0
  27. package/src/tool/telemeter-calculator/i18n/tr.ts +57 -0
  28. package/src/tool/telemeter-calculator/i18n/zh.ts +57 -0
  29. package/src/tool/telemeter-calculator/index.ts +11 -0
  30. package/src/tool/telemeter-calculator/seo.astro +16 -0
  31. package/src/tool/telemeter-calculator/telemeter-calculator.css +856 -0
  32. package/src/tools.ts +2 -0
@@ -0,0 +1,856 @@
1
+ .tel-card {
2
+ --tel-color-white: #fff;
3
+ --tel-color-gray-darkest: #111827;
4
+ --tel-color-gray-dark: #1f2937;
5
+ --tel-color-gray-medium: #374151;
6
+ --tel-color-gray-light: #4b5563;
7
+ --tel-color-yellow-bright: #fbbf24;
8
+ --tel-color-yellow: #eab308;
9
+ --tel-color-yellow-light: #fef08a;
10
+ --tel-color-yellow-hover: #facc15;
11
+ --tel-color-yellow-dark: #854d0e;
12
+ --tel-color-yellow-med: #a16207;
13
+ --tel-color-yellow-alt: #ca8a04;
14
+ --tel-color-cyan-bright: #22d3ee;
15
+ --tel-color-cyan: #06b6d4;
16
+ --tel-color-cyan-light: #cffafe;
17
+ --tel-color-cyan-dark: #075985;
18
+ --tel-color-cyan-med: #0891b2;
19
+ --tel-color-red: #ef4444;
20
+ --tel-color-red-light: #fca5a5;
21
+ --tel-color-red-dark: #991b1b;
22
+ --tel-color-red-active: #dc2626;
23
+
24
+ width: 100%;
25
+ max-width: 1000px;
26
+ margin: 0 auto;
27
+ background: var(--bg-surface);
28
+ border: 1px solid var(--border-color);
29
+ border-radius: 1.5rem;
30
+ padding: 1.5rem;
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: 1.5rem;
34
+ box-shadow: var(--shadow-base);
35
+ box-sizing: border-box;
36
+ position: relative;
37
+ overflow: hidden;
38
+ }
39
+
40
+ .tel-top {
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ }
45
+
46
+ .tel-h {
47
+ font-size: 1.5rem;
48
+ font-weight: 800;
49
+ color: var(--text-base);
50
+ margin: 0;
51
+ letter-spacing: -0.03em;
52
+ background: linear-gradient(135deg, var(--text-base) 0%, color-mix(in srgb, var(--text-base) 70%, var(--accent)) 100%);
53
+ -webkit-background-clip: text;
54
+ -webkit-text-fill-color: transparent;
55
+ }
56
+
57
+ .tel-grid {
58
+ display: grid;
59
+ grid-template-columns: 1fr;
60
+ gap: 1.5rem;
61
+ }
62
+
63
+ @media (min-width: 768px) {
64
+ .tel-grid {
65
+ grid-template-columns: 1.2fr 1fr;
66
+ }
67
+ }
68
+
69
+ .tel-visualizer-section {
70
+ display: flex;
71
+ flex-direction: column;
72
+ align-items: center;
73
+ justify-content: center;
74
+ background: color-mix(in srgb, var(--bg-page) 40%, var(--bg-surface));
75
+ border: 1px solid var(--border-color);
76
+ border-radius: 1.25rem;
77
+ padding: 2rem 1rem;
78
+ position: relative;
79
+ min-height: 380px;
80
+ }
81
+
82
+ .tel-lightning-overlay {
83
+ position: absolute;
84
+ top: 0;
85
+ left: 0;
86
+ right: 0;
87
+ bottom: 0;
88
+ background: var(--tel-color-white);
89
+ opacity: 0;
90
+ pointer-events: none;
91
+ z-index: 10;
92
+ transition: opacity 0.05s ease-out;
93
+ }
94
+
95
+ .tel-lightning-overlay.flash-active {
96
+ opacity: 0.9;
97
+ animation: lightning-flicker 0.4s ease-out;
98
+ }
99
+
100
+ @keyframes lightning-flicker {
101
+ 0% { opacity: 0; }
102
+ 10% { opacity: 0.95; }
103
+ 20% { opacity: 0.2; }
104
+ 30% { opacity: 0.9; }
105
+ 40% { opacity: 0.1; }
106
+ 100% { opacity: 0; }
107
+ }
108
+
109
+ .tel-watch-container {
110
+ position: relative;
111
+ width: 290px;
112
+ height: 290px;
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ }
117
+
118
+ .tel-svg-pusher {
119
+ cursor: pointer;
120
+ transition: transform 0.1s cubic-bezier(0.4, 0, 0.2, 1);
121
+ }
122
+
123
+ .tel-svg-pusher:hover {
124
+ filter: brightness(1.2) contrast(1.1);
125
+ }
126
+
127
+ .tel-svg-pusher.disabled {
128
+ cursor: not-allowed;
129
+ opacity: 0.35;
130
+ filter: grayscale(1) brightness(0.7);
131
+ pointer-events: none;
132
+ }
133
+
134
+ #pusher-start:active {
135
+ transform: translate(135px, 135px) rotate(-33deg) scaleX(0.95);
136
+ }
137
+
138
+ #pusher-reset:active {
139
+ transform: translate(135px, 135px) rotate(33deg) scaleX(0.95);
140
+ }
141
+
142
+ .tel-helper-text {
143
+ font-size: 5px;
144
+ font-weight: 800;
145
+ fill: var(--accent);
146
+ letter-spacing: 0.08em;
147
+ opacity: 0.85;
148
+ }
149
+
150
+ .tel-helper-text-gray {
151
+ fill: var(--text-base);
152
+ opacity: 0.4;
153
+ }
154
+
155
+ .tel-dial-brand {
156
+ font-size: 8px;
157
+ font-weight: 900;
158
+ fill: var(--text-base);
159
+ opacity: 0.2;
160
+ letter-spacing: 0.16em;
161
+ }
162
+
163
+ .tel-dial-subbrand {
164
+ font-size: 3.5px;
165
+ font-weight: 700;
166
+ fill: var(--accent);
167
+ opacity: 0.35;
168
+ letter-spacing: 0.06em;
169
+ }
170
+
171
+ .tel-svg-dial {
172
+ width: 270px;
173
+ height: 270px;
174
+ border-radius: 50%;
175
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
176
+ z-index: 1;
177
+ }
178
+
179
+ .tel-case-bg {
180
+ fill: url("#tel-case-grad");
181
+ stroke: var(--tel-color-gray-medium);
182
+ stroke-width: 2;
183
+ }
184
+
185
+ .tel-bezel-bg {
186
+ fill: var(--tel-color-gray-dark);
187
+ stroke: var(--tel-color-gray-light);
188
+ stroke-width: 1.5;
189
+ }
190
+
191
+ .tel-bezel-inner {
192
+ fill: var(--tel-color-gray-darkest);
193
+ stroke: var(--tel-color-gray-medium);
194
+ stroke-dasharray: 2, 4;
195
+ }
196
+
197
+ .tel-dial-face {
198
+ fill: url("#tel-dial-grad");
199
+ }
200
+
201
+ .tel-tick-major {
202
+ stroke: var(--text-base);
203
+ stroke-width: 1.75;
204
+ opacity: 0.7;
205
+ }
206
+
207
+ .tel-tick-minor {
208
+ stroke: var(--text-base);
209
+ stroke-width: 0.75;
210
+ opacity: 0.3;
211
+ }
212
+
213
+ .tel-bezel-label-km {
214
+ font-size: 7px;
215
+ font-weight: 800;
216
+ fill: var(--accent);
217
+ text-anchor: middle;
218
+ dominant-baseline: central;
219
+ }
220
+
221
+ .tel-bezel-label-mi {
222
+ font-size: 7px;
223
+ font-weight: 800;
224
+ fill: var(--tel-color-yellow-bright);
225
+ text-anchor: middle;
226
+ dominant-baseline: central;
227
+ }
228
+
229
+ .tel-seconds-hand-group {
230
+ transform-origin: 135px 135px;
231
+ }
232
+
233
+ .tel-hand-center {
234
+ fill: var(--tel-color-red);
235
+ filter: drop-shadow(0 2px 4px rgba(0,0,0,0.3));
236
+ }
237
+
238
+ .tel-seconds-hand {
239
+ stroke: var(--tel-color-red);
240
+ stroke-width: 2;
241
+ stroke-linecap: round;
242
+ filter: drop-shadow(0 2px 4px rgba(239, 68, 68, 0.3));
243
+ }
244
+
245
+ .tel-seconds-hand-counterweight {
246
+ stroke: var(--tel-color-red);
247
+ stroke-width: 3;
248
+ stroke-linecap: round;
249
+ }
250
+
251
+ .tel-center-pin {
252
+ fill: var(--tel-color-gray-darkest);
253
+ stroke: var(--tel-color-red);
254
+ stroke-width: 1;
255
+ }
256
+
257
+ .tel-digital-time {
258
+ font-size: 13px;
259
+ font-weight: 800;
260
+ fill: var(--text-base);
261
+ opacity: 0.9;
262
+ letter-spacing: 0.05em;
263
+ font-variant-numeric: tabular-nums;
264
+ }
265
+
266
+ .tel-ambient-indicator {
267
+ font-size: 8px;
268
+ font-weight: 700;
269
+ fill: var(--text-base);
270
+ opacity: 0.5;
271
+ letter-spacing: 0.06em;
272
+ }
273
+
274
+ .tel-ripple {
275
+ position: absolute;
276
+ top: 50%;
277
+ left: 50%;
278
+ width: 10px;
279
+ height: 10px;
280
+ background: transparent;
281
+ border: 2px solid var(--accent);
282
+ border-radius: 50%;
283
+ transform: translate(-50%, -50%) scale(1);
284
+ opacity: 0;
285
+ pointer-events: none;
286
+ z-index: 3;
287
+ }
288
+
289
+ .tel-ripple.ripple-active {
290
+ animation: sound-ripple-out 0.8s cubic-bezier(0.1, 0.8, 0.3, 1);
291
+ }
292
+
293
+ @keyframes sound-ripple-out {
294
+ 0% {
295
+ width: 20px;
296
+ height: 20px;
297
+ opacity: 0.85;
298
+ border-width: 4px;
299
+ }
300
+ 100% {
301
+ width: 280px;
302
+ height: 280px;
303
+ opacity: 0;
304
+ border-width: 0.5px;
305
+ }
306
+ }
307
+
308
+ .tel-controls-section {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: 1.25rem;
312
+ }
313
+
314
+ .tel-trigger-dashboard {
315
+ display: grid;
316
+ grid-template-columns: 1fr 1fr;
317
+ gap: 0.75rem;
318
+ }
319
+
320
+ .tel-trigger-pad {
321
+ display: flex;
322
+ align-items: center;
323
+ gap: 0.75rem;
324
+ padding: 0.75rem 1rem;
325
+ background: rgba(255, 255, 255, 0.015);
326
+ border: 1px solid var(--border-color);
327
+ border-radius: 0.875rem;
328
+ text-align: left;
329
+ cursor: pointer;
330
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
331
+ box-sizing: border-box;
332
+ }
333
+
334
+ .pad-icon-wrap {
335
+ width: 32px;
336
+ height: 32px;
337
+ border-radius: 0.5rem;
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ flex-shrink: 0;
342
+ background: rgba(255, 255, 255, 0.03);
343
+ transition: all 0.25s;
344
+ }
345
+
346
+ .pad-content {
347
+ display: flex;
348
+ flex-direction: column;
349
+ min-width: 0;
350
+ }
351
+
352
+ .pad-title {
353
+ font-size: 0.75rem;
354
+ font-weight: 800;
355
+ letter-spacing: 0.05em;
356
+ text-transform: uppercase;
357
+ }
358
+
359
+ .pad-desc {
360
+ font-size: 0.625rem;
361
+ opacity: 0.45;
362
+ font-weight: 500;
363
+ white-space: nowrap;
364
+ overflow: hidden;
365
+ text-overflow: ellipsis;
366
+ }
367
+
368
+ .pad-flash {
369
+ border-color: rgba(234, 179, 8, 0.2);
370
+ color: var(--tel-color-yellow-light);
371
+ }
372
+
373
+ .pad-flash .pad-icon-wrap {
374
+ background: rgba(234, 179, 8, 0.08);
375
+ color: var(--tel-color-yellow);
376
+ }
377
+
378
+ .pad-flash:hover:not(:disabled) {
379
+ background: rgba(234, 179, 8, 0.04);
380
+ border-color: var(--tel-color-yellow);
381
+ box-shadow: 0 0 15px rgba(234, 179, 8, 0.15);
382
+ transform: translateY(-1px);
383
+ }
384
+
385
+ .pad-sound {
386
+ border-color: rgba(6, 182, 212, 0.2);
387
+ color: var(--tel-color-cyan-light);
388
+ }
389
+
390
+ .pad-sound .pad-icon-wrap {
391
+ background: rgba(6, 182, 212, 0.08);
392
+ color: var(--tel-color-cyan);
393
+ }
394
+
395
+ .pad-sound:hover:not(:disabled) {
396
+ background: rgba(6, 182, 212, 0.04);
397
+ border-color: var(--tel-color-cyan);
398
+ box-shadow: 0 0 15px rgba(6, 182, 212, 0.15);
399
+ transform: translateY(-1px);
400
+ }
401
+
402
+ .tel-trigger-pad:disabled {
403
+ opacity: 0.3;
404
+ cursor: not-allowed;
405
+ transform: none;
406
+ box-shadow: none;
407
+ filter: grayscale(0.8);
408
+ }
409
+
410
+ .tel-trigger-pad:disabled:hover {
411
+ transform: none;
412
+ box-shadow: none;
413
+ }
414
+
415
+ .tel-reset-bar {
416
+ width: 100%;
417
+ }
418
+
419
+ .tel-reset-btn {
420
+ width: 100%;
421
+ display: flex;
422
+ align-items: center;
423
+ justify-content: center;
424
+ gap: 0.5rem;
425
+ padding: 0.625rem;
426
+ background: rgba(239, 68, 68, 0.02);
427
+ border: 1px solid rgba(239, 68, 68, 0.15);
428
+ border-radius: 0.75rem;
429
+ color: var(--tel-color-red-light);
430
+ font-size: 0.75rem;
431
+ font-weight: 800;
432
+ letter-spacing: 0.08em;
433
+ text-transform: uppercase;
434
+ cursor: pointer;
435
+ transition: all 0.2s;
436
+ }
437
+
438
+ .tel-reset-btn:hover:not(:disabled) {
439
+ background: rgba(239, 68, 68, 0.06);
440
+ border-color: var(--tel-color-red);
441
+ box-shadow: 0 0 15px rgba(239, 68, 68, 0.15);
442
+ }
443
+
444
+ .tel-reset-btn:disabled {
445
+ opacity: 0.3;
446
+ cursor: not-allowed;
447
+ filter: grayscale(0.8);
448
+ }
449
+
450
+ .tel-setting-panel {
451
+ background: color-mix(in srgb, var(--bg-page) 30%, var(--bg-surface));
452
+ border: 1px solid var(--border-color);
453
+ border-radius: 1rem;
454
+ padding: 1rem;
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 1rem;
458
+ }
459
+
460
+ .tel-field {
461
+ display: flex;
462
+ flex-direction: column;
463
+ gap: 0.35rem;
464
+ }
465
+
466
+ .tel-label-row {
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: space-between;
470
+ }
471
+
472
+ .tel-label {
473
+ font-size: 0.6875rem;
474
+ font-weight: 700;
475
+ text-transform: uppercase;
476
+ letter-spacing: 0.05em;
477
+ color: var(--text-base);
478
+ opacity: 0.5;
479
+ }
480
+
481
+ .tel-label-value {
482
+ font-size: 0.8125rem;
483
+ font-weight: 700;
484
+ color: var(--text-base);
485
+ }
486
+
487
+ .tel-unit-chips {
488
+ display: flex;
489
+ background: var(--bg-page);
490
+ border: 1px solid var(--border-color);
491
+ border-radius: 0.5rem;
492
+ padding: 0.15rem;
493
+ align-self: flex-start;
494
+ }
495
+
496
+ .tel-chip-btn {
497
+ padding: 0.35rem 0.75rem;
498
+ font-size: 0.75rem;
499
+ font-weight: 700;
500
+ border-radius: 0.375rem;
501
+ border: none;
502
+ background: transparent;
503
+ color: var(--text-base);
504
+ opacity: 0.6;
505
+ cursor: pointer;
506
+ transition: all 0.15s;
507
+ }
508
+
509
+ .tel-chip-btn.active {
510
+ background: var(--bg-surface);
511
+ box-shadow: var(--shadow-sm, 0 1px 3px rgba(0,0,0,0.05));
512
+ color: var(--accent);
513
+ opacity: 1;
514
+ }
515
+
516
+ .tel-slider-wrapper {
517
+ display: flex;
518
+ align-items: center;
519
+ gap: 1rem;
520
+ }
521
+
522
+ .tel-slider {
523
+ flex: 1;
524
+ -webkit-appearance: none;
525
+ appearance: none;
526
+ height: 6px;
527
+ border-radius: 3px;
528
+ background: var(--border-color);
529
+ outline: none;
530
+ transition: background 0.15s;
531
+ }
532
+
533
+ .tel-slider::-webkit-slider-thumb {
534
+ -webkit-appearance: none;
535
+ appearance: none;
536
+ width: 18px;
537
+ height: 18px;
538
+ border-radius: 50%;
539
+ background: var(--accent);
540
+ cursor: pointer;
541
+ border: 2px solid var(--bg-surface);
542
+ box-shadow: 0 1px 4px rgba(0,0,0,0.2);
543
+ transition: transform 0.1s;
544
+ }
545
+
546
+ .tel-slider::-webkit-slider-thumb:hover {
547
+ transform: scale(1.15);
548
+ }
549
+
550
+ .tel-slider::-moz-range-thumb {
551
+ width: 18px;
552
+ height: 18px;
553
+ border-radius: 50%;
554
+ background: var(--accent);
555
+ cursor: pointer;
556
+ border: 2px solid var(--bg-surface);
557
+ box-shadow: 0 1px 4px rgba(0,0,0,0.2);
558
+ transition: transform 0.1s;
559
+ }
560
+
561
+ .tel-slider::-moz-range-thumb:hover {
562
+ transform: scale(1.15);
563
+ }
564
+
565
+ .tel-speed-badge {
566
+ background: var(--bg-page);
567
+ padding: 0.5rem 0.75rem;
568
+ border-radius: 0.5rem;
569
+ font-size: 0.8125rem;
570
+ font-weight: 700;
571
+ font-variant-numeric: tabular-nums;
572
+ color: var(--text-base);
573
+ opacity: 0.85;
574
+ border: 1px solid var(--border-color);
575
+ align-self: flex-start;
576
+ }
577
+
578
+ .tel-results-panel {
579
+ display: flex;
580
+ flex-direction: column;
581
+ background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 6%, var(--bg-surface)) 0%, color-mix(in srgb, var(--accent) 2%, var(--bg-surface)) 100%);
582
+ border: 1.5px solid color-mix(in srgb, var(--accent) 20%, var(--border-color));
583
+ border-radius: 1.25rem;
584
+ padding: 1.25rem;
585
+ box-shadow: 0 4px 16px color-mix(in srgb, var(--accent) 4%, transparent);
586
+ }
587
+
588
+ .tel-results-primary {
589
+ display: flex;
590
+ flex-direction: column;
591
+ align-items: center;
592
+ gap: 0.15rem;
593
+ padding-bottom: 0.75rem;
594
+ border-bottom: 1px solid color-mix(in srgb, var(--accent) 15%, var(--border-color));
595
+ }
596
+
597
+ .tel-results-val {
598
+ font-size: 2.5rem;
599
+ font-weight: 900;
600
+ color: var(--accent);
601
+ letter-spacing: -0.04em;
602
+ font-variant-numeric: tabular-nums;
603
+ line-height: 1;
604
+ }
605
+
606
+ .tel-results-subval {
607
+ font-size: 0.875rem;
608
+ font-weight: 700;
609
+ color: var(--text-base);
610
+ opacity: 0.5;
611
+ font-variant-numeric: tabular-nums;
612
+ }
613
+
614
+ .tel-results-details {
615
+ display: flex;
616
+ justify-content: space-around;
617
+ padding-top: 0.75rem;
618
+ }
619
+
620
+ .tel-detail-item {
621
+ display: flex;
622
+ flex-direction: column;
623
+ align-items: center;
624
+ gap: 0.15rem;
625
+ }
626
+
627
+ .tel-detail-lbl {
628
+ font-size: 0.625rem;
629
+ font-weight: 700;
630
+ text-transform: uppercase;
631
+ color: var(--text-base);
632
+ opacity: 0.4;
633
+ letter-spacing: 0.04em;
634
+ }
635
+
636
+ .tel-detail-val {
637
+ font-size: 1.125rem;
638
+ font-weight: 800;
639
+ color: var(--text-base);
640
+ font-variant-numeric: tabular-nums;
641
+ }
642
+
643
+ .tel-history-section {
644
+ background: var(--bg-surface);
645
+ border: 1px solid var(--border-color);
646
+ border-radius: 1.25rem;
647
+ padding: 1.25rem;
648
+ }
649
+
650
+ .tel-history-header {
651
+ display: flex;
652
+ align-items: center;
653
+ justify-content: space-between;
654
+ margin-bottom: 0.75rem;
655
+ }
656
+
657
+ .tel-history-title {
658
+ font-size: 0.875rem;
659
+ font-weight: 700;
660
+ color: var(--text-base);
661
+ }
662
+
663
+ .tel-history-list {
664
+ display: flex;
665
+ flex-direction: column;
666
+ gap: 0.5rem;
667
+ max-height: 150px;
668
+ overflow-y: auto;
669
+ padding-right: 0.25rem;
670
+ }
671
+
672
+ .tel-history-item {
673
+ display: flex;
674
+ align-items: center;
675
+ justify-content: space-between;
676
+ padding: 0.5rem 0.75rem;
677
+ background: var(--bg-page);
678
+ border-radius: 0.5rem;
679
+ border: 1px solid var(--border-color);
680
+ font-size: 0.75rem;
681
+ font-variant-numeric: tabular-nums;
682
+ animation: slide-in-history 0.25s ease-out;
683
+ }
684
+
685
+ @keyframes slide-in-history {
686
+ 0% {
687
+ opacity: 0;
688
+ transform: translateY(-5px);
689
+ }
690
+ 100% {
691
+ opacity: 1;
692
+ transform: translateY(0);
693
+ }
694
+ }
695
+
696
+ .tel-history-item-time {
697
+ font-weight: 500;
698
+ opacity: 0.5;
699
+ }
700
+
701
+ .tel-history-item-dist {
702
+ font-weight: 800;
703
+ color: var(--accent);
704
+ }
705
+
706
+ .tel-history-item-elapsed {
707
+ font-weight: 600;
708
+ color: var(--text-base);
709
+ }
710
+
711
+ .tel-empty-history {
712
+ font-size: 0.75rem;
713
+ color: var(--text-base);
714
+ opacity: 0.5;
715
+ text-align: center;
716
+ padding: 1.5rem 0;
717
+ }
718
+
719
+ .tel-history-list::-webkit-scrollbar {
720
+ width: 4px;
721
+ }
722
+
723
+ .tel-history-list::-webkit-scrollbar-track {
724
+ background: transparent;
725
+ }
726
+
727
+ .tel-history-list::-webkit-scrollbar-thumb {
728
+ background: var(--border-color);
729
+ border-radius: 2px;
730
+ }
731
+
732
+ .tel-steps-section {
733
+ display: flex;
734
+ flex-direction: column;
735
+ gap: 0.625rem;
736
+ padding: 1rem 1.125rem;
737
+ background: var(--bg-page);
738
+ border-radius: 0.875rem;
739
+ border: 1px solid var(--border-base);
740
+ }
741
+
742
+ .tel-step-row {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 0.75rem;
746
+ }
747
+
748
+ .tel-step-marker {
749
+ width: 1.375rem;
750
+ height: 1.375rem;
751
+ border-radius: 50%;
752
+ background: var(--accent);
753
+ color: var(--text-on-primary, #fff);
754
+ font-size: 0.6875rem;
755
+ font-weight: 700;
756
+ display: flex;
757
+ align-items: center;
758
+ justify-content: center;
759
+ flex-shrink: 0;
760
+ }
761
+
762
+ .tel-step-text {
763
+ font-size: 0.8125rem;
764
+ color: var(--text-base);
765
+ opacity: 0.85;
766
+ line-height: 1.4;
767
+ }
768
+
769
+ .tel-tip-row {
770
+ display: flex;
771
+ gap: 0.5rem;
772
+ padding: 0.75rem 1rem;
773
+ background: var(--bg-page);
774
+ border-radius: 0.75rem;
775
+ border: 1px solid var(--border-base);
776
+ }
777
+
778
+ .tel-tip-icon {
779
+ flex-shrink: 0;
780
+ margin-top: 0.1rem;
781
+ color: var(--accent);
782
+ }
783
+
784
+ .tel-tip-text {
785
+ font-size: 0.8rem;
786
+ color: var(--text-base);
787
+ opacity: 0.85;
788
+ line-height: 1.5;
789
+ }
790
+
791
+ .theme-light .tel-trigger-pad {
792
+ background: var(--bg-page);
793
+ border-color: var(--border-color);
794
+ }
795
+
796
+ .theme-light .pad-flash {
797
+ border-color: rgba(202, 138, 4, 0.45);
798
+ color: var(--tel-color-yellow-dark);
799
+ }
800
+
801
+ .theme-light .pad-flash .pad-icon-wrap {
802
+ background: rgba(234, 179, 8, 0.15);
803
+ color: var(--tel-color-yellow-med);
804
+ }
805
+
806
+ .theme-light .pad-flash:hover:not(:disabled) {
807
+ background: rgba(234, 179, 8, 0.08);
808
+ border-color: var(--tel-color-yellow-alt);
809
+ box-shadow: 0 4px 12px rgba(234, 179, 8, 0.12);
810
+ }
811
+
812
+ .theme-light .pad-sound {
813
+ border-color: rgba(8, 145, 178, 0.45);
814
+ color: var(--tel-color-cyan-dark);
815
+ }
816
+
817
+ .theme-light .pad-sound .pad-icon-wrap {
818
+ background: rgba(6, 182, 212, 0.15);
819
+ color: var(--tel-color-cyan-med);
820
+ }
821
+
822
+ .theme-light .pad-sound:hover:not(:disabled) {
823
+ background: rgba(6, 182, 212, 0.08);
824
+ border-color: var(--tel-color-cyan-med);
825
+ box-shadow: 0 4px 12px rgba(6, 182, 212, 0.12);
826
+ }
827
+
828
+ .theme-light .tel-reset-btn {
829
+ background: rgba(220, 38, 38, 0.03);
830
+ border-color: rgba(220, 38, 38, 0.25);
831
+ color: var(--tel-color-red-dark);
832
+ }
833
+
834
+ .theme-light .tel-reset-btn:hover:not(:disabled) {
835
+ background: rgba(220, 38, 38, 0.08);
836
+ border-color: var(--tel-color-red-active);
837
+ box-shadow: 0 4px 12px rgba(220, 38, 38, 0.12);
838
+ }
839
+
840
+ .theme-light .tel-trigger-pad:disabled,
841
+ .theme-light .tel-reset-btn:disabled {
842
+ opacity: 0.35;
843
+ background: var(--bg-surface);
844
+ border-color: var(--border-color);
845
+ color: var(--text-base);
846
+ filter: grayscale(1);
847
+ }
848
+
849
+ .theme-light .tel-helper-text {
850
+ fill: color-mix(in srgb, var(--accent) 80%, #000);
851
+ }
852
+
853
+ .theme-light .tel-helper-text-gray {
854
+ fill: var(--text-base);
855
+ opacity: 0.65;
856
+ }