@g1cloud/page-builder-editor 1.0.0-alpha.37 → 1.0.0-alpha.39

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.
@@ -208,6 +208,10 @@
208
208
  }
209
209
 
210
210
  .pb-part-add-modal {
211
+ .section-title {
212
+ font-weight: 700;
213
+ }
214
+
211
215
  .group {
212
216
 
213
217
  .part {
package/css/page.scss CHANGED
@@ -4,12 +4,6 @@
4
4
  @import 'page-block';
5
5
  @import 'page-widget';
6
6
 
7
- .font-icon {
8
- font-family: Material Symbols Outlined, monospace;
9
- font-size: 1rem;
10
- max-width: 1em;
11
- }
12
-
13
7
  body {
14
8
  margin: 0;
15
9
  padding: 0;
@@ -17,6 +11,12 @@ body {
17
11
  overflow: hidden;
18
12
  }
19
13
 
14
+ .font-icon, .material-icons-outlined {
15
+ font-family: "Material Symbols Outlined", monospace;
16
+ font-size: 1rem;
17
+ max-width: 1em;
18
+ }
19
+
20
20
  .pb-position-mark {
21
21
  background-color: #ff3333;
22
22
  opacity: 0.5;
@@ -62,6 +62,7 @@ body {
62
62
  }
63
63
 
64
64
  > i {
65
+ font-style: normal;
65
66
  vertical-align: middle;
66
67
  position: absolute;
67
68
  top: 50%;
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, createVNode, unref } from "vue";
2
2
  import { BSTextInput } from "@g1cloud/bluesea";
3
- import { P as PbColorPicker } from "./index-D1WOGghM.js";
3
+ import { P as PbColorPicker } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-color" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = ["textContent"];
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, defineAsyncComponent } from "vue";
2
2
  import { useModal } from "@g1cloud/bluesea";
3
- import { u as usePageBuilderEditor } from "./index-D1WOGghM.js";
3
+ import { u as usePageBuilderEditor } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-image flex-align-center" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = ["textContent"];
@@ -1,5 +1,5 @@
1
1
  import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString } from "vue";
2
- import { u as usePageBuilderEditor } from "./index-D1WOGghM.js";
2
+ import { u as usePageBuilderEditor } from "./index-CujMrKaK.js";
3
3
  import { useModal } from "@g1cloud/bluesea";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-image flex-align-center" };
5
5
  const _hoisted_2 = { class: "title" };
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, toDisplayString, createBlock, unref } from "vue";
2
2
  import { BSMultiLangTextArea, BSTextArea } from "@g1cloud/bluesea";
3
- import { u as usePageBuilderEditor } from "./index-D1WOGghM.js";
3
+ import { u as usePageBuilderEditor } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-multiline-text" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = ["textContent"];
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, computed, openBlock, createElementBlock, createElementVNode, toDisplayString, createBlock, unref } from "vue";
2
2
  import { BSMultiLangTextInput, BSTextInput } from "@g1cloud/bluesea";
3
- import { u as usePageBuilderEditor } from "./index-D1WOGghM.js";
3
+ import { u as usePageBuilderEditor } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-text flex-align-center" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = ["textContent"];
@@ -1,6 +1,6 @@
1
1
  import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString } from "vue";
2
2
  import { useModal } from "@g1cloud/bluesea";
3
- import { s as selectYoutubeVideo } from "./index-D1WOGghM.js";
3
+ import { s as selectYoutubeVideo } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "property-editor property-editor-image flex-align-center" };
5
5
  const _hoisted_2 = { class: "title" };
6
6
  const _hoisted_3 = ["textContent"];
@@ -1,12 +1,13 @@
1
1
  import { defineComponent, computed, openBlock, createBlock, unref, withCtx, createElementVNode, createElementBlock, Fragment, renderList, toDisplayString } from "vue";
2
2
  import { useModalHandle, BSModalFrame } from "@g1cloud/bluesea";
3
- import { w as widgetPartDefinitions } from "./index-D1WOGghM.js";
3
+ import { w as widgetPartDefinitions } from "./index-CujMrKaK.js";
4
4
  const _hoisted_1 = { class: "bs-layout-vertical pb-part-add-modal" };
5
5
  const _hoisted_2 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
6
6
  const _hoisted_3 = ["onClick", "textContent"];
7
7
  const _hoisted_4 = { class: "group mb-16" };
