magic-editor-x 1.1.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +82 -5
  2. package/dist/_chunks/{App-mtrlABtd.js → App-BHNqY71z.js} +4 -4
  3. package/dist/_chunks/{App-B1FgOsWa.mjs → App-LgFoHtyD.mjs} +4 -4
  4. package/dist/_chunks/{LicensePage-BnyWSrWs.js → LicensePage-VwKQMnUO.js} +2 -2
  5. package/dist/_chunks/{LicensePage-CWH-AFR-.mjs → LicensePage-oxUnaZmr.mjs} +2 -2
  6. package/dist/_chunks/{LiveCollaborationPanel-DbDHwr2C.js → LiveCollaborationPanel-CqtkFWJs.js} +1 -1
  7. package/dist/_chunks/{LiveCollaborationPanel-ryjcDAA7.mjs → LiveCollaborationPanel-elejZRkh.mjs} +1 -1
  8. package/dist/_chunks/{Settings-Bk9bxJTy.js → Settings-4wUHMbn0.js} +1 -1
  9. package/dist/_chunks/{Settings-D-V2MLVm.mjs → Settings-BI9zxX3k.mjs} +1 -1
  10. package/dist/_chunks/{de-CSrHZWEb.mjs → de-C_0Mj-Zo.mjs} +1 -0
  11. package/dist/_chunks/{de-CzSo1oD2.js → de-DVNVpAt9.js} +1 -0
  12. package/dist/_chunks/{en-DuQun2v4.mjs → en-B7AAf1ie.mjs} +1 -0
  13. package/dist/_chunks/{en-DxIkVPUh.js → en-C2hv5GsA.js} +1 -0
  14. package/dist/_chunks/{es-DAQ_97zx.js → es-BzJqcIST.js} +1 -0
  15. package/dist/_chunks/{es-DEB0CA8S.mjs → es-zdP8sd-f.mjs} +1 -0
  16. package/dist/_chunks/{fr-Bqkhvdx2.mjs → fr-CtAgOgH1.mjs} +1 -0
  17. package/dist/_chunks/{fr-ChPabvNP.js → fr-D3GwqAAJ.js} +1 -0
  18. package/dist/_chunks/{getTranslation-C4uWR0DB.mjs → getTranslation-ChB_HlBd.mjs} +7 -6
  19. package/dist/_chunks/{getTranslation-D35vbDap.js → getTranslation-DxG1pB5q.js} +2 -1
  20. package/dist/_chunks/{index-BiLy_f7C.js → index-C_SiBh7v.js} +9 -9
  21. package/dist/_chunks/{index-B5MzUyo0.mjs → index-CtyxDZ0S.mjs} +9 -9
  22. package/dist/_chunks/{index-CQx7-dFP.js → index-DGRg45vZ.js} +890 -65
  23. package/dist/_chunks/{index-BRVqbnOb.mjs → index-IYdGq7Rl.mjs} +891 -66
  24. package/dist/_chunks/{pt-BMoYltav.mjs → pt-BmUw6YMP.mjs} +1 -0
  25. package/dist/_chunks/{pt-Cm74LpyZ.js → pt-CFo0nTbj.js} +1 -0
  26. package/dist/_chunks/{tools-CjnQJ9w2.mjs → tools-BAvbiUHr.mjs} +6 -1
  27. package/dist/_chunks/{tools-DNt2tioN.js → tools-Dn4jPdJs.js} +6 -1
  28. package/dist/admin/index.js +1 -1
  29. package/dist/admin/index.mjs +1 -1
  30. package/dist/server/index.js +37242 -1292
  31. package/dist/server/index.mjs +37228 -1285
  32. package/package.json +1 -1
package/README.md CHANGED
@@ -9,6 +9,15 @@
9
9
 
10
10
  ---
11
11
 
12
+ ## 🆕 What's New in v1.2.0
13
+
14
+ - **Character-Level Collaboration** - Multiple users can now type in the same paragraph simultaneously without conflicts
15
+ - **Webtools Links Integration** - Optional integration with PluginPal's Webtools Links addon for internal/external link management
16
+ - **Improved Fullscreen Mode** - Blocks now stretch to full width, Media Library modal works correctly
17
+ - **Performance Improvements** - Removed debug logging, optimized Y.js sync
18
+
19
+ ---
20
+
12
21
  ## Introduction
