@blockslides/react 0.2.1 → 0.3.1
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.cjs +223 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +81 -10
- package/dist/index.d.ts +81 -10
- package/dist/index.js +223 -3
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
- package/src/SlideEditor.tsx +73 -0
- package/src/index.ts +2 -0
- package/src/menus/BubbleMenuPreset.tsx +4 -5
- package/src/useSlideEditor.ts +250 -0
package/dist/index.cjs
CHANGED
|
@@ -48,10 +48,12 @@ __export(index_exports, {
|
|
|
48
48
|
ReactNodeViewContext: () => ReactNodeViewContext,
|
|
49
49
|
ReactNodeViewRenderer: () => ReactNodeViewRenderer,
|
|
50
50
|
ReactRenderer: () => ReactRenderer,
|
|
51
|
+
ReactSlideEditor: () => SlideEditor,
|
|
51
52
|
useCurrentEditor: () => useCurrentEditor,
|
|
52
53
|
useEditor: () => useEditor,
|
|
53
54
|
useEditorState: () => useEditorState,
|
|
54
|
-
useReactNodeView: () => useReactNodeView
|
|
55
|
+
useReactNodeView: () => useReactNodeView,
|
|
56
|
+
useSlideEditor: () => useSlideEditor
|
|
55
57
|
});
|
|
56
58
|
module.exports = __toCommonJS(index_exports);
|
|
57
59
|
|
|
@@ -1072,6 +1074,9 @@ function ReactNodeViewRenderer(component, options) {
|
|
|
1072
1074
|
};
|
|
1073
1075
|
}
|
|
1074
1076
|
|
|
1077
|
+
// src/SlideEditor.tsx
|
|
1078
|
+
var import_react13 = require("react");
|
|
1079
|
+
|
|
1075
1080
|
// src/menus/BubbleMenuPreset.tsx
|
|
1076
1081
|
var import_react11 = __toESM(require("react"), 1);
|
|
1077
1082
|
var import_react_dom3 = require("react-dom");
|
|
@@ -1082,7 +1087,6 @@ var import_core4 = require("@blockslides/core");
|
|
|
1082
1087
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
1083
1088
|
var BubbleMenuPreset = import_react11.default.forwardRef(
|
|
1084
1089
|
({
|
|
1085
|
-
pluginKey = "bubbleMenuPreset",
|
|
1086
1090
|
editor,
|
|
1087
1091
|
updateDelay,
|
|
1088
1092
|
resizeDelay,
|
|
@@ -1102,6 +1106,7 @@ var BubbleMenuPreset = import_react11.default.forwardRef(
|
|
|
1102
1106
|
onImageReplace,
|
|
1103
1107
|
...rest
|
|
1104
1108
|
}, ref) => {
|
|
1109
|
+
const pluginKey = "bubbleMenuPreset";
|
|
1105
1110
|
const { editor: currentEditor } = useCurrentEditor();
|
|
1106
1111
|
const menuEl = (0, import_react11.useRef)(null);
|
|
1107
1112
|
(0, import_react11.useEffect)(() => {
|
|
@@ -1161,7 +1166,6 @@ var BubbleMenuPreset = import_react11.default.forwardRef(
|
|
|
1161
1166
|
}, [
|
|
1162
1167
|
editor,
|
|
1163
1168
|
currentEditor,
|
|
1164
|
-
pluginKey,
|
|
1165
1169
|
updateDelay,
|
|
1166
1170
|
resizeDelay,
|
|
1167
1171
|
appendTo,
|
|
@@ -1185,6 +1189,220 @@ var BubbleMenuPreset = import_react11.default.forwardRef(
|
|
|
1185
1189
|
);
|
|
1186
1190
|
BubbleMenuPreset.displayName = "BubbleMenuPreset";
|
|
1187
1191
|
|
|
1192
|
+
// src/useSlideEditor.ts
|
|
1193
|
+
var import_react12 = require("react");
|
|
1194
|
+
var import_ai_context = require("@blockslides/ai-context");
|
|
1195
|
+
var import_extension_kit = require("@blockslides/extension-kit");
|
|
1196
|
+
var defaultSlide = () => ({
|
|
1197
|
+
/**
|
|
1198
|
+
* Placeholder slide if no content is provided.
|
|
1199
|
+
*/
|
|
1200
|
+
type: "doc",
|
|
1201
|
+
content: [
|
|
1202
|
+
{
|
|
1203
|
+
type: "slide",
|
|
1204
|
+
attrs: {
|
|
1205
|
+
size: "16x9",
|
|
1206
|
+
className: "",
|
|
1207
|
+
id: "slide-1",
|
|
1208
|
+
backgroundMode: "none",
|
|
1209
|
+
backgroundColor: null,
|
|
1210
|
+
backgroundImage: null,
|
|
1211
|
+
backgroundOverlayColor: null,
|
|
1212
|
+
backgroundOverlayOpacity: null
|
|
1213
|
+
},
|
|
1214
|
+
content: [
|
|
1215
|
+
{
|
|
1216
|
+
type: "column",
|
|
1217
|
+
attrs: {
|
|
1218
|
+
align: "center",
|
|
1219
|
+
padding: "lg",
|
|
1220
|
+
margin: null,
|
|
1221
|
+
gap: "md",
|
|
1222
|
+
backgroundColor: "#ffffff",
|
|
1223
|
+
backgroundImage: null,
|
|
1224
|
+
borderRadius: null,
|
|
1225
|
+
border: null,
|
|
1226
|
+
fill: true,
|
|
1227
|
+
width: null,
|
|
1228
|
+
height: null,
|
|
1229
|
+
justify: "center"
|
|
1230
|
+
},
|
|
1231
|
+
content: [
|
|
1232
|
+
{
|
|
1233
|
+
type: "heading",
|
|
1234
|
+
attrs: {
|
|
1235
|
+
align: null,
|
|
1236
|
+
padding: null,
|
|
1237
|
+
margin: null,
|
|
1238
|
+
gap: null,
|
|
1239
|
+
backgroundColor: null,
|
|
1240
|
+
backgroundImage: null,
|
|
1241
|
+
borderRadius: null,
|
|
1242
|
+
border: null,
|
|
1243
|
+
fill: null,
|
|
1244
|
+
width: null,
|
|
1245
|
+
height: null,
|
|
1246
|
+
justify: null,
|
|
1247
|
+
id: "1fc4664c-333d-4203-a3f1-3ad27a54c535",
|
|
1248
|
+
"data-toc-id": "1fc4664c-333d-4203-a3f1-3ad27a54c535",
|
|
1249
|
+
level: 1
|
|
1250
|
+
},
|
|
1251
|
+
content: [
|
|
1252
|
+
{
|
|
1253
|
+
type: "text",
|
|
1254
|
+
text: "Lorem ipsum dolor sit amet"
|
|
1255
|
+
}
|
|
1256
|
+
]
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
type: "paragraph",
|
|
1260
|
+
attrs: {
|
|
1261
|
+
align: null,
|
|
1262
|
+
padding: null,
|
|
1263
|
+
margin: null,
|
|
1264
|
+
gap: null,
|
|
1265
|
+
backgroundColor: null,
|
|
1266
|
+
backgroundImage: null,
|
|
1267
|
+
borderRadius: null,
|
|
1268
|
+
border: null,
|
|
1269
|
+
fill: null,
|
|
1270
|
+
width: null,
|
|
1271
|
+
height: null,
|
|
1272
|
+
justify: null
|
|
1273
|
+
},
|
|
1274
|
+
content: [
|
|
1275
|
+
{
|
|
1276
|
+
type: "text",
|
|
1277
|
+
text: "Consectetur adipiscing elit. Sed do eiusmod tempor incididunt. "
|
|
1278
|
+
}
|
|
1279
|
+
]
|
|
1280
|
+
}
|
|
1281
|
+
]
|
|
1282
|
+
}
|
|
1283
|
+
]
|
|
1284
|
+
}
|
|
1285
|
+
]
|
|
1286
|
+
});
|
|
1287
|
+
var defaultAddSlideButton = (presets) => ({
|
|
1288
|
+
showPresets: true,
|
|
1289
|
+
presets,
|
|
1290
|
+
presetBackground: "#0f172a",
|
|
1291
|
+
presetForeground: "#e5e7eb"
|
|
1292
|
+
});
|
|
1293
|
+
var defaultSlideOptions = {
|
|
1294
|
+
renderMode: "dynamic",
|
|
1295
|
+
hoverOutline: { color: "#3b82f6", width: "1.5px", offset: "4px" },
|
|
1296
|
+
hoverOutlineCascade: false
|
|
1297
|
+
};
|
|
1298
|
+
var useSlideEditor = ({
|
|
1299
|
+
content,
|
|
1300
|
+
onChange,
|
|
1301
|
+
extensions,
|
|
1302
|
+
extensionKitOptions,
|
|
1303
|
+
presetTemplates,
|
|
1304
|
+
deps = [],
|
|
1305
|
+
onEditorReady,
|
|
1306
|
+
immediatelyRender = false,
|
|
1307
|
+
shouldRerenderOnTransaction = false,
|
|
1308
|
+
theme = "light",
|
|
1309
|
+
editorProps,
|
|
1310
|
+
onUpdate,
|
|
1311
|
+
...editorOptions
|
|
1312
|
+
} = {}) => {
|
|
1313
|
+
var _a;
|
|
1314
|
+
const presets = (0, import_react12.useMemo)(
|
|
1315
|
+
() => presetTemplates != null ? presetTemplates : import_ai_context.templatesV1.listPresetTemplates(),
|
|
1316
|
+
[presetTemplates]
|
|
1317
|
+
);
|
|
1318
|
+
const mergedExtensionKitOptions = (0, import_react12.useMemo)(() => {
|
|
1319
|
+
var _a2, _b;
|
|
1320
|
+
const addSlideButton = (extensionKitOptions == null ? void 0 : extensionKitOptions.addSlideButton) === false ? false : {
|
|
1321
|
+
...defaultAddSlideButton(presets),
|
|
1322
|
+
...(_a2 = extensionKitOptions == null ? void 0 : extensionKitOptions.addSlideButton) != null ? _a2 : {}
|
|
1323
|
+
};
|
|
1324
|
+
const slide = (extensionKitOptions == null ? void 0 : extensionKitOptions.slide) === false ? false : {
|
|
1325
|
+
...defaultSlideOptions,
|
|
1326
|
+
...(_b = extensionKitOptions == null ? void 0 : extensionKitOptions.slide) != null ? _b : {}
|
|
1327
|
+
};
|
|
1328
|
+
return {
|
|
1329
|
+
...extensionKitOptions,
|
|
1330
|
+
addSlideButton,
|
|
1331
|
+
slide
|
|
1332
|
+
};
|
|
1333
|
+
}, [extensionKitOptions, presets]);
|
|
1334
|
+
const resolvedExtensions = (0, import_react12.useMemo)(() => {
|
|
1335
|
+
const kit = import_extension_kit.ExtensionKit.configure(mergedExtensionKitOptions);
|
|
1336
|
+
return extensions ? [kit, ...extensions] : [kit];
|
|
1337
|
+
}, [extensions, mergedExtensionKitOptions]);
|
|
1338
|
+
const initialContent = content != null ? content : defaultSlide();
|
|
1339
|
+
const editor = useEditor(
|
|
1340
|
+
{
|
|
1341
|
+
content: initialContent,
|
|
1342
|
+
extensions: resolvedExtensions,
|
|
1343
|
+
immediatelyRender,
|
|
1344
|
+
shouldRerenderOnTransaction,
|
|
1345
|
+
theme,
|
|
1346
|
+
editorProps: {
|
|
1347
|
+
attributes: {
|
|
1348
|
+
autocomplete: "off",
|
|
1349
|
+
autocorrect: "off",
|
|
1350
|
+
autocapitalize: "off",
|
|
1351
|
+
class: "min-h-full min-w-full",
|
|
1352
|
+
...(_a = editorProps == null ? void 0 : editorProps.attributes) != null ? _a : {}
|
|
1353
|
+
},
|
|
1354
|
+
...editorProps
|
|
1355
|
+
},
|
|
1356
|
+
...editorOptions,
|
|
1357
|
+
onUpdate: (ctx) => {
|
|
1358
|
+
const json = ctx.editor.getJSON();
|
|
1359
|
+
onChange == null ? void 0 : onChange(json, ctx.editor);
|
|
1360
|
+
onUpdate == null ? void 0 : onUpdate(ctx);
|
|
1361
|
+
}
|
|
1362
|
+
},
|
|
1363
|
+
deps
|
|
1364
|
+
);
|
|
1365
|
+
(0, import_react12.useEffect)(() => {
|
|
1366
|
+
if (editor && !editor.isDestroyed) {
|
|
1367
|
+
onEditorReady == null ? void 0 : onEditorReady(editor);
|
|
1368
|
+
}
|
|
1369
|
+
}, [editor, onEditorReady]);
|
|
1370
|
+
return { editor, presets };
|
|
1371
|
+
};
|
|
1372
|
+
|
|
1373
|
+
// src/SlideEditor.tsx
|
|
1374
|
+
var import_jsx_runtime9 = require("react/jsx-runtime");
|
|
1375
|
+
var SlideEditor = (0, import_react13.forwardRef)(
|
|
1376
|
+
({
|
|
1377
|
+
bubbleMenuPreset = true,
|
|
1378
|
+
editorContentProps,
|
|
1379
|
+
viewportScale = 1,
|
|
1380
|
+
className,
|
|
1381
|
+
style,
|
|
1382
|
+
...hookProps
|
|
1383
|
+
}, ref) => {
|
|
1384
|
+
const { editor } = useSlideEditor(hookProps);
|
|
1385
|
+
const bubbleMenuProps = (0, import_react13.useMemo)(() => {
|
|
1386
|
+
if (bubbleMenuPreset === false) return null;
|
|
1387
|
+
if (bubbleMenuPreset === true) return {};
|
|
1388
|
+
return bubbleMenuPreset;
|
|
1389
|
+
}, [bubbleMenuPreset]);
|
|
1390
|
+
if (!editor) return null;
|
|
1391
|
+
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { ref, className, style, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
|
|
1392
|
+
"div",
|
|
1393
|
+
{
|
|
1394
|
+
className: "bs-viewport",
|
|
1395
|
+
style: { ["--zoom"]: viewportScale },
|
|
1396
|
+
children: [
|
|
1397
|
+
/* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EditorContent, { editor, ...editorContentProps }),
|
|
1398
|
+
bubbleMenuProps && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(BubbleMenuPreset, { editor, ...bubbleMenuProps })
|
|
1399
|
+
]
|
|
1400
|
+
}
|
|
1401
|
+
) });
|
|
1402
|
+
}
|
|
1403
|
+
);
|
|
1404
|
+
SlideEditor.displayName = "SlideEditor";
|
|
1405
|
+
|
|
1188
1406
|
// src/index.ts
|
|
1189
1407
|
__reExport(index_exports, require("@blockslides/core"), module.exports);
|
|
1190
1408
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1206,10 +1424,12 @@ __reExport(index_exports, require("@blockslides/core"), module.exports);
|
|
|
1206
1424
|
ReactNodeViewContext,
|
|
1207
1425
|
ReactNodeViewRenderer,
|
|
1208
1426
|
ReactRenderer,
|
|
1427
|
+
ReactSlideEditor,
|
|
1209
1428
|
useCurrentEditor,
|
|
1210
1429
|
useEditor,
|
|
1211
1430
|
useEditorState,
|
|
1212
1431
|
useReactNodeView,
|
|
1432
|
+
useSlideEditor,
|
|
1213
1433
|
...require("@blockslides/core")
|
|
1214
1434
|
});
|
|
1215
1435
|
//# sourceMappingURL=index.cjs.map
|