@mdaemon/html-editor 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2434,7 +2434,7 @@ function isTagRule(rule) {
2434
2434
  function isStyleRule(rule) {
2435
2435
  return rule.style != null;
2436
2436
  }
2437
- class DOMParser {
2437
+ let DOMParser$1 = class DOMParser2 {
2438
2438
  /**
2439
2439
  Create a parser that targets the given schema, using the given
2440
2440
  parsing rules.
@@ -2560,9 +2560,9 @@ class DOMParser {
2560
2560
  [priority](https://prosemirror.net/docs/ref/#model.GenericParseRule.priority).
2561
2561
  */
2562
2562
  static fromSchema(schema) {
2563
- return schema.cached.domParser || (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));
2563
+ return schema.cached.domParser || (schema.cached.domParser = new DOMParser2(schema, DOMParser2.schemaRules(schema)));
2564
2564
  }
2565
- }
2565
+ };
2566
2566
  const blockTags = {
2567
2567
  address: true,
2568
2568
  article: true,
@@ -3623,11 +3623,11 @@ class Step {
3623
3623
  register an ID for your step classes. Try to pick something
3624
3624
  that's unlikely to clash with steps from other modules.
3625
3625
  */
3626
- static jsonID(id, stepClass) {
3627
- if (id in stepsByID)
3628
- throw new RangeError("Duplicate use of step JSON ID " + id);
3629
- stepsByID[id] = stepClass;
3630
- stepClass.prototype.jsonID = id;
3626
+ static jsonID(id2, stepClass) {
3627
+ if (id2 in stepsByID)
3628
+ throw new RangeError("Duplicate use of step JSON ID " + id2);
3629
+ stepsByID[id2] = stepClass;
3630
+ stepClass.prototype.jsonID = id2;
3631
3631
  return stepClass;
3632
3632
  }
3633
3633
  }
@@ -5302,11 +5302,11 @@ class Selection {
5302
5302
  can be disambiguated. Try to pick something that's unlikely to
5303
5303
  clash with classes from other modules.
5304
5304
  */
5305
- static jsonID(id, selectionClass) {
5306
- if (id in classesById)
5307
- throw new RangeError("Duplicate use of selection JSON ID " + id);
5308
- classesById[id] = selectionClass;
5309
- selectionClass.prototype.jsonID = id;
5305
+ static jsonID(id2, selectionClass) {
5306
+ if (id2 in classesById)
5307
+ throw new RangeError("Duplicate use of selection JSON ID " + id2);
5308
+ classesById[id2] = selectionClass;
5309
+ selectionClass.prototype.jsonID = id2;
5310
5310
  return selectionClass;
5311
5311
  }
5312
5312
  /**
@@ -9249,7 +9249,7 @@ function parseFromClipboard(view, text, html, plainText, $context) {
9249
9249
  dom = child;
9250
9250
  }
9251
9251
  if (!slice2) {
9252
- let parser = view.someProp("clipboardParser") || view.someProp("domParser") || DOMParser.fromSchema(view.state.schema);
9252
+ let parser = view.someProp("clipboardParser") || view.someProp("domParser") || DOMParser$1.fromSchema(view.state.schema);
9253
9253
  slice2 = parser.parseSlice(dom, {
9254
9254
  preserveWhitespace: !!(asText || sliceData),
9255
9255
  context: $context,
@@ -11113,7 +11113,7 @@ function parseBetween(view, from_, to_) {
11113
11113
  }
11114
11114
  }
11115
11115
  let startDoc = view.state.doc;
11116
- let parser = view.someProp("domParser") || DOMParser.fromSchema(view.state.schema);
11116
+ let parser = view.someProp("domParser") || DOMParser$1.fromSchema(view.state.schema);
11117
11117
  let $from = startDoc.resolve(from2);
11118
11118
  let sel = null, doc2 = parser.parse(parent, {
11119
11119
  topNode: $from.parent,
@@ -12430,7 +12430,6 @@ function isMarkInSet(marks, type, attributes = {}) {
12430
12430
  return !!findMarkInSet(marks, type, attributes);
12431
12431
  }
12432
12432
  function getMarkRange($pos, type, attributes) {
12433
- var _a;
12434
12433
  if (!$pos || !type) {
12435
12434
  return;
12436
12435
  }
@@ -12441,7 +12440,12 @@ function getMarkRange($pos, type, attributes) {
12441
12440
  if (!start.node || !start.node.marks.some((mark2) => mark2.type === type)) {
12442
12441
  return;
12443
12442
  }
12444
- attributes = attributes || ((_a = start.node.marks[0]) == null ? void 0 : _a.attrs);
12443
+ if (!attributes) {
12444
+ const firstMark = start.node.marks.find((mark2) => mark2.type === type);
12445
+ if (firstMark) {
12446
+ attributes = firstMark.attrs;
12447
+ }
12448
+ }
12445
12449
  const mark = findMarkInSet([...start.node.marks], type, attributes);
12446
12450
  if (!mark) {
12447
12451
  return;
@@ -12472,7 +12476,7 @@ function getMarkType(nameOrType, schema) {
12472
12476
  }
12473
12477
  return nameOrType;
12474
12478
  }
12475
- var extendMarkRange = (typeOrName, attributes = {}) => ({ tr: tr2, state, dispatch }) => {
12479
+ var extendMarkRange = (typeOrName, attributes) => ({ tr: tr2, state, dispatch }) => {
12476
12480
  const type = getMarkType(typeOrName, state.schema);
12477
12481
  const { doc: doc2, selection } = tr2;
12478
12482
  const { $from, from: from2, to } = selection;
@@ -12657,9 +12661,9 @@ function createNodeFromContent(content, schema, options) {
12657
12661
  })
12658
12662
  });
12659
12663
  if (options.slice) {
12660
- DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);
12664
+ DOMParser$1.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);
12661
12665
  } else {
12662
- DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);
12666
+ DOMParser$1.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);
12663
12667
  }
12664
12668
  if (options.errorOnInvalidContent && hasInvalidContent) {
12665
12669
  throw new Error("[tiptap error]: Invalid HTML content", {
@@ -12667,7 +12671,7 @@ function createNodeFromContent(content, schema, options) {
12667
12671
  });
12668
12672
  }
12669
12673
  }
12670
- const parser = DOMParser.fromSchema(schema);
12674
+ const parser = DOMParser$1.fromSchema(schema);
12671
12675
  if (options.slice) {
12672
12676
  return parser.parseSlice(elementFromString(content), options.parseOptions).content;
12673
12677
  }
@@ -12783,7 +12787,7 @@ var insertContentAt = (position, value, options) => ({ tr: tr2, dispatch, editor
12783
12787
  const fromSelectionAtStart = $from.parentOffset === 0;
12784
12788
  const isTextSelection2 = $fromNode.isText || $fromNode.isTextblock;
12785
12789
  const hasContent = $fromNode.content.size > 0;
12786
- if (fromSelectionAtStart && isTextSelection2 && hasContent) {
12790
+ if (fromSelectionAtStart && isTextSelection2 && hasContent && isOnlyBlockContent) {
12787
12791
  from2 = Math.max(0, from2 - 1);
12788
12792
  }
12789
12793
  tr2.replaceWith(from2, to, newContent);
@@ -13226,6 +13230,9 @@ function getAttributesFromExtensions(extensions) {
13226
13230
  keepOnSplit: true,
13227
13231
  isRequired: false
13228
13232
  };
13233
+ const nodeExtensionTypes = nodeExtensions.filter((ext) => ext.name !== "text").map((ext) => ext.name);
13234
+ const markExtensionTypes = markExtensions.map((ext) => ext.name);
13235
+ const allExtensionTypes = [...nodeExtensionTypes, ...markExtensionTypes];
13229
13236
  extensions.forEach((extension) => {
13230
13237
  const context = {
13231
13238
  name: extension.name,
@@ -13243,7 +13250,19 @@ function getAttributesFromExtensions(extensions) {
13243
13250
  }
13244
13251
  const globalAttributes = addGlobalAttributes();
13245
13252
  globalAttributes.forEach((globalAttribute) => {
13246
- globalAttribute.types.forEach((type) => {
13253
+ let resolvedTypes;
13254
+ if (Array.isArray(globalAttribute.types)) {
13255
+ resolvedTypes = globalAttribute.types;
13256
+ } else if (globalAttribute.types === "*") {
13257
+ resolvedTypes = allExtensionTypes;
13258
+ } else if (globalAttribute.types === "nodes") {
13259
+ resolvedTypes = nodeExtensionTypes;
13260
+ } else if (globalAttribute.types === "marks") {
13261
+ resolvedTypes = markExtensionTypes;
13262
+ } else {
13263
+ resolvedTypes = [];
13264
+ }
13265
+ resolvedTypes.forEach((type) => {
13247
13266
  Object.entries(globalAttribute.attributes).forEach(([name, attribute]) => {
13248
13267
  extensionAttributes.push({
13249
13268
  type,
@@ -13292,6 +13311,67 @@ function getAttributesFromExtensions(extensions) {
13292
13311
  });
13293
13312
  return extensionAttributes;
13294
13313
  }
13314
+ function splitStyleDeclarations(styles) {
13315
+ const result = [];
13316
+ let current = "";
13317
+ let inSingleQuote = false;
13318
+ let inDoubleQuote = false;
13319
+ let parenDepth = 0;
13320
+ const length = styles.length;
13321
+ for (let i = 0; i < length; i += 1) {
13322
+ const char = styles[i];
13323
+ if (char === "'" && !inDoubleQuote) {
13324
+ inSingleQuote = !inSingleQuote;
13325
+ current += char;
13326
+ continue;
13327
+ }
13328
+ if (char === '"' && !inSingleQuote) {
13329
+ inDoubleQuote = !inDoubleQuote;
13330
+ current += char;
13331
+ continue;
13332
+ }
13333
+ if (!inSingleQuote && !inDoubleQuote) {
13334
+ if (char === "(") {
13335
+ parenDepth += 1;
13336
+ current += char;
13337
+ continue;
13338
+ }
13339
+ if (char === ")" && parenDepth > 0) {
13340
+ parenDepth -= 1;
13341
+ current += char;
13342
+ continue;
13343
+ }
13344
+ if (char === ";" && parenDepth === 0) {
13345
+ result.push(current);
13346
+ current = "";
13347
+ continue;
13348
+ }
13349
+ }
13350
+ current += char;
13351
+ }
13352
+ if (current) {
13353
+ result.push(current);
13354
+ }
13355
+ return result;
13356
+ }
13357
+ function parseStyleEntries(styles) {
13358
+ const pairs = [];
13359
+ const declarations = splitStyleDeclarations(styles || "");
13360
+ const numDeclarations = declarations.length;
13361
+ for (let i = 0; i < numDeclarations; i += 1) {
13362
+ const declaration = declarations[i];
13363
+ const firstColonIndex = declaration.indexOf(":");
13364
+ if (firstColonIndex === -1) {
13365
+ continue;
13366
+ }
13367
+ const property = declaration.slice(0, firstColonIndex).trim();
13368
+ const value = declaration.slice(firstColonIndex + 1).trim();
13369
+ if (property && value) {
13370
+ pairs.push([property, value]);
13371
+ }
13372
+ }
13373
+ return pairs;
13374
+ }
13295
13375
  function mergeAttributes(...objects) {
13296
13376
  return objects.filter((item) => !!item).reduce((items, item) => {
13297
13377
  const mergedAttributes = { ...items };
@@ -13307,17 +13387,7 @@ function mergeAttributes(...objects) {
13307
13387
  const insertClasses = valueClasses.filter((valueClass) => !existingClasses.includes(valueClass));
13308
13388
  mergedAttributes[key] = [...existingClasses, ...insertClasses].join(" ");
13309
13389
  } else if (key === "style") {
13310
- const newStyles = value ? value.split(";").map((style2) => style2.trim()).filter(Boolean) : [];
13311
- const existingStyles = mergedAttributes[key] ? mergedAttributes[key].split(";").map((style2) => style2.trim()).filter(Boolean) : [];
13312
- const styleMap = /* @__PURE__ */ new Map();
13313
- existingStyles.forEach((style2) => {
13314
- const [property, val] = style2.split(":").map((part) => part.trim());
13315
- styleMap.set(property, val);
13316
- });
13317
- newStyles.forEach((style2) => {
13318
- const [property, val] = style2.split(":").map((part) => part.trim());
13319
- styleMap.set(property, val);
13320
- });
13390
+ const styleMap = new Map([...parseStyleEntries(mergedAttributes[key]), ...parseStyleEntries(value)]);
13321
13391
  mergedAttributes[key] = Array.from(styleMap.entries()).map(([property, val]) => `${property}: ${val}`).join("; ");
13322
13392
  } else {
13323
13393
  mergedAttributes[key] = value;
@@ -13505,7 +13575,7 @@ function getSchemaByResolvedExtensions(extensions, editor) {
13505
13575
  });
13506
13576
  }
13507
13577
  function findDuplicates(items) {
13508
- const filtered = items.filter((el, index) => items.indexOf(el) !== index);
13578
+ const filtered = items.filter((el2, index) => items.indexOf(el2) !== index);
13509
13579
  return Array.from(new Set(filtered));
13510
13580
  }
13511
13581
  function sortExtensions(extensions) {
@@ -13741,6 +13811,9 @@ function isMarkActive(state, typeOrName, attributes = {}) {
13741
13811
  const from2 = $from.pos;
13742
13812
  const to = $to.pos;
13743
13813
  state.doc.nodesBetween(from2, to, (node, pos) => {
13814
+ if (type && node.inlineContent && !node.type.allowsMarkType(type)) {
13815
+ return false;
13816
+ }
13744
13817
  if (!node.isText && !node.marks.length) {
13745
13818
  return;
13746
13819
  }
@@ -13849,7 +13922,7 @@ function isNodeEmpty(node, {
13849
13922
  return true;
13850
13923
  }
13851
13924
  if (node.isText) {
13852
- return /^\s*$/m.test((_a = node.text) != null ? _a : "");
13925
+ return !/\S/.test((_a = node.text) != null ? _a : "");
13853
13926
  }
13854
13927
  }
13855
13928
  if (node.isText) {
@@ -14237,6 +14310,16 @@ var joinListForwards = (tr2, listType) => {
14237
14310
  tr2.join(after);
14238
14311
  return true;
14239
14312
  };
14313
+ function createInnerSelectionForWholeDocList(tr2) {
14314
+ const doc2 = tr2.doc;
14315
+ const list = doc2.firstChild;
14316
+ if (!list) {
14317
+ return null;
14318
+ }
14319
+ const from2 = 1;
14320
+ const to = list.nodeSize - 1;
14321
+ return TextSelection.create(doc2, from2, to);
14322
+ }
14240
14323
  var toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({ editor, tr: tr2, state, dispatch, chain, commands, can }) => {
14241
14324
  const { extensions, splittableMarks } = editor.extensionManager;
14242
14325
  const listType = getNodeType(listTypeOrName, state.schema);
@@ -14249,13 +14332,36 @@ var toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) =>
14249
14332
  return false;
14250
14333
  }
14251
14334
  const parentList = findParentNode((node) => isList(node.type.name, extensions))(selection);
14252
- if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {
14253
- if (parentList.node.type === listType) {
14335
+ const isAllSelection = selection.from === 0 && selection.to === state.doc.content.size;
14336
+ const topLevelNodes = state.doc.content.content;
14337
+ const soleTopLevelNode = topLevelNodes.length === 1 ? topLevelNodes[0] : null;
14338
+ const allSelectionList = isAllSelection && soleTopLevelNode && isList(soleTopLevelNode.type.name, extensions) ? {
14339
+ node: soleTopLevelNode,
14340
+ pos: 0
14341
+ } : null;
14342
+ const currentList = parentList != null ? parentList : allSelectionList;
14343
+ const isInsideExistingList = !!parentList && range.depth >= 1 && range.depth - parentList.depth <= 1;
14344
+ const hasWholeDocSelectedList = !!allSelectionList;
14345
+ if ((isInsideExistingList || hasWholeDocSelectedList) && currentList) {
14346
+ if (currentList.node.type === listType) {
14347
+ if (isAllSelection && hasWholeDocSelectedList) {
14348
+ return chain().command(({ tr: trx, dispatch: disp }) => {
14349
+ const nextSelection = createInnerSelectionForWholeDocList(trx);
14350
+ if (!nextSelection) {
14351
+ return false;
14352
+ }
14353
+ trx.setSelection(nextSelection);
14354
+ if (disp) {
14355
+ disp(trx);
14356
+ }
14357
+ return true;
14358
+ }).liftListItem(itemType).run();
14359
+ }
14254
14360
  return commands.liftListItem(itemType);
14255
14361
  }
14256
- if (isList(parentList.node.type.name, extensions) && listType.validContent(parentList.node.content) && dispatch) {
14362
+ if (isList(currentList.node.type.name, extensions) && listType.validContent(currentList.node.content)) {
14257
14363
  return chain().command(() => {
14258
- tr2.setNodeMarkup(parentList.pos, listType);
14364
+ tr2.setNodeMarkup(currentList.pos, listType);
14259
14365
  return true;
14260
14366
  }).command(() => joinListBackwards(tr2, listType)).command(() => joinListForwards(tr2, listType)).run();
14261
14367
  }
@@ -15249,6 +15355,39 @@ var ExtensionManager = class {
15249
15355
  };
15250
15356
  }, baseDispatch);
15251
15357
  }
15358
+ /**
15359
+ * Get the composed transformPastedHTML function from all extensions.
15360
+ * @param baseTransform The base transform function (e.g. from the editor props)
15361
+ * @returns A composed transform function that chains all extension transforms
15362
+ */
15363
+ transformPastedHTML(baseTransform) {
15364
+ const { editor } = this;
15365
+ const extensions = sortExtensions([...this.extensions]);
15366
+ return extensions.reduce(
15367
+ (transform, extension) => {
15368
+ const context = {
15369
+ name: extension.name,
15370
+ options: extension.options,
15371
+ storage: this.editor.extensionStorage[extension.name],
15372
+ editor,
15373
+ type: getSchemaTypeByName(extension.name, this.schema)
15374
+ };
15375
+ const extensionTransform = getExtensionField(
15376
+ extension,
15377
+ "transformPastedHTML",
15378
+ context
15379
+ );
15380
+ if (!extensionTransform) {
15381
+ return transform;
15382
+ }
15383
+ return (html, view) => {
15384
+ const transformedHtml = transform(html, view);
15385
+ return extensionTransform.call(context, transformedHtml);
15386
+ };
15387
+ },
15388
+ baseTransform || ((html) => html)
15389
+ );
15390
+ }
15252
15391
  get markViews() {
15253
15392
  const { editor } = this;
15254
15393
  const { markExtensions } = splitExtensions(this.extensions);
@@ -15467,7 +15606,7 @@ var Delete = Extension.create({
15467
15606
  const newEnd = mapping.slice(index).map(step.to);
15468
15607
  const oldStart = mapping.invert().map(newStart, -1);
15469
15608
  const oldEnd = mapping.invert().map(newEnd);
15470
- const foundBeforeMark = (_a3 = nextTransaction.doc.nodeAt(newStart - 1)) == null ? void 0 : _a3.marks.some((mark) => mark.eq(step.mark));
15609
+ const foundBeforeMark = newStart > 0 ? (_a3 = nextTransaction.doc.nodeAt(newStart - 1)) == null ? void 0 : _a3.marks.some((mark) => mark.eq(step.mark)) : false;
15471
15610
  const foundAfterMark = (_b3 = nextTransaction.doc.nodeAt(newEnd)) == null ? void 0 : _b3.marks.some((mark) => mark.eq(step.mark));
15472
15611
  this.editor.emit("delete", {
15473
15612
  type: "mark",
@@ -16104,13 +16243,13 @@ var Editor = class extends EventEmitter {
16104
16243
  /**
16105
16244
  * Attach the editor to the DOM, creating a new editor view.
16106
16245
  */
16107
- mount(el) {
16246
+ mount(el2) {
16108
16247
  if (typeof document === "undefined") {
16109
16248
  throw new Error(
16110
16249
  `[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.`
16111
16250
  );
16112
16251
  }
16113
- this.createView(el);
16252
+ this.createView(el2);
16114
16253
  this.emit("mount", { editor: this });
16115
16254
  if (this.css && !document.head.contains(this.css)) {
16116
16255
  document.head.appendChild(this.css);
@@ -16219,7 +16358,7 @@ var Editor = class extends EventEmitter {
16219
16358
  return this.options.editable && this.view && this.view.editable;
16220
16359
  }
16221
16360
  /**
16222
- * Returns the editor state.
16361
+ * Returns the editor view.
16223
16362
  */
16224
16363
  get view() {
16225
16364
  if (this.editorView) {
@@ -16387,6 +16526,8 @@ var Editor = class extends EventEmitter {
16387
16526
  const { editorProps, enableExtensionDispatchTransaction } = this.options;
16388
16527
  const baseDispatch = editorProps.dispatchTransaction || this.dispatchTransaction.bind(this);
16389
16528
  const dispatch = enableExtensionDispatchTransaction ? this.extensionManager.dispatchTransaction(baseDispatch) : baseDispatch;
16529
+ const baseTransformPastedHTML = editorProps.transformPastedHTML;
16530
+ const transformPastedHTML = this.extensionManager.transformPastedHTML(baseTransformPastedHTML);
16390
16531
  this.editorView = new EditorView(element, {
16391
16532
  ...editorProps,
16392
16533
  attributes: {
@@ -16395,6 +16536,7 @@ var Editor = class extends EventEmitter {
16395
16536
  ...editorProps == null ? void 0 : editorProps.attributes
16396
16537
  },
16397
16538
  dispatchTransaction: dispatch,
16539
+ transformPastedHTML,
16398
16540
  state: this.editorState,
16399
16541
  markViews: this.extensionManager.markViews,
16400
16542
  nodeViews: this.extensionManager.nodeViews
@@ -16902,7 +17044,7 @@ var ResizableNodeView = class {
16902
17044
  const element = document.createElement("div");
16903
17045
  element.dataset.resizeContainer = "";
16904
17046
  element.dataset.node = this.node.type.name;
16905
- element.style.display = "flex";
17047
+ element.style.display = this.node.type.isInline ? "inline-flex" : "flex";
16906
17048
  if (this.classNames.container) {
16907
17049
  element.className = this.classNames.container;
16908
17050
  }
@@ -17017,7 +17159,7 @@ var ResizableNodeView = class {
17017
17159
  * Cleans up the handle map and removes each handle element from the DOM.
17018
17160
  */
17019
17161
  removeHandles() {
17020
- this.handleMap.forEach((el) => el.remove());
17162
+ this.handleMap.forEach((el2) => el2.remove());
17021
17163
  this.handleMap.clear();
17022
17164
  }
17023
17165
  /**
@@ -17704,17 +17846,21 @@ function renderNestedMarkdownContent(node, h2, prefixOrGenerator, ctx) {
17704
17846
  const prefix = typeof prefixOrGenerator === "function" ? prefixOrGenerator(ctx) : prefixOrGenerator;
17705
17847
  const [content, ...children] = node.content;
17706
17848
  const mainContent = h2.renderChildren([content]);
17707
- const output = [`${prefix}${mainContent}`];
17849
+ let output = `${prefix}${mainContent}`;
17708
17850
  if (children && children.length > 0) {
17709
- children.forEach((child) => {
17710
- const childContent = h2.renderChildren([child]);
17711
- if (childContent) {
17712
- const indentedChild = childContent.split("\n").map((line) => line ? h2.indent(line) : "").join("\n");
17713
- output.push(indentedChild);
17851
+ children.forEach((child, index) => {
17852
+ var _a, _b;
17853
+ const childContent = (_b = (_a = h2.renderChild) == null ? void 0 : _a.call(h2, child, index + 1)) != null ? _b : h2.renderChildren([child]);
17854
+ if (childContent !== void 0 && childContent !== null) {
17855
+ const indentedChild = childContent.split("\n").map((line) => line ? h2.indent(line) : h2.indent("")).join("\n");
17856
+ output += child.type === "paragraph" ? `
17857
+
17858
+ ${indentedChild}` : `
17859
+ ${indentedChild}`;
17714
17860
  }
17715
17861
  });
17716
17862
  }
17717
- return output.join("\n");
17863
+ return output;
17718
17864
  }
17719
17865
  function updateMarkViewAttributes(checkMark, editor, attrs = {}) {
17720
17866
  const { state } = editor;
@@ -17804,7 +17950,10 @@ function markPasteRule(config) {
17804
17950
  }
17805
17951
  markEnd = range.from + startSpaces + captureGroup.length;
17806
17952
  tr2.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));
17807
- tr2.removeStoredMark(config.type);
17953
+ const isMatchAtEndOfText = match.index !== void 0 && match.input !== void 0 && match.index + match[0].length >= match.input.length;
17954
+ if (!isMatchAtEndOfText) {
17955
+ tr2.removeStoredMark(config.type);
17956
+ }
17808
17957
  }
17809
17958
  }
17810
17959
  });
@@ -17840,7 +17989,9 @@ var Blockquote = Node3.create({
17840
17989
  return /* @__PURE__ */ h("blockquote", { ...mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), children: /* @__PURE__ */ h("slot", {}) });
17841
17990
  },
17842
17991
  parseMarkdown: (token, helpers) => {
17843
- return helpers.createNode("blockquote", void 0, helpers.parseChildren(token.tokens || []));
17992
+ var _a;
17993
+ const parseBlockChildren = (_a = helpers.parseBlockChildren) != null ? _a : helpers.parseChildren;
17994
+ return helpers.createNode("blockquote", void 0, parseBlockChildren(token.tokens || []));
17844
17995
  },
17845
17996
  renderMarkdown: (node, h2) => {
17846
17997
  if (!node.content) {
@@ -17848,8 +17999,9 @@ var Blockquote = Node3.create({
17848
17999
  }
17849
18000
  const prefix = ">";
17850
18001
  const result = [];
17851
- node.content.forEach((child) => {
17852
- const childContent = h2.renderChildren([child]);
18002
+ node.content.forEach((child, index) => {
18003
+ var _a, _b;
18004
+ const childContent = (_b = (_a = h2.renderChild) == null ? void 0 : _a.call(h2, child, index)) != null ? _b : h2.renderChildren([child]);
17853
18005
  const lines = childContent.split("\n");
17854
18006
  const linesWithPrefix = lines.map((line) => {
17855
18007
  if (line.trim() === "") {
@@ -17927,6 +18079,12 @@ var Bold = Mark2.create({
17927
18079
  parseMarkdown: (token, helpers) => {
17928
18080
  return helpers.applyMark("bold", helpers.parseInline(token.tokens || []));
17929
18081
  },
18082
+ markdownOptions: {
18083
+ htmlReopen: {
18084
+ open: "<strong>",
18085
+ close: "</strong>"
18086
+ }
18087
+ },
17930
18088
  renderMarkdown: (node, h2) => {
17931
18089
  return `**${h2.renderChildren(node)}**`;
17932
18090
  },
@@ -18103,8 +18261,8 @@ var CodeBlock = Node3.create({
18103
18261
  },
18104
18262
  markdownTokenName: "code",
18105
18263
  parseMarkdown: (token, helpers) => {
18106
- var _a;
18107
- if (((_a = token.raw) == null ? void 0 : _a.startsWith("```")) === false && token.codeBlockStyle !== "indented") {
18264
+ var _a, _b;
18265
+ if (((_a = token.raw) == null ? void 0 : _a.startsWith("```")) === false && ((_b = token.raw) == null ? void 0 : _b.startsWith("~~~")) === false && token.codeBlockStyle !== "indented") {
18108
18266
  return [];
18109
18267
  }
18110
18268
  return helpers.createNode(
@@ -18346,7 +18504,6 @@ var CodeBlock = Node3.create({
18346
18504
  ];
18347
18505
  }
18348
18506
  });
18349
- var index_default = CodeBlock;
18350
18507
  var Document = Node3.create({
18351
18508
  name: "doc",
18352
18509
  topNode: true,
@@ -18623,6 +18780,12 @@ var Italic = Mark2.create({
18623
18780
  parseMarkdown: (token, helpers) => {
18624
18781
  return helpers.applyMark("italic", helpers.parseInline(token.tokens || []));
18625
18782
  },
18783
+ markdownOptions: {
18784
+ htmlReopen: {
18785
+ open: "<em>",
18786
+ close: "</em>"
18787
+ }
18788
+ },
18626
18789
  renderMarkdown: (node, h2) => {
18627
18790
  return `*${h2.renderChildren(node)}*`;
18628
18791
  },
@@ -18871,7 +19034,7 @@ State.prototype = {
18871
19034
  }
18872
19035
  };
18873
19036
  const ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);
18874
- const tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);
19037
+ const tr$1 = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);
18875
19038
  const ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);
18876
19039
  const tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);
18877
19040
  const WORD = "WORD";
@@ -19049,58 +19212,58 @@ function init$2(customSchemes = []) {
19049
19212
  tt(Start, "_", UNDERSCORE);
19050
19213
  tt(Start, "\\", BACKSLASH);
19051
19214
  tt(Start, "・", FULLWIDTHMIDDLEDOT);
19052
- const Num = tr(Start, DIGIT, NUM, {
19215
+ const Num = tr$1(Start, DIGIT, NUM, {
19053
19216
  [numeric]: true
19054
19217
  });
19055
- tr(Num, DIGIT, Num);
19056
- const Asciinumeric = tr(Num, ASCII_LETTER, ASCIINUMERICAL, {
19218
+ tr$1(Num, DIGIT, Num);
19219
+ const Asciinumeric = tr$1(Num, ASCII_LETTER, ASCIINUMERICAL, {
19057
19220
  [asciinumeric]: true
19058
19221
  });
19059
- const Alphanumeric = tr(Num, LETTER, ALPHANUMERICAL, {
19222
+ const Alphanumeric = tr$1(Num, LETTER, ALPHANUMERICAL, {
19060
19223
  [alphanumeric]: true
19061
19224
  });
19062
- const Word = tr(Start, ASCII_LETTER, WORD, {
19225
+ const Word = tr$1(Start, ASCII_LETTER, WORD, {
19063
19226
  [ascii]: true
19064
19227
  });
19065
- tr(Word, DIGIT, Asciinumeric);
19066
- tr(Word, ASCII_LETTER, Word);
19067
- tr(Asciinumeric, DIGIT, Asciinumeric);
19068
- tr(Asciinumeric, ASCII_LETTER, Asciinumeric);
19069
- const UWord = tr(Start, LETTER, UWORD, {
19228
+ tr$1(Word, DIGIT, Asciinumeric);
19229
+ tr$1(Word, ASCII_LETTER, Word);
19230
+ tr$1(Asciinumeric, DIGIT, Asciinumeric);
19231
+ tr$1(Asciinumeric, ASCII_LETTER, Asciinumeric);
19232
+ const UWord = tr$1(Start, LETTER, UWORD, {
19070
19233
  [alpha]: true
19071
19234
  });
19072
- tr(UWord, ASCII_LETTER);
19073
- tr(UWord, DIGIT, Alphanumeric);
19074
- tr(UWord, LETTER, UWord);
19075
- tr(Alphanumeric, DIGIT, Alphanumeric);
19076
- tr(Alphanumeric, ASCII_LETTER);
19077
- tr(Alphanumeric, LETTER, Alphanumeric);
19235
+ tr$1(UWord, ASCII_LETTER);
19236
+ tr$1(UWord, DIGIT, Alphanumeric);
19237
+ tr$1(UWord, LETTER, UWord);
19238
+ tr$1(Alphanumeric, DIGIT, Alphanumeric);
19239
+ tr$1(Alphanumeric, ASCII_LETTER);
19240
+ tr$1(Alphanumeric, LETTER, Alphanumeric);
19078
19241
  const Nl2 = tt(Start, LF, NL, {
19079
19242
  [whitespace]: true
19080
19243
  });
19081
19244
  const Cr = tt(Start, CR, WS, {
19082
19245
  [whitespace]: true
19083
19246
  });
19084
- const Ws = tr(Start, SPACE, WS, {
19247
+ const Ws = tr$1(Start, SPACE, WS, {
19085
19248
  [whitespace]: true
19086
19249
  });
19087
19250
  tt(Start, OBJECT_REPLACEMENT, Ws);
19088
19251
  tt(Cr, LF, Nl2);
19089
19252
  tt(Cr, OBJECT_REPLACEMENT, Ws);
19090
- tr(Cr, SPACE, Ws);
19253
+ tr$1(Cr, SPACE, Ws);
19091
19254
  tt(Ws, CR);
19092
19255
  tt(Ws, LF);
19093
- tr(Ws, SPACE, Ws);
19256
+ tr$1(Ws, SPACE, Ws);
19094
19257
  tt(Ws, OBJECT_REPLACEMENT, Ws);
19095
- const Emoji = tr(Start, EMOJI, EMOJI$1, {
19258
+ const Emoji = tr$1(Start, EMOJI, EMOJI$1, {
19096
19259
  [emoji]: true
19097
19260
  });
19098
19261
  tt(Emoji, "#");
19099
- tr(Emoji, EMOJI, Emoji);
19262
+ tr$1(Emoji, EMOJI, Emoji);
19100
19263
  tt(Emoji, EMOJI_VARIATION, Emoji);
19101
19264
  const EmojiJoiner = tt(Emoji, EMOJI_JOINER);
19102
19265
  tt(EmojiJoiner, "#");
19103
- tr(EmojiJoiner, EMOJI, Emoji);
19266
+ tr$1(EmojiJoiner, EMOJI, Emoji);
19104
19267
  const wordjr = [[ASCII_LETTER, Word], [DIGIT, Asciinumeric]];
19105
19268
  const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord], [DIGIT, Alphanumeric]];
19106
19269
  for (let i = 0; i < tlds.length; i++) {
@@ -20321,14 +20484,16 @@ var ListItem = Node3.create({
20321
20484
  },
20322
20485
  markdownTokenName: "list_item",
20323
20486
  parseMarkdown: (token, helpers) => {
20487
+ var _a;
20324
20488
  if (token.type !== "list_item") {
20325
20489
  return [];
20326
20490
  }
20491
+ const parseBlockChildren = (_a = helpers.parseBlockChildren) != null ? _a : helpers.parseChildren;
20327
20492
  let content = [];
20328
20493
  if (token.tokens && token.tokens.length > 0) {
20329
20494
  const hasParagraphTokens = token.tokens.some((t) => t.type === "paragraph");
20330
20495
  if (hasParagraphTokens) {
20331
- content = helpers.parseChildren(token.tokens);
20496
+ content = parseBlockChildren(token.tokens);
20332
20497
  } else {
20333
20498
  const firstToken = token.tokens[0];
20334
20499
  if (firstToken && firstToken.type === "text" && firstToken.tokens && firstToken.tokens.length > 0) {
@@ -20341,11 +20506,11 @@ var ListItem = Node3.create({
20341
20506
  ];
20342
20507
  if (token.tokens.length > 1) {
20343
20508
  const remainingTokens = token.tokens.slice(1);
20344
- const additionalContent = helpers.parseChildren(remainingTokens);
20509
+ const additionalContent = parseBlockChildren(remainingTokens);
20345
20510
  content.push(...additionalContent);
20346
20511
  }
20347
20512
  } else {
20348
- content = helpers.parseChildren(token.tokens);
20513
+ content = parseBlockChildren(token.tokens);
20349
20514
  }
20350
20515
  }
20351
20516
  }
@@ -21263,18 +21428,22 @@ var Paragraph = Node3.create({
21263
21428
  return helpers.parseChildren([tokens[0]]);
21264
21429
  }
21265
21430
  const content = helpers.parseInline(tokens);
21266
- if (content.length === 1 && content[0].type === "text" && (content[0].text === EMPTY_PARAGRAPH_MARKDOWN || content[0].text === NBSP_CHAR)) {
21431
+ const hasExplicitEmptyParagraphMarker = tokens.length === 1 && tokens[0].type === "text" && (tokens[0].raw === EMPTY_PARAGRAPH_MARKDOWN || tokens[0].text === EMPTY_PARAGRAPH_MARKDOWN || tokens[0].raw === NBSP_CHAR || tokens[0].text === NBSP_CHAR);
21432
+ if (hasExplicitEmptyParagraphMarker && content.length === 1 && content[0].type === "text" && (content[0].text === EMPTY_PARAGRAPH_MARKDOWN || content[0].text === NBSP_CHAR)) {
21267
21433
  return helpers.createNode("paragraph", void 0, []);
21268
21434
  }
21269
21435
  return helpers.createNode("paragraph", void 0, content);
21270
21436
  },
21271
- renderMarkdown: (node, h2) => {
21437
+ renderMarkdown: (node, h2, ctx) => {
21438
+ var _a, _b;
21272
21439
  if (!node) {
21273
21440
  return "";
21274
21441
  }
21275
21442
  const content = Array.isArray(node.content) ? node.content : [];
21276
21443
  if (content.length === 0) {
21277
- return EMPTY_PARAGRAPH_MARKDOWN;
21444
+ const previousContent = Array.isArray((_a = ctx == null ? void 0 : ctx.previousNode) == null ? void 0 : _a.content) ? ctx.previousNode.content : [];
21445
+ const previousNodeIsEmptyParagraph = ((_b = ctx == null ? void 0 : ctx.previousNode) == null ? void 0 : _b.type) === "paragraph" && previousContent.length === 0;
21446
+ return previousNodeIsEmptyParagraph ? EMPTY_PARAGRAPH_MARKDOWN : "";
21278
21447
  }
21279
21448
  return h2.renderChildren(content);
21280
21449
  },
@@ -22533,6 +22702,9 @@ var Placeholder = Extension.create({
22533
22702
  doc2.descendants((node, pos) => {
22534
22703
  const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;
22535
22704
  const isEmpty2 = !node.isLeaf && isNodeEmpty(node);
22705
+ if (!node.type.isTextblock) {
22706
+ return this.options.includeChildren;
22707
+ }
22536
22708
  if ((hasAnchor || !this.options.showOnlyCurrent) && isEmpty2) {
22537
22709
  const classes = [this.options.emptyNodeClass];
22538
22710
  if (isEmptyDoc) {
@@ -22586,6 +22758,7 @@ Extension.create({
22586
22758
  ];
22587
22759
  }
22588
22760
  });
22761
+ var skipTrailingNodeMeta = "skipTrailingNode";
22589
22762
  function nodeEqualsType({ types, node }) {
22590
22763
  return node && Array.isArray(types) && types.includes(node.type) || (node == null ? void 0 : node.type) === types;
22591
22764
  }
@@ -22605,11 +22778,14 @@ var TrailingNode = Extension.create({
22605
22778
  return [
22606
22779
  new Plugin({
22607
22780
  key: plugin,
22608
- appendTransaction: (_, __, state) => {
22781
+ appendTransaction: (transactions, __, state) => {
22609
22782
  const { doc: doc2, tr: tr2, schema } = state;
22610
22783
  const shouldInsertNodeAtEnd = plugin.getState(state);
22611
22784
  const endPosition = doc2.content.size;
22612
22785
  const type = schema.nodes[defaultNode];
22786
+ if (transactions.some((transaction) => transaction.getMeta(skipTrailingNodeMeta))) {
22787
+ return;
22788
+ }
22613
22789
  if (!shouldInsertNodeAtEnd) {
22614
22790
  return;
22615
22791
  }
@@ -23304,7 +23480,7 @@ var Image = Node3.create({
23304
23480
  }
23305
23481
  const { directions, minWidth, minHeight, alwaysPreserveAspectRatio } = this.options.resize;
23306
23482
  return ({ node, getPos, HTMLAttributes, editor }) => {
23307
- const el = document.createElement("img");
23483
+ const el2 = document.createElement("img");
23308
23484
  Object.entries(HTMLAttributes).forEach(([key, value]) => {
23309
23485
  if (value != null) {
23310
23486
  switch (key) {
@@ -23312,20 +23488,20 @@ var Image = Node3.create({
23312
23488
  case "height":
23313
23489
  break;
23314
23490
  default:
23315
- el.setAttribute(key, value);
23491
+ el2.setAttribute(key, value);
23316
23492
  break;
23317
23493
  }
23318
23494
  }
23319
23495
  });
23320
- el.src = HTMLAttributes.src;
23496
+ el2.src = HTMLAttributes.src;
23321
23497
  const nodeView = new ResizableNodeView({
23322
- element: el,
23498
+ element: el2,
23323
23499
  editor,
23324
23500
  node,
23325
23501
  getPos,
23326
23502
  onResize: (width, height) => {
23327
- el.style.width = `${width}px`;
23328
- el.style.height = `${height}px`;
23503
+ el2.style.width = `${width}px`;
23504
+ el2.style.height = `${height}px`;
23329
23505
  },
23330
23506
  onCommit: (width, height) => {
23331
23507
  const pos = getPos();
@@ -23355,7 +23531,7 @@ var Image = Node3.create({
23355
23531
  const dom = nodeView.dom;
23356
23532
  dom.style.visibility = "hidden";
23357
23533
  dom.style.pointerEvents = "none";
23358
- el.onload = () => {
23534
+ el2.onload = () => {
23359
23535
  dom.style.visibility = "";
23360
23536
  dom.style.pointerEvents = "";
23361
23537
  };
@@ -25107,6 +25283,35 @@ function tableEditing({ allowTableNodeSelection = false } = {}) {
25107
25283
  }
25108
25284
  });
25109
25285
  }
25286
+ function normalizeTableCellAlign(value) {
25287
+ if (value === "left" || value === "right" || value === "center") {
25288
+ return value;
25289
+ }
25290
+ return null;
25291
+ }
25292
+ function parseAlign(element) {
25293
+ const styleAlign = (element.style.textAlign || "").trim().toLowerCase();
25294
+ const attrAlign = (element.getAttribute("align") || "").trim().toLowerCase();
25295
+ const align = styleAlign || attrAlign;
25296
+ return normalizeTableCellAlign(align);
25297
+ }
25298
+ function normalizeTableCellAlignFromAttributes(attributes) {
25299
+ return normalizeTableCellAlign(attributes == null ? void 0 : attributes.align);
25300
+ }
25301
+ function createAlignAttribute() {
25302
+ return {
25303
+ default: null,
25304
+ parseHTML: (element) => parseAlign(element),
25305
+ renderHTML: (attributes) => {
25306
+ if (!attributes.align) {
25307
+ return {};
25308
+ }
25309
+ return {
25310
+ style: `text-align: ${attributes.align}`
25311
+ };
25312
+ }
25313
+ };
25314
+ }
25110
25315
  var TableCell = Node3.create({
25111
25316
  name: "tableCell",
25112
25317
  addOptions() {
@@ -25139,7 +25344,8 @@ var TableCell = Node3.create({
25139
25344
  }
25140
25345
  return value;
25141
25346
  }
25142
- }
25347
+ },
25348
+ align: createAlignAttribute()
25143
25349
  };
25144
25350
  },
25145
25351
  tableRole: "cell",
@@ -25174,7 +25380,8 @@ var TableHeader = Node3.create({
25174
25380
  const value = colwidth ? colwidth.split(",").map((width) => parseInt(width, 10)) : null;
25175
25381
  return value;
25176
25382
  }
25177
- }
25383
+ },
25384
+ align: createAlignAttribute()
25178
25385
  };
25179
25386
  },
25180
25387
  tableRole: "header_cell",
@@ -25402,7 +25609,8 @@ function renderTableToMarkdown(node, h2, options = {}) {
25402
25609
  }
25403
25610
  const text = collapseWhitespace(raw);
25404
25611
  const isHeader = cellNode.type === "tableHeader";
25405
- cells.push({ text, isHeader });
25612
+ const align = normalizeTableCellAlignFromAttributes(cellNode.attrs);
25613
+ cells.push({ text, isHeader, align });
25406
25614
  });
25407
25615
  }
25408
25616
  rows.push(cells);
@@ -25428,11 +25636,33 @@ function renderTableToMarkdown(node, h2, options = {}) {
25428
25636
  const pad = (s, width) => s + " ".repeat(Math.max(0, width - s.length));
25429
25637
  const headerRow = rows[0];
25430
25638
  const hasHeader = headerRow.some((c2) => c2.isHeader);
25639
+ const colAlignments = new Array(columnCount).fill(null);
25640
+ rows.forEach((r2) => {
25641
+ var _a2;
25642
+ for (let i = 0; i < columnCount; i += 1) {
25643
+ if (!colAlignments[i] && ((_a2 = r2[i]) == null ? void 0 : _a2.align)) {
25644
+ colAlignments[i] = r2[i].align;
25645
+ }
25646
+ }
25647
+ });
25431
25648
  let out = "\n";
25432
25649
  const headerTexts = new Array(columnCount).fill(0).map((_, i) => hasHeader ? headerRow[i] && headerRow[i].text || "" : "");
25433
25650
  out += `| ${headerTexts.map((t, i) => pad(t, colWidths[i])).join(" | ")} |
25434
25651
  `;
25435
- out += `| ${colWidths.map((w) => "-".repeat(Math.max(3, w))).join(" | ")} |
25652
+ out += `| ${colWidths.map((w, index) => {
25653
+ const dashCount = Math.max(3, w);
25654
+ const alignment = colAlignments[index];
25655
+ if (alignment === "left") {
25656
+ return `:${"-".repeat(dashCount)}`;
25657
+ }
25658
+ if (alignment === "right") {
25659
+ return `${"-".repeat(dashCount)}:`;
25660
+ }
25661
+ if (alignment === "center") {
25662
+ return `:${"-".repeat(dashCount)}:`;
25663
+ }
25664
+ return "-".repeat(dashCount);
25665
+ }).join(" | ")} |
25436
25666
  `;
25437
25667
  const body = hasHeader ? rows.slice(1) : rows;
25438
25668
  body.forEach((r2) => {
@@ -25486,18 +25716,27 @@ var Table = Node3.create({
25486
25716
  },
25487
25717
  parseMarkdown: (token, h2) => {
25488
25718
  const rows = [];
25719
+ const alignments = Array.isArray(token.align) ? token.align : [];
25489
25720
  if (token.header) {
25490
25721
  const headerCells = [];
25491
- token.header.forEach((cell) => {
25492
- headerCells.push(h2.createNode("tableHeader", {}, [{ type: "paragraph", content: h2.parseInline(cell.tokens) }]));
25722
+ token.header.forEach((cell, index) => {
25723
+ var _a;
25724
+ const align = normalizeTableCellAlign((_a = alignments[index]) != null ? _a : cell.align);
25725
+ const attrs = align ? { align } : {};
25726
+ headerCells.push(
25727
+ h2.createNode("tableHeader", attrs, [{ type: "paragraph", content: h2.parseInline(cell.tokens) }])
25728
+ );
25493
25729
  });
25494
25730
  rows.push(h2.createNode("tableRow", {}, headerCells));
25495
25731
  }
25496
25732
  if (token.rows) {
25497
25733
  token.rows.forEach((row) => {
25498
25734
  const bodyCells = [];
25499
- row.forEach((cell) => {
25500
- bodyCells.push(h2.createNode("tableCell", {}, [{ type: "paragraph", content: h2.parseInline(cell.tokens) }]));
25735
+ row.forEach((cell, index) => {
25736
+ var _a;
25737
+ const align = normalizeTableCellAlign((_a = alignments[index]) != null ? _a : cell.align);
25738
+ const attrs = align ? { align } : {};
25739
+ bodyCells.push(h2.createNode("tableCell", attrs, [{ type: "paragraph", content: h2.parseInline(cell.tokens) }]));
25501
25740
  });
25502
25741
  rows.push(h2.createNode("tableRow", {}, bodyCells));
25503
25742
  });
@@ -25843,7 +26082,7 @@ function requireCore() {
25843
26082
  static _collapse(node) {
25844
26083
  if (typeof node === "string") return;
25845
26084
  if (!node.children) return;
25846
- if (node.children.every((el) => typeof el === "string")) {
26085
+ if (node.children.every((el2) => typeof el2 === "string")) {
25847
26086
  node.children = [node.children.join("")];
25848
26087
  } else {
25849
26088
  node.children.forEach((child) => {
@@ -26365,7 +26604,7 @@ function requireCore() {
26365
26604
  if (this.regexes.length === 0) {
26366
26605
  this.exec = () => null;
26367
26606
  }
26368
- const terminators = this.regexes.map((el) => el[1]);
26607
+ const terminators = this.regexes.map((el2) => el2[1]);
26369
26608
  this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: "|" }), true);
26370
26609
  this.lastIndex = 0;
26371
26610
  }
@@ -26376,7 +26615,7 @@ function requireCore() {
26376
26615
  if (!match) {
26377
26616
  return null;
26378
26617
  }
26379
- const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0);
26618
+ const i = match.findIndex((el2, i2) => i2 > 0 && el2 !== void 0);
26380
26619
  const matchData = this.matchIndexes[i];
26381
26620
  match.splice(0, i);
26382
26621
  return Object.assign(match, matchData);
@@ -27136,10 +27375,10 @@ function requireCore() {
27136
27375
  }
27137
27376
  });
27138
27377
  }
27139
- function deprecateHighlightBlock(el) {
27378
+ function deprecateHighlightBlock(el2) {
27140
27379
  deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0");
27141
27380
  deprecated("10.7.0", "Please use highlightElement now.");
27142
- return highlightElement(el);
27381
+ return highlightElement(el2);
27143
27382
  }
27144
27383
  Object.assign(hljs, {
27145
27384
  highlight: highlight2,
@@ -27298,7 +27537,7 @@ function LowlightPlugin({
27298
27537
  });
27299
27538
  return lowlightPlugin;
27300
27539
  }
27301
- var CodeBlockLowlight = index_default.extend({
27540
+ var CodeBlockLowlight = CodeBlock.extend({
27302
27541
  addOptions() {
27303
27542
  var _a;
27304
27543
  return {
@@ -41486,6 +41725,506 @@ class EmojiPicker {
41486
41725
  }
41487
41726
  }
41488
41727
  }
41728
+ const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
41729
+ const ACCEPTED_IMAGE_TYPES = ["image/jpeg", "image/png", "image/gif", "image/webp", "image/svg+xml"];
41730
+ const SVG_DANGEROUS_TAGS = [
41731
+ "script",
41732
+ "foreignobject",
41733
+ "set",
41734
+ "animate",
41735
+ "animatetransform",
41736
+ "animatemotion",
41737
+ "handler",
41738
+ "listener"
41739
+ ];
41740
+ const SVG_EVENT_ATTR_PATTERN = /^on/i;
41741
+ const SVG_DANGEROUS_ATTR_VALUES = /javascript:|data:text\/html/i;
41742
+ function sanitizeSVG(svgText) {
41743
+ const parser = new DOMParser();
41744
+ const doc2 = parser.parseFromString(svgText, "image/svg+xml");
41745
+ const parseError = doc2.querySelector("parsererror");
41746
+ if (parseError) {
41747
+ return null;
41748
+ }
41749
+ const walk = (node) => {
41750
+ const tagName = node.tagName.toLowerCase();
41751
+ if (SVG_DANGEROUS_TAGS.includes(tagName)) {
41752
+ node.remove();
41753
+ return;
41754
+ }
41755
+ const attrs = Array.from(node.attributes);
41756
+ for (const attr of attrs) {
41757
+ if (SVG_EVENT_ATTR_PATTERN.test(attr.name)) {
41758
+ node.removeAttribute(attr.name);
41759
+ } else if (SVG_DANGEROUS_ATTR_VALUES.test(attr.value)) {
41760
+ node.removeAttribute(attr.name);
41761
+ }
41762
+ }
41763
+ const children = Array.from(node.children);
41764
+ for (const child of children) {
41765
+ walk(child);
41766
+ }
41767
+ };
41768
+ walk(doc2.documentElement);
41769
+ return new XMLSerializer().serializeToString(doc2.documentElement);
41770
+ }
41771
+ class ImageUpload {
41772
+ options;
41773
+ overlay = null;
41774
+ dialog = null;
41775
+ activeTab = "upload";
41776
+ currentFile = null;
41777
+ fileInput = null;
41778
+ uploading = false;
41779
+ constructor(options) {
41780
+ this.options = options;
41781
+ }
41782
+ open() {
41783
+ if (this.overlay) {
41784
+ this.reset();
41785
+ this.overlay.style.display = "flex";
41786
+ return;
41787
+ }
41788
+ this.createDialog();
41789
+ }
41790
+ close() {
41791
+ if (this.overlay) {
41792
+ this.overlay.style.display = "none";
41793
+ }
41794
+ this.reset();
41795
+ }
41796
+ reset() {
41797
+ this.currentFile = null;
41798
+ this.uploading = false;
41799
+ if (!this.dialog) return;
41800
+ if (this.fileInput) {
41801
+ this.fileInput.value = "";
41802
+ }
41803
+ const dropzoneText = this.dialog.querySelector(".md-image-upload-dropzone-text");
41804
+ if (dropzoneText) {
41805
+ dropzoneText.textContent = this.options.trans("Drop image here or click to browse");
41806
+ }
41807
+ const urlInput = this.dialog.querySelector(".md-image-upload-url-input");
41808
+ if (urlInput) {
41809
+ urlInput.value = "";
41810
+ }
41811
+ const altInput = this.dialog.querySelector(".md-image-upload-alt-input");
41812
+ if (altInput) {
41813
+ altInput.value = "";
41814
+ }
41815
+ const preview = this.dialog.querySelector(".md-image-upload-preview");
41816
+ if (preview) {
41817
+ preview.innerHTML = "";
41818
+ preview.style.display = "none";
41819
+ }
41820
+ const progress = this.dialog.querySelector(".md-image-upload-progress");
41821
+ if (progress) {
41822
+ progress.style.display = "none";
41823
+ }
41824
+ const insertBtn = this.dialog.querySelector(".md-image-upload-insert");
41825
+ if (insertBtn) {
41826
+ insertBtn.disabled = true;
41827
+ }
41828
+ const error = this.dialog.querySelector(".md-image-upload-error");
41829
+ if (error) {
41830
+ error.style.display = "none";
41831
+ error.textContent = "";
41832
+ }
41833
+ this.switchTab("upload");
41834
+ }
41835
+ createDialog() {
41836
+ const t = this.options.trans;
41837
+ this.overlay = document.createElement("div");
41838
+ this.overlay.className = "md-dialog-overlay";
41839
+ this.overlay.addEventListener("click", (e) => {
41840
+ if (e.target === this.overlay) {
41841
+ this.close();
41842
+ }
41843
+ });
41844
+ this.dialog = document.createElement("div");
41845
+ this.dialog.className = "md-dialog md-image-upload-dialog";
41846
+ const header = document.createElement("div");
41847
+ header.className = "md-dialog-header";
41848
+ header.innerHTML = `
41849
+ <h3>${t("Insert image")}</h3>
41850
+ <button type="button" class="md-dialog-close">×</button>
41851
+ `;
41852
+ header.querySelector(".md-dialog-close")?.addEventListener("click", () => this.close());
41853
+ const body = document.createElement("div");
41854
+ body.className = "md-dialog-body";
41855
+ const tabs = document.createElement("div");
41856
+ tabs.className = "md-image-upload-tabs";
41857
+ const uploadTab = document.createElement("button");
41858
+ uploadTab.type = "button";
41859
+ uploadTab.className = "md-image-upload-tab md-image-upload-tab-active";
41860
+ uploadTab.textContent = t("Upload");
41861
+ uploadTab.addEventListener("click", () => this.switchTab("upload"));
41862
+ const urlTab = document.createElement("button");
41863
+ urlTab.type = "button";
41864
+ urlTab.className = "md-image-upload-tab";
41865
+ urlTab.textContent = t("URL");
41866
+ urlTab.addEventListener("click", () => this.switchTab("url"));
41867
+ tabs.appendChild(uploadTab);
41868
+ tabs.appendChild(urlTab);
41869
+ const uploadPanel = document.createElement("div");
41870
+ uploadPanel.className = "md-image-upload-panel md-image-upload-panel-upload";
41871
+ this.fileInput = document.createElement("input");
41872
+ this.fileInput.type = "file";
41873
+ this.fileInput.accept = "image/*";
41874
+ this.fileInput.style.display = "none";
41875
+ this.fileInput.addEventListener("change", () => {
41876
+ const file = this.fileInput?.files?.[0];
41877
+ if (file) {
41878
+ this.handleFileSelected(file);
41879
+ }
41880
+ });
41881
+ const dropzone = document.createElement("div");
41882
+ dropzone.className = "md-image-upload-dropzone";
41883
+ dropzone.innerHTML = `
41884
+ <div class="md-image-upload-dropzone-icon">
41885
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
41886
+ <rect x="3" y="3" width="18" height="18" rx="2"/>
41887
+ <circle cx="8.5" cy="8.5" r="1.5"/>
41888
+ <polyline points="21 15 16 10 5 21"/>
41889
+ </svg>
41890
+ </div>
41891
+ <div class="md-image-upload-dropzone-text">${t("Drop image here or click to browse")}</div>
41892
+ <button type="button" class="md-btn md-btn-primary md-image-upload-browse">${t("Browse...")}</button>
41893
+ `;
41894
+ dropzone.querySelector(".md-image-upload-browse")?.addEventListener("click", (e) => {
41895
+ e.stopPropagation();
41896
+ this.fileInput?.click();
41897
+ });
41898
+ dropzone.addEventListener("click", () => {
41899
+ this.fileInput?.click();
41900
+ });
41901
+ dropzone.addEventListener("dragover", (e) => {
41902
+ e.preventDefault();
41903
+ e.stopPropagation();
41904
+ dropzone.classList.add("md-image-upload-dropzone-active");
41905
+ if (e.dataTransfer) {
41906
+ e.dataTransfer.dropEffect = "copy";
41907
+ }
41908
+ });
41909
+ dropzone.addEventListener("dragleave", (e) => {
41910
+ e.preventDefault();
41911
+ e.stopPropagation();
41912
+ dropzone.classList.remove("md-image-upload-dropzone-active");
41913
+ });
41914
+ dropzone.addEventListener("drop", (e) => {
41915
+ e.preventDefault();
41916
+ e.stopPropagation();
41917
+ dropzone.classList.remove("md-image-upload-dropzone-active");
41918
+ const file = e.dataTransfer?.files?.[0];
41919
+ if (file) {
41920
+ this.handleFileSelected(file);
41921
+ }
41922
+ });
41923
+ uploadPanel.appendChild(this.fileInput);
41924
+ uploadPanel.appendChild(dropzone);
41925
+ const urlPanel = document.createElement("div");
41926
+ urlPanel.className = "md-image-upload-panel md-image-upload-panel-url";
41927
+ urlPanel.style.display = "none";
41928
+ const urlRow = document.createElement("div");
41929
+ urlRow.className = "md-image-upload-row";
41930
+ urlRow.innerHTML = `
41931
+ <label>${t("URL")}</label>
41932
+ <input type="url" class="md-image-upload-url-input" placeholder="https://..." />
41933
+ `;
41934
+ const urlInput = urlRow.querySelector(".md-image-upload-url-input");
41935
+ urlInput.addEventListener("input", () => {
41936
+ this.handleUrlInput(urlInput.value);
41937
+ });
41938
+ urlPanel.appendChild(urlRow);
41939
+ const preview = document.createElement("div");
41940
+ preview.className = "md-image-upload-preview";
41941
+ preview.style.display = "none";
41942
+ const altRow = document.createElement("div");
41943
+ altRow.className = "md-image-upload-row";
41944
+ altRow.innerHTML = `
41945
+ <label>${t("Alt text")}</label>
41946
+ <input type="text" class="md-image-upload-alt-input" />
41947
+ `;
41948
+ const errorEl = document.createElement("div");
41949
+ errorEl.className = "md-image-upload-error";
41950
+ errorEl.style.display = "none";
41951
+ const progressEl = document.createElement("div");
41952
+ progressEl.className = "md-image-upload-progress";
41953
+ progressEl.style.display = "none";
41954
+ progressEl.innerHTML = `
41955
+ <div class="md-image-upload-progress-bar"><div class="md-image-upload-progress-fill"></div></div>
41956
+ <span class="md-image-upload-progress-text">${t("Uploading...")}</span>
41957
+ `;
41958
+ const footer = document.createElement("div");
41959
+ footer.className = "md-image-upload-footer";
41960
+ footer.innerHTML = `
41961
+ <button type="button" class="md-btn md-image-upload-cancel">${t("Cancel")}</button>
41962
+ <button type="button" class="md-btn md-btn-primary md-image-upload-insert" disabled>${t("Insert")}</button>
41963
+ `;
41964
+ footer.querySelector(".md-image-upload-cancel")?.addEventListener("click", () => this.close());
41965
+ footer.querySelector(".md-image-upload-insert")?.addEventListener("click", () => this.handleInsert());
41966
+ body.appendChild(tabs);
41967
+ body.appendChild(uploadPanel);
41968
+ body.appendChild(urlPanel);
41969
+ body.appendChild(preview);
41970
+ body.appendChild(errorEl);
41971
+ body.appendChild(progressEl);
41972
+ body.appendChild(altRow);
41973
+ body.appendChild(footer);
41974
+ this.dialog.appendChild(header);
41975
+ this.dialog.appendChild(body);
41976
+ this.overlay.appendChild(this.dialog);
41977
+ document.body.appendChild(this.overlay);
41978
+ }
41979
+ switchTab(tab) {
41980
+ this.activeTab = tab;
41981
+ if (!this.dialog) return;
41982
+ const tabs = this.dialog.querySelectorAll(".md-image-upload-tab");
41983
+ tabs[0]?.classList.toggle("md-image-upload-tab-active", tab === "upload");
41984
+ tabs[1]?.classList.toggle("md-image-upload-tab-active", tab === "url");
41985
+ const uploadPanel = this.dialog.querySelector(".md-image-upload-panel-upload");
41986
+ const urlPanel = this.dialog.querySelector(".md-image-upload-panel-url");
41987
+ if (uploadPanel) uploadPanel.style.display = tab === "upload" ? "" : "none";
41988
+ if (urlPanel) urlPanel.style.display = tab === "url" ? "" : "none";
41989
+ }
41990
+ showError(message) {
41991
+ const errorEl = this.dialog?.querySelector(".md-image-upload-error");
41992
+ if (errorEl) {
41993
+ errorEl.textContent = message;
41994
+ errorEl.style.display = "block";
41995
+ }
41996
+ }
41997
+ clearError() {
41998
+ const errorEl = this.dialog?.querySelector(".md-image-upload-error");
41999
+ if (errorEl) {
42000
+ errorEl.style.display = "none";
42001
+ errorEl.textContent = "";
42002
+ }
42003
+ }
42004
+ handleFileSelected(file) {
42005
+ this.clearError();
42006
+ const t = this.options.trans;
42007
+ if (!ACCEPTED_IMAGE_TYPES.includes(file.type)) {
42008
+ this.showError(t("Invalid file type"));
42009
+ return;
42010
+ }
42011
+ const maxSize = this.options.uploadMaxSize ?? DEFAULT_MAX_FILE_SIZE;
42012
+ if (file.size > maxSize) {
42013
+ this.showError(t("File too large"));
42014
+ return;
42015
+ }
42016
+ this.currentFile = file;
42017
+ this.showFilePreview(file);
42018
+ const dropzoneText = this.dialog?.querySelector(".md-image-upload-dropzone-text");
42019
+ if (dropzoneText) {
42020
+ dropzoneText.textContent = file.name;
42021
+ }
42022
+ const insertBtn = this.dialog?.querySelector(".md-image-upload-insert");
42023
+ if (insertBtn) {
42024
+ insertBtn.disabled = false;
42025
+ }
42026
+ }
42027
+ showFilePreview(file) {
42028
+ const preview = this.dialog?.querySelector(".md-image-upload-preview");
42029
+ if (!preview) return;
42030
+ const objectUrl = URL.createObjectURL(file);
42031
+ const img = document.createElement("img");
42032
+ img.src = objectUrl;
42033
+ img.alt = "Preview";
42034
+ img.onload = () => URL.revokeObjectURL(objectUrl);
42035
+ preview.innerHTML = "";
42036
+ preview.appendChild(img);
42037
+ preview.style.display = "block";
42038
+ }
42039
+ handleUrlInput(url) {
42040
+ this.clearError();
42041
+ const preview = this.dialog?.querySelector(".md-image-upload-preview");
42042
+ const insertBtn = this.dialog?.querySelector(".md-image-upload-insert");
42043
+ if (!url.trim()) {
42044
+ if (preview) {
42045
+ preview.innerHTML = "";
42046
+ preview.style.display = "none";
42047
+ }
42048
+ if (insertBtn) insertBtn.disabled = true;
42049
+ return;
42050
+ }
42051
+ if (!this.isValidUrl(url)) {
42052
+ if (insertBtn) insertBtn.disabled = true;
42053
+ return;
42054
+ }
42055
+ if (preview) {
42056
+ const img = document.createElement("img");
42057
+ img.src = url;
42058
+ img.alt = "Preview";
42059
+ img.onerror = () => {
42060
+ preview.innerHTML = "";
42061
+ preview.style.display = "none";
42062
+ if (insertBtn) insertBtn.disabled = true;
42063
+ this.showError(this.options.trans("Invalid image URL"));
42064
+ };
42065
+ img.onload = () => {
42066
+ if (insertBtn) insertBtn.disabled = false;
42067
+ };
42068
+ preview.innerHTML = "";
42069
+ preview.appendChild(img);
42070
+ preview.style.display = "block";
42071
+ }
42072
+ }
42073
+ isValidUrl(url) {
42074
+ try {
42075
+ const parsed = new URL(url, window.location.href);
42076
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
42077
+ } catch {
42078
+ return false;
42079
+ }
42080
+ }
42081
+ async handleInsert() {
42082
+ if (this.uploading) return;
42083
+ const altInput = this.dialog?.querySelector(".md-image-upload-alt-input");
42084
+ const alt = altInput?.value?.trim() || void 0;
42085
+ if (this.activeTab === "url") {
42086
+ const urlInput = this.dialog?.querySelector(".md-image-upload-url-input");
42087
+ const url = urlInput?.value?.trim();
42088
+ if (url && this.isValidUrl(url)) {
42089
+ this.options.onInsert(url, alt);
42090
+ this.close();
42091
+ }
42092
+ return;
42093
+ }
42094
+ if (!this.currentFile) return;
42095
+ try {
42096
+ const src = await this.uploadFile(this.currentFile);
42097
+ this.options.onInsert(src, alt);
42098
+ this.close();
42099
+ } catch (err) {
42100
+ this.showError(this.options.trans("Upload failed"));
42101
+ }
42102
+ }
42103
+ uploadFile(file) {
42104
+ if (!ACCEPTED_IMAGE_TYPES.includes(file.type)) {
42105
+ return Promise.reject(new Error("Invalid file type"));
42106
+ }
42107
+ const maxSize = this.options.uploadMaxSize ?? DEFAULT_MAX_FILE_SIZE;
42108
+ if (file.size > maxSize) {
42109
+ return Promise.reject(new Error("File too large"));
42110
+ }
42111
+ if (file.type === "image/svg+xml") {
42112
+ return this.sanitizeAndUploadSVG(file);
42113
+ }
42114
+ if (!this.options.uploadUrl) {
42115
+ return this.readAsBase64(file);
42116
+ }
42117
+ return this.uploadViaXHR(file);
42118
+ }
42119
+ sanitizeAndUploadSVG(file) {
42120
+ return new Promise((resolve, reject) => {
42121
+ const reader = new FileReader();
42122
+ reader.onload = () => {
42123
+ const svgText = reader.result;
42124
+ const sanitized = sanitizeSVG(svgText);
42125
+ if (!sanitized) {
42126
+ reject(new Error("Invalid SVG file"));
42127
+ return;
42128
+ }
42129
+ const sanitizedBlob = new Blob([sanitized], { type: "image/svg+xml" });
42130
+ const sanitizedFile = new File([sanitizedBlob], file.name, { type: "image/svg+xml" });
42131
+ if (!this.options.uploadUrl) {
42132
+ this.readAsBase64(sanitizedFile).then(resolve, reject);
42133
+ } else {
42134
+ this.uploadViaXHR(sanitizedFile).then(resolve, reject);
42135
+ }
42136
+ };
42137
+ reader.onerror = () => reject(new Error("Failed to read file"));
42138
+ reader.readAsText(file);
42139
+ });
42140
+ }
42141
+ readAsBase64(file) {
42142
+ return new Promise((resolve, reject) => {
42143
+ const reader = new FileReader();
42144
+ reader.onload = () => {
42145
+ if (typeof reader.result === "string") {
42146
+ resolve(reader.result);
42147
+ } else {
42148
+ reject(new Error("Failed to read file"));
42149
+ }
42150
+ };
42151
+ reader.onerror = () => reject(new Error("Failed to read file"));
42152
+ reader.readAsDataURL(file);
42153
+ });
42154
+ }
42155
+ uploadViaXHR(file) {
42156
+ return new Promise((resolve, reject) => {
42157
+ this.uploading = true;
42158
+ const progressEl = this.dialog?.querySelector(".md-image-upload-progress");
42159
+ const progressFill = this.dialog?.querySelector(".md-image-upload-progress-fill");
42160
+ const progressText = this.dialog?.querySelector(".md-image-upload-progress-text");
42161
+ const insertBtn = this.dialog?.querySelector(".md-image-upload-insert");
42162
+ if (progressEl) progressEl.style.display = "flex";
42163
+ if (insertBtn) insertBtn.disabled = true;
42164
+ const xhr = new XMLHttpRequest();
42165
+ const formData = new FormData();
42166
+ formData.append("file", file, file.name);
42167
+ xhr.upload.addEventListener("progress", (e) => {
42168
+ if (e.lengthComputable && progressFill && progressText) {
42169
+ const pct = Math.round(e.loaded / e.total * 100);
42170
+ progressFill.style.width = `${pct}%`;
42171
+ progressText.textContent = `${pct}%`;
42172
+ }
42173
+ });
42174
+ xhr.addEventListener("load", () => {
42175
+ this.uploading = false;
42176
+ if (progressEl) progressEl.style.display = "none";
42177
+ if (xhr.status >= 200 && xhr.status < 300) {
42178
+ try {
42179
+ const response = JSON.parse(xhr.responseText);
42180
+ let url = response.location || response.url || response.link;
42181
+ if (!url) {
42182
+ reject(new Error("No URL returned from server"));
42183
+ return;
42184
+ }
42185
+ const basePath = this.options.uploadBasePath ?? "/";
42186
+ if (url && !url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("data:")) {
42187
+ url = basePath.replace(/\/$/, "") + "/" + url.replace(/^\//, "");
42188
+ }
42189
+ resolve(url);
42190
+ } catch {
42191
+ reject(new Error("Invalid server response"));
42192
+ }
42193
+ } else {
42194
+ reject(new Error(`Upload failed: ${xhr.status}`));
42195
+ }
42196
+ });
42197
+ xhr.addEventListener("error", () => {
42198
+ this.uploading = false;
42199
+ if (progressEl) progressEl.style.display = "none";
42200
+ reject(new Error("Network error"));
42201
+ });
42202
+ xhr.addEventListener("abort", () => {
42203
+ this.uploading = false;
42204
+ if (progressEl) progressEl.style.display = "none";
42205
+ reject(new Error("Upload aborted"));
42206
+ });
42207
+ xhr.open("POST", this.options.uploadUrl);
42208
+ if (this.options.uploadCredentials !== false) {
42209
+ xhr.withCredentials = true;
42210
+ }
42211
+ if (this.options.uploadHeaders) {
42212
+ for (const [key, value] of Object.entries(this.options.uploadHeaders)) {
42213
+ xhr.setRequestHeader(key, value);
42214
+ }
42215
+ }
42216
+ xhr.send(formData);
42217
+ });
42218
+ }
42219
+ destroy() {
42220
+ if (this.overlay) {
42221
+ this.overlay.remove();
42222
+ this.overlay = null;
42223
+ this.dialog = null;
42224
+ this.fileInput = null;
42225
+ }
42226
+ }
42227
+ }
41489
42228
  class SearchReplace {
41490
42229
  options;
41491
42230
  overlay = null;
@@ -41773,8 +42512,13 @@ class Toolbar {
41773
42512
  dropdowns = /* @__PURE__ */ new Map();
41774
42513
  charMap = null;
41775
42514
  emojiPicker = null;
42515
+ imageUpload = null;
41776
42516
  searchReplace = null;
41777
42517
  updateInterval = null;
42518
+ boundClickHandler = null;
42519
+ boundKeydownHandler = null;
42520
+ overflowEl = null;
42521
+ toggleBtn = null;
41778
42522
  constructor(container, options) {
41779
42523
  this.container = container;
41780
42524
  this.options = options;
@@ -41792,10 +42536,36 @@ class Toolbar {
41792
42536
  get trans() {
41793
42537
  return getTranslate();
41794
42538
  }
42539
+ icon(name) {
42540
+ return this.options.iconSet[name] ?? name;
42541
+ }
41795
42542
  render() {
41796
42543
  this.container.innerHTML = "";
41797
42544
  this.container.className = `md-toolbar md-toolbar-${this.options.mode}${this.options.sticky ? " md-toolbar-sticky" : ""}`;
41798
- const groups = this.options.buttons.split("|").map((g) => g.trim());
42545
+ const rows = this.options.buttons.split("||");
42546
+ const hasOverflow = rows.length > 1;
42547
+ if (hasOverflow) {
42548
+ const primaryEl = document.createElement("div");
42549
+ primaryEl.className = "md-toolbar-primary";
42550
+ this.renderGroups(rows[0].trim(), primaryEl);
42551
+ this.toggleBtn = this.createToggleButton();
42552
+ primaryEl.appendChild(this.toggleBtn);
42553
+ this.container.appendChild(primaryEl);
42554
+ this.overflowEl = document.createElement("div");
42555
+ this.overflowEl.className = "md-toolbar-overflow";
42556
+ const overflowStr = rows.slice(1).join("||").trim();
42557
+ this.renderGroups(overflowStr, this.overflowEl);
42558
+ this.container.appendChild(this.overflowEl);
42559
+ if (this.state.showMoreButtons) {
42560
+ this.overflowEl.classList.add("md-toolbar-overflow-visible");
42561
+ this.toggleBtn.classList.add("md-toolbar-btn-active");
42562
+ }
42563
+ } else {
42564
+ this.renderGroups(this.options.buttons, this.container);
42565
+ }
42566
+ }
42567
+ renderGroups(buttonsStr, parent) {
42568
+ const groups = buttonsStr.split("|").map((g) => g.trim()).filter(Boolean);
41799
42569
  groups.forEach((group, index) => {
41800
42570
  const groupEl = document.createElement("div");
41801
42571
  groupEl.className = "md-toolbar-group";
@@ -41807,14 +42577,36 @@ class Toolbar {
41807
42577
  this.buttonElements.set(buttonName, buttonEl);
41808
42578
  }
41809
42579
  });
41810
- this.container.appendChild(groupEl);
42580
+ parent.appendChild(groupEl);
41811
42581
  if (index < groups.length - 1) {
41812
42582
  const separator = document.createElement("div");
41813
42583
  separator.className = "md-toolbar-separator";
41814
- this.container.appendChild(separator);
42584
+ parent.appendChild(separator);
41815
42585
  }
41816
42586
  });
41817
42587
  }
42588
+ createToggleButton() {
42589
+ const button = document.createElement("button");
42590
+ button.type = "button";
42591
+ button.className = "md-toolbar-btn md-toolbar-toggle-btn";
42592
+ button.setAttribute("data-button", "togglemore");
42593
+ button.title = this.trans("More");
42594
+ button.innerHTML = `<span class="md-toolbar-btn-icon">${this.icon("togglemore")}</span>`;
42595
+ button.addEventListener("click", (e) => {
42596
+ e.preventDefault();
42597
+ this.toggleOverflow();
42598
+ });
42599
+ return button;
42600
+ }
42601
+ toggleOverflow() {
42602
+ this.state.showMoreButtons = !this.state.showMoreButtons;
42603
+ if (this.overflowEl) {
42604
+ this.overflowEl.classList.toggle("md-toolbar-overflow-visible", this.state.showMoreButtons);
42605
+ }
42606
+ if (this.toggleBtn) {
42607
+ this.toggleBtn.classList.toggle("md-toolbar-btn-active", this.state.showMoreButtons);
42608
+ }
42609
+ }
41818
42610
  createButton(name) {
41819
42611
  const customSpec = this.options.customButtons.get(name);
41820
42612
  if (customSpec) {
@@ -41822,43 +42614,43 @@ class Toolbar {
41822
42614
  }
41823
42615
  switch (name.toLowerCase()) {
41824
42616
  case "bold":
41825
- return this.createActionButton("bold", "B", this.trans("Bold"), () => {
42617
+ return this.createActionButton("bold", this.icon("bold"), this.trans("Bold"), () => {
41826
42618
  this.tiptap?.chain().focus().toggleBold().run();
41827
42619
  }, () => this.tiptap?.isActive("bold") ?? false);
41828
42620
  case "italic":
41829
- return this.createActionButton("italic", "I", this.trans("Italic"), () => {
42621
+ return this.createActionButton("italic", this.icon("italic"), this.trans("Italic"), () => {
41830
42622
  this.tiptap?.chain().focus().toggleItalic().run();
41831
42623
  }, () => this.tiptap?.isActive("italic") ?? false);
41832
42624
  case "underline":
41833
- return this.createActionButton("underline", "U", this.trans("Underline"), () => {
42625
+ return this.createActionButton("underline", this.icon("underline"), this.trans("Underline"), () => {
41834
42626
  this.tiptap?.chain().focus().toggleUnderline().run();
41835
42627
  }, () => this.tiptap?.isActive("underline") ?? false);
41836
42628
  case "strikethrough":
41837
- return this.createActionButton("strikethrough", "S", this.trans("Strikethrough"), () => {
42629
+ return this.createActionButton("strikethrough", this.icon("strikethrough"), this.trans("Strikethrough"), () => {
41838
42630
  this.tiptap?.chain().focus().toggleStrike().run();
41839
42631
  }, () => this.tiptap?.isActive("strike") ?? false);
41840
42632
  case "bullist":
41841
- return this.createActionButton("bullist", "", this.trans("Bullet list"), () => {
42633
+ return this.createActionButton("bullist", this.icon("bullist"), this.trans("Bullet list"), () => {
41842
42634
  this.tiptap?.chain().focus().toggleBulletList().run();
41843
42635
  }, () => this.tiptap?.isActive("bulletList") ?? false);
41844
42636
  case "numlist":
41845
- return this.createActionButton("numlist", "1.", this.trans("Numbered list"), () => {
42637
+ return this.createActionButton("numlist", this.icon("numlist"), this.trans("Numbered list"), () => {
41846
42638
  this.tiptap?.chain().focus().toggleOrderedList().run();
41847
42639
  }, () => this.tiptap?.isActive("orderedList") ?? false);
41848
42640
  case "outdent":
41849
- return this.createActionButton("outdent", "", this.trans("Decrease indent"), () => {
42641
+ return this.createActionButton("outdent", this.icon("outdent"), this.trans("Decrease indent"), () => {
41850
42642
  if (this.tiptap?.isActive("listItem")) {
41851
42643
  this.tiptap?.chain().focus().liftListItem("listItem").run();
41852
42644
  }
41853
42645
  });
41854
42646
  case "indent":
41855
- return this.createActionButton("indent", "", this.trans("Increase indent"), () => {
42647
+ return this.createActionButton("indent", this.icon("indent"), this.trans("Increase indent"), () => {
41856
42648
  if (this.tiptap?.isActive("listItem")) {
41857
42649
  this.tiptap?.chain().focus().sinkListItem("listItem").run();
41858
42650
  }
41859
42651
  });
41860
42652
  case "blockquote":
41861
- return this.createActionButton("blockquote", '"', this.trans("Blockquote"), () => {
42653
+ return this.createActionButton("blockquote", this.icon("blockquote"), this.trans("Blockquote"), () => {
41862
42654
  this.tiptap?.chain().focus().toggleBlockquote().run();
41863
42655
  }, () => this.tiptap?.isActive("blockquote") ?? false);
41864
42656
  case "fontfamily":
@@ -41868,19 +42660,19 @@ class Toolbar {
41868
42660
  case "lineheight":
41869
42661
  return this.createLineHeightDropdown();
41870
42662
  case "alignleft":
41871
- return this.createActionButton("alignleft", "", this.trans("Align left"), () => {
42663
+ return this.createActionButton("alignleft", this.icon("alignleft"), this.trans("Align left"), () => {
41872
42664
  this.tiptap?.chain().focus().setTextAlign("left").run();
41873
42665
  }, () => this.tiptap?.isActive({ textAlign: "left" }) ?? false);
41874
42666
  case "aligncenter":
41875
- return this.createActionButton("aligncenter", "", this.trans("Align center"), () => {
42667
+ return this.createActionButton("aligncenter", this.icon("aligncenter"), this.trans("Align center"), () => {
41876
42668
  this.tiptap?.chain().focus().setTextAlign("center").run();
41877
42669
  }, () => this.tiptap?.isActive({ textAlign: "center" }) ?? false);
41878
42670
  case "alignright":
41879
- return this.createActionButton("alignright", "", this.trans("Align right"), () => {
42671
+ return this.createActionButton("alignright", this.icon("alignright"), this.trans("Align right"), () => {
41880
42672
  this.tiptap?.chain().focus().setTextAlign("right").run();
41881
42673
  }, () => this.tiptap?.isActive({ textAlign: "right" }) ?? false);
41882
42674
  case "alignjustify":
41883
- return this.createActionButton("alignjustify", "", this.trans("Justify"), () => {
42675
+ return this.createActionButton("alignjustify", this.icon("alignjustify"), this.trans("Justify"), () => {
41884
42676
  this.tiptap?.chain().focus().setTextAlign("justify").run();
41885
42677
  }, () => this.tiptap?.isActive({ textAlign: "justify" }) ?? false);
41886
42678
  case "forecolor":
@@ -41892,71 +42684,71 @@ class Toolbar {
41892
42684
  this.tiptap?.chain().focus().setHighlight({ color }).run();
41893
42685
  });
41894
42686
  case "removeformat":
41895
- return this.createActionButton("removeformat", "", this.trans("Remove formatting"), () => {
42687
+ return this.createActionButton("removeformat", this.icon("removeformat"), this.trans("Remove formatting"), () => {
41896
42688
  this.tiptap?.chain().focus().unsetAllMarks().clearNodes().run();
41897
42689
  });
41898
42690
  case "copy":
41899
- return this.createActionButton("copy", "📋", this.trans("Copy"), () => {
42691
+ return this.createActionButton("copy", this.icon("copy"), this.trans("Copy"), () => {
41900
42692
  document.execCommand("copy");
41901
42693
  });
41902
42694
  case "cut":
41903
- return this.createActionButton("cut", "", this.trans("Cut"), () => {
42695
+ return this.createActionButton("cut", this.icon("cut"), this.trans("Cut"), () => {
41904
42696
  document.execCommand("cut");
41905
42697
  });
41906
42698
  case "paste":
41907
- return this.createActionButton("paste", "📄", this.trans("Paste"), () => {
42699
+ return this.createActionButton("paste", this.icon("paste"), this.trans("Paste"), () => {
41908
42700
  document.execCommand("paste");
41909
42701
  });
41910
42702
  case "undo":
41911
- return this.createActionButton("undo", "", this.trans("Undo"), () => {
42703
+ return this.createActionButton("undo", this.icon("undo"), this.trans("Undo"), () => {
41912
42704
  this.tiptap?.chain().focus().undo().run();
41913
42705
  });
41914
42706
  case "redo":
41915
- return this.createActionButton("redo", "", this.trans("Redo"), () => {
42707
+ return this.createActionButton("redo", this.icon("redo"), this.trans("Redo"), () => {
41916
42708
  this.tiptap?.chain().focus().redo().run();
41917
42709
  });
41918
42710
  case "image":
41919
- return this.createActionButton("image", "🖼", this.trans("Insert image"), () => {
42711
+ return this.createActionButton("image", this.icon("image"), this.trans("Insert image"), () => {
41920
42712
  this.openImageDialog();
41921
42713
  });
41922
42714
  case "charmap":
41923
- return this.createActionButton("charmap", "Ω", this.trans("Special character"), () => {
42715
+ return this.createActionButton("charmap", this.icon("charmap"), this.trans("Special character"), () => {
41924
42716
  this.openCharMap();
41925
42717
  });
41926
42718
  case "emoticons":
41927
- return this.createActionButton("emoticons", "😀", this.trans("Emoticons"), () => {
42719
+ return this.createActionButton("emoticons", this.icon("emoticons"), this.trans("Emoticons"), () => {
41928
42720
  this.openEmojiPicker();
41929
42721
  });
41930
42722
  case "fullscreen":
41931
- return this.createActionButton("fullscreen", "", this.trans("Fullscreen"), () => {
42723
+ return this.createActionButton("fullscreen", this.icon("fullscreen"), this.trans("Fullscreen"), () => {
41932
42724
  this.toggleFullscreen();
41933
42725
  }, () => this.state.isFullscreen);
41934
42726
  case "preview":
41935
- return this.createActionButton("preview", "👁", this.trans("Preview"), () => {
42727
+ return this.createActionButton("preview", this.icon("preview"), this.trans("Preview"), () => {
41936
42728
  this.openPreview();
41937
42729
  });
41938
42730
  case "code":
41939
- return this.createActionButton("code", "</>", this.trans("Source code"), () => {
42731
+ return this.createActionButton("code", this.icon("code"), this.trans("Source code"), () => {
41940
42732
  this.openSourceCode();
41941
42733
  });
41942
42734
  case "link":
41943
- return this.createActionButton("link", "🔗", this.trans("Insert link"), () => {
42735
+ return this.createActionButton("link", this.icon("link"), this.trans("Insert link"), () => {
41944
42736
  this.openLinkDialog();
41945
42737
  }, () => this.tiptap?.isActive("link") ?? false);
41946
42738
  case "codesample":
41947
- return this.createActionButton("codesample", "{}", this.trans("Code sample"), () => {
42739
+ return this.createActionButton("codesample", this.icon("codesample"), this.trans("Code sample"), () => {
41948
42740
  this.tiptap?.chain().focus().toggleCodeBlock().run();
41949
42741
  }, () => this.tiptap?.isActive("codeBlock") ?? false);
41950
42742
  case "ltr":
41951
- return this.createActionButton("ltr", "", this.trans("Left to right"), () => {
42743
+ return this.createActionButton("ltr", this.icon("ltr"), this.trans("Left to right"), () => {
41952
42744
  this.tiptap?.chain().focus().setTextDirection("ltr").run();
41953
42745
  });
41954
42746
  case "rtl":
41955
- return this.createActionButton("rtl", "", this.trans("Right to left"), () => {
42747
+ return this.createActionButton("rtl", this.icon("rtl"), this.trans("Right to left"), () => {
41956
42748
  this.tiptap?.chain().focus().setTextDirection("rtl").run();
41957
42749
  });
41958
42750
  case "searchreplace":
41959
- return this.createActionButton("searchreplace", "🔍", this.trans("Find and replace"), () => {
42751
+ return this.createActionButton("searchreplace", this.icon("searchreplace"), this.trans("Find and replace"), () => {
41960
42752
  this.openSearchReplace();
41961
42753
  });
41962
42754
  case "template":
@@ -42055,8 +42847,12 @@ class Toolbar {
42055
42847
  value: t.content,
42056
42848
  description: t.description
42057
42849
  }));
42058
- return this.createDropdown("template", this.trans("Templates"), options, (template) => {
42059
- this.tiptap?.chain().focus().insertContent(template.value).run();
42850
+ return this.createDropdown("template", this.trans("Templates"), options, (selected) => {
42851
+ this.tiptap?.chain().focus().insertContent(selected.value).run();
42852
+ const matched = templates.find((t) => t.content === selected.value);
42853
+ if (matched) {
42854
+ this.options.editor.fire("templatechange", matched);
42855
+ }
42060
42856
  });
42061
42857
  }
42062
42858
  createDropdown(name, label, options, onSelect, getCurrentValue) {
@@ -42194,13 +42990,15 @@ class Toolbar {
42194
42990
  return wrapper;
42195
42991
  }
42196
42992
  bindEvents() {
42197
- document.addEventListener("click", (e) => {
42993
+ this.unbindEvents();
42994
+ this.boundClickHandler = (e) => {
42198
42995
  const target = e.target;
42199
42996
  if (!target.closest(".md-toolbar-dropdown, .md-toolbar-colorpicker")) {
42200
42997
  this.closeAllDropdowns();
42201
42998
  }
42202
- });
42203
- document.addEventListener("keydown", (e) => {
42999
+ };
43000
+ document.addEventListener("click", this.boundClickHandler);
43001
+ this.boundKeydownHandler = (e) => {
42204
43002
  if (!this.tiptap?.isFocused) return;
42205
43003
  const isMod = e.ctrlKey || e.metaKey;
42206
43004
  if (isMod && e.key === "b") {
@@ -42223,7 +43021,18 @@ class Toolbar {
42223
43021
  e.preventDefault();
42224
43022
  this.openSearchReplace();
42225
43023
  }
42226
- });
43024
+ };
43025
+ document.addEventListener("keydown", this.boundKeydownHandler);
43026
+ }
43027
+ unbindEvents() {
43028
+ if (this.boundClickHandler) {
43029
+ document.removeEventListener("click", this.boundClickHandler);
43030
+ this.boundClickHandler = null;
43031
+ }
43032
+ if (this.boundKeydownHandler) {
43033
+ document.removeEventListener("keydown", this.boundKeydownHandler);
43034
+ this.boundKeydownHandler = null;
43035
+ }
42227
43036
  }
42228
43037
  closeAllDropdowns() {
42229
43038
  this.dropdowns.forEach((dropdown) => {
@@ -42292,10 +43101,20 @@ class Toolbar {
42292
43101
  }
42293
43102
  // Dialog methods
42294
43103
  openImageDialog() {
42295
- const url = prompt(this.trans("Enter image URL:"));
42296
- if (url) {
42297
- this.tiptap?.chain().focus().setImage({ src: url }).run();
43104
+ if (!this.imageUpload) {
43105
+ this.imageUpload = new ImageUpload({
43106
+ onInsert: (src, alt) => {
43107
+ this.tiptap?.chain().focus().setImage({ src, alt: alt ?? "" }).run();
43108
+ },
43109
+ uploadUrl: this.options.config.images_upload_url,
43110
+ uploadCredentials: this.options.config.images_upload_credentials,
43111
+ uploadBasePath: this.options.config.images_upload_base_path,
43112
+ uploadMaxSize: this.options.config.images_upload_max_size,
43113
+ uploadHeaders: this.options.config.images_upload_headers,
43114
+ trans: this.trans
43115
+ });
42298
43116
  }
43117
+ this.imageUpload.open();
42299
43118
  }
42300
43119
  openLinkDialog() {
42301
43120
  const previousUrl = this.tiptap?.getAttributes("link").href ?? "";
@@ -42375,18 +43194,108 @@ class Toolbar {
42375
43194
  }
42376
43195
  this.updateButtonStates();
42377
43196
  }
43197
+ rebuild() {
43198
+ this.charMap?.destroy();
43199
+ this.charMap = null;
43200
+ this.emojiPicker?.destroy();
43201
+ this.emojiPicker = null;
43202
+ this.imageUpload?.destroy();
43203
+ this.imageUpload = null;
43204
+ this.searchReplace?.destroy();
43205
+ this.searchReplace = null;
43206
+ this.buttonElements.clear();
43207
+ this.dropdowns.clear();
43208
+ this.overflowEl = null;
43209
+ this.toggleBtn = null;
43210
+ this.render();
43211
+ this.bindEvents();
43212
+ }
42378
43213
  destroy() {
42379
43214
  if (this.updateInterval) {
42380
43215
  clearInterval(this.updateInterval);
42381
43216
  }
43217
+ this.unbindEvents();
42382
43218
  this.charMap?.destroy();
42383
43219
  this.emojiPicker?.destroy();
43220
+ this.imageUpload?.destroy();
42384
43221
  this.searchReplace?.destroy();
42385
43222
  this.buttonElements.clear();
42386
43223
  this.dropdowns.clear();
42387
43224
  this.container.innerHTML = "";
42388
43225
  }
42389
43226
  }
43227
+ const SVG_ALIGN_LEFT = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="15" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>';
43228
+ const SVG_ALIGN_CENTER = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="6" y1="12" x2="18" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>';
43229
+ const SVG_ALIGN_RIGHT = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="9" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>';
43230
+ const SVG_ALIGN_JUSTIFY = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>';
43231
+ const SVG_IMAGE = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>';
43232
+ const SVG_CODE = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>';
43233
+ const DEFAULT_ICONS = {
43234
+ bold: "B",
43235
+ italic: "I",
43236
+ underline: "U",
43237
+ strikethrough: "S",
43238
+ bullist: "•",
43239
+ numlist: "1.",
43240
+ outdent: "←",
43241
+ indent: "→",
43242
+ blockquote: '"',
43243
+ alignleft: SVG_ALIGN_LEFT,
43244
+ aligncenter: SVG_ALIGN_CENTER,
43245
+ alignright: SVG_ALIGN_RIGHT,
43246
+ alignjustify: SVG_ALIGN_JUSTIFY,
43247
+ removeformat: "✕",
43248
+ copy: "📋",
43249
+ cut: "✂",
43250
+ paste: "📄",
43251
+ undo: "↩",
43252
+ redo: "↪",
43253
+ image: SVG_IMAGE,
43254
+ charmap: "Ω",
43255
+ emoticons: "😀",
43256
+ fullscreen: "⛶",
43257
+ preview: "👁",
43258
+ code: SVG_CODE,
43259
+ link: "🔗",
43260
+ codesample: "{}",
43261
+ ltr: "⇐",
43262
+ rtl: "⇒",
43263
+ searchreplace: "🔍",
43264
+ togglemore: "…"
43265
+ };
43266
+ const CONFAB_ICONS = {
43267
+ bold: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"/><path d="M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"/></svg>',
43268
+ italic: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="19" y1="4" x2="10" y2="4"/><line x1="14" y1="20" x2="5" y2="20"/><line x1="15" y1="4" x2="9" y2="20"/></svg>',
43269
+ underline: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3"/><line x1="4" y1="21" x2="20" y2="21"/></svg>',
43270
+ strikethrough: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 4c-1.5-1-3.2-1.5-5-1.5C7.7 2.5 5 4.6 5 7.5c0 1.5.7 2.7 1.8 3.5"/><path d="M8 20c1.5 1 3.2 1.5 5 1.5 3.3 0 6-2.1 6-5 0-1.5-.7-2.7-1.8-3.5"/><line x1="2" y1="12" x2="22" y2="12"/></svg>',
43271
+ bullist: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="9" y1="6" x2="20" y2="6"/><line x1="9" y1="12" x2="20" y2="12"/><line x1="9" y1="18" x2="20" y2="18"/><circle cx="5" cy="6" r="1" fill="currentColor" stroke="none"/><circle cx="5" cy="12" r="1" fill="currentColor" stroke="none"/><circle cx="5" cy="18" r="1" fill="currentColor" stroke="none"/></svg>',
43272
+ numlist: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="10" y1="6" x2="21" y2="6"/><line x1="10" y1="12" x2="21" y2="12"/><line x1="10" y1="18" x2="21" y2="18"/><text x="3" y="8" font-size="7" fill="currentColor" stroke="none" font-family="sans-serif">1</text><text x="3" y="14" font-size="7" fill="currentColor" stroke="none" font-family="sans-serif">2</text><text x="3" y="20" font-size="7" fill="currentColor" stroke="none" font-family="sans-serif">3</text></svg>',
43273
+ outdent: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="4" x2="21" y2="4"/><line x1="3" y1="20" x2="21" y2="20"/><line x1="11" y1="9" x2="21" y2="9"/><line x1="11" y1="15" x2="21" y2="15"/><polyline points="7 9 3 12 7 15"/></svg>',
43274
+ indent: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="4" x2="21" y2="4"/><line x1="3" y1="20" x2="21" y2="20"/><line x1="11" y1="9" x2="21" y2="9"/><line x1="11" y1="15" x2="21" y2="15"/><polyline points="3 9 7 12 3 15"/></svg>',
43275
+ blockquote: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.76-2.02-2-2H4c-1.25 0-2 .76-2 2v6c0 1.25.76 2 2 2h4.5c-1 2-3.5 3.5-5.5 3.5"/><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.76-2.02-2-2h-4c-1.25 0-2 .76-2 2v6c0 1.25.76 2 2 2h4.5c-1 2-3.5 3.5-5.5 3.5"/></svg>',
43276
+ alignleft: SVG_ALIGN_LEFT,
43277
+ aligncenter: SVG_ALIGN_CENTER,
43278
+ alignright: SVG_ALIGN_RIGHT,
43279
+ alignjustify: SVG_ALIGN_JUSTIFY,
43280
+ removeformat: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h11l-3 14"/><line x1="4" y1="7" x2="9" y2="3"/><line x1="18" y1="4" x2="22" y2="8"/><line x1="18" y1="8" x2="22" y2="4"/></svg>',
43281
+ copy: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>',
43282
+ cut: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><line x1="20" y1="4" x2="8.1" y2="15.9"/><line x1="14.5" y1="9.5" x2="20" y2="4"/><line x1="8.1" y1="8.1" x2="20" y2="20"/></svg>',
43283
+ paste: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2"/><rect x="8" y="2" width="8" height="4" rx="1"/></svg>',
43284
+ undo: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="1 4 1 10 7 10"/><path d="M3.5 14a9 9 0 1 0 2.2-5.8L1 10"/></svg>',
43285
+ redo: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"/><path d="M20.5 14a9 9 0 1 1-2.2-5.8L23 10"/></svg>',
43286
+ image: SVG_IMAGE,
43287
+ charmap: "Ω",
43288
+ emoticons: "😀",
43289
+ fullscreen: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" y1="3" x2="14" y2="10"/><line x1="3" y1="21" x2="10" y2="14"/></svg>',
43290
+ preview: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>',
43291
+ code: SVG_CODE,
43292
+ link: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7.1-7.1l-1.7 1.7"/><path d="M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7.1 7.1l1.7-1.7"/></svg>',
43293
+ codesample: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5a2 2 0 0 0 2 2h1"/><path d="M16 3h1a2 2 0 0 1 2 2v5a2 2 0 0 0 2 2 2 2 0 0 0-2 2v5a2 2 0 0 1-2 2h-1"/></svg>',
43294
+ ltr: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="18" y1="5" x2="18" y2="19"/><path d="M8 5a4 4 0 0 0 0 8h4"/><polyline points="4 17 8 21 12 17"/></svg>',
43295
+ rtl: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="6" y1="5" x2="6" y2="19"/><path d="M16 5a4 4 0 0 1 0 8h-4"/><polyline points="20 17 16 21 12 17"/></svg>',
43296
+ searchreplace: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.6" y2="16.6"/></svg>',
43297
+ togglemore: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1" fill="currentColor"/><circle cx="5" cy="12" r="1" fill="currentColor"/><circle cx="19" cy="12" r="1" fill="currentColor"/></svg>'
43298
+ };
42390
43299
  const FontSize = Extension.create({
42391
43300
  name: "fontSize",
42392
43301
  addOptions() {
@@ -42514,20 +43423,2107 @@ const TextDirection = Extension.create({
42514
43423
  };
42515
43424
  }
42516
43425
  });
43426
+ const SignatureBlock = Node3.create({
43427
+ name: "signatureBlock",
43428
+ group: "block",
43429
+ content: "block+",
43430
+ defining: true,
43431
+ isolating: true,
43432
+ addAttributes() {
43433
+ return {
43434
+ id: {
43435
+ default: "signature"
43436
+ }
43437
+ };
43438
+ },
43439
+ parseHTML() {
43440
+ return [
43441
+ {
43442
+ tag: 'div[id="signature"]'
43443
+ }
43444
+ ];
43445
+ },
43446
+ renderHTML({ HTMLAttributes }) {
43447
+ return ["div", mergeAttributes(HTMLAttributes), 0];
43448
+ }
43449
+ });
43450
+ const en = {
43451
+ "Bold": "Bold",
43452
+ "Italic": "Italic",
43453
+ "Underline": "Underline",
43454
+ "Strikethrough": "Strikethrough",
43455
+ "Bullet list": "Bullet list",
43456
+ "Numbered list": "Numbered list",
43457
+ "Decrease indent": "Decrease indent",
43458
+ "Increase indent": "Increase indent",
43459
+ "Blockquote": "Blockquote",
43460
+ "Align left": "Align left",
43461
+ "Align center": "Align center",
43462
+ "Align right": "Align right",
43463
+ "Justify": "Justify",
43464
+ "Text color": "Text color",
43465
+ "Background color": "Background color",
43466
+ "Remove formatting": "Remove formatting",
43467
+ "Copy": "Copy",
43468
+ "Cut": "Cut",
43469
+ "Paste": "Paste",
43470
+ "Undo": "Undo",
43471
+ "Redo": "Redo",
43472
+ "Insert image": "Insert image",
43473
+ "Special character": "Special character",
43474
+ "Emoticons": "Emoticons",
43475
+ "Fullscreen": "Fullscreen",
43476
+ "Preview": "Preview",
43477
+ "Source code": "Source code",
43478
+ "Insert link": "Insert link",
43479
+ "Code sample": "Code sample",
43480
+ "Left to right": "Left to right",
43481
+ "Right to left": "Right to left",
43482
+ "Find and replace": "Find and replace",
43483
+ "Font": "Font",
43484
+ "Font size": "Font size",
43485
+ "Line height": "Line height",
43486
+ "Templates": "Templates",
43487
+ "Apply": "Apply",
43488
+ "Enter image URL:": "Enter image URL:",
43489
+ "Enter URL:": "Enter URL:",
43490
+ "Edit HTML source:": "Edit HTML source:",
43491
+ "Find and Replace": "Find and Replace",
43492
+ "Find": "Find",
43493
+ "Replace": "Replace",
43494
+ "Case sensitive": "Case sensitive",
43495
+ "Whole word": "Whole word",
43496
+ "Previous": "Previous",
43497
+ "Next": "Next",
43498
+ "Replace All": "Replace All",
43499
+ "Search...": "Search...",
43500
+ "Special Character": "Special Character",
43501
+ "Upload": "Upload",
43502
+ "URL": "URL",
43503
+ "Browse...": "Browse...",
43504
+ "Drop image here or click to browse": "Drop image here or click to browse",
43505
+ "Alt text": "Alt text",
43506
+ "Insert": "Insert",
43507
+ "Cancel": "Cancel",
43508
+ "Uploading...": "Uploading...",
43509
+ "Upload failed": "Upload failed",
43510
+ "Invalid image URL": "Invalid image URL",
43511
+ "File too large": "File too large",
43512
+ "Invalid file type": "Invalid file type",
43513
+ "More": "More"
43514
+ };
43515
+ const ar = {
43516
+ "Bold": "غامق",
43517
+ "Italic": "مائل",
43518
+ "Underline": "تسطير",
43519
+ "Strikethrough": "يتوسطه خط",
43520
+ "Bullet list": "قائمة نقطية",
43521
+ "Numbered list": "قائمة مرقمة",
43522
+ "Decrease indent": "تقليل المسافة البادئة",
43523
+ "Increase indent": "زيادة المسافة البادئة",
43524
+ "Blockquote": "اقتباس",
43525
+ "Align left": "محاذاة لليسار",
43526
+ "Align center": "توسيط",
43527
+ "Align right": "محاذاة لليمين",
43528
+ "Justify": "ضبط",
43529
+ "Text color": "لون النص",
43530
+ "Background color": "لون الخلفية",
43531
+ "Remove formatting": "إزالة التنسيق",
43532
+ "Copy": "نسخ",
43533
+ "Cut": "قص",
43534
+ "Paste": "لصق",
43535
+ "Undo": "تراجع",
43536
+ "Redo": "إعادة",
43537
+ "Insert image": "إدراج صورة",
43538
+ "Special character": "حرف خاص",
43539
+ "Emoticons": "رموز تعبيرية",
43540
+ "Fullscreen": "ملء الشاشة",
43541
+ "Preview": "معاينة",
43542
+ "Source code": "شفرة المصدر",
43543
+ "Insert link": "إدراج رابط",
43544
+ "Code sample": "عينة من الشفرة",
43545
+ "Left to right": "من اليسار إلى اليمين",
43546
+ "Right to left": "من اليمين إلى اليسار",
43547
+ "Find and replace": "بحث واستبدال",
43548
+ "Font": "الخط",
43549
+ "Font size": "حجم الخط",
43550
+ "Line height": "ارتفاع السطر",
43551
+ "Templates": "قوالب",
43552
+ "Apply": "تطبيق",
43553
+ "Enter image URL:": "أدخل رابط الصورة:",
43554
+ "Enter URL:": "أدخل الرابط:",
43555
+ "Edit HTML source:": "تحرير مصدر HTML:",
43556
+ "Find and Replace": "بحث واستبدال",
43557
+ "Find": "بحث",
43558
+ "Replace": "استبدال",
43559
+ "Case sensitive": "حساس لحالة الأحرف",
43560
+ "Whole word": "كلمة كاملة",
43561
+ "Previous": "السابق",
43562
+ "Next": "التالي",
43563
+ "Replace All": "استبدال الكل",
43564
+ "Search...": "بحث...",
43565
+ "Special Character": "حرف خاص",
43566
+ "Upload": "رفع",
43567
+ "URL": "رابط",
43568
+ "Browse...": "استعراض...",
43569
+ "Drop image here or click to browse": "أسقط الصورة هنا أو انقر للاستعراض",
43570
+ "Alt text": "نص بديل",
43571
+ "Insert": "إدراج",
43572
+ "Cancel": "إلغاء",
43573
+ "Uploading...": "جارٍ الرفع...",
43574
+ "Upload failed": "فشل الرفع",
43575
+ "Invalid image URL": "رابط صورة غير صالح",
43576
+ "File too large": "الملف كبير جداً",
43577
+ "Invalid file type": "نوع ملف غير صالح",
43578
+ "More": "المزيد"
43579
+ };
43580
+ const ca = {
43581
+ "Bold": "Negreta",
43582
+ "Italic": "Cursiva",
43583
+ "Underline": "Subratllat",
43584
+ "Strikethrough": "Barrat",
43585
+ "Bullet list": "Llista de pics",
43586
+ "Numbered list": "Llista numerada",
43587
+ "Decrease indent": "Reduir sagnat",
43588
+ "Increase indent": "Augmentar sagnat",
43589
+ "Blockquote": "Citació",
43590
+ "Align left": "Alinear a l'esquerra",
43591
+ "Align center": "Centrar",
43592
+ "Align right": "Alinear a la dreta",
43593
+ "Justify": "Justificar",
43594
+ "Text color": "Color del text",
43595
+ "Background color": "Color de fons",
43596
+ "Remove formatting": "Eliminar format",
43597
+ "Copy": "Copiar",
43598
+ "Cut": "Tallar",
43599
+ "Paste": "Enganxar",
43600
+ "Undo": "Desfer",
43601
+ "Redo": "Refer",
43602
+ "Insert image": "Inserir imatge",
43603
+ "Special character": "Caràcter especial",
43604
+ "Emoticons": "Emoticones",
43605
+ "Fullscreen": "Pantalla completa",
43606
+ "Preview": "Previsualització",
43607
+ "Source code": "Codi font",
43608
+ "Insert link": "Inserir enllaç",
43609
+ "Code sample": "Mostra de codi",
43610
+ "Left to right": "D'esquerra a dreta",
43611
+ "Right to left": "De dreta a esquerra",
43612
+ "Find and replace": "Cercar i reemplaçar",
43613
+ "Font": "Tipus de lletra",
43614
+ "Font size": "Mida de lletra",
43615
+ "Line height": "Alçada de línia",
43616
+ "Templates": "Plantilles",
43617
+ "Apply": "Aplicar",
43618
+ "Enter image URL:": "Introduïu l'URL de la imatge:",
43619
+ "Enter URL:": "Introduïu l'URL:",
43620
+ "Edit HTML source:": "Editar codi font HTML:",
43621
+ "Find and Replace": "Cercar i reemplaçar",
43622
+ "Find": "Cercar",
43623
+ "Replace": "Reemplaçar",
43624
+ "Case sensitive": "Distingir majúscules",
43625
+ "Whole word": "Paraula sencera",
43626
+ "Previous": "Anterior",
43627
+ "Next": "Següent",
43628
+ "Replace All": "Reemplaçar tot",
43629
+ "Search...": "Cercar...",
43630
+ "Special Character": "Caràcter especial",
43631
+ "Upload": "Pujar",
43632
+ "URL": "URL",
43633
+ "Browse...": "Explorar...",
43634
+ "Drop image here or click to browse": "Deixa anar la imatge aquí o fes clic per explorar",
43635
+ "Alt text": "Text alternatiu",
43636
+ "Insert": "Inserir",
43637
+ "Cancel": "Cancel·lar",
43638
+ "Uploading...": "Pujant...",
43639
+ "Upload failed": "Error en pujar",
43640
+ "Invalid image URL": "URL d'imatge no vàlida",
43641
+ "File too large": "Fitxer massa gran",
43642
+ "Invalid file type": "Tipus de fitxer no vàlid",
43643
+ "More": "Més"
43644
+ };
43645
+ const zh = {
43646
+ "Bold": "粗体",
43647
+ "Italic": "斜体",
43648
+ "Underline": "下划线",
43649
+ "Strikethrough": "删除线",
43650
+ "Bullet list": "项目符号列表",
43651
+ "Numbered list": "编号列表",
43652
+ "Decrease indent": "减少缩进",
43653
+ "Increase indent": "增加缩进",
43654
+ "Blockquote": "引用",
43655
+ "Align left": "左对齐",
43656
+ "Align center": "居中对齐",
43657
+ "Align right": "右对齐",
43658
+ "Justify": "两端对齐",
43659
+ "Text color": "文字颜色",
43660
+ "Background color": "背景颜色",
43661
+ "Remove formatting": "清除格式",
43662
+ "Copy": "复制",
43663
+ "Cut": "剪切",
43664
+ "Paste": "粘贴",
43665
+ "Undo": "撤销",
43666
+ "Redo": "重做",
43667
+ "Insert image": "插入图片",
43668
+ "Special character": "特殊字符",
43669
+ "Emoticons": "表情符号",
43670
+ "Fullscreen": "全屏",
43671
+ "Preview": "预览",
43672
+ "Source code": "源代码",
43673
+ "Insert link": "插入链接",
43674
+ "Code sample": "代码示例",
43675
+ "Left to right": "从左到右",
43676
+ "Right to left": "从右到左",
43677
+ "Find and replace": "查找和替换",
43678
+ "Font": "字体",
43679
+ "Font size": "字号",
43680
+ "Line height": "行高",
43681
+ "Templates": "模板",
43682
+ "Apply": "应用",
43683
+ "Enter image URL:": "输入图片链接:",
43684
+ "Enter URL:": "输入链接:",
43685
+ "Edit HTML source:": "编辑HTML源代码:",
43686
+ "Find and Replace": "查找和替换",
43687
+ "Find": "查找",
43688
+ "Replace": "替换",
43689
+ "Case sensitive": "区分大小写",
43690
+ "Whole word": "全字匹配",
43691
+ "Previous": "上一个",
43692
+ "Next": "下一个",
43693
+ "Replace All": "全部替换",
43694
+ "Search...": "搜索...",
43695
+ "Special Character": "特殊字符",
43696
+ "Upload": "上传",
43697
+ "URL": "URL",
43698
+ "Browse...": "浏览...",
43699
+ "Drop image here or click to browse": "将图片拖放到此处或点击浏览",
43700
+ "Alt text": "替代文本",
43701
+ "Insert": "插入",
43702
+ "Cancel": "取消",
43703
+ "Uploading...": "上传中...",
43704
+ "Upload failed": "上传失败",
43705
+ "Invalid image URL": "无效的图片 URL",
43706
+ "File too large": "文件过大",
43707
+ "Invalid file type": "无效的文件类型",
43708
+ "More": "更多"
43709
+ };
43710
+ const cs = {
43711
+ "Bold": "Tučné",
43712
+ "Italic": "Kurzíva",
43713
+ "Underline": "Podtržené",
43714
+ "Strikethrough": "Přeškrtnuté",
43715
+ "Bullet list": "Odrážkový seznam",
43716
+ "Numbered list": "Číslovaný seznam",
43717
+ "Decrease indent": "Zmenšit odsazení",
43718
+ "Increase indent": "Zvětšit odsazení",
43719
+ "Blockquote": "Citace",
43720
+ "Align left": "Zarovnat vlevo",
43721
+ "Align center": "Zarovnat na střed",
43722
+ "Align right": "Zarovnat vpravo",
43723
+ "Justify": "Zarovnat do bloku",
43724
+ "Text color": "Barva textu",
43725
+ "Background color": "Barva pozadí",
43726
+ "Remove formatting": "Odstranit formátování",
43727
+ "Copy": "Kopírovat",
43728
+ "Cut": "Vyjmout",
43729
+ "Paste": "Vložit",
43730
+ "Undo": "Zpět",
43731
+ "Redo": "Znovu",
43732
+ "Insert image": "Vložit obrázek",
43733
+ "Special character": "Speciální znak",
43734
+ "Emoticons": "Emotikony",
43735
+ "Fullscreen": "Celá obrazovka",
43736
+ "Preview": "Náhled",
43737
+ "Source code": "Zdrojový kód",
43738
+ "Insert link": "Vložit odkaz",
43739
+ "Code sample": "Ukázka kódu",
43740
+ "Left to right": "Zleva doprava",
43741
+ "Right to left": "Zprava doleva",
43742
+ "Find and replace": "Najít a nahradit",
43743
+ "Font": "Písmo",
43744
+ "Font size": "Velikost písma",
43745
+ "Line height": "Výška řádku",
43746
+ "Templates": "Šablony",
43747
+ "Apply": "Použít",
43748
+ "Enter image URL:": "Zadejte URL obrázku:",
43749
+ "Enter URL:": "Zadejte URL:",
43750
+ "Edit HTML source:": "Upravit HTML zdroj:",
43751
+ "Find and Replace": "Najít a nahradit",
43752
+ "Find": "Najít",
43753
+ "Replace": "Nahradit",
43754
+ "Case sensitive": "Rozlišovat velikost písmen",
43755
+ "Whole word": "Celé slovo",
43756
+ "Previous": "Předchozí",
43757
+ "Next": "Další",
43758
+ "Replace All": "Nahradit vše",
43759
+ "Search...": "Hledat...",
43760
+ "Special Character": "Speciální znak",
43761
+ "Upload": "Nahrát",
43762
+ "URL": "URL",
43763
+ "Browse...": "Procházet...",
43764
+ "Drop image here or click to browse": "Přetáhněte obrázek sem nebo klikněte pro výběr",
43765
+ "Alt text": "Alternativní text",
43766
+ "Insert": "Vložit",
43767
+ "Cancel": "Zrušit",
43768
+ "Uploading...": "Nahrávání...",
43769
+ "Upload failed": "Nahrávání selhalo",
43770
+ "Invalid image URL": "Neplatná URL obrázku",
43771
+ "File too large": "Soubor je příliš velký",
43772
+ "Invalid file type": "Neplatný typ souboru",
43773
+ "More": "Více"
43774
+ };
43775
+ const da = {
43776
+ "Bold": "Fed",
43777
+ "Italic": "Kursiv",
43778
+ "Underline": "Understreget",
43779
+ "Strikethrough": "Gennemstreget",
43780
+ "Bullet list": "Punktliste",
43781
+ "Numbered list": "Nummereret liste",
43782
+ "Decrease indent": "Formindsk indrykning",
43783
+ "Increase indent": "Forøg indrykning",
43784
+ "Blockquote": "Blokcitat",
43785
+ "Align left": "Venstrejuster",
43786
+ "Align center": "Centrer",
43787
+ "Align right": "Højrejuster",
43788
+ "Justify": "Lige margener",
43789
+ "Text color": "Tekstfarve",
43790
+ "Background color": "Baggrundsfarve",
43791
+ "Remove formatting": "Fjern formatering",
43792
+ "Copy": "Kopier",
43793
+ "Cut": "Klip",
43794
+ "Paste": "Indsæt",
43795
+ "Undo": "Fortryd",
43796
+ "Redo": "Annuller fortryd",
43797
+ "Insert image": "Indsæt billede",
43798
+ "Special character": "Specialtegn",
43799
+ "Emoticons": "Humørikoner",
43800
+ "Fullscreen": "Fuldskærm",
43801
+ "Preview": "Forhåndsvisning",
43802
+ "Source code": "Kildekode",
43803
+ "Insert link": "Indsæt link",
43804
+ "Code sample": "Kodeeksempel",
43805
+ "Left to right": "Venstre mod højre",
43806
+ "Right to left": "Højre mod venstre",
43807
+ "Find and replace": "Søg og erstat",
43808
+ "Font": "Skrifttype",
43809
+ "Font size": "Skriftstørrelse",
43810
+ "Line height": "Linjehøjde",
43811
+ "Templates": "Skabeloner",
43812
+ "Apply": "Anvend",
43813
+ "Enter image URL:": "Indtast billed-URL:",
43814
+ "Enter URL:": "Indtast URL:",
43815
+ "Edit HTML source:": "Rediger HTML-kilde:",
43816
+ "Find and Replace": "Søg og erstat",
43817
+ "Find": "Søg",
43818
+ "Replace": "Erstat",
43819
+ "Case sensitive": "Forskel på store/små bogstaver",
43820
+ "Whole word": "Helt ord",
43821
+ "Previous": "Forrige",
43822
+ "Next": "Næste",
43823
+ "Replace All": "Erstat alle",
43824
+ "Search...": "Søg...",
43825
+ "Special Character": "Specialtegn",
43826
+ "Upload": "Upload",
43827
+ "URL": "URL",
43828
+ "Browse...": "Gennemse...",
43829
+ "Drop image here or click to browse": "Træk billede hertil eller klik for at gennemse",
43830
+ "Alt text": "Alternativ tekst",
43831
+ "Insert": "Indsæt",
43832
+ "Cancel": "Annuller",
43833
+ "Uploading...": "Uploader...",
43834
+ "Upload failed": "Upload mislykkedes",
43835
+ "Invalid image URL": "Ugyldig billed-URL",
43836
+ "File too large": "Filen er for stor",
43837
+ "Invalid file type": "Ugyldig filtype",
43838
+ "More": "Mere"
43839
+ };
43840
+ const enGb = {
43841
+ "Bold": "Bold",
43842
+ "Italic": "Italic",
43843
+ "Underline": "Underline",
43844
+ "Strikethrough": "Strikethrough",
43845
+ "Bullet list": "Bullet list",
43846
+ "Numbered list": "Numbered list",
43847
+ "Decrease indent": "Decrease indent",
43848
+ "Increase indent": "Increase indent",
43849
+ "Blockquote": "Blockquote",
43850
+ "Align left": "Align left",
43851
+ "Align center": "Align centre",
43852
+ "Align right": "Align right",
43853
+ "Justify": "Justify",
43854
+ "Text color": "Text colour",
43855
+ "Background color": "Background colour",
43856
+ "Remove formatting": "Remove formatting",
43857
+ "Copy": "Copy",
43858
+ "Cut": "Cut",
43859
+ "Paste": "Paste",
43860
+ "Undo": "Undo",
43861
+ "Redo": "Redo",
43862
+ "Insert image": "Insert image",
43863
+ "Special character": "Special character",
43864
+ "Emoticons": "Emoticons",
43865
+ "Fullscreen": "Fullscreen",
43866
+ "Preview": "Preview",
43867
+ "Source code": "Source code",
43868
+ "Insert link": "Insert link",
43869
+ "Code sample": "Code sample",
43870
+ "Left to right": "Left to right",
43871
+ "Right to left": "Right to left",
43872
+ "Find and replace": "Find and replace",
43873
+ "Font": "Font",
43874
+ "Font size": "Font size",
43875
+ "Line height": "Line height",
43876
+ "Templates": "Templates",
43877
+ "Apply": "Apply",
43878
+ "Enter image URL:": "Enter image URL:",
43879
+ "Enter URL:": "Enter URL:",
43880
+ "Edit HTML source:": "Edit HTML source:",
43881
+ "Find and Replace": "Find and Replace",
43882
+ "Find": "Find",
43883
+ "Replace": "Replace",
43884
+ "Case sensitive": "Case sensitive",
43885
+ "Whole word": "Whole word",
43886
+ "Previous": "Previous",
43887
+ "Next": "Next",
43888
+ "Replace All": "Replace All",
43889
+ "Search...": "Search...",
43890
+ "Special Character": "Special Character",
43891
+ "Upload": "Upload",
43892
+ "URL": "URL",
43893
+ "Browse...": "Browse...",
43894
+ "Drop image here or click to browse": "Drop image here or click to browse",
43895
+ "Alt text": "Alt text",
43896
+ "Insert": "Insert",
43897
+ "Cancel": "Cancel",
43898
+ "Uploading...": "Uploading...",
43899
+ "Upload failed": "Upload failed",
43900
+ "Invalid image URL": "Invalid image URL",
43901
+ "File too large": "File too large",
43902
+ "Invalid file type": "Invalid file type",
43903
+ "More": "More"
43904
+ };
43905
+ const fi = {
43906
+ "Bold": "Lihavoitu",
43907
+ "Italic": "Kursivoitu",
43908
+ "Underline": "Alleviivattu",
43909
+ "Strikethrough": "Yliviivattu",
43910
+ "Bullet list": "Luettelomerkkilista",
43911
+ "Numbered list": "Numeroitu lista",
43912
+ "Decrease indent": "Pienennä sisennystä",
43913
+ "Increase indent": "Suurenna sisennystä",
43914
+ "Blockquote": "Lainaus",
43915
+ "Align left": "Tasaa vasemmalle",
43916
+ "Align center": "Keskitä",
43917
+ "Align right": "Tasaa oikealle",
43918
+ "Justify": "Tasaa molemmat reunat",
43919
+ "Text color": "Tekstin väri",
43920
+ "Background color": "Taustaväri",
43921
+ "Remove formatting": "Poista muotoilu",
43922
+ "Copy": "Kopioi",
43923
+ "Cut": "Leikkaa",
43924
+ "Paste": "Liitä",
43925
+ "Undo": "Kumoa",
43926
+ "Redo": "Tee uudelleen",
43927
+ "Insert image": "Lisää kuva",
43928
+ "Special character": "Erikoismerkki",
43929
+ "Emoticons": "Hymiöt",
43930
+ "Fullscreen": "Koko näyttö",
43931
+ "Preview": "Esikatselu",
43932
+ "Source code": "Lähdekoodi",
43933
+ "Insert link": "Lisää linkki",
43934
+ "Code sample": "Koodiesimerkki",
43935
+ "Left to right": "Vasemmalta oikealle",
43936
+ "Right to left": "Oikealta vasemmalle",
43937
+ "Find and replace": "Etsi ja korvaa",
43938
+ "Font": "Kirjasin",
43939
+ "Font size": "Kirjasinkoko",
43940
+ "Line height": "Rivin korkeus",
43941
+ "Templates": "Mallipohjat",
43942
+ "Apply": "Käytä",
43943
+ "Enter image URL:": "Syötä kuvan URL:",
43944
+ "Enter URL:": "Syötä URL:",
43945
+ "Edit HTML source:": "Muokkaa HTML-lähdekoodia:",
43946
+ "Find and Replace": "Etsi ja korvaa",
43947
+ "Find": "Etsi",
43948
+ "Replace": "Korvaa",
43949
+ "Case sensitive": "Huomioi kirjainkoko",
43950
+ "Whole word": "Koko sana",
43951
+ "Previous": "Edellinen",
43952
+ "Next": "Seuraava",
43953
+ "Replace All": "Korvaa kaikki",
43954
+ "Search...": "Etsi...",
43955
+ "Special Character": "Erikoismerkki",
43956
+ "Upload": "Lataa",
43957
+ "URL": "URL",
43958
+ "Browse...": "Selaa...",
43959
+ "Drop image here or click to browse": "Pudota kuva tähän tai napsauta selataksesi",
43960
+ "Alt text": "Vaihtoehtoinen teksti",
43961
+ "Insert": "Lisää",
43962
+ "Cancel": "Peruuta",
43963
+ "Uploading...": "Ladataan...",
43964
+ "Upload failed": "Lataus epäonnistui",
43965
+ "Invalid image URL": "Virheellinen kuvan URL",
43966
+ "File too large": "Tiedosto on liian suuri",
43967
+ "Invalid file type": "Virheellinen tiedostotyyppi",
43968
+ "More": "Lisää"
43969
+ };
43970
+ const fr = {
43971
+ "Bold": "Gras",
43972
+ "Italic": "Italique",
43973
+ "Underline": "Souligné",
43974
+ "Strikethrough": "Barré",
43975
+ "Bullet list": "Liste à puces",
43976
+ "Numbered list": "Liste numérotée",
43977
+ "Decrease indent": "Réduire le retrait",
43978
+ "Increase indent": "Augmenter le retrait",
43979
+ "Blockquote": "Citation",
43980
+ "Align left": "Aligner à gauche",
43981
+ "Align center": "Centrer",
43982
+ "Align right": "Aligner à droite",
43983
+ "Justify": "Justifier",
43984
+ "Text color": "Couleur du texte",
43985
+ "Background color": "Couleur d'arrière-plan",
43986
+ "Remove formatting": "Supprimer la mise en forme",
43987
+ "Copy": "Copier",
43988
+ "Cut": "Couper",
43989
+ "Paste": "Coller",
43990
+ "Undo": "Annuler",
43991
+ "Redo": "Rétablir",
43992
+ "Insert image": "Insérer une image",
43993
+ "Special character": "Caractère spécial",
43994
+ "Emoticons": "Émoticônes",
43995
+ "Fullscreen": "Plein écran",
43996
+ "Preview": "Aperçu",
43997
+ "Source code": "Code source",
43998
+ "Insert link": "Insérer un lien",
43999
+ "Code sample": "Exemple de code",
44000
+ "Left to right": "De gauche à droite",
44001
+ "Right to left": "De droite à gauche",
44002
+ "Find and replace": "Rechercher et remplacer",
44003
+ "Font": "Police",
44004
+ "Font size": "Taille de police",
44005
+ "Line height": "Hauteur de ligne",
44006
+ "Templates": "Modèles",
44007
+ "Apply": "Appliquer",
44008
+ "Enter image URL:": "Entrez l'URL de l'image :",
44009
+ "Enter URL:": "Entrez l'URL :",
44010
+ "Edit HTML source:": "Modifier le code source HTML :",
44011
+ "Find and Replace": "Rechercher et remplacer",
44012
+ "Find": "Rechercher",
44013
+ "Replace": "Remplacer",
44014
+ "Case sensitive": "Sensible à la casse",
44015
+ "Whole word": "Mot entier",
44016
+ "Previous": "Précédent",
44017
+ "Next": "Suivant",
44018
+ "Replace All": "Tout remplacer",
44019
+ "Search...": "Rechercher...",
44020
+ "Special Character": "Caractère spécial",
44021
+ "Upload": "Télécharger",
44022
+ "URL": "URL",
44023
+ "Browse...": "Parcourir...",
44024
+ "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
44025
+ "Alt text": "Texte alternatif",
44026
+ "Insert": "Insérer",
44027
+ "Cancel": "Annuler",
44028
+ "Uploading...": "Téléchargement...",
44029
+ "Upload failed": "Échec du téléchargement",
44030
+ "Invalid image URL": "URL d'image invalide",
44031
+ "File too large": "Fichier trop volumineux",
44032
+ "Invalid file type": "Type de fichier invalide",
44033
+ "More": "Plus"
44034
+ };
44035
+ const frCa = {
44036
+ "Bold": "Gras",
44037
+ "Italic": "Italique",
44038
+ "Underline": "Souligné",
44039
+ "Strikethrough": "Barré",
44040
+ "Bullet list": "Liste à puces",
44041
+ "Numbered list": "Liste numérotée",
44042
+ "Decrease indent": "Réduire le retrait",
44043
+ "Increase indent": "Augmenter le retrait",
44044
+ "Blockquote": "Citation",
44045
+ "Align left": "Aligner à gauche",
44046
+ "Align center": "Centrer",
44047
+ "Align right": "Aligner à droite",
44048
+ "Justify": "Justifier",
44049
+ "Text color": "Couleur du texte",
44050
+ "Background color": "Couleur d'arrière-plan",
44051
+ "Remove formatting": "Supprimer la mise en forme",
44052
+ "Copy": "Copier",
44053
+ "Cut": "Couper",
44054
+ "Paste": "Coller",
44055
+ "Undo": "Annuler",
44056
+ "Redo": "Rétablir",
44057
+ "Insert image": "Insérer une image",
44058
+ "Special character": "Caractère spécial",
44059
+ "Emoticons": "Émoticônes",
44060
+ "Fullscreen": "Plein écran",
44061
+ "Preview": "Aperçu",
44062
+ "Source code": "Code source",
44063
+ "Insert link": "Insérer un lien",
44064
+ "Code sample": "Exemple de code",
44065
+ "Left to right": "De gauche à droite",
44066
+ "Right to left": "De droite à gauche",
44067
+ "Find and replace": "Rechercher et remplacer",
44068
+ "Font": "Police",
44069
+ "Font size": "Taille de police",
44070
+ "Line height": "Hauteur de ligne",
44071
+ "Templates": "Modèles",
44072
+ "Apply": "Appliquer",
44073
+ "Enter image URL:": "Entrez l'URL de l'image :",
44074
+ "Enter URL:": "Entrez l'URL :",
44075
+ "Edit HTML source:": "Modifier le code source HTML :",
44076
+ "Find and Replace": "Rechercher et remplacer",
44077
+ "Find": "Rechercher",
44078
+ "Replace": "Remplacer",
44079
+ "Case sensitive": "Sensible à la casse",
44080
+ "Whole word": "Mot entier",
44081
+ "Previous": "Précédent",
44082
+ "Next": "Suivant",
44083
+ "Replace All": "Tout remplacer",
44084
+ "Search...": "Rechercher...",
44085
+ "Special Character": "Caractère spécial",
44086
+ "Upload": "Téléverser",
44087
+ "URL": "URL",
44088
+ "Browse...": "Parcourir...",
44089
+ "Drop image here or click to browse": "Déposez l'image ici ou cliquez pour parcourir",
44090
+ "Alt text": "Texte alternatif",
44091
+ "Insert": "Insérer",
44092
+ "Cancel": "Annuler",
44093
+ "Uploading...": "Téléversement...",
44094
+ "Upload failed": "Échec du téléversement",
44095
+ "Invalid image URL": "URL d'image invalide",
44096
+ "File too large": "Fichier trop volumineux",
44097
+ "Invalid file type": "Type de fichier invalide",
44098
+ "More": "Plus"
44099
+ };
44100
+ const de = {
44101
+ "Bold": "Fett",
44102
+ "Italic": "Kursiv",
44103
+ "Underline": "Unterstrichen",
44104
+ "Strikethrough": "Durchgestrichen",
44105
+ "Bullet list": "Aufzählung",
44106
+ "Numbered list": "Nummerierte Liste",
44107
+ "Decrease indent": "Einzug verkleinern",
44108
+ "Increase indent": "Einzug vergrößern",
44109
+ "Blockquote": "Zitat",
44110
+ "Align left": "Linksbündig",
44111
+ "Align center": "Zentriert",
44112
+ "Align right": "Rechtsbündig",
44113
+ "Justify": "Blocksatz",
44114
+ "Text color": "Textfarbe",
44115
+ "Background color": "Hintergrundfarbe",
44116
+ "Remove formatting": "Formatierung entfernen",
44117
+ "Copy": "Kopieren",
44118
+ "Cut": "Ausschneiden",
44119
+ "Paste": "Einfügen",
44120
+ "Undo": "Rückgängig",
44121
+ "Redo": "Wiederherstellen",
44122
+ "Insert image": "Bild einfügen",
44123
+ "Special character": "Sonderzeichen",
44124
+ "Emoticons": "Emoticons",
44125
+ "Fullscreen": "Vollbild",
44126
+ "Preview": "Vorschau",
44127
+ "Source code": "Quellcode",
44128
+ "Insert link": "Link einfügen",
44129
+ "Code sample": "Codebeispiel",
44130
+ "Left to right": "Links nach rechts",
44131
+ "Right to left": "Rechts nach links",
44132
+ "Find and replace": "Suchen und ersetzen",
44133
+ "Font": "Schriftart",
44134
+ "Font size": "Schriftgröße",
44135
+ "Line height": "Zeilenhöhe",
44136
+ "Templates": "Vorlagen",
44137
+ "Apply": "Anwenden",
44138
+ "Enter image URL:": "Bild-URL eingeben:",
44139
+ "Enter URL:": "URL eingeben:",
44140
+ "Edit HTML source:": "HTML-Quellcode bearbeiten:",
44141
+ "Find and Replace": "Suchen und Ersetzen",
44142
+ "Find": "Suchen",
44143
+ "Replace": "Ersetzen",
44144
+ "Case sensitive": "Groß-/Kleinschreibung",
44145
+ "Whole word": "Ganzes Wort",
44146
+ "Previous": "Zurück",
44147
+ "Next": "Weiter",
44148
+ "Replace All": "Alle ersetzen",
44149
+ "Search...": "Suchen...",
44150
+ "Special Character": "Sonderzeichen",
44151
+ "Upload": "Hochladen",
44152
+ "URL": "URL",
44153
+ "Browse...": "Durchsuchen...",
44154
+ "Drop image here or click to browse": "Bild hierher ziehen oder klicken zum Durchsuchen",
44155
+ "Alt text": "Alternativtext",
44156
+ "Insert": "Einfügen",
44157
+ "Cancel": "Abbrechen",
44158
+ "Uploading...": "Wird hochgeladen...",
44159
+ "Upload failed": "Hochladen fehlgeschlagen",
44160
+ "Invalid image URL": "Ungültige Bild-URL",
44161
+ "File too large": "Datei zu groß",
44162
+ "Invalid file type": "Ungültiger Dateityp",
44163
+ "More": "Mehr"
44164
+ };
44165
+ const el = {
44166
+ "Bold": "Έντονα",
44167
+ "Italic": "Πλάγια",
44168
+ "Underline": "Υπογράμμιση",
44169
+ "Strikethrough": "Διαγράμμιση",
44170
+ "Bullet list": "Λίστα με κουκκίδες",
44171
+ "Numbered list": "Αριθμημένη λίστα",
44172
+ "Decrease indent": "Μείωση εσοχής",
44173
+ "Increase indent": "Αύξηση εσοχής",
44174
+ "Blockquote": "Παράθεση",
44175
+ "Align left": "Στοίχιση αριστερά",
44176
+ "Align center": "Κεντράρισμα",
44177
+ "Align right": "Στοίχιση δεξιά",
44178
+ "Justify": "Πλήρης στοίχιση",
44179
+ "Text color": "Χρώμα κειμένου",
44180
+ "Background color": "Χρώμα φόντου",
44181
+ "Remove formatting": "Αφαίρεση μορφοποίησης",
44182
+ "Copy": "Αντιγραφή",
44183
+ "Cut": "Αποκοπή",
44184
+ "Paste": "Επικόλληση",
44185
+ "Undo": "Αναίρεση",
44186
+ "Redo": "Επανάληψη",
44187
+ "Insert image": "Εισαγωγή εικόνας",
44188
+ "Special character": "Ειδικός χαρακτήρας",
44189
+ "Emoticons": "Εικονίδια συναισθημάτων",
44190
+ "Fullscreen": "Πλήρης οθόνη",
44191
+ "Preview": "Προεπισκόπηση",
44192
+ "Source code": "Πηγαίος κώδικας",
44193
+ "Insert link": "Εισαγωγή συνδέσμου",
44194
+ "Code sample": "Δείγμα κώδικα",
44195
+ "Left to right": "Αριστερά προς δεξιά",
44196
+ "Right to left": "Δεξιά προς αριστερά",
44197
+ "Find and replace": "Εύρεση και αντικατάσταση",
44198
+ "Font": "Γραμματοσειρά",
44199
+ "Font size": "Μέγεθος γραμματοσειράς",
44200
+ "Line height": "Ύψος γραμμής",
44201
+ "Templates": "Πρότυπα",
44202
+ "Apply": "Εφαρμογή",
44203
+ "Enter image URL:": "Εισάγετε URL εικόνας:",
44204
+ "Enter URL:": "Εισάγετε URL:",
44205
+ "Edit HTML source:": "Επεξεργασία πηγαίου κώδικα HTML:",
44206
+ "Find and Replace": "Εύρεση και αντικατάσταση",
44207
+ "Find": "Εύρεση",
44208
+ "Replace": "Αντικατάσταση",
44209
+ "Case sensitive": "Διάκριση πεζών-κεφαλαίων",
44210
+ "Whole word": "Ολόκληρη λέξη",
44211
+ "Previous": "Προηγούμενο",
44212
+ "Next": "Επόμενο",
44213
+ "Replace All": "Αντικατάσταση όλων",
44214
+ "Search...": "Αναζήτηση...",
44215
+ "Special Character": "Ειδικός χαρακτήρας",
44216
+ "Upload": "Μεταφόρτωση",
44217
+ "URL": "URL",
44218
+ "Browse...": "Αναζήτηση...",
44219
+ "Drop image here or click to browse": "Σύρτε την εικόνα εδώ ή κάντε κλικ για αναζήτηση",
44220
+ "Alt text": "Εναλλακτικό κείμενο",
44221
+ "Insert": "Εισαγωγή",
44222
+ "Cancel": "Ακύρωση",
44223
+ "Uploading...": "Μεταφόρτωση...",
44224
+ "Upload failed": "Η μεταφόρτωση απέτυχε",
44225
+ "Invalid image URL": "Μη έγκυρο URL εικόνας",
44226
+ "File too large": "Το αρχείο είναι πολύ μεγάλο",
44227
+ "Invalid file type": "Μη έγκυρος τύπος αρχείου",
44228
+ "More": "Περισσότερα"
44229
+ };
44230
+ const hu = {
44231
+ "Bold": "Félkövér",
44232
+ "Italic": "Dőlt",
44233
+ "Underline": "Aláhúzott",
44234
+ "Strikethrough": "Áthúzott",
44235
+ "Bullet list": "Felsorolás",
44236
+ "Numbered list": "Számozott lista",
44237
+ "Decrease indent": "Behúzás csökkentése",
44238
+ "Increase indent": "Behúzás növelése",
44239
+ "Blockquote": "Idézet",
44240
+ "Align left": "Balra igazítás",
44241
+ "Align center": "Középre igazítás",
44242
+ "Align right": "Jobbra igazítás",
44243
+ "Justify": "Sorkizárt",
44244
+ "Text color": "Szöveg színe",
44245
+ "Background color": "Háttérszín",
44246
+ "Remove formatting": "Formázás eltávolítása",
44247
+ "Copy": "Másolás",
44248
+ "Cut": "Kivágás",
44249
+ "Paste": "Beillesztés",
44250
+ "Undo": "Visszavonás",
44251
+ "Redo": "Újra",
44252
+ "Insert image": "Kép beszúrása",
44253
+ "Special character": "Speciális karakter",
44254
+ "Emoticons": "Hangulatjelek",
44255
+ "Fullscreen": "Teljes képernyő",
44256
+ "Preview": "Előnézet",
44257
+ "Source code": "Forráskód",
44258
+ "Insert link": "Hivatkozás beszúrása",
44259
+ "Code sample": "Kódminta",
44260
+ "Left to right": "Balról jobbra",
44261
+ "Right to left": "Jobbról balra",
44262
+ "Find and replace": "Keresés és csere",
44263
+ "Font": "Betűtípus",
44264
+ "Font size": "Betűméret",
44265
+ "Line height": "Sormagasság",
44266
+ "Templates": "Sablonok",
44267
+ "Apply": "Alkalmaz",
44268
+ "Enter image URL:": "Adja meg a kép URL-jét:",
44269
+ "Enter URL:": "Adja meg az URL-t:",
44270
+ "Edit HTML source:": "HTML forráskód szerkesztése:",
44271
+ "Find and Replace": "Keresés és csere",
44272
+ "Find": "Keresés",
44273
+ "Replace": "Csere",
44274
+ "Case sensitive": "Kis- és nagybetű érzékeny",
44275
+ "Whole word": "Teljes szó",
44276
+ "Previous": "Előző",
44277
+ "Next": "Következő",
44278
+ "Replace All": "Összes cseréje",
44279
+ "Search...": "Keresés...",
44280
+ "Special Character": "Speciális karakter",
44281
+ "Upload": "Feltöltés",
44282
+ "URL": "URL",
44283
+ "Browse...": "Tallózás...",
44284
+ "Drop image here or click to browse": "Húzza ide a képet, vagy kattintson a tallózáshoz",
44285
+ "Alt text": "Alternatív szöveg",
44286
+ "Insert": "Beszúrás",
44287
+ "Cancel": "Mégse",
44288
+ "Uploading...": "Feltöltés...",
44289
+ "Upload failed": "A feltöltés sikertelen",
44290
+ "Invalid image URL": "Érvénytelen kép URL",
44291
+ "File too large": "A fájl túl nagy",
44292
+ "Invalid file type": "Érvénytelen fájltípus",
44293
+ "More": "Több"
44294
+ };
44295
+ const id = {
44296
+ "Bold": "Tebal",
44297
+ "Italic": "Miring",
44298
+ "Underline": "Garis bawah",
44299
+ "Strikethrough": "Coret",
44300
+ "Bullet list": "Daftar berpoin",
44301
+ "Numbered list": "Daftar bernomor",
44302
+ "Decrease indent": "Kurangi indentasi",
44303
+ "Increase indent": "Tambah indentasi",
44304
+ "Blockquote": "Kutipan",
44305
+ "Align left": "Rata kiri",
44306
+ "Align center": "Rata tengah",
44307
+ "Align right": "Rata kanan",
44308
+ "Justify": "Rata kiri-kanan",
44309
+ "Text color": "Warna teks",
44310
+ "Background color": "Warna latar belakang",
44311
+ "Remove formatting": "Hapus pemformatan",
44312
+ "Copy": "Salin",
44313
+ "Cut": "Potong",
44314
+ "Paste": "Tempel",
44315
+ "Undo": "Batalkan",
44316
+ "Redo": "Ulangi",
44317
+ "Insert image": "Sisipkan gambar",
44318
+ "Special character": "Karakter khusus",
44319
+ "Emoticons": "Emotikon",
44320
+ "Fullscreen": "Layar penuh",
44321
+ "Preview": "Pratinjau",
44322
+ "Source code": "Kode sumber",
44323
+ "Insert link": "Sisipkan tautan",
44324
+ "Code sample": "Contoh kode",
44325
+ "Left to right": "Kiri ke kanan",
44326
+ "Right to left": "Kanan ke kiri",
44327
+ "Find and replace": "Cari dan ganti",
44328
+ "Font": "Font",
44329
+ "Font size": "Ukuran font",
44330
+ "Line height": "Tinggi baris",
44331
+ "Templates": "Templat",
44332
+ "Apply": "Terapkan",
44333
+ "Enter image URL:": "Masukkan URL gambar:",
44334
+ "Enter URL:": "Masukkan URL:",
44335
+ "Edit HTML source:": "Edit kode sumber HTML:",
44336
+ "Find and Replace": "Cari dan ganti",
44337
+ "Find": "Cari",
44338
+ "Replace": "Ganti",
44339
+ "Case sensitive": "Peka huruf besar/kecil",
44340
+ "Whole word": "Kata utuh",
44341
+ "Previous": "Sebelumnya",
44342
+ "Next": "Berikutnya",
44343
+ "Replace All": "Ganti semua",
44344
+ "Search...": "Cari...",
44345
+ "Special Character": "Karakter khusus",
44346
+ "Upload": "Unggah",
44347
+ "URL": "URL",
44348
+ "Browse...": "Telusuri...",
44349
+ "Drop image here or click to browse": "Seret gambar ke sini atau klik untuk menelusuri",
44350
+ "Alt text": "Teks alternatif",
44351
+ "Insert": "Sisipkan",
44352
+ "Cancel": "Batal",
44353
+ "Uploading...": "Mengunggah...",
44354
+ "Upload failed": "Gagal mengunggah",
44355
+ "Invalid image URL": "URL gambar tidak valid",
44356
+ "File too large": "File terlalu besar",
44357
+ "Invalid file type": "Jenis file tidak valid",
44358
+ "More": "Lainnya"
44359
+ };
44360
+ const it = {
44361
+ "Bold": "Grassetto",
44362
+ "Italic": "Corsivo",
44363
+ "Underline": "Sottolineato",
44364
+ "Strikethrough": "Barrato",
44365
+ "Bullet list": "Elenco puntato",
44366
+ "Numbered list": "Elenco numerato",
44367
+ "Decrease indent": "Riduci rientro",
44368
+ "Increase indent": "Aumenta rientro",
44369
+ "Blockquote": "Citazione",
44370
+ "Align left": "Allinea a sinistra",
44371
+ "Align center": "Centra",
44372
+ "Align right": "Allinea a destra",
44373
+ "Justify": "Giustifica",
44374
+ "Text color": "Colore testo",
44375
+ "Background color": "Colore sfondo",
44376
+ "Remove formatting": "Rimuovi formattazione",
44377
+ "Copy": "Copia",
44378
+ "Cut": "Taglia",
44379
+ "Paste": "Incolla",
44380
+ "Undo": "Annulla",
44381
+ "Redo": "Ripristina",
44382
+ "Insert image": "Inserisci immagine",
44383
+ "Special character": "Carattere speciale",
44384
+ "Emoticons": "Emoticon",
44385
+ "Fullscreen": "Schermo intero",
44386
+ "Preview": "Anteprima",
44387
+ "Source code": "Codice sorgente",
44388
+ "Insert link": "Inserisci collegamento",
44389
+ "Code sample": "Esempio di codice",
44390
+ "Left to right": "Da sinistra a destra",
44391
+ "Right to left": "Da destra a sinistra",
44392
+ "Find and replace": "Trova e sostituisci",
44393
+ "Font": "Carattere",
44394
+ "Font size": "Dimensione carattere",
44395
+ "Line height": "Altezza riga",
44396
+ "Templates": "Modelli",
44397
+ "Apply": "Applica",
44398
+ "Enter image URL:": "Inserisci URL immagine:",
44399
+ "Enter URL:": "Inserisci URL:",
44400
+ "Edit HTML source:": "Modifica codice sorgente HTML:",
44401
+ "Find and Replace": "Trova e sostituisci",
44402
+ "Find": "Trova",
44403
+ "Replace": "Sostituisci",
44404
+ "Case sensitive": "Maiuscole/minuscole",
44405
+ "Whole word": "Parola intera",
44406
+ "Previous": "Precedente",
44407
+ "Next": "Successivo",
44408
+ "Replace All": "Sostituisci tutto",
44409
+ "Search...": "Cerca...",
44410
+ "Special Character": "Carattere speciale",
44411
+ "Upload": "Carica",
44412
+ "URL": "URL",
44413
+ "Browse...": "Sfoglia...",
44414
+ "Drop image here or click to browse": "Trascina l'immagine qui o fai clic per sfogliare",
44415
+ "Alt text": "Testo alternativo",
44416
+ "Insert": "Inserisci",
44417
+ "Cancel": "Annulla",
44418
+ "Uploading...": "Caricamento...",
44419
+ "Upload failed": "Caricamento fallito",
44420
+ "Invalid image URL": "URL immagine non valido",
44421
+ "File too large": "File troppo grande",
44422
+ "Invalid file type": "Tipo di file non valido",
44423
+ "More": "Altro"
44424
+ };
44425
+ const ja = {
44426
+ "Bold": "太字",
44427
+ "Italic": "斜体",
44428
+ "Underline": "下線",
44429
+ "Strikethrough": "取り消し線",
44430
+ "Bullet list": "箇条書き",
44431
+ "Numbered list": "番号付きリスト",
44432
+ "Decrease indent": "インデント解除",
44433
+ "Increase indent": "インデント",
44434
+ "Blockquote": "引用",
44435
+ "Align left": "左揃え",
44436
+ "Align center": "中央揃え",
44437
+ "Align right": "右揃え",
44438
+ "Justify": "両端揃え",
44439
+ "Text color": "文字色",
44440
+ "Background color": "背景色",
44441
+ "Remove formatting": "書式のクリア",
44442
+ "Copy": "コピー",
44443
+ "Cut": "切り取り",
44444
+ "Paste": "貼り付け",
44445
+ "Undo": "元に戻す",
44446
+ "Redo": "やり直し",
44447
+ "Insert image": "画像の挿入",
44448
+ "Special character": "特殊文字",
44449
+ "Emoticons": "絵文字",
44450
+ "Fullscreen": "全画面",
44451
+ "Preview": "プレビュー",
44452
+ "Source code": "ソースコード",
44453
+ "Insert link": "リンクの挿入",
44454
+ "Code sample": "コードサンプル",
44455
+ "Left to right": "左から右",
44456
+ "Right to left": "右から左",
44457
+ "Find and replace": "検索と置換",
44458
+ "Font": "フォント",
44459
+ "Font size": "フォントサイズ",
44460
+ "Line height": "行の高さ",
44461
+ "Templates": "テンプレート",
44462
+ "Apply": "適用",
44463
+ "Enter image URL:": "画像のURLを入力:",
44464
+ "Enter URL:": "URLを入力:",
44465
+ "Edit HTML source:": "HTMLソースを編集:",
44466
+ "Find and Replace": "検索と置換",
44467
+ "Find": "検索",
44468
+ "Replace": "置換",
44469
+ "Case sensitive": "大文字小文字を区別",
44470
+ "Whole word": "単語全体",
44471
+ "Previous": "前へ",
44472
+ "Next": "次へ",
44473
+ "Replace All": "すべて置換",
44474
+ "Search...": "検索...",
44475
+ "Special Character": "特殊文字",
44476
+ "Upload": "アップロード",
44477
+ "URL": "URL",
44478
+ "Browse...": "参照...",
44479
+ "Drop image here or click to browse": "画像をここにドロップするかクリックして参照",
44480
+ "Alt text": "代替テキスト",
44481
+ "Insert": "挿入",
44482
+ "Cancel": "キャンセル",
44483
+ "Uploading...": "アップロード中...",
44484
+ "Upload failed": "アップロードに失敗しました",
44485
+ "Invalid image URL": "無効な画像URL",
44486
+ "File too large": "ファイルが大きすぎます",
44487
+ "Invalid file type": "無効なファイル形式",
44488
+ "More": "もっと見る"
44489
+ };
44490
+ const ko = {
44491
+ "Bold": "굵게",
44492
+ "Italic": "기울임꼴",
44493
+ "Underline": "밑줄",
44494
+ "Strikethrough": "취소선",
44495
+ "Bullet list": "글머리 기호 목록",
44496
+ "Numbered list": "번호 매기기 목록",
44497
+ "Decrease indent": "내어쓰기",
44498
+ "Increase indent": "들여쓰기",
44499
+ "Blockquote": "인용구",
44500
+ "Align left": "왼쪽 맞춤",
44501
+ "Align center": "가운데 맞춤",
44502
+ "Align right": "오른쪽 맞춤",
44503
+ "Justify": "양쪽 맞춤",
44504
+ "Text color": "글자 색",
44505
+ "Background color": "배경색",
44506
+ "Remove formatting": "서식 제거",
44507
+ "Copy": "복사",
44508
+ "Cut": "잘라내기",
44509
+ "Paste": "붙여넣기",
44510
+ "Undo": "실행 취소",
44511
+ "Redo": "다시 실행",
44512
+ "Insert image": "이미지 삽입",
44513
+ "Special character": "특수 문자",
44514
+ "Emoticons": "이모티콘",
44515
+ "Fullscreen": "전체 화면",
44516
+ "Preview": "미리보기",
44517
+ "Source code": "소스 코드",
44518
+ "Insert link": "링크 삽입",
44519
+ "Code sample": "코드 샘플",
44520
+ "Left to right": "왼쪽에서 오른쪽",
44521
+ "Right to left": "오른쪽에서 왼쪽",
44522
+ "Find and replace": "찾기 및 바꾸기",
44523
+ "Font": "글꼴",
44524
+ "Font size": "글꼴 크기",
44525
+ "Line height": "줄 높이",
44526
+ "Templates": "템플릿",
44527
+ "Apply": "적용",
44528
+ "Enter image URL:": "이미지 URL 입력:",
44529
+ "Enter URL:": "URL 입력:",
44530
+ "Edit HTML source:": "HTML 소스 편집:",
44531
+ "Find and Replace": "찾기 및 바꾸기",
44532
+ "Find": "찾기",
44533
+ "Replace": "바꾸기",
44534
+ "Case sensitive": "대/소문자 구분",
44535
+ "Whole word": "단어 단위",
44536
+ "Previous": "이전",
44537
+ "Next": "다음",
44538
+ "Replace All": "모두 바꾸기",
44539
+ "Search...": "검색...",
44540
+ "Special Character": "특수 문자",
44541
+ "Upload": "업로드",
44542
+ "URL": "URL",
44543
+ "Browse...": "찾아보기...",
44544
+ "Drop image here or click to browse": "이미지를 여기에 끌어다 놓거나 클릭하여 찾아보기",
44545
+ "Alt text": "대체 텍스트",
44546
+ "Insert": "삽입",
44547
+ "Cancel": "취소",
44548
+ "Uploading...": "업로드 중...",
44549
+ "Upload failed": "업로드 실패",
44550
+ "Invalid image URL": "잘못된 이미지 URL",
44551
+ "File too large": "파일이 너무 큽니다",
44552
+ "Invalid file type": "잘못된 파일 형식",
44553
+ "More": "더 보기"
44554
+ };
44555
+ const nl = {
44556
+ "Bold": "Vet",
44557
+ "Italic": "Cursief",
44558
+ "Underline": "Onderstreept",
44559
+ "Strikethrough": "Doorgehaald",
44560
+ "Bullet list": "Opsommingslijst",
44561
+ "Numbered list": "Genummerde lijst",
44562
+ "Decrease indent": "Inspringing verkleinen",
44563
+ "Increase indent": "Inspringing vergroten",
44564
+ "Blockquote": "Citaat",
44565
+ "Align left": "Links uitlijnen",
44566
+ "Align center": "Centreren",
44567
+ "Align right": "Rechts uitlijnen",
44568
+ "Justify": "Uitvullen",
44569
+ "Text color": "Tekstkleur",
44570
+ "Background color": "Achtergrondkleur",
44571
+ "Remove formatting": "Opmaak verwijderen",
44572
+ "Copy": "Kopiëren",
44573
+ "Cut": "Knippen",
44574
+ "Paste": "Plakken",
44575
+ "Undo": "Ongedaan maken",
44576
+ "Redo": "Opnieuw",
44577
+ "Insert image": "Afbeelding invoegen",
44578
+ "Special character": "Speciaal teken",
44579
+ "Emoticons": "Emoticons",
44580
+ "Fullscreen": "Volledig scherm",
44581
+ "Preview": "Voorbeeld",
44582
+ "Source code": "Broncode",
44583
+ "Insert link": "Link invoegen",
44584
+ "Code sample": "Codevoorbeeld",
44585
+ "Left to right": "Links naar rechts",
44586
+ "Right to left": "Rechts naar links",
44587
+ "Find and replace": "Zoeken en vervangen",
44588
+ "Font": "Lettertype",
44589
+ "Font size": "Lettergrootte",
44590
+ "Line height": "Regelhoogte",
44591
+ "Templates": "Sjablonen",
44592
+ "Apply": "Toepassen",
44593
+ "Enter image URL:": "Voer afbeeldings-URL in:",
44594
+ "Enter URL:": "Voer URL in:",
44595
+ "Edit HTML source:": "HTML-bron bewerken:",
44596
+ "Find and Replace": "Zoeken en vervangen",
44597
+ "Find": "Zoeken",
44598
+ "Replace": "Vervangen",
44599
+ "Case sensitive": "Hoofdlettergevoelig",
44600
+ "Whole word": "Heel woord",
44601
+ "Previous": "Vorige",
44602
+ "Next": "Volgende",
44603
+ "Replace All": "Alles vervangen",
44604
+ "Search...": "Zoeken...",
44605
+ "Special Character": "Speciaal teken",
44606
+ "Upload": "Uploaden",
44607
+ "URL": "URL",
44608
+ "Browse...": "Bladeren...",
44609
+ "Drop image here or click to browse": "Sleep afbeelding hierheen of klik om te bladeren",
44610
+ "Alt text": "Alt-tekst",
44611
+ "Insert": "Invoegen",
44612
+ "Cancel": "Annuleren",
44613
+ "Uploading...": "Uploaden...",
44614
+ "Upload failed": "Upload mislukt",
44615
+ "Invalid image URL": "Ongeldige afbeeldings-URL",
44616
+ "File too large": "Bestand te groot",
44617
+ "Invalid file type": "Ongeldig bestandstype",
44618
+ "More": "Meer"
44619
+ };
44620
+ const nb = {
44621
+ "Bold": "Fet",
44622
+ "Italic": "Kursiv",
44623
+ "Underline": "Understreket",
44624
+ "Strikethrough": "Gjennomstreket",
44625
+ "Bullet list": "Punktliste",
44626
+ "Numbered list": "Nummerert liste",
44627
+ "Decrease indent": "Reduser innrykk",
44628
+ "Increase indent": "Øk innrykk",
44629
+ "Blockquote": "Blokksitat",
44630
+ "Align left": "Venstrejuster",
44631
+ "Align center": "Midtstill",
44632
+ "Align right": "Høyrejuster",
44633
+ "Justify": "Blokkjuster",
44634
+ "Text color": "Tekstfarge",
44635
+ "Background color": "Bakgrunnsfarge",
44636
+ "Remove formatting": "Fjern formatering",
44637
+ "Copy": "Kopier",
44638
+ "Cut": "Klipp ut",
44639
+ "Paste": "Lim inn",
44640
+ "Undo": "Angre",
44641
+ "Redo": "Gjør om",
44642
+ "Insert image": "Sett inn bilde",
44643
+ "Special character": "Spesialtegn",
44644
+ "Emoticons": "Humørifjes",
44645
+ "Fullscreen": "Fullskjerm",
44646
+ "Preview": "Forhåndsvisning",
44647
+ "Source code": "Kildekode",
44648
+ "Insert link": "Sett inn lenke",
44649
+ "Code sample": "Kodeeksempel",
44650
+ "Left to right": "Venstre mot høyre",
44651
+ "Right to left": "Høyre mot venstre",
44652
+ "Find and replace": "Søk og erstatt",
44653
+ "Font": "Skrifttype",
44654
+ "Font size": "Skriftstørrelse",
44655
+ "Line height": "Linjehøyde",
44656
+ "Templates": "Maler",
44657
+ "Apply": "Bruk",
44658
+ "Enter image URL:": "Skriv inn bilde-URL:",
44659
+ "Enter URL:": "Skriv inn URL:",
44660
+ "Edit HTML source:": "Rediger HTML-kilde:",
44661
+ "Find and Replace": "Søk og erstatt",
44662
+ "Find": "Søk",
44663
+ "Replace": "Erstatt",
44664
+ "Case sensitive": "Skille mellom store/små bokstaver",
44665
+ "Whole word": "Helt ord",
44666
+ "Previous": "Forrige",
44667
+ "Next": "Neste",
44668
+ "Replace All": "Erstatt alle",
44669
+ "Search...": "Søk...",
44670
+ "Special Character": "Spesialtegn",
44671
+ "Upload": "Last opp",
44672
+ "URL": "URL",
44673
+ "Browse...": "Bla gjennom...",
44674
+ "Drop image here or click to browse": "Slipp bildet her eller klikk for å bla gjennom",
44675
+ "Alt text": "Alternativ tekst",
44676
+ "Insert": "Sett inn",
44677
+ "Cancel": "Avbryt",
44678
+ "Uploading...": "Laster opp...",
44679
+ "Upload failed": "Opplasting mislyktes",
44680
+ "Invalid image URL": "Ugyldig bilde-URL",
44681
+ "File too large": "Filen er for stor",
44682
+ "Invalid file type": "Ugyldig filtype",
44683
+ "More": "Mer"
44684
+ };
44685
+ const pl = {
44686
+ "Bold": "Pogrubienie",
44687
+ "Italic": "Kursywa",
44688
+ "Underline": "Podkreślenie",
44689
+ "Strikethrough": "Przekreślenie",
44690
+ "Bullet list": "Lista punktowana",
44691
+ "Numbered list": "Lista numerowana",
44692
+ "Decrease indent": "Zmniejsz wcięcie",
44693
+ "Increase indent": "Zwiększ wcięcie",
44694
+ "Blockquote": "Cytat blokowy",
44695
+ "Align left": "Wyrównaj do lewej",
44696
+ "Align center": "Wyśrodkuj",
44697
+ "Align right": "Wyrównaj do prawej",
44698
+ "Justify": "Wyjustuj",
44699
+ "Text color": "Kolor tekstu",
44700
+ "Background color": "Kolor tła",
44701
+ "Remove formatting": "Usuń formatowanie",
44702
+ "Copy": "Kopiuj",
44703
+ "Cut": "Wytnij",
44704
+ "Paste": "Wklej",
44705
+ "Undo": "Cofnij",
44706
+ "Redo": "Ponów",
44707
+ "Insert image": "Wstaw obraz",
44708
+ "Special character": "Znak specjalny",
44709
+ "Emoticons": "Emotikony",
44710
+ "Fullscreen": "Pełny ekran",
44711
+ "Preview": "Podgląd",
44712
+ "Source code": "Kod źródłowy",
44713
+ "Insert link": "Wstaw odnośnik",
44714
+ "Code sample": "Przykład kodu",
44715
+ "Left to right": "Od lewej do prawej",
44716
+ "Right to left": "Od prawej do lewej",
44717
+ "Find and replace": "Znajdź i zamień",
44718
+ "Font": "Czcionka",
44719
+ "Font size": "Rozmiar czcionki",
44720
+ "Line height": "Wysokość wiersza",
44721
+ "Templates": "Szablony",
44722
+ "Apply": "Zastosuj",
44723
+ "Enter image URL:": "Wprowadź adres URL obrazu:",
44724
+ "Enter URL:": "Wprowadź adres URL:",
44725
+ "Edit HTML source:": "Edytuj źródło HTML:",
44726
+ "Find and Replace": "Znajdź i zamień",
44727
+ "Find": "Znajdź",
44728
+ "Replace": "Zamień",
44729
+ "Case sensitive": "Rozróżniaj wielkość liter",
44730
+ "Whole word": "Całe słowo",
44731
+ "Previous": "Poprzedni",
44732
+ "Next": "Następny",
44733
+ "Replace All": "Zamień wszystko",
44734
+ "Search...": "Szukaj...",
44735
+ "Special Character": "Znak specjalny",
44736
+ "Upload": "Prześlij",
44737
+ "URL": "URL",
44738
+ "Browse...": "Przeglądaj...",
44739
+ "Drop image here or click to browse": "Przeciągnij obraz tutaj lub kliknij, aby przeglądać",
44740
+ "Alt text": "Tekst alternatywny",
44741
+ "Insert": "Wstaw",
44742
+ "Cancel": "Anuluj",
44743
+ "Uploading...": "Przesyłanie...",
44744
+ "Upload failed": "Przesyłanie nie powiodło się",
44745
+ "Invalid image URL": "Nieprawidłowy URL obrazu",
44746
+ "File too large": "Plik jest za duży",
44747
+ "Invalid file type": "Nieprawidłowy typ pliku",
44748
+ "More": "Więcej"
44749
+ };
44750
+ const pt = {
44751
+ "Bold": "Negrito",
44752
+ "Italic": "Itálico",
44753
+ "Underline": "Sublinhado",
44754
+ "Strikethrough": "Riscado",
44755
+ "Bullet list": "Lista com marcadores",
44756
+ "Numbered list": "Lista numerada",
44757
+ "Decrease indent": "Diminuir recuo",
44758
+ "Increase indent": "Aumentar recuo",
44759
+ "Blockquote": "Citação",
44760
+ "Align left": "Alinhar à esquerda",
44761
+ "Align center": "Centralizar",
44762
+ "Align right": "Alinhar à direita",
44763
+ "Justify": "Justificar",
44764
+ "Text color": "Cor do texto",
44765
+ "Background color": "Cor de fundo",
44766
+ "Remove formatting": "Remover formatação",
44767
+ "Copy": "Copiar",
44768
+ "Cut": "Cortar",
44769
+ "Paste": "Colar",
44770
+ "Undo": "Desfazer",
44771
+ "Redo": "Refazer",
44772
+ "Insert image": "Inserir imagem",
44773
+ "Special character": "Caractere especial",
44774
+ "Emoticons": "Emoticons",
44775
+ "Fullscreen": "Tela cheia",
44776
+ "Preview": "Pré-visualização",
44777
+ "Source code": "Código fonte",
44778
+ "Insert link": "Inserir link",
44779
+ "Code sample": "Exemplo de código",
44780
+ "Left to right": "Esquerda para a direita",
44781
+ "Right to left": "Direita para a esquerda",
44782
+ "Find and replace": "Localizar e substituir",
44783
+ "Font": "Fonte",
44784
+ "Font size": "Tamanho da fonte",
44785
+ "Line height": "Altura da linha",
44786
+ "Templates": "Modelos",
44787
+ "Apply": "Aplicar",
44788
+ "Enter image URL:": "Insira o URL da imagem:",
44789
+ "Enter URL:": "Insira o URL:",
44790
+ "Edit HTML source:": "Editar código fonte HTML:",
44791
+ "Find and Replace": "Localizar e substituir",
44792
+ "Find": "Localizar",
44793
+ "Replace": "Substituir",
44794
+ "Case sensitive": "Diferenciar maiúsculas/minúsculas",
44795
+ "Whole word": "Palavra inteira",
44796
+ "Previous": "Anterior",
44797
+ "Next": "Próximo",
44798
+ "Replace All": "Substituir tudo",
44799
+ "Search...": "Pesquisar...",
44800
+ "Special Character": "Caractere especial",
44801
+ "Upload": "Carregar",
44802
+ "URL": "URL",
44803
+ "Browse...": "Procurar...",
44804
+ "Drop image here or click to browse": "Arraste a imagem aqui ou clique para procurar",
44805
+ "Alt text": "Texto alternativo",
44806
+ "Insert": "Inserir",
44807
+ "Cancel": "Cancelar",
44808
+ "Uploading...": "Carregando...",
44809
+ "Upload failed": "Falha no carregamento",
44810
+ "Invalid image URL": "URL de imagem inválido",
44811
+ "File too large": "Arquivo muito grande",
44812
+ "Invalid file type": "Tipo de arquivo inválido",
44813
+ "More": "Mais"
44814
+ };
44815
+ const ro = {
44816
+ "Bold": "Îngroșat",
44817
+ "Italic": "Cursiv",
44818
+ "Underline": "Subliniat",
44819
+ "Strikethrough": "Tăiat",
44820
+ "Bullet list": "Listă cu marcatori",
44821
+ "Numbered list": "Listă numerotată",
44822
+ "Decrease indent": "Micșorare indentare",
44823
+ "Increase indent": "Mărire indentare",
44824
+ "Blockquote": "Citat",
44825
+ "Align left": "Aliniere la stânga",
44826
+ "Align center": "Centrare",
44827
+ "Align right": "Aliniere la dreapta",
44828
+ "Justify": "Aliniere stânga-dreapta",
44829
+ "Text color": "Culoare text",
44830
+ "Background color": "Culoare fundal",
44831
+ "Remove formatting": "Eliminare formatare",
44832
+ "Copy": "Copiere",
44833
+ "Cut": "Decupare",
44834
+ "Paste": "Lipire",
44835
+ "Undo": "Anulare",
44836
+ "Redo": "Refacere",
44837
+ "Insert image": "Inserare imagine",
44838
+ "Special character": "Caracter special",
44839
+ "Emoticons": "Emoticoane",
44840
+ "Fullscreen": "Ecran complet",
44841
+ "Preview": "Previzualizare",
44842
+ "Source code": "Cod sursă",
44843
+ "Insert link": "Inserare link",
44844
+ "Code sample": "Exemplu de cod",
44845
+ "Left to right": "De la stânga la dreapta",
44846
+ "Right to left": "De la dreapta la stânga",
44847
+ "Find and replace": "Căutare și înlocuire",
44848
+ "Font": "Font",
44849
+ "Font size": "Dimensiune font",
44850
+ "Line height": "Înălțime linie",
44851
+ "Templates": "Șabloane",
44852
+ "Apply": "Aplicare",
44853
+ "Enter image URL:": "Introduceți URL-ul imaginii:",
44854
+ "Enter URL:": "Introduceți URL-ul:",
44855
+ "Edit HTML source:": "Editare sursă HTML:",
44856
+ "Find and Replace": "Căutare și înlocuire",
44857
+ "Find": "Căutare",
44858
+ "Replace": "Înlocuire",
44859
+ "Case sensitive": "Sensibil la majuscule",
44860
+ "Whole word": "Cuvânt întreg",
44861
+ "Previous": "Anterior",
44862
+ "Next": "Următor",
44863
+ "Replace All": "Înlocuire totală",
44864
+ "Search...": "Căutare...",
44865
+ "Special Character": "Caracter special",
44866
+ "Upload": "Încarcă",
44867
+ "URL": "URL",
44868
+ "Browse...": "Răsfoiește...",
44869
+ "Drop image here or click to browse": "Trage imaginea aici sau dă clic pentru a răsfoi",
44870
+ "Alt text": "Text alternativ",
44871
+ "Insert": "Inserează",
44872
+ "Cancel": "Anulează",
44873
+ "Uploading...": "Se încarcă...",
44874
+ "Upload failed": "Încarcare eșuată",
44875
+ "Invalid image URL": "URL imagine invalid",
44876
+ "File too large": "Fișierul este prea mare",
44877
+ "Invalid file type": "Tip de fișier invalid",
44878
+ "More": "Mai mult"
44879
+ };
44880
+ const ru = {
44881
+ "Bold": "Полужирный",
44882
+ "Italic": "Курсив",
44883
+ "Underline": "Подчёркнутый",
44884
+ "Strikethrough": "Зачёркнутый",
44885
+ "Bullet list": "Маркированный список",
44886
+ "Numbered list": "Нумерованный список",
44887
+ "Decrease indent": "Уменьшить отступ",
44888
+ "Increase indent": "Увеличить отступ",
44889
+ "Blockquote": "Цитата",
44890
+ "Align left": "По левому краю",
44891
+ "Align center": "По центру",
44892
+ "Align right": "По правому краю",
44893
+ "Justify": "По ширине",
44894
+ "Text color": "Цвет текста",
44895
+ "Background color": "Цвет фона",
44896
+ "Remove formatting": "Очистить форматирование",
44897
+ "Copy": "Копировать",
44898
+ "Cut": "Вырезать",
44899
+ "Paste": "Вставить",
44900
+ "Undo": "Отменить",
44901
+ "Redo": "Повторить",
44902
+ "Insert image": "Вставить изображение",
44903
+ "Special character": "Специальный символ",
44904
+ "Emoticons": "Смайлики",
44905
+ "Fullscreen": "Полный экран",
44906
+ "Preview": "Предварительный просмотр",
44907
+ "Source code": "Исходный код",
44908
+ "Insert link": "Вставить ссылку",
44909
+ "Code sample": "Пример кода",
44910
+ "Left to right": "Слева направо",
44911
+ "Right to left": "Справа налево",
44912
+ "Find and replace": "Найти и заменить",
44913
+ "Font": "Шрифт",
44914
+ "Font size": "Размер шрифта",
44915
+ "Line height": "Высота строки",
44916
+ "Templates": "Шаблоны",
44917
+ "Apply": "Применить",
44918
+ "Enter image URL:": "Введите URL изображения:",
44919
+ "Enter URL:": "Введите URL:",
44920
+ "Edit HTML source:": "Редактировать HTML-код:",
44921
+ "Find and Replace": "Найти и заменить",
44922
+ "Find": "Найти",
44923
+ "Replace": "Заменить",
44924
+ "Case sensitive": "С учётом регистра",
44925
+ "Whole word": "Слово целиком",
44926
+ "Previous": "Предыдущий",
44927
+ "Next": "Следующий",
44928
+ "Replace All": "Заменить все",
44929
+ "Search...": "Поиск...",
44930
+ "Special Character": "Специальный символ",
44931
+ "Upload": "Загрузить",
44932
+ "URL": "URL",
44933
+ "Browse...": "Обзор...",
44934
+ "Drop image here or click to browse": "Перетащите изображение сюда или нажмите для обзора",
44935
+ "Alt text": "Альтернативный текст",
44936
+ "Insert": "Вставить",
44937
+ "Cancel": "Отмена",
44938
+ "Uploading...": "Загрузка...",
44939
+ "Upload failed": "Ошибка загрузки",
44940
+ "Invalid image URL": "Недопустимый URL изображения",
44941
+ "File too large": "Файл слишком большой",
44942
+ "Invalid file type": "Недопустимый тип файла",
44943
+ "More": "Ещё"
44944
+ };
44945
+ const sr = {
44946
+ "Bold": "Подебљано",
44947
+ "Italic": "Курзив",
44948
+ "Underline": "Подвучено",
44949
+ "Strikethrough": "Прецртано",
44950
+ "Bullet list": "Листа са знаковима",
44951
+ "Numbered list": "Нумерисана листа",
44952
+ "Decrease indent": "Смањи увлачење",
44953
+ "Increase indent": "Повећај увлачење",
44954
+ "Blockquote": "Цитат",
44955
+ "Align left": "Поравнај лево",
44956
+ "Align center": "Центрирај",
44957
+ "Align right": "Поравнај десно",
44958
+ "Justify": "Обострано поравнање",
44959
+ "Text color": "Боја текста",
44960
+ "Background color": "Боја позадине",
44961
+ "Remove formatting": "Уклони форматирање",
44962
+ "Copy": "Копирај",
44963
+ "Cut": "Исеци",
44964
+ "Paste": "Налепи",
44965
+ "Undo": "Опозови",
44966
+ "Redo": "Понови",
44967
+ "Insert image": "Уметни слику",
44968
+ "Special character": "Специјални знак",
44969
+ "Emoticons": "Емотикони",
44970
+ "Fullscreen": "Цео екран",
44971
+ "Preview": "Преглед",
44972
+ "Source code": "Изворни код",
44973
+ "Insert link": "Уметни везу",
44974
+ "Code sample": "Пример кода",
44975
+ "Left to right": "Слева надесно",
44976
+ "Right to left": "Здесна налево",
44977
+ "Find and replace": "Пронађи и замени",
44978
+ "Font": "Фонт",
44979
+ "Font size": "Величина фонта",
44980
+ "Line height": "Висина реда",
44981
+ "Templates": "Шаблони",
44982
+ "Apply": "Примени",
44983
+ "Enter image URL:": "Унесите URL слике:",
44984
+ "Enter URL:": "Унесите URL:",
44985
+ "Edit HTML source:": "Уреди HTML извор:",
44986
+ "Find and Replace": "Пронађи и замени",
44987
+ "Find": "Пронађи",
44988
+ "Replace": "Замени",
44989
+ "Case sensitive": "Разликуј велика/мала слова",
44990
+ "Whole word": "Цела реч",
44991
+ "Previous": "Претходно",
44992
+ "Next": "Следеће",
44993
+ "Replace All": "Замени све",
44994
+ "Search...": "Претрага...",
44995
+ "Special Character": "Специјални знак",
44996
+ "Upload": "Отпреми",
44997
+ "URL": "URL",
44998
+ "Browse...": "Претражи...",
44999
+ "Drop image here or click to browse": "Превуците слику овде или кликните за претрагу",
45000
+ "Alt text": "Алтернативни текст",
45001
+ "Insert": "Уметни",
45002
+ "Cancel": "Откажи",
45003
+ "Uploading...": "Отпремање...",
45004
+ "Upload failed": "Отпремање није успело",
45005
+ "Invalid image URL": "Неважећи URL слике",
45006
+ "File too large": "Датотека је превелика",
45007
+ "Invalid file type": "Неважећи тип датотеке",
45008
+ "More": "Још"
45009
+ };
45010
+ const sl = {
45011
+ "Bold": "Krepko",
45012
+ "Italic": "Ležeče",
45013
+ "Underline": "Podčrtano",
45014
+ "Strikethrough": "Prečrtano",
45015
+ "Bullet list": "Seznam z oznakami",
45016
+ "Numbered list": "Oštevilčen seznam",
45017
+ "Decrease indent": "Zmanjšaj zamik",
45018
+ "Increase indent": "Povečaj zamik",
45019
+ "Blockquote": "Citat",
45020
+ "Align left": "Poravnaj levo",
45021
+ "Align center": "Sredinska poravnava",
45022
+ "Align right": "Poravnaj desno",
45023
+ "Justify": "Obojestranska poravnava",
45024
+ "Text color": "Barva besedila",
45025
+ "Background color": "Barva ozadja",
45026
+ "Remove formatting": "Odstrani oblikovanje",
45027
+ "Copy": "Kopiraj",
45028
+ "Cut": "Izreži",
45029
+ "Paste": "Prilepi",
45030
+ "Undo": "Razveljavi",
45031
+ "Redo": "Uveljavi",
45032
+ "Insert image": "Vstavi sliko",
45033
+ "Special character": "Posebni znak",
45034
+ "Emoticons": "Emotikoni",
45035
+ "Fullscreen": "Celoten zaslon",
45036
+ "Preview": "Predogled",
45037
+ "Source code": "Izvorna koda",
45038
+ "Insert link": "Vstavi povezavo",
45039
+ "Code sample": "Primer kode",
45040
+ "Left to right": "Od leve proti desni",
45041
+ "Right to left": "Od desne proti levi",
45042
+ "Find and replace": "Najdi in zamenjaj",
45043
+ "Font": "Pisava",
45044
+ "Font size": "Velikost pisave",
45045
+ "Line height": "Višina vrstice",
45046
+ "Templates": "Predloge",
45047
+ "Apply": "Uporabi",
45048
+ "Enter image URL:": "Vnesite URL slike:",
45049
+ "Enter URL:": "Vnesite URL:",
45050
+ "Edit HTML source:": "Uredi HTML izvorno kodo:",
45051
+ "Find and Replace": "Najdi in zamenjaj",
45052
+ "Find": "Najdi",
45053
+ "Replace": "Zamenjaj",
45054
+ "Case sensitive": "Razlikuj velike/male črke",
45055
+ "Whole word": "Cela beseda",
45056
+ "Previous": "Prejšnji",
45057
+ "Next": "Naslednji",
45058
+ "Replace All": "Zamenjaj vse",
45059
+ "Search...": "Iskanje...",
45060
+ "Special Character": "Posebni znak",
45061
+ "Upload": "Naloži",
45062
+ "URL": "URL",
45063
+ "Browse...": "Prebrskaj...",
45064
+ "Drop image here or click to browse": "Povlecite sliko sem ali kliknite za brskanje",
45065
+ "Alt text": "Nadomestno besedilo",
45066
+ "Insert": "Vstavi",
45067
+ "Cancel": "Prekliči",
45068
+ "Uploading...": "Nalaganje...",
45069
+ "Upload failed": "Nalaganje ni uspelo",
45070
+ "Invalid image URL": "Neveljaven URL slike",
45071
+ "File too large": "Datoteka je prevelika",
45072
+ "Invalid file type": "Neveljavna vrsta datoteke",
45073
+ "More": "Več"
45074
+ };
45075
+ const es = {
45076
+ "Bold": "Negrita",
45077
+ "Italic": "Cursiva",
45078
+ "Underline": "Subrayado",
45079
+ "Strikethrough": "Tachado",
45080
+ "Bullet list": "Lista con viñetas",
45081
+ "Numbered list": "Lista numerada",
45082
+ "Decrease indent": "Disminuir sangría",
45083
+ "Increase indent": "Aumentar sangría",
45084
+ "Blockquote": "Cita",
45085
+ "Align left": "Alinear a la izquierda",
45086
+ "Align center": "Centrar",
45087
+ "Align right": "Alinear a la derecha",
45088
+ "Justify": "Justificar",
45089
+ "Text color": "Color del texto",
45090
+ "Background color": "Color de fondo",
45091
+ "Remove formatting": "Quitar formato",
45092
+ "Copy": "Copiar",
45093
+ "Cut": "Cortar",
45094
+ "Paste": "Pegar",
45095
+ "Undo": "Deshacer",
45096
+ "Redo": "Rehacer",
45097
+ "Insert image": "Insertar imagen",
45098
+ "Special character": "Carácter especial",
45099
+ "Emoticons": "Emoticonos",
45100
+ "Fullscreen": "Pantalla completa",
45101
+ "Preview": "Vista previa",
45102
+ "Source code": "Código fuente",
45103
+ "Insert link": "Insertar enlace",
45104
+ "Code sample": "Ejemplo de código",
45105
+ "Left to right": "De izquierda a derecha",
45106
+ "Right to left": "De derecha a izquierda",
45107
+ "Find and replace": "Buscar y reemplazar",
45108
+ "Font": "Fuente",
45109
+ "Font size": "Tamaño de fuente",
45110
+ "Line height": "Altura de línea",
45111
+ "Templates": "Plantillas",
45112
+ "Apply": "Aplicar",
45113
+ "Enter image URL:": "Introduzca la URL de la imagen:",
45114
+ "Enter URL:": "Introduzca la URL:",
45115
+ "Edit HTML source:": "Editar código fuente HTML:",
45116
+ "Find and Replace": "Buscar y reemplazar",
45117
+ "Find": "Buscar",
45118
+ "Replace": "Reemplazar",
45119
+ "Case sensitive": "Distinguir mayúsculas/minúsculas",
45120
+ "Whole word": "Palabra completa",
45121
+ "Previous": "Anterior",
45122
+ "Next": "Siguiente",
45123
+ "Replace All": "Reemplazar todo",
45124
+ "Search...": "Buscar...",
45125
+ "Special Character": "Carácter especial",
45126
+ "Upload": "Subir",
45127
+ "URL": "URL",
45128
+ "Browse...": "Examinar...",
45129
+ "Drop image here or click to browse": "Arrastra la imagen aquí o haz clic para examinar",
45130
+ "Alt text": "Texto alternativo",
45131
+ "Insert": "Insertar",
45132
+ "Cancel": "Cancelar",
45133
+ "Uploading...": "Subiendo...",
45134
+ "Upload failed": "Error al subir",
45135
+ "Invalid image URL": "URL de imagen no válida",
45136
+ "File too large": "Archivo demasiado grande",
45137
+ "Invalid file type": "Tipo de archivo no válido",
45138
+ "More": "Más"
45139
+ };
45140
+ const sv = {
45141
+ "Bold": "Fet",
45142
+ "Italic": "Kursiv",
45143
+ "Underline": "Understruken",
45144
+ "Strikethrough": "Genomstruken",
45145
+ "Bullet list": "Punktlista",
45146
+ "Numbered list": "Numrerad lista",
45147
+ "Decrease indent": "Minska indrag",
45148
+ "Increase indent": "Öka indrag",
45149
+ "Blockquote": "Blockcitat",
45150
+ "Align left": "Vänsterjustera",
45151
+ "Align center": "Centrera",
45152
+ "Align right": "Högerjustera",
45153
+ "Justify": "Marginaljustera",
45154
+ "Text color": "Textfärg",
45155
+ "Background color": "Bakgrundsfärg",
45156
+ "Remove formatting": "Ta bort formatering",
45157
+ "Copy": "Kopiera",
45158
+ "Cut": "Klipp ut",
45159
+ "Paste": "Klistra in",
45160
+ "Undo": "Ångra",
45161
+ "Redo": "Gör om",
45162
+ "Insert image": "Infoga bild",
45163
+ "Special character": "Specialtecken",
45164
+ "Emoticons": "Emotikoner",
45165
+ "Fullscreen": "Helskärm",
45166
+ "Preview": "Förhandsgranska",
45167
+ "Source code": "Källkod",
45168
+ "Insert link": "Infoga länk",
45169
+ "Code sample": "Kodexempel",
45170
+ "Left to right": "Vänster till höger",
45171
+ "Right to left": "Höger till vänster",
45172
+ "Find and replace": "Sök och ersätt",
45173
+ "Font": "Teckensnitt",
45174
+ "Font size": "Teckenstorlek",
45175
+ "Line height": "Radhöjd",
45176
+ "Templates": "Mallar",
45177
+ "Apply": "Tillämpa",
45178
+ "Enter image URL:": "Ange bild-URL:",
45179
+ "Enter URL:": "Ange URL:",
45180
+ "Edit HTML source:": "Redigera HTML-källa:",
45181
+ "Find and Replace": "Sök och ersätt",
45182
+ "Find": "Sök",
45183
+ "Replace": "Ersätt",
45184
+ "Case sensitive": "Skiftlägeskänslig",
45185
+ "Whole word": "Helt ord",
45186
+ "Previous": "Föregående",
45187
+ "Next": "Nästa",
45188
+ "Replace All": "Ersätt alla",
45189
+ "Search...": "Sök...",
45190
+ "Special Character": "Specialtecken",
45191
+ "Upload": "Ladda upp",
45192
+ "URL": "URL",
45193
+ "Browse...": "Bläddra...",
45194
+ "Drop image here or click to browse": "Dra bilden hit eller klicka för att bläddra",
45195
+ "Alt text": "Alternativtext",
45196
+ "Insert": "Infoga",
45197
+ "Cancel": "Avbryt",
45198
+ "Uploading...": "Laddar upp...",
45199
+ "Upload failed": "Uppladdning misslyckades",
45200
+ "Invalid image URL": "Ogiltig bild-URL",
45201
+ "File too large": "Filen är för stor",
45202
+ "Invalid file type": "Ogiltig filtyp",
45203
+ "More": "Mer"
45204
+ };
45205
+ const zhTw = {
45206
+ "Bold": "粗體",
45207
+ "Italic": "斜體",
45208
+ "Underline": "底線",
45209
+ "Strikethrough": "刪除線",
45210
+ "Bullet list": "項目符號清單",
45211
+ "Numbered list": "編號清單",
45212
+ "Decrease indent": "減少縮排",
45213
+ "Increase indent": "增加縮排",
45214
+ "Blockquote": "引用",
45215
+ "Align left": "靠左對齊",
45216
+ "Align center": "置中對齊",
45217
+ "Align right": "靠右對齊",
45218
+ "Justify": "左右對齊",
45219
+ "Text color": "文字顏色",
45220
+ "Background color": "背景顏色",
45221
+ "Remove formatting": "清除格式",
45222
+ "Copy": "複製",
45223
+ "Cut": "剪下",
45224
+ "Paste": "貼上",
45225
+ "Undo": "復原",
45226
+ "Redo": "重做",
45227
+ "Insert image": "插入圖片",
45228
+ "Special character": "特殊字元",
45229
+ "Emoticons": "表情符號",
45230
+ "Fullscreen": "全螢幕",
45231
+ "Preview": "預覽",
45232
+ "Source code": "原始碼",
45233
+ "Insert link": "插入連結",
45234
+ "Code sample": "程式碼範例",
45235
+ "Left to right": "由左至右",
45236
+ "Right to left": "由右至左",
45237
+ "Find and replace": "尋找與取代",
45238
+ "Font": "字型",
45239
+ "Font size": "字型大小",
45240
+ "Line height": "行高",
45241
+ "Templates": "範本",
45242
+ "Apply": "套用",
45243
+ "Enter image URL:": "輸入圖片網址:",
45244
+ "Enter URL:": "輸入網址:",
45245
+ "Edit HTML source:": "編輯HTML原始碼:",
45246
+ "Find and Replace": "尋找與取代",
45247
+ "Find": "尋找",
45248
+ "Replace": "取代",
45249
+ "Case sensitive": "區分大小寫",
45250
+ "Whole word": "全字拼寫",
45251
+ "Previous": "上一個",
45252
+ "Next": "下一個",
45253
+ "Replace All": "全部取代",
45254
+ "Search...": "搜尋...",
45255
+ "Special Character": "特殊字元",
45256
+ "Upload": "上傳",
45257
+ "URL": "URL",
45258
+ "Browse...": "瀏覽...",
45259
+ "Drop image here or click to browse": "將圖片拖放至此處或點擊瀏覽",
45260
+ "Alt text": "替代文字",
45261
+ "Insert": "插入",
45262
+ "Cancel": "取消",
45263
+ "Uploading...": "上傳中...",
45264
+ "Upload failed": "上傳失敗",
45265
+ "Invalid image URL": "無效的圖片 URL",
45266
+ "File too large": "檔案過大",
45267
+ "Invalid file type": "無效的檔案類型",
45268
+ "More": "更多"
45269
+ };
45270
+ const th = {
45271
+ "Bold": "ตัวหนา",
45272
+ "Italic": "ตัวเอียง",
45273
+ "Underline": "ขีดเส้นใต้",
45274
+ "Strikethrough": "ขีดฆ่า",
45275
+ "Bullet list": "รายการสัญลักษณ์",
45276
+ "Numbered list": "รายการลำดับเลข",
45277
+ "Decrease indent": "ลดการเยื้อง",
45278
+ "Increase indent": "เพิ่มการเยื้อง",
45279
+ "Blockquote": "บล็อกอ้างอิง",
45280
+ "Align left": "จัดชิดซ้าย",
45281
+ "Align center": "จัดกึ่งกลาง",
45282
+ "Align right": "จัดชิดขวา",
45283
+ "Justify": "จัดเต็มบรรทัด",
45284
+ "Text color": "สีตัวอักษร",
45285
+ "Background color": "สีพื้นหลัง",
45286
+ "Remove formatting": "ล้างการจัดรูปแบบ",
45287
+ "Copy": "คัดลอก",
45288
+ "Cut": "ตัด",
45289
+ "Paste": "วาง",
45290
+ "Undo": "เลิกทำ",
45291
+ "Redo": "ทำซ้ำ",
45292
+ "Insert image": "แทรกรูปภาพ",
45293
+ "Special character": "อักขระพิเศษ",
45294
+ "Emoticons": "อิโมติคอน",
45295
+ "Fullscreen": "เต็มจอ",
45296
+ "Preview": "ดูตัวอย่าง",
45297
+ "Source code": "ซอร์สโค้ด",
45298
+ "Insert link": "แทรกลิงก์",
45299
+ "Code sample": "ตัวอย่างโค้ด",
45300
+ "Left to right": "ซ้ายไปขวา",
45301
+ "Right to left": "ขวาไปซ้าย",
45302
+ "Find and replace": "ค้นหาและแทนที่",
45303
+ "Font": "แบบอักษร",
45304
+ "Font size": "ขนาดอักษร",
45305
+ "Line height": "ความสูงบรรทัด",
45306
+ "Templates": "เทมเพลต",
45307
+ "Apply": "นำไปใช้",
45308
+ "Enter image URL:": "ป้อน URL รูปภาพ:",
45309
+ "Enter URL:": "ป้อน URL:",
45310
+ "Edit HTML source:": "แก้ไขซอร์สโค้ด HTML:",
45311
+ "Find and Replace": "ค้นหาและแทนที่",
45312
+ "Find": "ค้นหา",
45313
+ "Replace": "แทนที่",
45314
+ "Case sensitive": "ตรงตามตัวพิมพ์",
45315
+ "Whole word": "ทั้งคำ",
45316
+ "Previous": "ก่อนหน้า",
45317
+ "Next": "ถัดไป",
45318
+ "Replace All": "แทนที่ทั้งหมด",
45319
+ "Search...": "ค้นหา...",
45320
+ "Special Character": "อักขระพิเศษ",
45321
+ "Upload": "อัปโหลด",
45322
+ "URL": "URL",
45323
+ "Browse...": "เรียกดู...",
45324
+ "Drop image here or click to browse": "ลากรูปภาพมาที่นี่หรือคลิกเพื่อเรียกดู",
45325
+ "Alt text": "ข้อความทดแทน",
45326
+ "Insert": "แทรก",
45327
+ "Cancel": "ยกเลิก",
45328
+ "Uploading...": "กำลังอัปโหลด...",
45329
+ "Upload failed": "อัปโหลดล้มเหลว",
45330
+ "Invalid image URL": "URL รูปภาพไม่ถูกต้อง",
45331
+ "File too large": "ไฟล์ใหญ่เกินไป",
45332
+ "Invalid file type": "ประเภทไฟล์ไม่ถูกต้อง",
45333
+ "More": "เพิ่มเติม"
45334
+ };
45335
+ const tr = {
45336
+ "Bold": "Kalın",
45337
+ "Italic": "İtalik",
45338
+ "Underline": "Altı çizili",
45339
+ "Strikethrough": "Üstü çizili",
45340
+ "Bullet list": "Madde işaretli liste",
45341
+ "Numbered list": "Numaralı liste",
45342
+ "Decrease indent": "Girintiyi azalt",
45343
+ "Increase indent": "Girintiyi artır",
45344
+ "Blockquote": "Alıntı",
45345
+ "Align left": "Sola hizala",
45346
+ "Align center": "Ortala",
45347
+ "Align right": "Sağa hizala",
45348
+ "Justify": "İki yana yasla",
45349
+ "Text color": "Metin rengi",
45350
+ "Background color": "Arka plan rengi",
45351
+ "Remove formatting": "Biçimlendirmeyi kaldır",
45352
+ "Copy": "Kopyala",
45353
+ "Cut": "Kes",
45354
+ "Paste": "Yapıştır",
45355
+ "Undo": "Geri al",
45356
+ "Redo": "Yinele",
45357
+ "Insert image": "Resim ekle",
45358
+ "Special character": "Özel karakter",
45359
+ "Emoticons": "İfadeler",
45360
+ "Fullscreen": "Tam ekran",
45361
+ "Preview": "Önizleme",
45362
+ "Source code": "Kaynak kodu",
45363
+ "Insert link": "Bağlantı ekle",
45364
+ "Code sample": "Kod örneği",
45365
+ "Left to right": "Soldan sağa",
45366
+ "Right to left": "Sağdan sola",
45367
+ "Find and replace": "Bul ve değiştir",
45368
+ "Font": "Yazı tipi",
45369
+ "Font size": "Yazı tipi boyutu",
45370
+ "Line height": "Satır yüksekliği",
45371
+ "Templates": "Şablonlar",
45372
+ "Apply": "Uygula",
45373
+ "Enter image URL:": "Resim URL'sini girin:",
45374
+ "Enter URL:": "URL girin:",
45375
+ "Edit HTML source:": "HTML kaynağını düzenle:",
45376
+ "Find and Replace": "Bul ve değiştir",
45377
+ "Find": "Bul",
45378
+ "Replace": "Değiştir",
45379
+ "Case sensitive": "Büyük/küçük harf duyarlı",
45380
+ "Whole word": "Tam kelime",
45381
+ "Previous": "Önceki",
45382
+ "Next": "Sonraki",
45383
+ "Replace All": "Tümünü değiştir",
45384
+ "Search...": "Ara...",
45385
+ "Special Character": "Özel karakter",
45386
+ "Upload": "Yükle",
45387
+ "URL": "URL",
45388
+ "Browse...": "Gözat...",
45389
+ "Drop image here or click to browse": "Resmi buraya sürükleyin veya gözatmak için tıklayın",
45390
+ "Alt text": "Alternatif metin",
45391
+ "Insert": "Ekle",
45392
+ "Cancel": "İptal",
45393
+ "Uploading...": "Yükleniyor...",
45394
+ "Upload failed": "Yükleme başarısız",
45395
+ "Invalid image URL": "Geçersiz resim URL'si",
45396
+ "File too large": "Dosya çok büyük",
45397
+ "Invalid file type": "Geçersiz dosya türü",
45398
+ "More": "Daha fazla"
45399
+ };
45400
+ const vi = {
45401
+ "Bold": "In đậm",
45402
+ "Italic": "In nghiêng",
45403
+ "Underline": "Gạch chân",
45404
+ "Strikethrough": "Gạch ngang",
45405
+ "Bullet list": "Danh sách có dấu đầu dòng",
45406
+ "Numbered list": "Danh sách đánh số",
45407
+ "Decrease indent": "Giảm thụt lề",
45408
+ "Increase indent": "Tăng thụt lề",
45409
+ "Blockquote": "Trích dẫn",
45410
+ "Align left": "Căn trái",
45411
+ "Align center": "Căn giữa",
45412
+ "Align right": "Căn phải",
45413
+ "Justify": "Căn đều",
45414
+ "Text color": "Màu chữ",
45415
+ "Background color": "Màu nền",
45416
+ "Remove formatting": "Xóa định dạng",
45417
+ "Copy": "Sao chép",
45418
+ "Cut": "Cắt",
45419
+ "Paste": "Dán",
45420
+ "Undo": "Hoàn tác",
45421
+ "Redo": "Làm lại",
45422
+ "Insert image": "Chèn hình ảnh",
45423
+ "Special character": "Ký tự đặc biệt",
45424
+ "Emoticons": "Biểu tượng cảm xúc",
45425
+ "Fullscreen": "Toàn màn hình",
45426
+ "Preview": "Xem trước",
45427
+ "Source code": "Mã nguồn",
45428
+ "Insert link": "Chèn liên kết",
45429
+ "Code sample": "Mẫu mã",
45430
+ "Left to right": "Trái sang phải",
45431
+ "Right to left": "Phải sang trái",
45432
+ "Find and replace": "Tìm và thay thế",
45433
+ "Font": "Phông chữ",
45434
+ "Font size": "Cỡ chữ",
45435
+ "Line height": "Chiều cao dòng",
45436
+ "Templates": "Mẫu",
45437
+ "Apply": "Áp dụng",
45438
+ "Enter image URL:": "Nhập URL hình ảnh:",
45439
+ "Enter URL:": "Nhập URL:",
45440
+ "Edit HTML source:": "Chỉnh sửa mã nguồn HTML:",
45441
+ "Find and Replace": "Tìm và thay thế",
45442
+ "Find": "Tìm",
45443
+ "Replace": "Thay thế",
45444
+ "Case sensitive": "Phân biệt chữ hoa/thường",
45445
+ "Whole word": "Toàn bộ từ",
45446
+ "Previous": "Trước",
45447
+ "Next": "Tiếp",
45448
+ "Replace All": "Thay thế tất cả",
45449
+ "Search...": "Tìm kiếm...",
45450
+ "Special Character": "Ký tự đặc biệt",
45451
+ "Upload": "Tải lên",
45452
+ "URL": "URL",
45453
+ "Browse...": "Duyệt...",
45454
+ "Drop image here or click to browse": "Kéo thả hình ảnh vào đây hoặc nhấp để duyệt",
45455
+ "Alt text": "Văn bản thay thế",
45456
+ "Insert": "Chèn",
45457
+ "Cancel": "Hủy",
45458
+ "Uploading...": "Đang tải lên...",
45459
+ "Upload failed": "Tải lên thất bại",
45460
+ "Invalid image URL": "URL hình ảnh không hợp lệ",
45461
+ "File too large": "Tệp quá lớn",
45462
+ "Invalid file type": "Loại tệp không hợp lệ",
45463
+ "More": "Thêm"
45464
+ };
45465
+ const locales = {
45466
+ en,
45467
+ ar,
45468
+ ca,
45469
+ zh,
45470
+ cs,
45471
+ da,
45472
+ "en-gb": enGb,
45473
+ fi,
45474
+ fr,
45475
+ "fr-ca": frCa,
45476
+ de,
45477
+ el,
45478
+ hu,
45479
+ id,
45480
+ it,
45481
+ ja,
45482
+ ko,
45483
+ nl,
45484
+ nb,
45485
+ pl,
45486
+ pt,
45487
+ ro,
45488
+ ru,
45489
+ sr,
45490
+ sl,
45491
+ es,
45492
+ sv,
45493
+ "zh-tw": zhTw,
45494
+ th,
45495
+ tr,
45496
+ vi
45497
+ };
45498
+ function getLocale(code) {
45499
+ return locales[code] ?? locales["en"];
45500
+ }
45501
+ function createTranslateFunction(code) {
45502
+ const locale = getLocale(code);
45503
+ return (key) => locale[key] ?? key;
45504
+ }
45505
+ const availableLocales = Object.keys(locales);
45506
+ const TRANSLATION_KEYS = Object.keys(en);
42517
45507
  const lowlight = createLowlight(grammars);
42518
45508
  const fontNames = "Andale Mono=andale mono,times; Arial=arial,helvetica,sans-serif; Arial Black=arial black,avant garde; Book Antiqua=book antiqua,palatino; Comic Sans MS=comic sans ms,sans-serif; Courier New=courier new,courier; Georgia=georgia,palatino; Helvetica=helvetica; Impact=impact,chicago; Tahoma=tahoma,arial,helvetica,sans-serif; Terminal=terminal,monaco; Times New Roman=times new roman,times; Trebuchet MS=trebuchet ms,geneva; Verdana=verdana,geneva";
42519
- const FULL_TOOLBAR = "bold italic underline strikethrough | bullist numlist outdent indent blockquote | fontfamily fontsize | lineheight alignleft aligncenter alignright alignjustify | forecolor backcolor | removeformat copy cut paste | undo redo | image charmap emoticons | fullscreen preview | code link codesample | ltr rtl | searchreplace";
42520
- const BASIC_TOOLBAR = "bold italic underline strikethrough | bullist numlist outdent indent | fontfamily fontsize blockquote | lineheight alignleft aligncenter alignright alignjustify | forecolor backcolor | removeformat copy cut paste | undo redo | charmap emoticons | link | ltr rtl | searchreplace";
45509
+ const FULL_TOOLBAR = "bold italic underline strikethrough | bullist numlist outdent indent blockquote | fontfamily fontsize || lineheight alignleft aligncenter alignright alignjustify | forecolor backcolor | removeformat copy cut paste | undo redo | image charmap emoticons | fullscreen preview | code link codesample | ltr rtl | searchreplace";
45510
+ const BASIC_TOOLBAR = "bold italic underline strikethrough | bullist numlist outdent indent | fontfamily fontsize blockquote || lineheight alignleft aligncenter alignright alignjustify | forecolor backcolor | removeformat copy cut paste | undo redo | charmap emoticons | link | ltr rtl | searchreplace";
42521
45511
  const DEFAULT_FONT_SIZES = "8pt 9pt 10pt 12pt 14pt 18pt 24pt 36pt";
42522
45512
  let editorIdCounter = 0;
42523
45513
  let globalTranslate = (key) => key;
45514
+ let globalTranslateCustomized = false;
42524
45515
  let globalGetFileSrc = (path) => path;
42525
45516
  function setTranslate(fn) {
42526
45517
  globalTranslate = fn;
45518
+ globalTranslateCustomized = true;
42527
45519
  }
42528
45520
  function getTranslate() {
42529
45521
  return globalTranslate;
42530
45522
  }
45523
+ function resetTranslate() {
45524
+ globalTranslate = (key) => key;
45525
+ globalTranslateCustomized = false;
45526
+ }
42531
45527
  function setGetFileSrc(fn) {
42532
45528
  globalGetFileSrc = fn;
42533
45529
  }
@@ -42546,6 +45542,7 @@ class HTMLEditor {
42546
45542
  customButtons = /* @__PURE__ */ new Map();
42547
45543
  eventListeners = /* @__PURE__ */ new Map();
42548
45544
  changeTimeout = null;
45545
+ imageUploadHelper = null;
42549
45546
  constructor(container, config = {}) {
42550
45547
  this.id = `md-editor-${++editorIdCounter}`;
42551
45548
  this.container = container;
@@ -42572,6 +45569,8 @@ class HTMLEditor {
42572
45569
  images_upload_url: config.images_upload_url,
42573
45570
  images_upload_credentials: config.images_upload_credentials ?? true,
42574
45571
  images_upload_base_path: config.images_upload_base_path ?? "/",
45572
+ images_upload_max_size: config.images_upload_max_size,
45573
+ images_upload_headers: config.images_upload_headers,
42575
45574
  font_family_formats: config.font_family_formats ?? fontNames,
42576
45575
  font_size_formats: config.font_size_formats ?? DEFAULT_FONT_SIZES,
42577
45576
  fontName: config.fontName,
@@ -42579,13 +45578,15 @@ class HTMLEditor {
42579
45578
  directionality: config.directionality ?? "ltr",
42580
45579
  language: config.language ?? "en",
42581
45580
  height: config.height ?? 300,
45581
+ min_height: config.min_height,
45582
+ max_height: config.max_height,
42582
45583
  auto_focus: config.auto_focus,
42583
45584
  setFocus: config.setFocus,
42584
45585
  skin: config.skin ?? "oxide",
42585
45586
  content_css: config.content_css ?? "default",
42586
45587
  content_style: config.content_style,
42587
45588
  toolbar: config.toolbar ?? (config.basicEditor ? BASIC_TOOLBAR : FULL_TOOLBAR),
42588
- toolbar_mode: config.toolbar_mode ?? "sliding",
45589
+ toolbar_mode: config.toolbar_mode ?? "wrap",
42589
45590
  toolbar_sticky: config.toolbar_sticky ?? true,
42590
45591
  menubar: config.menubar ?? false,
42591
45592
  contextmenu: config.contextmenu ?? "",
@@ -42601,6 +45602,9 @@ class HTMLEditor {
42601
45602
  };
42602
45603
  }
42603
45604
  createEditor() {
45605
+ if (!globalTranslateCustomized) {
45606
+ globalTranslate = createTranslateFunction(this.config.language ?? "en");
45607
+ }
42604
45608
  this.editorWrapper = document.createElement("div");
42605
45609
  this.editorWrapper.className = `md-editor md-editor-${this.config.skin}`;
42606
45610
  this.editorWrapper.id = this.id;
@@ -42612,6 +45616,20 @@ class HTMLEditor {
42612
45616
  this.editorWrapper.style.height = this.config.height;
42613
45617
  }
42614
45618
  }
45619
+ if (this.config.min_height) {
45620
+ if (typeof this.config.min_height === "number") {
45621
+ this.editorWrapper.style.minHeight = `${this.config.min_height}px`;
45622
+ } else {
45623
+ this.editorWrapper.style.minHeight = this.config.min_height;
45624
+ }
45625
+ }
45626
+ if (this.config.max_height) {
45627
+ if (typeof this.config.max_height === "number") {
45628
+ this.editorWrapper.style.maxHeight = `${this.config.max_height}px`;
45629
+ } else {
45630
+ this.editorWrapper.style.maxHeight = this.config.max_height;
45631
+ }
45632
+ }
42615
45633
  const toolbarContainer = document.createElement("div");
42616
45634
  toolbarContainer.className = "md-editor-toolbar";
42617
45635
  this.editorWrapper.appendChild(toolbarContainer);
@@ -42650,13 +45668,15 @@ class HTMLEditor {
42650
45668
  }
42651
45669
  };
42652
45670
  this.tiptap = new Editor(editorOptions);
45671
+ const iconSet = this.config.skin?.startsWith("confab") ? CONFAB_ICONS : DEFAULT_ICONS;
42653
45672
  this.toolbar = new Toolbar(toolbarContainer, {
42654
45673
  editor: this,
42655
45674
  buttons: this.config.toolbar ?? BASIC_TOOLBAR,
42656
45675
  mode: this.config.toolbar_mode ?? "sliding",
42657
45676
  sticky: this.config.toolbar_sticky ?? true,
42658
45677
  customButtons: this.customButtons,
42659
- config: this.config
45678
+ config: this.config,
45679
+ iconSet
42660
45680
  });
42661
45681
  if (this.config.auto_focus) {
42662
45682
  setTimeout(() => this.focus(), 10);
@@ -42668,6 +45688,70 @@ class HTMLEditor {
42668
45688
  }
42669
45689
  }, 10);
42670
45690
  }
45691
+ if (!this.config.basicEditor) {
45692
+ this.setupImageHandlers(editorContent);
45693
+ }
45694
+ }
45695
+ getImageUploadHelper() {
45696
+ if (!this.imageUploadHelper) {
45697
+ this.imageUploadHelper = new ImageUpload({
45698
+ onInsert: () => {
45699
+ },
45700
+ uploadUrl: this.config.images_upload_url,
45701
+ uploadCredentials: this.config.images_upload_credentials,
45702
+ uploadBasePath: this.config.images_upload_base_path,
45703
+ uploadMaxSize: this.config.images_upload_max_size,
45704
+ uploadHeaders: this.config.images_upload_headers,
45705
+ trans: globalTranslate
45706
+ });
45707
+ }
45708
+ return this.imageUploadHelper;
45709
+ }
45710
+ setupImageHandlers(editorContent) {
45711
+ editorContent.addEventListener("dragover", (e) => {
45712
+ if (e.dataTransfer?.types.includes("Files")) {
45713
+ e.preventDefault();
45714
+ e.dataTransfer.dropEffect = "copy";
45715
+ this.editorWrapper?.classList.add("md-editor-dragover");
45716
+ }
45717
+ });
45718
+ editorContent.addEventListener("dragleave", (e) => {
45719
+ const related = e.relatedTarget;
45720
+ if (!related || !editorContent.contains(related)) {
45721
+ this.editorWrapper?.classList.remove("md-editor-dragover");
45722
+ }
45723
+ });
45724
+ editorContent.addEventListener("drop", (e) => {
45725
+ this.editorWrapper?.classList.remove("md-editor-dragover");
45726
+ const files = e.dataTransfer?.files;
45727
+ if (!files || files.length === 0) return;
45728
+ const imageFile = Array.from(files).find((f) => f.type.startsWith("image/"));
45729
+ if (!imageFile) return;
45730
+ e.preventDefault();
45731
+ e.stopPropagation();
45732
+ this.handleImageFileUpload(imageFile);
45733
+ });
45734
+ editorContent.addEventListener("paste", (e) => {
45735
+ const items = e.clipboardData?.items;
45736
+ if (!items) return;
45737
+ for (const item of Array.from(items)) {
45738
+ if (item.type.startsWith("image/")) {
45739
+ const file = item.getAsFile();
45740
+ if (file) {
45741
+ e.preventDefault();
45742
+ this.handleImageFileUpload(file);
45743
+ return;
45744
+ }
45745
+ }
45746
+ }
45747
+ });
45748
+ }
45749
+ handleImageFileUpload(file) {
45750
+ const helper = this.getImageUploadHelper();
45751
+ helper.uploadFile(file).then((src) => {
45752
+ this.tiptap?.chain().focus().setImage({ src }).run();
45753
+ }).catch(() => {
45754
+ });
42671
45755
  }
42672
45756
  buildExtensions() {
42673
45757
  const extensions = [
@@ -42675,6 +45759,7 @@ class HTMLEditor {
42675
45759
  codeBlock: false
42676
45760
  // We use CodeBlockLowlight instead
42677
45761
  }),
45762
+ SignatureBlock,
42678
45763
  Underline,
42679
45764
  TextStyle,
42680
45765
  FontFamily,
@@ -42878,6 +45963,8 @@ class HTMLEditor {
42878
45963
  this.toolbar = null;
42879
45964
  this.tiptap?.destroy();
42880
45965
  this.tiptap = null;
45966
+ this.imageUploadHelper?.destroy();
45967
+ this.imageUploadHelper = null;
42881
45968
  if (this.editorWrapper) {
42882
45969
  this.editorWrapper.remove();
42883
45970
  }
@@ -42888,6 +45975,15 @@ class HTMLEditor {
42888
45975
  getTipTap() {
42889
45976
  return this.tiptap;
42890
45977
  }
45978
+ /**
45979
+ * Set the UI language, updating all toolbar and dialog translations.
45980
+ */
45981
+ setLanguage(code) {
45982
+ this.config.language = code;
45983
+ globalTranslate = createTranslateFunction(code);
45984
+ this.toolbar?.rebuild();
45985
+ this.fire("languagechange", code);
45986
+ }
42891
45987
  /**
42892
45988
  * Get the editor config
42893
45989
  */
@@ -42902,18 +45998,26 @@ class HTMLEditor {
42902
45998
  }
42903
45999
  }
42904
46000
  exports.CHAR_MAP = CHAR_MAP;
46001
+ exports.CONFAB_ICONS = CONFAB_ICONS;
42905
46002
  exports.CharacterMap = CharacterMap;
46003
+ exports.DEFAULT_ICONS = DEFAULT_ICONS;
42906
46004
  exports.EMOJI_CATEGORIES = EMOJI_CATEGORIES;
42907
46005
  exports.EmojiPicker = EmojiPicker;
42908
46006
  exports.FontSize = FontSize;
42909
46007
  exports.HTMLEditor = HTMLEditor;
42910
46008
  exports.LineHeight = LineHeight;
42911
46009
  exports.SearchReplace = SearchReplace;
46010
+ exports.SignatureBlock = SignatureBlock;
46011
+ exports.TRANSLATION_KEYS = TRANSLATION_KEYS;
42912
46012
  exports.TextDirection = TextDirection;
42913
46013
  exports.Toolbar = Toolbar;
46014
+ exports.availableLocales = availableLocales;
46015
+ exports.createTranslateFunction = createTranslateFunction;
42914
46016
  exports.fontNames = fontNames;
42915
46017
  exports.getGetFileSrc = getGetFileSrc;
46018
+ exports.getLocale = getLocale;
42916
46019
  exports.getTranslate = getTranslate;
46020
+ exports.resetTranslate = resetTranslate;
42917
46021
  exports.setGetFileSrc = setGetFileSrc;
42918
46022
  exports.setTranslate = setTranslate;
42919
46023
  //# sourceMappingURL=index.js.map