@jjlmoya/utils-developer 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +1 -1
  3. package/src/category/i18n/ru.ts +1 -1
  4. package/src/category/index.ts +2 -1
  5. package/src/entries.ts +4 -1
  6. package/src/index.ts +2 -0
  7. package/src/layouts/PreviewLayout.astro +1 -0
  8. package/src/pages/[locale]/[slug].astro +29 -12
  9. package/src/tests/diacritics_density.test.ts +118 -0
  10. package/src/tests/inverted_punctuation.test.ts +113 -0
  11. package/src/tests/locale_completeness.test.ts +2 -3
  12. package/src/tests/no_en_dash.test.ts +73 -0
  13. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  14. package/src/tests/script_density.test.ts +94 -0
  15. package/src/tests/shared-test-helpers.ts +56 -0
  16. package/src/tests/tool_exports.test.ts +34 -0
  17. package/src/tests/tool_validation.test.ts +2 -2
  18. package/src/tool/aspectRatio/component.astro +3 -1
  19. package/src/tool/aspectRatio/i18n/de.ts +1 -1
  20. package/src/tool/aspectRatio/i18n/fr.ts +1 -1
  21. package/src/tool/aspectRatio/i18n/pl.ts +2 -2
  22. package/src/tool/aspectRatio/i18n/ru.ts +4 -4
  23. package/src/tool/aspectRatio/i18n/zh.ts +1 -1
  24. package/src/tool/aspectRatio/seo.astro +2 -1
  25. package/src/tool/calculadoraTiempoDatos/i18n/de.ts +1 -1
  26. package/src/tool/calculadoraTiempoDatos/i18n/pl.ts +1 -1
  27. package/src/tool/calculadoraTiempoDatos/i18n/ru.ts +5 -5
  28. package/src/tool/calculadoraTiempoDatos/i18n/sv.ts +5 -5
  29. package/src/tool/calculadoraTiempoDatos/i18n/zh.ts +1 -1
  30. package/src/tool/calculadoraTiempoDatos/seo.astro +2 -1
  31. package/src/tool/colorConverter/component.astro +3 -3
  32. package/src/tool/colorConverter/i18n/de.ts +1 -1
  33. package/src/tool/colorConverter/i18n/ru.ts +2 -2
  34. package/src/tool/colorConverter/seo.astro +2 -1
  35. package/src/tool/conversorExcelCsvHtml/i18n/es.ts +1 -1
  36. package/src/tool/conversorExcelCsvHtml/i18n/pl.ts +1 -1
  37. package/src/tool/conversorExcelCsvHtml/i18n/ru.ts +2 -2
  38. package/src/tool/conversorExcelCsvHtml/i18n/zh.ts +2 -2
  39. package/src/tool/conversorExcelCsvHtml/seo.astro +2 -1
  40. package/src/tool/cronGenerator/i18n/de.ts +4 -4
  41. package/src/tool/cronGenerator/i18n/en.ts +1 -1
  42. package/src/tool/cronGenerator/i18n/es.ts +2 -2
  43. package/src/tool/cronGenerator/i18n/fr.ts +5 -5
  44. package/src/tool/cronGenerator/i18n/id.ts +1 -1
  45. package/src/tool/cronGenerator/i18n/nl.ts +1 -1
  46. package/src/tool/cronGenerator/i18n/pl.ts +8 -8
  47. package/src/tool/cronGenerator/i18n/pt.ts +1 -1
  48. package/src/tool/cronGenerator/i18n/ru.ts +9 -9
  49. package/src/tool/cronGenerator/i18n/sv.ts +1 -1
  50. package/src/tool/cronGenerator/i18n/zh.ts +3 -3
  51. package/src/tool/cronGenerator/seo.astro +2 -1
  52. package/src/tool/cssSpecificityCalculator/i18n/de.ts +1 -1
  53. package/src/tool/cssSpecificityCalculator/i18n/fr.ts +3 -3
  54. package/src/tool/cssSpecificityCalculator/i18n/pl.ts +2 -2
  55. package/src/tool/cssSpecificityCalculator/i18n/ru.ts +2 -2
  56. package/src/tool/cssSpecificityCalculator/seo.astro +2 -1
  57. package/src/tool/cssToInlineConverter/i18n/de.ts +6 -6
  58. package/src/tool/cssToInlineConverter/i18n/es.ts +1 -1
  59. package/src/tool/cssToInlineConverter/i18n/fr.ts +3 -3
  60. package/src/tool/cssToInlineConverter/seo.astro +2 -1
  61. package/src/tool/duplicateCssRemover/i18n/de.ts +7 -7
  62. package/src/tool/duplicateCssRemover/i18n/fr.ts +1 -1
  63. package/src/tool/duplicateCssRemover/i18n/id.ts +1 -1
  64. package/src/tool/duplicateCssRemover/i18n/nl.ts +1 -1
  65. package/src/tool/duplicateCssRemover/i18n/pl.ts +1 -1
  66. package/src/tool/duplicateCssRemover/i18n/pt.ts +1 -1
  67. package/src/tool/duplicateCssRemover/i18n/ru.ts +3 -3
  68. package/src/tool/duplicateCssRemover/i18n/sv.ts +1 -1
  69. package/src/tool/duplicateCssRemover/seo.astro +2 -1
  70. package/src/tool/generadorSecurityTxt/i18n/de.ts +5 -5
  71. package/src/tool/generadorSecurityTxt/i18n/ru.ts +2 -2
  72. package/src/tool/generadorSecurityTxt/seo.astro +2 -1
  73. package/src/tool/hashGenerator/i18n/ru.ts +5 -5
  74. package/src/tool/hashGenerator/i18n/zh.ts +2 -2
  75. package/src/tool/hashGenerator/seo.astro +2 -1
  76. package/src/tool/inspectorCertificadosSsl/i18n/de.ts +6 -6
  77. package/src/tool/inspectorCertificadosSsl/i18n/ru.ts +5 -5
  78. package/src/tool/inspectorCertificadosSsl/seo.astro +2 -1
  79. package/src/tool/jsonFormatter/i18n/de.ts +4 -4
  80. package/src/tool/jsonFormatter/i18n/en.ts +4 -4
  81. package/src/tool/jsonFormatter/i18n/es.ts +4 -4
  82. package/src/tool/jsonFormatter/i18n/fr.ts +4 -4
  83. package/src/tool/jsonFormatter/i18n/id.ts +4 -4
  84. package/src/tool/jsonFormatter/i18n/it.ts +4 -4
  85. package/src/tool/jsonFormatter/i18n/ja.ts +4 -4
  86. package/src/tool/jsonFormatter/i18n/ko.ts +4 -4
  87. package/src/tool/jsonFormatter/i18n/nl.ts +4 -4
  88. package/src/tool/jsonFormatter/i18n/pl.ts +4 -4
  89. package/src/tool/jsonFormatter/i18n/pt.ts +4 -4
  90. package/src/tool/jsonFormatter/i18n/ru.ts +5 -5
  91. package/src/tool/jsonFormatter/i18n/sv.ts +4 -4
  92. package/src/tool/jsonFormatter/i18n/tr.ts +4 -4
  93. package/src/tool/jsonFormatter/i18n/zh.ts +5 -5
  94. package/src/tool/jsonFormatter/seo.astro +2 -1
  95. package/src/tool/keycode/i18n/de.ts +7 -7
  96. package/src/tool/keycode/i18n/en.ts +5 -5
  97. package/src/tool/keycode/i18n/es.ts +5 -5
  98. package/src/tool/keycode/i18n/fr.ts +7 -7
  99. package/src/tool/keycode/i18n/id.ts +5 -5
  100. package/src/tool/keycode/i18n/it.ts +5 -5
  101. package/src/tool/keycode/i18n/ja.ts +5 -5
  102. package/src/tool/keycode/i18n/ko.ts +5 -5
  103. package/src/tool/keycode/i18n/nl.ts +5 -5
  104. package/src/tool/keycode/i18n/pl.ts +7 -7
  105. package/src/tool/keycode/i18n/pt.ts +5 -5
  106. package/src/tool/keycode/i18n/ru.ts +6 -6
  107. package/src/tool/keycode/i18n/sv.ts +5 -5
  108. package/src/tool/keycode/i18n/tr.ts +5 -5
  109. package/src/tool/keycode/i18n/zh.ts +5 -5
  110. package/src/tool/keycode/seo.astro +2 -1
  111. package/src/tool/llmCostCalculator/component.astro +1 -2
  112. package/src/tool/llmCostCalculator/i18n/de.ts +4 -4
  113. package/src/tool/llmCostCalculator/i18n/en.ts +3 -3
  114. package/src/tool/llmCostCalculator/i18n/fr.ts +3 -3
  115. package/src/tool/llmCostCalculator/i18n/id.ts +3 -3
  116. package/src/tool/llmCostCalculator/i18n/pt.ts +3 -3
  117. package/src/tool/llmCostCalculator/i18n/ru.ts +3 -3
  118. package/src/tool/llmCostCalculator/i18n/sv.ts +3 -3
  119. package/src/tool/llmCostCalculator/i18n/tr.ts +3 -3
  120. package/src/tool/llmCostCalculator/i18n/zh.ts +3 -3
  121. package/src/tool/llmCostCalculator/seo.astro +2 -1
  122. package/src/tool/mobileMockupGenerator/component.astro +4 -5
  123. package/src/tool/mobileMockupGenerator/i18n/es.ts +1 -1
  124. package/src/tool/mobileMockupGenerator/seo.astro +2 -1
  125. package/src/tool/musicalTypography/i18n/de.ts +1 -1
  126. package/src/tool/musicalTypography/i18n/fr.ts +1 -1
  127. package/src/tool/musicalTypography/i18n/id.ts +1 -1
  128. package/src/tool/musicalTypography/i18n/it.ts +1 -1
  129. package/src/tool/musicalTypography/i18n/ko.ts +1 -1
  130. package/src/tool/musicalTypography/i18n/ru.ts +3 -3
  131. package/src/tool/musicalTypography/seo.astro +2 -1
  132. package/src/tool/placeholderGenerator/component.astro +2 -2
  133. package/src/tool/placeholderGenerator/i18n/de.ts +4 -4
  134. package/src/tool/placeholderGenerator/i18n/ru.ts +1 -1
  135. package/src/tool/placeholderGenerator/seo.astro +2 -1
  136. package/src/tool/promptLibrary/i18n/de.ts +1 -1
  137. package/src/tool/promptLibrary/seo.astro +2 -1
  138. package/src/tool/readabilityCalculator/component.astro +4 -4
  139. package/src/tool/readabilityCalculator/i18n/de.ts +2 -2
  140. package/src/tool/readabilityCalculator/seo.astro +2 -1
  141. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +87 -3
  142. package/src/tool/serpPixelSimulator/bibliography.astro +7 -0
  143. package/src/tool/serpPixelSimulator/bibliography.ts +16 -0
  144. package/src/tool/serpPixelSimulator/component.astro +84 -0
  145. package/src/tool/serpPixelSimulator/controller.ts +323 -0
  146. package/src/tool/serpPixelSimulator/entry.ts +30 -0
  147. package/src/tool/serpPixelSimulator/i18n/de.ts +214 -0
  148. package/src/tool/serpPixelSimulator/i18n/en.ts +213 -0
  149. package/src/tool/serpPixelSimulator/i18n/es.ts +214 -0
  150. package/src/tool/serpPixelSimulator/i18n/fr.ts +214 -0
  151. package/src/tool/serpPixelSimulator/i18n/id.ts +214 -0
  152. package/src/tool/serpPixelSimulator/i18n/it.ts +214 -0
  153. package/src/tool/serpPixelSimulator/i18n/ja.ts +214 -0
  154. package/src/tool/serpPixelSimulator/i18n/ko.ts +214 -0
  155. package/src/tool/serpPixelSimulator/i18n/nl.ts +214 -0
  156. package/src/tool/serpPixelSimulator/i18n/pl.ts +214 -0
  157. package/src/tool/serpPixelSimulator/i18n/pt.ts +214 -0
  158. package/src/tool/serpPixelSimulator/i18n/ru.ts +214 -0
  159. package/src/tool/serpPixelSimulator/i18n/sv.ts +214 -0
  160. package/src/tool/serpPixelSimulator/i18n/tr.ts +214 -0
  161. package/src/tool/serpPixelSimulator/i18n/zh.ts +214 -0
  162. package/src/tool/serpPixelSimulator/index.ts +12 -0
  163. package/src/tool/serpPixelSimulator/logic.ts +18 -0
  164. package/src/tool/serpPixelSimulator/seo.astro +12 -0
  165. package/src/tool/serpPixelSimulator/serp-pixel-simulator.css +335 -0
  166. package/src/tool/serpPixelSimulator/ui.ts +33 -0
  167. package/src/tool/svgSanitizer/i18n/de.ts +2 -2
  168. package/src/tool/svgSanitizer/i18n/id.ts +1 -1
  169. package/src/tool/svgSanitizer/i18n/pl.ts +1 -1
  170. package/src/tool/svgSanitizer/i18n/ru.ts +7 -7
  171. package/src/tool/svgSanitizer/i18n/sv.ts +3 -3
  172. package/src/tool/svgSanitizer/i18n/tr.ts +3 -3
  173. package/src/tool/svgSanitizer/i18n/zh.ts +3 -3
  174. package/src/tool/svgSanitizer/seo.astro +2 -1
  175. package/src/tool/svgToCss/i18n/de.ts +2 -2
  176. package/src/tool/svgToCss/i18n/es.ts +1 -1
  177. package/src/tool/svgToCss/i18n/fr.ts +1 -1
  178. package/src/tool/svgToCss/i18n/pl.ts +1 -1
  179. package/src/tool/svgToCss/i18n/ru.ts +2 -2
  180. package/src/tool/svgToCss/i18n/zh.ts +2 -2
  181. package/src/tool/svgToCss/seo.astro +2 -1
  182. package/src/tool/urlCleaner/component.astro +23 -5
  183. package/src/tool/urlCleaner/i18n/de.ts +3 -3
  184. package/src/tool/urlCleaner/i18n/es.ts +1 -1
  185. package/src/tool/urlCleaner/i18n/id.ts +1 -1
  186. package/src/tool/urlCleaner/i18n/nl.ts +1 -1
  187. package/src/tool/urlCleaner/seo.astro +2 -1
  188. package/src/tool/urlCleaner/url-tracking-cleaner.css +92 -2
  189. package/src/tool/urlEncoderDecoder/i18n/de.ts +5 -5
  190. package/src/tool/urlEncoderDecoder/i18n/fr.ts +2 -2
  191. package/src/tool/urlEncoderDecoder/i18n/pl.ts +5 -5
  192. package/src/tool/urlEncoderDecoder/i18n/ru.ts +8 -8
  193. package/src/tool/urlEncoderDecoder/i18n/sv.ts +5 -5
  194. package/src/tool/urlEncoderDecoder/i18n/zh.ts +5 -5
  195. package/src/tool/urlEncoderDecoder/seo.astro +2 -1
  196. package/src/tool/utmGenerator/i18n/de.ts +2 -2
  197. package/src/tool/utmGenerator/i18n/pl.ts +5 -5
  198. package/src/tool/utmGenerator/i18n/ru.ts +6 -6
  199. package/src/tool/utmGenerator/seo.astro +2 -1
  200. package/src/tools.ts +2 -2
