@jjlmoya/utils-audiovisual 1.5.0 → 1.7.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 (43) hide show
  1. package/package.json +58 -58
  2. package/src/category/i18n/fr.ts +1 -1
  3. package/src/tests/schemas_fulfillment.test.ts +23 -0
  4. package/src/tests/title_quality.test.ts +55 -0
  5. package/src/tool/chromaticLens/component.astro +38 -38
  6. package/src/tool/chromaticLens/i18n/en.ts +1 -1
  7. package/src/tool/chromaticLens/i18n/es.ts +1 -1
  8. package/src/tool/chromaticLens/i18n/fr.ts +1 -1
  9. package/src/tool/collageMaker/component.astro +47 -47
  10. package/src/tool/collageMaker/i18n/en.ts +1 -1
  11. package/src/tool/collageMaker/i18n/es.ts +1 -1
  12. package/src/tool/collageMaker/i18n/fr.ts +1 -1
  13. package/src/tool/exifCleaner/component.astro +49 -48
  14. package/src/tool/exifCleaner/i18n/en.ts +2 -2
  15. package/src/tool/exifCleaner/i18n/es.ts +2 -2
  16. package/src/tool/exifCleaner/i18n/fr.ts +3 -3
  17. package/src/tool/imageCompressor/component.astro +144 -106
  18. package/src/tool/imageCompressor/i18n/en.ts +12 -2
  19. package/src/tool/imageCompressor/i18n/es.ts +13 -3
  20. package/src/tool/imageCompressor/i18n/fr.ts +12 -2
  21. package/src/tool/imageCompressor/index.ts +10 -0
  22. package/src/tool/printQualityCalculator/component.astro +129 -104
  23. package/src/tool/printQualityCalculator/i18n/en.ts +17 -3
  24. package/src/tool/printQualityCalculator/i18n/es.ts +19 -5
  25. package/src/tool/printQualityCalculator/i18n/fr.ts +18 -4
  26. package/src/tool/printQualityCalculator/index.ts +14 -0
  27. package/src/tool/privacyBlur/component.astro +35 -35
  28. package/src/tool/privacyBlur/i18n/en.ts +1 -1
  29. package/src/tool/privacyBlur/i18n/es.ts +1 -1
  30. package/src/tool/privacyBlur/i18n/fr.ts +1 -1
  31. package/src/tool/subtitleSync/component.astro +42 -42
  32. package/src/tool/subtitleSync/i18n/en.ts +1 -1
  33. package/src/tool/subtitleSync/i18n/es.ts +1 -1
  34. package/src/tool/subtitleSync/i18n/fr.ts +3 -3
  35. package/src/tool/timelapseCalculator/component.astro +41 -42
  36. package/src/tool/tvDistance/component.astro +55 -55
  37. package/src/tool/tvDistance/i18n/en.ts +1 -1
  38. package/src/tool/tvDistance/i18n/es.ts +1 -1
  39. package/src/tool/tvDistance/i18n/fr.ts +1 -1
  40. package/src/tool/videoFrameExtractor/component.astro +54 -54
  41. package/src/tool/videoFrameExtractor/i18n/en.ts +1 -1
  42. package/src/tool/videoFrameExtractor/i18n/es.ts +1 -1
  43. package/src/tool/videoFrameExtractor/i18n/fr.ts +1 -1
@@ -186,7 +186,7 @@ const { ui } = Astro.props;
186
186
  </script>
187
187
 
188
188
  <style>
