@it-consultis/page-builder 1.1.34

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 (124) hide show
  1. package/Editor.d.ts +77 -0
  2. package/Editor.js +312 -0
  3. package/LICENSE.txt +674 -0
  4. package/README.md +248 -0
  5. package/assets/svg/mp.d.ts +2 -0
  6. package/assets/svg/mp.js +37 -0
  7. package/assets/svg/status-bar.d.ts +2 -0
  8. package/assets/svg/status-bar.js +38 -0
  9. package/constants/index.d.ts +11 -0
  10. package/constants/index.js +17 -0
  11. package/contexts/I18nContext.d.ts +15 -0
  12. package/contexts/I18nContext.js +56 -0
  13. package/controls/AlignmentControl/AlignmentControl.d.ts +5 -0
  14. package/controls/AlignmentControl/AlignmentControl.js +58 -0
  15. package/controls/AlignmentControl/index.d.ts +3 -0
  16. package/controls/AlignmentControl/index.js +9 -0
  17. package/controls/DeviceSwitcher/DeviceSwitcher.d.ts +10 -0
  18. package/controls/DeviceSwitcher/DeviceSwitcher.js +64 -0
  19. package/controls/DeviceSwitcher/index.d.ts +2 -0
  20. package/controls/DeviceSwitcher/index.js +9 -0
  21. package/controls/GradientColorPicker/GradientColorPicker.d.ts +8 -0
  22. package/controls/GradientColorPicker/GradientColorPicker.js +81 -0
  23. package/controls/GradientColorPicker/index.d.ts +2 -0
  24. package/controls/GradientColorPicker/index.js +9 -0
  25. package/controls/HeadingControl/HeadingControl.d.ts +14 -0
  26. package/controls/HeadingControl/HeadingControl.js +251 -0
  27. package/controls/HeadingControl/HeadingView.d.ts +21 -0
  28. package/controls/HeadingControl/HeadingView.js +43 -0
  29. package/controls/HeadingControl/index.d.ts +4 -0
  30. package/controls/HeadingControl/index.js +16 -0
  31. package/controls/MediaLibraryControl/FileBrowserDialog.d.ts +14 -0
  32. package/controls/MediaLibraryControl/FileBrowserDialog.js +138 -0
  33. package/controls/MediaLibraryControl/MediaLibraryControl.d.ts +38 -0
  34. package/controls/MediaLibraryControl/MediaLibraryControl.js +537 -0
  35. package/controls/MediaLibraryControl/index.d.ts +3 -0
  36. package/controls/MediaLibraryControl/index.js +9 -0
  37. package/controls/PaddingMarginControl/PaddingMarginControl.d.ts +30 -0
  38. package/controls/PaddingMarginControl/PaddingMarginControl.js +88 -0
  39. package/controls/PaddingMarginControl/PaddingMarginForm.d.ts +8 -0
  40. package/controls/PaddingMarginControl/PaddingMarginForm.js +109 -0
  41. package/controls/PaddingMarginControl/index.d.ts +4 -0
  42. package/controls/PaddingMarginControl/index.js +16 -0
  43. package/controls/PaddingMarginControl/utils.d.ts +3 -0
  44. package/controls/PaddingMarginControl/utils.js +21 -0
  45. package/controls/SelectableControl/SelectableControl.d.ts +5 -0
  46. package/controls/SelectableControl/SelectableControl.js +35 -0
  47. package/controls/SelectableControl/index.d.ts +3 -0
  48. package/controls/SelectableControl/index.js +9 -0
  49. package/hooks/ui-optimizations/useDebounce.d.ts +3 -0
  50. package/hooks/ui-optimizations/useDebounce.js +23 -0
  51. package/hooks/ui-optimizations/useThrottle.d.ts +3 -0
  52. package/hooks/ui-optimizations/useThrottle.js +22 -0
  53. package/hooks/useMediaImageQuery.d.ts +10 -0
  54. package/hooks/useMediaImageQuery.js +51 -0
  55. package/hooks/useSortable.d.ts +20 -0
  56. package/hooks/useSortable.js +70 -0
  57. package/index.d.ts +7 -0
  58. package/index.js +54 -0
  59. package/layouts/BlocksBar/LayerPanel.d.ts +8 -0
  60. package/layouts/BlocksBar/LayerPanel.js +299 -0
  61. package/layouts/BlocksBar/index.d.ts +7 -0
  62. package/layouts/BlocksBar/index.js +575 -0
  63. package/layouts/EditorPreview/BlockView.d.ts +16 -0
  64. package/layouts/EditorPreview/BlockView.js +435 -0
  65. package/layouts/EditorPreview/index.d.ts +9 -0
  66. package/layouts/EditorPreview/index.js +463 -0
  67. package/layouts/Header/index.d.ts +18 -0
  68. package/layouts/Header/index.js +202 -0
  69. package/layouts/Header/menus/ExportDataDialog.d.ts +4 -0
  70. package/layouts/Header/menus/ExportDataDialog.js +95 -0
  71. package/layouts/Header/menus/ImportDataDialog.d.ts +4 -0
  72. package/layouts/Header/menus/ImportDataDialog.js +100 -0
  73. package/layouts/Header/menus/LeftMenu.d.ts +9 -0
  74. package/layouts/Header/menus/LeftMenu.js +369 -0
  75. package/layouts/Header/menus/RightMenu.d.ts +14 -0
  76. package/layouts/Header/menus/RightMenu.js +91 -0
  77. package/layouts/Header/menus/SaveTemplateDialog.d.ts +4 -0
  78. package/layouts/Header/menus/SaveTemplateDialog.js +203 -0
  79. package/layouts/MessageBus.d.ts +13 -0
  80. package/layouts/MessageBus.js +76 -0
  81. package/layouts/Sidebar/AddBlockButton.d.ts +12 -0
  82. package/layouts/Sidebar/AddBlockButton.js +267 -0
  83. package/layouts/Sidebar/BlockForm.d.ts +20 -0
  84. package/layouts/Sidebar/BlockForm.js +517 -0
  85. package/layouts/Sidebar/BlocksControl.d.ts +21 -0
  86. package/layouts/Sidebar/BlocksControl.js +190 -0
  87. package/layouts/Sidebar/index.d.ts +10 -0
  88. package/layouts/Sidebar/index.js +451 -0
  89. package/layouts/Snackbar.d.ts +3 -0
  90. package/layouts/Snackbar.js +43 -0
  91. package/package.json +133 -0
  92. package/store/Provider.d.ts +15 -0
  93. package/store/Provider.js +71 -0
  94. package/store/editor-store-core.d.ts +4 -0
  95. package/store/editor-store-core.js +271 -0
  96. package/store/index.d.ts +112 -0
  97. package/store/index.js +178 -0
  98. package/theme.d.ts +10 -0
  99. package/theme.js +9 -0
  100. package/translation/cn.json +29 -0
  101. package/translation/en.json +29 -0
  102. package/translation/fr.json +31 -0
  103. package/translation/index.d.ts +6 -0
  104. package/translation/index.js +23 -0
  105. package/translation/types.d.ts +13 -0
  106. package/translation/types.js +5 -0
  107. package/types/Block.d.ts +22 -0
  108. package/types/Block.js +5 -0
  109. package/types/BlockType.d.ts +50 -0
  110. package/types/BlockType.js +5 -0
  111. package/types/ConfigStorageAdapter.d.ts +11 -0
  112. package/types/ConfigStorageAdapter.js +5 -0
  113. package/types/ObjectStorageAdapter.d.ts +68 -0
  114. package/types/ObjectStorageAdapter.js +5 -0
  115. package/types/index.d.ts +5 -0
  116. package/types/index.js +100 -0
  117. package/types/throttle-and-debounce.d.ts +2 -0
  118. package/types/throttle-and-debounce.js +5 -0
  119. package/utils/block.d.ts +16 -0
  120. package/utils/block.js +41 -0
  121. package/utils/helpers.d.ts +5 -0
  122. package/utils/helpers.js +22 -0
  123. package/utils/strings.d.ts +1 -0
  124. package/utils/strings.js +11 -0
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.SELECTED_BLOCK = exports.PREVIEW_READY = exports.PREVIEW_DATA = void 0;
7
+ var _Delete = _interopRequireDefault(require("@mui/icons-material/Delete"));
8
+ var _Box = _interopRequireDefault(require("@mui/material/Box/Box.js"));
9
+ var _Button = _interopRequireDefault(require("@mui/material/Button/Button.js"));
10
+ var _Dialog = _interopRequireDefault(require("@mui/material/Dialog/Dialog.js"));
11
+ var _DialogActions = _interopRequireDefault(require("@mui/material/DialogActions/DialogActions.js"));
12
+ var _DialogContent = _interopRequireDefault(require("@mui/material/DialogContent/DialogContent.js"));
13
+ var _DialogContentText = _interopRequireDefault(require("@mui/material/DialogContentText/DialogContentText.js"));
14
+ var _DialogTitle = _interopRequireDefault(require("@mui/material/DialogTitle/DialogTitle.js"));
15
+ var _react = _interopRequireWildcard(require("react"));
16
+ var _uuid = require("uuid");
17
+ var _BlockView = _interopRequireDefault(require("./BlockView"));
18
+ var _store = require("../../store");
19
+ var _block = require("../../utils/block");
20
+ var _clsx = _interopRequireDefault(require("clsx"));
21
+ var _jsxRuntime = require("react/jsx-runtime");
22
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
23
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
24
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
+ const PREVIEW_DATA = exports.PREVIEW_DATA = 'editor/previewData';
26
+ const PREVIEW_READY = exports.PREVIEW_READY = 'editor/previewReady';
27
+ const SELECTED_BLOCK = exports.SELECTED_BLOCK = 'editor/selectedBlock';
28
+ const EditorPreview = props => {
29
+ const {
30
+ onChange
31
+ } = props;
32
+ const {
33
+ data,
34
+ blockTypes,
35
+ previewWidth,
36
+ setData,
37
+ setSelectedBlockId,
38
+ setEditingBlockId,
39
+ selectedBlockId,
40
+ isMp
41
+ } = (0, _store.useEditorStore)(state => state);
42
+ const containerRef = (0, _react.useRef)(null);
43
+ const [dropIndex, setDropIndex] = (0, _react.useState)(null);
44
+ const blockRefs = (0, _react.useRef)({});
45
+ const [deleteDialogOpen, setDeleteDialogOpen] = (0, _react.useState)(false);
46
+ const [blockToDelete, setBlockToDelete] = (0, _react.useState)(null);
47
+
48
+ // Add message listener
49
+ (0, _react.useEffect)(() => {
50
+ const listener = event => {
51
+ if (event.data && event.data.type) {
52
+ const {
53
+ type,
54
+ payload
55
+ } = event.data;
56
+ switch (type) {
57
+ case PREVIEW_DATA:
58
+ setData(payload);
59
+ break;
60
+ case SELECTED_BLOCK:
61
+ setSelectedBlockId(payload);
62
+ break;
63
+ default:
64
+ // Ignore unsupported event
65
+ break;
66
+ }
67
+ }
68
+ };
69
+ window.addEventListener('message', listener);
70
+ return () => {
71
+ window.removeEventListener('message', listener);
72
+ };
73
+ }, [setData, setSelectedBlockId]);
74
+
75
+ // Notify parent that preview is ready
76
+ (0, _react.useEffect)(() => {
77
+ window.parent.postMessage({
78
+ type: PREVIEW_READY
79
+ }, '*');
80
+ const handleClick = event => {
81
+ const preview = document.getElementById('editor-preview');
82
+ const target = event.target;
83
+ const linkElement = target.closest('a');
84
+ if (linkElement && preview?.contains(linkElement) && linkElement.href?.startsWith('http')) {
85
+ event.preventDefault();
86
+ }
87
+ };
88
+ window.addEventListener('click', handleClick);
89
+ return () => {
90
+ window.removeEventListener('click', handleClick);
91
+ };
92
+ }, []);
93
+
94
+ // Add effect to scroll to selected block
95
+ (0, _react.useEffect)(() => {
96
+ if (selectedBlockId && blockRefs.current[selectedBlockId]) {
97
+ blockRefs.current[selectedBlockId]?.scrollIntoView({
98
+ behavior: 'smooth',
99
+ block: 'nearest',
100
+ inline: 'nearest'
101
+ });
102
+ }
103
+ }, [selectedBlockId]);
104
+ const getPreviewWidth = () => {
105
+ switch (previewWidth) {
106
+ case 'sm':
107
+ return '375px';
108
+ case 'md':
109
+ return '1024px';
110
+ case 'lg':
111
+ return '1280px';
112
+ case 'xl':
113
+ return '1536px';
114
+ case 'full':
115
+ {
116
+ return 'calc(100vw - var(--editor-sidebar-width, 0px) - var(--editor-blocksbar-width, 0px))';
117
+ }
118
+ default:
119
+ return '375px';
120
+ }
121
+ };
122
+ const getPreviewHeight = () => {
123
+ switch (previewWidth) {
124
+ case 'sm':
125
+ return '667px';
126
+ case 'md':
127
+ return '768px';
128
+ case 'lg':
129
+ return '800px';
130
+ case 'xl':
131
+ return '864px';
132
+ case 'full':
133
+ return 'calc(100vh - 50px)';
134
+ default:
135
+ return '100vh';
136
+ }
137
+ };
138
+ const handleDrop = (0, _react.useCallback)(e => {
139
+ e.preventDefault();
140
+ const blockTypeData = e.dataTransfer.getData('blockType');
141
+ if (!blockTypeData) return;
142
+ try {
143
+ const blockType = JSON.parse(blockTypeData);
144
+ const newBlock = (0, _block.createBlock)(blockType);
145
+ const updated = setData(prev => {
146
+ const insertIndex = dropIndex !== null ? dropIndex : prev.length;
147
+ const next = prev.slice();
148
+ next.splice(insertIndex, 0, newBlock);
149
+ return next;
150
+ });
151
+ onChange?.(updated);
152
+ setDropIndex(null);
153
+
154
+ // Set the new block as selected and editing
155
+ setSelectedBlockId(newBlock.id);
156
+ setEditingBlockId(newBlock.id);
157
+ } catch (error) {
158
+ console.error('Failed to parse block type:', error);
159
+ }
160
+ }, [setData, dropIndex, setSelectedBlockId, setEditingBlockId, onChange]);
161
+ const handleDragOver = (0, _react.useCallback)(e => {
162
+ e.preventDefault();
163
+
164
+ // check if the target is a container
165
+ const draggingElement = document.querySelector('[data-sortable-dragging="true"]');
166
+ if (draggingElement) {
167
+ return;
168
+ }
169
+ const container = containerRef.current;
170
+ if (!container) return;
171
+
172
+ // check if the target is a container
173
+ const isOverContainer = container.contains(e.target);
174
+ if (!isOverContainer) {
175
+ setDropIndex(null);
176
+ return;
177
+ }
178
+ const blockElements = Array.from(container.getElementsByClassName('block-item'));
179
+ const mouseY = e.clientY;
180
+ let closestIndex = data.length; // Default to the end of the list
181
+
182
+ for (let i = 0; i < blockElements.length; i++) {
183
+ const block = blockElements[i];
184
+ const onTop = block.classList.contains('on-top');
185
+ const rect = block.getBoundingClientRect();
186
+ const blockMiddle = rect.top + rect.height / 2;
187
+ if (mouseY < blockMiddle) {
188
+ closestIndex = onTop ? i + 1 : i;
189
+ break;
190
+ }
191
+ }
192
+ setDropIndex(closestIndex);
193
+ }, [data.length]);
194
+ const handleDragLeave = (0, _react.useCallback)(e => {
195
+ // Check if mouse has truly left the container
196
+ const rect = e.currentTarget.getBoundingClientRect();
197
+ const {
198
+ clientX,
199
+ clientY
200
+ } = e;
201
+
202
+ // If mouse is still within container bounds, don't trigger leave
203
+ if (clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom) {
204
+ return;
205
+ }
206
+ setDropIndex(null);
207
+ }, []);
208
+ const handleBlockClick = (0, _react.useCallback)(block => {
209
+ setSelectedBlockId(block.id);
210
+ setEditingBlockId(block.id);
211
+ }, [setSelectedBlockId, setEditingBlockId]);
212
+ const handleDeleteClick = block => {
213
+ setBlockToDelete(block);
214
+ setDeleteDialogOpen(true);
215
+ };
216
+ const handleDeleteCancel = () => {
217
+ setDeleteDialogOpen(false);
218
+ setBlockToDelete(null);
219
+ };
220
+ const handleDeleteConfirm = () => {
221
+ if (blockToDelete) {
222
+ const updated = setData(prev => prev.filter(b => b.id !== blockToDelete.id).map(b => ({
223
+ ...b,
224
+ meta: {
225
+ ...b.meta,
226
+ changed: Date.now()
227
+ }
228
+ })));
229
+ onChange?.(updated);
230
+ setSelectedBlockId('');
231
+ setEditingBlockId('');
232
+ }
233
+ setDeleteDialogOpen(false);
234
+ setBlockToDelete(null);
235
+ };
236
+ const bgColor = data.find(block => block.type === 'PageBackground')?.data.backgroundColor || 'background.paper';
237
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
238
+ ref: containerRef,
239
+ sx: {
240
+ flex: 1,
241
+ overflow: 'auto',
242
+ height: '100%',
243
+ p: 2,
244
+ display: 'flex',
245
+ justifyContent: 'center',
246
+ alignItems: 'center',
247
+ bgcolor: 'background.paper'
248
+ },
249
+ onDrop: handleDrop,
250
+ onDragOver: handleDragOver,
251
+ onDragLeave: handleDragLeave,
252
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
253
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
254
+ sx: {
255
+ width: getPreviewWidth(),
256
+ height: getPreviewHeight(),
257
+ boxShadow: '0 0 10px rgba(0,0,0,0.1)',
258
+ transition: 'all 0.3s ease-in-out',
259
+ overflow: 'auto',
260
+ position: 'relative',
261
+ background: bgColor,
262
+ containerType: 'inline-size'
263
+ },
264
+ id: "editor-preview",
265
+ children: [data.map((block, index) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_react.default.Fragment, {
266
+ children: [dropIndex === index && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
267
+ sx: {
268
+ position: 'relative',
269
+ zIndex: 1,
270
+ '&::before': {
271
+ content: '""',
272
+ position: 'absolute',
273
+ left: 0,
274
+ top: '-4px',
275
+ width: '100%',
276
+ height: '10px',
277
+ bgcolor: 'rgba(25, 118, 210, 1)',
278
+ display: 'block'
279
+ }
280
+ }
281
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
282
+ ref: el => {
283
+ blockRefs.current[block.id] = el;
284
+ },
285
+ className: (0, _clsx.default)(['block-item', block.top && 'on-top']),
286
+ onClick: () => handleBlockClick(block),
287
+ sx: {
288
+ cursor: 'pointer',
289
+ ...(block.top ? {
290
+ position: 'sticky',
291
+ ...(block.settings.fixed ? {
292
+ marginBottom: '-92px'
293
+ } : {}),
294
+ width: '100%',
295
+ top: 0,
296
+ zIndex: 9999999
297
+ } : {
298
+ position: 'relative'
299
+ }),
300
+ '&::after': selectedBlockId === block.id && ((0, _block.blockFilteredMPNav)(block, true) ? isMp : true) ? {
301
+ content: '""',
302
+ position: 'absolute',
303
+ top: 0,
304
+ left: 0,
305
+ right: 0,
306
+ bottom: 0,
307
+ border: '2px solid',
308
+ borderColor: 'primary.main',
309
+ pointerEvents: 'none',
310
+ animation: 'pulse 2s infinite',
311
+ '@keyframes pulse': {
312
+ '0%': {
313
+ boxShadow: '0 0 0 0 rgba(25, 118, 210, 0.4)'
314
+ },
315
+ '70%': {
316
+ boxShadow: '0 0 0 10px rgba(25, 118, 210, 0)'
317
+ },
318
+ '100%': {
319
+ boxShadow: '0 0 0 0 rgba(25, 118, 210, 0)'
320
+ }
321
+ }
322
+ } : {}
323
+ },
324
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_BlockView.default, {
325
+ block: block,
326
+ blockTypes: blockTypes,
327
+ onChange: newBlock => {
328
+ const updated = setData(prev => prev.map(b => b.id === newBlock.id ? {
329
+ ...newBlock,
330
+ meta: {
331
+ ...newBlock.meta,
332
+ changed: Date.now()
333
+ }
334
+ } : b));
335
+ onChange?.(updated);
336
+ },
337
+ onMoveUp: index > 0 && (0, _block.blockFilteredMPNav)(data[index - 1]) ? () => {
338
+ const updated = setData(prev => {
339
+ const i = prev.findIndex(b => b.id === block.id);
340
+ if (i <= 0) return prev;
341
+ const next = prev.slice();
342
+ const movedBlock = {
343
+ ...next[i],
344
+ meta: {
345
+ ...next[i].meta,
346
+ changed: Date.now()
347
+ }
348
+ };
349
+ const targetBlock = {
350
+ ...next[i - 1],
351
+ meta: {
352
+ ...next[i - 1].meta,
353
+ changed: Date.now()
354
+ }
355
+ };
356
+ next[i - 1] = movedBlock;
357
+ next[i] = targetBlock;
358
+ return next;
359
+ });
360
+ onChange?.(updated);
361
+ // force update selected state to trigger re-render
362
+ setSelectedBlockId('');
363
+ setTimeout(() => {
364
+ setSelectedBlockId(block.id);
365
+ }, 0);
366
+ } : undefined,
367
+ onMoveDown: index < data.length - 1 ? () => {
368
+ const updated = setData(prev => {
369
+ const i = prev.findIndex(b => b.id === block.id);
370
+ if (i < 0 || i >= prev.length - 1) return prev;
371
+ const next = prev.slice();
372
+ const movedBlock = {
373
+ ...next[i],
374
+ meta: {
375
+ ...next[i].meta,
376
+ changed: Date.now()
377
+ }
378
+ };
379
+ const targetBlock = {
380
+ ...next[i + 1],
381
+ meta: {
382
+ ...next[i + 1].meta,
383
+ changed: Date.now()
384
+ }
385
+ };
386
+ next[i] = targetBlock;
387
+ next[i + 1] = movedBlock;
388
+ return next;
389
+ });
390
+ onChange?.(updated);
391
+ // force update selected state to trigger re-render
392
+ setSelectedBlockId('');
393
+ setTimeout(() => {
394
+ setSelectedBlockId(block.id);
395
+ }, 0);
396
+ } : undefined,
397
+ onCopy: copied => {
398
+ const updated = setData(prev => {
399
+ const copy = {
400
+ ...copied,
401
+ id: (0, _uuid.v4)(),
402
+ meta: {
403
+ created: Date.now(),
404
+ changed: Date.now()
405
+ }
406
+ };
407
+ return [...prev, copy];
408
+ });
409
+ onChange?.(updated);
410
+ },
411
+ onDelete: () => handleDeleteClick(block)
412
+ })
413
+ })]
414
+ }, block.id)), dropIndex === data.length && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
415
+ sx: {
416
+ height: '2px',
417
+ bgcolor: 'primary.main',
418
+ width: '100%',
419
+ position: 'relative',
420
+ '&::before': {
421
+ content: '""',
422
+ position: 'absolute',
423
+ left: 0,
424
+ top: '-4px',
425
+ width: '100%',
426
+ height: '10px',
427
+ bgcolor: 'rgba(25, 118, 210, 0.1)'
428
+ }
429
+ }
430
+ })]
431
+ })
432
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Dialog.default, {
433
+ open: deleteDialogOpen,
434
+ onClose: handleDeleteCancel,
435
+ "aria-labelledby": "delete-dialog-title",
436
+ "aria-describedby": "delete-dialog-description",
437
+ keepMounted: true,
438
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogTitle.default, {
439
+ id: "delete-dialog-title",
440
+ children: "Delete Block"
441
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogContent.default, {
442
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DialogContentText.default, {
443
+ id: "delete-dialog-description",
444
+ children: "Are you sure you want to delete this block?"
445
+ })
446
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DialogActions.default, {
447
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
448
+ onClick: handleDeleteCancel,
449
+ variant: "outlined",
450
+ children: "Cancel"
451
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
452
+ onClick: handleDeleteConfirm,
453
+ variant: "contained",
454
+ color: "primary",
455
+ startIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {}),
456
+ autoFocus: true,
457
+ children: "Delete"
458
+ })]
459
+ })]
460
+ })]
461
+ });
462
+ };
463
+ var _default = exports.default = EditorPreview;
@@ -0,0 +1,18 @@
1
+ import React, { FC } from 'react';
2
+ import { Block } from '../../types';
3
+ declare const Header: React.FC<{
4
+ onFullScreen?(): void;
5
+ onExitFullScreen?(): void;
6
+ onToggleBlocksBar?(): void;
7
+ isBlocksBarVisible?: boolean;
8
+ onToggleSidebar?(): void;
9
+ isSidebarVisible?: boolean;
10
+ onChange?(data: Block[]): void;
11
+ platinum?: boolean;
12
+ headerSlots?: Partial<{
13
+ left: FC;
14
+ middle: FC;
15
+ right: FC;
16
+ }>;
17
+ }>;
18
+ export default Header;
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _FullscreenExit = _interopRequireDefault(require("@mui/icons-material/FullscreenExit"));
8
+ var _Laptop = _interopRequireDefault(require("@mui/icons-material/Laptop"));
9
+ var _PhoneIphone = _interopRequireDefault(require("@mui/icons-material/PhoneIphone"));
10
+ var _ScreenshotMonitor = _interopRequireDefault(require("@mui/icons-material/ScreenshotMonitor"));
11
+ var _Tablet = _interopRequireDefault(require("@mui/icons-material/Tablet"));
12
+ var _Button = _interopRequireDefault(require("@mui/material/Button/Button.js"));
13
+ var _styled = _interopRequireDefault(require("@mui/material/styles/styled.js"));
14
+ var _useTheme = _interopRequireDefault(require("@mui/material/styles/useTheme.js"));
15
+ var _clsx = _interopRequireDefault(require("clsx"));
16
+ var _react = _interopRequireDefault(require("react"));
17
+ var _store = require("../../store");
18
+ var _mp = _interopRequireDefault(require("../../assets/svg/mp"));
19
+ var _LeftMenu = _interopRequireDefault(require("./menus/LeftMenu"));
20
+ var _RightMenu = _interopRequireDefault(require("./menus/RightMenu"));
21
+ var _jsxRuntime = require("react/jsx-runtime");
22
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
+ const PREFIX = 'Header';
24
+ const classes = {
25
+ root: `${PREFIX}-root`,
26
+ headerInner: `${PREFIX}-headerInner`,
27
+ centerActions: `${PREFIX}-centerActions`
28
+ };
29
+ const Root = (0, _styled.default)('header')(() => {
30
+ const theme = (0, _useTheme.default)();
31
+ return {
32
+ display: 'none',
33
+ background: theme.palette.header?.background || 'white',
34
+ borderBottom: `1px solid ${theme.palette.grey['300']}`,
35
+ width: '100%',
36
+ position: 'sticky',
37
+ zIndex: 20,
38
+ top: 0,
39
+ lineHeight: 1,
40
+ fontSize: theme.typography.fontSize,
41
+ [theme.breakpoints.up('lg')]: {
42
+ display: 'initial'
43
+ },
44
+ [`& .${classes.headerInner}`]: {
45
+ display: 'flex',
46
+ alignItems: 'center',
47
+ justifyContent: 'space-between',
48
+ '.MuiButton-root': {
49
+ borderRadius: 0,
50
+ minWidth: 0,
51
+ ...(theme.palette.header?.text && {
52
+ color: theme.palette.header?.text
53
+ })
54
+ }
55
+ },
56
+ [`& .${classes.centerActions}`]: {
57
+ position: 'absolute',
58
+ left: '50%',
59
+ transform: 'translateX(-50%)',
60
+ '.MuiButton-root': {
61
+ padding: theme.spacing(1),
62
+ margin: `0 ${theme.spacing(0.5)}`,
63
+ opacity: 0.5,
64
+ '&.active': {
65
+ opacity: 1
66
+ },
67
+ '.MuiSvgIcon-root': {
68
+ fontSize: theme.typography.fontSize * 1.6
69
+ }
70
+ }
71
+ }
72
+ };
73
+ });
74
+ const Header = props => {
75
+ const {
76
+ onFullScreen,
77
+ onExitFullScreen,
78
+ onToggleBlocksBar,
79
+ isBlocksBarVisible,
80
+ onToggleSidebar,
81
+ isSidebarVisible,
82
+ onChange,
83
+ platinum,
84
+ headerSlots
85
+ } = props;
86
+ const {
87
+ previewWidth,
88
+ isMp,
89
+ includingMp,
90
+ setPreviewWidth,
91
+ setIsMp,
92
+ previewDeviceList
93
+ } = (0, _store.useEditorStore)(state => state);
94
+ const updatePreviewWidth = (width, clickFromMp) => {
95
+ setPreviewWidth(width);
96
+ if (includingMp && !clickFromMp) {
97
+ setIsMp(false);
98
+ }
99
+ };
100
+ const isDeviceAvailable = device => {
101
+ if (previewDeviceList === null) {
102
+ return false;
103
+ }
104
+ return Array.isArray(previewDeviceList) ? previewDeviceList.includes(device) : true;
105
+ };
106
+ const isShowDeviceSwitcher = previewDeviceList !== null;
107
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(Root, {
108
+ className: classes.root,
109
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
110
+ className: classes.headerInner,
111
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_LeftMenu.default, {
112
+ onToggleBlocksBar: onToggleBlocksBar,
113
+ isBlocksBarVisible: isBlocksBarVisible,
114
+ onChange: onChange,
115
+ slot: headerSlots?.left
116
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
117
+ id: "preview-width-switch",
118
+ className: classes.centerActions,
119
+ children: [includingMp && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
120
+ onClick: () => {
121
+ updatePreviewWidth('sm', true);
122
+ setIsMp(true);
123
+ },
124
+ className: (0, _clsx.default)({
125
+ active: isMp && previewWidth === 'sm'
126
+ }),
127
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_mp.default, {}), isMp && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
128
+ style: {
129
+ fontSize: 10
130
+ },
131
+ children: "Mini Program"
132
+ })]
133
+ }), isShowDeviceSwitcher && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
134
+ children: [isDeviceAvailable('sm') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
135
+ onClick: () => updatePreviewWidth('sm'),
136
+ className: (0, _clsx.default)({
137
+ active: !isMp && previewWidth === 'sm'
138
+ }),
139
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_PhoneIphone.default, {}), previewWidth === 'sm' && !isMp && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
140
+ style: {
141
+ fontSize: 10
142
+ },
143
+ children: "375px"
144
+ })]
145
+ }), isDeviceAvailable('md') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
146
+ onClick: () => updatePreviewWidth('md'),
147
+ className: (0, _clsx.default)({
148
+ active: previewWidth === 'md'
149
+ }),
150
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Tablet.default, {}), previewWidth === 'md' && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
151
+ style: {
152
+ fontSize: 10
153
+ },
154
+ children: "1024px"
155
+ })]
156
+ }), isDeviceAvailable('lg') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
157
+ onClick: () => updatePreviewWidth('lg'),
158
+ className: (0, _clsx.default)({
159
+ active: previewWidth === 'lg'
160
+ }),
161
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Laptop.default, {}), previewWidth === 'lg' && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
162
+ style: {
163
+ fontSize: 10
164
+ },
165
+ children: "1280px"
166
+ })]
167
+ }), isDeviceAvailable('xl') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
168
+ onClick: () => updatePreviewWidth('xl'),
169
+ className: (0, _clsx.default)({
170
+ active: previewWidth === 'xl'
171
+ }),
172
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ScreenshotMonitor.default, {}), previewWidth === 'xl' && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
173
+ style: {
174
+ fontSize: 10
175
+ },
176
+ children: "1536px"
177
+ })]
178
+ }), isDeviceAvailable('full') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
179
+ onClick: () => updatePreviewWidth('full'),
180
+ className: (0, _clsx.default)({
181
+ active: previewWidth === 'full'
182
+ }),
183
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_FullscreenExit.default, {}), previewWidth === 'full' && /*#__PURE__*/(0, _jsxRuntime.jsx)("small", {
184
+ style: {
185
+ fontSize: 10
186
+ },
187
+ children: "FULL"
188
+ })]
189
+ })]
190
+ })]
191
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_RightMenu.default, {
192
+ platinum: platinum,
193
+ onFullScreen: onFullScreen,
194
+ onExitFullScreen: onExitFullScreen,
195
+ onToggleSidebar: onToggleSidebar,
196
+ isSidebarVisible: isSidebarVisible,
197
+ slot: headerSlots?.right
198
+ })]
199
+ })
200
+ });
201
+ };
202
+ var _default = exports.default = Header;
@@ -0,0 +1,4 @@
1
+ import { DialogProps } from '@mui/material';
2
+ import React from 'react';
3
+ declare const ExportDataDialog: React.FC<DialogProps>;
4
+ export default ExportDataDialog;