@jjlmoya/utils-audiovisual 1.14.0 → 1.16.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 (44) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +32 -0
  4. package/src/tool/chromaticLens/chromatic-lens-color-palette-extraction-online.css +308 -0
  5. package/src/tool/chromaticLens/component.astro +0 -309
  6. package/src/tool/chromaticLens/entry.ts +39 -0
  7. package/src/tool/chromaticLens/index.ts +2 -41
  8. package/src/tool/collageMaker/component.astro +0 -387
  9. package/src/tool/collageMaker/entry.ts +48 -0
  10. package/src/tool/collageMaker/free-online-photo-collage-maker-professional-compositions.css +386 -0
  11. package/src/tool/collageMaker/index.ts +2 -50
  12. package/src/tool/exifCleaner/component.astro +0 -290
  13. package/src/tool/exifCleaner/entry.ts +53 -0
  14. package/src/tool/exifCleaner/exif-metadata-cleaner-remove-gps-photo-privacy.css +289 -0
  15. package/src/tool/exifCleaner/index.ts +2 -55
  16. package/src/tool/imageCompressor/component.astro +0 -498
  17. package/src/tool/imageCompressor/entry.ts +56 -0
  18. package/src/tool/imageCompressor/index.ts +2 -58
  19. package/src/tool/imageCompressor/online-image-compressor-reduce-file-size-no-quality-loss.css +496 -0
  20. package/src/tool/printQualityCalculator/component.astro +0 -485
  21. package/src/tool/printQualityCalculator/entry.ts +66 -0
  22. package/src/tool/printQualityCalculator/index.ts +2 -68
  23. package/src/tool/printQualityCalculator/print-quality-calculator-pixels-to-cm-dpi.css +483 -0
  24. package/src/tool/privacyBlur/component.astro +0 -334
  25. package/src/tool/privacyBlur/entry.ts +45 -0
  26. package/src/tool/privacyBlur/index.ts +2 -47
  27. package/src/tool/privacyBlur/online-privacy-editor-pixelate-blur-faces-photos.css +332 -0
  28. package/src/tool/subtitleSync/component.astro +0 -327
  29. package/src/tool/subtitleSync/entry.ts +45 -0
  30. package/src/tool/subtitleSync/index.ts +2 -47
  31. package/src/tool/subtitleSync/synchronize-srt-subtitles-online-adjust-timing-free.css +325 -0
  32. package/src/tool/timelapseCalculator/component.astro +0 -285
  33. package/src/tool/timelapseCalculator/entry.ts +48 -0
  34. package/src/tool/timelapseCalculator/index.ts +2 -50
  35. package/src/tool/timelapseCalculator/timelapse-hyperlapse-calculator-perfect-intervals.css +283 -0
  36. package/src/tool/tvDistance/component.astro +0 -437
  37. package/src/tool/tvDistance/entry.ts +45 -0
  38. package/src/tool/tvDistance/index.ts +2 -47
  39. package/src/tool/tvDistance/tv-viewing-distance-calculator-thx-4k-optimal-screen.css +435 -0
  40. package/src/tool/videoFrameExtractor/component.astro +0 -428
  41. package/src/tool/videoFrameExtractor/entry.ts +49 -0
  42. package/src/tool/videoFrameExtractor/index.ts +2 -51
  43. package/src/tool/videoFrameExtractor/online-video-frame-extractor-capture-hd-stills.css +426 -0
  44. package/src/tools.ts +1 -1
