@jjlmoya/utils-social 1.13.0 → 1.15.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 (146) hide show
  1. package/package.json +4 -2
  2. package/src/category/i18n/fr.ts +2 -2
  3. package/src/category/i18n/ru.ts +1 -1
  4. package/src/env.d.ts +5 -0
  5. package/src/layouts/PreviewLayout.astro +7 -2
  6. package/src/pages/[locale]/[slug].astro +28 -12
  7. package/src/tests/diacritics_density.test.ts +118 -0
  8. package/src/tests/inverted_punctuation.test.ts +84 -0
  9. package/src/tests/locale_completeness.test.ts +4 -14
  10. package/src/tests/no_en_dash.test.ts +70 -0
  11. package/src/tests/pagespeed_best_practices.test.ts +198 -0
  12. package/src/tests/script_density.test.ts +94 -0
  13. package/src/tests/shared-test-helpers.ts +56 -0
  14. package/src/tests/tool_exports.test.ts +34 -0
  15. package/src/tool/redditFormatter/bibliography.astro +2 -10
  16. package/src/tool/redditFormatter/bibliography.ts +12 -0
  17. package/src/tool/redditFormatter/i18n/de.ts +3 -13
  18. package/src/tool/redditFormatter/i18n/en.ts +3 -13
  19. package/src/tool/redditFormatter/i18n/es.ts +3 -13
  20. package/src/tool/redditFormatter/i18n/fr.ts +5 -15
  21. package/src/tool/redditFormatter/i18n/id.ts +3 -13
  22. package/src/tool/redditFormatter/i18n/it.ts +3 -13
  23. package/src/tool/redditFormatter/i18n/ja.ts +3 -13
  24. package/src/tool/redditFormatter/i18n/ko.ts +3 -13
  25. package/src/tool/redditFormatter/i18n/nl.ts +3 -13
  26. package/src/tool/redditFormatter/i18n/pl.ts +7 -17
  27. package/src/tool/redditFormatter/i18n/pt.ts +3 -13
  28. package/src/tool/redditFormatter/i18n/ru.ts +5 -15
  29. package/src/tool/redditFormatter/i18n/sv.ts +3 -13
  30. package/src/tool/redditFormatter/i18n/tr.ts +3 -13
  31. package/src/tool/redditFormatter/i18n/zh.ts +4 -14
  32. package/src/tool/redditFormatter/seo.astro +2 -1
  33. package/src/tool/safeZones/bibliography.astro +2 -10
  34. package/src/tool/safeZones/bibliography.ts +20 -0
  35. package/src/tool/safeZones/component.astro +1 -1
  36. package/src/tool/safeZones/i18n/de.ts +5 -23
  37. package/src/tool/safeZones/i18n/en.ts +5 -23
  38. package/src/tool/safeZones/i18n/es.ts +3 -21
  39. package/src/tool/safeZones/i18n/fr.ts +14 -32
  40. package/src/tool/safeZones/i18n/id.ts +5 -23
  41. package/src/tool/safeZones/i18n/it.ts +9 -27
  42. package/src/tool/safeZones/i18n/ja.ts +3 -21
  43. package/src/tool/safeZones/i18n/ko.ts +3 -21
  44. package/src/tool/safeZones/i18n/nl.ts +5 -23
  45. package/src/tool/safeZones/i18n/pl.ts +10 -28
  46. package/src/tool/safeZones/i18n/pt.ts +5 -23
  47. package/src/tool/safeZones/i18n/ru.ts +12 -30
  48. package/src/tool/safeZones/i18n/sv.ts +5 -23
  49. package/src/tool/safeZones/i18n/tr.ts +3 -21
  50. package/src/tool/safeZones/i18n/zh.ts +7 -25
  51. package/src/tool/safeZones/seo.astro +2 -1
  52. package/src/tool/socialImageResizer/bibliography.astro +2 -10
  53. package/src/tool/socialImageResizer/bibliography.ts +12 -0
  54. package/src/tool/socialImageResizer/component.astro +2 -2
  55. package/src/tool/socialImageResizer/i18n/de.ts +8 -18
  56. package/src/tool/socialImageResizer/i18n/en.ts +11 -21
  57. package/src/tool/socialImageResizer/i18n/es.ts +10 -20
  58. package/src/tool/socialImageResizer/i18n/fr.ts +14 -24
  59. package/src/tool/socialImageResizer/i18n/id.ts +11 -21
  60. package/src/tool/socialImageResizer/i18n/it.ts +19 -29
  61. package/src/tool/socialImageResizer/i18n/ja.ts +10 -20
  62. package/src/tool/socialImageResizer/i18n/ko.ts +10 -20
  63. package/src/tool/socialImageResizer/i18n/nl.ts +11 -21
  64. package/src/tool/socialImageResizer/i18n/pl.ts +12 -22
  65. package/src/tool/socialImageResizer/i18n/pt.ts +11 -21
  66. package/src/tool/socialImageResizer/i18n/ru.ts +17 -27
  67. package/src/tool/socialImageResizer/i18n/sv.ts +11 -21
  68. package/src/tool/socialImageResizer/i18n/tr.ts +10 -20
  69. package/src/tool/socialImageResizer/i18n/zh.ts +10 -20
  70. package/src/tool/socialImageResizer/seo.astro +2 -1
  71. package/src/tool/socialValueCalculator/bibliography.astro +2 -10
  72. package/src/tool/socialValueCalculator/bibliography.ts +16 -0
  73. package/src/tool/socialValueCalculator/component.astro +1 -2
  74. package/src/tool/socialValueCalculator/i18n/de.ts +5 -19
  75. package/src/tool/socialValueCalculator/i18n/en.ts +4 -18
  76. package/src/tool/socialValueCalculator/i18n/es.ts +5 -19
  77. package/src/tool/socialValueCalculator/i18n/fr.ts +9 -23
  78. package/src/tool/socialValueCalculator/i18n/id.ts +4 -18
  79. package/src/tool/socialValueCalculator/i18n/it.ts +17 -31
  80. package/src/tool/socialValueCalculator/i18n/ja.ts +4 -18
  81. package/src/tool/socialValueCalculator/i18n/ko.ts +4 -18
  82. package/src/tool/socialValueCalculator/i18n/nl.ts +4 -18
  83. package/src/tool/socialValueCalculator/i18n/pl.ts +4 -18
  84. package/src/tool/socialValueCalculator/i18n/pt.ts +4 -18
  85. package/src/tool/socialValueCalculator/i18n/ru.ts +10 -24
  86. package/src/tool/socialValueCalculator/i18n/sv.ts +4 -18
  87. package/src/tool/socialValueCalculator/i18n/tr.ts +4 -18
  88. package/src/tool/socialValueCalculator/i18n/zh.ts +7 -21
  89. package/src/tool/socialValueCalculator/seo.astro +2 -1
  90. package/src/tool/tinderPhotoOptimizer/bibliography.astro +2 -10
  91. package/src/tool/tinderPhotoOptimizer/bibliography.ts +12 -0
  92. package/src/tool/tinderPhotoOptimizer/component.astro +23 -6
  93. package/src/tool/tinderPhotoOptimizer/i18n/de.ts +6 -16
  94. package/src/tool/tinderPhotoOptimizer/i18n/en.ts +4 -14
  95. package/src/tool/tinderPhotoOptimizer/i18n/es.ts +3 -13
  96. package/src/tool/tinderPhotoOptimizer/i18n/fr.ts +28 -38
  97. package/src/tool/tinderPhotoOptimizer/i18n/id.ts +3 -13
  98. package/src/tool/tinderPhotoOptimizer/i18n/it.ts +3 -13
  99. package/src/tool/tinderPhotoOptimizer/i18n/ja.ts +3 -13
  100. package/src/tool/tinderPhotoOptimizer/i18n/ko.ts +3 -13
  101. package/src/tool/tinderPhotoOptimizer/i18n/nl.ts +3 -13
  102. package/src/tool/tinderPhotoOptimizer/i18n/pl.ts +3 -13
  103. package/src/tool/tinderPhotoOptimizer/i18n/pt.ts +3 -13
  104. package/src/tool/tinderPhotoOptimizer/i18n/ru.ts +12 -22
  105. package/src/tool/tinderPhotoOptimizer/i18n/sv.ts +3 -13
  106. package/src/tool/tinderPhotoOptimizer/i18n/tr.ts +3 -13
  107. package/src/tool/tinderPhotoOptimizer/i18n/zh.ts +5 -15
  108. package/src/tool/tinderPhotoOptimizer/seo.astro +2 -1
  109. package/src/tool/youtubeThumbnail/bibliography.astro +2 -10
  110. package/src/tool/youtubeThumbnail/bibliography.ts +16 -0
  111. package/src/tool/youtubeThumbnail/component.astro +1 -0
  112. package/src/tool/youtubeThumbnail/i18n/de.ts +6 -20
  113. package/src/tool/youtubeThumbnail/i18n/en.ts +4 -18
  114. package/src/tool/youtubeThumbnail/i18n/es.ts +3 -17
  115. package/src/tool/youtubeThumbnail/i18n/fr.ts +6 -20
  116. package/src/tool/youtubeThumbnail/i18n/id.ts +3 -17
  117. package/src/tool/youtubeThumbnail/i18n/it.ts +3 -17
  118. package/src/tool/youtubeThumbnail/i18n/ja.ts +3 -17
  119. package/src/tool/youtubeThumbnail/i18n/ko.ts +3 -17
  120. package/src/tool/youtubeThumbnail/i18n/nl.ts +3 -17
  121. package/src/tool/youtubeThumbnail/i18n/pl.ts +3 -17
  122. package/src/tool/youtubeThumbnail/i18n/pt.ts +3 -17
  123. package/src/tool/youtubeThumbnail/i18n/ru.ts +6 -20
  124. package/src/tool/youtubeThumbnail/i18n/sv.ts +3 -17
  125. package/src/tool/youtubeThumbnail/i18n/tr.ts +3 -17
  126. package/src/tool/youtubeThumbnail/i18n/zh.ts +5 -19
  127. package/src/tool/youtubeThumbnail/seo.astro +2 -1
  128. package/src/tool/youtubeThumbnailPreviewer/bibliography.astro +2 -10
  129. package/src/tool/youtubeThumbnailPreviewer/bibliography.ts +16 -0
  130. package/src/tool/youtubeThumbnailPreviewer/i18n/de.ts +11 -25
  131. package/src/tool/youtubeThumbnailPreviewer/i18n/en.ts +5 -19
  132. package/src/tool/youtubeThumbnailPreviewer/i18n/es.ts +3 -17
  133. package/src/tool/youtubeThumbnailPreviewer/i18n/fr.ts +12 -26
  134. package/src/tool/youtubeThumbnailPreviewer/i18n/id.ts +5 -19
  135. package/src/tool/youtubeThumbnailPreviewer/i18n/it.ts +24 -38
  136. package/src/tool/youtubeThumbnailPreviewer/i18n/ja.ts +3 -17
  137. package/src/tool/youtubeThumbnailPreviewer/i18n/ko.ts +3 -17
  138. package/src/tool/youtubeThumbnailPreviewer/i18n/nl.ts +7 -21
  139. package/src/tool/youtubeThumbnailPreviewer/i18n/pl.ts +10 -24
  140. package/src/tool/youtubeThumbnailPreviewer/i18n/pt.ts +3 -17
  141. package/src/tool/youtubeThumbnailPreviewer/i18n/ru.ts +14 -28
  142. package/src/tool/youtubeThumbnailPreviewer/i18n/sv.ts +5 -19
  143. package/src/tool/youtubeThumbnailPreviewer/i18n/tr.ts +3 -17
  144. package/src/tool/youtubeThumbnailPreviewer/i18n/zh.ts +13 -27
  145. package/src/tool/youtubeThumbnailPreviewer/seo.astro +2 -1
  146. package/src/types.ts +0 -2
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -9,7 +10,7 @@ const description =
9
10
 
