@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
@@ -177,7 +177,7 @@ const { ui } = Astro.props;
177
177
  </script>
178
178
 
179
179
  <style>
180
- .tvd-root {
180
+ :global(.tvd-root) {
181
181
  --tvd-bg: #fff;
182
182
  --tvd-bg-muted: #f8fafc;
183
183
  --tvd-bg-sim: #f1f5f9;
@@ -195,7 +195,7 @@ const { ui } = Astro.props;
195
195
  padding: 1rem;
196
196
  }
197
197
 
198
- :global(.theme-dark) .tvd-root {
198
+ :global(.theme-dark .tvd-root) {
199
199
  --tvd-bg: #09090b;
200
200
  --tvd-bg-muted: #18181b;
201
201
  --tvd-bg-sim: #09090b;
@@ -208,7 +208,7 @@ const { ui } = Astro.props;
208
208
  --tvd-shadow: rgba(0,0,0,0.4);
209
209
  }
210
210
 
211
- .tvd-card {
211
+ :global(.tvd-card) {
212
212
  background: var(--tvd-bg);
213
213
  border: 1px solid var(--tvd-border);
214
214
  border-radius: var(--tvd-radius);
@@ -216,18 +216,18 @@ const { ui } = Astro.props;
216
216
  overflow: hidden;
217
217
  }
218
218
 
219
- .tvd-body {
219
+ :global(.tvd-body) {
220
220
  display: grid;
221
221
  grid-template-columns: 320px 1fr;
222
222
  }
223
223
 
224
224
  @media (max-width: 720px) {
225
- .tvd-body {
225
+ :global(.tvd-body) {
226
226
  grid-template-columns: 1fr;
227
227
  }
228
228
  }
229
229
 
230
- .tvd-left {
230
+ :global(.tvd-left) {
231
231
  padding: 1.75rem;
232
232
  border-right: 1px solid var(--tvd-border);
233
233
  display: flex;
@@ -236,20 +236,20 @@ const { ui } = Astro.props;
236
236
  }
237
237
 
238
238
  @media (max-width: 720px) {
239
- .tvd-left {
239
+ :global(.tvd-left) {
240
240
  border-right: none;
241
241
  border-bottom: 1px solid var(--tvd-border);
242
242
  }
243
243
  }
244
244
 
245
- .tvd-specs-block {
245
+ :global(.tvd-specs-block) {
246
246
  background: var(--tvd-bg);
247
247
  display: flex;
248
248
  flex-direction: column;
249
249
  gap: 1.5rem;
250
250
  }
251
251
 
252
- .tvd-specs-title {
252
+ :global(.tvd-specs-title) {
253
253
  display: flex;
254
254
  align-items: center;
255
255
  gap: 0.5rem;
@@ -259,14 +259,14 @@ const { ui } = Astro.props;
259
259
  margin: 0 0 0.25rem;
260
260
  }
261
261
 
262
- .tvd-tv-icon {
262
+ :global(.tvd-tv-icon) {
263
263
  width: 1.25rem;
264
264
  height: 1.25rem;
265
265
  fill: var(--tvd-primary);
266
266
  flex-shrink: 0;
267
267
  }
268
268
 
269
- .tvd-label {
269
+ :global(.tvd-label) {
270
270
  font-size: 0.65rem;
271
271
  font-weight: 800;
272
272
  text-transform: uppercase;
@@ -274,25 +274,25 @@ const { ui } = Astro.props;
274
274
  color: var(--tvd-text-muted);
275
275
  }
276
276
 
277
- .tvd-field {
277
+ :global(.tvd-field) {
278
278
  display: flex;
279
279
  flex-direction: column;
280
280
  gap: 0.625rem;
281
281
  }
282
282
 
283
- .tvd-field-row {
283
+ :global(.tvd-field-row) {
284
284
  display: flex;
285
285
  justify-content: space-between;
286
286
  align-items: center;
287
287
  }
288
288
 
289
- .tvd-diagonal-val {
289
+ :global(.tvd-diagonal-val) {
290
290
  font-size: 0.85rem;
291
291
  font-weight: 800;
292
292
  color: var(--tvd-primary);
293
293
  }
294
294
 
295
- .tvd-slider {
295
+ :global(.tvd-slider) {
296
296
  width: 100%;
297
297
  height: 6px;
298
298
  accent-color: var(--tvd-primary);
@@ -300,13 +300,13 @@ const { ui } = Astro.props;
300
300
  border-radius: 9999px;
301
301
  }
302
302
 
303
- .tvd-res-grid {
303
+ :global(.tvd-res-grid) {
304
304
  display: grid;
305
305
  grid-template-columns: repeat(3, 1fr);
306
306
  gap: 0.5rem;
307
307
  }
308
308
 
309
- .tvd-res-btn {
309
+ :global(.tvd-res-btn) {
310
310
  padding: 0.625rem 0.25rem;
311
311
  border-radius: 0.75rem;
312
312
  border: 1px solid var(--tvd-border);
@@ -318,19 +318,19 @@ const { ui } = Astro.props;
318
318
  transition: all 0.2s;
319
319
  }
320
320
 
321
- .tvd-res-btn:hover:not(.tvd-res-btn-active) {
321
+ :global(.tvd-res-btn:hover:not(.tvd-res-btn-active)) {
322
322
  border-color: var(--tvd-primary);
323
323
  opacity: 0.7;
324
324
  }
325
325
 
326
- .tvd-res-btn-active {
326
+ :global(.tvd-res-btn-active) {
327
327
  background: var(--tvd-primary);
328
328
  color: #fff;
329
329
  border-color: var(--tvd-primary);
330
330
  box-shadow: 0 4px 12px rgba(37, 99, 235, 0.25);
331
331
  }
332
332
 
333
- .tvd-thx-block {
333
+ :global(.tvd-thx-block) {
334
334
  background: var(--tvd-primary-light);
335
335
  border: 1px solid var(--tvd-primary-border);
336
336
  border-radius: 1rem;
@@ -340,26 +340,26 @@ const { ui } = Astro.props;
340
340
  gap: 0.625rem;
341
341
  }
342
342
 
343
- .tvd-thx-header {
343
+ :global(.tvd-thx-header) {
344
344
  display: flex;
345
345
  align-items: center;
346
346
  gap: 0.5rem;
347
347
  }
348
348
 
349
- .tvd-thx-icon {
349
+ :global(.tvd-thx-icon) {
350
350
  width: 1.125rem;
351
351
  height: 1.125rem;
352
352
  fill: var(--tvd-primary);
353
353
  flex-shrink: 0;
354
354
  }
355
355
 
356
- .tvd-thx-title {
356
+ :global(.tvd-thx-title) {
357
357
  font-size: 0.8rem;
358
358
  font-weight: 800;
359
359
  color: var(--tvd-primary);
360
360
  }
361
361
 
362
- .tvd-thx-desc {
362
+ :global(.tvd-thx-desc) {
363
363
  font-size: 0.75rem;
364
364
  line-height: 1.6;
365
365
  color: var(--tvd-primary);
@@ -367,20 +367,20 @@ const { ui } = Astro.props;
367
367
  margin: 0;
368
368
  }
369
369
 
370
- .tvd-right {
370
+ :global(.tvd-right) {
371
371
  display: flex;
372
372
  flex-direction: column;
373
373
  background: var(--tvd-bg);
374
374
  }
375
375
 
376
- .tvd-sim-badge {
376
+ :global(.tvd-sim-badge) {
377
377
  display: flex;
378
378
  align-items: center;
379
379
  gap: 0.5rem;
380
380
  padding: 1.25rem 1.5rem 0;
381
381
  }
382
382
 
383
- .tvd-sim-dot {
383
+ :global(.tvd-sim-dot) {
384
384
  width: 8px;
385
385
  height: 8px;
386
386
  border-radius: 50%;
@@ -393,7 +393,7 @@ const { ui } = Astro.props;
393
393
  50% { opacity: 0.4; }
394
394
  }
395
395
 
396
- .tvd-sim-badge-text {
396
+ :global(.tvd-sim-badge-text) {
397
397
  font-size: 0.6rem;
398
398
  font-weight: 900;
399
399
  text-transform: uppercase;
@@ -401,7 +401,7 @@ const { ui } = Astro.props;
401
401
  color: var(--tvd-text-muted);
402
402
  }
403
403
 
404
- .tvd-sim-area {
404
+ :global(.tvd-sim-area) {
405
405
  flex: 1;
406
406
  background: var(--tvd-bg-sim);
407
407
  display: flex;
@@ -413,7 +413,7 @@ const { ui } = Astro.props;
413
413
  min-height: 400px;
414
414
  }
415
415
 
416
- .tvd-tv-visual {
416
+ :global(.tvd-tv-visual) {
417
417
  position: relative;
418
418
  display: flex;
419
419
  flex-direction: column;
@@ -421,7 +421,7 @@ const { ui } = Astro.props;
421
421
  transition: width 0.5s ease;
422
422
  }
423
423
 
424
- .tvd-tv-screen {
424
+ :global(.tvd-tv-screen) {
425
425
  background: #0a0a0f;
426
426
  border: 3px solid #27272a;
427
427
  border-radius: 0.5rem;
@@ -435,13 +435,13 @@ const { ui } = Astro.props;
435
435
  box-shadow: 0 20px 50px rgba(0,0,0,0.3);
436
436
  }
437
437
 
438
- .tvd-screen-gradient {
438
+ :global(.tvd-screen-gradient) {
439
439
  position: absolute;
440
440
  inset: 0;
441
441
  background: linear-gradient(135deg, rgba(59,130,246,0.1) 0%, transparent 60%);
442
442
  }
443
443
 
444
- .tvd-screen-ghost {
444
+ :global(.tvd-screen-ghost) {
445
445
  width: 30%;
446
446
  height: 30%;
447
447
  fill: rgba(96,165,250,0.2);
@@ -449,27 +449,27 @@ const { ui } = Astro.props;
449
449
  z-index: 1;
450
450
  }
451
451
 
452
- .tvd-screen-inset {
452
+ :global(.tvd-screen-inset) {
453
453
  position: absolute;
454
454
  inset: 0;
455
455
  box-shadow: inset 0 0 40px rgba(59,130,246,0.08);
456
456
  }
457
457
 
458
- .tvd-stand-neck {
458
+ :global(.tvd-stand-neck) {
459
459
  width: 16px;
460
460
  height: 16px;
461
461
  background: #27272a;
462
462
  margin-top: -1px;
463
463
  }
464
464
 
465
- .tvd-stand-base {
465
+ :global(.tvd-stand-base) {
466
466
  width: 70px;
467
467
  height: 6px;
468
468
  background: #27272a;
469
469
  border-radius: 3px;
470
470
  }
471
471
 
472
- .tvd-tv-tooltip {
472
+ :global(.tvd-tv-tooltip) {
473
473
  position: absolute;
474
474
  top: -2.25rem;
475
475
  left: 50%;
@@ -486,37 +486,37 @@ const { ui } = Astro.props;
486
486
  pointer-events: none;
487
487
  }
488
488
 
489
- .tvd-tv-visual:hover .tvd-tv-tooltip {
489
+ :global(.tvd-tv-visual:hover .tvd-tv-tooltip) {
490
490
  opacity: 1;
491
491
  }
492
492
 
493
- .tvd-distance-line {
493
+ :global(.tvd-distance-line) {
494
494
  width: 1px;
495
495
  position: relative;
496
496
  transition: height 0.5s ease;
497
497
  margin: 0.25rem 0;
498
498
  }
499
499
 
500
- .tvd-line-dashed {
500
+ :global(.tvd-line-dashed) {
501
501
  width: 100%;
502
502
  height: 100%;
503
503
  border-left: 1px dashed rgba(59,130,246,0.4);
504
504
  }
505
505
 
506
- .tvd-person {
506
+ :global(.tvd-person) {
507
507
  display: flex;
508
508
  flex-direction: column;
509
509
  align-items: center;
510
510
  gap: 1rem;
511
511
  }
512
512
 
513
- .tvd-person-inner {
513
+ :global(.tvd-person-inner) {
514
514
  display: flex;
515
515
  flex-direction: column;
516
516
  align-items: center;
517
517
  }
518
518
 
519
- .tvd-person-head {
519
+ :global(.tvd-person-head) {
520
520
  width: 2.5rem;
521
521
  height: 2.5rem;
522
522
  border-radius: 50%;
@@ -526,7 +526,7 @@ const { ui } = Astro.props;
526
526
  margin-bottom: 0.25rem;
527
527
  }
528
528
 
529
- .tvd-person-body {
529
+ :global(.tvd-person-body) {
530
530
  width: 4rem;
531
531
  height: 2rem;
532
532
  background: var(--tvd-primary);
@@ -534,7 +534,7 @@ const { ui } = Astro.props;
534
534
  box-shadow: 0 4px 16px rgba(37,99,235,0.3);
535
535
  }
536
536
 
537
- .tvd-location-card {
537
+ :global(.tvd-location-card) {
538
538
  background: var(--tvd-bg);
539
539
  border: 1px solid var(--tvd-border);
540
540
  border-radius: 1rem;
@@ -546,7 +546,7 @@ const { ui } = Astro.props;
546
546
  box-shadow: 0 4px 16px var(--tvd-shadow);
547
547
  }
548
548
 
549
- .tvd-location-label {
549
+ :global(.tvd-location-label) {
550
550
  font-size: 0.6rem;
551
551
  font-weight: 900;
552
552
  text-transform: uppercase;
@@ -554,14 +554,14 @@ const { ui } = Astro.props;
554
554
  color: var(--tvd-text-muted);
555
555
  }
556
556
 
557
- .tvd-location-val {
557
+ :global(.tvd-location-val) {
558
558
  font-size: 1.25rem;
559
559
  font-weight: 900;
560
560
  color: var(--tvd-primary);
561
561
  line-height: 1;
562
562
  }
563
563
 
564
- .tvd-stats {
564
+ :global(.tvd-stats) {
565
565
  display: grid;
566
566
  grid-template-columns: 1fr 1fr 1fr;
567
567
  gap: 0.5rem;
@@ -570,7 +570,7 @@ const { ui } = Astro.props;
570
570
  border-top: 1px solid var(--tvd-border);
571
571
  }
572
572
 
573
- .tvd-stat {
573
+ :global(.tvd-stat) {
574
574
  display: flex;
575
575
  flex-direction: column;
576
576
  align-items: center;
@@ -580,17 +580,17 @@ const { ui } = Astro.props;
580
580
  transition: background 0.2s;
581
581
  }
582
582
 
583
- .tvd-stat:hover {
583
+ :global(.tvd-stat:hover) {
584
584
  background: var(--tvd-bg);
585
585
  }
586
586
 
587
- .tvd-stat-opt {
587
+ :global(.tvd-stat-opt) {
588
588
  background: var(--tvd-bg);
589
589
  border: 1px solid var(--tvd-border);
590
590
  box-shadow: 0 2px 8px var(--tvd-shadow);
591
591
  }
592
592
 
593
- .tvd-stat-label {
593
+ :global(.tvd-stat-label) {
594
594
  font-size: 0.6rem;
595
595
  font-weight: 900;
596
596
  text-transform: uppercase;
@@ -598,17 +598,17 @@ const { ui } = Astro.props;
598
598
  color: var(--tvd-text-muted);
599
599
  }
600
600
 
601
- .tvd-stat-opt .tvd-stat-label {
601
+ :global(.tvd-stat-opt .tvd-stat-label) {
602
602
  color: var(--tvd-primary);
603
603
  }
604
604
 
605
- .tvd-stat-val {
605
+ :global(.tvd-stat-val) {
606
606
  font-size: 1.2rem;
607
607
  font-weight: 900;
608
608
  color: var(--tvd-text);
609
609
  }
610
610
 
611
- .tvd-stat-opt .tvd-stat-val {
611
+ :global(.tvd-stat-opt .tvd-stat-val) {
612
612
  font-size: 1.75rem;
613
613
  color: var(--tvd-primary);
614
614
  }
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { TvDistanceUI, TvDistanceLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'tv-viewing-distance-calculator-thx-4k-optimal-screen';
5
- const title = 'TV Distance Calculator - THX and 4K Optimal Screen';
5
+ const title = 'TV Distance Calculator: THX and 4K Optimal Screen';
6
6
  const description = 'Calculate the ideal distance to watch your television based on its size and resolution. Optimize your Home Cinema with THX and SMPTE standards.';
7
7
 
8
8
  const ui: TvDistanceUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { TvDistanceUI, TvDistanceLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'distancia-tv';
5
- const title = 'Calculadora de Distancia TV - Pantalla Óptima THX y 4K';
5
+ const title = 'Calculadora de Distancia TV: Pantalla Óptima THX y 4K';
6
6
  const description = 'Calcula la distancia ideal para ver tu televisor según su tamaño y resolución. Optimiza tu Home Cinema con los estándares THX y SMPTE.';
7
7
 
8
8
  const ui: TvDistanceUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { TvDistanceUI, TvDistanceLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'calculatrice-distance-tv-ecran-optimal-thx-4k';
5
- const title = 'Calculatrice de Distance TV - Écran Optimal THX et 4K';
5
+ const title = 'Calculatrice de Distance TV: Écran Optimal THX et 4K';
6
6
  const description = 'Calculez la distance idéale pour regarder votre téléviseur en fonction de sa taille et de sa résolution. Optimisez votre Home Cinéma avec les standards THX et SMPTE.';
7
7
 
8
8
  const ui: TvDistanceUI = {