@@ -0,0 +1,39 @@
1
+ import type { AudiovisualToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface ChromaticLensUI {
4
+ dropTitle: string;
5
+ dropSubtitle: string;
6
+ processingLabel: string;
7
+ paletteTitle: string;
8
+ copyLabel: string;
9
+ copiedLabel: string;
10
+ colorCountLabel: string;
11
+ [key: string]: string;
12
+ }
13
+
14
+ export type ChromaticLensLocaleContent = ToolLocaleContent<ChromaticLensUI>;
15
+
16
+ export const chromaticLens: AudiovisualToolEntry<ChromaticLensUI> = {
17
+ id: 'lente-cromatica',
18
+ icons: {
19
+ bg: 'mdi:palette-swatch',
20
+ fg: 'mdi:eye-outline',
21
+ },
22
+ i18n: {
23
+ es: async () => (await import('./i18n/es')).content as unknown as ChromaticLensLocaleContent,
24
+ en: async () => (await import('./i18n/en')).content as unknown as ChromaticLensLocaleContent,
25
+ fr: async () => (await import('./i18n/fr')).content as unknown as ChromaticLensLocaleContent,
26
+ de: async () => (await import('./i18n/de')).content as unknown as ChromaticLensLocaleContent,
27
+ it: async () => (await import('./i18n/it')).content as unknown as ChromaticLensLocaleContent,
28
+ pt: async () => (await import('./i18n/pt')).content as unknown as ChromaticLensLocaleContent,
29
+ id: async () => (await import('./i18n/id')).content as unknown as ChromaticLensLocaleContent,
30
+ ja: async () => (await import('./i18n/ja')).content as unknown as ChromaticLensLocaleContent,
31
+ ko: async () => (await import('./i18n/ko')).content as unknown as ChromaticLensLocaleContent,
32
+ nl: async () => (await import('./i18n/nl')).content as unknown as ChromaticLensLocaleContent,
33
+ pl: async () => (await import('./i18n/pl')).content as unknown as ChromaticLensLocaleContent,
34
+ ru: async () => (await import('./i18n/ru')).content as unknown as ChromaticLensLocaleContent,
35
+ sv: async () => (await import('./i18n/sv')).content as unknown as ChromaticLensLocaleContent,
36
+ tr: async () => (await import('./i18n/tr')).content as unknown as ChromaticLensLocaleContent,
37
+ zh: async () => (await import('./i18n/zh')).content as unknown as ChromaticLensLocaleContent,
38
+ },
39
+ };
@@ -1,44 +1,5 @@
1
- import type { AudiovisualToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- export interface ChromaticLensUI {
4
- dropTitle: string;
5
- dropSubtitle: string;
6
- processingLabel: string;
7
- paletteTitle: string;
8
- copyLabel: string;
9
- copiedLabel: string;
10
- colorCountLabel: string;
11
- [key: string]: string;
12
- }
13
-
14
- export type ChromaticLensLocaleContent = ToolLocaleContent<ChromaticLensUI>;
15
-
16
- export const chromaticLens: AudiovisualToolEntry<ChromaticLensUI> = {
17
- id: 'lente-cromatica',
18
- icons: {
19
- bg: 'mdi:palette-swatch',
20
- fg: 'mdi:eye-outline',
21
- },
22
- i18n: {
23
- es: async () => (await import('./i18n/es')).content as unknown as ChromaticLensLocaleContent,
24
- en: async () => (await import('./i18n/en')).content as unknown as ChromaticLensLocaleContent,
25
- fr: async () => (await import('./i18n/fr')).content as unknown as ChromaticLensLocaleContent,
26
- de: async () => (await import('./i18n/de')).content as unknown as ChromaticLensLocaleContent,
27
- it: async () => (await import('./i18n/it')).content as unknown as ChromaticLensLocaleContent,
28
- pt: async () => (await import('./i18n/pt')).content as unknown as ChromaticLensLocaleContent,
29
- id: async () => (await import('./i18n/id')).content as unknown as ChromaticLensLocaleContent,
30
- ja: async () => (await import('./i18n/ja')).content as unknown as ChromaticLensLocaleContent,
31
- ko: async () => (await import('./i18n/ko')).content as unknown as ChromaticLensLocaleContent,
32
- nl: async () => (await import('./i18n/nl')).content as unknown as ChromaticLensLocaleContent,
33
- pl: async () => (await import('./i18n/pl')).content as unknown as ChromaticLensLocaleContent,
34
- ru: async () => (await import('./i18n/ru')).content as unknown as ChromaticLensLocaleContent,
35
- sv: async () => (await import('./i18n/sv')).content as unknown as ChromaticLensLocaleContent,
36
- tr: async () => (await import('./i18n/tr')).content as unknown as ChromaticLensLocaleContent,
37
- zh: async () => (await import('./i18n/zh')).content as unknown as ChromaticLensLocaleContent,
38
- },
39
- };
40
-
41
-
1
+ import { chromaticLens } from './entry';
2
+ export * from './entry';
42
3
  export const CHROMATIC_LENS_TOOL: ToolDefinition = {
43
4
  entry: chromaticLens as unknown as AudiovisualToolEntry,
44
5
  Component: () => import('./component.astro'),
@@ -300,391 +300,4 @@ const dropSub = (ui.dropSub ?? '').replace('{link}', `<span class="cm-drop-link"
300
300
  });
301
301
  </script>
302
302
 
303
- <style>
304
- :global(.cm-root) {
305
- --cm-bg: #fff;
306
- --cm-bg-muted: #f8fafc;
307
- --cm-border: #e2e8f0;
308
- --cm-text: #0f172a;
309
- --cm-text-muted: #64748b;
310
- --cm-primary: #6366f1;
311
- --cm-primary-light: #eef2ff;
312
- --cm-shadow: rgba(0,0,0,0.07);
313
- --cm-radius: 1rem;
314
303
 
315
- max-width: 1100px;
316
- margin: 0 auto;
317
- padding: 1rem;
318
- }
319
-
320
- :global(.theme-dark .cm-root) {
321
- --cm-bg: #1e293b;
322
- --cm-bg-muted: #0f172a;
323
- --cm-border: #334155;
324
- --cm-text: #f1f5f9;
325
- --cm-text-muted: #94a3b8;
326
- --cm-primary: #818cf8;
327
- --cm-primary-light: #1e1b4b;
328
- --cm-shadow: rgba(0,0,0,0.4);
329
- }
330
-
331
- :global(.cm-card) {
332
- background: var(--cm-bg);
333
- border: 1px solid var(--cm-border);
334
- border-radius: var(--cm-radius);
335
- box-shadow: 0 4px 24px var(--cm-shadow);
336
- overflow: hidden;
337
- }
338
-
339
- :global(.cm-top-row) {
340
- display: grid;
341
- grid-template-columns: 300px 1fr;
342
- gap: 0;
343
- }
344
-
345
- @media (max-width: 700px) {
346
- .cm-top-row {
347
- grid-template-columns: 1fr;
348
- }
349
- }
350
-
351
- :global(.cm-left-col) {
352
- padding: 1.25rem;
353
- border-right: 1px solid var(--cm-border);
354
- display: flex;
355
- flex-direction: column;
356
- gap: 1rem;
357
- }
358
-
359
- @media (max-width: 700px) {
360
- .cm-left-col {
361
- border-right: none;
362
- border-bottom: 1px solid var(--cm-border);
363
- }
364
- }
365
-
366
- :global(.cm-drop-zone) {
367
- position: relative;
368
- background: var(--cm-bg-muted);
369
- border: 2px dashed var(--cm-border);
370
- border-radius: 0.75rem;
371
- padding: 1.5rem 1rem;
372
- text-align: center;
373
- cursor: pointer;
374
- transition: border-color 0.2s, background 0.2s;
375
- display: flex;
376
- flex-direction: column;
377
- align-items: center;
378
- gap: 0.35rem;
379
- color: var(--cm-primary);
380
- }
381
-
382
- :global(.cm-drop-zone input[type="file"]) {
383
- position: absolute;
384
- inset: 0;
385
- opacity: 0;
386
- cursor: pointer;
387
- width: 100%;
388
- height: 100%;
389
- }
390
-
391
- :global(.cm-drop-zone:hover),
392
- :global(.cm-drop-zone-over) {
393
- border-color: var(--cm-primary);
394
- background: var(--cm-primary-light);
395
- }
396
-
397
- :global(.cm-drop-title) {
398
- font-size: 0.9rem;
399
- font-weight: 700;
400
- color: var(--cm-text);
401
- margin: 0;
402
- }
403
-
404
- :global(.cm-drop-sub) {
405
- font-size: 0.75rem;
406
- color: var(--cm-text-muted);
407
- margin: 0;
408
- }
409
-
410
- :global(.cm-drop-link) {
411
- color: var(--cm-primary);
412
- font-weight: 600;
413
- cursor: pointer;
414
- }
415
-
416
- :global(.cm-section-label) {
417
- display: block;
418
- font-size: 0.65rem;
419
- font-weight: 700;
420
- text-transform: uppercase;
421
- letter-spacing: 0.08em;
422
- color: var(--cm-text-muted);
423
- }
424
-
425
- :global(.cm-section-header) {
426
- display: flex;
427
- justify-content: space-between;
428
- align-items: center;
429
- }
430
-
431
- :global(.cm-badge) {
432
- background: var(--cm-primary-light);
433
- color: var(--cm-primary);
434
- font-size: 0.65rem;
435
- font-weight: 700;
436
- padding: 0.15rem 0.45rem;
437
- border-radius: 9999px;
438
- }
439
-
440
- :global(.cm-thumbs) {
441
- display: grid;
442
- grid-template-columns: repeat(auto-fill, minmax(48px, 1fr));
443
- gap: 0.35rem;
444
- margin-top: 0.5rem;
445
- }
446
-
447
- :global(.cm-thumb) {
448
- position: relative;
449
- aspect-ratio: 1;
450
- border-radius: 0.4rem;
451
- overflow: hidden;
452
- border: 2px solid transparent;
453
- transition: border-color 0.15s;
454
- }
455
-
456
- :global(.cm-thumb:hover) {
457
- border-color: var(--cm-primary);
458
- }
459
-
460
- :global(.cm-thumb img) {
461
- width: 100%;
462
- height: 100%;
463
- object-fit: cover;
464
- display: block;
465
- }
466
-
467
- :global(.cm-thumb-num) {
468
- position: absolute;
469
- bottom: 2px;
470
- left: 3px;
471
- font-size: 0.55rem;
472
- font-weight: 800;
473
- color: var(--cm-bg);
474
- text-shadow: 0 1px 2px rgba(0,0,0,0.8);
475
- line-height: 1;
476
- }
477
-
478
- :global(.cm-thumb-del) {
479
- position: absolute;
480
- top: 2px;
481
- right: 2px;
482
- width: 16px;
483
- height: 16px;
484
- background: rgba(239,68,68,0.9);
485
- color: var(--cm-bg);
486
- border: none;
487
- border-radius: 50%;
488
- cursor: pointer;
489
- display: none;
490
- align-items: center;
491
- justify-content: center;
492
- padding: 0;
493
- transition: background 0.15s;
494
- }
495
-
496
- :global(.cm-thumb:hover .cm-thumb-del) {
497
- display: flex;
498
- }
499
-
500
- :global(.cm-thumb-del:hover) {
501
- background: #dc2626;
502
- }
503
-
504
- :global(.cm-preview-col) {
505
- padding: 1.25rem;
506
- display: flex;
507
- flex-direction: column;
508
- gap: 0.5rem;
509
- min-height: 260px;
510
- }
511
-
512
- :global(.cm-preview-placeholder) {
513
- flex: 1;
514
- background: var(--cm-bg-muted);
515
- border: 2px dashed var(--cm-border);
516
- border-radius: 0.75rem;
517
- display: flex;
518
- flex-direction: column;
519
- align-items: center;
520
- justify-content: center;
521
- gap: 0.5rem;
522
- color: var(--cm-text-muted);
523
- }
524
-
525
- :global(.cm-preview-placeholder p) {
526
- font-size: 0.8rem;
527
- margin: 0;
528
- }
529
-
530
- :global(.cm-canvas) {
531
- width: 100%;
532
- height: auto;
533
- border-radius: 0.75rem;
534
- border: 1px solid var(--cm-border);
535
- display: block;
536
- }
537
-
538
- :global(.cm-dims-badge) {
539
- font-size: 0.65rem;
540
- font-weight: 600;
541
- color: var(--cm-text-muted);
542
- background: var(--cm-bg-muted);
543
- border: 1px solid var(--cm-border);
544
- border-radius: 9999px;
545
- padding: 0.15rem 0.5rem;
546
- }
547
-
548
- :global(.cm-section-divider) {
549
- border-top: 1px solid var(--cm-border);
550
- padding: 1rem 1.25rem;
551
- display: flex;
552
- flex-direction: column;
553
- gap: 0.75rem;
554
- }
555
-
556
- :global(.cm-layouts) {
557
- display: grid;
558
- grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
559
- gap: 0.4rem;
560
- }
561
-
562
- :global(.cm-layout-btn) {
563
- display: flex;
564
- flex-direction: column;
565
- align-items: center;
566
- gap: 0.2rem;
567
- padding: 0.5rem 0.25rem;
568
- background: var(--cm-bg-muted);
569
- border: 2px solid var(--cm-border);
570
- border-radius: 0.625rem;
571
- cursor: pointer;
572
- transition: border-color 0.15s, background 0.15s, opacity 0.15s;
573
- color: var(--cm-text-muted);
574
- position: relative;
575
- }
576
-
577
- :global(.cm-layout-btn span) {
578
- font-size: 0.55rem;
579
- font-weight: 600;
580
- text-align: center;
581
- line-height: 1.2;
582
- }
583
-
584
- :global(.cm-layout-btn:hover:not(:disabled)) {
585
- border-color: var(--cm-primary);
586
- color: var(--cm-primary);
587
- background: var(--cm-primary-light);
588
- }
589
-
590
- :global(.cm-layout-btn-active) {
591
- border-color: var(--cm-primary);
592
- background: var(--cm-primary-light);
593
- color: var(--cm-primary);
594
- }
595
-
596
- :global(.cm-layout-btn-disabled) {
597
- opacity: 0.45;
598
- cursor: not-allowed;
599
- }
600
-
601
- :global(.cm-layout-need) {
602
- position: absolute;
603
- top: 2px;
604
- right: 4px;
605
- font-size: 0.55rem;
606
- font-weight: 800;
607
- color: var(--cm-text-muted);
608
- background: var(--cm-bg);
609
- border: 1px solid var(--cm-border);
610
- border-radius: 9999px;
611
- padding: 0 3px;
612
- line-height: 1.4;
613
- }
614
-
615
- :global(.cm-settings-inline) {
616
- display: flex;
617
- flex-wrap: wrap;
618
- align-items: flex-end;
619
- gap: 1rem;
620
- }
621
-
622
- :global(.cm-setting) {
623
- display: flex;
624
- flex-direction: column;
625
- gap: 0.3rem;
626
- }
627
-
628
- :global(.cm-setting-label) {
629
- font-size: 0.7rem;
630
- font-weight: 600;
631
- color: var(--cm-text-muted);
632
- }
633
-
634
- :global(.cm-slider) {
635
- accent-color: var(--cm-primary);
636
- width: 120px;
637
- }
638
-
639
- :global(.cm-color-row) {
640
- display: flex;
641
- align-items: center;
642
- gap: 0.5rem;
643
- }
644
-
645
- :global(.cm-color-swatch) {
646
- width: 32px;
647
- height: 32px;
648
- border: 2px solid var(--cm-border);
649
- border-radius: 0.4rem;
650
- cursor: pointer;
651
- padding: 2px;
652
- background: transparent;
653
- }
654
-
655
- :global(.cm-color-code) {
656
- font-size: 0.7rem;
657
- font-weight: 600;
658
- color: var(--cm-text-muted);
659
- font-variant-numeric: tabular-nums;
660
- }
661
-
662
- :global(.cm-download-btn) {
663
- display: flex;
664
- align-items: center;
665
- gap: 0.4rem;
666
- padding: 0.6rem 1.25rem;
667
- background: linear-gradient(135deg, var(--cm-primary), #8b5cf6);
668
- color: var(--cm-bg);
669
- border: none;
670
- border-radius: 0.625rem;
671
- font-size: 0.875rem;
672
- font-weight: 700;
673
- cursor: pointer;
674
- transition: opacity 0.2s, transform 0.1s;
675
- box-shadow: 0 4px 12px rgba(99,102,241,0.3);
676
- white-space: nowrap;
677
- margin-left: auto;
678
- }
679
-
680
- :global(.cm-download-btn:disabled) {
681
- opacity: 0.4;
682
- cursor: not-allowed;
683
- box-shadow: none;
684
- }
685
-
686
- :global(.cm-download-btn:not(:disabled):hover) {
687
- transform: translateY(-1px);
688
- box-shadow: 0 6px 18px rgba(99,102,241,0.4);
689
- }
690
- </style>
@@ -0,0 +1,48 @@
1
+ import type { AudiovisualToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface CollageMakerUI {
4
+ dropTitle: string;
5
+ dropSub: string;
6
+ dropLink: string;
7
+ imgsLoaded: string;
8
+ layoutLabel: string;
9
+ settingsLabel: string;
10
+ borderLabel: string;
11
+ borderColorLabel: string;
12
+ bgColorLabel: string;
13
+ downloadBtn: string;
14
+ previewTitle: string;
15
+ needsImgs: string;
16
+ errorMin: string;
17
+ errorMax: string;
18
+ errorLoad: string;
19
+ [key: string]: string;
20
+ }
21
+
22
+ export type CollageMakerLocaleContent = ToolLocaleContent<CollageMakerUI>;
23
+
24
+
25
+ export const collageMaker: AudiovisualToolEntry<CollageMakerUI> = {
26
+ id: 'creador-collage-fotos',
27
+ icons: {
28
+ bg: 'mdi:collage',
29
+ fg: 'mdi:palette-outline',
30
+ },
31
+ i18n: {
32
+ es: async () => (await import('./i18n/es')).content as unknown as CollageMakerLocaleContent,
33
+ en: async () => (await import('./i18n/en')).content as unknown as CollageMakerLocaleContent,
34
+ fr: async () => (await import('./i18n/fr')).content as unknown as CollageMakerLocaleContent,
35
+ de: async () => (await import('./i18n/de')).content as unknown as CollageMakerLocaleContent,
36
+ it: async () => (await import('./i18n/it')).content as unknown as CollageMakerLocaleContent,
37
+ pt: async () => (await import('./i18n/pt')).content as unknown as CollageMakerLocaleContent,
38
+ id: async () => (await import('./i18n/id')).content as unknown as CollageMakerLocaleContent,
39
+ ja: async () => (await import('./i18n/ja')).content as unknown as CollageMakerLocaleContent,
40
+ ko: async () => (await import('./i18n/ko')).content as unknown as CollageMakerLocaleContent,
41
+ nl: async () => (await import('./i18n/nl')).content as unknown as CollageMakerLocaleContent,
42
+ pl: async () => (await import('./i18n/pl')).content as unknown as CollageMakerLocaleContent,
43
+ ru: async () => (await import('./i18n/ru')).content as unknown as CollageMakerLocaleContent,
44
+ sv: async () => (await import('./i18n/sv')).content as unknown as CollageMakerLocaleContent,
45
+ tr: async () => (await import('./i18n/tr')).content as unknown as CollageMakerLocaleContent,
46
+ zh: async () => (await import('./i18n/zh')).content as unknown as CollageMakerLocaleContent,
47
+ },
48
+ };