tiptapify 0.3.5 → 0.4.1

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 (137) hide show
  1. package/dist/content.css +28 -0
  2. package/dist/tiptapify.css +1 -1
  3. package/dist/tiptapify.mjs +110770 -65623
  4. package/dist/tiptapify.umd.js +106 -89
  5. package/index.d.ts +37 -0
  6. package/package.json +3 -2
  7. package/src/components/ImageBubbleMenu.vue +5 -33
  8. package/src/components/MenuBubble.test.ts +120 -0
  9. package/src/components/MenuBubble.vue +124 -134
  10. package/src/components/MenuFloating.vue +48 -45
  11. package/src/components/Tiptapify.upload.test.ts +10 -0
  12. package/src/components/Tiptapify.vue +85 -45
  13. package/src/components/Toolbar/Index.vue +10 -0
  14. package/src/components/UI/BubbleRow.vue +41 -0
  15. package/src/components/UI/TiptapifyDialog.test.ts +37 -3
  16. package/src/components/UI/TiptapifyDialog.vue +15 -4
  17. package/src/components/editorExtensions.test.ts +9 -0
  18. package/src/components/editorExtensions.ts +21 -1
  19. package/src/composables/fakeUploadEndpoint.ts +65 -0
  20. package/src/composables/useTiptapifyConfig.ts +19 -0
  21. package/src/composables/useTiptapifyLinkPreview.test.ts +51 -0
  22. package/src/composables/useTiptapifyLinkPreview.ts +60 -0
  23. package/src/composables/useTiptapifyUpload.test.ts +96 -0
  24. package/src/composables/useTiptapifyUpload.ts +126 -0
  25. package/src/extensions/components/ai/Dialog.test.ts +335 -0
  26. package/src/extensions/components/ai/Dialog.vue +607 -310
  27. package/src/extensions/components/ai/backend.test.ts +1 -0
  28. package/src/extensions/components/ai/backend.ts +2 -1
  29. package/src/extensions/components/ai/context.test.ts +149 -0
  30. package/src/extensions/components/ai/context.ts +145 -0
  31. package/src/extensions/components/ai/diff.test.ts +65 -0
  32. package/src/extensions/components/ai/diff.ts +120 -0
  33. package/src/extensions/components/ai/errors.test.ts +45 -0
  34. package/src/extensions/components/ai/errors.ts +67 -0
  35. package/src/extensions/components/ai/result.test.ts +144 -0
  36. package/src/extensions/components/ai/result.ts +101 -0
  37. package/src/extensions/components/ai/thinking.test.ts +45 -0
  38. package/src/extensions/components/ai/thinking.ts +58 -0
  39. package/src/extensions/components/formatExtra/sub/Button.vue +1 -1
  40. package/src/extensions/components/formatExtra/sup/Button.vue +1 -1
  41. package/src/extensions/components/media/iframe/Button.vue +6 -7
  42. package/src/extensions/components/media/iframe/IframeDialog.test.ts +177 -0
  43. package/src/extensions/components/media/iframe/IframeDialog.vue +477 -105
  44. package/src/extensions/components/media/iframe/embed.test.ts +123 -0
  45. package/src/extensions/components/media/iframe/embed.ts +236 -0
  46. package/src/extensions/components/media/iframe/index.test.ts +123 -0
  47. package/src/extensions/components/media/iframe/index.ts +92 -10
  48. package/src/extensions/components/media/image/ImageDialog.vue +430 -132
  49. package/src/extensions/components/media/image/caption.test.ts +66 -1
  50. package/src/extensions/components/media/image/caption.ts +27 -1
  51. package/src/extensions/components/media/image/imageDialog.test.ts +210 -0
  52. package/src/extensions/components/media/image/imageDialog.ts +117 -0
  53. package/src/extensions/components/media/image/index.ts +2 -1
  54. package/src/extensions/components/media/link/Button.test.ts +96 -0
  55. package/src/extensions/components/media/link/Button.vue +6 -2
  56. package/src/extensions/components/media/link/LinkDialog.display.test.ts +363 -0
  57. package/src/extensions/components/media/link/LinkDialog.vue +687 -61
  58. package/src/extensions/components/media/link/index.ts +111 -6
  59. package/src/extensions/components/media/link/link.marks.test.ts +89 -0
  60. package/src/extensions/components/media/link/linkDialog.test.ts +296 -0
  61. package/src/extensions/components/media/link/linkDialog.ts +154 -0
  62. package/src/extensions/components/media/linkCard/PasteCardMenu.test.ts +133 -0
  63. package/src/extensions/components/media/linkCard/PasteCardMenu.vue +168 -0
  64. package/src/extensions/components/media/linkCard/index.test.ts +146 -0
  65. package/src/extensions/components/media/linkCard/index.ts +177 -0
  66. package/src/extensions/components/media/linkCard/linkCardDialog.test.ts +87 -0
  67. package/src/extensions/components/media/linkCard/linkCardDialog.ts +62 -0
  68. package/src/extensions/components/media/linkCard/linkPreview.test.ts +102 -0
  69. package/src/extensions/components/media/linkCard/linkPreview.ts +84 -0
  70. package/src/extensions/components/media/linkCard/makeLinkCard.test.ts +59 -0
  71. package/src/extensions/components/media/linkCard/makeLinkCard.ts +58 -0
  72. package/src/extensions/components/media/linkCard/pasteCard.test.ts +190 -0
  73. package/src/extensions/components/media/linkCard/pasteCard.ts +153 -0
  74. package/src/extensions/components/media/video/Button.vue +2 -1
  75. package/src/extensions/components/media/video/VideoDialog.test.ts +233 -0
  76. package/src/extensions/components/media/video/VideoDialog.vue +748 -59
  77. package/src/extensions/components/media/video/index.test.ts +154 -0
  78. package/src/extensions/components/media/video/index.ts +70 -5
  79. package/src/extensions/components/media/video/providers.test.ts +148 -0
  80. package/src/extensions/components/media/video/providers.ts +241 -0
  81. package/src/extensions/components/media/video/videoFile.test.ts +98 -0
  82. package/src/extensions/components/media/video/videoFile.ts +142 -0
  83. package/src/extensions/components/misc/fullscreen/Button.test.ts +55 -0
  84. package/src/extensions/components/misc/fullscreen/Button.vue +2 -2
  85. package/src/extensions/components/style/StyleColor.test.ts +255 -0
  86. package/src/extensions/components/style/StyleColor.vue +358 -208
  87. package/src/extensions/components/style/color/Button.vue +1 -3
  88. package/src/extensions/components/style/color/colors.test.ts +191 -0
  89. package/src/extensions/components/style/color/colors.ts +168 -0
  90. package/src/extensions/components/style/highlight/Button.vue +1 -3
  91. package/src/i18n/locales/ar.json +226 -23
  92. package/src/i18n/locales/bg.json +225 -22
  93. package/src/i18n/locales/ch.json +226 -23
  94. package/src/i18n/locales/cz.json +226 -23
  95. package/src/i18n/locales/de.json +226 -23
  96. package/src/i18n/locales/el.json +225 -22
  97. package/src/i18n/locales/en.json +225 -22
  98. package/src/i18n/locales/es.json +226 -23
  99. package/src/i18n/locales/et.json +225 -22
  100. package/src/i18n/locales/fi.json +226 -23
  101. package/src/i18n/locales/fr.json +226 -23
  102. package/src/i18n/locales/he.json +225 -22
  103. package/src/i18n/locales/hi.json +225 -22
  104. package/src/i18n/locales/hr.json +225 -22
  105. package/src/i18n/locales/hu.json +226 -23
  106. package/src/i18n/locales/id.json +225 -22
  107. package/src/i18n/locales/it.json +226 -23
  108. package/src/i18n/locales/ja.json +226 -23
  109. package/src/i18n/locales/ko.json +226 -23
  110. package/src/i18n/locales/la.json +226 -23
  111. package/src/i18n/locales/lt.json +226 -23
  112. package/src/i18n/locales/nl.json +226 -23
  113. package/src/i18n/locales/no.json +227 -24
  114. package/src/i18n/locales/pl.json +226 -23
  115. package/src/i18n/locales/pt-BR.json +225 -22
  116. package/src/i18n/locales/pt.json +226 -23
  117. package/src/i18n/locales/ro.json +225 -22
  118. package/src/i18n/locales/ru.json +227 -24
  119. package/src/i18n/locales/se.json +226 -23
  120. package/src/i18n/locales/sk.json +225 -22
  121. package/src/i18n/locales/sl.json +225 -22
  122. package/src/i18n/locales/sr.json +225 -22
  123. package/src/i18n/locales/th.json +226 -23
  124. package/src/i18n/locales/tr.json +226 -23
  125. package/src/i18n/locales/uk.json +227 -24
  126. package/src/i18n/locales/vi.json +226 -23
  127. package/src/index.ts +10 -0
  128. package/src/skins/registry.test.ts +1 -1
  129. package/src/skins/tokens.reachability.test.ts +1 -0
  130. package/src/skins/tokens.ts +3 -3
  131. package/src/types/editor.ts +40 -1
  132. package/src/utils/contentStyles.test.ts +116 -0
  133. package/src/utils/contentStyles.ts +175 -0
  134. package/src/utils/mediaSize.test.ts +22 -0
  135. package/src/utils/mediaSize.ts +27 -0
  136. package/src/utils/validateHref.test.ts +47 -2
  137. package/src/utils/validateHref.ts +47 -7