8
- const _hoisted_5 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
9
- const _hoisted_6 = ["onClick", "textContent"];
8
+ const _hoisted_5 = ["textContent"];
9
+ const _hoisted_6 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
10
+ const _hoisted_7 = ["onClick", "textContent"];
10
11
  const _sfc_main = /* @__PURE__ */ defineComponent({
11
12
  __name: "PbWidgetAddModal",
12
13
  props: {
@@ -25,7 +26,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
25
26
  modalHandle.close();
26
27
  };
27
28
  return (_ctx, _cache) => {
28
- return openBlock(), createBlock(unref(BSModalFrame), { title: "Add Block/Widget" }, {
29
+ return openBlock(), createBlock(unref(BSModalFrame), { title: "Add Widget" }, {
29
30
  default: withCtx(() => [
30
31
  createElementVNode("div", _hoisted_1, [
31
32
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(widgetPartDefinitions), (group) => {
@@ -34,14 +35,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
34
35
  class: "group mb-16"
35
36
  }, [
36
37
  _cache[0] || (_cache[0] = createElementVNode("div", {
37
- class: "mb-8",
38
+ class: "mb-8 section-title",
38
39
  textContent: "Basic Widgets"
39
40
  }, null, -1)),
40
41
  createElementVNode("div", _hoisted_2, [
41
42
  (openBlock(true), createElementBlock(Fragment, null, renderList(group.partDefinitions, (part) => {
42
43
  return openBlock(), createElementBlock("div", {
43
44
  key: part.partName,
44
- class: "part",
45
+ class: "part w-200",
45
46
  onClick: ($event) => select(part),
46
47
  textContent: toDisplayString(part.caption)
47
48
  }, null, 8, _hoisted_3);
@@ -49,22 +50,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
49
50
  ])
50
51
  ]);
51
52
  }), 128)),
52
- createElementVNode("div", _hoisted_4, [
53
- _cache[1] || (_cache[1] = createElementVNode("div", {
54
- class: "mb-8",
55
- textContent: "Custom Widgets"
56
- }, null, -1)),
57
- createElementVNode("div", _hoisted_5, [
58
- (openBlock(true), createElementBlock(Fragment, null, renderList(customWidgets.value, (part) => {
59
- return openBlock(), createElementBlock("div", {
60
- key: part.partName,
61
- class: "part",
62
- onClick: ($event) => select(part),
63
- textContent: toDisplayString(part.caption)
64
- }, null, 8, _hoisted_6);
65
- }), 128))
66
- ])
67
- ])
53
+ (openBlock(true), createElementBlock(Fragment, null, renderList(customWidgets.value, (group) => {
54
+ return openBlock(), createElementBlock("div", _hoisted_4, [
55
+ createElementVNode("div", {
56
+ class: "mb-8 section-title",
57
+ textContent: toDisplayString(group.caption)
58
+ }, null, 8, _hoisted_5),
59
+ createElementVNode("div", _hoisted_6, [
60
+ (openBlock(true), createElementBlock(Fragment, null, renderList(group.partDefinitions, (part) => {
61
+ return openBlock(), createElementBlock("div", {
62
+ key: part.partName,
63
+ class: "part w-200",
64
+ onClick: ($event) => select(part),
65
+ textContent: toDisplayString(part.caption)
66
+ }, null, 8, _hoisted_7);
67
+ }), 128))
68
+ ])
69
+ ]);
70
+ }), 256))
68
71
  ])
69
72
  ]),
70
73
  _: 1
@@ -7225,6 +7225,13 @@ const _sfc_main$4$1 = /* @__PURE__ */ defineComponent({
7225
7225
  placeholder: { type: Boolean }
7226
7226
  },
7227
7227
  setup(__props) {
7228
+ const props = __props;
7229
+ const style = computed(() => {
7230
+ var _a;
7231
+ return {
7232
+ aspectRatio: (_a = props.part.properties) == null ? void 0 : _a.aspectRatio
7233
+ };
7234
+ });
7228
7235
  const onReady = () => {
7229
7236
  };
7230
7237
  return (_ctx, _cache) => {
@@ -7233,11 +7240,12 @@ const _sfc_main$4$1 = /* @__PURE__ */ defineComponent({
7233
7240
  key: 0,
7234
7241
  ref: "youtube",
7235
7242
  src: ((_b = _ctx.part.properties) == null ? void 0 : _b.url) || "",
7243
+ style: normalizeStyle(style.value),
7236
7244
  class: "youtube",
7237
7245
  height: "100%",
7238
7246
  width: "100%",
7239
7247
  onReady
7240
- }, null, 8, ["src"])) : _ctx.placeholder ? (openBlock(), createElementBlock("div", _hoisted_1$3$1, _cache[0] || (_cache[0] = [
7248
+ }, null, 8, ["src", "style"])) : _ctx.placeholder ? (openBlock(), createElementBlock("div", _hoisted_1$3$1, _cache[0] || (_cache[0] = [
7241
7249
  createElementVNode("span", { class: "font-icon" }, "live_tv", -1)
7242
7250
  ]))) : createCommentVNode("", true);
7243
7251
  };
@@ -8145,15 +8153,15 @@ class PartManager {
8145
8153
  const defaultPartPropertyEditors = () => {
8146
8154
  return {
8147
8155
  "readonly-text": () => defineAsyncComponent(() => import("./PbPropertyEditorReadonlyText-Dgp_AVOD.js")),
8148
- "text": () => defineAsyncComponent(() => import("./PbPropertyEditorText-DYFsKLw3.js")),
8156
+ "text": () => defineAsyncComponent(() => import("./PbPropertyEditorText-6sglUVrs.js")),
8149
8157
  "number": () => defineAsyncComponent(() => import("./PbPropertyEditorNumber-TTgo0zbQ.js")),
8150
8158
  "boolean": () => defineAsyncComponent(() => import("./PbPropertyEditorBoolean-C7-iSAtn.js")),
8151
- "multiline-text": () => defineAsyncComponent(() => import("./PbPropertyEditorMultilineText-D06TJqWF.js")),
8159
+ "multiline-text": () => defineAsyncComponent(() => import("./PbPropertyEditorMultilineText-BZHzQltK.js")),
8152
8160
  "select": () => defineAsyncComponent(() => import("./PbPropertyEditorSelect-CWedbXJI.js")),
8153
- "color": () => defineAsyncComponent(() => import("./PbPropertyEditorColor-Dk0MS-6z.js")),
8154
- "image": () => defineAsyncComponent(() => import("./PbPropertyEditorImage-zMooa_HL.js")),
8155
- "html": () => defineAsyncComponent(() => import("./PbPropertyEditorHtml-DASXlPF1.js")),
8156
- "youtube": () => defineAsyncComponent(() => import("./PbPropertyEditorYoutube-CT1pn88F.js"))
8161
+ "color": () => defineAsyncComponent(() => import("./PbPropertyEditorColor-CxzuXdSU.js")),
8162
+ "image": () => defineAsyncComponent(() => import("./PbPropertyEditorImage-BUrb2xHD.js")),
8163
+ "html": () => defineAsyncComponent(() => import("./PbPropertyEditorHtml-CAwd0B2-.js")),
8164
+ "youtube": () => defineAsyncComponent(() => import("./PbPropertyEditorYoutube-D4YwWYvB.js"))
8157
8165
  };
8158
8166
  };
8159
8167
  const getPropertyValueOfParts = (parts, propertyName) => {
@@ -12373,12 +12381,20 @@ const widgets = [
12373
12381
  caption: "URL",
12374
12382
  propertyType: "youtube",
12375
12383
  params: ""
12384
+ },
12385
+ {
12386
+ propertyName: "aspectRatio",
12387
+ caption: "Apect Ration",
12388
+ propertyType: "text",
12389
+ params: ""
12376
12390
  }
12377
12391
  ]
12378
12392
  },
12379
12393
  ...defaultWidgetPropertyGroups()
12380
12394
  ],
12381
- initialProperties: {},
12395
+ initialProperties: {
12396
+ aspectRatio: "16/9"
12397
+ },
12382
12398
  allowsChild: () => false,
12383
12399
  creator: () => _sfc_main$4$1
12384
12400
  },
@@ -12487,7 +12503,7 @@ __publicField(_OpenAddWidgetModalCommand, "COMMAND_ID", "OpenAddWidgetModal");
12487
12503
  let OpenAddWidgetModalCommand = _OpenAddWidgetModalCommand;
12488
12504
  const openWidgetAddModal = (modal, args, callback) => {
12489
12505
  modal.openModal({
12490
- component: defineAsyncComponent(() => import("./PbWidgetAddModal-CuuohgRc.js")),
12506
+ component: defineAsyncComponent(() => import("./PbWidgetAddModal-B1D1-muE.js")),
12491
12507
  style: {
12492
12508
  width: "80%",
12493
12509
  height: "80%",
@@ -13713,7 +13729,6 @@ class PageBuilderEditorImpl {
13713
13729
  __publicField(this, "locale", ref("en"));
13714
13730
  __publicField(this, "locales", ref(["en"]));
13715
13731
  __publicField(this, "customWidgets", []);
13716
- __publicField(this, "watchers", {});
13717
13732
  __publicField(this, "providers", {});
13718
13733
  __publicField(this, "externalCssLinks", []);
13719
13734
  __publicField(this, "externalCssContent", "");
@@ -13755,22 +13770,28 @@ class PageBuilderEditorImpl {
13755
13770
  registerCustomPlugin(plugin) {
13756
13771
  if (plugin.widgets) {
13757
13772
  const partDefinitions2 = {};
13758
- plugin.widgets.forEach((v) => {
13759
- const w = { ...v };
13760
- w.partType = "Widget";
13761
- w.creator = () => _sfc_main$q;
13762
- w.propertyGroups = [...w.propertyGroups, ...defaultWidgetPropertyGroups()];
13763
- partDefinitions2[v.partName] = w;
13764
- const found = this.customWidgets.find((x) => x.partName === v.partName);
13765
- if (!found) {
13766
- this.customWidgets.push(w);
13773
+ plugin.widgets.forEach((group) => {
13774
+ if (group.partDefinitions && group.partDefinitions.length) {
13775
+ const g = {
13776
+ groupName: group.groupName,
13777
+ caption: group.caption,
13778
+ partDefinitions: []
13779
+ };
13780
+ group.partDefinitions.forEach((part) => {
13781
+ const p = { ...part };
13782
+ p.partType = "Widget";
13783
+ p.creator = () => _sfc_main$q;
13784
+ p.propertyGroups = [...p.propertyGroups, ...defaultWidgetPropertyGroups()];
13785
+ partDefinitions2[p.partName] = p;
13786
+ g.partDefinitions.push(p);
13787
+ });
13788
+ if (g.partDefinitions && g.partDefinitions.length) {
13789
+ this.customWidgets.push(g);
13790
+ }
13767
13791
  }
13768
13792
  });
13769
13793
  this.partManager.registerPartDefinitions(partDefinitions2);
13770
13794
  }
13771
- if (plugin.watchers) {
13772
- this.watchers = { ...this.providers, ...plugin.watchers };
13773
- }
13774
13795
  if (plugin.providers) {
13775
13796
  this.providers = { ...this.providers, ...plugin.providers };
13776
13797
  }
@@ -14508,7 +14529,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
14508
14529
  };
14509
14530
  }
14510
14531
  });
14511
- const canvasStyle = '.pb-page-wrapper {\n margin: 0 auto;\n padding: 0;\n}\n\n.pb-page {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding-bottom: 100px;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.pb-page .pb-page-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.pb-page .pb-page-content.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-page * {\n box-sizing: border-box;\n}\n\n.pb-add-widget-button {\n width: 100%;\n height: 100%;\n min-height: 200px;\n position: relative;\n}\n\n.pb-add-widget-button button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 8px;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.pb-add-widget-button button:hover {\n background-color: #eeeeee;\n}\n\n.pb-add-widget-button .icon {\n font-size: 1rem;\n vertical-align: middle;\n}\n\n.pb-add-widget-button .text {\n font-size: 1rem;\n vertical-align: middle;\n margin-left: 0.4rem;\n}\n\n.pb-section {\n display: flex;\n position: relative;\n width: 100%;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n outline: 1px dashed #ccc;\n background-color: #fff;\n}\n\n.pb-section:hover:not(:has(.pb-block:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-section.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static {\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static:after {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.pb-section-static .pb-widget {\n outline: none;\n}\n\n.pb-block {\n display: flex;\n min-width: 1px;\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n outline: 1px dashed #ccc;\n}\n\n.pb-block:hover:not(:has(.pb-widget:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-block.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget {\n position: relative;\n outline: 1px dashed #ccc;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n pointer-events: auto !important;\n}\n\n.pb-widget * {\n pointer-events: none;\n}\n\n.pb-widget.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-widget .pan-handle {\n position: absolute;\n left: -6px;\n top: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: move;\n pointer-events: auto !important;\n}\n\n.pb-widget .resize-handle {\n position: absolute;\n right: -6px;\n bottom: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: nwse-resize;\n pointer-events: auto !important;\n}\n\n.pb-widget {\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-text-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-text-widget .text {\n color: #333;\n}\n\n.pb-text-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-image-widget {\n width: 100%;\n}\n\n.pb-image-widget .image {\n width: 100%;\n}\n\n.pb-image-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-image-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-html-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-html-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-iframe-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-iframe-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-youtube-widget {\n width: 100%;\n}\n\n.pb-youtube-widget .youtube {\n width: 100%;\n height: 100%;\n}\n\n.pb-youtube-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-youtube-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-container-widget {\n width: 100%;\n}\n\n.pb-container-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-container-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-product-list-widget {\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n\n.pb-product-list-widget .product-wrapper {\n width: 25%;\n}\n\n.pb-product-list-widget .product-wrapper .product {\n width: 95%;\n margin: 0 auto;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n.pb-product-list-widget .product-wrapper img {\n width: 100%;\n}\n\n.pb-product-list-widget .product-wrapper .name {\n margin-top: 8px;\n font-size: 14px;\n}\n\n.pb-product-list-widget .product-wrapper .price {\n margin-top: 8px;\n font-size: 14px;\n font-weight: bold;\n}\n\n.pb-product-list-widget .product-wrapper .empty {\n height: 200px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-product-list-widget .product-wrapper .empty span {\n font-size: 40px;\n color: #999;\n line-height: 200px;\n vertical-align: middle;\n}\n\n@media (max-width: 768px) {\n .pb-product-list-widget .product-wrapper {\n width: 50%;\n }\n}\n\n.mobile .pb-product-list-widget .product-wrapper {\n width: 50%;\n}\n\n.pb-login-widget {\n height: 200px;\n text-align: center;\n}\n\n.pb-login-widget h3 {\n padding: 0;\n margin: 0;\n font-size: 32px;\n font-weight: bold;\n color: #ccc;\n line-height: 200px;\n vertical-align: middle;\n}\n\n.font-icon {\n font-family: Material Symbols Outlined, monospace;\n font-size: 1rem;\n max-width: 1em;\n}\n\nbody {\n margin: 0;\n padding: 0;\n background-color: #aaa;\n overflow: hidden;\n}\n\n.pb-position-mark {\n background-color: #ff3333;\n opacity: 0.5;\n border-radius: 2px;\n}\n\n.pb-add-section-handle {\n position: relative;\n text-align: center;\n cursor: pointer;\n z-index: 5;\n height: 0;\n}\n\n.pb-add-section-handle.top::before, .pb-add-section-handle.bottom::before, .pb-add-section-handle.middle::before {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.pb-add-section-handle.bottom {\n bottom: -32px;\n}\n\n.pb-add-section-handle:hover.top::before, .pb-add-section-handle:hover.bottom::before, .pb-add-section-handle:hover.middle::before,\n.pb-add-section-handle:hover > i {\n opacity: 1;\n}\n\n.pb-add-section-handle > i {\n vertical-align: middle;\n position: absolute;\n top: 50%;\n left: 0;\n font-size: 2rem;\n transform: translate(-50%, -50%);\n opacity: 0.2;\n}';
14532
+ const canvasStyle = '.pb-page-wrapper {\n margin: 0 auto;\n padding: 0;\n}\n\n.pb-page {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding-bottom: 100px;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.pb-page .pb-page-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.pb-page .pb-page-content.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-page * {\n box-sizing: border-box;\n}\n\n.pb-add-widget-button {\n width: 100%;\n height: 100%;\n min-height: 200px;\n position: relative;\n}\n\n.pb-add-widget-button button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 8px;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.pb-add-widget-button button:hover {\n background-color: #eeeeee;\n}\n\n.pb-add-widget-button .icon {\n font-size: 1rem;\n vertical-align: middle;\n}\n\n.pb-add-widget-button .text {\n font-size: 1rem;\n vertical-align: middle;\n margin-left: 0.4rem;\n}\n\n.pb-section {\n display: flex;\n position: relative;\n width: 100%;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n outline: 1px dashed #ccc;\n background-color: #fff;\n}\n\n.pb-section:hover:not(:has(.pb-block:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-section.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static {\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static:after {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.pb-section-static .pb-widget {\n outline: none;\n}\n\n.pb-block {\n display: flex;\n min-width: 1px;\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n outline: 1px dashed #ccc;\n}\n\n.pb-block:hover:not(:has(.pb-widget:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-block.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget {\n position: relative;\n outline: 1px dashed #ccc;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n pointer-events: auto !important;\n}\n\n.pb-widget * {\n pointer-events: none;\n}\n\n.pb-widget.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-widget .pan-handle {\n position: absolute;\n left: -6px;\n top: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: move;\n pointer-events: auto !important;\n}\n\n.pb-widget .resize-handle {\n position: absolute;\n right: -6px;\n bottom: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: nwse-resize;\n pointer-events: auto !important;\n}\n\n.pb-widget {\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-text-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-text-widget .text {\n color: #333;\n}\n\n.pb-text-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-image-widget {\n width: 100%;\n}\n\n.pb-image-widget .image {\n width: 100%;\n}\n\n.pb-image-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-image-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-html-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-html-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-iframe-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-iframe-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-youtube-widget {\n width: 100%;\n}\n\n.pb-youtube-widget .youtube {\n width: 100%;\n height: 100%;\n}\n\n.pb-youtube-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-youtube-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-container-widget {\n width: 100%;\n}\n\n.pb-container-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-container-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-product-list-widget {\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n\n.pb-product-list-widget .product-wrapper {\n width: 25%;\n}\n\n.pb-product-list-widget .product-wrapper .product {\n width: 95%;\n margin: 0 auto;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n.pb-product-list-widget .product-wrapper img {\n width: 100%;\n}\n\n.pb-product-list-widget .product-wrapper .name {\n margin-top: 8px;\n font-size: 14px;\n}\n\n.pb-product-list-widget .product-wrapper .price {\n margin-top: 8px;\n font-size: 14px;\n font-weight: bold;\n}\n\n.pb-product-list-widget .product-wrapper .empty {\n height: 200px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-product-list-widget .product-wrapper .empty span {\n font-size: 40px;\n color: #999;\n line-height: 200px;\n vertical-align: middle;\n}\n\n@media (max-width: 768px) {\n .pb-product-list-widget .product-wrapper {\n width: 50%;\n }\n}\n\n.mobile .pb-product-list-widget .product-wrapper {\n width: 50%;\n}\n\n.pb-login-widget {\n height: 200px;\n text-align: center;\n}\n\n.pb-login-widget h3 {\n padding: 0;\n margin: 0;\n font-size: 32px;\n font-weight: bold;\n color: #ccc;\n line-height: 200px;\n vertical-align: middle;\n}\n\nbody {\n margin: 0;\n padding: 0;\n background-color: #aaa;\n overflow: hidden;\n}\n\n.font-icon, .material-icons-outlined {\n font-family: "Material Symbols Outlined", monospace;\n font-size: 1rem;\n max-width: 1em;\n}\n\n.pb-position-mark {\n background-color: #ff3333;\n opacity: 0.5;\n border-radius: 2px;\n}\n\n.pb-add-section-handle {\n position: relative;\n text-align: center;\n cursor: pointer;\n z-index: 5;\n height: 0;\n}\n\n.pb-add-section-handle.top::before, .pb-add-section-handle.bottom::before, .pb-add-section-handle.middle::before {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.pb-add-section-handle.bottom {\n bottom: -32px;\n}\n\n.pb-add-section-handle:hover.top::before, .pb-add-section-handle:hover.bottom::before, .pb-add-section-handle:hover.middle::before,\n.pb-add-section-handle:hover > i {\n opacity: 1;\n}\n\n.pb-add-section-handle > i {\n font-style: normal;\n vertical-align: middle;\n position: absolute;\n top: 50%;\n left: 0;\n font-size: 2rem;\n transform: translate(-50%, -50%);\n opacity: 0.2;\n}';
14512
14533
  const _hoisted_1$2 = ["width"];
14513
14534
  const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14514
14535
  __name: "PbPageFrame",
@@ -14533,6 +14554,9 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14533
14554
  const head = (_e = (_d = iframeRef.value) == null ? void 0 : _d.contentWindow) == null ? void 0 : _e.document.head;
14534
14555
  head.innerHTML = `
14535
14556
  <meta charset="UTF-8"/>
14557
+ <link
14558
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block"
14559
+ rel="stylesheet"/>
14536
14560
  ${externalCss}
14537
14561
  <style>${canvasStyle}</style>
14538
14562
  `;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
+ import { PartDefinition, PartDefinitionGroup } from './model/part-definintion.ts';
1
2
  import { PartProperty } from './model/part-property.ts';
2
3
 
3
4
  export { default as PageBuilderEditor } from './PageBuilderEditor.vue';
4
- export type { PartProperty };
5
+ export type { PartProperty, PartDefinitionGroup, PartDefinition };
5
6
  export * from './model/event';
6
7
  export * from './model/plugin';
7
8
  export * from '@g1cloud/page-builder-viewer';
@@ -1,4 +1,4 @@
1
- import { PartDefinition } from './part-definintion.ts';
1
+ import { PartDefinitionGroup } from './part-definintion.ts';
2
2
  import { ContextMenuRegistry, ContextMenuRegistryImpl, KeyHandlers, PageBuilderContext, PageBuilderContextImpl } from './context.ts';
3
3
  import { ToolButtonRegistry } from './toolbar.ts';
4
4
  import { PageBuilderPlugin } from './plugin.ts';
@@ -36,7 +36,7 @@ export interface PageBuilderEditor extends PageBuilder {
36
36
  setLocales(locales?: string[]): void;
37
37
  makeSingleScreen(screenToKeep: number): void;
38
38
  makeMultipleScreen(): void;
39
- getCustomWidgets(): PartDefinition[];
39
+ getCustomWidgets(): PartDefinitionGroup[];
40
40
  getProvider(name: string): (args?: any, callback?: (result?: any) => void) => unknown;
41
41
  extractMedia(part: IPart): string[];
42
42
  }
@@ -53,8 +53,7 @@ export declare class PageBuilderEditorImpl implements PageBuilderEditor {
53
53
  scale: Ref<number>;
54
54
  locale: Ref<string>;
55
55
  locales: Ref<string[]>;
56
- customWidgets: PartDefinition[];
57
- watchers: Record<string, unknown>;
56
+ customWidgets: PartDefinitionGroup[];
58
57
  providers: Record<string, unknown>;
59
58
  externalCssLinks: string[];
60
59
  externalCssContent: string;
@@ -73,7 +72,7 @@ export declare class PageBuilderEditorImpl implements PageBuilderEditor {
73
72
  zoom(scale: number): void;
74
73
  makeSingleScreen(screenToKeep: number): void;
75
74
  makeMultipleScreen(): void;
76
- getCustomWidgets(): PartDefinition[];
75
+ getCustomWidgets(): PartDefinitionGroup[];
77
76
  extractMedia(part: IPart): string[];
78
77
  getExternalCss(): string;
79
78
  private extractMediaFromPart;
@@ -1,4 +1,4 @@
1
- import { B, b, M, c, d, e, _, a, f, g, h, i, j, k, l, m, n, R, o, S, p, W, q, r, t, v, x, y, z, A, C } from "./index-D1WOGghM.js";
1
+ import { B, b, M, c, d, e, _, a, f, g, h, i, j, k, l, m, n, R, o, S, p, W, q, r, t, v, x, y, z, A, C } from "./index-CujMrKaK.js";
2
2
  export {
3
3
  B as BLOCK_TYPE,
4
4
  b as Block,
@@ -7226,6 +7226,13 @@ ${_html.style}
7226
7226
  placeholder: { type: Boolean }
7227
7227
  },
7228
7228
  setup(__props) {
7229
+ const props = __props;
7230
+ const style = vue.computed(() => {
7231
+ var _a;
7232
+ return {
7233
+ aspectRatio: (_a = props.part.properties) == null ? void 0 : _a.aspectRatio
7234
+ };
7235
+ });
7229
7236
  const onReady = () => {
7230
7237
  };
7231
7238
  return (_ctx, _cache) => {
@@ -7234,11 +7241,12 @@ ${_html.style}
7234
7241
  key: 0,
7235
7242
  ref: "youtube",
7236
7243
  src: ((_b = _ctx.part.properties) == null ? void 0 : _b.url) || "",
7244
+ style: vue.normalizeStyle(style.value),
7237
7245
  class: "youtube",
7238
7246
  height: "100%",
7239
7247
  width: "100%",
7240
7248
  onReady
7241
- }, null, 8, ["src"])) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3$1, _cache[0] || (_cache[0] = [
7249
+ }, null, 8, ["src", "style"])) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3$1, _cache[0] || (_cache[0] = [
7242
7250
  vue.createElementVNode("span", { class: "font-icon" }, "live_tv", -1)
7243
7251
  ]))) : vue.createCommentVNode("", true);
7244
7252
  };
@@ -9253,7 +9261,7 @@ ${_html.style}
9253
9261
  const _hoisted_4$d = { class: "bg-gray-100 py-5 rounded-8" };
9254
9262
  const _hoisted_5$7 = { class: "text-center" };
9255
9263
  const _hoisted_6$7 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
9256
- const _hoisted_7$6 = { class: "text-center" };
9264
+ const _hoisted_7$7 = { class: "text-center" };
9257
9265
  const _sfc_main$y = /* @__PURE__ */ vue.defineComponent({
9258
9266
  __name: "PbPropertyGroupEditorPosition",
9259
9267
  props: {
@@ -9316,7 +9324,7 @@ ${_html.style}
9316
9324
  "onUpdate:modelValue": updateRight
9317
9325
  }, null, 8, ["model-value"])
9318
9326
  ]),
9319
- vue.createElementVNode("div", _hoisted_7$6, [
9327
+ vue.createElementVNode("div", _hoisted_7$7, [
9320
9328
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
9321
9329
  "model-value": bottom.value,
9322
9330
  class: "ml-4",
@@ -9338,7 +9346,7 @@ ${_html.style}
9338
9346
  const _hoisted_4$c = { class: "flex-align-center mt-12" };
9339
9347
  const _hoisted_5$6 = { class: "flex-grow-1 bs-layout-horizontal" };
9340
9348
  const _hoisted_6$6 = { class: "flex-align-center mt-12" };
9341
- const _hoisted_7$5 = { class: "flex-grow-1 bs-layout-horizontal" };
9349
+ const _hoisted_7$6 = { class: "flex-grow-1 bs-layout-horizontal" };
9342
9350
  const _sfc_main$x = /* @__PURE__ */ vue.defineComponent({
9343
9351
  __name: "PbPropertyGroupEditorSize",
9344
9352
  props: {
@@ -9410,7 +9418,7 @@ ${_html.style}
9410
9418
  _cache[2] || (_cache[2] = vue.createElementVNode("div", { class: "title" }, [
9411
9419
  vue.createElementVNode("label", { textContent: "Min Size" })
9412
9420
  ], -1)),
9413
- vue.createElementVNode("div", _hoisted_7$5, [
9421
+ vue.createElementVNode("div", _hoisted_7$6, [
9414
9422
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
9415
9423
  "model-value": minWidth.value,
9416
9424
  class: "flex-grow-1 mr-2",
@@ -11133,7 +11141,7 @@ ${_html.style}
11133
11141
  class: "vc-sketch-alpha-wrap"
11134
11142
  };
11135
11143
  const _hoisted_6$5 = { class: "vc-sketch-color-wrap" };
11136
- const _hoisted_7$4 = ["aria-label"];
11144
+ const _hoisted_7$5 = ["aria-label"];
11137
11145
  const _hoisted_8$2 = {
11138
11146
  key: 0,
11139
11147
  class: "vc-sketch-field"
@@ -11193,7 +11201,7 @@ ${_html.style}
11193
11201
  "aria-label": `Current color is ${$options.activeColor}`,
11194
11202
  class: "vc-sketch-active-color",
11195
11203
  style: vue.normalizeStyle({ background: $options.activeColor })
11196
- }, null, 12, _hoisted_7$4),
11204
+ }, null, 12, _hoisted_7$5),
11197
11205
  vue.createVNode(_component_Checkboard)
11198
11206
  ])
11199
11207
  ]),
@@ -11455,7 +11463,7 @@ ${_html.style}
11455
11463
  const _hoisted_4$6 = { class: "color" };
11456
11464
  const _hoisted_5$4 = { class: "mt-8" };
11457
11465
  const _hoisted_6$4 = { class: "flex-grow-1 mt-4" };
11458
- const _hoisted_7$3 = { class: "bg-gray-100 py-5 rounded-8" };
11466
+ const _hoisted_7$4 = { class: "bg-gray-100 py-5 rounded-8" };
11459
11467
  const _hoisted_8$1 = { class: "text-center" };
11460
11468
  const _hoisted_9 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
11461
11469
  const _hoisted_10 = { class: "text-center" };
@@ -11534,7 +11542,7 @@ ${_html.style}
11534
11542
  vue.createElementVNode("label", { textContent: "Border Width" })
11535
11543
  ], -1)),
11536
11544
  vue.createElementVNode("div", _hoisted_6$4, [
11537
- vue.createElementVNode("div", _hoisted_7$3, [
11545
+ vue.createElementVNode("div", _hoisted_7$4, [
11538
11546
  vue.createElementVNode("div", _hoisted_8$1, [
11539
11547
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
11540
11548
  "model-value": borderTopWidth.value,
@@ -11630,7 +11638,7 @@ ${_html.style}
11630
11638
  const _hoisted_4$5 = { class: "bg-gray-100 py-5 rounded-8" };
11631
11639
  const _hoisted_5$3 = { class: "text-center" };
11632
11640
  const _hoisted_6$3 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
11633
- const _hoisted_7$2 = { class: "text-center" };
11641
+ const _hoisted_7$3 = { class: "text-center" };
11634
11642
  const _sfc_main$t = /* @__PURE__ */ vue.defineComponent({
11635
11643
  __name: "PbPropertyGroupEditorMargin",
11636
11644
  props: {
@@ -11693,7 +11701,7 @@ ${_html.style}
11693
11701
  "onUpdate:modelValue": updateRight
11694
11702
  }, null, 8, ["model-value"])
11695
11703
  ]),
11696
- vue.createElementVNode("div", _hoisted_7$2, [
11704
+ vue.createElementVNode("div", _hoisted_7$3, [
11697
11705
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
11698
11706
  "model-value": bottom.value,
11699
11707
  class: "ml-4",
@@ -11715,7 +11723,7 @@ ${_html.style}
11715
11723
  const _hoisted_4$4 = { class: "bg-gray-100 py-5 rounded-8" };
11716
11724
  const _hoisted_5$2 = { class: "text-center" };
11717
11725
  const _hoisted_6$2 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
11718
- const _hoisted_7$1 = { class: "text-center" };
11726
+ const _hoisted_7$2 = { class: "text-center" };
11719
11727
  const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
11720
11728
  __name: "PbPropertyGroupEditorPadding",
11721
11729
  props: {
@@ -11778,7 +11786,7 @@ ${_html.style}
11778
11786
  "onUpdate:modelValue": updateRight
11779
11787
  }, null, 8, ["model-value"])
11780
11788
  ]),
11781
- vue.createElementVNode("div", _hoisted_7$1, [
11789
+ vue.createElementVNode("div", _hoisted_7$2, [
11782
11790
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
11783
11791
  "model-value": bottom.value,
11784
11792
  class: "ml-4",
@@ -12374,12 +12382,20 @@ ${_html.style}
12374
12382
  caption: "URL",
12375
12383
  propertyType: "youtube",
12376
12384
  params: ""
12385
+ },
12386
+ {
12387
+ propertyName: "aspectRatio",
12388
+ caption: "Apect Ration",
12389
+ propertyType: "text",
12390
+ params: ""
12377
12391
  }
12378
12392
  ]
12379
12393
  },
12380
12394
  ...defaultWidgetPropertyGroups()
12381
12395
  ],
12382
- initialProperties: {},
12396
+ initialProperties: {
12397
+ aspectRatio: "16/9"
12398
+ },
12383
12399
  allowsChild: () => false,
12384
12400
  creator: () => _sfc_main$4$1
12385
12401
  },
@@ -13714,7 +13730,6 @@ ${_html.style}
13714
13730
  __publicField(this, "locale", vue.ref("en"));
13715
13731
  __publicField(this, "locales", vue.ref(["en"]));
13716
13732
  __publicField(this, "customWidgets", []);
13717
- __publicField(this, "watchers", {});
13718
13733
  __publicField(this, "providers", {});
13719
13734
  __publicField(this, "externalCssLinks", []);
13720
13735
  __publicField(this, "externalCssContent", "");
@@ -13756,22 +13771,28 @@ ${_html.style}
13756
13771
  registerCustomPlugin(plugin) {
13757
13772
  if (plugin.widgets) {
13758
13773
  const partDefinitions2 = {};
13759
- plugin.widgets.forEach((v) => {
13760
- const w = { ...v };
13761
- w.partType = "Widget";
13762
- w.creator = () => _sfc_main$E;
13763
- w.propertyGroups = [...w.propertyGroups, ...defaultWidgetPropertyGroups()];
13764
- partDefinitions2[v.partName] = w;
13765
- const found = this.customWidgets.find((x) => x.partName === v.partName);
13766
- if (!found) {
13767
- this.customWidgets.push(w);
13774
+ plugin.widgets.forEach((group) => {
13775
+ if (group.partDefinitions && group.partDefinitions.length) {
13776
+ const g = {
13777
+ groupName: group.groupName,
13778
+ caption: group.caption,
13779
+ partDefinitions: []
13780
+ };
13781
+ group.partDefinitions.forEach((part) => {
13782
+ const p = { ...part };
13783
+ p.partType = "Widget";
13784
+ p.creator = () => _sfc_main$E;
13785
+ p.propertyGroups = [...p.propertyGroups, ...defaultWidgetPropertyGroups()];
13786
+ partDefinitions2[p.partName] = p;
13787
+ g.partDefinitions.push(p);
13788
+ });
13789
+ if (g.partDefinitions && g.partDefinitions.length) {
13790
+ this.customWidgets.push(g);
13791
+ }
13768
13792
  }
13769
13793
  });
13770
13794
  this.partManager.registerPartDefinitions(partDefinitions2);
13771
13795
  }
13772
- if (plugin.watchers) {
13773
- this.watchers = { ...this.providers, ...plugin.watchers };
13774
- }
13775
13796
  if (plugin.providers) {
13776
13797
  this.providers = { ...this.providers, ...plugin.providers };
13777
13798
  }
@@ -14509,7 +14530,7 @@ ${_html.style}
14509
14530
  };
14510
14531
  }
14511
14532
  });
14512
- const canvasStyle = '.pb-page-wrapper {\n margin: 0 auto;\n padding: 0;\n}\n\n.pb-page {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding-bottom: 100px;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.pb-page .pb-page-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.pb-page .pb-page-content.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-page * {\n box-sizing: border-box;\n}\n\n.pb-add-widget-button {\n width: 100%;\n height: 100%;\n min-height: 200px;\n position: relative;\n}\n\n.pb-add-widget-button button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 8px;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.pb-add-widget-button button:hover {\n background-color: #eeeeee;\n}\n\n.pb-add-widget-button .icon {\n font-size: 1rem;\n vertical-align: middle;\n}\n\n.pb-add-widget-button .text {\n font-size: 1rem;\n vertical-align: middle;\n margin-left: 0.4rem;\n}\n\n.pb-section {\n display: flex;\n position: relative;\n width: 100%;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n outline: 1px dashed #ccc;\n background-color: #fff;\n}\n\n.pb-section:hover:not(:has(.pb-block:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-section.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static {\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static:after {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.pb-section-static .pb-widget {\n outline: none;\n}\n\n.pb-block {\n display: flex;\n min-width: 1px;\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n outline: 1px dashed #ccc;\n}\n\n.pb-block:hover:not(:has(.pb-widget:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-block.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget {\n position: relative;\n outline: 1px dashed #ccc;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n pointer-events: auto !important;\n}\n\n.pb-widget * {\n pointer-events: none;\n}\n\n.pb-widget.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-widget .pan-handle {\n position: absolute;\n left: -6px;\n top: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: move;\n pointer-events: auto !important;\n}\n\n.pb-widget .resize-handle {\n position: absolute;\n right: -6px;\n bottom: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: nwse-resize;\n pointer-events: auto !important;\n}\n\n.pb-widget {\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-text-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-text-widget .text {\n color: #333;\n}\n\n.pb-text-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-image-widget {\n width: 100%;\n}\n\n.pb-image-widget .image {\n width: 100%;\n}\n\n.pb-image-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-image-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-html-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-html-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-iframe-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-iframe-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-youtube-widget {\n width: 100%;\n}\n\n.pb-youtube-widget .youtube {\n width: 100%;\n height: 100%;\n}\n\n.pb-youtube-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-youtube-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-container-widget {\n width: 100%;\n}\n\n.pb-container-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-container-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-product-list-widget {\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n\n.pb-product-list-widget .product-wrapper {\n width: 25%;\n}\n\n.pb-product-list-widget .product-wrapper .product {\n width: 95%;\n margin: 0 auto;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n.pb-product-list-widget .product-wrapper img {\n width: 100%;\n}\n\n.pb-product-list-widget .product-wrapper .name {\n margin-top: 8px;\n font-size: 14px;\n}\n\n.pb-product-list-widget .product-wrapper .price {\n margin-top: 8px;\n font-size: 14px;\n font-weight: bold;\n}\n\n.pb-product-list-widget .product-wrapper .empty {\n height: 200px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-product-list-widget .product-wrapper .empty span {\n font-size: 40px;\n color: #999;\n line-height: 200px;\n vertical-align: middle;\n}\n\n@media (max-width: 768px) {\n .pb-product-list-widget .product-wrapper {\n width: 50%;\n }\n}\n\n.mobile .pb-product-list-widget .product-wrapper {\n width: 50%;\n}\n\n.pb-login-widget {\n height: 200px;\n text-align: center;\n}\n\n.pb-login-widget h3 {\n padding: 0;\n margin: 0;\n font-size: 32px;\n font-weight: bold;\n color: #ccc;\n line-height: 200px;\n vertical-align: middle;\n}\n\n.font-icon {\n font-family: Material Symbols Outlined, monospace;\n font-size: 1rem;\n max-width: 1em;\n}\n\nbody {\n margin: 0;\n padding: 0;\n background-color: #aaa;\n overflow: hidden;\n}\n\n.pb-position-mark {\n background-color: #ff3333;\n opacity: 0.5;\n border-radius: 2px;\n}\n\n.pb-add-section-handle {\n position: relative;\n text-align: center;\n cursor: pointer;\n z-index: 5;\n height: 0;\n}\n\n.pb-add-section-handle.top::before, .pb-add-section-handle.bottom::before, .pb-add-section-handle.middle::before {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.pb-add-section-handle.bottom {\n bottom: -32px;\n}\n\n.pb-add-section-handle:hover.top::before, .pb-add-section-handle:hover.bottom::before, .pb-add-section-handle:hover.middle::before,\n.pb-add-section-handle:hover > i {\n opacity: 1;\n}\n\n.pb-add-section-handle > i {\n vertical-align: middle;\n position: absolute;\n top: 50%;\n left: 0;\n font-size: 2rem;\n transform: translate(-50%, -50%);\n opacity: 0.2;\n}';
14533
+ const canvasStyle = '.pb-page-wrapper {\n margin: 0 auto;\n padding: 0;\n}\n\n.pb-page {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n padding-bottom: 100px;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n}\n\n.pb-page .pb-page-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.pb-page .pb-page-content.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-page * {\n box-sizing: border-box;\n}\n\n.pb-add-widget-button {\n width: 100%;\n height: 100%;\n min-height: 200px;\n position: relative;\n}\n\n.pb-add-widget-button button {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 8px;\n background: none;\n border: none;\n cursor: pointer;\n}\n\n.pb-add-widget-button button:hover {\n background-color: #eeeeee;\n}\n\n.pb-add-widget-button .icon {\n font-size: 1rem;\n vertical-align: middle;\n}\n\n.pb-add-widget-button .text {\n font-size: 1rem;\n vertical-align: middle;\n margin-left: 0.4rem;\n}\n\n.pb-section {\n display: flex;\n position: relative;\n width: 100%;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n outline: 1px dashed #ccc;\n background-color: #fff;\n}\n\n.pb-section:hover:not(:has(.pb-block:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-section.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static {\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: none;\n}\n\n.pb-section.pb-section-static:after {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.2);\n}\n\n.pb-section-static .pb-widget {\n outline: none;\n}\n\n.pb-block {\n display: flex;\n min-width: 1px;\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n outline: 1px dashed #ccc;\n}\n\n.pb-block:hover:not(:has(.pb-widget:hover)) {\n background-color: #f0f0f0;\n}\n\n.pb-block.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget {\n position: relative;\n outline: 1px dashed #ccc;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n pointer-events: auto !important;\n}\n\n.pb-widget * {\n pointer-events: none;\n}\n\n.pb-widget.selected::before {\n content: "";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px solid #4998f8;\n z-index: 999;\n pointer-events: none;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-widget .pan-handle {\n position: absolute;\n left: -6px;\n top: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: move;\n pointer-events: auto !important;\n}\n\n.pb-widget .resize-handle {\n position: absolute;\n right: -6px;\n bottom: -6px;\n width: 12px;\n height: 12px;\n background-color: #27ae60;\n cursor: nwse-resize;\n pointer-events: auto !important;\n}\n\n.pb-widget {\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n}\n\n.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.pb-text-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-text-widget .text {\n color: #333;\n}\n\n.pb-text-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-image-widget {\n width: 100%;\n}\n\n.pb-image-widget .image {\n width: 100%;\n}\n\n.pb-image-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-image-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-html-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-html-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-iframe-widget {\n width: 100%;\n height: fit-content;\n}\n\n.pb-iframe-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n\n.pb-youtube-widget {\n width: 100%;\n}\n\n.pb-youtube-widget .youtube {\n width: 100%;\n height: 100%;\n}\n\n.pb-youtube-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-youtube-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-container-widget {\n width: 100%;\n}\n\n.pb-container-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-container-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n\n.pb-product-list-widget {\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n\n.pb-product-list-widget .product-wrapper {\n width: 25%;\n}\n\n.pb-product-list-widget .product-wrapper .product {\n width: 95%;\n margin: 0 auto;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n.pb-product-list-widget .product-wrapper img {\n width: 100%;\n}\n\n.pb-product-list-widget .product-wrapper .name {\n margin-top: 8px;\n font-size: 14px;\n}\n\n.pb-product-list-widget .product-wrapper .price {\n margin-top: 8px;\n font-size: 14px;\n font-weight: bold;\n}\n\n.pb-product-list-widget .product-wrapper .empty {\n height: 200px;\n background-color: #eee;\n text-align: center;\n}\n\n.pb-product-list-widget .product-wrapper .empty span {\n font-size: 40px;\n color: #999;\n line-height: 200px;\n vertical-align: middle;\n}\n\n@media (max-width: 768px) {\n .pb-product-list-widget .product-wrapper {\n width: 50%;\n }\n}\n\n.mobile .pb-product-list-widget .product-wrapper {\n width: 50%;\n}\n\n.pb-login-widget {\n height: 200px;\n text-align: center;\n}\n\n.pb-login-widget h3 {\n padding: 0;\n margin: 0;\n font-size: 32px;\n font-weight: bold;\n color: #ccc;\n line-height: 200px;\n vertical-align: middle;\n}\n\nbody {\n margin: 0;\n padding: 0;\n background-color: #aaa;\n overflow: hidden;\n}\n\n.font-icon, .material-icons-outlined {\n font-family: "Material Symbols Outlined", monospace;\n font-size: 1rem;\n max-width: 1em;\n}\n\n.pb-position-mark {\n background-color: #ff3333;\n opacity: 0.5;\n border-radius: 2px;\n}\n\n.pb-add-section-handle {\n position: relative;\n text-align: center;\n cursor: pointer;\n z-index: 5;\n height: 0;\n}\n\n.pb-add-section-handle.top::before, .pb-add-section-handle.bottom::before, .pb-add-section-handle.middle::before {\n content: "";\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.pb-add-section-handle.bottom {\n bottom: -32px;\n}\n\n.pb-add-section-handle:hover.top::before, .pb-add-section-handle:hover.bottom::before, .pb-add-section-handle:hover.middle::before,\n.pb-add-section-handle:hover > i {\n opacity: 1;\n}\n\n.pb-add-section-handle > i {\n font-style: normal;\n vertical-align: middle;\n position: absolute;\n top: 50%;\n left: 0;\n font-size: 2rem;\n transform: translate(-50%, -50%);\n opacity: 0.2;\n}';
14513
14534
  const _hoisted_1$g = ["width"];
14514
14535
  const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
14515
14536
  __name: "PbPageFrame",
@@ -14534,6 +14555,9 @@ ${_html.style}
14534
14555
  const head = (_e = (_d = iframeRef.value) == null ? void 0 : _d.contentWindow) == null ? void 0 : _e.document.head;
14535
14556
  head.innerHTML = `
14536
14557
  <meta charset="UTF-8"/>
14558
+ <link
14559
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block"
14560
+ rel="stylesheet"/>
14537
14561
  ${externalCss}
14538
14562
  <style>${canvasStyle}</style>
14539
14563
  `;
@@ -15262,8 +15286,9 @@ ${_html.style}
15262
15286
  const _hoisted_2$2 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
15263
15287
  const _hoisted_3$1 = ["onClick", "textContent"];
15264
15288
  const _hoisted_4$1 = { class: "group mb-16" };
15265
- const _hoisted_5$1 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
15266
- const _hoisted_6$1 = ["onClick", "textContent"];
15289
+ const _hoisted_5$1 = ["textContent"];
15290
+ const _hoisted_6$1 = { class: "bs-layout-horizontal-wrap ml-16 mb-8 gap-8" };
15291
+ const _hoisted_7$1 = ["onClick", "textContent"];
15267
15292
  const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
15268
15293
  __name: "PbWidgetAddModal",
15269
15294
  props: {
@@ -15282,7 +15307,7 @@ ${_html.style}
15282
15307
  modalHandle.close();
15283
15308
  };
15284
15309
  return (_ctx, _cache) => {
15285
- return vue.openBlock(), vue.createBlock(vue.unref(bluesea.BSModalFrame), { title: "Add Block/Widget" }, {
15310
+ return vue.openBlock(), vue.createBlock(vue.unref(bluesea.BSModalFrame), { title: "Add Widget" }, {
15286
15311
  default: vue.withCtx(() => [
15287
15312
  vue.createElementVNode("div", _hoisted_1$2, [
15288
15313
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(widgetPartDefinitions), (group) => {
@@ -15291,14 +15316,14 @@ ${_html.style}
15291
15316
  class: "group mb-16"
15292
15317
  }, [
15293
15318
  _cache[0] || (_cache[0] = vue.createElementVNode("div", {
15294
- class: "mb-8",
15319
+ class: "mb-8 section-title",
15295
15320
  textContent: "Basic Widgets"
15296
15321
  }, null, -1)),
15297
15322
  vue.createElementVNode("div", _hoisted_2$2, [
15298
15323
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(group.partDefinitions, (part) => {
15299
15324
  return vue.openBlock(), vue.createElementBlock("div", {
15300
15325
  key: part.partName,
15301
- class: "part",
15326
+ class: "part w-200",
15302
15327
  onClick: ($event) => select(part),
15303
15328
  textContent: vue.toDisplayString(part.caption)
15304
15329
  }, null, 8, _hoisted_3$1);
@@ -15306,22 +15331,24 @@ ${_html.style}
15306
15331
  ])
15307
15332
  ]);
15308
15333
  }), 128)),
15309
- vue.createElementVNode("div", _hoisted_4$1, [
15310
- _cache[1] || (_cache[1] = vue.createElementVNode("div", {
15311
- class: "mb-8",
15312
- textContent: "Custom Widgets"
15313
- }, null, -1)),
15314
- vue.createElementVNode("div", _hoisted_5$1, [
15315
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(customWidgets.value, (part) => {
15316
- return vue.openBlock(), vue.createElementBlock("div", {
15317
- key: part.partName,
15318
- class: "part",
15319
- onClick: ($event) => select(part),
15320
- textContent: vue.toDisplayString(part.caption)
15321
- }, null, 8, _hoisted_6$1);
15322
- }), 128))
15323
- ])
15324
- ])
15334
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(customWidgets.value, (group) => {
15335
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [
15336
+ vue.createElementVNode("div", {
15337
+ class: "mb-8 section-title",
15338
+ textContent: vue.toDisplayString(group.caption)
15339
+ }, null, 8, _hoisted_5$1),
15340
+ vue.createElementVNode("div", _hoisted_6$1, [
15341
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(group.partDefinitions, (part) => {
15342
+ return vue.openBlock(), vue.createElementBlock("div", {
15343
+ key: part.partName,
15344
+ class: "part w-200",
15345
+ onClick: ($event) => select(part),
15346
+ textContent: vue.toDisplayString(part.caption)
15347
+ }, null, 8, _hoisted_7$1);
15348
+ }), 128))
15349
+ ])
15350
+ ]);
15351
+ }), 256))
15325
15352
  ])
15326
15353
  ]),
15327
15354
  _: 1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@g1cloud/page-builder-editor",
3
3
  "private": false,
4
- "version": "1.0.0-alpha.37",
4
+ "version": "1.0.0-alpha.39",
5
5
  "engins": {
6
6
  "node": ">= 20.0.0"
7
7
  },
@@ -30,7 +30,7 @@
30
30
  "vue-router": "^4.4.3",
31
31
  "vue3-click-away": "^1.2.4",
32
32
  "yjs": "^13.6.14",
33
- "@g1cloud/page-builder-viewer": "1.0.0-alpha.37"
33
+ "@g1cloud/page-builder-viewer": "1.0.0-alpha.39"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^20.12.7",