@blocknote/core 0.34.0 → 0.36.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 (59) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +7 -25
  3. package/dist/blocknote.cjs +8 -8
  4. package/dist/blocknote.cjs.map +1 -1
  5. package/dist/blocknote.js +1164 -1082
  6. package/dist/blocknote.js.map +1 -1
  7. package/dist/{en-Dx9fwHD4.js → en-CvDoFvhc.js} +4 -1
  8. package/dist/en-CvDoFvhc.js.map +1 -0
  9. package/dist/{en-CsgPjHa4.cjs → en-ub2yVBX0.cjs} +2 -2
  10. package/dist/en-ub2yVBX0.cjs.map +1 -0
  11. package/dist/locales.cjs +1 -1
  12. package/dist/locales.cjs.map +1 -1
  13. package/dist/locales.js +62 -2
  14. package/dist/locales.js.map +1 -1
  15. package/dist/style.css +1 -1
  16. package/dist/tsconfig.tsbuildinfo +1 -1
  17. package/dist/webpack-stats.json +1 -1
  18. package/package.json +17 -17
  19. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +132 -4
  20. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +12 -1
  21. package/src/api/clipboard/toClipboard/copyExtension.ts +2 -0
  22. package/src/api/nodeUtil.ts +5 -1
  23. package/src/blocks/ImageBlockContent/parseImageElement.ts +2 -1
  24. package/src/blocks/QuoteBlockContent/QuoteBlockContent.ts +23 -1
  25. package/src/blocks/ToggleWrapper/createToggleWrapper.ts +2 -1
  26. package/src/editor/BlockNoteEditor.ts +79 -29
  27. package/src/editor/editor.css +8 -17
  28. package/src/extensions/Collaboration/ForkYDocPlugin.ts +1 -1
  29. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +57 -1
  30. package/src/extensions/SideMenu/SideMenuPlugin.ts +12 -23
  31. package/src/i18n/locales/ar.ts +3 -0
  32. package/src/i18n/locales/de.ts +4 -0
  33. package/src/i18n/locales/en.ts +3 -0
  34. package/src/i18n/locales/es.ts +3 -0
  35. package/src/i18n/locales/fr.ts +3 -0
  36. package/src/i18n/locales/he.ts +3 -0
  37. package/src/i18n/locales/hr.ts +3 -0
  38. package/src/i18n/locales/is.ts +3 -0
  39. package/src/i18n/locales/it.ts +3 -0
  40. package/src/i18n/locales/ja.ts +3 -0
  41. package/src/i18n/locales/ko.ts +4 -1
  42. package/src/i18n/locales/nl.ts +3 -0
  43. package/src/i18n/locales/no.ts +3 -0
  44. package/src/i18n/locales/pl.ts +4 -0
  45. package/src/i18n/locales/pt.ts +3 -0
  46. package/src/i18n/locales/ru.ts +3 -0
  47. package/src/i18n/locales/sk.ts +3 -0
  48. package/src/i18n/locales/uk.ts +3 -0
  49. package/src/i18n/locales/vi.ts +3 -0
  50. package/src/i18n/locales/zh-tw.ts +3 -0
  51. package/src/i18n/locales/zh.ts +3 -0
  52. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.d.ts +16 -3
  53. package/types/src/api/nodeUtil.d.ts +5 -1
  54. package/types/src/blocks/ImageBlockContent/parseImageElement.d.ts +1 -0
  55. package/types/src/editor/BlockNoteEditor.d.ts +79 -29
  56. package/types/src/i18n/locales/en.d.ts +3 -0
  57. package/types/src/i18n/locales/sk.d.ts +3 -0
  58. package/dist/en-CsgPjHa4.cjs.map +0 -1
  59. package/dist/en-Dx9fwHD4.js.map +0 -1
@@ -156,8 +156,11 @@ export type BlockNoteEditorOptions<
156
156
 
