@jjlmoya/utils-developer 1.30.0 → 1.32.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 (187) hide show
  1. package/package.json +70 -70
  2. package/src/category/i18n/en.ts +1 -1
  3. package/src/category/i18n/es.ts +1 -1
  4. package/src/category/index.ts +2 -1
  5. package/src/category/seo.astro +1 -1
  6. package/src/components/PreviewNavSidebar.astro +1 -1
  7. package/src/components/PreviewToolbar.astro +1 -1
  8. package/src/data.ts +1 -1
  9. package/src/entries.ts +2 -0
  10. package/src/env.d.ts +1 -1
  11. package/src/index.ts +1 -0
  12. package/src/layouts/PreviewLayout.astro +1 -1
  13. package/src/pages/[locale]/[slug].astro +161 -161
  14. package/src/pages/index.astro +1 -1
  15. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  16. package/src/tests/category_seo_quality.test.ts +76 -0
  17. package/src/tests/entry_contract.test.ts +8 -2
  18. package/src/tests/faq_count.test.ts +1 -1
  19. package/src/tests/i18n_coverage.test.ts +2 -6
  20. package/src/tests/inverted_punctuation.test.ts +113 -113
  21. package/src/tests/locale_completeness.test.ts +1 -1
  22. package/src/tests/mocks/astro_mock.js +1 -1
  23. package/src/tests/no_h1_in_components.test.ts +1 -1
  24. package/src/tests/promote_this_website_i18n.test.ts +33 -0
  25. package/src/tests/seo_translation_completeness.test.ts +69 -0
  26. package/src/tests/seo_wellformed_export.test.ts +65 -0
  27. package/src/tests/slug_language_code_format.test.ts +25 -25
  28. package/src/tests/slug_uniqueness.test.ts +86 -86
  29. package/src/tests/tool_validation.test.ts +16 -16
  30. package/src/tool/aspectRatio/i18n/de.ts +164 -164
  31. package/src/tool/aspectRatio/i18n/ja.ts +1 -1
  32. package/src/tool/aspectRatio/i18n/ko.ts +1 -1
  33. package/src/tool/aspectRatio/i18n/pl.ts +164 -164
  34. package/src/tool/aspectRatio/i18n/ru.ts +164 -164
  35. package/src/tool/aspectRatio/i18n/zh.ts +165 -165
  36. package/src/tool/aspectRatio/seo.astro +15 -15
  37. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +143 -143
  38. package/src/tool/calculadoraTiempoDatos/i18n/ja.ts +1 -1
  39. package/src/tool/calculadoraTiempoDatos/i18n/ko.ts +1 -1
  40. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +143 -143
  41. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +144 -144
  42. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +143 -143
  43. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +144 -144
  44. package/src/tool/calculadoraTiempoDatos/seo.astro +15 -15
  45. package/src/tool/colorConverter/i18n/de.ts +120 -120
  46. package/src/tool/colorConverter/i18n/ja.ts +1 -1
  47. package/src/tool/colorConverter/i18n/ko.ts +1 -1
  48. package/src/tool/colorConverter/i18n/ru.ts +120 -120
  49. package/src/tool/colorConverter/i18n/zh.ts +1 -1
  50. package/src/tool/colorConverter/seo.astro +15 -15
  51. package/src/tool/conversorExcelCsvHtml/i18n/ja.ts +1 -1
  52. package/src/tool/conversorExcelCsvHtml/i18n/ko.ts +1 -1
  53. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +124 -124
  54. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +124 -124
  55. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +125 -125
  56. package/src/tool/conversorExcelCsvHtml/seo.astro +15 -15
  57. package/src/tool/cronGenerator/i18n/ja.ts +1 -1
  58. package/src/tool/cronGenerator/i18n/ko.ts +1 -1
  59. package/src/tool/cronGenerator/i18n/zh.ts +183 -183
  60. package/src/tool/cronGenerator/seo.astro +15 -15
  61. package/src/tool/cssSpecificityCalculator/i18n/ja.ts +1 -1
  62. package/src/tool/cssSpecificityCalculator/i18n/ko.ts +1 -1
  63. package/src/tool/cssSpecificityCalculator/i18n/zh.ts +1 -1
  64. package/src/tool/cssSpecificityCalculator/seo.astro +15 -15
  65. package/src/tool/cssToInlineConverter/i18n/ja.ts +1 -1
  66. package/src/tool/cssToInlineConverter/i18n/ko.ts +1 -1
  67. package/src/tool/cssToInlineConverter/i18n/zh.ts +1 -1
  68. package/src/tool/cssToInlineConverter/seo.astro +15 -15
  69. package/src/tool/dualOsIconPreview/assets/day-check.webp +0 -0
  70. package/src/tool/dualOsIconPreview/assets/fast-task.webp +0 -0
  71. package/src/tool/dualOsIconPreview/assets/fortune-cookie.webp +0 -0
  72. package/src/tool/dualOsIconPreview/assets/lexi-crash.webp +0 -0
  73. package/src/tool/dualOsIconPreview/assets/pizzametrics.webp +0 -0
  74. package/src/tool/dualOsIconPreview/assets/sauce-lab.webp +0 -0
  75. package/src/tool/dualOsIconPreview/assets/vesp.webp +0 -0
  76. package/src/tool/dualOsIconPreview/bibliography.astro +6 -0
  77. package/src/tool/dualOsIconPreview/bibliography.ts +7 -0
  78. package/src/tool/dualOsIconPreview/component.astro +117 -0
  79. package/src/tool/dualOsIconPreview/controller.ts +157 -0
  80. package/src/tool/dualOsIconPreview/dom-views.ts +82 -0
  81. package/src/tool/dualOsIconPreview/dual-ios-android-app-icon-preview.css +861 -0
  82. package/src/tool/dualOsIconPreview/entry.ts +31 -0
  83. package/src/tool/dualOsIconPreview/evaluator.ts +20 -0
  84. package/src/tool/dualOsIconPreview/i18n/de.ts +56 -0
  85. package/src/tool/dualOsIconPreview/i18n/en.ts +46 -0
  86. package/src/tool/dualOsIconPreview/i18n/es.ts +56 -0
  87. package/src/tool/dualOsIconPreview/i18n/fr.ts +56 -0
  88. package/src/tool/dualOsIconPreview/i18n/id.ts +56 -0
  89. package/src/tool/dualOsIconPreview/i18n/it.ts +56 -0
  90. package/src/tool/dualOsIconPreview/i18n/ja.ts +56 -0
  91. package/src/tool/dualOsIconPreview/i18n/ko.ts +56 -0
  92. package/src/tool/dualOsIconPreview/i18n/nl.ts +56 -0
  93. package/src/tool/dualOsIconPreview/i18n/pl.ts +56 -0
  94. package/src/tool/dualOsIconPreview/i18n/pt.ts +56 -0
  95. package/src/tool/dualOsIconPreview/i18n/ru.ts +56 -0
  96. package/src/tool/dualOsIconPreview/i18n/sv.ts +56 -0
  97. package/src/tool/dualOsIconPreview/i18n/tr.ts +43 -0
  98. package/src/tool/dualOsIconPreview/i18n/zh.ts +43 -0
  99. package/src/tool/dualOsIconPreview/index.ts +11 -0
  100. package/src/tool/dualOsIconPreview/logic.test.ts +63 -0
  101. package/src/tool/dualOsIconPreview/logic.ts +135 -0
  102. package/src/tool/dualOsIconPreview/seo.astro +15 -0
  103. package/src/tool/dualOsIconPreview/storage.ts +18 -0
  104. package/src/tool/dualOsIconPreview/ui.ts +52 -0
  105. package/src/tool/duplicateCssRemover/i18n/ja.ts +1 -1
  106. package/src/tool/duplicateCssRemover/i18n/ko.ts +1 -1
  107. package/src/tool/duplicateCssRemover/i18n/zh.ts +1 -1
  108. package/src/tool/duplicateCssRemover/seo.astro +15 -15
  109. package/src/tool/generadorSecurityTxt/i18n/ja.ts +1 -1
  110. package/src/tool/generadorSecurityTxt/i18n/ko.ts +1 -1
  111. package/src/tool/generadorSecurityTxt/i18n/zh.ts +1 -1
  112. package/src/tool/generadorSecurityTxt/seo.astro +15 -15
  113. package/src/tool/hashGenerator/i18n/ja.ts +1 -1
  114. package/src/tool/hashGenerator/i18n/ko.ts +1 -1
  115. package/src/tool/hashGenerator/seo.astro +15 -15
  116. package/src/tool/inspectorCertificadosSsl/i18n/ja.ts +1 -1
  117. package/src/tool/inspectorCertificadosSsl/i18n/ko.ts +1 -1
  118. package/src/tool/inspectorCertificadosSsl/i18n/zh.ts +1 -1
  119. package/src/tool/inspectorCertificadosSsl/seo.astro +15 -15
  120. package/src/tool/jsonFormatter/seo.astro +15 -15
  121. package/src/tool/jwtDecoder/i18n/es.ts +248 -248
  122. package/src/tool/jwtDecoder/i18n/fr.ts +248 -248
  123. package/src/tool/jwtDecoder/i18n/tr.ts +248 -248
  124. package/src/tool/keycode/seo.astro +15 -15
  125. package/src/tool/llmCostCalculator/i18n/fr.ts +149 -149
  126. package/src/tool/llmCostCalculator/i18n/ja.ts +1 -1
  127. package/src/tool/llmCostCalculator/i18n/ko.ts +1 -1
  128. package/src/tool/llmCostCalculator/seo.astro +15 -15
  129. package/src/tool/mobileMockupGenerator/i18n/ja.ts +1 -1
  130. package/src/tool/mobileMockupGenerator/i18n/ko.ts +1 -1
  131. package/src/tool/mobileMockupGenerator/i18n/zh.ts +1 -1
  132. package/src/tool/mobileMockupGenerator/seo.astro +15 -15
  133. package/src/tool/musicalTypography/i18n/ja.ts +1 -1
  134. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  135. package/src/tool/musicalTypography/i18n/zh.ts +1 -1
  136. package/src/tool/musicalTypography/seo.astro +15 -15
  137. package/src/tool/placeholderGenerator/i18n/ja.ts +1 -1
  138. package/src/tool/placeholderGenerator/i18n/ko.ts +1 -1
  139. package/src/tool/placeholderGenerator/i18n/zh.ts +1 -1
  140. package/src/tool/placeholderGenerator/seo.astro +15 -15
  141. package/src/tool/promoteThisWebsite/entry.ts +13 -0
  142. package/src/tool/promoteThisWebsite/i18n/de.ts +95 -0
  143. package/src/tool/promoteThisWebsite/i18n/fr.ts +95 -0
  144. package/src/tool/promoteThisWebsite/i18n/id.ts +95 -0
  145. package/src/tool/promoteThisWebsite/i18n/it.ts +95 -0
  146. package/src/tool/promoteThisWebsite/i18n/ja.ts +95 -0
  147. package/src/tool/promoteThisWebsite/i18n/ko.ts +95 -0
  148. package/src/tool/promoteThisWebsite/i18n/nl.ts +95 -0
  149. package/src/tool/promoteThisWebsite/i18n/pl.ts +95 -0
  150. package/src/tool/promoteThisWebsite/i18n/pt.ts +95 -0
  151. package/src/tool/promoteThisWebsite/i18n/ru.ts +95 -0
  152. package/src/tool/promoteThisWebsite/i18n/sv.ts +95 -0
  153. package/src/tool/promoteThisWebsite/i18n/tr.ts +95 -0
  154. package/src/tool/promoteThisWebsite/i18n/zh.ts +95 -0
  155. package/src/tool/promptLibrary/i18n/ja.ts +1 -1
  156. package/src/tool/promptLibrary/i18n/ko.ts +1 -1
  157. package/src/tool/promptLibrary/i18n/zh.ts +1 -1
  158. package/src/tool/promptLibrary/seo.astro +15 -15
  159. package/src/tool/readabilityCalculator/i18n/ja.ts +1 -1
  160. package/src/tool/readabilityCalculator/i18n/ko.ts +1 -1
  161. package/src/tool/readabilityCalculator/i18n/zh.ts +1 -1
  162. package/src/tool/readabilityCalculator/seo.astro +15 -15
  163. package/src/tool/serpPixelSimulator/entry.ts +30 -30
  164. package/src/tool/serpPixelSimulator/i18n/en.ts +211 -211
  165. package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -214
  166. package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -214
  167. package/src/tool/serpPixelSimulator/logic.ts +18 -18
  168. package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +195 -195
  169. package/src/tool/svgSanitizer/i18n/ja.ts +1 -1
  170. package/src/tool/svgSanitizer/i18n/ko.ts +1 -1
  171. package/src/tool/svgSanitizer/seo.astro +15 -15
  172. package/src/tool/svgToCss/i18n/ja.ts +1 -1
  173. package/src/tool/svgToCss/i18n/ko.ts +1 -1
  174. package/src/tool/svgToCss/seo.astro +15 -15
  175. package/src/tool/urlCleaner/i18n/ja.ts +1 -1
  176. package/src/tool/urlCleaner/i18n/ko.ts +1 -1
  177. package/src/tool/urlCleaner/i18n/zh.ts +1 -1
  178. package/src/tool/urlCleaner/seo.astro +15 -15
  179. package/src/tool/urlEncoderDecoder/i18n/es.ts +146 -146
  180. package/src/tool/urlEncoderDecoder/i18n/ko.ts +1 -1
  181. package/src/tool/urlEncoderDecoder/seo.astro +15 -15
  182. package/src/tool/utmGenerator/i18n/ja.ts +1 -1
  183. package/src/tool/utmGenerator/i18n/ko.ts +1 -1
  184. package/src/tool/utmGenerator/i18n/zh.ts +1 -1
  185. package/src/tool/utmGenerator/seo.astro +15 -15
  186. package/src/tools.ts +2 -1
  187. package/src/types.ts +1 -1