@@ -4,7 +4,20 @@
4
4
  "undo": "Desfazer"
5
5
  },
6
6
  "ai": {
7
+ "another_version": "Outra versão",
7
8
  "append": "Adicionar ao final",
9
+ "change_vs_original": "{percent} em relação ao original",
10
+ "changes": "Alterações",
11
+ "context": {
12
+ "characters": "{n} caractere | {n} caracteres",
13
+ "cursor": "Na posição do cursor",
14
+ "document": "Todo o texto",
15
+ "excerpt": "“{text}”",
16
+ "paragraphs": "{n} parágrafo | {n} parágrafos",
17
+ "selection": "Selecionado: {paragraphs}, {characters}"
18
+ },
19
+ "copied": "Copiado",
20
+ "copy": "Copiar",
8
21
  "defaultExamples": {
9
22
  "expand": {
10
23
  "prompt": "Expanda este texto para uma versão mais detalhada.",
@@ -23,19 +36,58 @@
23
36
  "title": "Resumir"
24
37
  }
25
38
  },
39
+ "effort_label": {
40
+ "default": "Esforço: padrão",
41
+ "high": "Esforço: alto",
42
+ "low": "Esforço: baixo",
43
+ "max": "Esforço: máximo",
44
+ "medium": "Esforço: médio",
45
+ "xhigh": "Esforço: muito alto"
46
+ },
47
+ "effort_levels": {
48
+ "default": "Padrão",
49
+ "high": "Alto",
50
+ "low": "Baixo",
51
+ "max": "Máximo",
52
+ "medium": "Médio",
53
+ "xhigh": "Muito alto"
54
+ },
26
55
  "error": "A geração da IA falhou",
56
+ "errors": {
57
+ "auth": "O serviço de IA recusou a solicitação: verifique a chave de API ou as permissões de acesso.",
58
+ "network": "Não foi possível acessar o serviço de IA. Verifique se ele está em execução e permite solicitações desta página (CORS): o console do navegador mostra o motivo.",
59
+ "not_found": "O endereço do serviço de IA não foi encontrado: verifique o caminho do endpoint.",
60
+ "rate_limit": "Muitas solicitações ao serviço de IA. Aguarde um momento e tente novamente.",
61
+ "request": "O serviço de IA não conseguiu processar a solicitação.",
62
+ "service_says": "Resposta do serviço:",
63
+ "timeout": "O serviço de IA não respondeu a tempo. Tente novamente.",
64
+ "unavailable": "O serviço de IA está indisponível: pode estar carregando um modelo ou ocupado. Tente mais tarde."
65
+ },
27
66
  "generate": "Gerar",
28
67
  "insert": "Inserir",
29
- "limit_exceeded": "O resultado excede o limite de caracteres do editor. Encurte o texto e aplique novamente.",
68
+ "insert_below": "Inserir abaixo",
69
+ "limit_exceeded": "O resultado excede o limite de caracteres do editor. Peça uma versão mais curta.",
30
70
  "loading": "Gerando...",
31
71
  "prompt": "Prompt",
72
+ "prompt_placeholder": "Peça para escrever ou editar o texto",
32
73
  "quick_prompts": "Prompts rápidos",
33
74
  "reasoning_effort": "Esforço de raciocínio",
34
- "replace": "Substituir",
75
+ "replace_selection": "Substituir seleção",
35
76
  "result": "Resultado",
77
+ "send_hint": "Enter — enviar",
36
78
  "stop": "Parar",
37
79
  "thinking": "Pensando",
38
- "title": "Escrita com IA",
80
+ "thinking_label": {
81
+ "off": "Raciocínio: desativado",
82
+ "on": "Raciocínio: ativado"
83
+ },
84
+ "thinking_now": "Pensando…",
85
+ "thinking_states": {
86
+ "off": "Desativado",
87
+ "on": "Ativado"
88
+ },
89
+ "thought_for": "Pensou por {seconds} s",
90
+ "title": "Assistente",
39
91
  "unavailable": "Configure um provedor de IA para usar esta ação"
40
92
  },
