@improba/page-builder 0.1.0 → 0.2.0

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 (68) hide show
  1. package/README.md +26 -26
  2. package/dist/core.cjs +2 -0
  3. package/dist/core.cjs.map +1 -0
  4. package/dist/core.js +29 -0
  5. package/dist/core.js.map +1 -0
  6. package/dist/index-D79WbFRY.cjs +2 -0
  7. package/dist/index-D79WbFRY.cjs.map +1 -0
  8. package/dist/index-c6HOrx9r.js +523 -0
  9. package/dist/index-c6HOrx9r.js.map +1 -0
  10. package/dist/index.cjs +10 -5
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +2402 -3312
  13. package/dist/index.js.map +1 -1
  14. package/dist/style.css +1 -0
  15. package/dist/types/built-in/PbColumn.vue.d.ts +41 -0
  16. package/dist/types/built-in/PbContainer.vue.d.ts +32 -0
  17. package/dist/types/built-in/PbImage.vue.d.ts +42 -0
  18. package/dist/types/built-in/PbRow.vue.d.ts +41 -0
  19. package/dist/types/built-in/PbSection.vue.d.ts +50 -0
  20. package/dist/types/built-in/PbText.vue.d.ts +25 -0
  21. package/dist/types/built-in/PbVideo.vue.d.ts +27 -0
  22. package/dist/types/built-in/index.d.ts +10 -0
  23. package/dist/types/components/PageBuilder.vue.d.ts +50 -0
  24. package/dist/types/components/editor/EditorCanvas.vue.d.ts +67 -0
  25. package/dist/types/components/editor/EditorToolbar.vue.d.ts +97 -0
  26. package/dist/types/components/editor/IframeCanvas.vue.d.ts +102 -0
  27. package/dist/types/components/editor/LeftDrawer.vue.d.ts +46 -0
  28. package/dist/types/components/editor/NodeContextMenu.vue.d.ts +66 -0
  29. package/dist/types/components/editor/PageEditor.vue.d.ts +20 -0
  30. package/dist/types/components/editor/RightDrawer.vue.d.ts +43 -0
  31. package/dist/types/components/editor/TreePanel.vue.d.ts +28 -0
  32. package/dist/types/components/editor/prop-editors/MediaPicker.vue.d.ts +20 -0
  33. package/dist/types/components/editor/prop-editors/PropBooleanEditor.vue.d.ts +18 -0
  34. package/dist/types/components/editor/prop-editors/PropColorEditor.vue.d.ts +18 -0
  35. package/dist/types/components/editor/prop-editors/PropNumberEditor.vue.d.ts +36 -0
  36. package/dist/types/components/editor/prop-editors/PropSelectEditor.vue.d.ts +31 -0
  37. package/dist/types/components/editor/prop-editors/PropTextEditor.vue.d.ts +27 -0
  38. package/dist/types/components/editor/prop-editors/RichTextEditor.vue.d.ts +27 -0
  39. package/dist/types/components/editor/prop-editors/index.d.ts +29 -0
  40. package/dist/types/components/reader/NodeRenderer.vue.d.ts +33 -0
  41. package/dist/types/components/reader/PageReader.vue.d.ts +14 -0
  42. package/dist/types/components/shared/ErrorBoundary.vue.d.ts +21 -0
  43. package/dist/types/composables/use-drag-drop.d.ts +23 -0
  44. package/dist/types/composables/use-editor.d.ts +40 -0
  45. package/dist/types/composables/use-node-tree.d.ts +23 -0
  46. package/dist/types/composables/use-page-builder.d.ts +28 -0
  47. package/dist/types/core/drop-slot.d.ts +12 -0
  48. package/dist/types/core/errors.d.ts +14 -0
  49. package/dist/types/core/iframe-bridge.d.ts +85 -0
  50. package/dist/types/core/index.d.ts +18 -0
  51. package/dist/types/core/registry.d.ts +43 -0
  52. package/dist/types/core/sanitize.d.ts +3 -0
  53. package/dist/types/core/tree.d.ts +56 -0
  54. package/dist/types/core/validation.d.ts +10 -0
  55. package/dist/types/core/virtual-tree.d.ts +44 -0
  56. package/dist/types/i18n/context.d.ts +13 -0
  57. package/dist/types/i18n/index.d.ts +3 -0
  58. package/dist/types/i18n/messages.d.ts +3 -0
  59. package/dist/types/i18n/translator.d.ts +14 -0
  60. package/dist/types/index.d.ts +27 -0
  61. package/dist/types/plugin.d.ts +18 -0
  62. package/dist/types/types/component.d.ts +68 -0
  63. package/dist/types/types/editor.d.ts +54 -0
  64. package/dist/types/types/index.d.ts +6 -0
  65. package/dist/types/types/keys.d.ts +13 -0
  66. package/dist/types/types/node.d.ts +54 -0
  67. package/package.json +8 -3
  68. package/dist/index.css +0 -1
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .ipb-error-boundary[data-v-5b429c0c]{width:100%;padding:.75rem;border:1px solid #f3d1d1;border-radius:.375rem;background-color:#fff5f5;color:#7a1f1f}.ipb-error-boundary__message[data-v-5b429c0c]{margin:0;font-size:.9rem;line-height:1.4}.ipb-error-boundary__details[data-v-5b429c0c]{margin:.5rem 0 0;font-size:.75rem;line-height:1.4;white-space:pre-wrap;word-break:break-word;color:#5f1b1b}.ipb-node-renderer__invalid[data-v-f60d41e1]{width:100%;padding:.75rem;border:1px solid #f3d1d1;border-radius:.375rem;background-color:#fff5f5;color:#7a1f1f;font-size:.825rem;line-height:1.35}.ipb-page-reader[data-v-d9bf9b29]{width:100%;min-height:100%}.ipb-page-reader__invalid[data-v-d9bf9b29]{padding:.75rem;border:1px solid #f3d1d1;border-radius:.375rem;background-color:#fff5f5;color:#7a1f1f;font-size:.875rem}.ipb-toolbar[data-v-7086d88b]{display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 16px;background:var(--ipb-toolbar-bg, #fff);border-bottom:1px solid var(--ipb-border-color, #e0e0e0);flex-shrink:0}.ipb-toolbar__left[data-v-7086d88b],.ipb-toolbar__center[data-v-7086d88b],.ipb-toolbar__right[data-v-7086d88b]{display:flex;align-items:center;gap:8px}.ipb-toolbar__btn[data-v-7086d88b]{padding:6px 12px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;background:transparent;cursor:pointer;font-size:13px;transition:background .15s}.ipb-toolbar__btn[data-v-7086d88b]:focus-visible,.ipb-toolbar__size-input[data-v-7086d88b]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-toolbar__custom-size[data-v-7086d88b]{display:inline-flex;align-items:center;gap:8px;margin-left:8px;padding-left:8px;border-left:1px solid var(--ipb-border-color, #e0e0e0)}.ipb-toolbar__size-control[data-v-7086d88b]{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--ipb-text-secondary, #4b5563)}.ipb-toolbar__size-input[data-v-7086d88b]{width:72px;padding:4px 6px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:12px}.ipb-toolbar__viewport-size[data-v-7086d88b]{margin-left:8px;color:var(--ipb-text-secondary, #6b7280);font-size:12px;font-variant-numeric:tabular-nums}.ipb-toolbar__btn[data-v-7086d88b]:hover:not(:disabled){background:var(--ipb-hover-bg, #f5f5f5)}.ipb-toolbar__btn[data-v-7086d88b]:disabled{opacity:.4;cursor:not-allowed}.ipb-toolbar__btn--active[data-v-7086d88b]{background:var(--ipb-active-bg, #e8f0fe);border-color:var(--ipb-primary-color, #1a73e8);color:var(--ipb-primary-color, #1a73e8)}.ipb-toolbar__btn--primary[data-v-7086d88b]{background:var(--ipb-primary-color, #1a73e8);color:#fff;border-color:var(--ipb-primary-color, #1a73e8)}.ipb-toolbar__btn--primary[data-v-7086d88b]:hover{background:var(--ipb-primary-hover, #1557b0)}.ipb-toolbar__dirty-indicator[data-v-7086d88b]{color:var(--ipb-warning-color, #f59e0b);font-size:10px}.ipb-tree-panel[data-v-f50f228d]{min-width:0}.ipb-tree-panel__list[data-v-f50f228d]{display:flex;flex-direction:column;gap:2px}.ipb-tree-panel__row-wrapper[data-v-f50f228d]{display:flex;flex-direction:column;gap:0}.ipb-tree-panel__drop-line[data-v-f50f228d]{min-height:8px;margin:0 8px;padding:3px 0;flex-shrink:0;display:flex;align-items:center;cursor:default}.ipb-tree-panel__drop-line[data-v-f50f228d]:before{content:"";display:block;width:100%;height:2px;border-radius:1px;background:var(--ipb-primary-color, #1d4ed8)}.ipb-tree-panel__item[data-v-f50f228d]{display:flex;align-items:center;gap:6px;width:100%;min-width:0;padding:6px 8px;border:0;border-radius:4px;background:transparent;color:inherit;text-align:left;cursor:pointer;font-size:12px;line-height:1.3}.ipb-tree-panel__item[data-v-f50f228d]:hover{background:var(--ipb-hover-bg, #f5f5f5)}.ipb-tree-panel__item[data-v-f50f228d]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:-1px}.ipb-tree-panel__item--selected[data-v-f50f228d]{background:var(--ipb-primary-soft, rgba(37, 99, 235, .14));color:var(--ipb-primary-color, #1d4ed8)}.ipb-tree-panel__item--readonly[data-v-f50f228d]{opacity:.8}.ipb-tree-panel__item--drop-target[data-v-f50f228d]{background:var(--ipb-primary-soft, rgba(37, 99, 235, .2));outline:2px dashed var(--ipb-primary-color, #1d4ed8);outline-offset:2px}.ipb-tree-panel__item--draggable[data-v-f50f228d]{cursor:grab}.ipb-tree-panel__item--draggable[data-v-f50f228d]:active{cursor:grabbing}.ipb-tree-panel__name[data-v-f50f228d]{font-weight:500;white-space:nowrap}.ipb-tree-panel__id[data-v-f50f228d]{color:var(--ipb-text-muted, #6b7280);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:11px;white-space:nowrap}.ipb-tree-panel__readonly[data-v-f50f228d]{margin-left:auto;font-size:10px;text-transform:uppercase;letter-spacing:.03em;color:var(--ipb-text-muted, #6b7280);border:1px solid var(--ipb-border-color, #d1d5db);border-radius:3px;padding:1px 4px}.ipb-left-drawer[data-v-2bb04ccb]{width:48px;background:var(--ipb-drawer-bg, #fff);border-right:1px solid var(--ipb-border-color, #e0e0e0);transition:width .2s ease;overflow:hidden;flex-shrink:0;display:flex;flex-direction:column}.ipb-left-drawer--open[data-v-2bb04ccb]{width:260px}.ipb-left-drawer__header[data-v-2bb04ccb]{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0;padding:12px;border-bottom:1px solid var(--ipb-border-color, #e0e0e0)}.ipb-left-drawer__title[data-v-2bb04ccb]{font-weight:600;font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ipb-left-drawer__toggle[data-v-2bb04ccb]{flex-shrink:0;background:none;border:none;cursor:pointer;font-size:12px;padding:4px}.ipb-left-drawer__toggle[data-v-2bb04ccb]:focus-visible,.ipb-left-drawer__section-toggle[data-v-2bb04ccb]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px;border-radius:4px}.ipb-left-drawer__content[data-v-2bb04ccb]{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:12px}.ipb-left-drawer__section[data-v-2bb04ccb]{min-width:0}.ipb-left-drawer__search[data-v-2bb04ccb]{margin-top:8px;margin-bottom:8px}.ipb-left-drawer__search-input[data-v-2bb04ccb]{width:100%;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;background:var(--ipb-input-bg, #fff);color:var(--ipb-text-color, #111827);font-size:12px}.ipb-left-drawer__search-input[data-v-2bb04ccb]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-left-drawer__section--tree[data-v-2bb04ccb]{padding-top:8px;border-top:1px solid var(--ipb-border-color, #e0e0e0)}.ipb-left-drawer__section-header[data-v-2bb04ccb]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.ipb-left-drawer__section-title[data-v-2bb04ccb]{margin:0;font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--ipb-text-muted, #6b7280)}.ipb-left-drawer__section-toggle[data-v-2bb04ccb]{background:none;border:none;cursor:pointer;padding:2px 4px;font-size:14px;line-height:1}.ipb-left-drawer__category-title[data-v-2bb04ccb]{font-size:11px;font-weight:600;margin:10px 0 8px}.ipb-left-drawer__component-list[data-v-2bb04ccb]{display:flex;flex-direction:column;gap:4px}.ipb-left-drawer__component-item[data-v-2bb04ccb]{display:flex;align-items:center;gap:8px;padding:8px;border-radius:4px;cursor:grab;transition:background .15s;font-size:13px;width:100%;border:0;background:transparent;color:inherit;text-align:left}.ipb-left-drawer__component-item[data-v-2bb04ccb]:hover{background:var(--ipb-hover-bg, #f5f5f5)}.ipb-left-drawer__component-item[data-v-2bb04ccb]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:-1px}.ipb-left-drawer__component-icon[data-v-2bb04ccb]{font-size:16px;width:24px;text-align:center}.ipb-left-drawer__empty[data-v-2bb04ccb]{margin:8px 0 0;font-size:12px;color:var(--ipb-text-muted, #6b7280)}.ipb-prop-editor[data-v-f48156f6]{width:100%;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:13px;box-sizing:border-box}.ipb-prop-editor[data-v-f48156f6]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-prop-editor[data-v-11786ace]{width:100%;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:13px;box-sizing:border-box}.ipb-prop-editor[data-v-11786ace]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-prop-editor--boolean[data-v-cfba94a9]{display:inline-flex;align-items:center;gap:8px;font-size:13px;-webkit-user-select:none;user-select:none}.ipb-prop-editor--boolean input[data-v-cfba94a9]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:2px}.ipb-prop-editor[data-v-8c477cbd]{width:100%;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:13px;box-sizing:border-box;background:var(--ipb-drawer-bg, #fff)}.ipb-prop-editor[data-v-8c477cbd]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-prop-editor--color[data-v-b0f904c5]{display:flex;align-items:center;gap:8px}.ipb-prop-editor__picker[data-v-b0f904c5]{width:40px;height:32px;padding:2px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;background:var(--ipb-drawer-bg, #fff)}.ipb-prop-editor__text[data-v-b0f904c5]{flex:1;min-width:0;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:13px;box-sizing:border-box}.ipb-prop-editor__picker[data-v-b0f904c5]:focus-visible,.ipb-prop-editor__text[data-v-b0f904c5]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-richtext-editor[data-v-d9cdfb46]{border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;overflow:hidden}.ipb-richtext-editor__toolbar[data-v-d9cdfb46]{display:flex;flex-wrap:wrap;gap:4px;padding:6px;border-bottom:1px solid var(--ipb-border-color, #e0e0e0);background:var(--ipb-surface-muted, #f8fafc)}.ipb-richtext-editor__toolbar button[data-v-d9cdfb46]{min-width:30px;height:28px;padding:0 8px;border:1px solid var(--ipb-border-color, #d1d5db);border-radius:4px;background:var(--ipb-drawer-bg, #fff);cursor:pointer;font-size:12px}.ipb-richtext-editor__toolbar button[data-v-d9cdfb46]:hover{background:var(--ipb-surface-hover, #f3f4f6)}.ipb-richtext-editor__toolbar button[data-v-d9cdfb46]:focus-visible,.ipb-richtext-editor__content[data-v-d9cdfb46]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-richtext-editor__content[data-v-d9cdfb46]{min-height:120px;padding:8px;font-size:13px;line-height:1.5;outline:none}.ipb-richtext-editor__content[data-v-d9cdfb46]:empty:before{content:attr(data-placeholder);color:var(--ipb-text-muted, #9ca3af);pointer-events:none}.ipb-media-picker[data-v-743fe73e]{display:flex;flex-direction:column;gap:8px}.ipb-media-picker__controls[data-v-743fe73e]{display:grid;grid-template-columns:minmax(0,1fr) auto auto;gap:8px;align-items:center}.ipb-media-picker__input[data-v-743fe73e]{min-width:0;width:100%;padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;font-size:13px;box-sizing:border-box}.ipb-media-picker__btn[data-v-743fe73e]{padding:6px 8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;background:var(--ipb-drawer-bg, #fff);cursor:pointer;font-size:12px}.ipb-media-picker__input[data-v-743fe73e]:focus-visible,.ipb-media-picker__btn[data-v-743fe73e]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-media-picker__btn[data-v-743fe73e]:disabled{opacity:.5;cursor:not-allowed}.ipb-media-picker__preview[data-v-743fe73e]{border:1px dashed var(--ipb-border-color, #e0e0e0);border-radius:4px;padding:6px;min-height:88px;display:flex;align-items:center;justify-content:center;background:var(--ipb-bg-subtle, #fafafa)}.ipb-media-picker__image[data-v-743fe73e]{max-width:100%;max-height:140px;object-fit:contain;display:block}.ipb-media-picker__empty[data-v-743fe73e]{margin:0;font-size:12px;color:var(--ipb-text-muted, #6b7280);text-align:center}.ipb-right-drawer[data-v-a25cd890]{width:48px;background:var(--ipb-drawer-bg, #fff);border-left:1px solid var(--ipb-border-color, #e0e0e0);transition:width .2s ease;overflow:hidden;flex-shrink:0;display:flex;flex-direction:column}.ipb-right-drawer--open[data-v-a25cd890]{width:320px}.ipb-right-drawer__header[data-v-a25cd890]{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0;padding:12px;border-bottom:1px solid var(--ipb-border-color, #e0e0e0)}.ipb-right-drawer__title[data-v-a25cd890]{font-weight:600;font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ipb-right-drawer__toggle[data-v-a25cd890]{flex-shrink:0;background:none;border:none;cursor:pointer;font-size:12px;padding:4px}.ipb-right-drawer__toggle[data-v-a25cd890]:focus-visible,.ipb-right-drawer__btn[data-v-a25cd890]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:1px}.ipb-right-drawer__content[data-v-a25cd890]{flex:1;overflow-y:auto;padding:16px}.ipb-right-drawer__section[data-v-a25cd890]{margin-bottom:20px}.ipb-right-drawer__section-title[data-v-a25cd890]{font-size:16px;font-weight:600;margin:0 0 4px}.ipb-right-drawer__section-subtitle[data-v-a25cd890]{font-size:12px;text-transform:uppercase;letter-spacing:.05em;color:var(--ipb-text-muted, #6b7280);margin:0 0 12px}.ipb-right-drawer__description[data-v-a25cd890]{font-size:13px;color:var(--ipb-text-muted, #6b7280);margin:0}.ipb-right-drawer__prop[data-v-a25cd890]{margin-bottom:12px}.ipb-right-drawer__prop-label[data-v-a25cd890]{display:block;font-size:12px;font-weight:500;margin-bottom:4px}.ipb-right-drawer__prop-editor[data-v-a25cd890]{width:100%}.ipb-right-drawer__actions[data-v-a25cd890]{display:flex;gap:8px;padding-top:16px;border-top:1px solid var(--ipb-border-color, #e0e0e0)}.ipb-right-drawer__btn[data-v-a25cd890]{flex:1;padding:8px;border:1px solid var(--ipb-border-color, #e0e0e0);border-radius:4px;background:transparent;cursor:pointer;font-size:13px}.ipb-right-drawer__btn--danger[data-v-a25cd890]{color:var(--ipb-danger-color, #dc2626);border-color:var(--ipb-danger-color, #dc2626)}.ipb-right-drawer__btn--danger[data-v-a25cd890]:disabled{opacity:.4;cursor:not-allowed}.ipb-right-drawer__empty[data-v-a25cd890]{padding:24px 16px;text-align:center;color:var(--ipb-text-muted, #6b7280);font-size:13px}.ipb-node-context-menu[data-v-7a59845f]{position:absolute;z-index:30;display:flex;flex-direction:column;min-width:148px;padding:6px;border:1px solid var(--ipb-border-color, #d1d5db);border-radius:8px;background:#fff;box-shadow:0 8px 24px #0f172a29}.ipb-node-context-menu__item[data-v-7a59845f]{border:0;border-radius:6px;background:transparent;color:var(--ipb-text-color, #111827);font-size:13px;line-height:1.4;text-align:left;padding:7px 10px;cursor:pointer}.ipb-node-context-menu__item[data-v-7a59845f]:hover:not(:disabled){background:#3b82f61a}.ipb-node-context-menu__item[data-v-7a59845f]:focus-visible{outline:2px solid var(--ipb-focus-color, #2563eb);outline-offset:-1px}.ipb-node-context-menu__item--danger[data-v-7a59845f]{color:var(--ipb-danger-color, #dc2626)}.ipb-node-context-menu__item[data-v-7a59845f]:disabled{opacity:.45;cursor:not-allowed}.ipb-canvas[data-v-866e17d3]{flex:1;display:flex;align-items:flex-start;justify-content:center;padding:24px;overflow:auto;background:var(--ipb-canvas-bg, #e5e7eb)}.ipb-canvas__viewport[data-v-866e17d3]{position:relative;flex:0 0 auto;background:#fff;box-shadow:0 1px 3px #0000001f,0 1px 2px #0000000f;border-radius:4px;overflow:hidden;transition:width .2s ease,height .2s ease}.ipb-iframe-canvas__stage[data-v-866e17d3]{position:relative;width:100%;height:100%;background:#fff}.ipb-iframe-canvas__frame[data-v-866e17d3]{width:100%;height:100%;border:0;display:block;background:#fff}.ipb-iframe-canvas__fallback[data-v-866e17d3]{position:relative;width:100%;height:100%;background:#fff}.ipb-canvas__overlay[data-v-866e17d3]{position:absolute;pointer-events:none;border-radius:4px;box-sizing:border-box}.ipb-canvas__overlay--hovered[data-v-866e17d3]{border:1px dashed rgba(59,130,246,.75);background:#3b82f614;z-index:10}.ipb-canvas__overlay--drop[data-v-866e17d3]{border:2px dashed rgba(16,185,129,.9);background:#10b98124;z-index:12}.ipb-canvas__overlay--selected[data-v-866e17d3]{border:2px solid rgba(37,99,235,.95);background:#2563eb24;box-shadow:0 0 0 1px #ffffffd9 inset;z-index:11}.ipb-page-editor[data-v-5fd2d41f]{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--ipb-editor-bg, #f0f2f5)}.ipb-page-editor__body[data-v-5fd2d41f]{display:flex;flex:1;overflow:hidden}.ipb-page-builder__warning[data-v-84b8d079]{margin-bottom:.5rem;padding:.625rem .75rem;border:1px solid #f8d7a8;border-radius:.375rem;background-color:#fff8ec;color:#7d4a00;font-size:.875rem}
@@ -0,0 +1,41 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ gap: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ padding: {
9
+ type: StringConstructor;
10
+ default: string;
11
+ };
12
+ align: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
17
+ gap: {
18
+ type: StringConstructor;
19
+ default: string;
20
+ };
21
+ padding: {
22
+ type: StringConstructor;
23
+ default: string;
24
+ };
25
+ align: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ }>> & Readonly<{}>, {
30
+ gap: string;
31
+ padding: string;
32
+ align: string;
33
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, {
34
+ default?: (props: {}) => any;
35
+ }>;
36
+ export default _default;
37
+ type __VLS_WithSlots<T, S> = T & {
38
+ new (): {
39
+ $slots: S;
40
+ };
41
+ };
@@ -0,0 +1,32 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ maxWidth: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ padding: {
9
+ type: StringConstructor;
10
+ default: string;
11
+ };
12
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
13
+ maxWidth: {
14
+ type: StringConstructor;
15
+ default: string;
16
+ };
17
+ padding: {
18
+ type: StringConstructor;
19
+ default: string;
20
+ };
21
+ }>> & Readonly<{}>, {
22
+ padding: string;
23
+ maxWidth: string;
24
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, {
25
+ default?: (props: {}) => any;
26
+ }>;
27
+ export default _default;
28
+ type __VLS_WithSlots<T, S> = T & {
29
+ new (): {
30
+ $slots: S;
31
+ };
32
+ };
@@ -0,0 +1,42 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ src: {
5
+ type: StringConstructor;
6
+ required: true;
7
+ };
8
+ alt: {
9
+ type: StringConstructor;
10
+ default: string;
11
+ };
12
+ width: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ objectFit: {
17
+ type: StringConstructor;
18
+ default: string;
19
+ };
20
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
21
+ src: {
22
+ type: StringConstructor;
23
+ required: true;
24
+ };
25
+ alt: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ width: {
30
+ type: StringConstructor;
31
+ default: string;
32
+ };
33
+ objectFit: {
34
+ type: StringConstructor;
35
+ default: string;
36
+ };
37
+ }>> & Readonly<{}>, {
38
+ width: string;
39
+ alt: string;
40
+ objectFit: string;
41
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
42
+ export default _default;
@@ -0,0 +1,41 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ gap: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ wrap: {
9
+ type: BooleanConstructor;
10
+ default: boolean;
11
+ };
12
+ justify: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
17
+ gap: {
18
+ type: StringConstructor;
19
+ default: string;
20
+ };
21
+ wrap: {
22
+ type: BooleanConstructor;
23
+ default: boolean;
24
+ };
25
+ justify: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ }>> & Readonly<{}>, {
30
+ gap: string;
31
+ wrap: boolean;
32
+ justify: string;
33
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, {
34
+ default?: (props: {}) => any;
35
+ }>;
36
+ export default _default;
37
+ type __VLS_WithSlots<T, S> = T & {
38
+ new (): {
39
+ $slots: S;
40
+ };
41
+ };
@@ -0,0 +1,50 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: __VLS_WithSlots<import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ backgroundColor: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ backgroundImage: {
9
+ type: StringConstructor;
10
+ default: string;
11
+ };
12
+ padding: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ maxWidth: {
17
+ type: StringConstructor;
18
+ default: string;
19
+ };
20
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
21
+ backgroundColor: {
22
+ type: StringConstructor;
23
+ default: string;
24
+ };
25
+ backgroundImage: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ padding: {
30
+ type: StringConstructor;
31
+ default: string;
32
+ };
33
+ maxWidth: {
34
+ type: StringConstructor;
35
+ default: string;
36
+ };
37
+ }>> & Readonly<{}>, {
38
+ padding: string;
39
+ maxWidth: string;
40
+ backgroundColor: string;
41
+ backgroundImage: string;
42
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>, {
43
+ default?: (props: {}) => any;
44
+ }>;
45
+ export default _default;
46
+ type __VLS_WithSlots<T, S> = T & {
47
+ new (): {
48
+ $slots: S;
49
+ };
50
+ };
@@ -0,0 +1,25 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ content: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ tag: {
9
+ type: StringConstructor;
10
+ default: string;
11
+ };
12
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
13
+ content: {
14
+ type: StringConstructor;
15
+ default: string;
16
+ };
17
+ tag: {
18
+ type: StringConstructor;
19
+ default: string;
20
+ };
21
+ }>> & Readonly<{}>, {
22
+ content: string;
23
+ tag: string;
24
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
25
+ export default _default;
@@ -0,0 +1,27 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ export declare const builderOptions: IComponentDefinition;
3
+ declare const _default: import("vue").DefineComponent<{
4
+ src: string;
5
+ poster?: string;
6
+ width?: string;
7
+ controls?: boolean;
8
+ autoplay?: boolean;
9
+ muted?: boolean;
10
+ loop?: boolean;
11
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
12
+ src: string;
13
+ poster?: string;
14
+ width?: string;
15
+ controls?: boolean;
16
+ autoplay?: boolean;
17
+ muted?: boolean;
18
+ loop?: boolean;
19
+ }> & Readonly<{}>, {
20
+ width: string;
21
+ poster: string;
22
+ controls: boolean;
23
+ autoplay: boolean;
24
+ muted: boolean;
25
+ loop: boolean;
26
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
27
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import type { IComponentDefinition } from '@/types/component';
2
+ import PbColumn from './PbColumn.vue';
3
+ import PbRow from './PbRow.vue';
4
+ import PbText from './PbText.vue';
5
+ import PbImage from './PbImage.vue';
6
+ import PbVideo from './PbVideo.vue';
7
+ import PbSection from './PbSection.vue';
8
+ import PbContainer from './PbContainer.vue';
9
+ export declare const builtInComponents: IComponentDefinition[];
10
+ export { PbColumn, PbRow, PbText, PbImage, PbVideo, PbSection, PbContainer, };
@@ -0,0 +1,50 @@
1
+ import { type PropType } from 'vue';
2
+ import type { IPageData, INode, IPageSavePayload } from '@/types/node';
3
+ import type { PageBuilderMode } from '@/types/editor';
4
+ import { type TranslationDictionary } from '@/i18n';
5
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
6
+ pageData: {
7
+ type: PropType<IPageData>;
8
+ required: true;
9
+ };
10
+ mode: {
11
+ type: PropType<PageBuilderMode>;
12
+ default: string;
13
+ };
14
+ locale: {
15
+ type: StringConstructor;
16
+ default: undefined;
17
+ };
18
+ messages: {
19
+ type: PropType<TranslationDictionary>;
20
+ default: undefined;
21
+ };
22
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
23
+ save: (payload: IPageSavePayload) => any;
24
+ change: (tree: INode) => any;
25
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
26
+ pageData: {
27
+ type: PropType<IPageData>;
28
+ required: true;
29
+ };
30
+ mode: {
31
+ type: PropType<PageBuilderMode>;
32
+ default: string;
33
+ };
34
+ locale: {
35
+ type: StringConstructor;
36
+ default: undefined;
37
+ };
38
+ messages: {
39
+ type: PropType<TranslationDictionary>;
40
+ default: undefined;
41
+ };
42
+ }>> & Readonly<{
43
+ onSave?: ((payload: IPageSavePayload) => any) | undefined;
44
+ onChange?: ((tree: INode) => any) | undefined;
45
+ }>, {
46
+ locale: string;
47
+ messages: TranslationDictionary;
48
+ mode: PageBuilderMode;
49
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
50
+ export default _default;
@@ -0,0 +1,67 @@
1
+ import { type PropType } from 'vue';
2
+ import type { INode } from '@/types/node';
3
+ import type { ViewportPreset } from '@/types/editor';
4
+ import { type NodeContextMenuAction } from './NodeContextMenu.vue';
5
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
6
+ content: {
7
+ type: PropType<INode>;
8
+ required: true;
9
+ };
10
+ variables: {
11
+ type: PropType<Record<string, string>>;
12
+ default: () => {};
13
+ };
14
+ selectedNodeId: {
15
+ type: PropType<number | null>;
16
+ default: null;
17
+ };
18
+ hoveredNodeId: {
19
+ type: PropType<number | null>;
20
+ default: null;
21
+ };
22
+ viewport: {
23
+ type: PropType<ViewportPreset>;
24
+ default: string;
25
+ };
26
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
27
+ select: (nodeId: number | null) => any;
28
+ hover: (nodeId: number | null) => any;
29
+ "context-action": (payload: {
30
+ action: NodeContextMenuAction;
31
+ nodeId: number;
32
+ }) => any;
33
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
34
+ content: {
35
+ type: PropType<INode>;
36
+ required: true;
37
+ };
38
+ variables: {
39
+ type: PropType<Record<string, string>>;
40
+ default: () => {};
41
+ };
42
+ selectedNodeId: {
43
+ type: PropType<number | null>;
44
+ default: null;
45
+ };
46
+ hoveredNodeId: {
47
+ type: PropType<number | null>;
48
+ default: null;
49
+ };
50
+ viewport: {
51
+ type: PropType<ViewportPreset>;
52
+ default: string;
53
+ };
54
+ }>> & Readonly<{
55
+ onSelect?: ((nodeId: number | null) => any) | undefined;
56
+ onHover?: ((nodeId: number | null) => any) | undefined;
57
+ "onContext-action"?: ((payload: {
58
+ action: NodeContextMenuAction;
59
+ nodeId: number;
60
+ }) => any) | undefined;
61
+ }>, {
62
+ variables: Record<string, string>;
63
+ selectedNodeId: number | null;
64
+ hoveredNodeId: number | null;
65
+ viewport: ViewportPreset;
66
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
67
+ export default _default;
@@ -0,0 +1,97 @@
1
+ import { type PropType } from 'vue';
2
+ import type { ViewportPreset } from '@/types/editor';
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ canUndo: {
5
+ type: BooleanConstructor;
6
+ default: boolean;
7
+ };
8
+ canRedo: {
9
+ type: BooleanConstructor;
10
+ default: boolean;
11
+ };
12
+ isDirty: {
13
+ type: BooleanConstructor;
14
+ default: boolean;
15
+ };
16
+ viewport: {
17
+ type: PropType<ViewportPreset>;
18
+ default: string;
19
+ };
20
+ customViewportWidth: {
21
+ type: NumberConstructor;
22
+ default: number;
23
+ };
24
+ customViewportHeight: {
25
+ type: NumberConstructor;
26
+ default: number;
27
+ };
28
+ activeViewportWidth: {
29
+ type: PropType<number | null>;
30
+ default: null;
31
+ };
32
+ activeViewportHeight: {
33
+ type: PropType<number | null>;
34
+ default: null;
35
+ };
36
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
37
+ undo: () => any;
38
+ redo: () => any;
39
+ save: () => any;
40
+ "viewport-change": (preset: ViewportPreset) => any;
41
+ "custom-viewport-change": (payload: {
42
+ width: number;
43
+ height: number;
44
+ }) => any;
45
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
46
+ canUndo: {
47
+ type: BooleanConstructor;
48
+ default: boolean;
49
+ };
50
+ canRedo: {
51
+ type: BooleanConstructor;
52
+ default: boolean;
53
+ };
54
+ isDirty: {
55
+ type: BooleanConstructor;
56
+ default: boolean;
57
+ };
58
+ viewport: {
59
+ type: PropType<ViewportPreset>;
60
+ default: string;
61
+ };
62
+ customViewportWidth: {
63
+ type: NumberConstructor;
64
+ default: number;
65
+ };
66
+ customViewportHeight: {
67
+ type: NumberConstructor;
68
+ default: number;
69
+ };
70
+ activeViewportWidth: {
71
+ type: PropType<number | null>;
72
+ default: null;
73
+ };
74
+ activeViewportHeight: {
75
+ type: PropType<number | null>;
76
+ default: null;
77
+ };
78
+ }>> & Readonly<{
79
+ onUndo?: (() => any) | undefined;
80
+ onRedo?: (() => any) | undefined;
81
+ onSave?: (() => any) | undefined;
82
+ "onViewport-change"?: ((preset: ViewportPreset) => any) | undefined;
83
+ "onCustom-viewport-change"?: ((payload: {
84
+ width: number;
85
+ height: number;
86
+ }) => any) | undefined;
87
+ }>, {
88
+ isDirty: boolean;
89
+ viewport: ViewportPreset;
90
+ canUndo: boolean;
91
+ canRedo: boolean;
92
+ customViewportWidth: number;
93
+ customViewportHeight: number;
94
+ activeViewportWidth: number | null;
95
+ activeViewportHeight: number | null;
96
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
97
+ export default _default;
@@ -0,0 +1,102 @@
1
+ import { type PropType } from 'vue';
2
+ import { type IframeBridgeKeydownPayload } from '@/core/iframe-bridge';
3
+ import type { INode } from '@/types/node';
4
+ import type { IViewportSize, ViewportPreset } from '@/types/editor';
5
+ import { type NodeContextMenuAction } from './NodeContextMenu.vue';
6
+ interface IframeCanvasKeydownPayload extends IframeBridgeKeydownPayload {
7
+ preventDefault: () => void;
8
+ }
9
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
10
+ content: {
11
+ type: PropType<INode>;
12
+ required: true;
13
+ };
14
+ layout: {
15
+ type: PropType<INode | null>;
16
+ default: null;
17
+ };
18
+ variables: {
19
+ type: PropType<Record<string, string>>;
20
+ default: () => {};
21
+ };
22
+ selectedNodeId: {
23
+ type: PropType<number | null>;
24
+ default: null;
25
+ };
26
+ hoveredNodeId: {
27
+ type: PropType<number | null>;
28
+ default: null;
29
+ };
30
+ viewport: {
31
+ type: PropType<ViewportPreset>;
32
+ default: string;
33
+ };
34
+ viewportWidth: {
35
+ type: PropType<number | null>;
36
+ default: null;
37
+ };
38
+ viewportHeight: {
39
+ type: PropType<number | null>;
40
+ default: null;
41
+ };
42
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
43
+ select: (nodeId: number | null) => any;
44
+ hover: (nodeId: number | null) => any;
45
+ "context-action": (payload: {
46
+ action: NodeContextMenuAction;
47
+ nodeId: number;
48
+ }) => any;
49
+ "iframe-keydown": (payload: IframeCanvasKeydownPayload) => any;
50
+ "viewport-size-change": (payload: IViewportSize) => any;
51
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
52
+ content: {
53
+ type: PropType<INode>;
54
+ required: true;
55
+ };
56
+ layout: {
57
+ type: PropType<INode | null>;
58
+ default: null;
59
+ };
60
+ variables: {
61
+ type: PropType<Record<string, string>>;
62
+ default: () => {};
63
+ };
64
+ selectedNodeId: {
65
+ type: PropType<number | null>;
66
+ default: null;
67
+ };
68
+ hoveredNodeId: {
69
+ type: PropType<number | null>;
70
+ default: null;
71
+ };
72
+ viewport: {
73
+ type: PropType<ViewportPreset>;
74
+ default: string;
75
+ };
76
+ viewportWidth: {
77
+ type: PropType<number | null>;
78
+ default: null;
79
+ };
80
+ viewportHeight: {
81
+ type: PropType<number | null>;
82
+ default: null;
83
+ };
84
+ }>> & Readonly<{
85
+ onSelect?: ((nodeId: number | null) => any) | undefined;
86
+ onHover?: ((nodeId: number | null) => any) | undefined;
87
+ "onContext-action"?: ((payload: {
88
+ action: NodeContextMenuAction;
89
+ nodeId: number;
90
+ }) => any) | undefined;
91
+ "onIframe-keydown"?: ((payload: IframeCanvasKeydownPayload) => any) | undefined;
92
+ "onViewport-size-change"?: ((payload: IViewportSize) => any) | undefined;
93
+ }>, {
94
+ layout: INode | null;
95
+ variables: Record<string, string>;
96
+ selectedNodeId: number | null;
97
+ hoveredNodeId: number | null;
98
+ viewport: ViewportPreset;
99
+ viewportWidth: number | null;
100
+ viewportHeight: number | null;
101
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
102
+ export default _default;
@@ -0,0 +1,46 @@
1
+ import { type PropType } from 'vue';
2
+ import type { INode } from '@/types/node';
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ open: {
5
+ type: BooleanConstructor;
6
+ default: boolean;
7
+ };
8
+ content: {
9
+ type: PropType<INode | null>;
10
+ default: null;
11
+ };
12
+ selectedNodeId: {
13
+ type: PropType<number | null>;
14
+ default: null;
15
+ };
16
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
17
+ select: (nodeId: number) => any;
18
+ add: (componentName: string) => any;
19
+ toggle: () => any;
20
+ dragStart: (componentName: string) => any;
21
+ dragEnd: () => any;
22
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
23
+ open: {
24
+ type: BooleanConstructor;
25
+ default: boolean;
26
+ };
27
+ content: {
28
+ type: PropType<INode | null>;
29
+ default: null;
30
+ };
31
+ selectedNodeId: {
32
+ type: PropType<number | null>;
33
+ default: null;
34
+ };
35
+ }>> & Readonly<{
36
+ onSelect?: ((nodeId: number) => any) | undefined;
37
+ onAdd?: ((componentName: string) => any) | undefined;
38
+ onToggle?: (() => any) | undefined;
39
+ onDragStart?: ((componentName: string) => any) | undefined;
40
+ onDragEnd?: (() => any) | undefined;
41
+ }>, {
42
+ content: INode | null;
43
+ selectedNodeId: number | null;
44
+ open: boolean;
45
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
46
+ export default _default;