@jjlmoya/utils-developer 1.2.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 +64 -0
- package/src/category/i18n/en.ts +34 -0
- package/src/category/i18n/es.ts +34 -0
- package/src/category/i18n/fr.ts +34 -0
- package/src/category/index.ts +31 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +78 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/css_specificity_logic.test.ts +39 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +22 -0
- package/src/tests/title_quality.test.ts +55 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/aspectRatio/bibliography.astro +14 -0
- package/src/tool/aspectRatio/component.astro +468 -0
- package/src/tool/aspectRatio/i18n/en.ts +177 -0
- package/src/tool/aspectRatio/i18n/es.ts +177 -0
- package/src/tool/aspectRatio/i18n/fr.ts +177 -0
- package/src/tool/aspectRatio/index.ts +34 -0
- package/src/tool/aspectRatio/seo.astro +14 -0
- package/src/tool/aspectRatio/ui.ts +12 -0
- package/src/tool/calculadoraTiempoDatos/bibliography.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/component.astro +829 -0
- package/src/tool/calculadoraTiempoDatos/i18n/en.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/i18n/es.ts +163 -0
- package/src/tool/calculadoraTiempoDatos/i18n/fr.ts +150 -0
- package/src/tool/calculadoraTiempoDatos/index.ts +33 -0
- package/src/tool/calculadoraTiempoDatos/seo.astro +14 -0
- package/src/tool/calculadoraTiempoDatos/ui.ts +24 -0
- package/src/tool/colorConverter/bibliography.astro +14 -0
- package/src/tool/colorConverter/component.astro +504 -0
- package/src/tool/colorConverter/i18n/en.ts +126 -0
- package/src/tool/colorConverter/i18n/es.ts +126 -0
- package/src/tool/colorConverter/i18n/fr.ts +126 -0
- package/src/tool/colorConverter/index.ts +33 -0
- package/src/tool/colorConverter/seo.astro +14 -0
- package/src/tool/colorConverter/ui.ts +16 -0
- package/src/tool/conversorExcelCsvHtml/bibliography.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/component.astro +595 -0
- package/src/tool/conversorExcelCsvHtml/i18n/en.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/es.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/i18n/fr.ts +129 -0
- package/src/tool/conversorExcelCsvHtml/index.ts +33 -0
- package/src/tool/conversorExcelCsvHtml/seo.astro +14 -0
- package/src/tool/conversorExcelCsvHtml/ui.ts +14 -0
- package/src/tool/cronGenerator/bibliography.astro +14 -0
- package/src/tool/cronGenerator/component.astro +667 -0
- package/src/tool/cronGenerator/i18n/en.ts +191 -0
- package/src/tool/cronGenerator/i18n/es.ts +191 -0
- package/src/tool/cronGenerator/i18n/fr.ts +191 -0
- package/src/tool/cronGenerator/index.ts +34 -0
- package/src/tool/cronGenerator/seo.astro +14 -0
- package/src/tool/cronGenerator/ui.ts +45 -0
- package/src/tool/cssSpecificityCalculator/bibliography.astro +14 -0
- package/src/tool/cssSpecificityCalculator/component.astro +292 -0
- package/src/tool/cssSpecificityCalculator/i18n/en.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/es.ts +168 -0
- package/src/tool/cssSpecificityCalculator/i18n/fr.ts +168 -0
- package/src/tool/cssSpecificityCalculator/index.ts +34 -0
- package/src/tool/cssSpecificityCalculator/logic.ts +100 -0
- package/src/tool/cssSpecificityCalculator/seo.astro +14 -0
- package/src/tool/cssSpecificityCalculator/ui-controller.ts +57 -0
- package/src/tool/cssSpecificityCalculator/ui.ts +11 -0
- package/src/tool/cssToInlineConverter/bibliography.astro +14 -0
- package/src/tool/cssToInlineConverter/component.astro +308 -0
- package/src/tool/cssToInlineConverter/i18n/en.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/es.ts +160 -0
- package/src/tool/cssToInlineConverter/i18n/fr.ts +160 -0
- package/src/tool/cssToInlineConverter/index.ts +34 -0
- package/src/tool/cssToInlineConverter/seo.astro +14 -0
- package/src/tool/cssToInlineConverter/ui.ts +12 -0
- package/src/tool/duplicateCssRemover/bibliography.astro +14 -0
- package/src/tool/duplicateCssRemover/component.astro +353 -0
- package/src/tool/duplicateCssRemover/i18n/en.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/es.ts +167 -0
- package/src/tool/duplicateCssRemover/i18n/fr.ts +167 -0
- package/src/tool/duplicateCssRemover/index.ts +34 -0
- package/src/tool/duplicateCssRemover/seo.astro +14 -0
- package/src/tool/duplicateCssRemover/ui.ts +12 -0
- package/src/tool/generadorSecurityTxt/bibliography.astro +14 -0
- package/src/tool/generadorSecurityTxt/component.astro +473 -0
- package/src/tool/generadorSecurityTxt/i18n/en.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/es.ts +173 -0
- package/src/tool/generadorSecurityTxt/i18n/fr.ts +173 -0
- package/src/tool/generadorSecurityTxt/index.ts +33 -0
- package/src/tool/generadorSecurityTxt/seo.astro +14 -0
- package/src/tool/generadorSecurityTxt/ui.ts +27 -0
- package/src/tool/hashGenerator/bibliography.astro +14 -0
- package/src/tool/hashGenerator/component.astro +367 -0
- package/src/tool/hashGenerator/i18n/en.ts +118 -0
- package/src/tool/hashGenerator/i18n/es.ts +118 -0
- package/src/tool/hashGenerator/i18n/fr.ts +118 -0
- package/src/tool/hashGenerator/index.ts +33 -0
- package/src/tool/hashGenerator/md5.ts +138 -0
- package/src/tool/hashGenerator/seo.astro +14 -0
- package/src/tool/hashGenerator/ui.ts +11 -0
- package/src/tool/inspectorCertificadosSsl/bibliography.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/component.astro +580 -0
- package/src/tool/inspectorCertificadosSsl/i18n/en.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/es.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/i18n/fr.ts +214 -0
- package/src/tool/inspectorCertificadosSsl/index.ts +33 -0
- package/src/tool/inspectorCertificadosSsl/seo.astro +14 -0
- package/src/tool/inspectorCertificadosSsl/ui.ts +29 -0
- package/src/tool/jsonFormatter/bibliography.astro +14 -0
- package/src/tool/jsonFormatter/component.astro +590 -0
- package/src/tool/jsonFormatter/i18n/en.ts +156 -0
- package/src/tool/jsonFormatter/i18n/es.ts +156 -0
- package/src/tool/jsonFormatter/i18n/fr.ts +156 -0
- package/src/tool/jsonFormatter/index.ts +34 -0
- package/src/tool/jsonFormatter/seo.astro +14 -0
- package/src/tool/jsonFormatter/ui.ts +15 -0
- package/src/tool/keycode/bibliography.astro +14 -0
- package/src/tool/keycode/component.astro +540 -0
- package/src/tool/keycode/i18n/en.ts +160 -0
- package/src/tool/keycode/i18n/es.ts +160 -0
- package/src/tool/keycode/i18n/fr.ts +160 -0
- package/src/tool/keycode/index.ts +34 -0
- package/src/tool/keycode/seo.astro +14 -0
- package/src/tool/keycode/ui.ts +10 -0
- package/src/tool/llmCostCalculator/bibliography.astro +14 -0
- package/src/tool/llmCostCalculator/component.astro +488 -0
- package/src/tool/llmCostCalculator/data.ts +99 -0
- package/src/tool/llmCostCalculator/i18n/en.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/es.ts +165 -0
- package/src/tool/llmCostCalculator/i18n/fr.ts +165 -0
- package/src/tool/llmCostCalculator/index.ts +34 -0
- package/src/tool/llmCostCalculator/seo.astro +14 -0
- package/src/tool/llmCostCalculator/ui.ts +11 -0
- package/src/tool/mobileMockupGenerator/app.ts +614 -0
- package/src/tool/mobileMockupGenerator/bibliography.astro +14 -0
- package/src/tool/mobileMockupGenerator/component.astro +1044 -0
- package/src/tool/mobileMockupGenerator/constants.ts +48 -0
- package/src/tool/mobileMockupGenerator/i18n/en.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/es.ts +121 -0
- package/src/tool/mobileMockupGenerator/i18n/fr.ts +121 -0
- package/src/tool/mobileMockupGenerator/index.ts +33 -0
- package/src/tool/mobileMockupGenerator/rendering.ts +189 -0
- package/src/tool/mobileMockupGenerator/seo.astro +14 -0
- package/src/tool/mobileMockupGenerator/store.ts +145 -0
- package/src/tool/mobileMockupGenerator/types.ts +41 -0
- package/src/tool/mobileMockupGenerator/ui.ts +48 -0
- package/src/tool/musicalTypography/bibliography.astro +14 -0
- package/src/tool/musicalTypography/component.astro +480 -0
- package/src/tool/musicalTypography/i18n/en.ts +179 -0
- package/src/tool/musicalTypography/i18n/es.ts +179 -0
- package/src/tool/musicalTypography/i18n/fr.ts +179 -0
- package/src/tool/musicalTypography/index.ts +33 -0
- package/src/tool/musicalTypography/seo.astro +14 -0
- package/src/tool/musicalTypography/ui.ts +25 -0
- package/src/tool/placeholderGenerator/bibliography.astro +14 -0
- package/src/tool/placeholderGenerator/component.astro +499 -0
- package/src/tool/placeholderGenerator/i18n/en.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/es.ts +176 -0
- package/src/tool/placeholderGenerator/i18n/fr.ts +176 -0
- package/src/tool/placeholderGenerator/index.ts +34 -0
- package/src/tool/placeholderGenerator/seo.astro +14 -0
- package/src/tool/placeholderGenerator/ui.ts +14 -0
- package/src/tool/promptLibrary/bibliography.astro +14 -0
- package/src/tool/promptLibrary/component.astro +1131 -0
- package/src/tool/promptLibrary/controller.ts +49 -0
- package/src/tool/promptLibrary/i18n/en.ts +131 -0
- package/src/tool/promptLibrary/i18n/es.ts +131 -0
- package/src/tool/promptLibrary/i18n/fr.ts +126 -0
- package/src/tool/promptLibrary/index.ts +33 -0
- package/src/tool/promptLibrary/seo.astro +14 -0
- package/src/tool/promptLibrary/ui.ts +29 -0
- package/src/tool/readabilityCalculator/bibliography.astro +14 -0
- package/src/tool/readabilityCalculator/component.astro +534 -0
- package/src/tool/readabilityCalculator/i18n/en.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/es.ts +133 -0
- package/src/tool/readabilityCalculator/i18n/fr.ts +133 -0
- package/src/tool/readabilityCalculator/index.ts +33 -0
- package/src/tool/readabilityCalculator/seo.astro +14 -0
- package/src/tool/readabilityCalculator/ui.ts +27 -0
- package/src/tool/svgSanitizer/bibliography.astro +14 -0
- package/src/tool/svgSanitizer/component.astro +554 -0
- package/src/tool/svgSanitizer/i18n/en.ts +125 -0
- package/src/tool/svgSanitizer/i18n/es.ts +125 -0
- package/src/tool/svgSanitizer/i18n/fr.ts +125 -0
- package/src/tool/svgSanitizer/index.ts +33 -0
- package/src/tool/svgSanitizer/seo.astro +14 -0
- package/src/tool/svgSanitizer/ui.ts +18 -0
- package/src/tool/svgToCss/bibliography.astro +14 -0
- package/src/tool/svgToCss/component.astro +381 -0
- package/src/tool/svgToCss/i18n/en.ts +174 -0
- package/src/tool/svgToCss/i18n/es.ts +174 -0
- package/src/tool/svgToCss/i18n/fr.ts +174 -0
- package/src/tool/svgToCss/index.ts +34 -0
- package/src/tool/svgToCss/seo.astro +14 -0
- package/src/tool/svgToCss/ui.ts +13 -0
- package/src/tool/urlCleaner/bibliography.astro +14 -0
- package/src/tool/urlCleaner/component.astro +458 -0
- package/src/tool/urlCleaner/i18n/en.ts +116 -0
- package/src/tool/urlCleaner/i18n/es.ts +116 -0
- package/src/tool/urlCleaner/i18n/fr.ts +116 -0
- package/src/tool/urlCleaner/index.ts +33 -0
- package/src/tool/urlCleaner/seo.astro +14 -0
- package/src/tool/urlCleaner/ui.ts +12 -0
- package/src/tool/urlEncoderDecoder/bibliography.astro +14 -0
- package/src/tool/urlEncoderDecoder/component.astro +291 -0
- package/src/tool/urlEncoderDecoder/i18n/en.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/es.ts +162 -0
- package/src/tool/urlEncoderDecoder/i18n/fr.ts +162 -0
- package/src/tool/urlEncoderDecoder/index.ts +34 -0
- package/src/tool/urlEncoderDecoder/seo.astro +14 -0
- package/src/tool/urlEncoderDecoder/ui.ts +11 -0
- package/src/tool/utmGenerator/bibliography.astro +14 -0
- package/src/tool/utmGenerator/component.astro +270 -0
- package/src/tool/utmGenerator/i18n/en.ts +117 -0
- package/src/tool/utmGenerator/i18n/es.ts +117 -0
- package/src/tool/utmGenerator/i18n/fr.ts +117 -0
- package/src/tool/utmGenerator/index.ts +33 -0
- package/src/tool/utmGenerator/seo.astro +14 -0
- package/src/tool/utmGenerator/ui.ts +13 -0
- package/src/tools.ts +27 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { UrlCleanerUI } from './ui';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
ui?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const { ui } = Astro.props;
|
|
9
|
+
const t = (ui ?? {}) as UrlCleanerUI;
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<div id="uc-root" class="uc-root" data-i18n={JSON.stringify(t)}>
|
|
13
|
+
<div class="uc-container">
|
|
14
|
+
<div class="uc-input-card">
|
|
15
|
+
<label for="uc-url-input" class="uc-label">{t.labelInput}</label>
|
|
16
|
+
<div class="uc-input-group">
|
|
17
|
+
<input type="url" id="uc-url-input" class="uc-input" placeholder="https://example.com?utm_source=twitter&fbclid=123..." />
|
|
18
|
+
<button id="uc-btn-clean" class="uc-btn-primary">
|
|
19
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19.36 2.72L20.78 4.14L15.06 9.85C16.13 11.39 16.28 13.24 15.38 14.44L9.06 8.12C10.26 7.22 12.11 7.38 13.65 8.44L19.36 2.72M5.93 17.57C3.92 15.56 2.69 13.16 2.35 10.92L7.23 8.83L14.67 16.27L12.58 21.15C10.34 20.81 7.94 19.58 5.93 17.57Z"/></svg>
|
|
20
|
+
{t.btnClean}
|
|
21
|
+
</button>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div id="uc-results" class="uc-results" style="display:none">
|
|
26
|
+
<div class="uc-result-card">
|
|
27
|
+
<div class="uc-card-header">
|
|
28
|
+
<h3 class="uc-card-title">{t.labelCleaned}</h3>
|
|
29
|
+
<button id="uc-btn-copy" class="uc-copy-btn">
|
|
30
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg>
|
|
31
|
+
{t.btnCopy}
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
<div id="uc-cleaned-url" class="uc-url-display"></div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="uc-result-card">
|
|
38
|
+
<h3 class="uc-card-title">{t.labelRemoved}</h3>
|
|
39
|
+
<div id="uc-removed-list" class="uc-removed-list"></div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div id="uc-stats" class="uc-stats-card" style="display:none">
|
|
44
|
+
<div class="uc-stat-item">
|
|
45
|
+
<span class="uc-stat-value" id="uc-count">0</span>
|
|
46
|
+
<span class="uc-stat-label">{t.countLabel}</span>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="uc-stat-item">
|
|
49
|
+
<span class="uc-stat-value" id="uc-reduction">0%</span>
|
|
50
|
+
<span class="uc-stat-label">{t.reductionLabel}</span>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<style>
|
|
57
|
+
.uc-root {
|
|
58
|
+
width: 100%;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.uc-container {
|
|
62
|
+
max-width: 900px;
|
|
63
|
+
margin: 0 auto;
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
gap: 1.5rem;
|
|
67
|
+
padding-bottom: 2rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.uc-input-card {
|
|
71
|
+
background: rgba(255, 255, 255, 0.75);
|
|
72
|
+
backdrop-filter: blur(14px);
|
|
73
|
+
-webkit-backdrop-filter: blur(14px);
|
|
74
|
+
border: 1px solid rgba(255, 255, 255, 0.35);
|
|
75
|
+
border-radius: 1.5rem;
|
|
76
|
+
padding: 1.5rem;
|
|
77
|
+
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
|
|
78
|
+
display: flex;
|
|
79
|
+
flex-direction: column;
|
|
80
|
+
gap: 1rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
:global(.theme-dark) .uc-input-card {
|
|
84
|
+
background: rgba(15, 23, 42, 0.75);
|
|
85
|
+
border-color: rgba(255, 255, 255, 0.06);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.uc-label {
|
|
89
|
+
font-size: 0.875rem;
|
|
90
|
+
font-weight: 600;
|
|
91
|
+
color: rgb(100, 116, 139);
|
|
92
|
+
text-transform: uppercase;
|
|
93
|
+
letter-spacing: 0.05em;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:global(.theme-dark) .uc-label {
|
|
97
|
+
color: rgb(148, 163, 184);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.uc-input-group {
|
|
101
|
+
display: flex;
|
|
102
|
+
gap: 0.75rem;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.uc-input {
|
|
106
|
+
flex-grow: 1;
|
|
107
|
+
background: white;
|
|
108
|
+
border: 1px solid rgb(226, 232, 240);
|
|
109
|
+
border-radius: 0.75rem;
|
|
110
|
+
padding: 0.75rem 1rem;
|
|
111
|
+
font-size: 1rem;
|
|
112
|
+
outline: none;
|
|
113
|
+
transition: all 0.2s ease;
|
|
114
|
+
color: rgb(51, 65, 85);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
:global(.theme-dark) .uc-input {
|
|
118
|
+
background: rgb(15, 23, 42);
|
|
119
|
+
border-color: rgb(51, 65, 85);
|
|
120
|
+
color: rgb(203, 213, 225);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.uc-input:focus {
|
|
124
|
+
border-color: rgb(59, 130, 246);
|
|
125
|
+
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.uc-btn-primary {
|
|
129
|
+
background: rgb(59, 130, 246);
|
|
130
|
+
color: white;
|
|
131
|
+
border: none;
|
|
132
|
+
border-radius: 0.75rem;
|
|
133
|
+
padding: 0 1.5rem;
|
|
134
|
+
font-weight: 600;
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
display: flex;
|
|
137
|
+
align-items: center;
|
|
138
|
+
gap: 0.5rem;
|
|
139
|
+
transition: all 0.2s ease;
|
|
140
|
+
font-size: 0.875rem;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.uc-btn-primary:hover {
|
|
144
|
+
background: rgb(37, 99, 235);
|
|
145
|
+
transform: translateY(-1px);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.uc-results {
|
|
149
|
+
display: grid;
|
|
150
|
+
grid-template-columns: 1fr 1fr;
|
|
151
|
+
gap: 1.5rem;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
@media (max-width: 768px) {
|
|
155
|
+
.uc-results {
|
|
156
|
+
grid-template-columns: 1fr;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.uc-result-card {
|
|
161
|
+
background: rgba(255, 255, 255, 0.75);
|
|
162
|
+
backdrop-filter: blur(14px);
|
|
163
|
+
-webkit-backdrop-filter: blur(14px);
|
|
164
|
+
border: 1px solid rgba(255, 255, 255, 0.35);
|
|
165
|
+
border-radius: 1.5rem;
|
|
166
|
+
padding: 1.5rem;
|
|
167
|
+
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
gap: 1rem;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
:global(.theme-dark) .uc-result-card {
|
|
174
|
+
background: rgba(15, 23, 42, 0.75);
|
|
175
|
+
border-color: rgba(255, 255, 255, 0.06);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.uc-card-header {
|
|
179
|
+
display: flex;
|
|
180
|
+
justify-content: space-between;
|
|
181
|
+
align-items: center;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.uc-card-title {
|
|
185
|
+
font-size: 0.875rem;
|
|
186
|
+
font-weight: 600;
|
|
187
|
+
color: rgb(51, 65, 85);
|
|
188
|
+
margin: 0;
|
|
189
|
+
text-transform: uppercase;
|
|
190
|
+
letter-spacing: 0.05em;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
:global(.theme-dark) .uc-card-title {
|
|
194
|
+
color: rgb(203, 213, 225);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.uc-url-display {
|
|
198
|
+
word-break: break-all;
|
|
199
|
+
font-size: 0.875rem;
|
|
200
|
+
color: rgb(59, 130, 246);
|
|
201
|
+
background: white;
|
|
202
|
+
padding: 1rem;
|
|
203
|
+
border-radius: 0.5rem;
|
|
204
|
+
border: 1px solid rgba(0, 0, 0, 0.05);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
:global(.theme-dark) .uc-url-display {
|
|
208
|
+
background: rgb(30, 41, 59);
|
|
209
|
+
border-color: rgb(51, 65, 85);
|
|
210
|
+
color: rgb(129, 140, 148);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.uc-copy-btn {
|
|
214
|
+
display: flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
gap: 0.35rem;
|
|
217
|
+
font-size: 0.75rem;
|
|
218
|
+
font-weight: 600;
|
|
219
|
+
padding: 0.4rem 0.875rem;
|
|
220
|
+
border-radius: 2rem;
|
|
221
|
+
border: 1.5px solid rgb(226, 232, 240);
|
|
222
|
+
background: white;
|
|
223
|
+
color: rgb(71, 85, 105);
|
|
224
|
+
cursor: pointer;
|
|
225
|
+
transition: all 0.2s ease;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
:global(.theme-dark) .uc-copy-btn {
|
|
229
|
+
background: rgb(30, 41, 59);
|
|
230
|
+
border-color: rgb(51, 65, 85);
|
|
231
|
+
color: rgb(148, 163, 184);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.uc-copy-btn:hover {
|
|
235
|
+
border-color: rgb(59, 130, 246);
|
|
236
|
+
color: rgb(59, 130, 246);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.uc-copy-btn.uc-copied {
|
|
240
|
+
background: rgb(16, 185, 129);
|
|
241
|
+
border-color: rgb(16, 185, 129);
|
|
242
|
+
color: white;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.uc-removed-list {
|
|
246
|
+
display: flex;
|
|
247
|
+
flex-direction: column;
|
|
248
|
+
gap: 0.75rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.uc-removed-item {
|
|
252
|
+
padding: 0.75rem;
|
|
253
|
+
background: rgba(0, 0, 0, 0.02);
|
|
254
|
+
border-radius: 0.5rem;
|
|
255
|
+
border-left: 3px solid rgb(59, 130, 246);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
:global(.theme-dark) .uc-removed-item {
|
|
259
|
+
background: rgba(255, 255, 255, 0.03);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.uc-item-key {
|
|
263
|
+
font-weight: 600;
|
|
264
|
+
color: rgb(51, 65, 85);
|
|
265
|
+
font-size: 0.875rem;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
:global(.theme-dark) .uc-item-key {
|
|
269
|
+
color: rgb(203, 213, 225);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.uc-item-val {
|
|
273
|
+
font-size: 0.75rem;
|
|
274
|
+
color: rgb(100, 116, 139);
|
|
275
|
+
margin-left: 0.5rem;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.uc-item-desc {
|
|
279
|
+
font-size: 0.8rem;
|
|
280
|
+
color: rgb(100, 116, 139);
|
|
281
|
+
margin: 0.25rem 0;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
:global(.theme-dark) .uc-item-desc {
|
|
285
|
+
color: rgb(148, 163, 184);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.uc-none-detected {
|
|
289
|
+
font-size: 0.875rem;
|
|
290
|
+
color: rgb(100, 116, 139);
|
|
291
|
+
font-style: italic;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
.uc-stats-card {
|
|
295
|
+
background: rgba(255, 255, 255, 0.75);
|
|
296
|
+
backdrop-filter: blur(14px);
|
|
297
|
+
-webkit-backdrop-filter: blur(14px);
|
|
298
|
+
border: 1px solid rgba(255, 255, 255, 0.35);
|
|
299
|
+
border-radius: 1.5rem;
|
|
300
|
+
padding: 1.5rem;
|
|
301
|
+
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
|
|
302
|
+
display: grid;
|
|
303
|
+
grid-template-columns: 1fr 1fr;
|
|
304
|
+
gap: 1.5rem;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
:global(.theme-dark) .uc-stats-card {
|
|
308
|
+
background: rgba(15, 23, 42, 0.75);
|
|
309
|
+
border-color: rgba(255, 255, 255, 0.06);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.uc-stat-item {
|
|
313
|
+
display: flex;
|
|
314
|
+
flex-direction: column;
|
|
315
|
+
align-items: center;
|
|
316
|
+
gap: 0.5rem;
|
|
317
|
+
text-align: center;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.uc-stat-value {
|
|
321
|
+
font-size: 1.5rem;
|
|
322
|
+
font-weight: 800;
|
|
323
|
+
color: rgb(59, 130, 246);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.uc-stat-label {
|
|
327
|
+
font-size: 0.75rem;
|
|
328
|
+
font-weight: 600;
|
|
329
|
+
text-transform: uppercase;
|
|
330
|
+
color: rgb(100, 116, 139);
|
|
331
|
+
letter-spacing: 0.04em;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
:global(.theme-dark) .uc-stat-label {
|
|
335
|
+
color: rgb(148, 163, 184);
|
|
336
|
+
}
|
|
337
|
+
</style>
|
|
338
|
+
|
|
339
|
+
<script>
|
|
340
|
+
import type { UrlCleanerUI } from './ui';
|
|
341
|
+
|
|
342
|
+
interface TrackingParam { label: string; desc: string; }
|
|
343
|
+
|
|
344
|
+
const TRACKING_PARAMS: Record<string, TrackingParam> = {
|
|
345
|
+
utm_source: { label: 'UTM Source', desc: 'Identifica la plataforma o red de origen' },
|
|
346
|
+
utm_medium: { label: 'UTM Medium', desc: 'Define el canal de marketing' },
|
|
347
|
+
utm_campaign: { label: 'UTM Campaign', desc: 'Nombre específico de la campaña' },
|
|
348
|
+
utm_term: { label: 'UTM Term', desc: 'Palabras clave usadas en anuncios' },
|
|
349
|
+
utm_content: { label: 'UTM Content', desc: 'Diferencia anuncios o enlaces' },
|
|
350
|
+
fbclid: { label: 'Facebook Click ID', desc: 'Rastreador inyectado por Facebook' },
|
|
351
|
+
gclid: { label: 'Google Click ID', desc: 'ID de Google Ads para seguimiento' },
|
|
352
|
+
dclid: { label: 'Display Click ID', desc: 'Similar al gclid, para Display Ads' },
|
|
353
|
+
msclkid: { label: 'Bing Click ID', desc: 'Identificador de Microsoft Advertising' },
|
|
354
|
+
li_fat_id: { label: 'LinkedIn Insights', desc: 'Rastreador de conversiones de LinkedIn' },
|
|
355
|
+
mc_cid: { label: 'Mailchimp Campaign ID', desc: 'Identificador de campañas Mailchimp' },
|
|
356
|
+
mc_eid: { label: 'Mailchimp Email ID', desc: 'ID único para rastrear aperturas' },
|
|
357
|
+
_hsenc: { label: 'HubSpot Tracking', desc: 'Parámetro de personalización HubSpot' },
|
|
358
|
+
_hsmi: { label: 'HubSpot Email', desc: 'Rastrea interacción con correos HubSpot' },
|
|
359
|
+
ref: { label: 'Referencia', desc: 'Indica el sitio que recomendó el enlace' },
|
|
360
|
+
affiliate: { label: 'Afiliado', desc: 'ID para atribuir ventas a socio' },
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
const root = document.getElementById('uc-root') as HTMLElement;
|
|
364
|
+
const t = JSON.parse(root.dataset.i18n ?? '{}') as UrlCleanerUI;
|
|
365
|
+
const urlInput = document.getElementById('uc-url-input') as HTMLInputElement;
|
|
366
|
+
const btnClean = document.getElementById('uc-btn-clean') as HTMLButtonElement;
|
|
367
|
+
const results = document.getElementById('uc-results') as HTMLElement;
|
|
368
|
+
const stats = document.getElementById('uc-stats') as HTMLElement;
|
|
369
|
+
const cleanedUrlEl = document.getElementById('uc-cleaned-url') as HTMLElement;
|
|
370
|
+
const removedListEl = document.getElementById('uc-removed-list') as HTMLElement;
|
|
371
|
+
const countEl = document.getElementById('uc-count') as HTMLElement;
|
|
372
|
+
const reductionEl = document.getElementById('uc-reduction') as HTMLElement;
|
|
373
|
+
const copyBtn = document.getElementById('uc-btn-copy') as HTMLButtonElement;
|
|
374
|
+
|
|
375
|
+
function cleanUrl(): void {
|
|
376
|
+
const rawUrl = urlInput.value.trim();
|
|
377
|
+
if (!rawUrl) return;
|
|
378
|
+
|
|
379
|
+
try {
|
|
380
|
+
const url = new URL(rawUrl);
|
|
381
|
+
const params = new URLSearchParams(url.search);
|
|
382
|
+
const removed: Array<{ key: string; value: string }> = [];
|
|
383
|
+
|
|
384
|
+
const keysToRemove: string[] = [];
|
|
385
|
+
params.forEach((value, key) => {
|
|
386
|
+
if (TRACKING_PARAMS[key] || key.startsWith('utm_') || key.includes('clid')) {
|
|
387
|
+
removed.push({ key, value });
|
|
388
|
+
keysToRemove.push(key);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
keysToRemove.forEach((key) => params.delete(key));
|
|
393
|
+
url.search = params.toString();
|
|
394
|
+
const cleanedUrl = url.toString();
|
|
395
|
+
|
|
396
|
+
displayResults(cleanedUrl, removed, rawUrl.length, cleanedUrl.length);
|
|
397
|
+
} catch {
|
|
398
|
+
alert(t.errorInvalid);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function createRemovedItem(item: { key: string; value: string }): HTMLElement {
|
|
403
|
+
const info = TRACKING_PARAMS[item.key] || { label: item.key, desc: 'Tracking parameter' };
|
|
404
|
+
const div = document.createElement('div');
|
|
405
|
+
div.className = 'uc-removed-item';
|
|
406
|
+
const header = document.createElement('div');
|
|
407
|
+
const keySpan = document.createElement('span');
|
|
408
|
+
keySpan.className = 'uc-item-key';
|
|
409
|
+
keySpan.textContent = info.label;
|
|
410
|
+
const valSpan = document.createElement('span');
|
|
411
|
+
valSpan.className = 'uc-item-val';
|
|
412
|
+
valSpan.textContent = item.value;
|
|
413
|
+
header.appendChild(keySpan);
|
|
414
|
+
header.appendChild(valSpan);
|
|
415
|
+
const desc = document.createElement('p');
|
|
416
|
+
desc.className = 'uc-item-desc';
|
|
417
|
+
desc.textContent = info.desc;
|
|
418
|
+
div.appendChild(header);
|
|
419
|
+
div.appendChild(desc);
|
|
420
|
+
return div;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function displayResults(cleaned: string, removed: Array<{ key: string; value: string }>, oldLen: number, newLen: number): void {
|
|
424
|
+
results.style.display = '';
|
|
425
|
+
stats.style.display = '';
|
|
426
|
+
cleanedUrlEl.textContent = cleaned;
|
|
427
|
+
countEl.textContent = removed.length.toString();
|
|
428
|
+
const reduction = oldLen > 0 ? Math.round(((oldLen - newLen) / oldLen) * 100) : 0;
|
|
429
|
+
reductionEl.textContent = `${reduction}%`;
|
|
430
|
+
removedListEl.innerHTML = '';
|
|
431
|
+
if (removed.length === 0) {
|
|
432
|
+
const p = document.createElement('p');
|
|
433
|
+
p.className = 'uc-none-detected';
|
|
434
|
+
p.textContent = t.noneDetected;
|
|
435
|
+
removedListEl.appendChild(p);
|
|
436
|
+
} else {
|
|
437
|
+
removed.forEach((item) => removedListEl.appendChild(createRemovedItem(item)));
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
btnClean.addEventListener('click', cleanUrl);
|
|
442
|
+
urlInput.addEventListener('keypress', (e) => {
|
|
443
|
+
if (e.key === 'Enter') cleanUrl();
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
copyBtn.addEventListener('click', () => {
|
|
447
|
+
const text = cleanedUrlEl.textContent || '';
|
|
448
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
449
|
+
const origText = copyBtn.textContent;
|
|
450
|
+
copyBtn.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg> ${t.btnCopied}`;
|
|
451
|
+
copyBtn.classList.add('uc-copied');
|
|
452
|
+
setTimeout(() => {
|
|
453
|
+
copyBtn.textContent = origText;
|
|
454
|
+
copyBtn.classList.remove('uc-copied');
|
|
455
|
+
}, 2000);
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
</script>
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { UrlCleanerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'url-tracking-cleaner';
|
|
6
|
+
const title = 'URL Tracking Cleaner: Remove UTM, FBCLID and GCLID';
|
|
7
|
+
const description = 'Automatically remove tracking and advertising parameters from your URLs. Share clean links and protect your digital privacy instantly.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'What types of tracking parameters does this tool remove?',
|
|
12
|
+
answer: 'Our tool automatically detects and removes the most common tracking parameters, including UTM (utm_source, utm_medium, etc.), advertising click identifiers (fbclid, gclid, msclkid) and email marketing campaign identifiers (mc_cid, _hsenc).',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Does this affect website functionality?',
|
|
16
|
+
answer: 'Generally no. These parameters are used almost exclusively for analytics and marketing. When you remove them, the page will load normally, but the website owner won\'t be able to track the exact source of your click.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Is it safe to process my links here?',
|
|
20
|
+
answer: 'Absolutely. Like all our tools, the process is 100% client-side. Your links are never sent to our servers; everything happens privately in your own browser.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: 'Why are my Facebook links so long?',
|
|
24
|
+
answer: 'Facebook adds a parameter called "fbclid" to all links that leave their platform. This allows them to track your activity on other websites even if you have third-party advertising blocked.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{ name: 'Paste your URL', text: 'Enter the complete URL that contains tracking parameters' },
|
|
30
|
+
{ name: 'Click Clean', text: 'The tool will analyze the URL automatically' },
|
|
31
|
+
{ name: 'Review results', text: 'You\'ll see the cleaned URL and a list of removed parameters' },
|
|
32
|
+
{ name: 'Copy and share', text: 'Use the clean URL in your emails, social media or messages' },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
36
|
+
'@context': 'https://schema.org',
|
|
37
|
+
'@type': 'FAQPage',
|
|
38
|
+
mainEntity: faqData.map((item) => ({
|
|
39
|
+
'@type': 'Question',
|
|
40
|
+
name: item.question,
|
|
41
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
46
|
+
'@context': 'https://schema.org',
|
|
47
|
+
'@type': 'HowTo',
|
|
48
|
+
name: title,
|
|
49
|
+
description,
|
|
50
|
+
step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'SoftwareApplication',
|
|
56
|
+
name: title,
|
|
57
|
+
description,
|
|
58
|
+
applicationCategory: 'UtilityApplication',
|
|
59
|
+
operatingSystem: 'All',
|
|
60
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
61
|
+
inLanguage: 'en',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const ui: UrlCleanerUI = {
|
|
65
|
+
labelInput: 'Paste the URL with tracking parameters',
|
|
66
|
+
btnClean: 'Clean',
|
|
67
|
+
labelCleaned: 'Clean URL',
|
|
68
|
+
labelRemoved: 'Removed Trackers',
|
|
69
|
+
countLabel: 'Parameters removed',
|
|
70
|
+
reductionLabel: 'Length reduction',
|
|
71
|
+
noneDetected: 'No common tracking parameters detected.',
|
|
72
|
+
errorInvalid: 'Please enter a valid URL.',
|
|
73
|
+
btnCopy: 'Copy',
|
|
74
|
+
btnCopied: 'Copied',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const content: ToolLocaleContent<UrlCleanerUI> = {
|
|
78
|
+
slug,
|
|
79
|
+
title,
|
|
80
|
+
description,
|
|
81
|
+
ui,
|
|
82
|
+
faqTitle: 'Frequently Asked Questions',
|
|
83
|
+
faq: faqData,
|
|
84
|
+
bibliographyTitle: 'Resources on Privacy and Web Tracking',
|
|
85
|
+
bibliography: [
|
|
86
|
+
{ name: 'Electronic Frontier Foundation (EFF): Guide to Online Tracking', url: 'https://www.eff.org/issues/online-behavioral-tracking' },
|
|
87
|
+
{ name: 'Google Analytics: UTM Parameter Documentation', url: 'https://support.google.com/analytics/answer/1033863' },
|
|
88
|
+
{ name: 'Web Privacy: The Impact of Click IDs', url: 'https://www.w3.org/community/web-advertising/wiki/Click_Identifiers' },
|
|
89
|
+
],
|
|
90
|
+
howTo: howToData,
|
|
91
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
92
|
+
seo: [
|
|
93
|
+
{ type: 'title', text: 'URL Tracking Cleaner: Remove UTM, FBCLID and GCLID', level: 2 },
|
|
94
|
+
{
|
|
95
|
+
type: 'paragraph',
|
|
96
|
+
html: 'Remove invisible trackers from your links to share them cleanly, privately and professionally. Discover what those strange codes in your URLs mean.',
|
|
97
|
+
},
|
|
98
|
+
{ type: 'title', text: 'What is a URL Tracking Cleaner and why do you need it?', level: 3 },
|
|
99
|
+
{
|
|
100
|
+
type: 'paragraph',
|
|
101
|
+
html: 'Ever copied a link to send to a friend and realized it\'s three times longer than it should be? That extra "noise" is tracking parameters. A <strong>tracking cleaner</strong> is a tool designed to "strip" the URL of all the advertising and tracking information that big platforms inject into every click you make.',
|
|
102
|
+
},
|
|
103
|
+
{ type: 'title', text: 'Most common tracking parameters', level: 3 },
|
|
104
|
+
{
|
|
105
|
+
type: 'list',
|
|
106
|
+
items: [
|
|
107
|
+
'<strong>UTM (Google Analytics):</strong> utm_source, utm_medium, utm_campaign to track campaigns',
|
|
108
|
+
'<strong>FBCLID:</strong> Facebook click identifier to bypass cookie restrictions',
|
|
109
|
+
'<strong>GCLID / DCLID:</strong> Google Click ID to link visits with Google Ads campaigns',
|
|
110
|
+
'<strong>MSCLKID:</strong> Microsoft Advertising and Bing click identifier',
|
|
111
|
+
'<strong>HubSpot & Mailchimp:</strong> Marketing automation parameters like _hsenc, mc_cid',
|
|
112
|
+
'<strong>LinkedIn & Others:</strong> li_fat_id and other social media trackers',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { UrlCleanerUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'limpiador-tracking-url';
|
|
6
|
+
const title = 'Limpiador de Tracking de URL: Eliminar UTM, FBCLID y GCLID';
|
|
7
|
+
const description = 'Elimina automáticamente parámetros de rastreo y publicidad de tus URLs. Comparte enlaces limpios y protege tu privacidad digital al instante.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: '¿Qué tipos de parámetros de rastreo elimina esta herramienta?',
|
|
12
|
+
answer: 'Nuestra utilidad detecta y elimina automáticamente los parámetros de seguimiento más comunes, incluyendo UTM (utm_source, utm_medium, etc.), identificadores de clics publicitarios (fbclid, gclid, msclkid) e identificadores de campañas de email marketing (mc_cid, _hsenc).',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '¿Afecta esto a la funcionalidad del sitio web?',
|
|
16
|
+
answer: 'Generalmente no. Estos parámetros se utilizan casi exclusivamente para analítica y marketing. Al eliminarlos, la página cargará normalmente, pero el propietario del sitio no podrá rastrear la fuente exacta de tu clic.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '¿Es seguro procesar mis enlaces aquí?',
|
|
20
|
+
answer: 'Totalmente. Al igual que todas nuestras utilidades, el proceso es 100% client-side. Los enlaces nunca se envían a nuestros servidores; todo sucede de forma privada en tu propio navegador.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
question: '¿Por qué mis enlaces de Facebook son tan largos?',
|
|
24
|
+
answer: 'Facebook añade un parámetro llamado "fbclid" a todos los enlaces que salen de su plataforma. Esto les permite rastrear tu actividad en otros sitios web incluso si tienes bloqueada la publicidad de terceros.',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const howToData = [
|
|
29
|
+
{ name: 'Pega tu URL', text: 'Introduce la URL completa que contiene parámetros de rastreo' },
|
|
30
|
+
{ name: 'Haz clic en Limpiar', text: 'El programa analizará la URL automáticamente' },
|
|
31
|
+
{ name: 'Revisa los resultados', text: 'Verás la URL limpia y una lista de parámetros removidos' },
|
|
32
|
+
{ name: 'Copia y comparte', text: 'Usa la URL limpia en tus correos, redes sociales o mensajes' },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
36
|
+
'@context': 'https://schema.org',
|
|
37
|
+
'@type': 'FAQPage',
|
|
38
|
+
mainEntity: faqData.map((item) => ({
|
|
39
|
+
'@type': 'Question',
|
|
40
|
+
name: item.question,
|
|
41
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const howToSchema: WithContext<HowToThing> = {
|
|
46
|
+
'@context': 'https://schema.org',
|
|
47
|
+
'@type': 'HowTo',
|
|
48
|
+
name: title,
|
|
49
|
+
description,
|
|
50
|
+
step: howToData.map((s, i) => ({ '@type': 'HowToStep', position: i + 1, name: s.name, text: s.text })),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'SoftwareApplication',
|
|
56
|
+
name: title,
|
|
57
|
+
description,
|
|
58
|
+
applicationCategory: 'UtilityApplication',
|
|
59
|
+
operatingSystem: 'All',
|
|
60
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
61
|
+
inLanguage: 'es',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const ui: UrlCleanerUI = {
|
|
65
|
+
labelInput: 'Pega la URL con rastreadores',
|
|
66
|
+
btnClean: 'Limpiar',
|
|
67
|
+
labelCleaned: 'URL Limpia',
|
|
68
|
+
labelRemoved: 'Rastreadores Eliminados',
|
|
69
|
+
countLabel: 'Parámetros eliminados',
|
|
70
|
+
reductionLabel: 'Reducción de longitud',
|
|
71
|
+
noneDetected: 'No se detectaron rastreadores comunes.',
|
|
72
|
+
errorInvalid: 'Por favor, introduce una URL válida.',
|
|
73
|
+
btnCopy: 'Copiar',
|
|
74
|
+
btnCopied: 'Copiado',
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const content: ToolLocaleContent<UrlCleanerUI> = {
|
|
78
|
+
slug,
|
|
79
|
+
title,
|
|
80
|
+
description,
|
|
81
|
+
ui,
|
|
82
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
83
|
+
faq: faqData,
|
|
84
|
+
bibliographyTitle: 'Recursos sobre Privacidad y Rastreo Web',
|
|
85
|
+
bibliography: [
|
|
86
|
+
{ name: 'Electronic Frontier Foundation (EFF): Guía sobre Rastreo Online', url: 'https://www.eff.org/issues/online-behavioral-tracking' },
|
|
87
|
+
{ name: 'Google Analytics: Documentación de Parámetros UTM', url: 'https://support.google.com/analytics/answer/1033863' },
|
|
88
|
+
{ name: 'Privacidad en la Web: El impacto de los Click IDs', url: 'https://www.w3.org/community/web-advertising/wiki/Click_Identifiers' },
|
|
89
|
+
],
|
|
90
|
+
howTo: howToData,
|
|
91
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
92
|
+
seo: [
|
|
93
|
+
{ type: 'title', text: 'Limpiador de Tracking URL: Elimina UTM, FBCLID y GCLID', level: 2 },
|
|
94
|
+
{
|
|
95
|
+
type: 'paragraph',
|
|
96
|
+
html: 'Elimina rastreadores invisibles de tus enlaces para compartirlos de forma limpia, privada y profesional. Descubre qué significan esos códigos extraños en tus URLs.',
|
|
97
|
+
},
|
|
98
|
+
{ type: 'title', text: '¿Qué es un Limpiador de Tracking de URL y por qué lo necesitas?', level: 3 },
|
|
99
|
+
{
|
|
100
|
+
type: 'paragraph',
|
|
101
|
+
html: 'Alguna vez has copiado un enlace para enviárselo a un amigo y te has dado cuenta de que es tres veces más largo de lo que debería ser? Ese "ruido" extra son los parámetros de rastreo. Un <strong>limpiador de tracking</strong> es una herramienta diseñada para "desnudar" la dirección web de toda la información publicitaria y de seguimiento que las grandes plataformas inyectan en cada clic que haces.',
|
|
102
|
+
},
|
|
103
|
+
{ type: 'title', text: 'Parámetros de rastreo más comunes', level: 3 },
|
|
104
|
+
{
|
|
105
|
+
type: 'list',
|
|
106
|
+
items: [
|
|
107
|
+
'<strong>UTM (Google Analytics):</strong> utm_source, utm_medium, utm_campaign para rastrear campañas',
|
|
108
|
+
'<strong>FBCLID:</strong> Identificador de clics de Facebook para saltarse restricciones de cookies',
|
|
109
|
+
'<strong>GCLID / DCLID:</strong> Google Click ID para vincular visitas con campañas de Google Ads',
|
|
110
|
+
'<strong>MSCLKID:</strong> Identificador de clics de Microsoft Advertising y Bing',
|
|
111
|
+
'<strong>HubSpot & Mailchimp:</strong> Parámetros de marketing automation como _hsenc, mc_cid',
|
|
112
|
+
'<strong>LinkedIn & Otros:</strong> li_fat_id y otros rastreadores de redes sociales',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
};
|