@@ -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
+ };
@@ -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 = 'simulator-serp-penghitung-piksel';
7
+ const title = 'Simulator SERP dan Penghitung Piksel SEO';
8
+ const description = 'Pratinjau cuplikan pencarian gaya Google secara real-time, ukur lebar judul dan meta deskripsi dalam piksel, dan lihat dengan tepat di mana teks Anda akan dipotong.';
9
+
10
+ const howTo = [
11
+ {
12
+ name: 'Masukkan tag judul',
13
+ text: 'Ketik atau tempel judul halaman yang ingin Anda uji. Pratinjau SERP dan pengukur piksel diperbarui pada setiap ketikan.',
14
+ },
15
+ {
16
+ name: 'Tambahkan URL yang terlihat',
17
+ text: 'Gunakan domain dan jalur yang realistis agar cuplikan menyerupai hasil yang akan dipindai oleh pencari.',
18
+ },
19
+ {
20
+ name: 'Tulis deskripsi meta',
21
+ text: 'Tambahkan teks deskripsi dan perhatikan bilah piksel. Saat melebihi lebar visual yang disarankan, pratinjau memotongnya dengan elipsis.',
22
+ },
23
+ {
24
+ name: 'Beralih antara desktop dan seluler',
25
+ text: 'Bandingkan rendering judul dengan lebar kartu desktop atau seluler sebelum menerbitkan metadata.',
26
+ },
27
+ ];
28
+
29
+ const faq = [
30
+ {
31
+ question: 'Mengapa menghitung piksel alih-alih karakter untuk judul SEO?',
32
+ answer: 'Kartu hasil Google dibatasi oleh lebar visual. Judul dengan banyak huruf sempit dapat memuat lebih banyak karakter daripada judul dengan huruf lebar, huruf besar, atau glif yang terlihat tebal. Pengukuran piksel memberikan pratinjau yang lebih akurat dari hasil yang terlihat.',
33
+ },
34
+ {
35
+ question: 'Apakah ini menjamin persis bagaimana Google akan memotong cuplikan saya?',
36
+ answer: 'Tidak. Google dapat menulis ulang tautan judul dan cuplikan, dan rendering dapat bervariasi menurut kueri, perangkat, bahasa, dan eksperimen. Alat ini dirancang sebagai panduan visual praktis untuk menulis metadata yang lebih kecil kemungkinannya untuk dipotong.',
37
+ },
38
+ {
39
+ question: 'Batas piksel apa yang digunakan simulator?',
40
+ answer: 'Batas default judul desktop adalah 580 px, judul seluler 600 px, dan batas deskripsi meta adalah 920 px. Ini adalah target penulisan, bukan batas resmi Google.',
41
+ },
42
+ {
43
+ question: 'Mengapa pratinjau menambahkan elipsis?',
44
+ answer: 'Saat teks yang diukur melebihi lebar piksel yang tersedia, simulator memotong string pada karakter terakhir yang muat dan menambahkan tiga titik, mencocokkan perilaku praktis yang dibutuhkan tim SEO untuk mendeteksi hilangnya makna.',
45
+ },
46
+ ];
47
+
48
+ const ui: SerpPixelSimulatorUI = {
49
+ titleLabel: 'Tag judul',
50
+ titlePlaceholder: 'GameBob | Studio Pengembangan Independen',
51
+ urlLabel: 'URL yang terlihat',
52
+ urlPlaceholder: 'https://www.gamebob.dev/id/',
53
+ descriptionLabel: 'Deskripsi meta',
54
+ descriptionPlaceholder: 'Temukan koleksi alat dan permainan kami yang dirancang untuk meningkatkan alur kerja digital dan hiburan Anda.',
55
+ deviceLabel: 'Mode pratinjau',
56
+ desktopLabel: 'Desktop',
57
+ mobileLabel: 'Seluler',
58
+ titlePixelsLabel: 'Lebar judul',
59
+ descriptionPixelsLabel: 'Lebar deskripsi',
60
+ charactersLabel: 'karakter',
61
+ previewLabel: 'Pratinjau langsung gaya Google',
62
+ tooLongLabel: 'Terlalu lebar',
63
+ goodLabel: 'Pas',
64
+ emptyTitle: 'Judul Anda akan muncul di sini',
65
+ emptyDescription: 'Pratinjau deskripsi meta Anda akan muncul di sini saat Anda mengetik.',
66
+ defaultTitle: 'GameBob | Studio Pengembangan Independen',
67
+ defaultUrl: 'https://www.gamebob.dev/id/',
68
+ defaultDescription: 'Temukan koleksi alat dan permainan kami yang dirancang untuk meningkatkan alur kerja digital dan hiburan Anda.',
69
+ fallbackUrl: 'contoh.co.id',
70
+ fallbackFaviconText: 'G',
71
+ pixelUnit: 'px',
72
+ ellipsis: '...',
73
+ fetchButtonLabel: 'Ambil',
74
+ fetchLoadingLabel: 'Mengambil...',
75
+ fetchSuccessLabel: 'Metadata dimuat dari URL.',
76
+ fetchCorsError: 'Browser tidak dapat membaca halaman ini. Mungkin diblokir oleh CORS, pengalihan, konten campuran, atau aturan jaringan. Anda masih dapat menempelkan atau mengedit metadata secara manual.',
77
+ fetchInvalidUrlError: 'Masukkan URL yang valid sebelum mengambil metadata.',
78
+ fetchNoMetadataError: 'Halaman diambil, tetapi tidak ada judul atau deskripsi meta yang ditemukan.',
79
+ fetchGenericError: 'Metadata tidak dapat diambil dari URL ini. Periksa alamat atau isi kolom secara manual.',
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: 'id',
121
+ };
122
+
123
+ export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
124
+ slug,
125
+ title,
126
+ description,
127
+ ui,
128
+ faqTitle: 'Pertanyaan umum tentang simulator SERP',
129
+ faq,
130
+ bibliographyTitle: 'Dokumentasi hasil pencarian',
131
+ bibliography,
132
+ howTo,
133
+ schemas: [appSchema, faqSchema, howToSchema],
134
+ seo: [
135
+ {
136
+ type: 'title',
137
+ text: 'Berhenti menebak bagaimana hasil Google Anda akan terlihat',
138
+ level: 2,
139
+ },
140
+ {
141
+ type: 'paragraph',
142
+ html: 'Tag judul bisa terlihat sempurna di spreadsheet dan tetap gagal di hasil pencarian. Google tidak mencadangkan ruang berdasarkan jumlah karakter; Google merender teks di dalam kartu visual. Itu berarti <strong>GameBob | Studio Pengembangan Independen</strong> dan judul lain dengan jumlah karakter yang sama dapat menempati lebar yang sangat berbeda tergantung pada huruf, kapitalisasi, tanda baca, dan spasi.',
143
+ },
144
+ {
145
+ type: 'tip',
146
+ title: 'Aturan yang benar benar membantu',
147
+ html: 'Tulis cuplikan sehingga janji penting bertahan dari elipsis. Tempatkan jenis halaman, maksud pencarian, dan alasan terkuat untuk mengklik sebelum batas piksel. Nama merek berguna, tetapi tidak boleh mendorong manfaat utama keluar dari pandangan.',
148
+ },
149
+ {
150
+ type: 'title',
151
+ text: 'Apa yang diukur oleh penghitung piksel',
152
+ level: 3,
153
+ },
154
+ {
155
+ type: 'table',
156
+ headers: ['Elemen', 'Yang penting', 'Cara menggunakan hasilnya'],
157
+ rows: [
158
+ ['Tag judul', 'Lebar yang dirender dalam piksel, bukan jumlah karakter mentah', 'Jaga kata kunci utama dan janji klik tetap terlihat sebelum pemotongan.'],
159
+ ['URL yang terlihat', 'Kepercayaan visual dan kejelasan topik', 'Gunakan jalur yang dapat dibaca yang memperkuat ke mana hasil mengarah.'],
160
+ ['Deskripsi meta', 'Area cuplikan yang lebih luas dengan perilaku tergantung kueri', 'Tempatkan manfaat di depan karena Google dapat mempersingkat atau menulis ulangnya.'],
161
+ ['Mode perangkat', 'Kartu desktop dan seluler bisa terasa berbeda', 'Periksa keduanya sebelum menerbitkan metadata untuk halaman penting.'],
162
+ ],
163
+ },
164
+ {
165
+ type: 'title',
166
+ text: 'Mengapa batas karakter adalah kebiasaan SEO yang lemah',
167
+ level: 3,
168
+ },
169
+ {
170
+ type: 'paragraph',
171
+ html: 'Saran tradisional seperti "jaga judul di bawah 60 karakter" memang nyaman, tetapi menyembunyikan masalah sebenarnya. Huruf lebar seperti W dan M, kata huruf besar, pemisah, angka, dan nama merek panjang semuanya mengonsumsi ruang yang berbeda. Pengukuran piksel membuat pertukaran langsung terlihat: Anda dapat melihat apakah sebuah frasa pantas mendapat tempatnya atau mencuri ruang dari pesan yang lebih kuat.',
172
+ },
173
+ {
174
+ type: 'title',
175
+ text: 'Alur kerja praktis untuk cuplikan yang lebih baik',
176
+ level: 3,
177
+ },
178
+ {
179
+ type: 'list',
180
+ items: [
181
+ '<strong>Mulai dengan maksud:</strong> jelaskan apa yang didapat pengguna, bukan hanya apa nama halamannya.',
182
+ '<strong>Uji judul lengkap:</strong> tempelkan ke simulator dan perhatikan bilahnya sebelum menerbitkan.',
183
+ '<strong>Hapus kata-kata lemah:</strong> jika bilah berubah merah, hapus kata pengisi sebelum memotong istilah berharga.',
184
+ '<strong>Periksa elipsis:</strong> jika pratinjau yang dipotong kehilangan makna, tulis ulang judul alih-alih menerima pemotongan.',
185
+ '<strong>Ulangi untuk deskripsi:</strong> pastikan kalimat pertama membawa proposisi nilai dengan sendirinya.',
186
+ ],
187
+ },
188
+ {
189
+ type: 'diagnostic',
190
+ variant: 'info',
191
+ title: 'Saat bilah berubah merah',
192
+ html: 'Bilah merah bukan peringatan penalti. Itu berarti teks saat ini lebih lebar dari target visual yang dipilih, jadi simulator memotongnya dengan titik. Perlakukan itu sebagai sinyal editorial: putuskan apakah kata-kata tersembunyi dapat dibuang, atau apakah cuplikan membutuhkan struktur yang lebih tajam.',
193
+ },
194
+ {
195
+ type: 'title',
196
+ text: 'Batasan, penulisan ulang, dan harapan realistis',
197
+ level: 3,
198
+ },
199
+ {
200
+ type: 'paragraph',
201
+ html: 'Tidak ada simulator yang dapat menjamin cuplikan persis yang akan ditampilkan Google. Google dapat menulis ulang tautan judul, menebalkan istilah kueri, memilih teks halaman alih-alih deskripsi meta, atau menampilkan cuplikan berbeda untuk pencarian yang berbeda. Alat ini paling baik digunakan sebagai langkah penulisan dan QA cepat: alat ini mendeteksi kelebihan visual yang jelas sebelum halaman mencapai produksi.',
202
+ },
203
+ {
204
+ type: 'summary',
205
+ title: 'Penggunaan terbaik simulator SERP ini',
206
+ items: [
207
+ 'Gunakan bilah piksel untuk mendeteksi kelebihan visual sebelum menerbitkan metadata.',
208
+ 'Jaga maksud pencarian utama dan janji klik tetap terlihat sebelum elipsis apa pun.',
209
+ 'Ambil metadata dari URL yang mengizinkan CORS, lalu edit hasilnya secara manual jika diperlukan.',
210
+ 'Anggap pratinjau sebagai panduan penulisan, karena Google masih dapat menulis ulang cuplikan per kueri.',
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 = 'simulatore-serp-contatore-pixel';
7
+ const title = 'Simulatore SERP e Contatore Pixel SEO';
8
+ const description = 'Visualizza in anteprima gli snippet di ricerca in stile Google in tempo reale, misura la larghezza in pixel del titolo e della meta description e scopri esattamente dove il testo verrà troncato.';
9
+
10
+ const howTo = [
11
+ {
12
+ name: 'Inserisci il tag title',
13
+ text: 'Digita o incolla il titolo della pagina che vuoi testare. L\'anteprima SERP e il misuratore di pixel si aggiornano a ogni tasto premuto.',
14
+ },
15
+ {
16
+ name: 'Aggiungi l\'URL visibile',
17
+ text: 'Usa un dominio e un percorso realistici in modo che lo snippet assomigli al risultato che un utente esaminerebbe.',
18
+ },
19
+ {
20
+ name: 'Scrivi la meta description',
21
+ text: 'Aggiungi il testo della descrizione e osserva la barra dei pixel. Quando supera la larghezza visiva consigliata, l\'anteprima la tronca con i puntini di sospensione.',
22
+ },
23
+ {
24
+ name: 'Passa da desktop a mobile',
25
+ text: 'Confronta la resa del titolo con la larghezza della scheda desktop o mobile prima di pubblicare i metadati.',
26
+ },
27
+ ];
28
+
29
+ const faq = [
30
+ {
31
+ question: 'Perché contare i pixel invece dei caratteri per i titoli SEO?',
32
+ answer: 'Le schede dei risultati di Google sono vincolate dalla larghezza visiva. Un titolo con molte lettere strette può contenere più caratteri di uno con lettere larghe, maiuscole o glifi dall\'aspetto marcato. La misurazione in pixel offre un\'anteprima più fedele del risultato visibile.',
33
+ },
34
+ {
35
+ question: 'Questo garantisce esattamente come Google troncherà il mio snippet?',
36
+ answer: 'No. Google può riscrivere i link del titolo e gli snippet, e la resa può variare in base alla query, al dispositivo, alla lingua e agli esperimenti. Lo strumento è pensato come una guida visiva pratica per scrivere metadati con meno probabilità di essere tagliati.',
37
+ },
38
+ {
39
+ question: 'Quali limiti di pixel utilizza il simulatore?',
40
+ answer: 'Il limite predefinito del titolo su desktop è di 580 px, su mobile di 600 px e il limite della meta description è di 920 px. Sono obiettivi di scrittura, non limiti ufficiali di Google.',
41
+ },
42
+ {
43
+ question: 'Perché l\'anteprima aggiunge i puntini di sospensione?',
44
+ answer: 'Quando il testo misurato supera la larghezza in pixel disponibile, il simulatore tronca la stringa all\'ultimo carattere che rientra e aggiunge tre puntini, riproducendo il comportamento pratico di cui i team SEO hanno bisogno per individuare la perdita di significato.',
45
+ },
46
+ ];
47
+
48
+ const ui: SerpPixelSimulatorUI = {
49
+ titleLabel: 'Tag title',
50
+ titlePlaceholder: 'GameBob | Studio di Sviluppo Indipendente',
51
+ urlLabel: 'URL visibile',
52
+ urlPlaceholder: 'https://www.gamebob.dev/it/',
53
+ descriptionLabel: 'Meta description',
54
+ descriptionPlaceholder: 'Scopri la nostra collezione di strumenti e giochi pensati per migliorare il tuo flusso di lavoro digitale e l\'intrattenimento.',
55
+ deviceLabel: 'Modalità anteprima',
56
+ desktopLabel: 'Desktop',
57
+ mobileLabel: 'Mobile',
58
+ titlePixelsLabel: 'Larghezza titolo',
59
+ descriptionPixelsLabel: 'Larghezza descrizione',
60
+ charactersLabel: 'caratteri',
61
+ previewLabel: 'Anteprima dal vivo in stile Google',
62
+ tooLongLabel: 'Troppo larga',
63
+ goodLabel: 'Ok',
64
+ emptyTitle: 'Il tuo titolo apparirà qui',
65
+ emptyDescription: 'L\'anteprima della tua meta description apparirà qui mentre digiti.',
66
+ defaultTitle: 'GameBob | Studio di Sviluppo Indipendente',
67
+ defaultUrl: 'https://www.gamebob.dev/it/',
68
+ defaultDescription: 'Scopri la nostra collezione di strumenti e giochi pensati per migliorare il tuo flusso di lavoro digitale e l\'intrattenimento.',
69
+ fallbackUrl: 'esempio.com',
70
+ fallbackFaviconText: 'G',
71
+ pixelUnit: 'px',
72
+ ellipsis: '...',
73
+ fetchButtonLabel: 'Recupera',
74
+ fetchLoadingLabel: 'Recupero in corso...',
75
+ fetchSuccessLabel: 'Metadati caricati dall\'URL.',
76
+ fetchCorsError: 'Il browser non ha potuto leggere questa pagina. Potrebbe essere bloccata da CORS, un reindirizzamento, contenuti misti o una regola di rete. Puoi comunque incollare o modificare i metadati manualmente.',
77
+ fetchInvalidUrlError: 'Inserisci un URL valido prima di recuperare i metadati.',
78
+ fetchNoMetadataError: 'La pagina è stata recuperata, ma non è stato trovato alcun titolo o meta description.',
79
+ fetchGenericError: 'Impossibile recuperare i metadati da questo URL. Verifica l\'indirizzo o compila i campi 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: 'it',
121
+ };
122
+
123
+ export const content: ToolLocaleContent<SerpPixelSimulatorUI> = {
124
+ slug,
125
+ title,
126
+ description,
127
+ ui,
128
+ faqTitle: 'Domande frequenti sul simulatore SERP',
129
+ faq,
130
+ bibliographyTitle: 'Documentazione sui risultati di ricerca',
131
+ bibliography,
132
+ howTo,
133
+ schemas: [appSchema, faqSchema, howToSchema],
134
+ seo: [
135
+ {
136
+ type: 'title',
137
+ text: 'Smetti di indovinare come apparirà il tuo risultato su Google',
138
+ level: 2,
139
+ },
140
+ {
141
+ type: 'paragraph',
142
+ html: 'Un tag title può sembrare perfetto in un foglio di calcolo e comunque fallire nel risultato di ricerca. Google non riserva spazio in base al numero di caratteri; mostra il testo all\'interno di una scheda visiva. Questo significa che <strong>GameBob | Studio di Sviluppo Indipendente</strong> e un altro titolo con lo stesso numero di caratteri possono occupare larghezze molto diverse a seconda delle lettere, delle maiuscole, della punteggiatura e della spaziatura.',
143
+ },
144
+ {
145
+ type: 'tip',
146
+ title: 'La regola che aiuta davvero',
147
+ html: 'Scrivi lo snippet in modo che la promessa importante sopravviva ai puntini di sospensione. Metti il tipo di pagina, l\'intento di ricerca e il motivo più forte per cliccare prima del limite di pixel. I nomi dei marchi sono utili, ma non devono spingere il beneficio principale fuori dalla vista.',
148
+ },
149
+ {
150
+ type: 'title',
151
+ text: 'Cosa misura il contatore di pixel',
152
+ level: 3,
153
+ },
154
+ {
155
+ type: 'table',
156
+ headers: ['Elemento', 'Cosa conta', 'Come usare il risultato'],
157
+ rows: [
158
+ ['Tag title', 'Larghezza renderizzata in pixel, non il conteggio grezzo dei caratteri', 'Mantieni la parola chiave principale e la promessa di clic visibili prima del troncamento.'],
159
+ ['URL visibile', 'Fiducia visiva e chiarezza dell\'argomento', 'Usa un percorso leggibile che rafforzi la destinazione del risultato.'],
160
+ ['Meta description', 'Un\'area snippet più ampia con comportamento dipendente dalla query', 'Metti il beneficio in primo piano perché Google potrebbe accorciarla o riscriverla.'],
161
+ ['Modalità dispositivo', 'Le schede desktop e mobile possono sembrare diverse', 'Controlla entrambe prima di pubblicare i metadati per le pagine importanti.'],
162
+ ],
163
+ },
164
+ {
165
+ type: 'title',
166
+ text: 'Perché i limiti di caratteri sono una cattiva abitudine SEO',
167
+ level: 3,
168
+ },
169
+ {
170
+ type: 'paragraph',
171
+ html: 'Il consiglio tradizionale come "mantieni i titoli sotto i 60 caratteri" è comodo, ma nasconde il vero problema. Lettere larghe come W e M, parole in maiuscolo, separatori, numeri e nomi di marca lunghi consumano tutti spazi diversi. La misurazione in pixel rende il compromesso immediatamente visibile: puoi vedere se una frase si guadagna il suo posto o ruba spazio a un messaggio più forte.',
172
+ },
173
+ {
174
+ type: 'title',
175
+ text: 'Un flusso di lavoro pratico per snippet migliori',
176
+ level: 3,
177
+ },
178
+ {
179
+ type: 'list',
180
+ items: [
181
+ '<strong>Inizia con l\'intento:</strong> descrivi cosa ottiene l\'utente, non solo come si chiama la pagina.',
182
+ '<strong>Testa il titolo completo:</strong> incollalo nel simulatore e osserva la barra prima di pubblicare.',
183
+ '<strong>Rimuovi le parole deboli:</strong> se la barra diventa rossa, elimina i riempitivi prima di tagliare i termini preziosi.',
184
+ '<strong>Controlla i puntini di sospensione:</strong> se l\'anteprima troncata perde significato, riscrivi il titolo invece di accettare il taglio.',
185
+ '<strong>Ripeti per la descrizione:</strong> assicurati che la prima frase porti da sola la proposta di valore.',
186
+ ],
187
+ },
188
+ {
189
+ type: 'diagnostic',
190
+ variant: 'info',
191
+ title: 'Quando la barra diventa rossa',
192
+ html: 'Una barra rossa non è un avviso di penalizzazione. Significa che il testo attuale è più largo dell\'obiettivo visivo selezionato, quindi il simulatore lo tronca con i puntini. Consideralo come un segnale editoriale: decidi se le parole nascoste sono sacrificabili o se lo snippet ha bisogno di una struttura più affilata.',
193
+ },
194
+ {
195
+ type: 'title',
196
+ text: 'Limiti, riscritture e aspettative realistiche',
197
+ level: 3,
198
+ },
199
+ {
200
+ type: 'paragraph',
201
+ html: 'Nessun simulatore può garantire lo snippet esatto che Google mostrerà. Google può riscrivere i link del titolo, mettere in grassetto i termini della query, scegliere il testo della pagina invece della meta description o mostrare snippet diversi per ricerche diverse. Questo strumento è più utile come fase rapida di scrittura e controllo qualità: rileva gli overflow visivi evidenti prima che la pagina arrivi in produzione.',
202
+ },
203
+ {
204
+ type: 'summary',
205
+ title: 'Miglior uso di questo simulatore SERP',
206
+ items: [
207
+ 'Usa la barra dei pixel per individuare gli overflow visivi prima di pubblicare i metadati.',
208
+ 'Mantieni l\'intento di ricerca principale e la promessa di clic visibili prima di qualsiasi ellissi.',
209
+ 'Recupera i metadati dagli URL che consentono CORS, poi modifica il risultato manualmente se necessario.',
210
+ 'Considera l\'anteprima come una guida alla scrittura, perché Google può comunque riscrivere gli snippet per ogni query.',
211
+ ],
212
+ },
213
+ ],
214
+ };