13
22
 
14
23
  Magic Editor X is a production-ready Strapi v5 Custom Field that brings the power of Editor.js to your content management workflow. Unlike traditional WYSIWYG replacements or plugins that override Strapi's default editor, Magic Editor X integrates as a **proper Custom Field** in Strapi's Content-Type Builder, giving you complete control over when and where to use it.
@@ -59,13 +68,16 @@ admin/
59
68
  ├── src/
60
69
  │ ├── components/
61
70
  │ │ ├── EditorJS/ # Main editor component
62
- │ │ ├── EditorTools/ # Custom tools (Button, Hyperlink, AI)
71
+ │ │ ├── EditorTools/ # Custom tools (Button, Hyperlink, AI, WebtoolsLink)
63
72
  │ │ ├── MediaLib/ # Strapi Media Library adapter
64
73
  │ │ └── LiveCollaborationPanel.jsx # Collaboration UI
65
74
  │ ├── hooks/
66
75
  │ │ ├── useMagicCollaboration.js # Y.js & Socket.io integration
76
+ │ │ ├── useWebtoolsLinks.js # 🆕 Webtools Links addon integration
67
77
  │ │ ├── useAIAssistant.js # AI features
68
78
  │ │ └── useLicense.js # License management
79
+ │ ├── utils/
80
+ │ │ └── YTextBinding.js # 🆕 Y.Text <-> contenteditable binding
69
81
  │ ├── config/
70
82
  │ │ └── tools.js # Editor.js tools configuration
71
83
  │ └── index.js # Plugin registration
@@ -187,6 +199,26 @@ Magic Editor X uses Y.js, a battle-tested CRDT implementation, to enable true re
187
199
  5. **Automatic Merge** - Y.js guarantees conflict-free merges (no "last write wins")
188
200
  6. **Persistence** - Changes are stored in IndexedDB for offline capability
189
201
 
202
+ **🆕 Character-Level Collaboration (v1.2.0)**
203
+
204
+ Starting with v1.2.0, Magic Editor X supports **simultaneous editing within the same block**. Multiple users can type in the same paragraph at the same time without conflicts:
205
+
206
+ ```
207
+ ┌─────────────────────────────────────────────────────────┐
208
+ │ Before v1.2.0: Block-Level Sync │
209
+ │ User A edits Block 1 → User B's Block 1 changes lost │
210
+ ├─────────────────────────────────────────────────────────┤
211
+ │ After v1.2.0: Character-Level Sync │
212
+ │ User A types "Hello" → User B types "World" → "HelloWorld" │
213
+ │ Both changes merge seamlessly! │
214
+ └─────────────────────────────────────────────────────────┘
215
+ ```
216
+
217
+ **Hybrid Data Structure:**
218
+ - `Y.Map` for block metadata (type, tunes, order)
219
+ - `Y.Text` for character-level content (rich text with formatting)
220
+ - `Y.Map` for document metadata (blockOrder, timestamps)
221
+
190
222
  **Example: Collaborative Editing Flow**
191
223
 
192
224
  ```javascript
@@ -315,7 +347,44 @@ class MediaLibAdapter {
315
347
  }
316
348
  ```
317
349
 
