@jjlmoya/utils-developer 1.15.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 +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -1
- package/src/index.ts +2 -0
- package/src/tests/locale_completeness.test.ts +2 -3
- package/src/tests/pagespeed_best_practices.test.ts +198 -0
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/aspectRatio/component.astro +3 -1
- package/src/tool/colorConverter/component.astro +3 -3
- package/src/tool/llmCostCalculator/component.astro +1 -2
- package/src/tool/mobileMockupGenerator/component.astro +4 -5
- package/src/tool/placeholderGenerator/component.astro +2 -2
- package/src/tool/readabilityCalculator/component.astro +4 -4
- package/src/tool/serpPixelSimulator/bibliography.astro +7 -0
- package/src/tool/serpPixelSimulator/bibliography.ts +16 -0
- package/src/tool/serpPixelSimulator/component.astro +84 -0
- package/src/tool/serpPixelSimulator/controller.ts +323 -0
- package/src/tool/serpPixelSimulator/entry.ts +30 -0
- package/src/tool/serpPixelSimulator/i18n/de.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/en.ts +213 -0
- package/src/tool/serpPixelSimulator/i18n/es.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/id.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/it.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ja.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ko.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/nl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pl.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/pt.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/sv.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/tr.ts +214 -0
- package/src/tool/serpPixelSimulator/i18n/zh.ts +214 -0
- package/src/tool/serpPixelSimulator/index.ts +12 -0
- package/src/tool/serpPixelSimulator/logic.ts +18 -0
- package/src/tool/serpPixelSimulator/seo.astro +12 -0
- package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +335 -0
- package/src/tool/serpPixelSimulator/ui.ts +33 -0
- package/src/tools.ts +2 -2
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SerpPixelSimulatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'serp-pixel-simulator';
|
|
7
|
+
const title = 'SERP Simulator and SEO Pixel Counter';
|
|
8
|
+
const description = 'Preview Google-style search snippets in real time, measure title and meta description width by pixels, and see exactly where your copy will be trimmed.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Enter the title tag',
|
|
13
|
+
text: 'Type or paste the page title you want to test. The SERP preview and pixel meter update on every keystroke.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Add the visible URL',
|
|
17
|
+
text: 'Use a realistic domain and path so the snippet resembles the result a searcher would scan.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Write the meta description',
|
|
21
|
+
text: 'Add the description copy and watch the pixel bar. When it exceeds the recommended visual width, the preview trims it with an ellipsis.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Switch desktop and mobile',
|
|
25
|
+
text: 'Compare title rendering with a desktop or mobile card width before publishing metadata.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Why count pixels instead of characters for SEO titles?',
|
|
32
|
+
answer: 'Google search cards are constrained by visual width. A title with many narrow letters can fit more characters than a title with wide letters, uppercase words, or bold-looking glyphs. Pixel measurement gives a closer preview of the visible result.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Does this guarantee exactly how Google will truncate my snippet?',
|
|
36
|
+
answer: 'No. Google can rewrite title links and snippets, and rendering can vary by query, device, language and experiment. The tool is designed as a practical visual guardrail for writing metadata that is less likely to be cut off.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'What pixel limits does the simulator use?',
|
|
40
|
+
answer: 'The default desktop title limit is 580 px, the mobile title limit is 600 px, and the meta description guardrail is 920 px. These are writing targets, not official Google limits.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Why does the preview add an ellipsis?',
|
|
44
|
+
answer: 'When the measured text exceeds the available pixel width, the simulator trims the string at the last fitting character and appends three dots, matching the practical behavior SEO teams need to spot lost meaning.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: SerpPixelSimulatorUI = {
|
|
49
|
+
titleLabel: 'Title tag',
|
|
50
|
+
titlePlaceholder: 'GameBob | Indie Development Studio',
|
|
51
|
+
urlLabel: 'Displayed URL',
|
|
52
|
+
urlPlaceholder: 'https://www.gamebob.dev/en/',
|
|
53
|
+
descriptionLabel: 'Meta description',
|
|
54
|
+
descriptionPlaceholder: 'Discover our collection of tools and games designed to elevate your digital workflow and entertainment.',
|
|
55
|
+
deviceLabel: 'Preview mode',
|
|
56
|
+
desktopLabel: 'Desktop',
|
|
57
|
+
mobileLabel: 'Mobile',
|
|
58
|
+
titlePixelsLabel: 'Title width',
|
|
59
|
+
descriptionPixelsLabel: 'Description width',
|
|
60
|
+
charactersLabel: 'characters',
|
|
61
|
+
previewLabel: 'Live Google-style preview',
|
|
62
|
+
tooLongLabel: 'Too wide',
|
|
63
|
+
goodLabel: 'Fits',
|
|
64
|
+
emptyTitle: 'Your title will appear here',
|
|
65
|
+
emptyDescription: 'Your meta description preview will appear here as you type.',
|
|
66
|
+
defaultTitle: 'GameBob | Indie Development Studio',
|
|
67
|
+
defaultUrl: 'https://www.gamebob.dev/en/',
|
|
68
|
+
defaultDescription: 'Discover our collection of tools and games designed to elevate your digital workflow and entertainment.',
|
|
69
|
+
fallbackUrl: 'example.com',
|
|
70
|
+
fallbackFaviconText: 'G',
|
|
71
|
+
pixelUnit: 'px',
|
|
72
|
+
ellipsis: '...',
|
|
73
|
+
fetchButtonLabel: 'Fetch',
|
|
74
|
+
fetchLoadingLabel: 'Fetching...',
|
|
75
|
+
fetchSuccessLabel: 'Metadata loaded from the URL.',
|
|
76
|
+
fetchCorsError: 'The browser could not read this page. It may be blocked by CORS, a redirect, mixed content or a network rule. You can still paste or edit the metadata manually.',
|
|
77
|
+
fetchInvalidUrlError: 'Enter a valid URL before fetching metadata.',
|
|
78
|
+
fetchNoMetadataError: 'The page was fetched, but no title or meta description was found.',
|
|
79
|
+
fetchGenericError: 'Metadata could not be fetched from this URL. Check the address or paste the fields manually.',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
83
|
+
'@context': 'https://schema.org',
|
|
84
|
+
'@type': 'FAQPage',
|
|
85
|
+
mainEntity: faq.map((item) => ({
|
|
86
|
+
'@type': 'Question',
|
|
87
|
+
name: item.question,
|
|
88
|
+
acceptedAnswer: {
|
|
89
|
+
'@type': 'Answer',
|
|
90
|
+
text: item.answer,
|
|
91
|
+
},
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const howToSchema: WithContext<HowTo> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'HowTo',
|
|
98
|
+
name: title,
|
|
99
|
+
description,
|
|
100
|
+
step: howTo.map((step, index) => ({
|
|
101
|
+
'@type': 'HowToStep',
|
|
102
|
+
position: index + 1,
|
|
103
|
+
name: step.name,
|
|
104
|
+
text: step.text,
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
109
|
+
'@context': 'https://schema.org',
|
|
110
|
+
'@type': 'SoftwareApplication',
|
|
111
|
+
name: title,
|
|
112
|
+
description,
|
|
113
|
+
applicationCategory: 'BusinessApplication',
|
|
114
|
+
operatingSystem: 'Any',
|
|
115
|
+
offers: {
|
|
116
|
+
'@type': 'Offer',
|
|
117
|
+
price: '0',
|
|
118
|
+
priceCurrency: 'EUR',
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
|
|
123
|
+
slug,
|
|
124
|
+
title,
|
|
125
|
+
description,
|
|
126
|
+
ui,
|
|
127
|
+
faqTitle: 'SERP simulator FAQ',
|
|
128
|
+
faq,
|
|
129
|
+
bibliographyTitle: 'Search result documentation',
|
|
130
|
+
bibliography,
|
|
131
|
+
howTo,
|
|
132
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
133
|
+
seo: [
|
|
134
|
+
{
|
|
135
|
+
type: 'title',
|
|
136
|
+
text: 'Stop guessing how your Google result will look',
|
|
137
|
+
level: 2,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
type: 'paragraph',
|
|
141
|
+
html: 'A title tag can look perfect in a spreadsheet and still break in the search result. Google does not reserve space by character count; it renders text inside a visual card. That means <strong>GameBob | Indie Development Studio</strong> and another title with the same number of characters can occupy very different widths depending on the letters, casing, punctuation and spacing.',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'tip',
|
|
145
|
+
title: 'The rule that actually helps',
|
|
146
|
+
html: 'Write the snippet so the important promise survives the ellipsis. Put the page type, the search intent and the strongest reason to click before the pixel limit. Brand names are useful, but they should not push the main benefit out of view.',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'title',
|
|
150
|
+
text: 'What the pixel counter is measuring',
|
|
151
|
+
level: 3,
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
type: 'table',
|
|
155
|
+
headers: ['Element', 'What matters', 'How to use the result'],
|
|
156
|
+
rows: [
|
|
157
|
+
['Title tag', 'Rendered width in pixels, not raw character count', 'Keep the primary keyword and click promise visible before truncation.'],
|
|
158
|
+
['Displayed URL', 'Visual trust and topic clarity', 'Use a readable path that reinforces where the result leads.'],
|
|
159
|
+
['Meta description', 'A wider snippet area with query-dependent behavior', 'Front-load the benefit because Google may shorten or rewrite it.'],
|
|
160
|
+
['Device mode', 'Desktop and mobile cards can feel different', 'Check both before shipping metadata for important pages.'],
|
|
161
|
+
],
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'title',
|
|
165
|
+
text: 'Why character limits are a weak SEO habit',
|
|
166
|
+
level: 3,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'paragraph',
|
|
170
|
+
html: 'Traditional advice such as "keep titles under 60 characters" is convenient, but it hides the real problem. Wide letters like W and M, uppercase words, separators, numbers and long brand names all consume different space. Pixel measurement makes the trade-off visible immediately: you can see whether a phrase earns its place or steals room from a stronger message.',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
type: 'title',
|
|
174
|
+
text: 'A practical workflow for better snippets',
|
|
175
|
+
level: 3,
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
type: 'list',
|
|
179
|
+
items: [
|
|
180
|
+
'<strong>Start with intent:</strong> describe what the user gets, not just what the page is called.',
|
|
181
|
+
'<strong>Test the full title:</strong> paste it into the simulator and watch the bar before publishing.',
|
|
182
|
+
'<strong>Move weak words out:</strong> if the bar turns red, remove filler before cutting valuable terms.',
|
|
183
|
+
'<strong>Check the ellipsis:</strong> if the truncated preview loses meaning, rewrite the title instead of accepting the cut.',
|
|
184
|
+
'<strong>Repeat for the description:</strong> make sure the first sentence carries the value proposition on its own.',
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: 'diagnostic',
|
|
189
|
+
variant: 'info',
|
|
190
|
+
title: 'When the bar turns red',
|
|
191
|
+
html: 'A red bar is not a penalty warning. It means the current text is wider than the selected visual target, so the simulator trims it with dots. Treat that as an editorial signal: decide whether the hidden words are disposable, or whether the snippet needs a sharper structure.',
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
type: 'title',
|
|
195
|
+
text: 'Limits, rewrites and real-world expectations',
|
|
196
|
+
level: 3,
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
type: 'paragraph',
|
|
200
|
+
html: 'No simulator can guarantee the exact snippet Google will show. Google may rewrite title links, bold query terms, choose page text instead of the meta description, or display different snippets for different searches. This tool is best used as a fast writing and QA step: it catches obvious visual overflow before the page reaches production.',
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'summary',
|
|
204
|
+
title: 'Best use of this SERP simulator',
|
|
205
|
+
items: [
|
|
206
|
+
'Use the pixel bar to catch visual overflow before publishing metadata.',
|
|
207
|
+
'Keep the main search intent and click promise visible before any ellipsis.',
|
|
208
|
+
'Fetch metadata from URLs that allow CORS, then edit the result manually when needed.',
|
|
209
|
+
'Treat the preview as a writing guardrail, because Google can still rewrite snippets per query.',
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SerpPixelSimulatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'simulador-serp-contador-pixeles';
|
|
7
|
+
const title = 'Simulador SERP y Contador de Píxeles SEO';
|
|
8
|
+
const description = 'Previsualiza fragmentos de búsqueda estilo Google en tiempo real, mide la anchura en píxeles del título y la meta descripción, y ve exactamente dónde se truncará tu texto.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Introduce la etiqueta title',
|
|
13
|
+
text: 'Escribe o pega el título de página que quieres probar. La vista previa SERP y el medidor de píxeles se actualizan con cada pulsación.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Añade la URL visible',
|
|
17
|
+
text: 'Usa un dominio y ruta realistas para que el fragmento se parezca al resultado que un buscador analizaría.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Escribe la meta descripción',
|
|
21
|
+
text: 'Añade el texto de la descripción y observa la barra de píxeles. Cuando supera el ancho visual recomendado, la vista previa la trunca con puntos suspensivos.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Alterna entre escritorio y móvil',
|
|
25
|
+
text: 'Compara la representación del título con el ancho de tarjeta de escritorio o móvil antes de publicar los metadatos.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: '¿Por qué contar píxeles en vez de caracteres para los títulos SEO?',
|
|
32
|
+
answer: 'Las tarjetas de resultados de Google están limitadas por el ancho visual. Un título con muchas letras estrechas puede albergar más caracteres que uno con letras anchas, mayúsculas o glifos de aspecto grueso. La medición en píxeles ofrece una vista previa más fiel del resultado visible.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: '¿Garantiza esto exactamente cómo truncará Google mi fragmento?',
|
|
36
|
+
answer: 'No. Google puede reescribir los enlaces de título y los fragmentos, y la representación puede variar según la consulta, el dispositivo, el idioma y los experimentos. La herramienta está diseñada como una guía visual práctica para redactar metadatos con menos probabilidades de ser cortados.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: '¿Qué límites de píxeles usa el simulador?',
|
|
40
|
+
answer: 'El límite predeterminado del título en escritorio es de 580 px, el del título en móvil es de 600 px y el de la meta descripción es de 920 px. Son objetivos de redacción, no límites oficiales de Google.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: '¿Por qué la vista previa añade puntos suspensivos?',
|
|
44
|
+
answer: 'Cuando el texto medido supera el ancho de píxeles disponible, el simulador trunca la cadena en el último carácter que cabe y añade tres puntos, imitando el comportamiento práctico que los equipos SEO necesitan para detectar pérdida de significado.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: SerpPixelSimulatorUI = {
|
|
49
|
+
titleLabel: 'Etiqueta title',
|
|
50
|
+
titlePlaceholder: 'GameBob | Estudio de Desarrollo Indie',
|
|
51
|
+
urlLabel: 'URL visible',
|
|
52
|
+
urlPlaceholder: 'https://www.gamebob.dev/es/',
|
|
53
|
+
descriptionLabel: 'Meta descripción',
|
|
54
|
+
descriptionPlaceholder: 'Descubre nuestra colección de herramientas y juegos diseñados para elevar tu flujo de trabajo digital y entretenimiento.',
|
|
55
|
+
deviceLabel: 'Modo de vista previa',
|
|
56
|
+
desktopLabel: 'Escritorio',
|
|
57
|
+
mobileLabel: 'Móvil',
|
|
58
|
+
titlePixelsLabel: 'Ancho del título',
|
|
59
|
+
descriptionPixelsLabel: 'Ancho de la descripción',
|
|
60
|
+
charactersLabel: 'caracteres',
|
|
61
|
+
previewLabel: 'Vista previa estilo Google',
|
|
62
|
+
tooLongLabel: 'Demasiado ancho',
|
|
63
|
+
goodLabel: 'Correcto',
|
|
64
|
+
emptyTitle: 'Tu título aparecerá aquí',
|
|
65
|
+
emptyDescription: 'La vista previa de tu meta descripción aparecerá aquí mientras escribes.',
|
|
66
|
+
defaultTitle: 'GameBob | Estudio de Desarrollo Indie',
|
|
67
|
+
defaultUrl: 'https://www.gamebob.dev/es/',
|
|
68
|
+
defaultDescription: 'Descubre nuestra colección de herramientas y juegos diseñados para elevar tu flujo de trabajo digital y entretenimiento.',
|
|
69
|
+
fallbackUrl: 'ejemplo.com',
|
|
70
|
+
fallbackFaviconText: 'G',
|
|
71
|
+
pixelUnit: 'px',
|
|
72
|
+
ellipsis: '...',
|
|
73
|
+
fetchButtonLabel: 'Obtener',
|
|
74
|
+
fetchLoadingLabel: 'Obteniendo...',
|
|
75
|
+
fetchSuccessLabel: 'Metadatos cargados desde la URL.',
|
|
76
|
+
fetchCorsError: 'El navegador no pudo leer esta página. Puede estar bloqueada por CORS, una redirección, contenido mixto o una regla de red. Puedes pegar o editar los metadatos manualmente.',
|
|
77
|
+
fetchInvalidUrlError: 'Introduce una URL válida antes de obtener los metadatos.',
|
|
78
|
+
fetchNoMetadataError: 'La página se obtuvo, pero no se encontró título ni meta descripción.',
|
|
79
|
+
fetchGenericError: 'No se pudieron obtener los metadatos de esta URL. Comprueba la dirección o completa los campos manualmente.',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
83
|
+
'@context': 'https://schema.org',
|
|
84
|
+
'@type': 'FAQPage',
|
|
85
|
+
mainEntity: faq.map((item) => ({
|
|
86
|
+
'@type': 'Question',
|
|
87
|
+
name: item.question,
|
|
88
|
+
acceptedAnswer: {
|
|
89
|
+
'@type': 'Answer',
|
|
90
|
+
text: item.answer,
|
|
91
|
+
},
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const howToSchema: WithContext<HowTo> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'HowTo',
|
|
98
|
+
name: title,
|
|
99
|
+
description,
|
|
100
|
+
step: howTo.map((step, index) => ({
|
|
101
|
+
'@type': 'HowToStep',
|
|
102
|
+
position: index + 1,
|
|
103
|
+
name: step.name,
|
|
104
|
+
text: step.text,
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
109
|
+
'@context': 'https://schema.org',
|
|
110
|
+
'@type': 'SoftwareApplication',
|
|
111
|
+
name: title,
|
|
112
|
+
description,
|
|
113
|
+
applicationCategory: 'BusinessApplication',
|
|
114
|
+
operatingSystem: 'Any',
|
|
115
|
+
offers: {
|
|
116
|
+
'@type': 'Offer',
|
|
117
|
+
price: '0',
|
|
118
|
+
priceCurrency: 'EUR',
|
|
119
|
+
},
|
|
120
|
+
inLanguage: 'es',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
|
|
124
|
+
slug,
|
|
125
|
+
title,
|
|
126
|
+
description,
|
|
127
|
+
ui,
|
|
128
|
+
faqTitle: 'Preguntas frecuentes sobre el simulador SERP',
|
|
129
|
+
faq,
|
|
130
|
+
bibliographyTitle: 'Documentación sobre resultados de búsqueda',
|
|
131
|
+
bibliography,
|
|
132
|
+
howTo,
|
|
133
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
134
|
+
seo: [
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: 'Deja de adivinar cómo se verá tu resultado en Google',
|
|
138
|
+
level: 2,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: 'Un title tag puede parecer perfecto en una hoja de cálculo y aun así fallar en el resultado de búsqueda. Google no reserva espacio por número de caracteres; renderiza el texto dentro de una tarjeta visual. Eso significa que <strong>GameBob | Estudio de Desarrollo Indie</strong> y otro título con la misma cantidad de caracteres pueden ocupar anchos muy diferentes según las letras, mayúsculas, puntuación y espaciado.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'tip',
|
|
146
|
+
title: 'La regla que realmente ayuda',
|
|
147
|
+
html: 'Escribe el fragmento para que la promesa importante sobreviva a los puntos suspensivos. Pon el tipo de página, la intención de búsqueda y la razón más fuerte para hacer clic antes del límite de píxeles. Los nombres de marca son útiles, pero no deben desplazar el beneficio principal fuera de la vista.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'title',
|
|
151
|
+
text: 'Qué mide el contador de píxeles',
|
|
152
|
+
level: 3,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'table',
|
|
156
|
+
headers: ['Elemento', 'Qué importa', 'Cómo usar el resultado'],
|
|
157
|
+
rows: [
|
|
158
|
+
['Etiqueta title', 'Ancho renderizado en píxeles, no el número de caracteres', 'Mantén la palabra clave principal y la promesa de clic visibles antes del truncamiento.'],
|
|
159
|
+
['URL visible', 'Confianza visual y claridad del tema', 'Usa una ruta legible que refuerce hacia dónde lleva el resultado.'],
|
|
160
|
+
['Meta descripción', 'Un área de fragmento más amplia con comportamiento dependiente de la consulta', 'Pon el beneficio al principio porque Google puede acortarla o reescribirla.'],
|
|
161
|
+
['Modo dispositivo', 'Las tarjetas de escritorio y móvil pueden sentirse diferentes', 'Revisa ambas antes de publicar metadatos de páginas importantes.'],
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'title',
|
|
166
|
+
text: 'Por qué los límites de caracteres son un mal hábito SEO',
|
|
167
|
+
level: 3,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'paragraph',
|
|
171
|
+
html: 'El consejo tradicional de "mantén los títulos por debajo de 60 caracteres" es cómodo, pero oculta el problema real. Letras anchas como la W y la M, palabras en mayúsculas, separadores, números y nombres de marca largos consumen espacios diferentes. La medición en píxeles hace visible el compromiso de inmediato: puedes ver si una frase se gana su sitio o le roba espacio a un mensaje más fuerte.',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'title',
|
|
175
|
+
text: 'Un flujo de trabajo práctico para mejores fragmentos',
|
|
176
|
+
level: 3,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'list',
|
|
180
|
+
items: [
|
|
181
|
+
'<strong>Empieza por la intención:</strong> describe lo que obtiene el usuario, no solo cómo se llama la página.',
|
|
182
|
+
'<strong>Prueba el título completo:</strong> pégalo en el simulador y observa la barra antes de publicar.',
|
|
183
|
+
'<strong>Quita las palabras débiles:</strong> si la barra se vuelve roja, elimina relleno antes de recortar términos valiosos.',
|
|
184
|
+
'<strong>Revisa los puntos suspensivos:</strong> si la vista previa truncada pierde sentido, reescribe el título en vez de aceptar el corte.',
|
|
185
|
+
'<strong>Repite para la descripción:</strong> asegúrate de que la primera frase transmita la propuesta de valor por sí sola.',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'diagnostic',
|
|
190
|
+
variant: 'info',
|
|
191
|
+
title: 'Cuando la barra se vuelve roja',
|
|
192
|
+
html: 'Una barra roja no es un aviso de penalización. Significa que el texto actual es más ancho que el objetivo visual seleccionado, por lo que el simulador lo trunca con puntos. Trátalo como una señal editorial: decide si las palabras ocultas son prescindibles o si el fragmento necesita una estructura más afilada.',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'title',
|
|
196
|
+
text: 'Límites, reescrituras y expectativas realistas',
|
|
197
|
+
level: 3,
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'paragraph',
|
|
201
|
+
html: 'Ningún simulador puede garantizar el fragmento exacto que Google mostrará. Google puede reescribir los enlaces de título, poner en negrita los términos de la consulta, elegir texto de la página en lugar de la meta descripción o mostrar fragmentos distintos para diferentes búsquedas. Esta herramienta funciona mejor como un paso rápido de redacción y control de calidad: detecta desbordamientos visuales evidentes antes de que la página llegue a producción.',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: 'summary',
|
|
205
|
+
title: 'Mejor uso de este simulador SERP',
|
|
206
|
+
items: [
|
|
207
|
+
'Usa la barra de píxeles para detectar desbordamientos visuales antes de publicar metadatos.',
|
|
208
|
+
'Mantén la intención de búsqueda principal y la promesa de clic visibles antes de cualquier elipsis.',
|
|
209
|
+
'Obtén metadatos de URLs que permitan CORS y edita el resultado manualmente cuando sea necesario.',
|
|
210
|
+
'Considera la vista previa como una guía de redacción, ya que Google puede reescribir fragmentos según la consulta.',
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SerpPixelSimulatorUI } from '../ui';
|
|
4
|
+
import { bibliography } from '../bibliography';
|
|
5
|
+
|
|
6
|
+
const slug = 'simulateur-serp-compteur-pixels';
|
|
7
|
+
const title = 'Simulateur SERP et Compteur de Pixels SEO';
|
|
8
|
+
const description = 'Prévisualisez des extraits de recherche façon Google en temps réel, mesurez la largeur en pixels du titre et de la meta description, et voyez exactement où votre texte sera tronqué.';
|
|
9
|
+
|
|
10
|
+
const howTo = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Saisissez la balise title',
|
|
13
|
+
text: 'Tapez ou collez le titre de page que vous souhaitez tester. L\'aperçu SERP et le compteur de pixels se mettent à jour à chaque frappe.',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'Ajoutez l\'URL visible',
|
|
17
|
+
text: 'Utilisez un domaine et un chemin réalistes pour que l\'extrait ressemble au résultat qu\'un internaute analyserait.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'Rédigez la meta description',
|
|
21
|
+
text: 'Ajoutez le texte de la description et surveillez la barre de pixels. Lorsqu\'elle dépasse la largeur visuelle recommandée, l\'aperçu la tronque avec des points de suspension.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Alternez entre bureau et mobile',
|
|
25
|
+
text: 'Comparez le rendu du titre avec la largeur de carte bureau ou mobile avant de publier les métadonnées.',
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const faq = [
|
|
30
|
+
{
|
|
31
|
+
question: 'Pourquoi compter les pixels plutôt que les caractères pour les titres SEO ?',
|
|
32
|
+
answer: 'Les fiches de résultats Google sont limitées par la largeur visuelle. Un titre composé de nombreuses lettres étroites peut contenir plus de caractères qu\'un titre avec des lettres larges, des majuscules ou des glyphes épais. La mesure en pixels donne un aperçu plus fidèle du résultat visible.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
question: 'Cela garantit-il exactement la façon dont Google tronquera mon extrait ?',
|
|
36
|
+
answer: 'Non. Google peut réécrire les liens de titre et les extraits, et le rendu peut varier selon la requête, l\'appareil, la langue et les expérimentations. L\'outil est conçu comme un garde-fou visuel pratique pour rédiger des métadonnées moins susceptibles d\'être coupées.',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
question: 'Quelles limites de pixels le simulateur utilise-t-il ?',
|
|
40
|
+
answer: 'La limite par défaut du titre sur bureau est de 580 px, celle du titre sur mobile est de 600 px, et celle de la meta description est de 920 px. Ce sont des objectifs de rédaction, pas des limites officielles de Google.',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
question: 'Pourquoi l\'aperçu ajoute-t-il des points de suspension ?',
|
|
44
|
+
answer: 'Lorsque le texte mesuré dépasse la largeur en pixels disponible, le simulateur tronque la chaîne au dernier caractère qui tient et ajoute trois points, reproduisant le comportement pratique dont les équipes SEO ont besoin pour repérer une perte de sens.',
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const ui: SerpPixelSimulatorUI = {
|
|
49
|
+
titleLabel: 'Balise title',
|
|
50
|
+
titlePlaceholder: 'GameBob | Studio de Développement Indépendant',
|
|
51
|
+
urlLabel: 'URL visible',
|
|
52
|
+
urlPlaceholder: 'https://www.gamebob.dev/fr/',
|
|
53
|
+
descriptionLabel: 'Meta description',
|
|
54
|
+
descriptionPlaceholder: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
55
|
+
deviceLabel: 'Mode d\'aperçu',
|
|
56
|
+
desktopLabel: 'Bureau',
|
|
57
|
+
mobileLabel: 'Mobile',
|
|
58
|
+
titlePixelsLabel: 'Largeur du titre',
|
|
59
|
+
descriptionPixelsLabel: 'Largeur de la description',
|
|
60
|
+
charactersLabel: 'caractères',
|
|
61
|
+
previewLabel: 'Aperçu en direct style Google',
|
|
62
|
+
tooLongLabel: 'Trop large',
|
|
63
|
+
goodLabel: 'Correct',
|
|
64
|
+
emptyTitle: 'Votre titre apparaîtra ici',
|
|
65
|
+
emptyDescription: 'L\'aperçu de votre meta description apparaîtra ici au fur et à mesure que vous tapez.',
|
|
66
|
+
defaultTitle: 'GameBob | Studio de Développement Indépendant',
|
|
67
|
+
defaultUrl: 'https://www.gamebob.dev/fr/',
|
|
68
|
+
defaultDescription: 'Découvrez notre collection d\'outils et de jeux conçus pour enrichir votre flux de travail numérique et vos loisirs.',
|
|
69
|
+
fallbackUrl: 'exemple.com',
|
|
70
|
+
fallbackFaviconText: 'G',
|
|
71
|
+
pixelUnit: 'px',
|
|
72
|
+
ellipsis: '...',
|
|
73
|
+
fetchButtonLabel: 'Récupérer',
|
|
74
|
+
fetchLoadingLabel: 'Récupération...',
|
|
75
|
+
fetchSuccessLabel: 'Métadonnées chargées depuis l\'URL.',
|
|
76
|
+
fetchCorsError: 'Le navigateur n\'a pas pu lire cette page. Elle peut être bloquée par CORS, une redirection, du contenu mixte ou une règle réseau. Vous pouvez toujours coller ou modifier les métadonnées manuellement.',
|
|
77
|
+
fetchInvalidUrlError: 'Saisissez une URL valide avant de récupérer les métadonnées.',
|
|
78
|
+
fetchNoMetadataError: 'La page a été récupérée, mais aucun titre ni meta description n\'a été trouvé.',
|
|
79
|
+
fetchGenericError: 'Les métadonnées n\'ont pas pu être récupérées depuis cette URL. Vérifiez l\'adresse ou remplissez les champs manuellement.',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
83
|
+
'@context': 'https://schema.org',
|
|
84
|
+
'@type': 'FAQPage',
|
|
85
|
+
mainEntity: faq.map((item) => ({
|
|
86
|
+
'@type': 'Question',
|
|
87
|
+
name: item.question,
|
|
88
|
+
acceptedAnswer: {
|
|
89
|
+
'@type': 'Answer',
|
|
90
|
+
text: item.answer,
|
|
91
|
+
},
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const howToSchema: WithContext<HowTo> = {
|
|
96
|
+
'@context': 'https://schema.org',
|
|
97
|
+
'@type': 'HowTo',
|
|
98
|
+
name: title,
|
|
99
|
+
description,
|
|
100
|
+
step: howTo.map((step, index) => ({
|
|
101
|
+
'@type': 'HowToStep',
|
|
102
|
+
position: index + 1,
|
|
103
|
+
name: step.name,
|
|
104
|
+
text: step.text,
|
|
105
|
+
})),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
109
|
+
'@context': 'https://schema.org',
|
|
110
|
+
'@type': 'SoftwareApplication',
|
|
111
|
+
name: title,
|
|
112
|
+
description,
|
|
113
|
+
applicationCategory: 'BusinessApplication',
|
|
114
|
+
operatingSystem: 'Any',
|
|
115
|
+
offers: {
|
|
116
|
+
'@type': 'Offer',
|
|
117
|
+
price: '0',
|
|
118
|
+
priceCurrency: 'EUR',
|
|
119
|
+
},
|
|
120
|
+
inLanguage: 'fr',
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
|
|
124
|
+
slug,
|
|
125
|
+
title,
|
|
126
|
+
description,
|
|
127
|
+
ui,
|
|
128
|
+
faqTitle: 'FAQ du simulateur SERP',
|
|
129
|
+
faq,
|
|
130
|
+
bibliographyTitle: 'Documentation sur les résultats de recherche',
|
|
131
|
+
bibliography,
|
|
132
|
+
howTo,
|
|
133
|
+
schemas: [appSchema, faqSchema, howToSchema],
|
|
134
|
+
seo: [
|
|
135
|
+
{
|
|
136
|
+
type: 'title',
|
|
137
|
+
text: 'Arrêtez de deviner à quoi ressemblera votre résultat Google',
|
|
138
|
+
level: 2,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
type: 'paragraph',
|
|
142
|
+
html: 'Une balise title peut sembler parfaite dans un tableur et pourtant échouer dans le résultat de recherche. Google ne réserve pas d\'espace par nombre de caractères ; il rend le texte à l\'intérieur d\'une carte visuelle. Cela signifie que <strong>GameBob | Studio de Développement Indépendant</strong> et un autre titre avec le même nombre de caractères peuvent occuper des largeurs très différentes selon les lettres, les majuscules, la ponctuation et l\'espacement.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: 'tip',
|
|
146
|
+
title: 'La règle qui aide vraiment',
|
|
147
|
+
html: 'Rédigez l\'extrait pour que la promesse importante survive aux points de suspension. Placez le type de page, l\'intention de recherche et la raison la plus forte de cliquer avant la limite de pixels. Les noms de marque sont utiles, mais ils ne doivent pas repousser le bénéfice principal hors de vue.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
type: 'title',
|
|
151
|
+
text: 'Ce que mesure le compteur de pixels',
|
|
152
|
+
level: 3,
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'table',
|
|
156
|
+
headers: ['Élément', 'Ce qui compte', 'Comment utiliser le résultat'],
|
|
157
|
+
rows: [
|
|
158
|
+
['Balise title', 'Largeur rendue en pixels, pas le nombre brut de caractères', 'Gardez le mot-clé principal et la promesse de clic visibles avant la troncature.'],
|
|
159
|
+
['URL visible', 'Confiance visuelle et clarté du sujet', 'Utilisez un chemin lisible qui renforce la destination du résultat.'],
|
|
160
|
+
['Meta description', 'Une zone d\'extrait plus large avec un comportement dépendant de la requête', 'Placez le bénéfice en premier car Google peut la raccourcir ou la réécrire.'],
|
|
161
|
+
['Mode appareil', 'Les cartes bureau et mobile peuvent sembler différentes', 'Vérifiez les deux avant de publier les métadonnées des pages importantes.'],
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'title',
|
|
166
|
+
text: 'Pourquoi les limites de caractères sont une mauvaise habitude SEO',
|
|
167
|
+
level: 3,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'paragraph',
|
|
171
|
+
html: 'Le conseil traditionnel "gardez les titres sous 60 caractères" est pratique, mais il masque le vrai problème. Les lettres larges comme le W et le M, les mots en majuscules, les séparateurs, les chiffres et les longs noms de marque consomment tous un espace différent. La mesure en pixels rend le compromis visible immédiatement: vous pouvez voir si une phrase mérite sa place ou vole de l\'espace à un message plus fort.',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
type: 'title',
|
|
175
|
+
text: 'Un flux de travail pratique pour de meilleurs extraits',
|
|
176
|
+
level: 3,
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'list',
|
|
180
|
+
items: [
|
|
181
|
+
'<strong>Commencez par l\'intention :</strong> décrivez ce que l\'utilisateur obtient, pas seulement comment la page s\'appelle.',
|
|
182
|
+
'<strong>Testez le titre complet :</strong> collez-le dans le simulateur et surveillez la barre avant de publier.',
|
|
183
|
+
'<strong>Supprimez les mots faibles :</strong> si la barre devient rouge, retirez le remplissage avant de couper des termes précieux.',
|
|
184
|
+
'<strong>Vérifiez les points de suspension :</strong> si l\'aperçu tronqué perd son sens, réécrivez le titre au lieu d\'accepter la coupure.',
|
|
185
|
+
'<strong>Répétez pour la description :</strong> assurez-vous que la première phrase porte la proposition de valeur à elle seule.',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'diagnostic',
|
|
190
|
+
variant: 'info',
|
|
191
|
+
title: 'Quand la barre devient rouge',
|
|
192
|
+
html: 'Une barre rouge n\'est pas un avertissement de pénalité. Cela signifie que le texte actuel est plus large que la cible visuelle sélectionnée, donc le simulateur le tronque avec des points. Considérez cela comme un signal éditorial: décidez si les mots cachés sont jetables ou si l\'extrait a besoin d\'une structure plus affûtée.',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'title',
|
|
196
|
+
text: 'Limites, réécritures et attentes réalistes',
|
|
197
|
+
level: 3,
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'paragraph',
|
|
201
|
+
html: 'Aucun simulateur ne peut garantir l\'extrait exact que Google affichera. Google peut réécrire les liens de titre, mettre en gras les termes de la requête, choisir le texte de la page au lieu de la meta description, ou afficher des extraits différents pour différentes recherches. Cet outil est plus efficace comme étape rapide de rédaction et de contrôle qualité: il détecte les débordements visuels évidents avant que la page n\'arrive en production.',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: 'summary',
|
|
205
|
+
title: 'Meilleure utilisation de ce simulateur SERP',
|
|
206
|
+
items: [
|
|
207
|
+
'Utilisez la barre de pixels pour détecter les débordements visuels avant de publier les métadonnées.',
|
|
208
|
+
'Gardez l\'intention de recherche principale et la promesse de clic visibles avant toute ellipse.',
|
|
209
|
+
'Récupérez les métadonnées des URL qui autorisent le CORS, puis modifiez le résultat manuellement si nécessaire.',
|
|
210
|
+
'Considérez l\'aperçu comme un guide de rédaction, car Google peut encore réécrire les extraits selon la requête.',
|
|
211
|
+
],
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|