10
11
  const faqData = [
11
12
  {
12
- question: "Czym są „strefy bezpieczne” (Safe Zones) w mediach społecznościowych?",
13
+ question: "Czym są \"strefy bezpieczne\" (Safe Zones) w mediach społecznościowych?",
13
14
  answer:
14
15
  "Są to obszary ekranu, w których treść jest widoczna bez ryzyka zasłonięcia przez elementy interfejsu, takie jak nazwa użytkownika, opis, przyciski interakcji (polubienie, udostępnienie) lub automatyczne przycięcia stosowane przez niektóre urządzenia.",
15
16
  },
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Wczytaj zdjęcie lub film',
36
- text: "Prześlij plik, który chcesz podejrzeć. Przetwarzanie odbywa się lokalnie i prywatnie — nic nie jest wysyłane do Internetu.",
37
+ text: "Prześlij plik, który chcesz podejrzeć. Przetwarzanie odbywa się lokalnie i prywatnie - nic nie jest wysyłane do Internetu.",
37
38
  },
38
39
  {
39
40
  name: 'Wybierz platformę',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Często Zadawane Pytania',
91
- faq: faqData,
92
- bibliographyTitle: 'Oficjalna dokumentacja platformy',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Video optimization and safe zones',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Najlepsze praktyki dla Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'Pomoc YouTube: Tworzenie YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Strefy bezpieczne i proporcje wideo',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -122,7 +104,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
122
104
  },
