magic-editor-x 1.3.5 → 1.3.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.
@@ -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-DB9tlKh9.js");
11
- const tools = require("./tools-3bMqs3Or.js");
12
- const index = require("./index-DO-QpiC9.js");
13
- const LicensePage = require("./LicensePage-BIaCAB4C.js");
10
+ const getTranslation = require("./getTranslation-D21ValYk.js");
11
+ const tools = require("./tools-D4Y_iEui.js");
12
+ const index = require("./index-BnTvuHf2.js");
13
+ const LicensePage = require("./LicensePage-C6TBYCWM.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, a as Box, T as Typography, F as Flex, c as TextInput, B as Button$2 } from "./getTranslation-CZ77ytJY.mjs";
9
- import { g as getTools } from "./tools-CNqrBm-q.mjs";
10
- import { P as PLUGIN_ID } from "./index-BNxjfrVK.mjs";
11
- import LicensePage from "./LicensePage-Cj6-z6rO.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-D2oq0PyC.mjs";
9
+ import { g as getTools } from "./tools-BGR6Cw4p.mjs";
10
+ import { P as PLUGIN_ID } from "./index-tbHD7slZ.mjs";
11
+ import LicensePage from "./LicensePage-zaYXFrKs.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-DB9tlKh9.js");
6
+ const getTranslation = require("./getTranslation-D21ValYk.js");
7
7
  const styled = require("styled-components");
