@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,53 @@
1
+ import type { AudiovisualToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface ExifCleanerUI {
4
+ dropTitle: string;
5
+ dropSubtitle: string;
6
+ dropLocalInfo: string;
7
+ selectButton: string;
8
+ processingText: string;
9
+ analysisCompleted: string;
10
+ downloadButton: string;
11
+ resetButton: string;
12
+ privacyRiskTitle: string;
13
+ gpsLabel: string;
14
+ gpsDetected: string;
15
+ gpsNotFound: string;
16
+ cameraLabel: string;
17
+ softwareLabel: string;
18
+ dateLabel: string;
19
+ otherTechnicalDetails: string;
20
+ noMetadataFound: string;
21
+ alreadyCleanInfo: string;
22
+ previewLabel: string;
23
+ faqTitle: string;
24
+ bibliographyTitle: string;
25
+ [key: string]: string;
26
+ }
27
+
28
+ export type ExifCleanerLocaleContent = ToolLocaleContent<ExifCleanerUI>;
29
+
30
+ export const exifCleaner: AudiovisualToolEntry<ExifCleanerUI> = {
31
+ id: 'limpiador-exif',
32
+ icons: {
33
+ bg: 'mdi:camera-off',
34
+ fg: 'mdi:shield-check',
35
+ },
36
+ i18n: {
37
+ es: async () => (await import('./i18n/es')).content as unknown as ExifCleanerLocaleContent,
38
+ en: async () => (await import('./i18n/en')).content as unknown as ExifCleanerLocaleContent,
39
+ fr: async () => (await import('./i18n/fr')).content as unknown as ExifCleanerLocaleContent,
40
+ de: async () => (await import('./i18n/de')).content as unknown as ExifCleanerLocaleContent,
41
+ it: async () => (await import('./i18n/it')).content as unknown as ExifCleanerLocaleContent,
42
+ pt: async () => (await import('./i18n/pt')).content as unknown as ExifCleanerLocaleContent,
43
+ id: async () => (await import('./i18n/id')).content as unknown as ExifCleanerLocaleContent,
44
+ ja: async () => (await import('./i18n/ja')).content as unknown as ExifCleanerLocaleContent,
45
+ ko: async () => (await import('./i18n/ko')).content as unknown as ExifCleanerLocaleContent,
46
+ nl: async () => (await import('./i18n/nl')).content as unknown as ExifCleanerLocaleContent,
47
+ pl: async () => (await import('./i18n/pl')).content as unknown as ExifCleanerLocaleContent,
48
+ ru: async () => (await import('./i18n/ru')).content as unknown as ExifCleanerLocaleContent,
49
+ sv: async () => (await import('./i18n/sv')).content as unknown as ExifCleanerLocaleContent,
50
+ tr: async () => (await import('./i18n/tr')).content as unknown as ExifCleanerLocaleContent,
51
+ zh: async () => (await import('./i18n/zh')).content as unknown as ExifCleanerLocaleContent,
52
+ },
53
+ };
@@ -0,0 +1,289 @@
1
+ :global(.ec-root) {
2
+ --ec-bg: #fff;
3
+ --ec-bg-elevated: #f8fafc;
4
+ --ec-border: #e2e8f0;
5
+ --ec-text: #0f172a;
6
+ --ec-text-muted: #64748b;
7
+ --ec-accent: #6366f1;
8
+ --ec-accent-alpha: rgba(99, 102, 241, 0.08);
9
+ --ec-accent-alpha-hover: rgba(99, 102, 241, 0.02);
10
+ --ec-shadow: rgba(0, 0, 0, 0.15);
11
+
12
+ padding: 2.5rem 1.5rem;
13
+ max-width: 1000px;
14
+ margin: 0 auto;
15
+ }
16
+
17
+ :global(.theme-dark .ec-root) {
18
+ --ec-bg: #18181b;
19
+ --ec-bg-elevated: #27272a;
20
+ --ec-border: #3f3f46;
21
+ --ec-text: #f4f4f5;
22
+ --ec-text-muted: #71717a;
23
+ --ec-accent: #818cf8;
24
+ --ec-accent-alpha: rgba(129, 140, 248, 0.12);
25
+ --ec-accent-alpha-hover: rgba(129, 140, 248, 0.02);
26
+ --ec-shadow: rgba(0, 0, 0, 0.3);
27
+ }
28
+
29
+ :global(.ec-card) {
30
+ background: var(--ec-bg);
31
+ border: 1px solid var(--ec-border);
32
+ border-radius: 3rem;
33
+ padding: 1.5rem;
34
+ box-shadow: 0 45px 120px -30px var(--ec-shadow);
35
+ position: relative;
36
+ overflow: hidden;
37
+ }
38
+
39
+ :global(.ec-drop) {
40
+ padding: 4rem 2rem;
41
+ border: 3px dashed var(--ec-border);
42
+ border-radius: 2.5rem;
43
+ display: flex;
44
+ flex-direction: column;
45
+ align-items: center;
46
+ text-align: center;
47
+ cursor: pointer;
48
+ gap: 1.5rem;
49
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
50
+ }
51
+
52
+ :global(.ec-drop:hover),
53
+ :global(.ec-drop-active) {
54
+ border-color: var(--ec-accent);
55
+ background: var(--ec-accent-alpha-hover);
56
+ }
57
+
58
+ :global(.ec-drop-icon) {
59
+ width: 6rem;
60
+ height: 6rem;
61
+ background: var(--ec-accent-alpha);
62
+ border-radius: 2rem;
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ color: var(--ec-accent);
67
+ }
68
+
69
+ :global(.ec-drop-icon svg) {
70
+ width: 3rem;
71
+ height: 3rem;
72
+ }
73
+
74
+ :global(.ec-title) {
75
+ font-size: 2.5rem;
76
+ font-weight: 950;
77
+ color: var(--ec-text);
78
+ margin: 0;
79
+ }
80
+
81
+ :global(.ec-subtitle) {
82
+ font-size: 1.15rem;
83
+ color: var(--ec-text-muted);
84
+ max-width: 500px;
85
+ margin: 0;
86
+ font-weight: 700;
87
+ }
88
+
89
+ :global(.ec-badges) {
90
+ display: flex;
91
+ gap: 1rem;
92
+ flex-wrap: wrap;
93
+ justify-content: center;
94
+ }
95
+
96
+ :global(.ec-badge) {
97
+ padding: 0.6rem 1.25rem;
98
+ background: var(--ec-bg-elevated);
99
+ border-radius: 2rem;
100
+ font-size: 0.8rem;
101
+ font-weight: 800;
102
+ color: var(--ec-text-muted);
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 0.5rem;
106
+ }
107
+
108
+ :global(.ec-badge svg) {
109
+ width: 1rem;
110
+ height: 1rem;
111
+ flex-shrink: 0;
112
+ }
113
+
114
+ :global(.ec-processing) {
115
+ padding: 5rem;
116
+ display: flex;
117
+ flex-direction: column;
118
+ align-items: center;
119
+ justify-content: center;
120
+ gap: 1.5rem;
121
+ }
122
+
123
+ :global(.ec-spinner) {
124
+ width: 4rem;
125
+ height: 4rem;
126
+ border: 4px solid var(--ec-accent-alpha);
127
+ border-top-color: var(--ec-accent);
128
+ border-radius: 50%;
129
+ animation: ec-spin 0.8s linear infinite;
130
+ }
131
+
132
+ :global(.ec-processing-text) {
133
+ font-weight: 800;
134
+ color: var(--ec-text);
135
+ margin: 0;
136
+ }
137
+
138
+ :global(.ec-result) {
139
+ padding: 2.5rem;
140
+ display: flex;
141
+ flex-direction: column;
142
+ animation: ec-slide-up 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
143
+ }
144
+
145
+ :global(.ec-result-layout) {
146
+ display: grid;
147
+ grid-template-columns: 1fr 1fr;
148
+ gap: 3rem;
149
+ }
150
+
151
+ @media (max-width: 800px) {
152
+ :global(.ec-result-layout) {
153
+ grid-template-columns: 1fr;
154
+ }
155
+ }
156
+
157
+ :global(.ec-preview-col) {
158
+ display: flex;
159
+ flex-direction: column;
160
+ gap: 1.5rem;
161
+ }
162
+
163
+ :global(.ec-preview-img) {
164
+ width: 100%;
165
+ border-radius: 1.5rem;
166
+ box-shadow: 0 20px 50px var(--ec-shadow);
167
+ display: block;
168
+ }
169
+
170
+ :global(.ec-metadata) {
171
+ background: var(--ec-bg-elevated);
172
+ border: 1px solid var(--ec-border);
173
+ border-radius: 1.25rem;
174
+ padding: 1.5rem;
175
+ min-height: 150px;
176
+ display: flex;
177
+ flex-direction: column;
178
+ justify-content: center;
179
+ }
180
+
181
+ :global(.ec-no-metadata) {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ height: 100%;
186
+ color: var(--ec-text-muted);
187
+ text-align: center;
188
+ }
189
+
190
+ :global(.ec-metadata-title) {
191
+ color: var(--ec-accent);
192
+ font-weight: 700;
193
+ margin-bottom: 1rem;
194
+ font-size: 0.9rem;
195
+ }
196
+
197
+ :global(.ec-metadata-list) {
198
+ list-style: none;
199
+ padding: 0;
200
+ margin: 0;
201
+ display: flex;
202
+ flex-direction: column;
203
+ gap: 0.75rem;
204
+ }
205
+
206
+ :global(.ec-metadata-list li) {
207
+ display: flex;
208
+ justify-content: space-between;
209
+ gap: 1rem;
210
+ font-size: 0.85rem;
211
+ font-weight: 600;
212
+ color: var(--ec-text);
213
+ }
214
+
215
+ :global(.ec-metadata-list li span:first-child) {
216
+ font-weight: 700;
217
+ }
218
+
219
+ :global(.ec-metadata-list li span:last-child) {
220
+ color: var(--ec-text-muted);
221
+ }
222
+
223
+ :global(.ec-actions-col) {
224
+ display: flex;
225
+ flex-direction: column;
226
+ gap: 1.5rem;
227
+ }
228
+
229
+ :global(.ec-btn) {
230
+ padding: 1.25rem;
231
+ border-radius: 1.5rem;
232
+ font-weight: 950;
233
+ font-size: 1.1rem;
234
+ border: none;
235
+ cursor: pointer;
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ gap: 0.75rem;
240
+ transition: all 0.2s;
241
+ }
242
+
243
+ :global(.ec-btn svg) {
244
+ width: 1.25rem;
245
+ height: 1.25rem;
246
+ }
247
+
248
+ :global(.ec-btn-primary) {
249
+ background: var(--ec-accent);
250
+ color: #fff;
251
+ box-shadow: 0 15px 35px -10px var(--ec-accent);
252
+ }
253
+
254
+ :global(.ec-btn-primary:hover) {
255
+ transform: translateY(-2px);
256
+ box-shadow: 0 20px 45px -10px var(--ec-accent);
257
+ }
258
+
259
+ :global(.ec-btn-secondary) {
260
+ background: var(--ec-bg-elevated);
261
+ border: 1px solid var(--ec-border);
262
+ color: var(--ec-text);
263
+ }
264
+
265
+ :global(.ec-btn-secondary:hover) {
266
+ border-color: var(--ec-accent);
267
+ color: var(--ec-accent);
268
+ }
269
+
270
+ .ec-hidden {
271
+ display: none;
272
+ }
273
+
274
+ @keyframes ec-spin {
275
+ to {
276
+ transform: rotate(360deg);
277
+ }
278
+ }
279
+
280
+ @keyframes ec-slide-up {
281
+ from {
282
+ opacity: 0;
283
+ transform: translateY(30px);
284
+ }
285
+ to {
286
+ opacity: 1;
287
+ transform: translateY(0);
288
+ }
289
+ }
@@ -1,58 +1,5 @@
1
- import type { AudiovisualToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- export interface ExifCleanerUI {
4
- dropTitle: string;
5
- dropSubtitle: string;
6
- dropLocalInfo: string;
7
- selectButton: string;
8
- processingText: string;
9
- analysisCompleted: string;
10
- downloadButton: string;
11
- resetButton: string;
12
- privacyRiskTitle: string;
13
- gpsLabel: string;
14
- gpsDetected: string;
15
- gpsNotFound: string;
16
- cameraLabel: string;
17
- softwareLabel: string;
18
- dateLabel: string;
19
- otherTechnicalDetails: string;
20
- noMetadataFound: string;
21
- alreadyCleanInfo: string;
22
- previewLabel: string;
23
- faqTitle: string;
24
- bibliographyTitle: string;
25
- [key: string]: string;
26
- }
27
-
28
- export type ExifCleanerLocaleContent = ToolLocaleContent<ExifCleanerUI>;
29
-
30
- export const exifCleaner: AudiovisualToolEntry<ExifCleanerUI> = {
31
- id: 'limpiador-exif',
32
- icons: {
33
- bg: 'mdi:camera-off',
34
- fg: 'mdi:shield-check',
35
- },
36
- i18n: {
37
- es: async () => (await import('./i18n/es')).content as unknown as ExifCleanerLocaleContent,
38
- en: async () => (await import('./i18n/en')).content as unknown as ExifCleanerLocaleContent,
39
- fr: async () => (await import('./i18n/fr')).content as unknown as ExifCleanerLocaleContent,
40
- de: async () => (await import('./i18n/de')).content as unknown as ExifCleanerLocaleContent,
41
- it: async () => (await import('./i18n/it')).content as unknown as ExifCleanerLocaleContent,
42
- pt: async () => (await import('./i18n/pt')).content as unknown as ExifCleanerLocaleContent,
43
- id: async () => (await import('./i18n/id')).content as unknown as ExifCleanerLocaleContent,
44
- ja: async () => (await import('./i18n/ja')).content as unknown as ExifCleanerLocaleContent,
45
- ko: async () => (await import('./i18n/ko')).content as unknown as ExifCleanerLocaleContent,
46
- nl: async () => (await import('./i18n/nl')).content as unknown as ExifCleanerLocaleContent,
47
- pl: async () => (await import('./i18n/pl')).content as unknown as ExifCleanerLocaleContent,
48
- ru: async () => (await import('./i18n/ru')).content as unknown as ExifCleanerLocaleContent,
49
- sv: async () => (await import('./i18n/sv')).content as unknown as ExifCleanerLocaleContent,
50
- tr: async () => (await import('./i18n/tr')).content as unknown as ExifCleanerLocaleContent,
51
- zh: async () => (await import('./i18n/zh')).content as unknown as ExifCleanerLocaleContent,
52
- },
53
- };
54
-
55
-
1
+ import { exifCleaner } from './entry';
2
+ export * from './entry';
56
3
  export const EXIF_CLEANER_TOOL: ToolDefinition = {
57
4
  entry: exifCleaner as unknown as AudiovisualToolEntry,
58
5
  Component: () => import('./component.astro'),