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