8
- const index = require("./index-DO-QpiC9.js");
8
+ const index = require("./index-BnTvuHf2.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, F as Flex, L as Loader, T as Typography, d as Badge, a as Box, g as getTranslation, B as Button } from "./getTranslation-CZ77ytJY.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-D2oq0PyC.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-BNxjfrVK.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-tbHD7slZ.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-DB9tlKh9.js");
5
+ const getTranslation = require("./getTranslation-D21ValYk.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, F as Flex, g as getTranslation } from "./getTranslation-CZ77ytJY.mjs";
3
+ import { u as useIntl, F as Flex, g as getTranslation } from "./getTranslation-D2oq0PyC.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-DB9tlKh9.js");
5
+ const getTranslation = require("./getTranslation-D21ValYk.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, 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-CZ77ytJY.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-D2oq0PyC.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";
@@ -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-DO-QpiC9.js");
6
+ const index$1 = require("./index-BnTvuHf2.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" } });
@@ -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-BNxjfrVK.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-tbHD7slZ.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++) {
@@ -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-BmWx_nJX.js")).then((module2) => ({
2387
+ Input: async () => Promise.resolve().then(() => require("./index-Czk5HVLJ.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-CWXreQMz.js")),
2449
+ Component: () => Promise.resolve().then(() => require("./App-BrAGe1KP.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-BIaCAB4C.js"))
2468
+ Component: () => Promise.resolve().then(() => require("./LicensePage-C6TBYCWM.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-BsoK7S5l.js"))
2478
+ Component: () => Promise.resolve().then(() => require("./Settings-BH0Ttu_5.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-BmAFvNll.js"));
2488
+ const { default: LiveCollaborationPanel } = await Promise.resolve().then(() => require("./LiveCollaborationPanel-CGt57XG1.js"));
2489
2489
  try {
2490
2490
  const contentManagerPlugin = app.getPlugin("content-manager");
2491
2491
  if (contentManagerPlugin && contentManagerPlugin.apis) {
@@ -1,12 +1,12 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import React__default, { useState, useEffect, useCallback, useRef, useMemo, forwardRef } from "react";
3
- import { u as useIntl, F as Flex, T as Typography, B as Button$2, D as Divider, a as Box, g as getTranslation, b as Field, L as Loader } from "./getTranslation-CZ77ytJY.mjs";
3
+ import { u as useIntl, F as Flex, T as Typography, B as Button$2, D as Divider, a as Box, g as getTranslation, b as Field, L as Loader } from "./getTranslation-D2oq0PyC.mjs";
4
4
  import styled, { createGlobalStyle, css } from "styled-components";
5
5
  import { ClockIcon, ExclamationTriangleIcon, SparklesIcon as SparklesIcon$1, Bars3BottomLeftIcon, ListBulletIcon, CheckCircleIcon, PhotoIcon, LinkIcon, CodeBracketIcon, TableCellsIcon, ChatBubbleBottomCenterTextIcon, MinusIcon, DocumentDuplicateIcon, TrashIcon, ArrowsPointingInIcon, ArrowsPointingOutIcon, EyeIcon, PencilSquareIcon } from "@heroicons/react/24/outline";
6
6
  import EditorJS from "@editorjs/editorjs";
7
- import { M as MagicEditorAPI, t as toastManager, g as getTools, i as initUndoRedo, a as initDragDrop, A as AIToast, b as AIInlineToolbar } from "./tools-CNqrBm-q.mjs";
7
+ import { M as MagicEditorAPI, t as toastManager, g as getTools, i as initUndoRedo, a as initDragDrop, A as AIToast, b as AIInlineToolbar } from "./tools-BGR6Cw4p.mjs";
8
8
  import { useStrapiApp, useFetchClient, useAuth } from "@strapi/strapi/admin";
9
- import { P as PLUGIN_ID } from "./index-BNxjfrVK.mjs";
9
+ import { P as PLUGIN_ID } from "./index-tbHD7slZ.mjs";
10
10
  import { io } from "socket.io-client";
11
11
  import * as Y from "yjs";
12
12
  import { IndexeddbPersistence } from "y-indexeddb";
@@ -2130,22 +2130,24 @@ const EditorJSGlobalStyles = createGlobalStyle`
2130
2130
  z-index: 99999 !important;
2131
2131
  background: white !important;
2132
2132
  border: 1px solid #e2e8f0 !important;
2133
- border-radius: 8px !important;
2134
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12) !important;
2135
- padding: 4px !important;
2133
+ border-radius: 12px !important;
2134
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(0, 0, 0, 0.1) !important;
2135
+ padding: 6px !important;
2136
+ position: absolute !important;
2137
+ transform: translateY(-8px) !important;
2136
2138
  }
2137
2139
 
2138
2140
  .ce-popover--inline .ce-popover__container {
2139
2141
  display: block !important;
2142
+ height: auto !important;
2140
2143
  }
2141
2144
 
2142
2145
  /* Items container - HORIZONTAL layout for inline tools */
2143
2146
  .ce-popover--inline .ce-popover__items {
2144
2147
  display: flex !important;
2145
2148
  flex-direction: row !important;
2146
- flex-wrap: wrap !important;
2147
- align-items: center !important;
2148
- gap: 2px !important;
2149
+ flex-wrap: nowrap !important;
2150
+ gap: 4px !important;
2149
2151
  opacity: 1 !important;
2150
2152
  visibility: visible !important;
2151
2153
  }
@@ -2162,26 +2164,28 @@ const EditorJSGlobalStyles = createGlobalStyle`
2162
2164
  display: flex !important;
2163
2165
  align-items: center !important;
2164
2166
  justify-content: center !important;
2165
- width: 32px !important;
2166
- height: 32px !important;
2167
+ width: 36px !important;
2168
+ height: 36px !important;
2167
2169
  opacity: 1 !important;
2168
2170
  visibility: visible !important;
2169
2171
  background: transparent !important;
2170
2172
  border: none !important;
2171
- border-radius: 6px !important;
2173
+ border-radius: 8px !important;
2172
2174
  cursor: pointer !important;
2173
2175
  color: #64748b !important;
2174
- transition: background 0.15s ease, color 0.15s ease !important;
2176
+ transition: all 0.15s ease !important;
2175
2177
  }
2176
2178
 
2177
2179
  .ce-popover--inline .ce-inline-tool:hover {
2178
2180
  background: #f1f5f9 !important;
2179
2181
  color: #334155 !important;
2182
+ transform: scale(1.05) !important;
2180
2183
  }
2181
2184
 
2182
2185
  .ce-popover--inline .ce-inline-tool--active {
2183
- background: #ede9fe !important;
2186
+ background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%) !important;
2184
2187
  color: #7C3AED !important;
2188
+ font-weight: 600 !important;
2185
2189
  }
2186
2190
 
2187
2191
  .ce-popover--inline .ce-inline-tool svg {
@@ -2189,6 +2193,28 @@ const EditorJSGlobalStyles = createGlobalStyle`
2189
2193
  height: 18px !important;
2190
2194
  }
2191
2195
 
2196
+ /* AI Assistant button in inline toolbar - special styling */
2197
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"] {
2198
+ background: linear-gradient(135deg, #7C3AED 0%, #6d28d9 100%) !important;
2199
+ color: white !important;
2200
+ margin-left: 4px !important;
2201
+ position: relative !important;
2202
+ }
2203
+
2204
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]:hover {
2205
+ background: linear-gradient(135deg, #6d28d9 0%, #5b21b6 100%) !important;
2206
+ color: white !important;
2207
+ box-shadow: 0 4px 12px rgba(124, 58, 237, 0.4) !important;
2208
+ }
2209
+
2210
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]::before {
2211
+ content: '✨';
2212
+ position: absolute;
2213
+ top: -2px;
2214
+ right: -2px;
2215
+ font-size: 12px;
2216
+ }
2217
+
2192
2218
  /* Convert-to button (block type changer) */
2193
2219
  .ce-popover--inline .ce-popover-item[data-item-name="convert-to"] {
2194
2220
  display: flex !important;
@@ -2202,18 +2228,31 @@ const EditorJSGlobalStyles = createGlobalStyle`
2202
2228
  background: #f1f5f9 !important;
2203
2229
  }
2204
2230
 
2205
- /* Separator line between convert-to and inline tools */
2231
+ /* Separator line between tool groups */
2206
2232
  .ce-popover--inline .ce-popover-item-separator {
2207
2233
  width: 1px !important;
2208
- height: 24px !important;
2209
- background: #e2e8f0 !important;
2210
- margin: 0 4px !important;
2234
+ height: 28px !important;
2235
+ background: linear-gradient(180deg, transparent 0%, #e2e8f0 20%, #e2e8f0 80%, transparent 100%) !important;
2236
+ margin: 0 6px !important;
2237
+ flex-shrink: 0 !important;
2211
2238
  }
2212
2239
 
2213
2240
  .ce-popover--inline .ce-popover-item-separator__line {
2214
2241
  display: none !important;
2215
2242
  }
2216
2243
 
2244
+ /* Separator before AI button */
2245
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]::after {
2246
+ content: '';
2247
+ position: absolute;
2248
+ left: -8px;
2249
+ top: 50%;
2250
+ transform: translateY(-50%);
2251
+ width: 1px;
2252
+ height: 28px;
2253
+ background: linear-gradient(180deg, transparent 0%, #c4b5fd 20%, #c4b5fd 80%, transparent 100%);
2254
+ }
2255
+
2217
2256
  /* ============================================
2218
2257
  GLOBAL Z-INDEX FOR ALL EDITOR POPOVERS
2219
2258
  ============================================ */
@@ -2223,10 +2262,73 @@ const EditorJSGlobalStyles = createGlobalStyle`
2223
2262
  .ce-popover--opened,
2224
2263
  .ce-inline-toolbar,
2225
2264
  .ce-settings,
2226
- .ce-conversion-toolbar {
2265
+ .ce-conversion-toolbar,
2266
+ .ce-toolbox {
2227
2267
  z-index: 99999 !important;
2228
2268
  }
2229
2269
 
2270
+ /* ============================================
2271
+ TOOLBOX POPOVER (Plus Button) - CRITICAL FIX
2272
+ Make sure items are visible and properly displayed
2273
+ ============================================ */
2274
+
2275
+ .ce-popover:not(.ce-popover--inline) {
2276
+ display: block !important;
2277
+ visibility: visible !important;
2278
+ opacity: 1 !important;
2279
+ z-index: 99999 !important;
2280
+ }
2281
+
2282
+ .ce-popover--opened {
2283
+ display: block !important;
2284
+ visibility: visible !important;
2285
+ opacity: 1 !important;
2286
+ }
2287
+
2288
+ .ce-popover__container {
2289
+ display: block !important;
2290
+ visibility: visible !important;
2291
+ opacity: 1 !important;
2292
+ }
2293
+
2294
+ .ce-popover__items {
2295
+ display: block !important;
2296
+ visibility: visible !important;
2297
+ opacity: 1 !important;
2298
+ max-height: 400px !important;
2299
+ overflow-y: auto !important;
2300
+ }
2301
+
2302
+ .ce-popover-item {
2303
+ display: flex !important;
2304
+ visibility: visible !important;
2305
+ opacity: 1 !important;
2306
+ }
2307
+
2308
+ .ce-popover-item__icon {
2309
+ display: flex !important;
2310
+ visibility: visible !important;
2311
+ opacity: 1 !important;
2312
+ }
2313
+
2314
+ .ce-popover-item__title {
2315
+ display: block !important;
2316
+ visibility: visible !important;
2317
+ opacity: 1 !important;
2318
+ }
2319
+
2320
+ /* Hide empty/nothing-found message for main toolbox */
2321
+ .ce-popover:not(.ce-popover--inline) .ce-popover__nothing-found-message {
2322
+ display: none !important;
2323
+ }
2324
+
2325
+ /* Make sure search is visible */
2326
+ .ce-popover__search {
2327
+ display: block !important;
2328
+ visibility: visible !important;
2329
+ opacity: 1 !important;
2330
+ }
2331
+
2230
2332
  /* ============================================
2231
2333
  READONLY MODE - Block all editing interactions
2232
2334
  ============================================ */
@@ -2306,11 +2408,29 @@ const EditorJSGlobalStyles = createGlobalStyle`
2306
2408
  /* Inline toolbar */
2307
2409
  .ce-inline-toolbar {
2308
2410
  z-index: 99998 !important;
2411
+ background: white !important;
2412
+ border: 1px solid #e2e8f0 !important;
2413
+ border-radius: 12px !important;
2414
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
2309
2415
  }
2310
2416
 
2311
2417
  /* Conversion toolbar */
2312
2418
  .ce-conversion-toolbar {
2313
2419
  z-index: 99999 !important;
2420
+ padding: 8px !important;
2421
+ display: flex !important;
2422
+ flex-wrap: wrap !important;
2423
+ align-items: center !important;
2424
+ justify-content: center !important;
2425
+ gap: 4px !important;
2426
+ background: white !important;
2427
+ border: 1px solid #e2e8f0 !important;
2428
+ border-radius: 12px !important;
2429
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
2430
+ }
2431
+
2432
+ .ce-conversion-tool {
2433
+ margin: 0 !important;
2314
2434
  }
2315
2435
 
2316
2436
  /* Block tune popovers */
@@ -3146,8 +3266,12 @@ const EditorWrapper = styled.div`
3146
3266
  border-radius: 12px !important;
3147
3267
  }
3148
3268
 
3149
- .ce-popover__items {
3150
- padding: 8px !important;
3269
+ /* Only inline toolbar (text selection) needs overflow visible */
3270
+ .ce-inline-toolbar,
3271
+ .ce-inline-toolbar .ce-popover,
3272
+ .ce-inline-toolbar .ce-popover__container,
3273
+ .ce-inline-toolbar .ce-popover__items {
3274
+ overflow: visible !important;
3151
3275
  }
3152
3276
 
3153
3277
  .ce-popover-item {
@@ -2,13 +2,13 @@
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-DB9tlKh9.js");
5
+ const getTranslation = require("./getTranslation-D21ValYk.js");
6
6
  const styled = require("styled-components");
7
7
  const outline = require("@heroicons/react/24/outline");
8
8
  const EditorJS = require("@editorjs/editorjs");
9
- const tools = require("./tools-3bMqs3Or.js");
9
+ const tools = require("./tools-D4Y_iEui.js");
10
10
  const admin = require("@strapi/strapi/admin");
11
- const index = require("./index-DO-QpiC9.js");
11
+ const index = require("./index-BnTvuHf2.js");
12
12
  const socket_ioClient = require("socket.io-client");
13
13
  const Y = require("yjs");
14
14
  const yIndexeddb = require("y-indexeddb");
@@ -2154,22 +2154,24 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2154
2154
  z-index: 99999 !important;
2155
2155
  background: white !important;
2156
2156
  border: 1px solid #e2e8f0 !important;
2157
- border-radius: 8px !important;
2158
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12) !important;
2159
- padding: 4px !important;
2157
+ border-radius: 12px !important;
2158
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15), 0 2px 8px rgba(0, 0, 0, 0.1) !important;
2159
+ padding: 6px !important;
2160
+ position: absolute !important;
2161
+ transform: translateY(-8px) !important;
2160
2162
  }
2161
2163
 
2162
2164
  .ce-popover--inline .ce-popover__container {
2163
2165
  display: block !important;
2166
+ height: auto !important;
2164
2167
  }
2165
2168
 
2166
2169
  /* Items container - HORIZONTAL layout for inline tools */
2167
2170
  .ce-popover--inline .ce-popover__items {
2168
2171
  display: flex !important;
2169
2172
  flex-direction: row !important;
2170
- flex-wrap: wrap !important;
2171
- align-items: center !important;
2172
- gap: 2px !important;
2173
+ flex-wrap: nowrap !important;
2174
+ gap: 4px !important;
2173
2175
  opacity: 1 !important;
2174
2176
  visibility: visible !important;
2175
2177
  }
@@ -2186,26 +2188,28 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2186
2188
  display: flex !important;
2187
2189
  align-items: center !important;
2188
2190
  justify-content: center !important;
2189
- width: 32px !important;
2190
- height: 32px !important;
2191
+ width: 36px !important;
2192
+ height: 36px !important;
2191
2193
  opacity: 1 !important;
2192
2194
  visibility: visible !important;
2193
2195
  background: transparent !important;
2194
2196
  border: none !important;
2195
- border-radius: 6px !important;
2197
+ border-radius: 8px !important;
2196
2198
  cursor: pointer !important;
2197
2199
  color: #64748b !important;
2198
- transition: background 0.15s ease, color 0.15s ease !important;
2200
+ transition: all 0.15s ease !important;
2199
2201
  }
2200
2202
 
2201
2203
  .ce-popover--inline .ce-inline-tool:hover {
2202
2204
  background: #f1f5f9 !important;
2203
2205
  color: #334155 !important;
2206
+ transform: scale(1.05) !important;
2204
2207
  }
2205
2208
 
2206
2209
  .ce-popover--inline .ce-inline-tool--active {
2207
- background: #ede9fe !important;
2210
+ background: linear-gradient(135deg, #ede9fe 0%, #ddd6fe 100%) !important;
2208
2211
  color: #7C3AED !important;
2212
+ font-weight: 600 !important;
2209
2213
  }
2210
2214
 
2211
2215
  .ce-popover--inline .ce-inline-tool svg {
@@ -2213,6 +2217,28 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2213
2217
  height: 18px !important;
2214
2218
  }
2215
2219
 
2220
+ /* AI Assistant button in inline toolbar - special styling */
2221
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"] {
2222
+ background: linear-gradient(135deg, #7C3AED 0%, #6d28d9 100%) !important;
2223
+ color: white !important;
2224
+ margin-left: 4px !important;
2225
+ position: relative !important;
2226
+ }
2227
+
2228
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]:hover {
2229
+ background: linear-gradient(135deg, #6d28d9 0%, #5b21b6 100%) !important;
2230
+ color: white !important;
2231
+ box-shadow: 0 4px 12px rgba(124, 58, 237, 0.4) !important;
2232
+ }
2233
+
2234
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]::before {
2235
+ content: '✨';
2236
+ position: absolute;
2237
+ top: -2px;
2238
+ right: -2px;
2239
+ font-size: 12px;
2240
+ }
2241
+
2216
2242
  /* Convert-to button (block type changer) */
2217
2243
  .ce-popover--inline .ce-popover-item[data-item-name="convert-to"] {
2218
2244
  display: flex !important;
@@ -2226,18 +2252,31 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2226
2252
  background: #f1f5f9 !important;
2227
2253
  }
2228
2254
 
2229
- /* Separator line between convert-to and inline tools */
2255
+ /* Separator line between tool groups */
2230
2256
  .ce-popover--inline .ce-popover-item-separator {
2231
2257
  width: 1px !important;
2232
- height: 24px !important;
2233
- background: #e2e8f0 !important;
2234
- margin: 0 4px !important;
2258
+ height: 28px !important;
2259
+ background: linear-gradient(180deg, transparent 0%, #e2e8f0 20%, #e2e8f0 80%, transparent 100%) !important;
2260
+ margin: 0 6px !important;
2261
+ flex-shrink: 0 !important;
2235
2262
  }
2236
2263
 
2237
2264
  .ce-popover--inline .ce-popover-item-separator__line {
2238
2265
  display: none !important;
2239
2266
  }
2240
2267
 
2268
+ /* Separator before AI button */
2269
+ .ce-popover--inline .ce-inline-tool[data-tool="aiAssistant"]::after {
2270
+ content: '';
2271
+ position: absolute;
2272
+ left: -8px;
2273
+ top: 50%;
2274
+ transform: translateY(-50%);
2275
+ width: 1px;
2276
+ height: 28px;
2277
+ background: linear-gradient(180deg, transparent 0%, #c4b5fd 20%, #c4b5fd 80%, transparent 100%);
2278
+ }
2279
+
2241
2280
  /* ============================================
2242
2281
  GLOBAL Z-INDEX FOR ALL EDITOR POPOVERS
2243
2282
  ============================================ */
@@ -2247,10 +2286,73 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2247
2286
  .ce-popover--opened,
2248
2287
  .ce-inline-toolbar,
2249
2288
  .ce-settings,
2250
- .ce-conversion-toolbar {
2289
+ .ce-conversion-toolbar,
2290
+ .ce-toolbox {
2251
2291
  z-index: 99999 !important;
2252
2292
  }
2253
2293
 
2294
+ /* ============================================
2295
+ TOOLBOX POPOVER (Plus Button) - CRITICAL FIX
2296
+ Make sure items are visible and properly displayed
2297
+ ============================================ */
2298
+
2299
+ .ce-popover:not(.ce-popover--inline) {
2300
+ display: block !important;
2301
+ visibility: visible !important;
2302
+ opacity: 1 !important;
2303
+ z-index: 99999 !important;
2304
+ }
2305
+
2306
+ .ce-popover--opened {
2307
+ display: block !important;
2308
+ visibility: visible !important;
2309
+ opacity: 1 !important;
2310
+ }
2311
+
2312
+ .ce-popover__container {
2313
+ display: block !important;
2314
+ visibility: visible !important;
2315
+ opacity: 1 !important;
2316
+ }
2317
+
2318
+ .ce-popover__items {
2319
+ display: block !important;
2320
+ visibility: visible !important;
2321
+ opacity: 1 !important;
2322
+ max-height: 400px !important;
2323
+ overflow-y: auto !important;
2324
+ }
2325
+
2326
+ .ce-popover-item {
2327
+ display: flex !important;
2328
+ visibility: visible !important;
2329
+ opacity: 1 !important;
2330
+ }
2331
+
2332
+ .ce-popover-item__icon {
2333
+ display: flex !important;
2334
+ visibility: visible !important;
2335
+ opacity: 1 !important;
2336
+ }
2337
+
2338
+ .ce-popover-item__title {
2339
+ display: block !important;
2340
+ visibility: visible !important;
2341
+ opacity: 1 !important;
2342
+ }
2343
+
2344
+ /* Hide empty/nothing-found message for main toolbox */
2345
+ .ce-popover:not(.ce-popover--inline) .ce-popover__nothing-found-message {
2346
+ display: none !important;
2347
+ }
2348
+
2349
+ /* Make sure search is visible */
2350
+ .ce-popover__search {
2351
+ display: block !important;
2352
+ visibility: visible !important;
2353
+ opacity: 1 !important;
2354
+ }
2355
+
2254
2356
  /* ============================================
2255
2357
  READONLY MODE - Block all editing interactions
2256
2358
  ============================================ */
@@ -2330,11 +2432,29 @@ const EditorJSGlobalStyles = styled.createGlobalStyle`
2330
2432
  /* Inline toolbar */
2331
2433
  .ce-inline-toolbar {
2332
2434
  z-index: 99998 !important;
2435
+ background: white !important;
2436
+ border: 1px solid #e2e8f0 !important;
2437
+ border-radius: 12px !important;
2438
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
2333
2439
  }
2334
2440
 
2335
2441
  /* Conversion toolbar */
2336
2442
  .ce-conversion-toolbar {
2337
2443
  z-index: 99999 !important;
2444
+ padding: 8px !important;
2445
+ display: flex !important;
2446
+ flex-wrap: wrap !important;
2447
+ align-items: center !important;
2448
+ justify-content: center !important;
2449
+ gap: 4px !important;
2450
+ background: white !important;
2451
+ border: 1px solid #e2e8f0 !important;
2452
+ border-radius: 12px !important;
2453
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15) !important;
2454
+ }
2455
+
2456
+ .ce-conversion-tool {
2457
+ margin: 0 !important;
2338
2458
  }
2339
2459
 
2340
2460
  /* Block tune popovers */
@@ -3170,8 +3290,12 @@ const EditorWrapper = styled__default.default.div`
3170
3290
  border-radius: 12px !important;
3171
3291
  }
3172
3292
 
3173
- .ce-popover__items {
3174
- padding: 8px !important;
3293
+ /* Only inline toolbar (text selection) needs overflow visible */
3294
+ .ce-inline-toolbar,
3295
+ .ce-inline-toolbar .ce-popover,
3296
+ .ce-inline-toolbar .ce-popover__container,
3297
+ .ce-inline-toolbar .ce-popover__items {
3298
+ overflow: visible !important;
3175
3299
  }
3176
3300
 
3177
3301
  .ce-popover-item {
@@ -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-Byp_IaHi.mjs").then((module) => ({
2386
+ Input: async () => import("./index-CUTx2oym.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-Czke2os9.mjs"),
2448
+ Component: () => import("./App-SlDn2xdO.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-Cj6-z6rO.mjs")
2467
+ Component: () => import("./LicensePage-zaYXFrKs.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-CsaF0hO7.mjs")
2477
+ Component: () => import("./Settings-BXoP5tm9.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-D11eAcKk.mjs");
2487
+ const { default: LiveCollaborationPanel } = await import("./LiveCollaborationPanel-yNC8e1Qb.mjs");
2488
2488
  try {
2489
2489
  const contentManagerPlugin = app.getPlugin("content-manager");
2490
2490
  if (contentManagerPlugin && contentManagerPlugin.apis) {
@@ -398,14 +398,15 @@ class HyperlinkTool {
398
398
  this.popup = document.createElement("div");
399
399
  this.popup.classList.add("ce-inline-tool-hyperlink-popup");
400
400
  this.popup.style.cssText = `
401
- position: absolute;
401
+ position: fixed;
402
402
  background: white;
403
403
  border: 1px solid #e2e8f0;
404
- border-radius: 8px;
405
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
406
- padding: 12px;
404
+ border-radius: 12px;
405
+ box-shadow: 0 8px 32px rgba(0,0,0,0.15);
406
+ padding: 16px;
407
407
  z-index: 999999;
408
- min-width: 300px;
408
+ min-width: 360px;
409
+ max-width: 420px;
409
410
  `;
410
411
  const urlContainer = this._createInputContainer("URL", "url", parentAnchor?.href || "");
411
412
  const targetContainer = this._createSelectContainer(
@@ -585,23 +586,15 @@ class HyperlinkTool {
585
586
  return container;
586
587
  }
587
588
  /**
588
- * Positions the popup near the selection
589
+ * Positions the popup centered on screen
589
590
  */
590
591
  _positionPopup() {
591
592
  if (!this.popup) return;
592
- const selection = window.getSelection();
593
- if (!selection.rangeCount) return;
594
- const range = selection.getRangeAt(0);
595
- const rect = range.getBoundingClientRect();
596
593
  const popupRect = this.popup.getBoundingClientRect();
597
- let left = rect.left + rect.width / 2 - popupRect.width / 2;
598
- let top = rect.bottom + 10 + window.scrollY;
599
- if (left < 10) left = 10;
600
- if (left + popupRect.width > window.innerWidth - 10) {
601
- left = window.innerWidth - popupRect.width - 10;
602
- }
603
- this.popup.style.left = `${left}px`;
604
- this.popup.style.top = `${top}px`;
594
+ const left = (window.innerWidth - popupRect.width) / 2;
595
+ const top = (window.innerHeight - popupRect.height) / 2;
596
+ this.popup.style.left = `${Math.max(10, left)}px`;
597
+ this.popup.style.top = `${Math.max(10, top)}px`;
605
598
  }
606
599
  /**
607
600
  * Saves the link with user-entered values
@@ -1423,6 +1416,9 @@ class AIAssistantTool {
1423
1416
  toastManager.error("Keine Lizenz verfügbar");
1424
1417
  return;
1425
1418
  }
1419
+ if (this.api.inlineToolbar) {
1420
+ this.api.inlineToolbar.close();
1421
+ }
1426
1422
  const selection = window.getSelection();
1427
1423
  if (!selection.rangeCount) return;
1428
1424
  const rect = selection.getRangeAt(0).getBoundingClientRect();
@@ -431,14 +431,15 @@ class HyperlinkTool {
431
431
  this.popup = document.createElement("div");
432
432
  this.popup.classList.add("ce-inline-tool-hyperlink-popup");
433
433
  this.popup.style.cssText = `
434
- position: absolute;
434
+ position: fixed;
435
435
  background: white;
436
436
  border: 1px solid #e2e8f0;
437
- border-radius: 8px;
438
- box-shadow: 0 4px 12px rgba(0,0,0,0.15);
439
- padding: 12px;
437
+ border-radius: 12px;
438
+ box-shadow: 0 8px 32px rgba(0,0,0,0.15);
439
+ padding: 16px;
440
440
  z-index: 999999;
441
- min-width: 300px;
441
+ min-width: 360px;
442
+ max-width: 420px;
442
443
  `;
443
444
  const urlContainer = this._createInputContainer("URL", "url", parentAnchor?.href || "");
444
445
  const targetContainer = this._createSelectContainer(
@@ -618,23 +619,15 @@ class HyperlinkTool {
618
619
  return container;
619
620
  }
620
621
  /**
621
- * Positions the popup near the selection
622
+ * Positions the popup centered on screen
622
623
  */
623
624
  _positionPopup() {
624
625
  if (!this.popup) return;
625
- const selection = window.getSelection();
626
- if (!selection.rangeCount) return;
627
- const range = selection.getRangeAt(0);
628
- const rect = range.getBoundingClientRect();
629
626
  const popupRect = this.popup.getBoundingClientRect();
630
- let left = rect.left + rect.width / 2 - popupRect.width / 2;
631
- let top = rect.bottom + 10 + window.scrollY;
632
- if (left < 10) left = 10;
633
- if (left + popupRect.width > window.innerWidth - 10) {
634
- left = window.innerWidth - popupRect.width - 10;
635
- }
636
- this.popup.style.left = `${left}px`;
637
- this.popup.style.top = `${top}px`;
627
+ const left = (window.innerWidth - popupRect.width) / 2;
628
+ const top = (window.innerHeight - popupRect.height) / 2;
629
+ this.popup.style.left = `${Math.max(10, left)}px`;
630
+ this.popup.style.top = `${Math.max(10, top)}px`;
638
631
  }
639
632
  /**
640
633
  * Saves the link with user-entered values
@@ -1456,6 +1449,9 @@ class AIAssistantTool {
1456
1449
  toastManager.error("Keine Lizenz verfügbar");
1457
1450
  return;
1458
1451
  }
1452
+ if (this.api.inlineToolbar) {
1453
+ this.api.inlineToolbar.close();
1454
+ }
1459
1455
  const selection = window.getSelection();
1460
1456
  if (!selection.rangeCount) return;
1461
1457
  const rect = selection.getRangeAt(0).getBoundingClientRect();
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
- const index = require("../_chunks/index-DO-QpiC9.js");
2
+ const index = require("../_chunks/index-BnTvuHf2.js");
3
3
  module.exports = index.index;
@@ -1,4 +1,4 @@
1
- import { q } from "../_chunks/index-BNxjfrVK.mjs";
1
+ import { q } from "../_chunks/index-tbHD7slZ.mjs";
2
2
  export {
3
3
  q as default
4
4
  };
@@ -37941,7 +37941,7 @@ var snapshotService$1 = ({ strapi: strapi2 }) => {
37941
37941
  };
37942
37942
  };
37943
37943
  const name = "magic-editor-x";
37944
- const version = "1.3.4";
37944
+ const version = "1.3.6";
37945
37945
  const description = "Advanced block-based editor for Strapi v5 with Editor.js, Media Library integration, and real-time collaboration support";
37946
37946
  const keywords = [
37947
37947
  "strapi",
@@ -37922,7 +37922,7 @@ var snapshotService$1 = ({ strapi: strapi2 }) => {
37922
37922
  };
37923
37923
  };
37924
37924
  const name = "magic-editor-x";
37925
- const version = "1.3.4";
37925
+ const version = "1.3.6";
37926
37926
  const description = "Advanced block-based editor for Strapi v5 with Editor.js, Media Library integration, and real-time collaboration support";
37927
37927
  const keywords = [
37928
37928
  "strapi",
package/dist/style.css CHANGED
@@ -38,6 +38,14 @@
38
38
  display: none !important;
39
39
  }
40
40
 
41
+ /* CRITICAL: Allow inline toolbar (text selection) to overflow */
42
+ .ce-inline-toolbar,
43
+ .ce-inline-toolbar .ce-popover,
44
+ .ce-inline-toolbar .ce-popover__container,
45
+ .ce-inline-toolbar .ce-popover__items {
46
+ overflow: visible !important;
47
+ }
48
+
41
49
  .ce-popover__search {
42
50
  background: transparent !important;
43
51
  border: none !important;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magic-editor-x",
3
- "version": "1.3.5",
3
+ "version": "1.3.7",
4
4
  "description": "Advanced block-based editor for Strapi v5 with Editor.js, Media Library integration, and real-time collaboration support",
5
5
  "keywords": [
6
6
  "strapi",