@@ -1,23 +1,23 @@
1
- .sps-root {
2
- --sps-ink: #1f2937;
3
- --sps-muted: #64748b;
4
- --sps-line: #d9e2ec;
1
+ .sps-root {
2
+ --sps-ink: #1f2937;
3
+ --sps-muted: #64748b;
4
+ --sps-line: #d9e2ec;
5
5
  --sps-panel: #fff;
6
- --sps-soft: #f6f8fb;
6
+ --sps-soft: #f6f8fb;
7
7
  --sps-ok: #16875d;
8
8
  --sps-warn: #d93025;
9
9
 
10
10
  color: var(--sps-ink);
11
11
  }
12
-
13
- .theme-dark .sps-root {
14
- --sps-ink: #e5edf7;
15
- --sps-muted: #a8b5c6;
16
- --sps-line: #2c3a4e;
17
- --sps-panel: #111827;
18
- --sps-soft: #0b1120;
19
- }
20
-
12
+
13
+ .theme-dark .sps-root {
14
+ --sps-ink: #e5edf7;
15
+ --sps-muted: #a8b5c6;
16
+ --sps-line: #2c3a4e;
17
+ --sps-panel: #111827;
18
+ --sps-soft: #0b1120;
19
+ }
20
+
21
21
  .sps-shell {
22
22
  display: grid;
23
23
  grid-template-columns: minmax(280px, 0.95fr) minmax(320px, 1.05fr);
@@ -36,26 +36,26 @@
36
36
  .sps-preview-wrap {
37
37
  min-width: 0;
38
38
  }
39
-
40
- .sps-field {
41
- display: grid;
42
- gap: 8px;
43
- margin-bottom: 18px;
44
- }
45
-
46
- .sps-label,
47
- .sps-device-label,
48
- .sps-meter-top {
49
- font-size: 0.86rem;
50
- font-weight: 700;
51
- color: #334155;
52
- }
53
-
39
+
40
+ .sps-field {
41
+ display: grid;
42
+ gap: 8px;
43
+ margin-bottom: 18px;
44
+ }
45
+
46
+ .sps-label,
47
+ .sps-device-label,
48
+ .sps-meter-top {
49
+ font-size: 0.86rem;
50
+ font-weight: 700;
51
+ color: #334155;
52
+ }
53
+
54
54
  .sps-input,
55
55
  .sps-textarea {
56
- width: 100%;
57
- box-sizing: border-box;
58
- border: 1px solid #cbd5e1;
56
+ width: 100%;
57
+ box-sizing: border-box;
58
+ border: 1px solid #cbd5e1;
59
59
  border-radius: 6px;
60
60
  padding: 10px 12px;
61
61
  font-size: 15px;
@@ -116,8 +116,8 @@
116
116
  .theme-dark .sps-input,
117
117
  .theme-dark .sps-textarea,
118
118
  .theme-dark .sps-segment button {
119
- border-color: #334155;
120
- background: #0f172a;
119
+ border-color: #334155;
120
+ background: #0f172a;
121
121
  color: #e5edf7;
122
122
  }
123
123
 
@@ -125,114 +125,114 @@
125
125
  border-color: #334155;
126
126
  background: #2563eb;
127
127
  }
128
-
129
- .theme-dark .sps-label,
130
- .theme-dark .sps-device-label,
131
- .theme-dark .sps-meter-top,
132
- .theme-dark .sps-preview-title {
133
- color: #d6e1f0;
134
- }
135
-
136
- .sps-textarea {
137
- min-height: 108px;
138
- resize: vertical;
139
- }
140
-
141
- .sps-device {
142
- display: flex;
143
- align-items: center;
144
- justify-content: space-between;
145
- gap: 12px;
146
- margin-bottom: 18px;
147
- }
148
-
149
- .sps-segment {
150
- display: inline-grid;
151
- grid-template-columns: 1fr 1fr;
152
- border: 1px solid #cbd5e1;
153
- border-radius: 7px;
154
- overflow: hidden;
155
- }
156
-
157
- .sps-segment button {
158
- border: 0;
159
- border-right: 1px solid #cbd5e1;
160
- background: #fff;
161
- color: #334155;
162
- padding: 8px 12px;
163
- font-weight: 700;
164
- cursor: pointer;
165
- }
166
-
167
- .sps-segment button:last-child {
168
- border-right: 0;
169
- }
170
-
171
- .sps-segment button[aria-pressed='true'] {
172
- background: #e8f0fe;
173
- color: #174ea6;
174
- }
175
-
176
- .theme-dark .sps-segment button[aria-pressed='true'] {
177
- background: #1e3a5f;
178
- color: #bfdbfe;
179
- }
180
-
181
- .sps-meter {
182
- display: grid;
183
- gap: 7px;
184
- margin-top: 14px;
185
- }
186
-
187
- .sps-meter-top {
188
- display: flex;
189
- justify-content: space-between;
190
- gap: 12px;
191
- }
192
-
193
- .sps-track {
194
- height: 10px;
195
- border-radius: 999px;
196
- background: #e5eaf1;
197
- overflow: hidden;
198
- }
199
-
200
- .sps-fill {
201
- display: block;
202
- width: 0%;
203
- height: 100%;
204
- border-radius: inherit;
205
- background: var(--sps-ok);
206
- transition: width 120ms ease, background-color 120ms ease;
207
- }
208
-
209
- .sps-meter.sps-over .sps-fill {
210
- background: var(--sps-warn);
211
- }
212
-
213
- .sps-meter-status {
214
- font-size: 0.82rem;
215
- color: var(--sps-muted);
216
- }
217
-
218
- .sps-meter.sps-over .sps-meter-status {
219
- color: var(--sps-warn);
220
- font-weight: 700;
221
- }
222
-
128
+
129
+ .theme-dark .sps-label,
130
+ .theme-dark .sps-device-label,
131
+ .theme-dark .sps-meter-top,
132
+ .theme-dark .sps-preview-title {
133
+ color: #d6e1f0;
134
+ }
135
+
136
+ .sps-textarea {
137
+ min-height: 108px;
138
+ resize: vertical;
139
+ }
140
+
141
+ .sps-device {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ gap: 12px;
146
+ margin-bottom: 18px;
147
+ }
148
+
149
+ .sps-segment {
150
+ display: inline-grid;
151
+ grid-template-columns: 1fr 1fr;
152
+ border: 1px solid #cbd5e1;
153
+ border-radius: 7px;
154
+ overflow: hidden;
155
+ }
156
+
157
+ .sps-segment button {
158
+ border: 0;
159
+ border-right: 1px solid #cbd5e1;
160
+ background: #fff;
161
+ color: #334155;
162
+ padding: 8px 12px;
163
+ font-weight: 700;
164
+ cursor: pointer;
165
+ }
166
+
167
+ .sps-segment button:last-child {
168
+ border-right: 0;
169
+ }
170
+
171
+ .sps-segment button[aria-pressed='true'] {
172
+ background: #e8f0fe;
173
+ color: #174ea6;
174
+ }
175
+
176
+ .theme-dark .sps-segment button[aria-pressed='true'] {
177
+ background: #1e3a5f;
178
+ color: #bfdbfe;
179
+ }
180
+
181
+ .sps-meter {
182
+ display: grid;
183
+ gap: 7px;
184
+ margin-top: 14px;
185
+ }
186
+
187
+ .sps-meter-top {
188
+ display: flex;
189
+ justify-content: space-between;
190
+ gap: 12px;
191
+ }
192
+
193
+ .sps-track {
194
+ height: 10px;
195
+ border-radius: 999px;
196
+ background: #e5eaf1;
197
+ overflow: hidden;
198
+ }
199
+
200
+ .sps-fill {
201
+ display: block;
202
+ width: 0%;
203
+ height: 100%;
204
+ border-radius: inherit;
205
+ background: var(--sps-ok);
206
+ transition: width 120ms ease, background-color 120ms ease;
207
+ }
208
+
209
+ .sps-meter.sps-over .sps-fill {
210
+ background: var(--sps-warn);
211
+ }
212
+
213
+ .sps-meter-status {
214
+ font-size: 0.82rem;
215
+ color: var(--sps-muted);
216
+ }
217
+
218
+ .sps-meter.sps-over .sps-meter-status {
219
+ color: var(--sps-warn);
220
+ font-weight: 700;
221
+ }
222
+
223
223
  .sps-preview-wrap {
224
224
  border-left: 1px solid var(--sps-line);
225
225
  background: var(--sps-soft);
226
226
  border-radius: 8px;
227
227
  padding: 24px;
228
228
  }
229
-
230
- .sps-preview-title {
231
- margin: 0 0 14px;
232
- color: #334155;
233
- font-size: 0.92rem;
234
- }
235
-
229
+
230
+ .sps-preview-title {
231
+ margin: 0 0 14px;
232
+ color: #334155;
233
+ font-size: 0.92rem;
234
+ }
235
+
236
236
  .sps-serp {
237
237
  width: min(100%, 652px);
238
238
  border-radius: 8px;
@@ -241,33 +241,33 @@
241
241
  font-family: Arial, Helvetica, sans-serif;
242
242
  box-shadow: 0 1px 2px rgb(60, 64, 67, 0.14), 0 1px 3px 1px rgb(60, 64, 67, 0.08);
243
243
  }
244
-
245
- .theme-dark .sps-serp {
246
- background: #f8fafc;
247
- }
248
-
249
- .sps-serp.sps-mobile {
250
- max-width: 390px;
251
- }
252
-
253
- .sps-url-line {
254
- display: flex;
255
- align-items: center;
256
- gap: 10px;
257
- min-width: 0;
258
- margin-bottom: 6px;
259
- }
260
-
244
+
245
+ .theme-dark .sps-serp {
246
+ background: #f8fafc;
247
+ }
248
+
249
+ .sps-serp.sps-mobile {
250
+ max-width: 390px;
251
+ }
252
+
253
+ .sps-url-line {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 10px;
257
+ min-width: 0;
258
+ margin-bottom: 6px;
259
+ }
260
+
261
261
  .sps-favicon {
262
262
  display: grid;
263
263
  place-items: center;
264
- width: 28px;
265
- height: 28px;
266
- flex: 0 0 auto;
267
- border-radius: 50%;
268
- background: #edf2f7;
269
- color: #5f6368;
270
- font-size: 14px;
264
+ width: 28px;
265
+ height: 28px;
266
+ flex: 0 0 auto;
267
+ border-radius: 50%;
268
+ background: #edf2f7;
269
+ color: #5f6368;
270
+ font-size: 14px;
271
271
  font-weight: 700;
272
272
  }
273
273
 
@@ -283,41 +283,41 @@
283
283
  .sps-hidden {
284
284
  display: none;
285
285
  }
286
-
287
- .sps-url-text {
288
- min-width: 0;
289
- color: #202124;
290
- font-size: 14px;
291
- line-height: 1.3;
292
- overflow: hidden;
293
- text-overflow: ellipsis;
294
- white-space: nowrap;
295
- }
296
-
297
- .sps-serp-title {
298
- margin: 0 0 4px;
299
- color: #1a0dab;
300
- font-size: 20px;
301
- line-height: 1.3;
302
- font-weight: 400;
303
- }
304
-
305
- .sps-description {
306
- margin: 0;
307
- color: #4d5156;
308
- font-size: 14px;
309
- line-height: 1.58;
310
- }
311
-
312
- .sps-measure {
313
- position: fixed;
314
- inset: auto auto -9999px -9999px;
315
- visibility: hidden;
316
- white-space: nowrap;
317
- pointer-events: none;
318
- }
319
-
320
- @media (max-width: 780px) {
286
+
287
+ .sps-url-text {
288
+ min-width: 0;
289
+ color: #202124;
290
+ font-size: 14px;
291
+ line-height: 1.3;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ white-space: nowrap;
295
+ }
296
+
297
+ .sps-serp-title {
298
+ margin: 0 0 4px;
299
+ color: #1a0dab;
300
+ font-size: 20px;
301
+ line-height: 1.3;
302
+ font-weight: 400;
303
+ }
304
+
305
+ .sps-description {
306
+ margin: 0;
307
+ color: #4d5156;
308
+ font-size: 14px;
309
+ line-height: 1.58;
310
+ }
311
+
312
+ .sps-measure {
313
+ position: fixed;
314
+ inset: auto auto -9999px -9999px;
315
+ visibility: hidden;
316
+ white-space: nowrap;
317
+ pointer-events: none;
318
+ }
319
+
320
+ @media (max-width: 780px) {
321
321
  .sps-shell {
322
322
  grid-template-columns: 1fr;
323
323
  }
@@ -120,4 +120,4 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
120
120
  },
121
121
  ],
122
122
  };
123
-
123
+
@@ -120,4 +120,4 @@ export const content: ToolLocaleContent<SvgSanitizerUI> = {
120
120
  },
121
121
  ],