318
- ### 5. AI-Powered Features (Premium)
350
+ ### 5. Webtools Links Integration (Optional)
351
+
352
+ Magic Editor X integrates seamlessly with the [Webtools Links addon](https://www.pluginpal.io/plugin/webtools) by PluginPal for enhanced link management:
353
+
354
+ **Features:**
355
+ - 🔗 **Internal Link Picker** - Select pages/entries from your Strapi content
356
+ - 🌐 **External URL Support** - Paste external URLs with validation
357
+ - ✏️ **Edit Existing Links** - Click on a link to edit its URL and text
358
+ - 🔍 **Link Detection** - Automatically detects when cursor is inside a link
359
+
360
+ **Setup:**
361
+
362
+ 1. Install the Webtools Links addon (requires Webtools license)
363
+ 2. Magic Editor X auto-detects the addon and enables the Link Picker button
364
+
365
+ **Usage:**
366
+
367
+ ```javascript
368
+ // The integration uses Strapi's plugin API
369
+ const getPlugin = useStrapiApp('WebtoolsLinks', (state) => state.getPlugin);
370
+ const linksPlugin = getPlugin('webtools-addon-links');
371
+ const { openLinkPicker } = linksPlugin?.apis;
372
+
373
+ // Open picker with existing link data (for editing)
374
+ const result = await openLinkPicker({
375
+ linkType: 'both', // 'internal', 'external', or 'both'
376
+ initialHref: existingUrl, // Pre-fill for editing
377
+ initialText: selectedText // Pre-fill link text
378
+ });
379
+ ```
380
+
381
+ **Without Webtools:**
382
+
383
+ If Webtools is not installed, a subtle promo link appears in the editor footer pointing to the addon store page.
384
+
385
+ ---
386
+
387
+ ### 6. AI-Powered Features (Premium)
319
388
 
320
389
  Built-in AI assistant for content enhancement:
321
390
 
@@ -907,13 +976,21 @@ Add to `config/plugins.ts`:
907
976
 
908
977
  ## Roadmap
909
978
 
910
- - **Version History** - Track all content changes with restore capability
979
+ ### Completed
980
+ - **Version History** - Track all content changes with snapshot restore (v1.1.0)
981
+ - **Character-Level Collaboration** - Simultaneous editing in same block (v1.2.0)
982
+ - **Webtools Links Integration** - Internal/external link picker (v1.2.0)
983
+
984
+ ### 🚧 In Progress
985
+ - **Comments & Annotations** - Inline comments for editorial workflow
911
986
  - **Custom Blocks API** - Simplified API for creating custom tools
987
+
988
+ ### 📋 Planned
912
989
  - **Advanced AI** - Content suggestions, auto-completion, tone analysis
913
- - **Comments & Annotations** - Inline comments for editorial workflow
914
990
  - **Offline Mode** - Full offline editing with sync on reconnect
915
991
  - **Import/Export** - Markdown, HTML, DOCX conversion
916
992
  - **Templates** - Pre-built content templates
993
+ - **Block Permissions** - Per-block editing restrictions
917
994
 
918
995
  ---
919
996
 
@@ -953,7 +1030,7 @@ npm run watch:link
953
1030
 
954
1031
  MIT License - See [LICENSE](LICENSE) for details
955
1032
 
956
- Copyright (c) 2024 Schero D.
1033
+ Copyright (c) 2024-2025 Schero D.
957
1034
 
958
1035
  ---
959
1036
 
@@ -7,10 +7,10 @@ const admin = require("@strapi/strapi/admin");
7
7
  const styled = require("styled-components");
8
8
  const outline = require("@heroicons/react/24/outline");
9
9
  const EditorJS = require("@editorjs/editorjs");
10
- const getTranslation = require("./getTranslation-D35vbDap.js");
11
- const tools = require("./tools-DNt2tioN.js");
12
- const index = require("./index-BiLy_f7C.js");
13
- const LicensePage = require("./LicensePage-BnyWSrWs.js");
10
+ const getTranslation = require("./getTranslation-DxG1pB5q.js");
11
+ const tools = require("./tools-Dn4jPdJs.js");
12
+ const index = require("./index-C_SiBh7v.js");
13
+ const LicensePage = require("./LicensePage-VwKQMnUO.js");
14
14
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
15
15
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
16
16
  const EditorJS__default = /* @__PURE__ */ _interopDefault(EditorJS);
@@ -5,10 +5,10 @@ import { useFetchClient, useNotification, Page } from "@strapi/strapi/admin";
5
5
  import styled, { css, keyframes } from "styled-components";
6
6
  import { HashtagIcon, DocumentTextIcon, ListBulletIcon, CheckIcon, ChatBubbleBottomCenterTextIcon, CodeBracketIcon, PhotoIcon, TableCellsIcon, LinkIcon, ExclamationTriangleIcon, PaperClipIcon, BellAlertIcon, SparklesIcon, BeakerIcon, PlayCircleIcon, ArrowPathIcon, EyeIcon, DocumentDuplicateIcon, ChevronRightIcon, CubeTransparentIcon, Cog6ToothIcon, UserGroupIcon, BookOpenIcon, CommandLineIcon, UserPlusIcon, TrashIcon, CheckCircleIcon, XMarkIcon, KeyIcon } from "@heroicons/react/24/outline";
7
7
  import EditorJS from "@editorjs/editorjs";
8
- import { u as useIntl, g as getTranslation, L as Loader, B as Box, T as Typography, a as Flex, b as TextInput, c as Button$2 } from "./getTranslation-C4uWR0DB.mjs";
9
- import { g as getTools } from "./tools-CjnQJ9w2.mjs";
10
- import { P as PLUGIN_ID } from "./index-B5MzUyo0.mjs";
11
- import LicensePage from "./LicensePage-CWH-AFR-.mjs";
8
+ import { u as useIntl, g as getTranslation, L as Loader, a as Box, T as Typography, F as Flex, c as TextInput, B as Button$2 } from "./getTranslation-ChB_HlBd.mjs";
9
+ import { g as getTools } from "./tools-BAvbiUHr.mjs";
10
+ import { P as PLUGIN_ID } from "./index-CtyxDZ0S.mjs";
11
+ import LicensePage from "./LicensePage-oxUnaZmr.mjs";
12
12
  const fadeInUp = keyframes`
13
13
  from { opacity: 0; transform: translateY(20px); }
14
14
  to { opacity: 1; transform: translateY(0); }
@@ -3,9 +3,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
5
  const admin = require("@strapi/strapi/admin");
6
- const getTranslation = require("./getTranslation-D35vbDap.js");
6
+ const getTranslation = require("./getTranslation-DxG1pB5q.js");
7
7
  const styled = require("styled-components");
8
- const index = require("./index-BiLy_f7C.js");
8
+ const index = require("./index-C_SiBh7v.js");
9
9
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
10
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
11
11
  const Container = styled__default.default(getTranslation.Box)`
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useState, useEffect } from "react";
3
3
  import { useFetchClient, useNotification } from "@strapi/strapi/admin";