123
105
  {
124
106
  type: 'paragraph',
125
- html: "To narzędzie pozwala wczytać pliki multimedialne i podejrzeć dokładnie, które części kadru zostaną pochłonięte przez interfejs. Nie chodzi tylko o <strong>napisy</strong>; chodzi o upewnienie się, że twarze, produkty lub główne akcje w Twoim filmie nie zostaną pogrzebane pod przyciskiem „Lubię to” lub długim opisem.",
107
+ html: "To narzędzie pozwala wczytać pliki multimedialne i podejrzeć dokładnie, które części kadru zostaną pochłonięte przez interfejs. Nie chodzi tylko o <strong>napisy</strong>; chodzi o upewnienie się, że twarze, produkty lub główne akcje w Twoim filmie nie zostaną pogrzebane pod przyciskiem \"Lubię to\" lub długim opisem.",
126
108
  },
127
109
  {
128
110
  type: 'grid',
@@ -130,7 +112,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
130
112
  {
131
113
  type: 'card',
132
114
  title: 'TikTok: Najbardziej inwazyjny interfejs',
133
- html: "<p>TikTok posiada najbardziej zagęszczony interfejs. Po prawej stronie znajduje się kolumna ikon zajmująca około 15% szerokości. Na dole opis może rozciągać się na 4 lub 5 linii, zakrywając od dołu prawie jedną trzecią ekranu.</p><ul><li><strong>Dolny margines:</strong> Pozostaw ostatnie 250px wolne, aby uniknąć tekstu opisu i nazwy użytkownika.</li><li><strong>Prawy margines:</strong> Unikaj umieszczania tekstu w odległości mniejszej niż 100px od prawej krawędzi.</li><li><strong>Góra:</strong> Przyciski „Obserwujesz” i „Dla Ciebie” zajmują górny środkowy pas.</li></ul>",
115
+ html: "<p>TikTok posiada najbardziej zagęszczony interfejs. Po prawej stronie znajduje się kolumna ikon zajmująca około 15% szerokości. Na dole opis może rozciągać się na 4 lub 5 linii, zakrywając od dołu prawie jedną trzecią ekranu.</p><ul><li><strong>Dolny margines:</strong> Pozostaw ostatnie 250px wolne, aby uniknąć tekstu opisu i nazwy użytkownika.</li><li><strong>Prawy margines:</strong> Unikaj umieszczania tekstu w odległości mniejszej niż 100px od prawej krawędzi.</li><li><strong>Góra:</strong> Przyciski \"Obserwujesz\" i \"Dla Ciebie\" zajmują górny środkowy pas.</li></ul>",
134
116
  },
135
117
  {
136
118
  type: 'card',
@@ -153,7 +135,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
153
135
  items: [
154
136
  '<strong>Prawy margines:</strong> Unikaj umieszczania tekstu lub ważnych elementów w prawym dolnym obszarze 20%.',
155
137
  '<strong>Dolny margines:</strong> Pozostaw ostatnie 150px wolne, aby uniknąć tekstu opisu i nazwy użytkownika.',
156
- '<strong>Góra:</strong> Przyciski „Subskrybuj” i inne zajmują górny środkowy pas.',
138
+ '<strong>Góra:</strong> Przyciski \"Subskrybuj\" i inne zajmują górny środkowy pas.',
157
139
  ],
158
140
  },
159
141
  {
@@ -168,7 +150,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
168
150
  },
169
151
  {
170
152
  type: 'paragraph',
171
- html: '„Złota Strefa” dla głównej akcji to środkowa jedna trzecia filmu. Jeśli filmujesz osobę, upewnij się, że jej oczy i usta znajdują się w tej strefie. Ważne elementy graficzne powinny być nieco przesunięte w górę od geometrycznego środka, aby uniknąć dolnego opisu.',
153
+ html: '\"Złota Strefa\" dla głównej akcji to środkowa jedna trzecia filmu. Jeśli filmujesz osobę, upewnij się, że jej oczy i usta znajdują się w tej strefie. Ważne elementy graficzne powinny być nieco przesunięte w górę od geometrycznego środka, aby uniknąć dolnego opisu.',
172
154
  },
173
155
  {
174
156
  type: 'title',
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: "Projektowanie dla mediów społecznościowych to nie tylko estetyka — to <strong>użyteczność</strong>. Jeśli użytkownik musi walczyć o przeczytanie tekstu, ponieważ ikony platformy go zasłaniają, po prostu przejdzie do następnego filmu. Retencja (Watch Time) gwałtownie spada, gdy pojawia się wizualne tarcie.",
180
+ html: "Projektowanie dla mediów społecznościowych to nie tylko estetyka - to <strong>użyteczność</strong>. Jeśli użytkownik musi walczyć o przeczytanie tekstu, ponieważ ikony platformy go zasłaniają, po prostu przejdzie do następnego filmu. Retencja (Watch Time) gwałtownie spada, gdy pojawia się wizualne tarcie.",
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Carrega a tua imagem ou vídeo',
36
- text: 'Faz o upload do ficheiro que desejas pré-visualizar. O processamento é local e privado — nada é carregado para a internet.',
37
+ text: 'Faz o upload do ficheiro que desejas pré-visualizar. O processamento é local e privado - nada é carregado para a internet.',
37
38
  },
38
39
  {
39
40
  name: 'Seleciona a plataforma',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Perguntas Frequentes',
91
- faq: faqData,
92
- bibliographyTitle: 'Documentação Oficial das Plataformas',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Otimização de vídeo e zonas seguras',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Melhores práticas para Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'Ajuda do YouTube: Criar YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Zonas seguras e proporções para vídeo',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Desenhar para redes sociais não é apenas estética — é <strong>usabilidade</strong>. Se um utilizador tiver de lutar para ler texto porque os ícones da plataforma o cobrem, ele simplesmente passará para o vídeo seguinte. A retenção (Watch Time) cai drasticamente quando há fricção visual.',
180
+ html: 'Desenhar para redes sociais não é apenas estética - é <strong>usabilidade</strong>. Se um utilizador tiver de lutar para ler texto porque os ícones da plataforma o cobrem, ele simplesmente passará para o vídeo seguinte. A retenção (Watch Time) cai drasticamente quando há fricção visual.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -9,7 +10,7 @@ const description =
9
10
 
10
11
  const faqData = [
11
12
  {
12
- question: 'Что такое «безопасные зоны» в социальных сетях?',
13
+ question: 'Что такое \"безопасные зоны\" в социальных сетях?',
13
14
  answer:
14
15
  'Это области экрана, где контент виден без риска быть перекрытым элементами интерфейса, такими как имя пользователя, описание, кнопки взаимодействия (лайк, репост) или автоматическая обрезка, применяемая некоторыми устройствами.',
15
16
  },
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Загрузите изображение или видео',
36
- text: 'Загрузите файл, который хотите просмотреть. Обработка происходит локально и конфиденциально — ничего не загружается в интернет.',
37
+ text: 'Загрузите файл, который хотите просмотреть. Обработка происходит локально и конфиденциально - ничего не загружается в интернет.',
37
38
  },
38
39
  {
39
40
  name: 'Выберите платформу',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Часто задаваемые вопросы',
91
- faq: faqData,
92
- bibliographyTitle: 'Официальная документация платформы',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: оптимизация видео и безопасные зоны',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: рекомендации для Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'Справка YouTube: создание YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: безопасные зоны и соотношение сторон для видео',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -118,11 +100,11 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
118
100
  },
119
101
  {
120
102
  type: 'paragraph',
121
- html: 'В перенасыщенном мире вертикального контента первое впечатление — техническое. Самая большая ошибка авторов — игнорирование того, как их <strong>видео или изображение</strong> взаимодействует с нативным интерфейсом платформы. Каждая социальная сеть (TikTok, Instagram Reels и YouTube Shorts) накладывает слои кнопок, текста и профилей, которые могут свести на нет визуальный эффект вашей композиции.',
103
+ html: 'В перенасыщенном мире вертикального контента первое впечатление - техническое. Самая большая ошибка авторов - игнорирование того, как их <strong>видео или изображение</strong> взаимодействует с нативным интерфейсом платформы. Каждая социальная сеть (TikTok, Instagram Reels и YouTube Shorts) накладывает слои кнопок, текста и профилей, которые могут свести на нет визуальный эффект вашей композиции.',
122
104
  },
123
105
  {
124
106
  type: 'paragraph',
125
- html: 'Этот инструмент позволяет загружать медиафайлы и просматривать, какие именно части вашего кадра будут перекрыты интерфейсом. Речь идет не только о <strong>субтитрах</strong>; речь идет о том, чтобы лица, продукты или основные действия в вашем видео не оказались погребены под кнопкой «Нравится» или длинным описанием.',
107
+ html: 'Этот инструмент позволяет загружать медиафайлы и просматривать, какие именно части вашего кадра будут перекрыты интерфейсом. Речь идет не только о <strong>субтитрах</strong>; речь идет о том, чтобы лица, продукты или основные действия в вашем видео не оказались погребены под кнопкой \"Нравится\" или длинным описанием.',
126
108
  },
127
109
  {
128
110
  type: 'grid',
@@ -130,7 +112,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
130
112
  {
131
113
  type: 'card',
132
114
  title: 'TikTok: самый навязчивый интерфейс',
133
- html: '<p>TikTok имеет самый плотный интерфейс. С правой стороны находится колонка иконок, занимающая примерно 15% ширины. Внизу описание может растягиваться на 4 или 5 строк, закрывая почти треть экрана снизу.</p><ul><li><strong>Нижний отступ:</strong> оставляйте последние 250 пикселей свободными, чтобы избежать перекрытия текстом описания и именем пользователя.</li><li><strong>Правый отступ:</strong> избегайте размещения текста в пределах 100 пикселей от правого края.</li><li><strong>Верх:</strong> кнопки «Подписки» и «Рекомендации» занимают верхнюю центральную полосу.</li></ul>',
115
+ html: '<p>TikTok имеет самый плотный интерфейс. С правой стороны находится колонка иконок, занимающая примерно 15% ширины. Внизу описание может растягиваться на 4 или 5 строк, закрывая почти треть экрана снизу.</p><ul><li><strong>Нижний отступ:</strong> оставляйте последние 250 пикселей свободными, чтобы избежать перекрытия текстом описания и именем пользователя.</li><li><strong>Правый отступ:</strong> избегайте размещения текста в пределах 100 пикселей от правого края.</li><li><strong>Верх:</strong> кнопки \"Подписки\" и \"Рекомендации\" занимают верхнюю центральную полосу.</li></ul>',
134
116
  },
135
117
  {
136
118
  type: 'card',
@@ -168,7 +150,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
168
150
  },
169
151
  {
170
152
  type: 'paragraph',
171
- html: '«Золотая зона» для основного действия — центральная треть видео. Если вы снимаете человека, убедитесь, что его глаза и рот находятся в этой зоне. Важные графические элементы должны быть слегка смещены вверх от геометрического центра, чтобы избежать перекрытия нижним описанием.',
153
+ html: '\"Золотая зона\" для основного действия - центральная треть видео. Если вы снимаете человека, убедитесь, что его глаза и рот находятся в этой зоне. Важные графические элементы должны быть слегка смещены вверх от геометрического центра, чтобы избежать перекрытия нижним описанием.',
172
154
  },
173
155
  {
174
156
  type: 'title',
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Дизайн для социальных сетей — это не только эстетика, но и <strong>удобство использования</strong>. Если пользователю приходится изо всех сил пытаться прочитать текст, потому что иконки платформы закрывают его, он просто перелистнет к следующему видео. Удержание (Watch Time) резко падает при наличии визуального дискомфорта.',
180
+ html: 'Дизайн для социальных сетей - это не только эстетика, но и <strong>удобство использования</strong>. Если пользователю приходится изо всех сил пытаться прочитать текст, потому что иконки платформы закрывают его, он просто перелистнет к следующему видео. Удержание (Watch Time) резко падает при наличии визуального дискомфорта.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -227,14 +209,14 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
227
209
  ttFollowing: 'Подписки',
228
210
  ttForYou: 'Рекомендации',
229
211
  ttDescription: 'Реальный дизайн интерфейса для создателей контента. #uxdesign #socialmedia',
230
- ttAudio: 'jjlmoya — оригинальный звук',
212
+ ttAudio: 'jjlmoya - оригинальный звук',
231
213
  ttNavHome: 'Главная',
232
214
  ttNavFriends: 'Друзья',
233
215
  ttNavInbox: 'Входящие',
234
216
  ttNavProfile: 'Профиль',
235
217
  reelsFollow: 'Подписаться',
236
218
  reelsDescription: 'Этот интерфейс идентичен реальному. #reels #ux #simulator',
237
- reelsAudio: 'Trending Music — оригинальное аудио',
219
+ reelsAudio: 'Trending Music - оригинальное аудио',
238
220
  shortsSubscribe: 'ПОДПИСАТЬСЯ',
239
221
  shortsDislike: 'Не нравится',
240
222
  shortsShare: 'Поделиться',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -33,7 +34,7 @@ const faqData = [
33
34
  const howToData = [
34
35
  {
35
36
  name: 'Ladda upp din bild eller video',
36
- text: 'Ladda upp filen du vill förhandsgranska. Bearbetningen sker lokalt och privat – inget laddas upp till internet.',
37
+ text: 'Ladda upp filen du vill förhandsgranska. Bearbetningen sker lokalt och privat - inget laddas upp till internet.',
37
38
  },
38
39
  {
39
40
  name: 'Välj plattform',
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Vanliga frågor',
91
- faq: faqData,
92
- bibliographyTitle: 'Officiell plattformsdokumentation',
93
- bibliography: [
94
- {
95
- name: 'TikTok Creator Portal: Videooptimering och säkra zoner',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Best practices för Reels',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Help: Skapa YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Säkra zoner och bildförhållanden för video',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -195,7 +177,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
195
177
  },
196
178
  {
197
179
  type: 'paragraph',
198
- html: 'Att designa för sociala medier handlar inte bara om estetik – det handlar om <strong>användbarhet</strong>. Om en användare måste kämpa för att läsa text för att plattformens ikoner täcker den, kommer de helt enkelt att svepa vidare till nästa video. Behållningen (Watch Time) sjunker kraftigt när det finns visuell friktion.',
180
+ html: 'Att designa för sociala medier handlar inte bara om estetik - det handlar om <strong>användbarhet</strong>. Om en användare måste kämpa för att läsa text för att plattformens ikoner täcker den, kommer de helt enkelt att svepa vidare till nästa video. Behållningen (Watch Time) sjunker kraftigt när det finns visuell friktion.',
199
181
  },
200
182
  {
201
183
  type: 'paragraph',
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: 'Sıkça Sorulan Sorular',
91
- faq: faqData,
92
- bibliographyTitle: 'Resmi Platform Dokümantasyonu',
93
- bibliography: [
94
- {
95
- name: 'TikTok İçerik Üretici Portalı: Video optimizasyonu ve güvenli bölgeler',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram Business: Reels için en iyi uygulamalar',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube Yardımı: YouTube Shorts oluşturma',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators: Videolar için güvenli bölgeler ve en boy oranları',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SafeZonesUI } from '../ui';
@@ -9,7 +10,7 @@ const description =
9
10
 
10
11
  const faqData = [
11
12
  {
12
- question: '什么是社交媒体上的“安全区域”?',
13
+ question: '什么是社交媒体上的\"安全区域\"?',
13
14
  answer:
14
15
  '安全区域是指屏幕上内容可见且不会被界面元素(如用户名、描述、交互按钮(点赞、分享))或某些设备应用的自动裁剪所遮挡的区域。',
15
16
  },
@@ -87,27 +88,8 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
87
88
  slug,
88
89
  title,
89
90
  description,
90
- faqTitle: '常见问题',
91
- faq: faqData,
92
- bibliographyTitle: '官方平台文档',
93
- bibliography: [
94
- {
95
- name: 'TikTok 创作者门户:视频优化和安全区域',
96
- url: 'https://www.tiktok.com/creators/creator-portal/en-us/foundation/video-optimization/',
97
- },
98
- {
99
- name: 'Instagram 业务:Reels 最佳实践',
100
- url: 'https://business.instagram.com/creators/reels-best-practices',
101
- },
102
- {
103
- name: 'YouTube 帮助:创建 YouTube Shorts',
104
- url: 'https://support.google.com/youtube/answer/10343433',
105
- },
106
- {
107
- name: 'Meta for Creators:视频安全区域和纵横比',
108
- url: 'https://www.facebook.com/business/help/103816146375741',
109
- },
110
- ],
91
+ faq: faqData,
92
+ bibliography,
111
93
  howTo: howToData,
112
94
  schemas: [faqSchema, howToSchema, appSchema],
113
95
  seo: [
@@ -122,7 +104,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
122
104
  },
123
105
  {
124
106
  type: 'paragraph',
125
- html: '此工具允许您加载媒体文件,并准确预览画面的哪些部分会被界面遮挡。这不仅仅关乎<strong>字幕</strong>;它还关乎确保视频中的脸部、产品或主要动作不会被嵌入“点赞”按钮或冗长的描述之下。',
107
+ html: '此工具允许您加载媒体文件,并准确预览画面的哪些部分会被界面遮挡。这不仅仅关乎<strong>字幕</strong>;它还关乎确保视频中的脸部、产品或主要动作不会被嵌入\"点赞\"按钮或冗长的描述之下。',
126
108
  },
127
109
  {
128
110
  type: 'grid',
@@ -130,7 +112,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
130
112
  {
131
113
  type: 'card',
132
114
  title: 'TikTok:最具侵入性的界面',
133
- html: '<p>TikTok 的界面最为密集。在右侧,有一列图标占据了约 15% 的宽度。在底部,描述可以扩展到 4 或 5 行,从下方遮挡了近三分之一的屏幕。</p><ul><li><strong>底部边距:</strong>保留最后 250px 的自由空间,以避开描述文字和用户名。</li><li><strong>右侧边距:</strong>避免在距离右边缘 100px 范围内放置文字。</li><li><strong>顶部:</strong>“关注”和“推荐”按钮占据了顶部中央条案。</li></ul>',
115
+ html: '<p>TikTok 的界面最为密集。在右侧,有一列图标占据了约 15% 的宽度。在底部,描述可以扩展到 4 或 5 行,从下方遮挡了近三分之一的屏幕。</p><ul><li><strong>底部边距:</strong>保留最后 250px 的自由空间,以避开描述文字和用户名。</li><li><strong>右侧边距:</strong>避免在距离右边缘 100px 范围内放置文字。</li><li><strong>顶部:</strong>\"关注\"和\"推荐\"按钮占据了顶部中央条案。</li></ul>',
134
116
  },
135
117
  {
136
118
  type: 'card',
@@ -168,7 +150,7 @@ export const content: ToolLocaleContent<SafeZonesUI> = {
168
150
  },
169
151
  {
170
152
  type: 'paragraph',
171
- html: '主要动作的“黄金区域”是视频的中央三分之一。如果您正在拍摄人物,请确保他们的眼睛和嘴巴在这个区域内。重要的图形元素应从几何中心略微向上移动,以避开底部的描述。',
153
+ html: '主要动作的\"黄金区域\"是视频的中央三分之一。如果您正在拍摄人物,请确保他们的眼睛和嘴巴在这个区域内。重要的图形元素应从几何中心略微向上移动,以避开底部的描述。',
172
154
  },
173
155
  {
174
156
  type: 'title',
@@ -11,4 +11,5 @@ const { locale = 'es' } = Astro.props;
11
11
  const content = await safeZones.i18n[locale]?.();
12
12
  if (!content) return null;
13
13
  ---
14
- <SEORenderer content={{ locale: locale as string, sections: content.seo }} />
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -1,14 +1,6 @@
1
1
  ---
2
2
  import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
- import { socialImageResizer } 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 socialImageResizer.i18n[locale]?.();
3
+ import { bibliography } from './bibliography';
12
4
  ---
13
5
 
14
- {content && <SharedBibliography links={content.bibliography} />}
6
+ <SharedBibliography links={bibliography} />
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'MDN Web Docs: Canvas API',
6
+ url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
7
+ },
8
+ {
9
+ name: 'Sprout Social: Social Media Image Sizes Guide 2026',
10
+ url: 'https://sproutsocial.com/insights/social-media-image-sizes-guide/',
11
+ },
12
+ ];
@@ -73,7 +73,7 @@ const icons: Record<string, string> = {
73
73
  <h2>{t.uploadTitle}</h2>
74
74
  <p>{t.uploadSubtitle}</p>
75
75
  </div>
76
- <input type="file" id="sri-file-input" accept="image/*" hidden />
76
+ <input type="file" id="sri-file-input" class="file-input" accept="image/*" hidden />
77
77
  </div>
78
78
 
79
79
  <div class="sri-editor-view" id="sri-editor-view">
@@ -84,7 +84,7 @@ const icons: Record<string, string> = {
84
84
  <div class="sri-editor-actions">
85
85
  <div class="sri-zoom-control">
86
86
  <span set:html={icons.zoomOut} />
87
- <input type="range" id="sri-zoom-range" min="10" max="300" value="100" />
87
+ <input type="range" id="sri-zoom-range" min="10" max="300" value="100" aria-label="Zoom" />
88
88
  <span set:html={icons.zoomIn} />
89
89
  </div>
90
90
 
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SocialImageResizerUI } from '../ui';
@@ -78,19 +79,8 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
78
79
  slug,
79
80
  title,
80
81
  description,
81
- faqTitle: 'Häufig gestellte Fragen',
82
- faq: faqData,
83
- bibliographyTitle: 'Referenzen',
84
- bibliography: [
85
- {
86
- name: 'MDN Web Docs: Canvas API',
87
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
88
- },
89
- {
90
- name: 'Sprout Social: Social Media Image Sizes Guide 2026',
91
- url: 'https://sproutsocial.com/insights/social-media-image-sizes-guide/',
92
- },
93
- ],
82
+ faq: faqData,
83
+ bibliography,
94
84
  howTo: howToData,
95
85
  schemas: [faqSchema, howToSchema, appSchema],
96
86
  seo: [
@@ -101,7 +91,7 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
101
91
  },
102
92
  {
103
93
  type: 'paragraph',
104
- html: 'Im heutigen digitalen Ökosystem ist der erste Eindruck visuell. Jedes soziale Netzwerk arbeitet mit spezifischen Algorithmen, die Inhalte bevorzugen, die nativ an ihre Proportionen angepasst sind. Unser Social Media Image Resizer ist nicht nur ein technisches Werkzeug – er ist Ihr Partner, um sicherzustellen, dass Ihre Botschaft ohne unerwünschte Zuschnitte oder Qualitätsverluste ankommt.',
94
+ html: 'Im heutigen digitalen Ökosystem ist der erste Eindruck visuell. Jedes soziale Netzwerk arbeitet mit spezifischen Algorithmen, die Inhalte bevorzugen, die nativ an ihre Proportionen angepasst sind. Unser Social Media Image Resizer ist nicht nur ein technisches Werkzeug - er ist Ihr Partner, um sicherzustellen, dass Ihre Botschaft ohne unerwünschte Zuschnitte oder Qualitätsverluste ankommt.',
105
95
  },
106
96
  {
107
97
  type: 'paragraph',
@@ -115,10 +105,10 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
115
105
  {
116
106
  type: 'grid',
117
107
  columns: [
118
- { title: 'Instagram — Quadratischer Post', body: '1080 × 1080 px · Verhältnis 1:1' },
119
- { title: 'Instagram — Vertikaler Post', body: '1080 × 1350 px · Verhältnis 4:5' },
120
- { title: 'TikTok / Reels — Vertikal', body: '1080 × 1920 px · Verhältnis 9:16' },
121
- { title: 'YouTube — Thumbnail', body: '1280 × 720 px · Verhältnis 16:9' },
108
+ { title: 'Instagram: Quadratischer Post', body: '1080 × 1080 px · Verhältnis 1:1' },
109
+ { title: 'Instagram: Vertikaler Post', body: '1080 × 1350 px · Verhältnis 4:5' },
110
+ { title: 'TikTok / Reels: Vertikal', body: '1080 × 1920 px · Verhältnis 9:16' },
111
+ { title: 'YouTube: Thumbnail', body: '1280 × 720 px · Verhältnis 16:9' },
122
112
  { title: 'YouTube Kanal Banner', body: '2560 × 1440 px · Verhältnis 16:9' },
123
113
  { title: 'X (Twitter) Standard Post', body: '1200 × 675 px · Verhältnis 16:9' },
124
114
  { title: 'LinkedIn Profil Header', body: '1584 × 396 px · Verhältnis 4:1' },
@@ -1,3 +1,4 @@
1
+ import { bibliography } from '../bibliography';
1
2
  import type { WithContext, FAQPage, HowToThing, SoftwareApplication } from 'schema-dts';
2
3
  import type { ToolLocaleContent } from '../../../types';
3
4
  import type { SocialImageResizerUI } from '../ui';
@@ -78,19 +79,8 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
78
79
  slug,
79
80
  title,
80
81
  description,
81
- faqTitle: 'Frequently Asked Questions',
82
- faq: faqData,
83
- bibliographyTitle: 'References',
84
- bibliography: [
85
- {
86
- name: 'MDN Web Docs: Canvas API',
87
- url: 'https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API',
88
- },
89
- {
90
- name: 'Sprout Social: Social Media Image Sizes Guide 2026',
91
- url: 'https://sproutsocial.com/insights/social-media-image-sizes-guide/',
92
- },
93
- ],
82
+ faq: faqData,
83
+ bibliography,
94
84
  howTo: howToData,
95
85
  schemas: [faqSchema, howToSchema, appSchema],
96
86
  seo: [
@@ -101,7 +91,7 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
101
91
  },
102
92
  {
103
93
  type: 'paragraph',
104
- html: "In today's digital ecosystem, first impressions are visual. Each social network operates under specific algorithms that prioritize content natively adapted to its proportions. Our social media image resizer is not just a technical tool — it is your ally to ensure your message arrives without unwanted crops or quality loss.",
94
+ html: "In today's digital ecosystem, first impressions are visual. Each social network operates under specific algorithms that prioritize content natively adapted to its proportions. Our social media image resizer is not just a technical tool - it is your ally to ensure your message arrives without unwanted crops or quality loss.",
105
95
  },
106
96
  {
107
97
  type: 'paragraph',
@@ -115,13 +105,13 @@ export const content: ToolLocaleContent<SocialImageResizerUI> = {
115
105
  {
116
106
  type: 'grid',
117
107
  columns: [
118
- { title: 'Instagram — Square Post', body: '1080 × 1080 px · Ratio 1:1' },
119
- { title: 'Instagram — Vertical Post', body: '1080 × 1350 px · Ratio 4:5' },
120
- { title: 'TikTok / Reels — Vertical', body: '1080 × 1920 px · Ratio 9:16' },
121
- { title: 'YouTube — Thumbnail', body: '1280 × 720 px · Ratio 16:9' },
122
- { title: 'YouTube — Channel Banner', body: '2560 × 1440 px · Ratio 16:9' },
123
- { title: 'X (Twitter) — Standard Post', body: '1200 × 675 px · Ratio 16:9' },
124
- { title: 'LinkedIn — Profile Cover', body: '1584 × 396 px · Ratio 4:1' },
108
+ { title: 'Instagram: Square Post', body: '1080 × 1080 px · Ratio 1:1' },
109
+ { title: 'Instagram: Vertical Post', body: '1080 × 1350 px · Ratio 4:5' },
110
+ { title: 'TikTok / Reels: Vertical', body: '1080 × 1920 px · Ratio 9:16' },
111
+ { title: 'YouTube: Thumbnail', body: '1280 × 720 px · Ratio 16:9' },
112
+ { title: 'YouTube: Channel Banner', body: '2560 × 1440 px · Ratio 16:9' },
113
+ { title: 'X (Twitter): Standard Post', body: '1200 × 675 px · Ratio 16:9' },
114
+ { title: 'LinkedIn: Profile Cover', body: '1584 × 396 px · Ratio 4:1' },
125
115
  ],
126
116
  },
127
117
  {