122
122
  };
123
-
123
+
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { svgSanitizer } from './index';
4
- import type { KnownLocale } from '../../types';
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = 'es' } = Astro.props;
11
- const content = await svgSanitizer.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { svgSanitizer } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await svgSanitizer.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -156,4 +156,4 @@ export const content: ToolLocaleContent<SvgToCssUI> = {
156
156
  },
157
157
  ],
158
158
  };
159
-
159
+
@@ -156,4 +156,4 @@ export const content: ToolLocaleContent<SvgToCssUI> = {
156
156
  },
157
157
  ],
158
158
  };
159
-
159
+
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { svgToCss } from './index';
4
- import type { KnownLocale } from '../../types';
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = 'es' } = Astro.props;
11
- const content = await svgToCss.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { svgToCss } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await svgToCss.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -111,4 +111,4 @@ export const content: ToolLocaleContent<UrlCleanerUI> = {
111
111
  },
112
112
  ],
113
113
  };
114
-
114
+
@@ -111,4 +111,4 @@ export const content: ToolLocaleContent<UrlCleanerUI> = {
111
111
  },
112
112
  ],
113
113
  };
114
-
114
+
@@ -38,4 +38,4 @@ export const content: ToolLocaleContent<UrlCleanerUI> = {
38
38
  { type: 'list', items: [ '<strong>UTM (Google Analytics):</strong>utm_source、utm_medium、utm_campaign 用于追踪活动', '<strong>FBCLID:</strong>Facebook 点击识别符,用于绕过 Cookie 限制', '<strong>GCLID / DCLID:</strong>Google 点击 ID,用于将访问与 Google Ads 活动关联', '<strong>MSCLKID:</strong>Microsoft 广告和 Bing 点击识别符', '<strong>HubSpot & Mailchimp:</strong>营销自动化参数,如 _hsenc、mc_cid', '<strong>LinkedIn 和其他:</strong>li_fat_id 和其他社交媒体追踪器' ] },
39
39
  ],
40
40
  };
41
-
41
+
@@ -1,15 +1,15 @@
1
- ---
2
- import { SEORenderer } from '@jjlmoya/utils-shared';
3
- import { urlCleaner } from './index';
4
- import type { KnownLocale } from '../../types';
5
-
6
- interface Props {
7
- locale?: KnownLocale;
8
- }
9
-
10
- const { locale = 'es' } = Astro.props;
11
- const content = await urlCleaner.i18n[locale]?.();
12
- if (!content) return null;
13
- ---
14
-
15
- {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { urlCleaner } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await urlCleaner.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}