41
93
  "alignment": "Alinhamento",
@@ -51,50 +103,163 @@
51
103
  "defaultValue": "Valor padrão",
52
104
  "dialog": {
53
105
  "apply": "Aplicar",
106
+ "cancel": "Cancelar",
54
107
  "clear": "Limpar",
55
108
  "close": "Fechar",
56
109
  "iframe": {
57
- "dialog_title": "Adicionar/editar iframe",
58
- "frameborder": "Borda do iframe",
110
+ "advanced": "Avançado",
111
+ "allow": "Permissões (allow)",
112
+ "allow_hint": "Por exemplo: autoplay; fullscreen; clipboard-write",
113
+ "apply_failed": "Não é possível inserir a incorporação aqui.",
114
+ "border": "Mostrar borda",
115
+ "code_invalid": "Cole o código de um único iframe com um endereço. Códigos com scripts ou outras tags não são suportados.",
116
+ "code_parsed": "Código reconhecido: {fields}.",
59
117
  "height": "Altura",
118
+ "input": "Link ou código de incorporação",
119
+ "input_hint": "Cole o endereço ou o código iframe do menu Compartilhar ou Incorporar do site.",
120
+ "keep_ratio": "Manter proporção",
121
+ "lazy": "Carregar ao rolar até ele",
60
122
  "name": "Nome",
61
- "src": "Fonte",
62
- "src_invalid": "A entrada não é uma URL válida",
63
- "title": "Título",
123
+ "parsed_allow": "permissões",
124
+ "parsed_fullscreen": "tela cheia",
125
+ "parsed_loading": "carregamento lento",
126
+ "parsed_name": "nome",
127
+ "parsed_sandbox": "sandbox",
128
+ "parsed_size": "tamanho {width} × {height}",
129
+ "parsed_src": "endereço",
130
+ "parsed_title": "título",
131
+ "preview": "Pré-visualização da incorporação",
132
+ "preview_empty": "A pré-visualização aparece quando o endereço for válido.",
133
+ "sandbox": "Sandbox",
134
+ "sandbox_hint": "Vazio: sem restrições. Por exemplo: allow-scripts allow-same-origin",
135
+ "size": "Tamanho",
136
+ "size_custom": "Personalizado",
137
+ "size_invalid": "Informe o tamanho em pixels.",
138
+ "size_responsive": "Responsivo",
139
+ "size_responsive_hint": "Ocupa a largura do texto na proporção {ratio}.",
140
+ "src_invalid": "Uma incorporação precisa de um endereço web que comece com https:// ou http://.",
141
+ "src_protocol": "Adicione o protocolo ao endereço: https:// ou http://.",
142
+ "src_required": "Cole um link ou um código de incorporação.",
143
+ "title_edit": "Editar incorporação",
144
+ "title_insert": "Incorporar conteúdo",
145
+ "title_missing": "Os leitores de tela anunciam a incorporação pelo título. Descreva o que ela mostra.",
146
+ "title_text": "Título para leitores de tela",
64
147
  "width": "Largura"
65
148
  },
66
149
  "image": {
67
- "alt": "Texto alternativo",
150
+ "alt_missing": "Leitores de tela e mecanismos de busca não conseguem ler uma imagem sem texto alternativo.",
151
+ "alt_text": "Texto alternativo para leitores de tela",
152
+ "apply_error": "Não foi possível salvar a imagem aqui.",
68
153
  "caption": "Legenda",
69
154
  "caption_placeholder": "Adicione uma legenda…",
70
- "dialog_title": "Adicionar/editar imagem",
71
155
  "height": "Altura",
72
156
  "keep_ratio": "Manter proporção",
157
+ "original_size": "Original {width} × {height}",
158
+ "position": "Posição",
159
+ "position_center": "Centro",
160
+ "position_left": "Esquerda",
161
+ "position_right": "Direita",
162
+ "remove_error": "Não foi possível remover a imagem.",
163
+ "size": "Tamanho",
164
+ "size_custom": "Personalizado",
165
+ "size_original": "Original",
166
+ "size_text": "Largura do texto",
167
+ "source_upload": "Enviar",
168
+ "source_url": "Por URL",
73
169
  "src": "Fonte",
74
- "title": "Adicionar/editar imagem",
170
+ "title_edit": "Editar imagem",
171
+ "title_insert": "Inserir imagem",
172
+ "upload_cancel": "Cancelar envio",
173
+ "upload_error": "Não foi possível enviar a imagem.",
174
+ "upload_file": "Arquivo de imagem",
75
175
  "width": "Largura"
76
176
  },
177
+ "insert": "Inserir",
77
178
  "link": {
179
+ "advanced": "Avançado",
180
+ "apply_error": "Não foi possível aplicar o link.",
78
181
  "class": "Classe CSS",
79
182
  "href": "Endereço do link",
80
- "href_error": "Endereço de link inválido",
81
- "rel": "Rel",
82
- "target": "Abrir em...",
83
- "target_blank": "Nova janela",
84
- "target_self": "Janela atual",
85
- "title": "Adicionar/editar link"
183
+ "href_invalid": "Digite um endereço de link, por exemplo https://example.com, #âncora ou /página.",
184
+ "new_tab": "Abrir em uma nova aba",
185
+ "protocol_missing": "Sem protocolo. Adicionar:",
186
+ "rel": "Atributos rel",
187
+ "rel_hint": "Qualquer valor: Enter, espaço ou vírgula o adiciona.",
188
+ "rel_new_tab_hint": "Um link que abre em uma nova aba também recebe noopener e noreferrer.",
189
+ "remove": "Remover link",
190
+ "text": "Texto",
191
+ "text_hint": "Deixe vazio para usar o endereço como texto.",
192
+ "title_edit": "Editar link",
193
+ "title_insert": "Inserir link"
194
+ },
195
+ "linkCard": {
196
+ "apply_failed": "Não é possível inserir o cartão aqui.",
197
+ "description": "Descrição",
198
+ "display": "Exibir como",
199
+ "display_card": "Cartão",
200
+ "display_link": "Link",
201
+ "fetch_failed": "Não foi possível carregar os dados da página: {error}. Você pode preencher os campos manualmente.",
202
+ "href_invalid": "Digite o endereço completo de uma página, por exemplo https://example.com/page.",
203
+ "image": "Imagem",
204
+ "image_choose": "Escolher imagem",
205
+ "image_failed": "Não foi possível enviar a imagem. Tente novamente.",
206
+ "image_remove": "Remover imagem",
207
+ "image_replace": "Substituir",
208
+ "layout": "Exibição",
209
+ "layout_compact": "Compacto",
210
+ "layout_large": "Grande",
211
+ "layout_text": "Sem imagem",
212
+ "loading": "Carregando os dados da página…",
213
+ "page_title": "Título",
214
+ "paste_dismiss": "Manter o link",
215
+ "paste_error": "Sem prévia para esta página.",
216
+ "protocol_missing": "Comece o endereço com https:// ou http://.",
217
+ "refresh": "Atualizar dados",
218
+ "site_name": "Nome do site",
219
+ "title_edit": "Editar cartão de link",
220
+ "title_insert": "Inserir cartão de link"
86
221
  },
87
222
  "preview": {
88
223
  "title": "Pré-visualização"
89
224
  },
225
+ "remove": "Remover",
226
+ "save": "Salvar",
90
227
  "source": {
91
228
  "prettify": "Formatar",
92
229
  "title": "Ver código-fonte"
93
230
  },
94
231
  "video": {
232
+ "apply_failed": "Não é possível inserir o vídeo aqui.",
233
+ "autoplay": "Reprodução automática sem som",
234
+ "controls": "Mostrar controles",
95
235
  "height": "Altura",
96
- "src": "Fonte",
97
- "title": "Adicionar/editar vídeo",
236
+ "keep_ratio": "Manter proporção",
237
+ "loop": "Repetir",
238
+ "poster": "Capa",
239
+ "poster_choose": "Escolher imagem",
240
+ "poster_hint": "Opcional. Exibida até o vídeo começar.",
241
+ "poster_url": "URL da imagem de capa",
242
+ "preview": "Prévia do vídeo",
243
+ "preview_empty": "A prévia aparece quando o link é reconhecido.",
244
+ "size": "Tamanho",
245
+ "size_custom": "Personalizado",
246
+ "size_invalid": "Digite o tamanho em pixels.",
247
+ "size_responsive": "Responsivo",
248
+ "size_responsive_embed": "Responsivo 16:9",
249
+ "source_upload": "Enviar",
250
+ "source_url": "Por URL",
251
+ "start": "Começar em",
252
+ "start_invalid": "Digite o tempo no formato m:ss ou h:mm:ss.",
253
+ "title_edit": "Editar vídeo",
254
+ "title_insert": "Inserir vídeo",
255
+ "upload_choose": "Escolher um arquivo de vídeo",
256
+ "upload_failed": "Não foi possível enviar o arquivo. Tente novamente.",
257
+ "upload_progress": "{loaded} de {total} MB",
258
+ "upload_replace": "Substituir",
259
+ "url": "Link do vídeo",
260
+ "url_file_protocol": "Adicione o protocolo ao link do arquivo: https:// ou http://.",
261
+ "url_required": "Cole um link do YouTube, do Vimeo ou de um arquivo de vídeo.",
262
+ "url_unsupported": "Use um link do YouTube ou do Vimeo, ou um link para um arquivo de vídeo (.mp4, .webm, .ogg, .mov). Para outros sites, use o código de incorporação.",
98
263
  "width": "Largura"
99
264
  }
100
265
  },