4
- import { u as useIntl, a as Flex, L as Loader, T as Typography, d as Badge, B as Box, g as getTranslation, c as Button } from "./getTranslation-C4uWR0DB.mjs";
4
+ import { u as useIntl, F as Flex, L as Loader, T as Typography, d as Badge, a as Box, g as getTranslation, B as Button } from "./getTranslation-ChB_HlBd.mjs";
5
5
  import styled from "styled-components";
6
- import { F as ForwardRef$2o, a as ForwardRef$26, b as ForwardRef$o, c as ForwardRef$1g, d as ForwardRef$y } from "./index-B5MzUyo0.mjs";
6
+ import { F as ForwardRef$2o, a as ForwardRef$26, b as ForwardRef$o, c as ForwardRef$1g, d as ForwardRef$y } from "./index-CtyxDZ0S.mjs";
7
7
  const Container = styled(Box)`
8
8
  padding: 32px;
9
9
  max-width: 1400px;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
- const getTranslation = require("./getTranslation-D35vbDap.js");
5
+ const getTranslation = require("./getTranslation-DxG1pB5q.js");
6
6
  const styled = require("styled-components");
7
7
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
8
8
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useEffect, useMemo } from "react";
3
- import { u as useIntl, a as Flex, g as getTranslation } from "./getTranslation-C4uWR0DB.mjs";
3
+ import { u as useIntl, F as Flex, g as getTranslation } from "./getTranslation-ChB_HlBd.mjs";
4
4
  import styled, { css, keyframes } from "styled-components";
5
5
  const pulse = keyframes`
6
6
  0%, 100% {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
- const getTranslation = require("./getTranslation-D35vbDap.js");
5
+ const getTranslation = require("./getTranslation-DxG1pB5q.js");
6
6
  const admin = require("@strapi/strapi/admin");
7
7
  const outline = require("@heroicons/react/24/outline");
8
8
  const styled = require("styled-components");
@@ -1,6 +1,6 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useEffect } from "react";
3
- import { u as useIntl, L as Loader, B as Box, A as Alert, a as Flex, T as Typography, c as Button, d as Badge, e as Accordion, g as getTranslation } from "./getTranslation-C4uWR0DB.mjs";
3
+ import { u as useIntl, L as Loader, a as Box, A as Alert, F as Flex, T as Typography, B as Button, d as Badge, e as Accordion, g as getTranslation } from "./getTranslation-ChB_HlBd.mjs";
4
4
  import { useFetchClient, useNotification } from "@strapi/strapi/admin";
