@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.
- package/package.json +7 -4
- package/scripts/postinstall.mjs +27 -0
- package/src/entries.ts +32 -0
- package/src/tool/chromaticLens/chromatic-lens-color-palette-extraction-online.css +308 -0
- package/src/tool/chromaticLens/component.astro +0 -309
- package/src/tool/chromaticLens/entry.ts +39 -0
- package/src/tool/chromaticLens/index.ts +2 -41
- package/src/tool/collageMaker/component.astro +0 -387
- package/src/tool/collageMaker/entry.ts +48 -0
- package/src/tool/collageMaker/free-online-photo-collage-maker-professional-compositions.css +386 -0
- package/src/tool/collageMaker/index.ts +2 -50
- package/src/tool/exifCleaner/component.astro +0 -290
- package/src/tool/exifCleaner/entry.ts +53 -0
- package/src/tool/exifCleaner/exif-metadata-cleaner-remove-gps-photo-privacy.css +289 -0
- package/src/tool/exifCleaner/index.ts +2 -55
- package/src/tool/imageCompressor/component.astro +0 -498
- package/src/tool/imageCompressor/entry.ts +56 -0
- package/src/tool/imageCompressor/index.ts +2 -58
- package/src/tool/imageCompressor/online-image-compressor-reduce-file-size-no-quality-loss.css +496 -0
- package/src/tool/printQualityCalculator/component.astro +0 -485
- package/src/tool/printQualityCalculator/entry.ts +66 -0
- package/src/tool/printQualityCalculator/index.ts +2 -68
- package/src/tool/printQualityCalculator/print-quality-calculator-pixels-to-cm-dpi.css +483 -0
- package/src/tool/privacyBlur/component.astro +0 -334
- package/src/tool/privacyBlur/entry.ts +45 -0
- package/src/tool/privacyBlur/index.ts +2 -47
- package/src/tool/privacyBlur/online-privacy-editor-pixelate-blur-faces-photos.css +332 -0
- package/src/tool/subtitleSync/component.astro +0 -327
- package/src/tool/subtitleSync/entry.ts +45 -0
- package/src/tool/subtitleSync/index.ts +2 -47
- package/src/tool/subtitleSync/synchronize-srt-subtitles-online-adjust-timing-free.css +325 -0
- package/src/tool/timelapseCalculator/component.astro +0 -285
- package/src/tool/timelapseCalculator/entry.ts +48 -0
- package/src/tool/timelapseCalculator/index.ts +2 -50
- package/src/tool/timelapseCalculator/timelapse-hyperlapse-calculator-perfect-intervals.css +283 -0
- package/src/tool/tvDistance/component.astro +0 -437
- package/src/tool/tvDistance/entry.ts +45 -0
- package/src/tool/tvDistance/index.ts +2 -47
- package/src/tool/tvDistance/tv-viewing-distance-calculator-thx-4k-optimal-screen.css +435 -0
- package/src/tool/videoFrameExtractor/component.astro +0 -428
- package/src/tool/videoFrameExtractor/entry.ts +49 -0
- package/src/tool/videoFrameExtractor/index.ts +2 -51
- package/src/tool/videoFrameExtractor/online-video-frame-extractor-capture-hd-stills.css +426 -0
- 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
|
|
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'),
|