@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
@@ -1,8 +1,8 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { PrintQualityCalculatorUI, PrintQualityCalculatorLocaleContent } from '../index';
3
3
 
4
- const slug = 'calidad-impresion';
5
- const title = 'Calculadora de Calidad de Impresión - Píxeles a CM y DPI';
4
+ const slug = 'calculadora-calidad-impresion';
5
+ const title = 'Calculadora de Calidad de Impresión: Píxeles a CM y DPI';
6
6
  const description = 'Calcula el tamaño máximo de impresión de tus fotos según su resolución. Convierte píxeles a centímetros y pulgadas para asegurar una impresión profesional.';
7
7
 
8
8
  const ui: PrintQualityCalculatorUI = {
@@ -14,7 +14,7 @@ const ui: PrintQualityCalculatorUI = {
14
14
  maxPrintTitle: "Tamaño Máximo de Impresión",
15
15
  standardFormatsTitle: "Formatos Estándar Soportados",
16
16
  formatColumn: "Formato",
17
- measureColumn: "Medidas (cm)",
17
+ measureColumn: "Medidas",
18
18
  supportColumn: "¿Soportado?",
19
19
  qualityExcellent: "Calidad Excelente",
20
20
  qualityGood: "Calidad Buena",
@@ -25,7 +25,21 @@ const ui: PrintQualityCalculatorUI = {
25
25
  qualityFairDesc: "Adecuado para visualización digital o vallas lejanas.",
26
26
  qualityPoorDesc: "La imagen se verá pixelada. No se recomienda imprimir.",
27
27
  unitCm: "cm",
28
- unitInches: "pulg"
28
+ unitInches: "pulg",
29
+ dpiScreenLabel: "Pantalla",
30
+ dpiNewspaperLabel: "Periódico",
31
+ dpiPrintLabel: "Imprenta",
32
+ dpiFineArtLabel: "Fine Art",
33
+ formatPostal: "Postal",
34
+ formatQuartilla: "Cuartilla",
35
+ formatFolio: "Folio",
36
+ formatDoubleFolio: "Doble Folio",
37
+ formatSmallPoster: "Poster Pequeño",
38
+ formatLargePoster: "Poster Grande",
39
+ formatPlane: "Plano",
40
+ supportedText: "Sí (Cubierto)",
41
+ notSupportedPrefix: "No (",
42
+ invalidImageError: "Por favor selecciona una imagen válida"
29
43
  };
30
44
 
31
45
  const faq: PrintQualityCalculatorLocaleContent['faq'] = [
@@ -124,7 +138,7 @@ const seo: PrintQualityCalculatorLocaleContent['seo'] = [
124
138
  ]
125
139
  },
126
140
  {
127
- title: 'Póster de Pared (A3 - 30x42 cm)',
141
+ title: 'Póster de Pared A3 (30x42 cm)',
128
142
  description: '150 DPI suficiente - se ve a distancia',
129
143
  icon: 'mdi:wall-fire',
130
144
  points: [
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { PrintQualityCalculatorUI, PrintQualityCalculatorLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'calculatrice-qualite-impression-pixels-cm-dpi';
5
- const title = 'Calculatrice de Qualité d\'Impression - Pixels en CM et DPI';
5
+ const title = 'Calculatrice de Qualité d\'Impression: Pixels en CM et DPI';
6
6
  const description = 'Calculez la taille d\'impression maximale de vos photos en fonction de leur résolution. Convertissez les pixels en centimètres et en pouces pour une impression professionnelle.';
7
7
 
8
8
  const ui: PrintQualityCalculatorUI = {
@@ -14,7 +14,7 @@ const ui: PrintQualityCalculatorUI = {
14
14
  maxPrintTitle: "Taille d'Impression Maximale",
15
15
  standardFormatsTitle: "Formats Standards Supportés",
16
16
  formatColumn: "Format",
17
- measureColumn: "Mesures (cm)",
17
+ measureColumn: "Mesures",
18
18
  supportColumn: "Supporté ?",
19
19
  qualityExcellent: "Qualité Excellente",
20
20
  qualityGood: "Bonne Qualité",
@@ -25,7 +25,21 @@ const ui: PrintQualityCalculatorUI = {
25
25
  qualityFairDesc: "Adapté pour la visualisation numérique ou les panneaux lointains.",
26
26
  qualityPoorDesc: "L'image aura l'air pixelisée. L'impression n'est pas recommandée.",
27
27
  unitCm: "cm",
28
- unitInches: "po"
28
+ unitInches: "po",
29
+ dpiScreenLabel: "Écran",
30
+ dpiNewspaperLabel: "Journal",
31
+ dpiPrintLabel: "Impression",
32
+ dpiFineArtLabel: "Fine Art",
33
+ formatPostal: "Carte Postale",
34
+ formatQuartilla: "Quille",
35
+ formatFolio: "Folio",
36
+ formatDoubleFolio: "Double Folio",
37
+ formatSmallPoster: "Petit Poster",
38
+ formatLargePoster: "Grand Poster",
39
+ formatPlane: "Plane",
40
+ supportedText: "Oui (Couvert)",
41
+ notSupportedPrefix: "Non (",
42
+ invalidImageError: "Veuillez sélectionner une image valide"
29
43
  };
30
44
 
31
45
  const faq: PrintQualityCalculatorLocaleContent['faq'] = [
@@ -124,7 +138,7 @@ const seo: PrintQualityCalculatorLocaleContent['seo'] = [
124
138
  ]
125
139
  },
126
140
  {
127
- title: 'Poster Mural (A3 - 30x42 cm)',
141
+ title: 'Poster Mural A3 (30x42 cm)',
128
142
  description: '150 DPI suffisant - se voit à distance',
129
143
  icon: 'mdi:wall-fire',
130
144
  points: [
@@ -24,6 +24,20 @@ export interface PrintQualityCalculatorUI {
24
24
  qualityPoorDesc: string;
25
25
  unitCm: string;
26
26
  unitInches: string;
27
+ dpiScreenLabel: string;
28
+ dpiNewspaperLabel: string;
29
+ dpiPrintLabel: string;
30
+ dpiFineArtLabel: string;
31
+ formatPostal: string;
32
+ formatQuartilla: string;
33
+ formatFolio: string;
34
+ formatDoubleFolio: string;
35
+ formatSmallPoster: string;
36
+ formatLargePoster: string;
37
+ formatPlane: string;
38
+ supportedText: string;
39
+ notSupportedPrefix: string;
40
+ invalidImageError: string;
27
41
  [key: string]: string;
28
42
  }
29
43
 
@@ -229,7 +229,7 @@ const { ui } = Astro.props;
229
229
  </script>
230
230
 
231
231
  <style>
232
- .pb-root {
232
+ :global(.pb-root) {
233
233
  --pb-bg: #fff;
234
234
  --pb-bg-muted: #f8fafc;
235
235
  --pb-border: #e2e8f0;
@@ -250,7 +250,7 @@ const { ui } = Astro.props;
250
250
  min-height: 600px;
251
251
  }
252
252
 
253
- :global(.theme-dark) .pb-root {
253
+ :global(.theme-dark .pb-root) {
254
254
  --pb-bg: #09090b;
255
255
  --pb-bg-muted: #18181b;
256
256
  --pb-border: #27272a;
@@ -262,7 +262,7 @@ const { ui } = Astro.props;
262
262
  --pb-toolbar-bg: rgba(9,9,11,0.92);
263
263
  }
264
264
 
265
- .pb-toolbar {
265
+ :global(.pb-toolbar) {
266
266
  position: sticky;
267
267
  top: 0.5rem;
268
268
  z-index: 100;
@@ -282,7 +282,7 @@ const { ui } = Astro.props;
282
282
  gap: 0.75rem;
283
283
  }
284
284
 
285
- .pb-tool-selector {
285
+ :global(.pb-tool-selector) {
286
286
  display: flex;
287
287
  gap: 0.25rem;
288
288
  background: var(--pb-bg-muted);
@@ -290,7 +290,7 @@ const { ui } = Astro.props;
290
290
  padding: 0.25rem;
291
291
  }
292
292
 
293
- .pb-tool-btn {
293
+ :global(.pb-tool-btn) {
294
294
  display: flex;
295
295
  align-items: center;
296
296
  gap: 0.4rem;
@@ -305,31 +305,31 @@ const { ui } = Astro.props;
305
305
  transition: all 0.15s;
306
306
  }
307
307
 
308
- .pb-tool-btn-active {
308
+ :global(.pb-tool-btn-active) {
309
309
  background: var(--pb-bg);
310
310
  color: var(--pb-text);
311
311
  box-shadow: 0 2px 8px var(--pb-shadow);
312
312
  }
313
313
 
314
- .pb-settings-row {
314
+ :global(.pb-settings-row) {
315
315
  display: flex;
316
316
  align-items: center;
317
317
  gap: 0.875rem;
318
318
  }
319
319
 
320
- .pb-intensity-wrap {
320
+ :global(.pb-intensity-wrap) {
321
321
  display: flex;
322
322
  align-items: center;
323
323
  gap: 0.5rem;
324
324
  color: var(--pb-text-muted);
325
325
  }
326
326
 
327
- .pb-slider {
327
+ :global(.pb-slider) {
328
328
  width: 90px;
329
329
  accent-color: var(--pb-primary);
330
330
  }
331
331
 
332
- .pb-auto-btn {
332
+ :global(.pb-auto-btn) {
333
333
  display: flex;
334
334
  align-items: center;
335
335
  gap: 0.4rem;
@@ -344,17 +344,17 @@ const { ui } = Astro.props;
344
344
  transition: opacity 0.15s;
345
345
  }
346
346
 
347
- .pb-auto-btn:hover {
347
+ :global(.pb-auto-btn:hover) {
348
348
  opacity: 0.8;
349
349
  }
350
350
 
351
- .pb-action-group {
351
+ :global(.pb-action-group) {
352
352
  display: flex;
353
353
  align-items: center;
354
354
  gap: 0.625rem;
355
355
  }
356
356
 
357
- .pb-undo-btn {
357
+ :global(.pb-undo-btn) {
358
358
  width: 2.5rem;
359
359
  height: 2.5rem;
360
360
  border-radius: 0.75rem;
@@ -368,17 +368,17 @@ const { ui } = Astro.props;
368
368
  transition: all 0.15s;
369
369
  }
370
370
 
371
- .pb-undo-btn:hover:not(:disabled) {
371
+ :global(.pb-undo-btn:hover:not(:disabled)) {
372
372
  border-color: var(--pb-primary);
373
373
  color: var(--pb-primary);
374
374
  }
375
375
 
376
- .pb-undo-btn:disabled {
376
+ :global(.pb-undo-btn:disabled) {
377
377
  opacity: 0.35;
378
378
  cursor: not-allowed;
379
379
  }
380
380
 
381
- .pb-download-btn {
381
+ :global(.pb-download-btn) {
382
382
  display: flex;
383
383
  align-items: center;
384
384
  gap: 0.5rem;
@@ -394,24 +394,24 @@ const { ui } = Astro.props;
394
394
  transition: all 0.2s;
395
395
  }
396
396
 
397
- .pb-download-btn:hover:not(:disabled) {
397
+ :global(.pb-download-btn:hover:not(:disabled)) {
398
398
  transform: translateY(-1px);
399
399
  box-shadow: 0 6px 20px rgba(99,102,241,0.45);
400
400
  }
401
401
 
402
- .pb-download-btn:disabled {
402
+ :global(.pb-download-btn:disabled) {
403
403
  opacity: 0.4;
404
404
  cursor: not-allowed;
405
405
  box-shadow: none;
406
406
  }
407
407
 
408
- .pb-icon {
408
+ :global(.pb-icon) {
409
409
  width: 1.1rem;
410
410
  height: 1.1rem;
411
411
  flex-shrink: 0;
412
412
  }
413
413
 
414
- .pb-workspace {
414
+ :global(.pb-workspace) {
415
415
  flex: 1;
416
416
  position: relative;
417
417
  background: var(--pb-bg-muted);
@@ -425,12 +425,12 @@ const { ui } = Astro.props;
425
425
  transition: border-color 0.2s;
426
426
  }
427
427
 
428
- .pb-dragging .pb-workspace {
428
+ :global(.pb-dragging .pb-workspace) {
429
429
  border-color: var(--pb-primary);
430
430
  background: var(--pb-primary-light);
431
431
  }
432
432
 
433
- .pb-empty {
433
+ :global(.pb-empty) {
434
434
  width: 100%;
435
435
  height: 100%;
436
436
  display: flex;
@@ -443,7 +443,7 @@ const { ui } = Astro.props;
443
443
  gap: 0.75rem;
444
444
  }
445
445
 
446
- .pb-upload-icon {
446
+ :global(.pb-upload-icon) {
447
447
  width: 5rem;
448
448
  height: 5rem;
449
449
  background: var(--pb-bg);
@@ -457,31 +457,31 @@ const { ui } = Astro.props;
457
457
  margin-bottom: 0.5rem;
458
458
  }
459
459
 
460
- .pb-icon-lg {
460
+ :global(.pb-icon-lg) {
461
461
  width: 2.5rem;
462
462
  height: 2.5rem;
463
463
  }
464
464
 
465
- .pb-empty-title {
465
+ :global(.pb-empty-title) {
466
466
  font-size: 1.75rem;
467
467
  font-weight: 900;
468
468
  color: var(--pb-text);
469
469
  margin: 0;
470
470
  }
471
471
 
472
- .pb-empty-sub {
472
+ :global(.pb-empty-sub) {
473
473
  font-size: 1rem;
474
474
  color: var(--pb-text-muted);
475
475
  margin: 0;
476
476
  }
477
477
 
478
- .pb-badges {
478
+ :global(.pb-badges) {
479
479
  display: flex;
480
480
  gap: 0.75rem;
481
481
  margin-top: 0.5rem;
482
482
  }
483
483
 
484
- .pb-badge {
484
+ :global(.pb-badge) {
485
485
  display: flex;
486
486
  align-items: center;
487
487
  gap: 0.35rem;
@@ -494,12 +494,12 @@ const { ui } = Astro.props;
494
494
  color: var(--pb-text-muted);
495
495
  }
496
496
 
497
- .pb-badge-icon {
497
+ :global(.pb-badge-icon) {
498
498
  width: 0.875rem;
499
499
  height: 0.875rem;
500
500
  }
501
501
 
502
- .pb-loader {
502
+ :global(.pb-loader) {
503
503
  position: absolute;
504
504
  inset: 0;
505
505
  background: rgba(0,0,0,0.5);
@@ -511,7 +511,7 @@ const { ui } = Astro.props;
511
511
  z-index: 10;
512
512
  }
513
513
 
514
- .pb-spinner {
514
+ :global(.pb-spinner) {
515
515
  width: 2.5rem;
516
516
  height: 2.5rem;
517
517
  border: 3px solid rgba(255,255,255,0.2);
@@ -524,14 +524,14 @@ const { ui } = Astro.props;
524
524
  to { transform: rotate(360deg); }
525
525
  }
526
526
 
527
- .pb-loader-text {
527
+ :global(.pb-loader-text) {
528
528
  color: #fff;
529
529
  font-weight: 800;
530
530
  font-size: 0.9rem;
531
531
  margin: 0;
532
532
  }
533
533
 
534
- .pb-canvas-wrap {
534
+ :global(.pb-canvas-wrap) {
535
535
  position: absolute;
536
536
  inset: 0;
537
537
  background: #000;
@@ -540,14 +540,14 @@ const { ui } = Astro.props;
540
540
  justify-content: center;
541
541
  }
542
542
 
543
- .pb-canvas-wrap canvas {
543
+ :global(.pb-canvas-wrap canvas) {
544
544
  width: 100%;
545
545
  height: 100%;
546
546
  object-fit: contain;
547
547
  cursor: crosshair;
548
548
  }
549
549
 
550
- .pb-hidden {
550
+ :global(.pb-hidden) {
551
551
  display: none;
552
552
  }
553
553
 
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'online-privacy-editor-pixelate-blur-faces-photos';
5
- const title = 'Online Privacy Editor - Pixelate and hide faces in photos';
5
+ const title = 'Online Privacy Editor: Pixelate and hide faces in photos';
6
6
  const description = 'Protect your identity by censoring sensitive areas of your photos. Pixelate faces, blur documents, or cover private information 100% locally.';
7
7
 
8
8
  const ui: PrivacyBlurUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'editor-privacidad';
5
- const title = 'Editor de Privacidad Online - Pixela y oculta rostros en fotos';
5
+ const title = 'Editor de Privacidad Online: Pixela y oculta rostros en fotos';
6
6
  const description = 'Protege tu identidad censurando áreas sensibles de tus fotos. Pixela rostros, desenfoca documentos o tapa información privada de forma 100% local.';
7
7
 
8
8
  const ui: PrivacyBlurUI = {
@@ -2,7 +2,7 @@ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dt
2
2
  import type { PrivacyBlurUI, PrivacyBlurLocaleContent } from '../index';
3
3
 
4
4
  const slug = 'editeur-confidentialite-en-ligne-pixeliser-flouter-visages';
5
- const title = 'Éditeur de Confidentialité en Ligne - Pixélisez et masquez les visages';
5
+ const title = 'Éditeur de Confidentialité en Ligne: Pixélisez et masquez les visages';
6
6
  const description = 'Protégez votre identité en censurant les zones sensibles de vos photos. Pixélisez les visages, floutez les documents ou masquez les informations privées 100 % localement.';
7
7
 
8
8
  const ui: PrivacyBlurUI = {