@@ -171,7 +336,7 @@
171
336
  "search": "Buscar emojis...",
172
337
  "title": "Emoji"
173
338
  },
174
- "iframe": "iframe",
339
+ "iframe": "Incorporação",
175
340
  "image": "Imagem",
176
341
  "image_toolbar": {
177
342
  "align_left": "Align left",
@@ -213,9 +378,47 @@
213
378
  "style": {
214
379
  "color": {
215
380
  "custom": "Cor personalizada",
381
+ "default": "Padrão",
382
+ "eyedropper": "Capturar uma cor da tela",
383
+ "hex": "Cor hexadecimal",
384
+ "hex_invalid": "Digite uma cor no formato #rgb ou #rrggbb.",
216
385
  "highlight": "Cor de destaque",
217
- "text": "Cor do texto",
218
- "unset": "Redefinir cor"
386
+ "names": {
387
+ "amber": "Âmbar",
388
+ "black": "Preto",
389
+ "blue": "Azul",
390
+ "dark_amber": "Âmbar escuro",
391
+ "dark_blue": "Azul escuro",
392
+ "dark_green": "Verde escuro",
393
+ "dark_grey": "Cinza escuro",
394
+ "dark_orange": "Laranja escuro",
395
+ "dark_pink": "Rosa escuro",
396
+ "dark_purple": "Roxo escuro",
397
+ "dark_red": "Vermelho escuro",
398
+ "dark_teal": "Verde-azulado escuro",
399
+ "green": "Verde",
400
+ "grey": "Cinza",
401
+ "light_amber": "Âmbar claro",
402
+ "light_blue": "Azul claro",
403
+ "light_green": "Verde claro",
404
+ "light_grey": "Cinza claro",
405
+ "light_orange": "Laranja claro",
406
+ "light_pink": "Rosa claro",
407
+ "light_purple": "Roxo claro",
408
+ "light_red": "Vermelho claro",
409
+ "light_teal": "Verde-azulado claro",
410
+ "medium_grey": "Cinza médio",
411
+ "orange": "Laranja",
412
+ "pale_grey": "Cinza pálido",
413
+ "pink": "Rosa",
414
+ "purple": "Roxo",
415
+ "red": "Vermelho",
416
+ "teal": "Verde-azulado",
417
+ "white": "Branco"
418
+ },
419
+ "no_highlight": "Sem destaque",
420
+ "recent": "Recentes",
421
+ "text": "Cor do texto"
219
422
  },
220
423
  "fontFamily": "Família da fonte",
221
424
  "fontSize": "Tamanho da fonte",
@@ -4,7 +4,20 @@
4
4
  "undo": "Desfazer"
5
5
  },
6
6
  "ai": {
7
+ "another_version": "Outra versão",
7
8
  "append": "Adicionar ao final",
9
+ "change_vs_original": "{percent} face ao original",
10
+ "changes": "Alterações",
11
+ "context": {
12
+ "characters": "{n} carácter | {n} caracteres",
13
+ "cursor": "Na posição do cursor",
14
+ "document": "Todo o texto",
15
+ "excerpt": "«{text}»",
16
+ "paragraphs": "{n} parágrafo | {n} parágrafos",
17
+ "selection": "Selecionado: {paragraphs}, {characters}"
18
+ },
19
+ "copied": "Copiado",
20
+ "copy": "Copiar",
8
21
  "defaultExamples": {
9
22
  "expand": {
10
23
  "prompt": "Expanda este texto em uma versão mais detalhada.",
@@ -23,19 +36,58 @@
23
36
  "title": "Resumir"
24
37
  }
25
38
  },
39
+ "effort_label": {
40
+ "default": "Esforço: predefinido",
41
+ "high": "Esforço: alto",
42
+ "low": "Esforço: baixo",
43
+ "max": "Esforço: máximo",
44
+ "medium": "Esforço: médio",
45
+ "xhigh": "Esforço: muito alto"
46
+ },
47
+ "effort_levels": {
48
+ "default": "Predefinido",
49
+ "high": "Alto",
50
+ "low": "Baixo",
51
+ "max": "Máximo",
52
+ "medium": "Médio",
53
+ "xhigh": "Muito alto"
54
+ },
26
55
  "error": "Falha na geração de IA",
56
+ "errors": {
57
+ "auth": "O serviço de IA recusou o pedido: verifique a chave de API ou as permissões de acesso.",
58
+ "network": "Não foi possível contactar o serviço de IA. Verifique se está em execução e se permite pedidos desta página (CORS): a consola do navegador indica a causa.",
59
+ "not_found": "O endereço do serviço de IA não foi encontrado: verifique o caminho do endpoint.",
60
+ "rate_limit": "Demasiados pedidos ao serviço de IA. Aguarde um momento e tente novamente.",
61
+ "request": "O serviço de IA não conseguiu processar o pedido.",
62
+ "service_says": "Resposta do serviço:",
63
+ "timeout": "O serviço de IA não respondeu a tempo. Tente novamente.",
64
+ "unavailable": "O serviço de IA está indisponível: pode estar a carregar um modelo ou ocupado. Tente mais tarde."
65
+ },
27
66
  "generate": "Gerar",
28
67
  "insert": "Inserir",
29
- "limit_exceeded": "O resultado excede o limite de caracteres do editor. Encurte o texto e aplique novamente.",
68
+ "insert_below": "Inserir abaixo",
69
+ "limit_exceeded": "O resultado excede o limite de caracteres do editor. Peça uma versão mais curta.",
30
70
  "loading": "Gerando...",
31
71
  "prompt": "Solicitação",
72
+ "prompt_placeholder": "Peça para escrever ou editar o texto",
32
73
  "quick_prompts": "Solicitações rápidas",
33
74
  "reasoning_effort": "Nível de raciocínio",
34
- "replace": "Substituir",
75
+ "replace_selection": "Substituir seleção",
35
76
  "result": "Resultado",
77
+ "send_hint": "Enter — enviar",
36
78
  "stop": "Parar",
37
79
  "thinking": "Raciocínio",
38
- "title": "Escrita com IA",
80
+ "thinking_label": {
81
+ "off": "Raciocínio: desativado",
82
+ "on": "Raciocínio: ativado"
83
+ },
84
+ "thinking_now": "A pensar…",
85
+ "thinking_states": {
86
+ "off": "Desativado",
87
+ "on": "Ativado"
88
+ },
89
+ "thought_for": "Pensou durante {seconds} s",
90
+ "title": "Assistente",
39
91
  "unavailable": "Configure um provedor de IA para usar esta ação"
40
92
  },
41
93
  "alignment": "Alinhamento",
@@ -51,50 +103,163 @@
51
103
  "defaultValue": "Valor padrão",
52
104
  "dialog": {
53
105
  "apply": "Aplicar",
106
+ "cancel": "Cancelar",
54
107
  "clear": "Limpar",
55
108
  "close": "Fechar",
56
109
  "iframe": {
57
- "dialog_title": "Adicionar/editar iframe",
58
- "frameborder": "Borda do quadro",
110
+ "advanced": "Avançado",
111
+ "allow": "Permissões (allow)",
112
+ "allow_hint": "Por exemplo: autoplay; fullscreen; clipboard-write",
113
+ "apply_failed": "Não é possível inserir a incorporação aqui.",
114
+ "border": "Mostrar contorno",
115
+ "code_invalid": "Cole o código de um único iframe com um endereço. Códigos com scripts ou outras etiquetas não são suportados.",
116
+ "code_parsed": "Código reconhecido: {fields}.",
59
117
  "height": "Altura",
118
+ "input": "Link ou código de incorporação",
119
+ "input_hint": "Cole o endereço ou o código iframe do menu Partilhar ou Incorporar do site.",
120
+ "keep_ratio": "Manter proporção",
121
+ "lazy": "Carregar ao chegar à área visível",
60
122
  "name": "Nome",
61
- "src": "Fonte",
62
- "src_invalid": "A URL inserida é inválida",
63
- "title": "Título",
123
+ "parsed_allow": "permissões",
124
+ "parsed_fullscreen": "ecrã inteiro",
125
+ "parsed_loading": "carregamento diferido",
126
+ "parsed_name": "nome",
127
+ "parsed_sandbox": "sandbox",
128
+ "parsed_size": "tamanho {width} × {height}",
129
+ "parsed_src": "endereço",
130
+ "parsed_title": "título",
131
+ "preview": "Pré-visualização da incorporação",
132
+ "preview_empty": "A pré-visualização aparece quando o endereço for válido.",
133
+ "sandbox": "Sandbox",
134
+ "sandbox_hint": "Vazio: sem restrições. Por exemplo: allow-scripts allow-same-origin",
135
+ "size": "Tamanho",
136
+ "size_custom": "Personalizado",
137
+ "size_invalid": "Indique o tamanho em píxeis.",
138
+ "size_responsive": "Adaptável",
139
+ "size_responsive_hint": "Ocupa a largura do texto na proporção {ratio}.",
140
+ "src_invalid": "Uma incorporação precisa de um endereço web que comece por https:// ou http://.",
141
+ "src_protocol": "Adicione o protocolo ao endereço: https:// ou http://.",
142
+ "src_required": "Cole um link ou um código de incorporação.",
143
+ "title_edit": "Editar incorporação",
144
+ "title_insert": "Incorporar conteúdo",
145
+ "title_missing": "Os leitores de ecrã anunciam a incorporação pelo título. Descreva o que mostra.",
146
+ "title_text": "Título para leitores de ecrã",
64
147
  "width": "Largura"
65
148
  },
66
149
  "image": {
67
- "alt": "alt",
150
+ "alt_missing": "Os leitores de ecrã e os motores de pesquisa não conseguem ler uma imagem sem texto alternativo.",
151
+ "alt_text": "Texto alternativo para leitores de ecrã",
152
+ "apply_error": "Não foi possível guardar a imagem aqui.",
68
153
  "caption": "Legenda",
69
154
  "caption_placeholder": "Adicione uma legenda…",
70
- "dialog_title": "Adicionar/modificar imagem",
71
155
  "height": "Altura",
72
156
  "keep_ratio": "Manter proporção",
157
+ "original_size": "Original {width} × {height}",
158
+ "position": "Posição",
159
+ "position_center": "Centro",
160
+ "position_left": "Esquerda",
161
+ "position_right": "Direita",
162
+ "remove_error": "Não foi possível remover a imagem.",
163
+ "size": "Tamanho",
164
+ "size_custom": "Personalizado",
165
+ "size_original": "Original",
166
+ "size_text": "Largura do texto",
167
+ "source_upload": "Carregar",
168
+ "source_url": "Por URL",
73
169
  "src": "Fonte",
74
- "title": "Título",
170
+ "title_edit": "Editar imagem",
171
+ "title_insert": "Inserir imagem",
172
+ "upload_cancel": "Cancelar carregamento",
173
+ "upload_error": "Não foi possível carregar a imagem.",
174
+ "upload_file": "Ficheiro de imagem",
75
175
  "width": "Largura"
76
176
  },
177
+ "insert": "Inserir",
77
178
  "link": {
179
+ "advanced": "Avançado",
180
+ "apply_error": "Não foi possível aplicar o link.",
78
181
  "class": "Classe CSS",
79
182
  "href": "Endereço do link",
80
- "href_error": "Endereço de link incorreto",
81
- "rel": "rel",
82
- "target": "Abrir em...",
83
- "target_blank": "Nova janela",
84
- "target_self": "Janela atual",
85
- "title": "Adicionar/modificar link"
183
+ "href_invalid": "Introduza um endereço de ligação, por exemplo https://example.com, #âncora ou /página.",
184
+ "new_tab": "Abrir num novo separador",
185
+ "protocol_missing": "Sem protocolo. Adicionar:",
186
+ "rel": "Atributos rel",
187
+ "rel_hint": "Qualquer valor: Enter, espaço ou vírgula adiciona-o.",
188
+ "rel_new_tab_hint": "Um link que abre num novo separador também recebe noopener e noreferrer.",
189
+ "remove": "Remover link",
190
+ "text": "Texto",
191
+ "text_hint": "Deixe vazio para usar o endereço como texto.",
192
+ "title_edit": "Editar link",
193
+ "title_insert": "Inserir link"
194
+ },
195
+ "linkCard": {
196
+ "apply_failed": "Não é possível inserir o cartão aqui.",
197
+ "description": "Descrição",
198
+ "display": "Mostrar como",
199
+ "display_card": "Cartão",
200
+ "display_link": "Link",
201
+ "fetch_failed": "Não foi possível carregar os dados da página: {error}. Pode preencher os campos manualmente.",
202
+ "href_invalid": "Introduza o endereço completo de uma página, por exemplo https://example.com/page.",
203
+ "image": "Imagem",
204
+ "image_choose": "Escolher imagem",
205
+ "image_failed": "Não foi possível carregar a imagem. Tente novamente.",
206
+ "image_remove": "Remover imagem",
207
+ "image_replace": "Substituir",
208
+ "layout": "Apresentação",
209
+ "layout_compact": "Compacto",
210
+ "layout_large": "Grande",
211
+ "layout_text": "Sem imagem",
212
+ "loading": "A carregar os dados da página…",
213
+ "page_title": "Título",
214
+ "paste_dismiss": "Manter o link",
215
+ "paste_error": "Sem pré-visualização para esta página.",
216
+ "protocol_missing": "Comece o endereço com https:// ou http://.",
217
+ "refresh": "Atualizar dados",
218
+ "site_name": "Nome do site",
219
+ "title_edit": "Editar cartão de link",
220
+ "title_insert": "Inserir cartão de link"
86
221
  },
87
222
  "preview": {
88
223
  "title": "Visualização"
89
224
  },
225
+ "remove": "Remover",
226
+ "save": "Guardar",
90
227
  "source": {
91
228
  "prettify": "prettify",
92
229
  "title": "Ver código fonte"
93
230
  },
94
231
  "video": {
232
+ "apply_failed": "Não é possível inserir o vídeo aqui.",
233
+ "autoplay": "Reprodução automática sem som",
234
+ "controls": "Mostrar controlos",
95
235
  "height": "Altura",
96
- "src": "Fonte",
97
- "title": "Adicionar/editar vídeo",
236
+ "keep_ratio": "Manter proporção",
237
+ "loop": "Repetir",
238
+ "poster": "Capa",
239
+ "poster_choose": "Escolher imagem",
240
+ "poster_hint": "Opcional. Mostrada até o vídeo começar.",
241
+ "poster_url": "URL da imagem de capa",
242
+ "preview": "Pré-visualização do vídeo",
243
+ "preview_empty": "A pré-visualização aparece quando o link for reconhecido.",
244
+ "size": "Tamanho",
245
+ "size_custom": "Personalizado",
246
+ "size_invalid": "Introduza o tamanho em píxeis.",
247
+ "size_responsive": "Adaptável",
248
+ "size_responsive_embed": "Adaptável 16:9",
249
+ "source_upload": "Carregar",
250
+ "source_url": "Por URL",
251
+ "start": "Começar em",
252
+ "start_invalid": "Introduza o tempo no formato m:ss ou h:mm:ss.",
253
+ "title_edit": "Editar vídeo",
254
+ "title_insert": "Inserir vídeo",
255
+ "upload_choose": "Escolher um ficheiro de vídeo",
256
+ "upload_failed": "Não foi possível carregar o ficheiro. Tente novamente.",
257
+ "upload_progress": "{loaded} de {total} MB",
258
+ "upload_replace": "Substituir",
259
+ "url": "Link do vídeo",
260
+ "url_file_protocol": "Adicione o protocolo à ligação do ficheiro: https:// ou http://.",
261
+ "url_required": "Cole uma ligação do YouTube, do Vimeo ou de um ficheiro de vídeo.",
262
+ "url_unsupported": "Use uma ligação do YouTube ou do Vimeo, ou uma ligação para um ficheiro de vídeo (.mp4, .webm, .ogg, .mov). Para outros sites, use o código de incorporação.",
98
263
  "width": "Largura"
99
264
  }
100
265
  },
@@ -171,7 +336,7 @@
171
336
  "search": "Pesquisar emoji...",
172
337
  "title": "Emoji"
173
338
  },