157
157
  /**
158
158
  * When enabled, allows for collaboration between multiple users.
159
+ * See [Real-time Collaboration](https://www.blocknotejs.org/docs/advanced/real-time-collaboration) for more info.
160
+ *
161
+ * @remarks `CollaborationOptions`
159
162
  */
160
- collaboration: {
163
+ collaboration?: {
161
164
  /**
162
165
  * The Yjs XML fragment that's used for collaboration.
163
166
  */
@@ -191,7 +194,13 @@ export type BlockNoteEditorOptions<
191
194
  */
192
195
  codeBlock?: CodeBlockOptions;
193
196
 
194
- comments: {
197
+ /**
198
+ * Configuration for the comments feature, requires a `threadStore`.
199
+ *
200
+ * See [Comments](https://www.blocknotejs.org/docs/features/collaboration/comments) for more info.
201
+ * @remarks `CommentsOptions`
202
+ */
203
+ comments?: {
195
204
  threadStore: ThreadStore;
196
205
  };
197
206
 
@@ -200,25 +209,38 @@ export type BlockNoteEditorOptions<
200
209
  *
201
210
  * @default true
202
211
  */
203
- defaultStyles: boolean;
212
+ defaultStyles?: boolean;
204
213
 
205
214
  /**
206
215
  * A dictionary object containing translations for the editor.
216
+ *
217
+ * See [Localization / i18n](https://www.blocknotejs.org/docs/advanced/localization) for more info.
218
+ *
219
+ * @remarks `Dictionary` is a type that contains all the translations for the editor.
207
220
  */
208
221
  dictionary?: Dictionary & Record<string, any>;
209
222
 
210
223
  /**
211
224
  * Disable internal extensions (based on keys / extension name)
225
+ *
226
+ * @note Advanced
212
227
  */
213
- disableExtensions: string[];
228
+ disableExtensions?: string[];
214
229
 
215
230
  /**
216
231
  * An object containing attributes that should be added to HTML elements of the editor.
217
232
  *
233
+ * See [Adding DOM Attributes](https://www.blocknotejs.org/docs/theming#adding-dom-attributes) for more info.
234
+ *
218
235
  * @example { editor: { class: "my-editor-class" } }
236
+ * @remarks `Record<string, Record<string, string>>`
219
237
  */
220
- domAttributes: Partial<BlockNoteDOMAttributes>;
238
+ domAttributes?: Partial<BlockNoteDOMAttributes>;
221
239
 
240
+ /**
241
+ * A replacement indicator to use when dragging and dropping blocks. Uses the [ProseMirror drop cursor](https://github.com/ProseMirror/prosemirror-dropcursor), or a modified version when [Column Blocks](https://www.blocknotejs.org/docs/document-structure#column-blocks) are enabled.
242
+ * @remarks `() => Plugin`
243
+ */
222
244
  dropCursor?: (opts: {
223
245
  editor: BlockNoteEditor<
224
246
  NoInfer<BSchema>,
@@ -243,9 +265,13 @@ export type BlockNoteEditorOptions<
243
265
  };
244
266
 
245
267
  /**
246
- * The content that should be in the editor when it's created, represented as an array of partial block objects.
268
+ * The content that should be in the editor when it's created, represented as an array of {@link PartialBlock} objects.
269
+ *
270
+ * See [Partial Blocks](https://www.blocknotejs.org/docs/editor-api/manipulating-blocks#partial-blocks) for more info.
271
+ *
272
+ * @remarks `PartialBlock[]`
247
273
  */
248
- initialContent: PartialBlock<
274
+ initialContent?: PartialBlock<
249
275
  NoInfer<BSchema>,
250
276
  NoInfer<ISchema>,
251
277
  NoInfer<SSchema>
@@ -253,14 +279,19 @@ export type BlockNoteEditorOptions<
253
279
 
254
280
  /**
255
281
  * @deprecated, provide placeholders via dictionary instead
282
+ * @internal
256
283
  */
257
- placeholders: Record<
284
+ placeholders?: Record<
258
285
  string | "default" | "emptyDocument",
259
286
  string | undefined
260
287
  >;
261
288
 
262
289
  /**
263
290
  * Custom paste handler that can be used to override the default paste behavior.
291
+ *
292
+ * See [Paste Handling](https://www.blocknotejs.org/docs/advanced/paste-handling) for more info.
293
+ *
294
+ * @remarks `PasteHandler`
264
295
  * @returns The function should return `true` if the paste event was handled, otherwise it should return `false` if it should be canceled or `undefined` if it should be handled by another handler.
265
296
  *
266
297
  * @example
@@ -297,10 +328,21 @@ export type BlockNoteEditorOptions<
297
328
  * implementing custom protocols / schemes
298
329
  * @returns The URL that's
299
330
  */
300
- resolveFileUrl: (url: string) => Promise<string>;
331
+ resolveFileUrl?: (url: string) => Promise<string>;
301
332
 
302
- resolveUsers: (userIds: string[]) => Promise<User[]>;
333
+ /**
334
+ * Resolve user information for comments.
335
+ *
336
+ * See [Comments](https://www.blocknotejs.org/docs/features/collaboration/comments) for more info.
337
+ */
338
+ resolveUsers?: (userIds: string[]) => Promise<User[]>;
303
339
 
340
+ /**
341
+ * The schema of the editor. The schema defines which Blocks, InlineContent, and Styles are available in the editor.
342
+ *
343
+ * See [Custom Schemas](https://www.blocknotejs.org/docs/custom-schemas) for more info.
344
+ * @remarks `BlockNoteSchema`
345
+ */
304
346
  schema: BlockNoteSchema<BSchema, ISchema, SSchema>;
305
347
 
306
348
  /**
@@ -314,22 +356,19 @@ export type BlockNoteEditorOptions<
314
356
  setIdAttribute?: boolean;
315
357
 
316
358
  /**
317
- Select desired behavior when pressing `Tab` (or `Shift-Tab`). Specifically,
318
- what should happen when a user has selected multiple blocks while a toolbar
319
- is open:
320
- - `"prefer-navigate-ui"`: Change focus to the toolbar. The user needs to
321
- first press `Escape` to close the toolbar, and can then indent multiple
322
- blocks. Better for keyboard accessibility.
323
- - `"prefer-indent"`: Regardless of whether toolbars are open, indent the
324
- selection of blocks. In this case, it's not possible to navigate toolbars
325
- with the keyboard.
326
-
327
- @default "prefer-navigate-ui"
359
+ * Determines behavior when pressing Tab (or Shift-Tab) while multiple blocks are selected and a toolbar is open.
360
+ * - `"prefer-navigate-ui"`: Changes focus to the toolbar. User must press Escape to close toolbar before indenting blocks. Better for keyboard accessibility.
361
+ * - `"prefer-indent"`: Always indents selected blocks, regardless of toolbar state. Keyboard navigation of toolbars not possible.
362
+ * @default "prefer-navigate-ui"
328
363
  */
329
- tabBehavior: "prefer-navigate-ui" | "prefer-indent";
364
+ tabBehavior?: "prefer-navigate-ui" | "prefer-indent";
330
365
 
331
366
  /**
332
367
  * Allows enabling / disabling features of tables.
368
+ *
369
+ * See [Tables](https://www.blocknotejs.org/docs/editor-basics/document-structure#tables) for more info.
370
+ *
371
+ * @remarks `TableConfig`
333
372
  */
334
373
  tables?: {
335
374
  /**
@@ -358,6 +397,11 @@ export type BlockNoteEditorOptions<
358
397
  headers?: boolean;
359
398
  };
360
399
 
400
+ /**
401
+ * An option which user can pass with `false` value to disable the automatic creation of a trailing new block on the next line when the user types or edits any block.
402
+ *
403
+ * @default true
404
+ */
361
405
  trailingBlock?: boolean;
362
406
 
363
407
  /**
@@ -368,23 +412,26 @@ export type BlockNoteEditorOptions<
368
412
  *
369
413
  * @param file The file that should be uploaded.
370
414
  * @returns The URL of the uploaded file OR an object containing props that should be set on the file block (such as an id)
415
+ * @remarks `(file: File) => Promise<UploadFileResult>`
371
416
  */
372
- uploadFile: (
417
+ uploadFile?: (
373
418
  file: File,
374
419
  blockId?: string,
375
420
  ) => Promise<string | Record<string, any>>;
376
421
 
377
422
  /**
378
423
  * additional tiptap options, undocumented
424
+ * @internal
379
425
  */
380
- _tiptapOptions: Partial<EditorOptions>;
426
+ _tiptapOptions?: Partial<EditorOptions>;
381
427
 
382
428
  /**
383
429
  * (experimental) add extra extensions to the editor
384
430
  *
385
431
  * @deprecated, should use `extensions` instead
432
+ * @internal
386
433
  */
387
- _extensions: Record<
434
+ _extensions?: Record<
388
435
  string,
389
436
  | { plugin: Plugin; priority?: number }
390
437
  | ((editor: BlockNoteEditor<any, any, any>) => {
@@ -394,9 +441,11 @@ export type BlockNoteEditorOptions<
394
441
  >;
395
442
 
396
443
  /**
397
- * Register
444
+ * Register extensions to the editor.
445
+ *
446
+ * @internal
398
447
  */
399
- extensions: Array<BlockNoteExtension | BlockNoteExtensionFactory>;
448
+ extensions?: Array<BlockNoteExtension | BlockNoteExtensionFactory>;
400
449
 
401
450
  /**
402
451
  * Boolean indicating whether the editor is in headless mode.
@@ -404,8 +453,9 @@ export type BlockNoteEditorOptions<
404
453
  * but there's no underlying editor (UI) instantiated.
405
454
  *
406
455
  * You probably don't need to set this manually, but use the `server-util` package instead that uses this option internally
456
+ * @internal
407
457
  */
408
- _headless: boolean;
458
+ _headless?: boolean;
409
459
  };
410
460
 
411
461
  const blockNoteTipTapOptions = {
@@ -1600,7 +1650,7 @@ export class BlockNoteEditor<
1600
1650
  /**
1601
1651
  * Registers a callback which will be called before any change is applied to the editor, allowing you to cancel the change.
1602
1652
  */
1603
- public beforeChange(
1653
+ public onBeforeChange(
1604
1654
  /**
1605
1655
  * If the callback returns `false`, the change will be canceled & not applied to the editor.
1606
1656
  */
@@ -148,25 +148,16 @@ Tippy popups that are appended to document.body directly
148
148
  transition: all 0.2s;
149
149
  }
150
150
 
151
- /* .tableWrapper {
152
- padding
153
- } */
154
-
155
151
  .bn-editor [data-content-type="table"] .tableWrapper {
156
- position: relative;
157
- top: -16px;
158
- left: -16px;
159
- /* padding: 16px; */
160
- min-width: calc(100% + 16px);
161
- padding-bottom: 16px;
152
+ /* Size of + buttons to add rows/columns. */
153
+ --bn-table-widget-size: 22px;
154
+ /* Size of table handles, divided by 2 since half the element is in the cell. */
155
+ --bn-table-handle-size: calc(18px / 2);
162
156
  overflow-y: hidden;
163
- }
164
-
165
- .bn-editor [data-content-type="table"] .tableWrapper-inner {
166
- /* position: relative; */
167
- /* top: -16px;
168
- left: -16px; */
169
- padding: 16px;
157
+ padding: var(--bn-table-handle-size) var(--bn-table-widget-size)
158
+ var(--bn-table-widget-size) var(--bn-table-handle-size);
159
+ position: relative;
160
+ width: 100%;
170
161
  }
171
162
 
172
163
  /* table related: */
@@ -101,7 +101,7 @@ export class ForkYDocPlugin extends BlockNoteExtension<{
101
101
  return;
102
102
  }
103
103
 
104
- const originalFragment = this.collaboration.fragment;
104
+ const originalFragment = this.collaboration?.fragment;
105
105
 
106
106
  if (!originalFragment) {
107
107
  throw new Error("No fragment to fork from");
@@ -1,5 +1,11 @@
1
1
  import { isNodeSelection, isTextSelection, posToDOMRect } from "@tiptap/core";
2
- import { EditorState, Plugin, PluginKey, PluginView } from "prosemirror-state";
2
+ import {
3
+ EditorState,
4
+ Plugin,
5
+ PluginKey,
6
+ PluginView,
7
+ TextSelection,
8
+ } from "prosemirror-state";
3
9
  import { EditorView } from "prosemirror-view";
4
10
 
5
11
  import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
@@ -198,6 +204,56 @@ export class FormattingToolbarView implements PluginView {
198
204
  // e.g. the download file button, should still be accessible. Therefore,
199
205
  // logic for hiding when the editor is non-editable is handled
200
206
  // individually in each button.
207
+ const newReferencePos = this.getSelectionBoundingBox();
208
+
209
+ // Workaround to ensure the correct reference position when rendering
210
+ // React components. Without this, e.g. updating styles on React inline
211
+ // content causes the formatting toolbar to be in the wrong place. We
212
+ // know the component has not yet rendered if the reference position has
213
+ // zero dimensions.
214
+ if (
215
+ newReferencePos.x === 0 ||
216
+ newReferencePos.y === 0 ||
217
+ newReferencePos.height === 0
218
+ ) {
219
+ // Updates the reference position again following the render.
220
+ queueMicrotask(() => {
221
+ const nextState = {
222
+ show: true,
223
+ referencePos: this.getSelectionBoundingBox(),
224
+ };
225
+
226
+ this.state = nextState;
227
+ this.emitUpdate();
228
+
229
+ // For some reason, while the selection doesn't actually change and
230
+ // remains correct, it visually appears to be collapsed. This forces
231
+ // a ProseMirror view update, which fixes the issue.
232
+ view.dispatch(
233
+ view.state.tr.setSelection(
234
+ TextSelection.create(
235
+ view.state.doc,
236
+ view.state.selection.from + 1,
237
+ view.state.selection.to,
238
+ ),
239
+ ),
240
+ );
241
+ // 2 separate `dispatch` calls are needed, else ProseMirror realizes
242
+ // that the transaction is a no-op and doesn't update the view.
243
+ view.dispatch(
244
+ view.state.tr.setSelection(
245
+ TextSelection.create(
246
+ view.state.doc,
247
+ view.state.selection.from - 1,
248
+ view.state.selection.to,
249
+ ),
250
+ ),
251
+ );
252
+ });
253
+
254
+ return;
255
+ }
256
+
201
257
  const nextState = {
202
258
  show: true,
203
259
  referencePos: this.getSelectionBoundingBox(),
@@ -242,21 +242,11 @@ export class SideMenuView<
242
242
 
243
243
  this.hoveredBlock = block.node;
244
244
 
245
- // Gets the block's content node, which lets to ignore child blocks when determining the block menu's position.
246
- // TODO: needed?
247
- const blockContent = block.node.firstChild as HTMLElement;
248
-
249
- if (!blockContent) {
250
- return;
251
- }
252
-
253
- // TODO: needed?
254
-
255
245
  // Shows or updates elements.
256
246
  if (this.editor.isEditable) {
257
- const blockContentBoundingBox = blockContent.getBoundingClientRect();
247
+ const blockContentBoundingBox = block.node.getBoundingClientRect();
258
248
  const column = block.node.closest("[data-node-type=column]");
259
- this.updateState({
249
+ this.state = {
260
250
  show: true,
261
251
  referencePos: new DOMRect(
262
252
  column
@@ -275,7 +265,8 @@ export class SideMenuView<
275
265
  block: this.editor.getBlock(
276
266
  this.hoveredBlock!.getAttribute("data-id")!,
277
267
  )!,
278
- });
268
+ };
269
+ this.updateState(this.state);
279
270
  }
280
271
  };
281
272
 
@@ -435,9 +426,9 @@ export class SideMenuView<
435
426
  // We need to check if there is text content that is being dragged (select some text & just drag it)
436
427
  const textContentIsBeingDragged =
437
428
  !event.dataTransfer?.types.includes("blocknote/html") &&
438
- Boolean(this.pmView.dragging);
429
+ !!this.pmView.dragging;
439
430
  // This is the side menu drag from this plugin
440
- const sideMenuIsBeingDragged = Boolean(this.isDragOrigin);
431
+ const sideMenuIsBeingDragged = !!this.isDragOrigin;
441
432
  // Tells us that the current editor instance has a drag ongoing (either text or side menu)
442
433
  const isDragOrigin = textContentIsBeingDragged || sideMenuIsBeingDragged;
443
434
 
@@ -498,21 +489,19 @@ export class SideMenuView<
498
489
  }
499
490
  const { isDropPoint, isDropWithinEditorBounds, isDragOrigin } = context;
500
491
 
501
- if (!isDropWithinEditorBounds) {
492
+ if (!isDropWithinEditorBounds && isDropPoint) {
502
493
  // Any time that the drop event is outside of the editor bounds (but still close to an editor instance)
503
494
  // We dispatch a synthetic event that is in the bounds of the editor instance, to have the correct drop point
504
495
  this.dispatchSyntheticEvent(event);
505
496
  }
506
497
 
507
- if (isDropPoint && isDragOrigin) {
508
- // The current instance is both the drop point and the drag origin
509
- // no-op, normal drop handling will take over
510
- return;
511
- }
512
-
513
498
  if (isDropPoint) {
514
- // The current instance is the drop point, but not the drag origin
499
+ // The current instance is the drop point
515
500
 
501
+ if (this.pmView.dragging) {
502
+ // Do not collapse selection when text content is being dragged
503
+ return;
504
+ }
516
505
  // Because the editor selection is unrelated to the dragged content, we
517
506
  // don't want PM to delete its content. Therefore, we collapse the
518
507
  // selection.
@@ -182,6 +182,9 @@ export const ar: Dictionary = {
182
182
  add_button_text: "إضافة ملف",
183
183
  },
184
184
  },
185
+ toggle_blocks: {
186
+ add_block_button: "تبديل فارغ. انقر لإضافة كتلة.",
187
+ },
185
188
  // from react package:
186
189
  side_menu: {
187
190
  add_block_label: "إضافة محتوي",
@@ -217,6 +217,10 @@ export const de: Dictionary = {
217
217
  add_button_text: "Datei hinzufügen",
218
218
  },
219
219
  },
220
+ toggle_blocks: {
221
+ add_block_button:
222
+ "Leerer aufklappbarer Bereich. Klicken, um einen Block hinzuzufügen.",
223
+ },
220
224
  side_menu: {
221
225
  add_block_label: "Block hinzufügen",
222
226
  drag_handle_label: "Blockmenü öffnen",
@@ -197,6 +197,9 @@ export const en = {
197
197
  add_button_text: "Add file",
198
198
  },
199
199
  },
200
+ toggle_blocks: {
201
+ add_block_button: "Empty toggle. Click to add a block.",
202
+ },
200
203
  // from react package:
201
204
  side_menu: {
202
205
  add_block_label: "Add block",
@@ -197,6 +197,9 @@ export const es: Dictionary = {
197
197
  add_button_text: "Agregar archivo",
198
198
  },
199
199
  },
200
+ toggle_blocks: {
201
+ add_block_button: "Toggle vacío. Haz clic para añadir un bloque.",
202
+ },
200
203
  side_menu: {
201
204
  add_block_label: "Agregar bloque",
202
205
  drag_handle_label: "Abrir menú de bloque",
@@ -243,6 +243,9 @@ export const fr: Dictionary = {
243
243
  add_button_text: "Ajouter un fichier",
244
244
  },
245
245
  },
246
+ toggle_blocks: {
247
+ add_block_button: "Toggle vide. Cliquez pour ajouter un bloc.",
248
+ },
246
249
  // from react package:
247
250
  side_menu: {
248
251
  add_block_label: "Ajouter un bloc",
@@ -199,6 +199,9 @@ export const he: Dictionary = {
199
199
  add_button_text: "הוסף קובץ",
200
200
  },
201
201
  },
202
+ toggle_blocks: {
203
+ add_block_button: "מתג ריק. לחץ כדי להוסיף בלוק.",
204
+ },
202
205
  side_menu: {
203
206
  add_block_label: "הוסף בלוק",
204
207
  drag_handle_label: "פתח תפריט בלוק",
@@ -210,6 +210,9 @@ export const hr: Dictionary = {
210
210
  add_button_text: "Dodaj datoteku",
211
211
  },
212
212
  },
213
+ toggle_blocks: {
214
+ add_block_button: "Prazan sklopivi blok. Klikni da dodaš sadržaj.",
215
+ },
213
216
  // from react package:
214
217
  side_menu: {
215
218
  add_block_label: "Dodaj blok",
@@ -211,6 +211,9 @@ export const is: Dictionary = {
211
211
  add_button_text: "Bæta við skrá",
212
212
  },
213
213
  },
214
+ toggle_blocks: {
215
+ add_block_button: "Tóm fellilína. Smelltu til að bæta við blokk.",
216
+ },
214
217
  side_menu: {
215
218
  add_block_label: "Bæta við blokki",
216
219
  drag_handle_label: "Opna blokkarvalmynd",
@@ -219,6 +219,9 @@ export const it: Dictionary = {
219
219
  add_button_text: "Aggiungi file",
220
220
  },
221
221
  },
222
+ toggle_blocks: {
223
+ add_block_button: "Toggle vuoto. Clicca per aggiungere un blocco.",
224
+ },
222
225
  // from react package:
223
226
  side_menu: {
224
227
  add_block_label: "Aggiungi blocco",
@@ -237,6 +237,9 @@ export const ja: Dictionary = {
237
237
  add_button_text: "ファイルを追加",
238
238
  },
239
239
  },
240
+ toggle_blocks: {
241
+ add_block_button: "空のトグルです。クリックしてブロックを追加。",
242
+ },
240
243
  // from react package:
241
244
  side_menu: {
242
245
  add_block_label: "ブロックを追加",
@@ -42,7 +42,7 @@ export const ko: Dictionary = {
42
42
  title: "접을 수 있는 제목1",
43
43
  subtext: "내용을 표시하거나 숨길 수 있는 섹션 제목(대)",
44
44
  aliases: ["h", "제목1", "h1", "대제목", "접기", "토글"],
45
- group: "제목",
45
+ group: "소제목",
46
46
  },
47
47
  toggle_heading_2: {
48
48
  title: "접을 수 있는 제목2",
@@ -210,6 +210,9 @@ export const ko: Dictionary = {
210
210
  add_button_text: "파일 추가",
211
211
  },
212
212
  },
213
+ toggle_blocks: {
214
+ add_block_button: "비어 있는 토글입니다. 클릭하여 블록을 추가하세요.",
215
+ },
213
216
  // from react package:
214
217
  side_menu: {
215
218
  add_block_label: "블록 추가",
@@ -198,6 +198,9 @@ export const nl: Dictionary = {
198
198
  add_button_text: "Bestand toevoegen",
199
199
  },
200
200
  },
201
+ toggle_blocks: {
202
+ add_block_button: "Lege uitklapper. Klik om een blok toe te voegen.",
203
+ },
201
204
  // from react package:
202
205
  side_menu: {
203
206
  add_block_label: "Nieuw blok",
@@ -216,6 +216,9 @@ export const no: Dictionary = {
216
216
  add_button_text: "Legg til fil",
217
217
  },
218
218
  },
219
+ toggle_blocks: {
220
+ add_block_button: "Tomt toggle. Klikk for å legge til en blokk.",
221
+ },
219
222
  side_menu: {
220
223
  add_block_label: "Legg til blokk",
221
224
  drag_handle_label: "Åpne blokkmeny",
@@ -188,6 +188,10 @@ export const pl: Dictionary = {
188
188
  add_button_text: "Dodaj plik",
189
189
  },
190
190
  },
191
+ toggle_blocks: {
192
+ add_block_button:
193
+ "Brak bloków do rozwinięcia. Kliknij, aby dodać pierwszego.",
194
+ },
191
195
  side_menu: {
192
196
  add_block_label: "Dodaj blok",
193
197
  drag_handle_label: "Otwórz menu bloków",
@@ -189,6 +189,9 @@ export const pt: Dictionary = {
189
189
  add_button_text: "Adicionar arquivo",
190
190
  },
191
191
  },
192
+ toggle_blocks: {
193
+ add_block_button: "Toggle vazio. Clique para adicionar um bloco.",
194
+ },
192
195
  // from react package:
193
196
  side_menu: {
194
197
  add_block_label: "Adicionar bloco",
@@ -240,6 +240,9 @@ export const ru: Dictionary = {
240
240
  add_button_text: "Добавить файл",
241
241
  },
242
242
  },
243
+ toggle_blocks: {
244
+ add_block_button: "Пустой переключатель. Нажмите, чтобы добавить блок.",
245
+ },
243
246
  // from react package:
244
247
  side_menu: {
245
248
  add_block_label: "Добавить блок",
@@ -197,6 +197,9 @@ export const sk = {
197
197
  add_button_text: "Pridať súbor",
198
198
  },
199
199
  },
200
+ toggle_blocks: {
201
+ add_block_button: "Prázdne prepínanie. Kliknite pre pridanie bloku.",
202
+ },
200
203
  side_menu: {
201
204
  add_block_label: "Pridať blok",
202
205
  drag_handle_label: "Otvoriť menu bloku",
@@ -222,6 +222,9 @@ export const uk: Dictionary = {
222
222
  add_button_text: "Додати файл",
223
223
  },
224
224
  },
225
+ toggle_blocks: {
226
+ add_block_button: "Порожній перемикач. Натисніть, щоб додати блок.",
227
+ },
225
228
  // from react package:
226
229
  side_menu: {
227
230
  add_block_label: "Додати блок",
@@ -196,6 +196,9 @@ export const vi: Dictionary = {
196
196
  add_button_text: "Thêm tệp",
197
197
  },
198
198
  },
199
+ toggle_blocks: {
200
+ add_block_button: "Toggle trống. Nhấp để thêm khối.",
201
+ },
199
202
  // từ gói phản ứng:
200
203
  side_menu: {
201
204
  add_block_label: "Thêm khối",
@@ -238,6 +238,9 @@ export const zhTW: Dictionary = {
238
238
  add_button_text: "新增檔案",
239
239
  },
240
240
  },
241
+ toggle_blocks: {
242
+ add_block_button: "空的切換區。點擊新增區塊。",
243
+ },
241
244
  // from react package:
242
245
  side_menu: {
243
246
  add_block_label: "新增區塊",
@@ -238,6 +238,9 @@ export const zh: Dictionary = {
238
238
  add_button_text: "添加文件",
239
239
  },
240
240
  },
241
+ toggle_blocks: {
242
+ add_block_button: "空的切换区。点击添加区块。",
243
+ },
241
244
  // from react package:
242
245
  side_menu: {
243
246
  add_block_label: "添加块",