189
- .ss-root {
189
+ :global(.ss-root) {
190
190
  --ss-bg: #fff;
191
191
  --ss-bg-elevated: #f8fafc;
192
192
  --ss-border: #e2e8f0;
@@ -202,7 +202,7 @@ const { ui } = Astro.props;
202
202
  margin: 0 auto;
203
203
  }
204
204
 
205
- :global(.theme-dark) .ss-root {
205
+ :global(.theme-dark .ss-root) {
206
206
  --ss-bg: #18181b;
207
207
  --ss-bg-elevated: #27272a;
208
208
  --ss-border: #3f3f46;
@@ -214,7 +214,7 @@ const { ui } = Astro.props;
214
214
  --ss-shadow: rgba(0, 0, 0, 0.3);
215
215
  }
216
216
 
217
- .ss-card {
217
+ :global(.ss-card) {
218
218
  background: var(--ss-bg);
219
219
  border: 1px solid var(--ss-border);
220
220
  border-radius: 2.5rem;
@@ -225,7 +225,7 @@ const { ui } = Astro.props;
225
225
  gap: 3rem;
226
226
  }
227
227
 
228
- .ss-drop {
228
+ :global(.ss-drop) {
229
229
  border: 3px dashed var(--ss-border);
230
230
  padding: 3.5rem 2.5rem;
231
231
  border-radius: 2.25rem;
@@ -239,13 +239,13 @@ const { ui } = Astro.props;
239
239
  text-align: center;
240
240
  }
241
241
 
242
- .ss-drop:hover,
243
- .ss-drop-active {
242
+ :global(.ss-drop:hover),
243
+ :global(.ss-drop-active) {
244
244
  border-color: var(--ss-accent);
245
245
  background: var(--ss-accent-alpha);
246
246
  }
247
247
 
248
- .ss-drop-icon {
248
+ :global(.ss-drop-icon) {
249
249
  width: 4.5rem;
250
250
  height: 4.5rem;
251
251
  background: var(--ss-accent-alpha);
@@ -256,19 +256,19 @@ const { ui } = Astro.props;
256
256
  color: var(--ss-accent);
257
257
  }
258
258
 
259
- .ss-drop-icon svg {
259
+ :global(.ss-drop-icon svg) {
260
260
  width: 2.25rem;
261
261
  height: 2.25rem;
262
262
  }
263
263
 
264
- .ss-drop-title {
264
+ :global(.ss-drop-title) {
265
265
  font-size: 1.75rem;
266
266
  font-weight: 950;
267
267
  color: var(--ss-text);
268
268
  margin: 0;
269
269
  }
270
270
 
271
- .ss-drop-sub {
271
+ :global(.ss-drop-sub) {
272
272
  font-size: 1rem;
273
273
  color: var(--ss-text-muted);
274
274
  max-width: 320px;
@@ -276,7 +276,7 @@ const { ui } = Astro.props;
276
276
  font-weight: 700;
277
277
  }
278
278
 
279
- .ss-controls {
279
+ :global(.ss-controls) {
280
280
  display: grid;
281
281
  grid-template-columns: 1fr 1fr;
282
282
  gap: 3rem;
@@ -284,18 +284,18 @@ const { ui } = Astro.props;
284
284
  }
285
285
 
286
286
  @media (max-width: 800px) {
287
- .ss-controls {
287
+ :global(.ss-controls) {
288
288
  grid-template-columns: 1fr;
289
289
  }
290
290
  }
291
291
 
292
- .ss-control-group {
292
+ :global(.ss-control-group) {
293
293
  display: flex;
294
294
  flex-direction: column;
295
295
  gap: 1.5rem;
296
296
  }
297
297
 
298
- .ss-control-label {
298
+ :global(.ss-control-label) {
299
299
  font-size: 0.8rem;
300
300
  font-weight: 900;
301
301
  text-transform: uppercase;
@@ -303,7 +303,7 @@ const { ui } = Astro.props;
303
303
  letter-spacing: 0.1em;
304
304
  }
305
305
 
306
- .ss-offset-wrap {
306
+ :global(.ss-offset-wrap) {
307
307
  display: flex;
308
308
  align-items: center;
309
309
  gap: 1rem;
@@ -313,7 +313,7 @@ const { ui } = Astro.props;
313
313
  padding: 0.75rem 1.25rem;
314
314
  }
315
315
 
316
- .ss-offset-btn {
316
+ :global(.ss-offset-btn) {
317
317
  width: 2.5rem;
318
318
  height: 2.5rem;
319
319
  background: none;
@@ -327,16 +327,16 @@ const { ui } = Astro.props;
327
327
  flex-shrink: 0;
328
328
  }
329
329
 
330
- .ss-offset-btn:hover {
330
+ :global(.ss-offset-btn:hover) {
331
331
  color: var(--ss-accent);
332
332
  }
333
333
 
334
- .ss-offset-btn svg {
334
+ :global(.ss-offset-btn svg) {
335
335
  width: 1.5rem;
336
336
  height: 1.5rem;
337
337
  }
338
338
 
339
- .ss-offset-input {
339
+ :global(.ss-offset-input) {
340
340
  flex: 1;
341
341
  background: transparent;
342
342
  border: none;
@@ -348,28 +348,28 @@ const { ui } = Astro.props;
348
348
  text-align: center;
349
349
  }
350
350
 
351
- .ss-stats {
351
+ :global(.ss-stats) {
352
352
  display: flex;
353
353
  gap: 2rem;
354
354
  justify-content: center;
355
355
  margin-top: 1rem;
356
356
  }
357
357
 
358
- .ss-stat {
358
+ :global(.ss-stat) {
359
359
  display: flex;
360
360
  flex-direction: column;
361
361
  align-items: center;
362
362
  gap: 0.25rem;
363
363
  }
364
364
 
365
- .ss-stat-value {
365
+ :global(.ss-stat-value) {
366
366
  display: block;
367
367
  font-weight: 900;
368
368
  color: var(--ss-accent);
369
369
  font-size: 1.25rem;
370
370
  }
371
371
 
372
- .ss-stat-label {
372
+ :global(.ss-stat-label) {
373
373
  font-size: 0.7rem;
374
374
  font-weight: 800;
375
375
  text-transform: uppercase;
@@ -377,33 +377,33 @@ const { ui } = Astro.props;
377
377
  letter-spacing: 0.05em;
378
378
  }
379
379
 
380
- .ss-status-card {
380
+ :global(.ss-status-card) {
381
381
  display: flex;
382
382
  flex-direction: column;
383
383
  gap: 1.5rem;
384
384
  }
385
385
 
386
- .ss-file-row {
386
+ :global(.ss-file-row) {
387
387
  display: flex;
388
388
  align-items: center;
389
389
  gap: 1.5rem;
390
390
  }
391
391
 
392
- .ss-file-icon {
392
+ :global(.ss-file-icon) {
393
393
  width: 3rem;
394
394
  height: 3rem;
395
395
  color: var(--ss-accent);
396
396
  flex-shrink: 0;
397
397
  }
398
398
 
399
- .ss-file-info {
399
+ :global(.ss-file-info) {
400
400
  display: flex;
401
401
  flex-direction: column;
402
402
  gap: 0.25rem;
403
403
  min-width: 0;
404
404
  }
405
405
 
406
- .ss-file-name {
406
+ :global(.ss-file-name) {
407
407
  font-weight: 950;
408
408
  color: var(--ss-text);
409
409
  font-size: 0.95rem;
@@ -412,13 +412,13 @@ const { ui } = Astro.props;
412
412
  text-overflow: ellipsis;
413
413
  }
414
414
 
415
- .ss-file-times {
415
+ :global(.ss-file-times) {
416
416
  font-size: 0.8rem;
417
417
  font-weight: 700;
418
418
  color: var(--ss-text-muted);
419
419
  }
420
420
 
421
- .ss-btn-primary {
421
+ :global(.ss-btn-primary) {
422
422
  width: 100%;
423
423
  padding: 1.25rem;
424
424
  background: var(--ss-accent);
@@ -435,17 +435,17 @@ const { ui } = Astro.props;
435
435
  transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.3s;
436
436
  }
437
437
 
438
- .ss-btn-primary:hover {
438
+ :global(.ss-btn-primary:hover) {
439
439
  transform: translateY(-4px) scale(1.02);
440
440
  box-shadow: 0 15px 35px -10px var(--ss-accent);
441
441
  }
442
442
 
443
- .ss-btn-primary svg {
443
+ :global(.ss-btn-primary svg) {
444
444
  width: 1.25rem;
445
445
  height: 1.25rem;
446
446
  }
447
447
 
448
- .ss-previews {
448
+ :global(.ss-previews) {
449
449
  grid-column: 1 / -1;
450
450
  display: grid;
451
451
  grid-template-columns: 1fr 1fr;
@@ -453,13 +453,13 @@ const { ui } = Astro.props;
453
453
  }
454
454
 
455
455
  @media (max-width: 800px) {
456
- .ss-previews {
456
+ :global(.ss-previews) {
457
457
  grid-column: auto;
458
458
  grid-template-columns: 1fr;
459
459
  }
460
460
  }
461
461
 
462
- .ss-preview-box {
462
+ :global(.ss-preview-box) {
463
463
  background: var(--ss-bg-elevated);
464
464
  padding: 1.5rem;
465
465
  border-radius: 1.75rem;
@@ -469,7 +469,7 @@ const { ui } = Astro.props;
469
469
  gap: 1rem;
470
470
  }
471
471
 
472
- .ss-preview-label {
472
+ :global(.ss-preview-label) {
473
473
  font-size: 0.75rem;
474
474
  font-weight: 950;
475
475
  text-transform: uppercase;
@@ -478,11 +478,11 @@ const { ui } = Astro.props;
478
478
  letter-spacing: 0.05em;
479
479
  }
480
480
 
481
- .ss-preview-label-modified {
481
+ :global(.ss-preview-label-modified) {
482
482
  color: var(--ss-accent);
483
483
  }
484
484
 
485
- .ss-preview-scroll {
485
+ :global(.ss-preview-scroll) {
486
486
  max-height: 250px;
487
487
  overflow-y: auto;
488
488
  display: flex;
@@ -490,25 +490,25 @@ const { ui } = Astro.props;
490
490
  gap: 1rem;
491
491
  }
492
492
 
493
- .ss-preview-item {
493
+ :global(.ss-preview-item) {
494
494
  font-size: 0.85rem;
495
495
  line-height: 1.5;
496
496
  }
497
497
 
498
- .ss-preview-time {
498
+ :global(.ss-preview-time) {
499
499
  font-weight: 950;
500
500
  color: var(--ss-accent);
501
501
  font-size: 0.75rem;
502
502
  margin: 0 0 0.25rem;
503
503
  }
504
504
 
505
- .ss-preview-text {
505
+ :global(.ss-preview-text) {
506
506
  font-weight: 700;
507
507
  color: var(--ss-text);
508
508
  margin: 0;
509
509
  }
510
510
 
511
- .ss-hidden {
511
+ :global(.ss-hidden) {
512
512
  display: none;
513
513
  }
514
514
  </style>
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { SubtitleSyncUI, SubtitleSyncLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'synchronize-srt-subtitles-online-adjust-timing-free';
5
- const title = 'Synchronize SRT Subtitles Online - Adjust Timing for Free';
5
+ const title = 'Synchronize SRT Subtitles Online: Adjust Timing for Free';
6
6
  const description = 'Online tool to advance or delay SRT subtitles. Correct timing offset easily and download the synchronized file instantly.';
7
7
 
8
8
  const ui: SubtitleSyncUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { SubtitleSyncUI, SubtitleSyncLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'sincronizar-subtitulos';
5
- const title = 'Sincronizar Subtítulos SRT Online - Ajusta el Tiempo Gratis';
5
+ const title = 'Sincronizar Subtítulos SRT Online: Ajusta el Tiempo Gratis';
6
6
  const description = 'Herramienta online para adelantar o retrasar subtítulos SRT. Corrige el desfase de tiempo de forma sencilla y descarga el archivo sincronizado al instante.';
7
7
 
8
8
  const ui: SubtitleSyncUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { SubtitleSyncUI, SubtitleSyncLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'synchroniser-sous-titres-srt-en-ligne-ajuster-temps-gratuit';
5
- const title = 'Synchroniser les Sous-titres SRT en Ligne - Ajustez le Temps Gratuitement';
5
+ const title = 'Synchronisation SRT en Ligne: Ajustez le Temps Gratuitement';
6
6
  const description = 'Outil en ligne pour avancer ou retarder les sous-titres SRT. Corrigez le décalage de temps simplement et téléchargez le fichier synchronisé instantanément.';
7
7
 
8
8
  const ui: SubtitleSyncUI = {
@@ -73,7 +73,7 @@ const bibliography: SubtitleSyncLocaleContent['bibliography'] = [
73
73
  const seo: SubtitleSyncLocaleContent['seo'] = [
74
74
  {
75
75
  type: 'summary',
76
- title: 'Synchronisation de Sous-titres Professionnelle',
76
+ title: 'Synchronisation SRT Professionnelle',
77
77
  items: [
78
78
  'Correction instantanée des décalages audio-sous-titres',
79
79
  'Supporte les fichiers SRT (SubRip) standards',
@@ -103,7 +103,7 @@ const seo: SubtitleSyncLocaleContent['seo'] = [
103
103
  { type: 'title', text: 'Cas d\'Utilisation Courants', level: 3 },
104
104
  { type: 'comparative', items: [
105
105
  {
106
- title: 'Traducteurs et Sous-titreurs',
106
+ title: 'Traducteurs et Professionnels SRT',
107
107
  description: 'Synchroniser des traductions après avoir travaillé avec plusieurs versions vidéo',
108
108
  icon: 'mdi:translate',
109
109
  points: [
@@ -132,7 +132,6 @@ const { ui } = Astro.props;
132
132
  els.shutter.innerText = formatShutter(r.shutterSpeed);
133
133
  }
134
134
 
135
- // eslint-disable-next-line complexity
136
135
  function recalculate() {
137
136
  const h = +(els.hours?.value || 0), m = +(els.minutes?.value || 0), s = +(els.seconds?.value || 0), f = +(els.fps?.value || 24);
138
137
  updateResultDisplay(calculateTimelapse(h * 3600 + m * 60, s, f));
@@ -147,13 +146,13 @@ const { ui } = Astro.props;
147
146
  </script>
148
147
 
149
148
  <style>
150
- .tlc-root {
149
+ :global(.tlc-root) {
151
150
  width: 100%;
152
151
  max-width: 64rem;
153
152
  margin: 0 auto;
154
153
  }
155
154
 
156
- .tlc-grid {
155
+ :global(.tlc-grid) {
157
156
  display: grid;
158
157
  grid-template-columns: 1fr 1fr;
159
158
  border-radius: 1.5rem;
@@ -162,7 +161,7 @@ const { ui } = Astro.props;
162
161
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);
163
162
  }
164
163
 
165
- :global(.theme-dark) .tlc-grid {
164
+ :global(.theme-dark .tlc-grid) {
166
165
  border-color: #334155;
167
166
  box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
168
167
  }
@@ -173,7 +172,7 @@ const { ui } = Astro.props;
173
172
  }
174
173
  }
175
174
 
176
- .tlc-inputs-panel {
175
+ :global(.tlc-inputs-panel) {
177
176
  padding: 2rem 3rem;
178
177
  background: #f8fafc;
179
178
  display: flex;
@@ -181,17 +180,17 @@ const { ui } = Astro.props;
181
180
  gap: 2rem;
182
181
  }
183
182
 
184
- :global(.theme-dark) .tlc-inputs-panel {
183
+ :global(.theme-dark .tlc-inputs-panel) {
185
184
  background: rgba(15, 23, 42, 0.5);
186
185
  }
187
186
 
188
187
  @media (max-width: 768px) {
189
- .tlc-inputs-panel {
188
+ :global(.tlc-inputs-panel) {
190
189
  padding: 2rem;
191
190
  }
192
191
  }
193
192
 
194
- .tlc-panel-title {
193
+ :global(.tlc-panel-title) {
195
194
  display: flex;
196
195
  align-items: center;
197
196
  gap: 0.5rem;
@@ -201,29 +200,29 @@ const { ui } = Astro.props;
201
200
  margin: 0;
202
201
  }
203
202
 
204
- :global(.theme-dark) .tlc-panel-title {
203
+ :global(.theme-dark .tlc-panel-title) {
205
204
  color: #f8fafc;
206
205
  }
207
206
 
208
- .tlc-panel-icon {
207
+ :global(.tlc-panel-icon) {
209
208
  width: 1.25rem;
210
209
  height: 1.25rem;
211
210
  color: #6366f1;
212
211
  }
213
212
 
214
- .tlc-fields {
213
+ :global(.tlc-fields) {
215
214
  display: flex;
216
215
  flex-direction: column;
217
216
  gap: 1.5rem;
218
217
  }
219
218
 
220
- .tlc-field-group {
219
+ :global(.tlc-field-group) {
221
220
  display: flex;
222
221
  flex-direction: column;
223
222
  gap: 0.75rem;
224
223
  }
225
224
 
226
- .tlc-group-label {
225
+ :global(.tlc-group-label) {
227
226
  font-size: 0.7rem;
228
227
  font-weight: 700;
229
228
  text-transform: uppercase;
@@ -231,25 +230,25 @@ const { ui } = Astro.props;
231
230
  color: #64748b;
232
231
  }
233
232
 
234
- .tlc-row {
233
+ :global(.tlc-row) {
235
234
  display: flex;
236
235
  gap: 1rem;
237
236
  }
238
237
 
239
- .tlc-field {
238
+ :global(.tlc-field) {
240
239
  flex: 1;
241
240
  display: flex;
242
241
  flex-direction: column;
243
242
  gap: 0.25rem;
244
243
  }
245
244
 
246
- .tlc-sub-label {
245
+ :global(.tlc-sub-label) {
247
246
  font-size: 0.7rem;
248
247
  color: #94a3b8;
249
248
  margin-left: 0.25rem;
250
249
  }
251
250
 
252
- .tlc-input {
251
+ :global(.tlc-input) {
253
252
  width: 100%;
254
253
  background: #fff;
255
254
  border: 2px solid #e2e8f0;
@@ -263,41 +262,41 @@ const { ui } = Astro.props;
263
262
  box-sizing: border-box;
264
263
  }
265
264
 
266
- :global(.theme-dark) .tlc-input {
265
+ :global(.theme-dark .tlc-input) {
267
266
  background: #1e293b;
268
267
  border-color: #334155;
269
268
  color: #f8fafc;
270
269
  }
271
270
 
272
- .tlc-input-indigo:focus {
271
+ :global(.tlc-input-indigo:focus) {
273
272
  border-color: #6366f1;
274
273
  box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.15);
275
274
  }
276
275
 
277
- :global(.theme-dark) .tlc-input-indigo:focus {
276
+ :global(.theme-dark .tlc-input-indigo:focus) {
278
277
  box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.25);
279
278
  }
280
279
 
281
- .tlc-input-pink:focus {
280
+ :global(.tlc-input-pink:focus) {
282
281
  border-color: #ec4899;
283
282
  box-shadow: 0 0 0 3px rgba(236, 72, 153, 0.15);
284
283
  }
285
284
 
286
- :global(.theme-dark) .tlc-input-pink:focus {
285
+ :global(.theme-dark .tlc-input-pink:focus) {
287
286
  box-shadow: 0 0 0 3px rgba(236, 72, 153, 0.25);
288
287
  }
289
288
 
290
- .tlc-select-wrapper {
289
+ :global(.tlc-select-wrapper) {
291
290
  position: relative;
292
291
  }
293
292
 
294
- .tlc-select {
293
+ :global(.tlc-select) {
295
294
  appearance: none;
296
295
  cursor: pointer;
297
296
  width: 100%;
298
297
  }
299
298
 
300
- .tlc-select-arrow {
299
+ :global(.tlc-select-arrow) {
301
300
  position: absolute;
302
301
  right: 1rem;
303
302
  top: 50%;
@@ -308,7 +307,7 @@ const { ui } = Astro.props;
308
307
  pointer-events: none;
309
308
  }
310
309
 
311
- .tlc-results-panel {
310
+ :global(.tlc-results-panel) {
312
311
  padding: 2rem 3rem;
313
312
  background: linear-gradient(135deg, #4f46e5, #7c3aed);
314
313
  color: #fff;
@@ -319,12 +318,12 @@ const { ui } = Astro.props;
319
318
  }
320
319
 
321
320
  @media (max-width: 768px) {
322
- .tlc-results-panel {
321
+ :global(.tlc-results-panel) {
323
322
  padding: 2rem;
324
323
  }
325
324
  }
326
325
 
327
- .tlc-results-title {
326
+ :global(.tlc-results-title) {
328
327
  display: flex;
329
328
  align-items: center;
330
329
  gap: 0.5rem;
@@ -334,19 +333,19 @@ const { ui } = Astro.props;
334
333
  margin: 0;
335
334
  }
336
335
 
337
- .tlc-results-icon {
336
+ :global(.tlc-results-icon) {
338
337
  width: 1.25rem;
339
338
  height: 1.25rem;
340
339
  color: #a5b4fc;
341
340
  }
342
341
 
343
- .tlc-interval-section {
342
+ :global(.tlc-interval-section) {
344
343
  display: flex;
345
344
  flex-direction: column;
346
345
  gap: 0.5rem;
347
346
  }
348
347
 
349
- .tlc-interval-label {
348
+ :global(.tlc-interval-label) {
350
349
  font-size: 0.7rem;
351
350
  font-weight: 700;
352
351
  text-transform: uppercase;
@@ -355,38 +354,38 @@ const { ui } = Astro.props;
355
354
  margin: 0;
356
355
  }
357
356
 
358
- .tlc-interval-value {
357
+ :global(.tlc-interval-value) {
359
358
  display: flex;
360
359
  align-items: baseline;
361
360
  gap: 0.5rem;
362
361
  }
363
362
 
364
- .tlc-big-number {
363
+ :global(.tlc-big-number) {
365
364
  font-size: clamp(3.5rem, 8vw, 5rem);
366
365
  font-weight: 900;
367
366
  letter-spacing: -0.03em;
368
367
  line-height: 1;
369
368
  }
370
369
 
371
- .tlc-big-unit {
370
+ :global(.tlc-big-unit) {
372
371
  font-size: 1.5rem;
373
372
  font-weight: 700;
374
373
  color: #a5b4fc;
375
374
  }
376
375
 
377
- .tlc-stats-grid {
376
+ :global(.tlc-stats-grid) {
378
377
  display: grid;
379
378
  grid-template-columns: 1fr 1fr;
380
379
  gap: 1.5rem 2rem;
381
380
  }
382
381
 
383
- .tlc-stat {
382
+ :global(.tlc-stat) {
384
383
  display: flex;
385
384
  flex-direction: column;
386
385
  gap: 0.25rem;
387
386
  }
388
387
 
389
- .tlc-stat-label {
388
+ :global(.tlc-stat-label) {
390
389
  font-size: 0.65rem;
391
390
  font-weight: 700;
392
391
  text-transform: uppercase;
@@ -395,7 +394,7 @@ const { ui } = Astro.props;
395
394
  margin: 0;
396
395
  }
397
396
 
398
- .tlc-stat-value {
397
+ :global(.tlc-stat-value) {
399
398
  font-size: 1.875rem;
400
399
  font-weight: 700;
401
400
  font-variant-numeric: tabular-nums;
@@ -403,12 +402,12 @@ const { ui } = Astro.props;
403
402
  line-height: 1.1;
404
403
  }
405
404
 
406
- .tlc-stat-value-sm {
405
+ :global(.tlc-stat-value-sm) {
407
406
  font-size: 1.25rem;
408
407
  color: #e0e7ff;
409
408
  }
410
409
 
411
- .tlc-rule-info {
410
+ :global(.tlc-rule-info) {
412
411
  display: flex;
413
412
  align-items: flex-start;
414
413
  gap: 1rem;
@@ -416,7 +415,7 @@ const { ui } = Astro.props;
416
415
  border-top: 1px solid rgba(165, 180, 252, 0.3);
417
416
  }
418
417
 
419
- .tlc-info-icon {
418
+ :global(.tlc-info-icon) {
420
419
  width: 1.5rem;
421
420
  height: 1.5rem;
422
421
  color: #a5b4fc;
@@ -424,7 +423,7 @@ const { ui } = Astro.props;
424
423
  margin-top: 0.1rem;
425
424
  }
426
425
 
427
- .tlc-info-text {
426
+ :global(.tlc-info-text) {
428
427
  font-size: 0.8rem;
429
428
  line-height: 1.5;
430
429
  color: #c7d2fe;