174
- "iframe": "iframe",
339
+ "iframe": "Incorporação",
175
340
  "image": "Imagem",
176
341
  "image_toolbar": {
177
342
  "align_left": "Align left",
@@ -212,10 +377,48 @@
212
377
  },
213
378
  "style": {
214
379
  "color": {
215
- "custom": "Seleção personalizada",
380
+ "custom": "Cor personalizada",
381
+ "default": "Predefinição",
382
+ "eyedropper": "Recolher uma cor do ecrã",
383
+ "hex": "Cor hexadecimal",
384
+ "hex_invalid": "Introduza uma cor no formato #rgb ou #rrggbb.",
216
385
  "highlight": "Cor de destaque",
217
- "text": "Cor do texto",
218
- "unset": "Limpar cor"
386
+ "names": {
387
+ "amber": "Âmbar",
388
+ "black": "Preto",
389
+ "blue": "Azul",
390
+ "dark_amber": "Âmbar escuro",
391
+ "dark_blue": "Azul escuro",
392
+ "dark_green": "Verde escuro",
393
+ "dark_grey": "Cinzento escuro",
394
+ "dark_orange": "Laranja escuro",
395
+ "dark_pink": "Rosa escuro",
396
+ "dark_purple": "Roxo escuro",
397
+ "dark_red": "Vermelho escuro",
398
+ "dark_teal": "Verde-azulado escuro",
399
+ "green": "Verde",
400
+ "grey": "Cinzento",
401
+ "light_amber": "Âmbar claro",
402
+ "light_blue": "Azul claro",
403
+ "light_green": "Verde claro",
404
+ "light_grey": "Cinzento claro",
405
+ "light_orange": "Laranja claro",
406
+ "light_pink": "Rosa claro",
407
+ "light_purple": "Roxo claro",
408
+ "light_red": "Vermelho claro",
409
+ "light_teal": "Verde-azulado claro",
410
+ "medium_grey": "Cinzento médio",
411
+ "orange": "Laranja",
412
+ "pale_grey": "Cinzento pálido",
413
+ "pink": "Rosa",
414
+ "purple": "Roxo",
415
+ "red": "Vermelho",
416
+ "teal": "Verde-azulado",
417
+ "white": "Branco"
418
+ },
419
+ "no_highlight": "Sem destaque",
420
+ "recent": "Recentes",
421
+ "text": "Cor do texto"
219
422
  },
220
423
  "fontFamily": "Fonte",
221
424
  "fontSize": "Tamanho",