@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 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