5
5
  import { ArrowPathIcon, DocumentDuplicateIcon, ArrowDownTrayIcon, UserIcon, UsersIcon, ShieldCheckIcon, SparklesIcon, ChartBarIcon } from "@heroicons/react/24/outline";
6
6
  import styled, { css, keyframes } from "styled-components";
@@ -92,6 +92,7 @@ const de = {
92
92
  "editor.clearConfirm": "Gesamten Inhalt löschen? Dies kann nicht rückgängig gemacht werden.",
93
93
  "editor.fullscreen": "Vollbild",
94
94
  "editor.exitFullscreen": "Vollbild beenden",
95
+ "editor.versionHistory": "Verlauf",
95
96
  "editor.mediaLibrary": "Media Library",
96
97
  "editor.placeholder": "Beginne mit dem Schreiben deines Inhalts...",
97
98
  "collab.title": "Live-Zusammenarbeit",
@@ -94,6 +94,7 @@ const de = {
94
94
  "editor.clearConfirm": "Gesamten Inhalt löschen? Dies kann nicht rückgängig gemacht werden.",
95
95
  "editor.fullscreen": "Vollbild",
96
96
  "editor.exitFullscreen": "Vollbild beenden",
97
+ "editor.versionHistory": "Verlauf",
97
98
  "editor.mediaLibrary": "Media Library",
98
99
  "editor.placeholder": "Beginne mit dem Schreiben deines Inhalts...",
99
100
  "collab.title": "Live-Zusammenarbeit",
@@ -92,6 +92,7 @@ const en = {
92
92
  "editor.clearConfirm": "Clear all content? This cannot be undone.",
93
93
  "editor.fullscreen": "Fullscreen",
94
94
  "editor.exitFullscreen": "Exit Fullscreen",
95
+ "editor.versionHistory": "History",
95
96
  "editor.mediaLibrary": "Media Library",
96
97
  "editor.placeholder": "Start writing your amazing content...",
97
98
  "collab.title": "Live Collaboration",
@@ -94,6 +94,7 @@ const en = {
94
94
  "editor.clearConfirm": "Clear all content? This cannot be undone.",
95
95
  "editor.fullscreen": "Fullscreen",
96
96
  "editor.exitFullscreen": "Exit Fullscreen",
97
+ "editor.versionHistory": "History",
97
98
  "editor.mediaLibrary": "Media Library",
98
99
  "editor.placeholder": "Start writing your amazing content...",
99
100
  "collab.title": "Live Collaboration",
@@ -94,6 +94,7 @@ const es = {
94
94
  "editor.clearConfirm": "¿Limpiar todo el contenido? Esto no se puede deshacer.",
95
95
  "editor.fullscreen": "Pantalla Completa",
96
96
  "editor.exitFullscreen": "Salir de Pantalla Completa",
97
+ "editor.versionHistory": "Historial",
97
98
  "editor.mediaLibrary": "Media Library",
98
99
  "editor.placeholder": "Comienza a escribir tu increíble contenido...",
99
100
  "collab.title": "Colaboración en Vivo",
@@ -92,6 +92,7 @@ const es = {
92
92
  "editor.clearConfirm": "¿Limpiar todo el contenido? Esto no se puede deshacer.",
93
93
  "editor.fullscreen": "Pantalla Completa",
94
94
  "editor.exitFullscreen": "Salir de Pantalla Completa",
95
+ "editor.versionHistory": "Historial",
95
96
  "editor.mediaLibrary": "Media Library",
96
97
  "editor.placeholder": "Comienza a escribir tu increíble contenido...",
97
98
  "collab.title": "Colaboración en Vivo",
@@ -92,6 +92,7 @@ const fr = {
92
92
  "editor.clearConfirm": "Effacer tout le contenu ? Cela ne peut pas être annulé.",
93
93
  "editor.fullscreen": "Plein Écran",
94
94
  "editor.exitFullscreen": "Quitter le Plein Écran",
95
+ "editor.versionHistory": "Historique",
95
96
  "editor.mediaLibrary": "Media Library",
96
97
  "editor.placeholder": "Commencez à écrire votre incroyable contenu...",
97
98
  "collab.title": "Collaboration en Direct",
@@ -94,6 +94,7 @@ const fr = {
94
94
  "editor.clearConfirm": "Effacer tout le contenu ? Cela ne peut pas être annulé.",
95
95
  "editor.fullscreen": "Plein Écran",
96
96
  "editor.exitFullscreen": "Quitter le Plein Écran",
97
+ "editor.versionHistory": "Historique",
97
98
  "editor.mediaLibrary": "Media Library",
98
99
  "editor.placeholder": "Commencez à écrire votre incroyable contenu...",
99
100
  "collab.title": "Collaboration en Direct",
@@ -4,7 +4,7 @@ import { styled, css, keyframes, createGlobalStyle, useTheme } from "styled-comp
4
4
  import { jsx, jsxs, Fragment as Fragment$1 } from "react/jsx-runtime";
5
5
  import * as ReactDOM from "react-dom";
6
6
  import ReactDOM__default, { flushSync, createPortal } from "react-dom";
7
- import { a as ForwardRef$26, e as ForwardRef$2n, f as ForwardRef$2, g as ForwardRef$1l, h as ForwardRef$1b, i as ForwardRef$2v, j as ForwardRef$1U, k as ForwardRef$2j, l as ForwardRef$12, m as ForwardRef$2k, n as ForwardRef$2x, o as ForwardRef$2h, p as ForwardRef$v, P as PLUGIN_ID } from "./index-B5MzUyo0.mjs";
7
+ import { a as ForwardRef$26, e as ForwardRef$2n, f as ForwardRef$2, g as ForwardRef$1l, h as ForwardRef$1b, i as ForwardRef$2v, j as ForwardRef$1U, k as ForwardRef$2j, l as ForwardRef$12, m as ForwardRef$2k, n as ForwardRef$2x, o as ForwardRef$2h, p as ForwardRef$v, P as PLUGIN_ID } from "./index-CtyxDZ0S.mjs";
8
8
  var __assign = function() {
9
9
  __assign = Object.assign || function __assign2(t2) {
10
10
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -50971,13 +50971,14 @@ const Input = styled.input`
50971
50971
  const getTranslation = (id) => `${PLUGIN_ID}.${id}`;
50972
50972
  export {
50973
50973
  Alert as A,
50974
- Box as B,
50975
- Field as F,
50974
+ Button as B,
50975
+ Divider as D,
50976
+ Flex as F,
50976
50977
  Loader as L,
50977
50978
  Typography as T,
50978
- Flex as a,
50979
- TextInput as b,
50980
- Button as c,
50979
+ Box as a,
50980
+ Field as b,
50981
+ TextInput as c,
50981
50982
  Badge as d,
50982
50983
  Accordion as e,
50983
50984
  getTranslation as g,
@@ -3,7 +3,7 @@ const React = require("react");
3
3
  const styled = require("styled-components");
4
4
  const jsxRuntime = require("react/jsx-runtime");
5
5
  const ReactDOM = require("react-dom");
6
- const index$1 = require("./index-BiLy_f7C.js");
6
+ const index$1 = require("./index-C_SiBh7v.js");
7
7
  function _interopNamespace(e) {
8
8
  if (e && e.__esModule) return e;
9
9
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
@@ -50992,6 +50992,7 @@ exports.Alert = Alert;
50992
50992
  exports.Badge = Badge;
50993
50993
  exports.Box = Box;
50994
50994
  exports.Button = Button;
50995
+ exports.Divider = Divider;
50995
50996
  exports.Field = Field;
50996
50997
  exports.Flex = Flex;
50997
50998
  exports.Loader = Loader;
@@ -2370,8 +2370,8 @@ const index = {
2370
2370
  name: "richtext",
2371
2371
  pluginId: PLUGIN_ID,
2372
2372
  // Must match server-side plugin name
2373
- type: "text",
2374
- // Data type - stores JSON as text
2373
+ type: "json",
2374
+ // Data type - stores Editor.js JSON content natively
2375
2375
  intlLabel: {
2376
2376
  id: `${PLUGIN_ID}.richtext.label`,
2377
2377
  defaultMessage: "Magic Editor X"
@@ -2384,7 +2384,7 @@ const index = {
2384
2384
  icon: PluginIcon,
2385
2385
  // Input component for Content Manager
2386
2386
  components: {
2387
- Input: async () => Promise.resolve().then(() => require("./index-CQx7-dFP.js")).then((module2) => ({
2387
+ Input: async () => Promise.resolve().then(() => require("./index-DGRg45vZ.js")).then((module2) => ({
2388
2388
  default: module2.default
2389
2389
  }))
2390
2390
  },
@@ -2446,7 +2446,7 @@ const index = {
2446
2446
  defaultMessage: "Magic Editor X"
2447
2447
  },
2448
2448
  // Use lazy import without async wrapper to avoid deprecation warning
2449
- Component: () => Promise.resolve().then(() => require("./App-mtrlABtd.js")),
2449
+ Component: () => Promise.resolve().then(() => require("./App-BHNqY71z.js")),
2450
2450
  permissions: []
2451
2451
  });
2452
2452
  app.createSettingSection(
@@ -2465,7 +2465,7 @@ const index = {
2465
2465
  id: "upgrade",
2466
2466
  // relative path (no leading slash)
2467
2467
  to: `${PLUGIN_ID}/upgrade`,
2468
- Component: () => Promise.resolve().then(() => require("./LicensePage-BnyWSrWs.js"))
2468
+ Component: () => Promise.resolve().then(() => require("./LicensePage-VwKQMnUO.js"))
2469
2469
  },
2470
2470
  {
2471
2471
  intlLabel: {
@@ -2475,7 +2475,7 @@ const index = {
2475
2475
  id: "license",
2476
2476
  // relative path (no leading slash)
2477
2477
  to: `${PLUGIN_ID}/license`,
2478
- Component: () => Promise.resolve().then(() => require("./Settings-Bk9bxJTy.js"))
2478
+ Component: () => Promise.resolve().then(() => require("./Settings-4wUHMbn0.js"))
2479
2479
  }
2480
2480
  ]
2481
2481
  );
@@ -2485,7 +2485,7 @@ const index = {
2485
2485
  * Bootstrap the plugin
2486
2486
  */
2487
2487
  async bootstrap(app) {
2488
- const { default: LiveCollaborationPanel } = await Promise.resolve().then(() => require("./LiveCollaborationPanel-DbDHwr2C.js"));
2488
+ const { default: LiveCollaborationPanel } = await Promise.resolve().then(() => require("./LiveCollaborationPanel-CqtkFWJs.js"));
2489
2489
  try {
2490
2490
  const contentManagerPlugin = app.getPlugin("content-manager");
2491
2491
  if (contentManagerPlugin && contentManagerPlugin.apis) {
@@ -2504,11 +2504,11 @@ const index = {
2504
2504
  const importedTrads = await Promise.all(
2505
2505
  locales.map(async (locale) => {
2506
2506
  try {
2507
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-CzSo1oD2.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-DxIkVPUh.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DAQ_97zx.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-ChPabvNP.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-Cm74LpyZ.js")) }), `./translations/${locale}.json`, 3);
2507
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DVNVpAt9.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-C2hv5GsA.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-BzJqcIST.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-D3GwqAAJ.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CFo0nTbj.js")) }), `./translations/${locale}.json`, 3);
2508
2508
  return { data: prefixPluginTranslations(data, PLUGIN_ID), locale };
2509
2509
  } catch {
2510
2510
  try {
2511
- const { default: data } = await Promise.resolve().then(() => require("./en-DxIkVPUh.js"));
2511
+ const { default: data } = await Promise.resolve().then(() => require("./en-C2hv5GsA.js"));
2512
2512
  return { data: prefixPluginTranslations(data, PLUGIN_ID), locale };
2513
2513
  } catch {
2514
2514
  return { data: {}, locale };
@@ -2369,8 +2369,8 @@ const index = {
2369
2369
  name: "richtext",
2370
2370
  pluginId: PLUGIN_ID,
2371
2371
  // Must match server-side plugin name
2372
- type: "text",
2373
- // Data type - stores JSON as text
2372
+ type: "json",
2373
+ // Data type - stores Editor.js JSON content natively
2374
2374
  intlLabel: {
2375
2375
  id: `${PLUGIN_ID}.richtext.label`,
2376
2376
  defaultMessage: "Magic Editor X"
@@ -2383,7 +2383,7 @@ const index = {
2383
2383
  icon: PluginIcon,
2384
2384
  // Input component for Content Manager
2385
2385
  components: {
2386
- Input: async () => import("./index-BRVqbnOb.mjs").then((module) => ({
2386
+ Input: async () => import("./index-IYdGq7Rl.mjs").then((module) => ({
2387
2387
  default: module.default
2388
2388
  }))
2389
2389
  },
@@ -2445,7 +2445,7 @@ const index = {
2445
2445
  defaultMessage: "Magic Editor X"
2446
2446
  },
2447
2447
  // Use lazy import without async wrapper to avoid deprecation warning
2448
- Component: () => import("./App-B1FgOsWa.mjs"),
2448
+ Component: () => import("./App-LgFoHtyD.mjs"),
2449
2449
  permissions: []
2450
2450
  });
2451
2451
  app.createSettingSection(
@@ -2464,7 +2464,7 @@ const index = {
2464
2464
  id: "upgrade",
2465
2465
  // relative path (no leading slash)
2466
2466
  to: `${PLUGIN_ID}/upgrade`,
2467
- Component: () => import("./LicensePage-CWH-AFR-.mjs")
2467
+ Component: () => import("./LicensePage-oxUnaZmr.mjs")
2468
2468
  },
2469
2469
  {
2470
2470
  intlLabel: {
@@ -2474,7 +2474,7 @@ const index = {
2474
2474
  id: "license",
2475
2475
  // relative path (no leading slash)
2476
2476
  to: `${PLUGIN_ID}/license`,
2477
- Component: () => import("./Settings-D-V2MLVm.mjs")
2477
+ Component: () => import("./Settings-BI9zxX3k.mjs")
2478
2478
  }
2479
2479
  ]
2480
2480
  );
@@ -2484,7 +2484,7 @@ const index = {
2484
2484
  * Bootstrap the plugin
2485
2485
  */
2486
2486
  async bootstrap(app) {
2487
- const { default: LiveCollaborationPanel } = await import("./LiveCollaborationPanel-ryjcDAA7.mjs");
2487
+ const { default: LiveCollaborationPanel } = await import("./LiveCollaborationPanel-elejZRkh.mjs");
2488
2488
  try {
2489
2489
  const contentManagerPlugin = app.getPlugin("content-manager");
2490
2490
  if (contentManagerPlugin && contentManagerPlugin.apis) {
@@ -2503,11 +2503,11 @@ const index = {
2503
2503
  const importedTrads = await Promise.all(
2504
2504
  locales.map(async (locale) => {
2505
2505
  try {
2506
- const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-CSrHZWEb.mjs"), "./translations/en.json": () => import("./en-DuQun2v4.mjs"), "./translations/es.json": () => import("./es-DEB0CA8S.mjs"), "./translations/fr.json": () => import("./fr-Bqkhvdx2.mjs"), "./translations/pt.json": () => import("./pt-BMoYltav.mjs") }), `./translations/${locale}.json`, 3);
2506
+ const { default: data } = await __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-C_0Mj-Zo.mjs"), "./translations/en.json": () => import("./en-B7AAf1ie.mjs"), "./translations/es.json": () => import("./es-zdP8sd-f.mjs"), "./translations/fr.json": () => import("./fr-CtAgOgH1.mjs"), "./translations/pt.json": () => import("./pt-BmUw6YMP.mjs") }), `./translations/${locale}.json`, 3);
2507
2507
  return { data: prefixPluginTranslations(data, PLUGIN_ID), locale };
2508
2508
  } catch {
2509
2509
  try {
2510
- const { default: data } = await import("./en-DuQun2v4.mjs");
2510
+ const { default: data } = await import("./en-B7AAf1ie.mjs");
2511
2511
  return { data: prefixPluginTranslations(data, PLUGIN_ID), locale };
2512
2512
  } catch {
2513
2513
  return { data: {}, locale };