@g1cloud/page-builder-editor 1.0.0-alpha.102 → 1.0.0-alpha.103

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.
@@ -1,6 +1,6 @@
1
1
  (function(global2, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("vue"), require("@g1cloud/bluesea"), require("vue3-youtube")) : typeof define === "function" && define.amd ? define(["exports", "vue", "@g1cloud/bluesea", "vue3-youtube"], factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2["Page Builder Editor"] = {}, global2.Vue, global2.bluesea, global2.Vue3Youtube));
3
- })(this, function(exports2, vue, bluesea, YouTube) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("vue"), require("@g1cloud/bluesea")) : typeof define === "function" && define.amd ? define(["exports", "vue", "@g1cloud/bluesea"], factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2["Page Builder Editor"] = {}, global2.Vue, global2.bluesea));
3
+ })(this, function(exports2, vue, bluesea) {
4
4
  "use strict";var __defProp = Object.defineProperty;
5
5
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
6
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -7133,10 +7133,10 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7133
7133
  }
7134
7134
  });
7135
7135
  const _hoisted_1$7$1 = ["href", "target"];
7136
- const _hoisted_2$3$1 = ["alt", "src"];
7137
- const _hoisted_3$l = ["alt", "src"];
7138
- const _hoisted_4$e = ["alt", "src"];
7139
- const _hoisted_5$b = ["alt", "src"];
7136
+ const _hoisted_2$4$1 = ["alt", "src"];
7137
+ const _hoisted_3$1$1 = ["alt", "src"];
7138
+ const _hoisted_4$f = ["alt", "src"];
7139
+ const _hoisted_5$c = ["alt", "src"];
7140
7140
  const _hoisted_6$a = ["poster"];
7141
7141
  const _hoisted_7$9 = ["src"];
7142
7142
  const _hoisted_8$8 = {
@@ -7207,7 +7207,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7207
7207
  src: ((_a2 = _ctx.part.properties) == null ? void 0 : _a2.media).fileUrl,
7208
7208
  style: vue.normalizeStyle(style.value),
7209
7209
  class: "image"
7210
- }, null, 12, _hoisted_2$3$1)
7210
+ }, null, 12, _hoisted_2$4$1)
7211
7211
  ];
7212
7212
  }),
7213
7213
  _: 1
@@ -7217,7 +7217,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7217
7217
  src: ((_d = _ctx.part.properties) == null ? void 0 : _d.media).fileUrl,
7218
7218
  style: vue.normalizeStyle(style.value),
7219
7219
  class: "image"
7220
- }, null, 12, _hoisted_3$l))
7220
+ }, null, 12, _hoisted_3$1$1))
7221
7221
  ], 8, _hoisted_1$7$1)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
7222
7222
  tag.value ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(tag.value), {
7223
7223
  key: 0,
@@ -7231,7 +7231,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7231
7231
  src: ((_a2 = _ctx.part.properties) == null ? void 0 : _a2.media).fileUrl,
7232
7232
  style: vue.normalizeStyle(style.value),
7233
7233
  class: "image"
7234
- }, null, 12, _hoisted_4$e)
7234
+ }, null, 12, _hoisted_4$f)
7235
7235
  ];
7236
7236
  }),
7237
7237
  _: 1
@@ -7241,7 +7241,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7241
7241
  src: ((_e = _ctx.part.properties) == null ? void 0 : _e.media).fileUrl,
7242
7242
  style: vue.normalizeStyle(style.value),
7243
7243
  class: "image"
7244
- }, null, 12, _hoisted_5$b))
7244
+ }, null, 12, _hoisted_5$c))
7245
7245
  ], 64))
7246
7246
  ], 64)) : media.value.mediaType === "Video" ? (vue.openBlock(), vue.createElementBlock("video", {
7247
7247
  key: 1,
@@ -7311,7 +7311,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7311
7311
  }
7312
7312
  });
7313
7313
  const _hoisted_1$5$1 = ["innerHTML"];
7314
- const _hoisted_2$2$1 = {
7314
+ const _hoisted_2$3$1 = {
7315
7315
  key: 1,
7316
7316
  class: "placeholder",
7317
7317
  textContent: "Empty HTML"
@@ -7400,12 +7400,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7400
7400
  ref: partRef,
7401
7401
  class: "html",
7402
7402
  innerHTML: (_b = html.value) == null ? void 0 : _b.tags
7403
- }, null, 8, _hoisted_1$5$1)) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2$1)) : vue.createCommentVNode("", true);
7403
+ }, null, 8, _hoisted_1$5$1)) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$3$1)) : vue.createCommentVNode("", true);
7404
7404
  };
7405
7405
  }
7406
7406
  });
7407
7407
  const _hoisted_1$4$1 = ["src"];
7408
- const _hoisted_2$1$1 = {
7408
+ const _hoisted_2$2$1 = {
7409
7409
  key: 1,
7410
7410
  class: "placeholder",
7411
7411
  textContent: "Empty URL"
@@ -7553,11 +7553,17 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7553
7553
  ref: iframeRef,
7554
7554
  src: url.value,
7555
7555
  style: vue.normalizeStyle(style.value)
7556
- }, null, 12, _hoisted_1$4$1)) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$1$1)) : vue.createCommentVNode("", true);
7556
+ }, null, 12, _hoisted_1$4$1)) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2$1)) : vue.createCommentVNode("", true);
7557
7557
  };
7558
7558
  }
7559
7559
  });
7560
7560
  const _hoisted_1$3$1 = {
7561
+ key: 0,
7562
+ class: "youtube-container",
7563
+ style: { width: "100%" }
7564
+ };
7565
+ const _hoisted_2$1$1 = ["src"];
7566
+ const _hoisted_3$l = {
7561
7567
  key: 1,
7562
7568
  class: "placeholder"
7563
7569
  };
@@ -7569,87 +7575,72 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7569
7575
  },
7570
7576
  setup(__props) {
7571
7577
  const props = __props;
7572
- const container = vue.ref();
7573
- const containerWidth = vue.ref(640);
7574
- const aspectRatio = vue.computed(() => {
7575
- var _a;
7576
- const raw = (_a = props.part.properties) == null ? void 0 : _a.aspectRatio;
7577
- if (!raw) return 16 / 9;
7578
- const parts = raw.split("/");
7579
- if (parts.length === 2) {
7580
- const w = Number(parts[0]);
7581
- const h = Number(parts[1]);
7582
- if (w > 0 && h > 0) return w / h;
7583
- }
7584
- return 16 / 9;
7585
- });
7586
- const playerHeight = vue.computed(() => Math.round(containerWidth.value / aspectRatio.value));
7587
- const updateWidth = () => {
7588
- if (container.value) {
7589
- containerWidth.value = container.value.clientWidth;
7578
+ const extractVideoId = (raw) => {
7579
+ const value = raw.trim();
7580
+ if (!value) return void 0;
7581
+ if (/^[\w-]{11}$/.test(value)) return value;
7582
+ try {
7583
+ const u = new URL(value);
7584
+ const host = u.hostname.replace(/^www\./, "");
7585
+ if (host === "youtu.be") {
7586
+ const id = u.pathname.slice(1).split("/")[0];
7587
+ return id || void 0;
7588
+ }
7589
+ if (host === "youtube.com" || host === "youtube-nocookie.com" || host === "m.youtube.com") {
7590
+ const v = u.searchParams.get("v");
7591
+ if (v) return v;
7592
+ const segs = u.pathname.split("/").filter(Boolean);
7593
+ const idx = segs.findIndex((s) => s === "embed" || s === "shorts" || s === "live" || s === "v");
7594
+ if (idx >= 0 && segs[idx + 1]) return segs[idx + 1];
7595
+ }
7596
+ } catch {
7590
7597
  }
7598
+ return void 0;
7591
7599
  };
7592
- let resizeObserver;
7593
- const onReady = () => {
7594
- };
7595
- const isYTReady = vue.ref(false);
7596
- vue.onMounted(() => {
7597
- if (container.value) {
7598
- updateWidth();
7599
- resizeObserver = new ResizeObserver(updateWidth);
7600
- resizeObserver.observe(container.value);
7601
- }
7602
- const interval = setInterval(() => {
7603
- try {
7604
- if (window && window.YT && window.YT.Player) {
7605
- isYTReady.value = true;
7606
- clearInterval(interval);
7607
- }
7608
- } catch (e) {
7609
- }
7610
- }, 500);
7600
+ const embedSrc = vue.computed(() => {
7601
+ var _a;
7602
+ const raw = (_a = props.part.properties) == null ? void 0 : _a.url;
7603
+ if (!raw) return void 0;
7604
+ const id = extractVideoId(raw);
7605
+ if (!id) return void 0;
7606
+ return `https://www.youtube-nocookie.com/embed/${id}`;
7611
7607
  });
7612
- vue.onBeforeUnmount(() => {
7613
- resizeObserver == null ? void 0 : resizeObserver.disconnect();
7608
+ const aspectRatioCss = vue.computed(() => {
7609
+ var _a;
7610
+ const raw = (_a = props.part.properties) == null ? void 0 : _a.aspectRatio;
7611
+ if (raw) {
7612
+ const parts = raw.split("/");
7613
+ if (parts.length === 2) {
7614
+ const w = Number(parts[0]);
7615
+ const h = Number(parts[1]);
7616
+ if (w > 0 && h > 0) return `${w} / ${h}`;
7617
+ }
7618
+ }
7619
+ return "16 / 9";
7614
7620
  });
7621
+ const iframeStyle = vue.computed(() => ({
7622
+ width: "100%",
7623
+ aspectRatio: aspectRatioCss.value,
7624
+ border: "0",
7625
+ display: "block"
7626
+ }));
7615
7627
  return (_ctx, _cache) => {
7616
- var _a, _b;
7617
- return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
7618
- (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent("script"), {
7619
- id: "youtube-iframe-js-api-script",
7620
- class: "optanon-category-C0004",
7621
- src: "https://www.youtube.com/iframe_api"
7622
- })),
7623
- ((_a = _ctx.part.properties) == null ? void 0 : _a.url) ? (vue.openBlock(), vue.createElementBlock("div", {
7624
- key: 0,
7625
- ref_key: "container",
7626
- ref: container,
7627
- class: "youtube-container"
7628
- }, [
7629
- isYTReady.value ? (vue.openBlock(), vue.createBlock(vue.unref(YouTube), {
7630
- key: 0,
7631
- ref: "youtube",
7632
- host: "https://www.youtube-nocookie.com",
7633
- src: ((_b = _ctx.part.properties) == null ? void 0 : _b.url) || "",
7634
- width: containerWidth.value,
7635
- height: playerHeight.value,
7636
- onReady
7637
- }, null, 8, ["src", "width", "height"])) : vue.createCommentVNode("", true)
7638
- ], 512)) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3$1, _cache[0] || (_cache[0] = [
7639
- vue.createElementVNode("span", { class: "font-icon" }, "live_tv", -1)
7640
- ]))) : vue.createCommentVNode("", true)
7641
- ], 64);
7628
+ return embedSrc.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3$1, [
7629
+ vue.createElementVNode("iframe", {
7630
+ src: embedSrc.value,
7631
+ style: vue.normalizeStyle(iframeStyle.value),
7632
+ frameborder: "0",
7633
+ allow: "accelerometer; encrypted-media; gyroscope; picture-in-picture; web-share",
7634
+ allowfullscreen: "",
7635
+ loading: "lazy",
7636
+ title: "YouTube video"
7637
+ }, null, 12, _hoisted_2$1$1)
7638
+ ])) : _ctx.placeholder ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$l, _cache[0] || (_cache[0] = [
7639
+ vue.createElementVNode("span", { class: "font-icon" }, "live_tv", -1)
7640
+ ]))) : vue.createCommentVNode("", true);
7642
7641
  };
7643
7642
  }
7644
7643
  });
7645
- const _export_sfc$1 = (sfc, props) => {
7646
- const target = sfc.__vccOpts || sfc;
7647
- for (const [key, val] of props) {
7648
- target[key] = val;
7649
- }
7650
- return target;
7651
- };
7652
- const PbYoutubeWidget = /* @__PURE__ */ _export_sfc$1(_sfc_main$4$1, [["__scopeId", "data-v-675477df"]]);
7653
7644
  const defaultPartDefinitions = {
7654
7645
  "Section": {
7655
7646
  partType: "Section",
@@ -7691,7 +7682,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
7691
7682
  partType: "Widget",
7692
7683
  partName: "YoutubeWidget",
7693
7684
  className: "pb-youtube-widget",
7694
- creator: () => PbYoutubeWidget
7685
+ creator: () => _sfc_main$4$1
7695
7686
  }
7696
7687
  /*
7697
7688
  * BSP에서 사용안함
@@ -9860,8 +9851,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
9860
9851
  const _hoisted_1$D = { class: "group-editor group-editor-position" };
9861
9852
  const _hoisted_2$u = { class: "flex-align-center" };
9862
9853
  const _hoisted_3$k = { class: "title" };
9863
- const _hoisted_4$d = { class: "flex-grow-1" };
9864
- const _hoisted_5$a = { class: "bg-gray-100 py-5 rounded-8" };
9854
+ const _hoisted_4$e = { class: "flex-grow-1" };
9855
+ const _hoisted_5$b = { class: "bg-gray-100 py-5 rounded-8" };
9865
9856
  const _hoisted_6$9 = { class: "text-center" };
9866
9857
  const _hoisted_7$8 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
9867
9858
  const _hoisted_8$7 = { class: "text-center" };
@@ -9896,8 +9887,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
9896
9887
  [vue.unref(bluesea.vT), { key: "pb.prop.position" }]
9897
9888
  ])
9898
9889
  ]),
9899
- vue.createElementVNode("div", _hoisted_4$d, [
9900
- vue.createElementVNode("div", _hoisted_5$a, [
9890
+ vue.createElementVNode("div", _hoisted_4$e, [
9891
+ vue.createElementVNode("div", _hoisted_5$b, [
9901
9892
  vue.createElementVNode("div", _hoisted_6$9, [
9902
9893
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
9903
9894
  "model-value": top.value,
@@ -9948,8 +9939,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
9948
9939
  const _hoisted_1$C = { class: "group-editor group-editor-size" };
9949
9940
  const _hoisted_2$t = { class: "flex-align-center" };
9950
9941
  const _hoisted_3$j = { class: "title" };
9951
- const _hoisted_4$c = { class: "flex-grow-1 bs-layout-horizontal" };
9952
- const _hoisted_5$9 = { class: "flex-align-center mt-12" };
9942
+ const _hoisted_4$d = { class: "flex-grow-1 bs-layout-horizontal" };
9943
+ const _hoisted_5$a = { class: "flex-align-center mt-12" };
9953
9944
  const _hoisted_6$8 = { class: "title" };
9954
9945
  const _hoisted_7$7 = { class: "flex-grow-1 bs-layout-horizontal" };
9955
9946
  const _hoisted_8$6 = { class: "flex-align-center mt-12" };
@@ -9990,7 +9981,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
9990
9981
  [vue.unref(bluesea.vT), { key: "pb.prop.size" }]
9991
9982
  ])
9992
9983
  ]),
9993
- vue.createElementVNode("div", _hoisted_4$c, [
9984
+ vue.createElementVNode("div", _hoisted_4$d, [
9994
9985
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
9995
9986
  "model-value": width.value,
9996
9987
  class: "flex-grow-1 mr-2",
@@ -10005,7 +9996,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
10005
9996
  }, null, 8, ["model-value"])
10006
9997
  ])
10007
9998
  ]),
10008
- vue.createElementVNode("div", _hoisted_5$9, [
9999
+ vue.createElementVNode("div", _hoisted_5$a, [
10009
10000
  vue.createElementVNode("div", _hoisted_6$8, [
10010
10001
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
10011
10002
  [vue.unref(bluesea.vT), { key: "pb.prop.maxSize" }]
@@ -10216,7 +10207,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
10216
10207
  -1
10217
10208
  /* HOISTED */
10218
10209
  );
10219
- const _hoisted_4$b = [
10210
+ const _hoisted_4$c = [
10220
10211
  _hoisted_3$i
10221
10212
  ];
10222
10213
  function render$4(_ctx, _cache, $props, $setup, $data, $options) {
@@ -10251,7 +10242,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
10251
10242
  class: "vc-alpha-pointer",
10252
10243
  style: vue.normalizeStyle({ left: `${$options.colors.a * 100}%` })
10253
10244
  },
10254
- _hoisted_4$b,
10245
+ _hoisted_4$c,
10255
10246
  4
10256
10247
  /* STYLE */
10257
10248
  )
@@ -11328,7 +11319,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11328
11319
  const _hoisted_1$A = { class: "vc-editable-input" };
11329
11320
  const _hoisted_2$r = ["aria-labelledby"];
11330
11321
  const _hoisted_3$h = ["id", "for"];
11331
- const _hoisted_4$a = { class: "vc-input__desc" };
11322
+ const _hoisted_4$b = { class: "vc-input__desc" };
11332
11323
  function render$3(_ctx, _cache, $props, $setup, $data, $options) {
11333
11324
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$A, [
11334
11325
  vue.withDirectives(vue.createElementVNode("input", {
@@ -11348,7 +11339,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11348
11339
  }, vue.toDisplayString($options.labelSpanText), 9, _hoisted_3$h),
11349
11340
  vue.createElementVNode(
11350
11341
  "span",
11351
- _hoisted_4$a,
11342
+ _hoisted_4$b,
11352
11343
  vue.toDisplayString($props.desc),
11353
11344
  1
11354
11345
  /* TEXT */
@@ -11446,7 +11437,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11446
11437
  -1
11447
11438
  /* HOISTED */
11448
11439
  );
11449
- const _hoisted_4$9 = [
11440
+ const _hoisted_4$a = [
11450
11441
  _hoisted_3$g
11451
11442
  ];
11452
11443
  function render$2(_ctx, _cache, $props, $setup, $data, $options) {
@@ -11469,7 +11460,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11469
11460
  class: "vc-saturation-pointer",
11470
11461
  style: vue.normalizeStyle({ top: $options.pointerTop, left: $options.pointerLeft })
11471
11462
  },
11472
- _hoisted_4$9,
11463
+ _hoisted_4$a,
11473
11464
  4
11474
11465
  /* STYLE */
11475
11466
  )
@@ -11749,8 +11740,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11749
11740
  const _hoisted_1$x = { class: "vc-sketch-saturation-wrap" };
11750
11741
  const _hoisted_2$o = { class: "vc-sketch-controls" };
11751
11742
  const _hoisted_3$e = { class: "vc-sketch-sliders" };
11752
- const _hoisted_4$8 = { class: "vc-sketch-hue-wrap" };
11753
- const _hoisted_5$8 = {
11743
+ const _hoisted_4$9 = { class: "vc-sketch-hue-wrap" };
11744
+ const _hoisted_5$9 = {
11754
11745
  key: 0,
11755
11746
  class: "vc-sketch-alpha-wrap"
11756
11747
  };
@@ -11797,13 +11788,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
11797
11788
  ]),
11798
11789
  vue.createElementVNode("div", _hoisted_2$o, [
11799
11790
  vue.createElementVNode("div", _hoisted_3$e, [
11800
- vue.createElementVNode("div", _hoisted_4$8, [
11791
+ vue.createElementVNode("div", _hoisted_4$9, [
11801
11792
  vue.createVNode(_component_Hue, {
11802
11793
  value: _ctx.colors,
11803
11794
  onChange: $options.childChange
11804
11795
  }, null, 8, ["value", "onChange"])
11805
11796
  ]),
11806
- !$props.disableAlpha ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$8, [
11797
+ !$props.disableAlpha ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$9, [
11807
11798
  vue.createVNode(_component_Alpha, {
11808
11799
  value: _ctx.colors,
11809
11800
  onChange: $options.childChange
@@ -12002,8 +11993,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12002
11993
  const _hoisted_1$v = { class: "group-editor group-editor-background" };
12003
11994
  const _hoisted_2$m = { class: "flex-align-center" };
12004
11995
  const _hoisted_3$d = { class: "title" };
12005
- const _hoisted_4$7 = { class: "color" };
12006
- const _hoisted_5$7 = { class: "image mt-4" };
11996
+ const _hoisted_4$8 = { class: "color" };
11997
+ const _hoisted_5$8 = { class: "image mt-4" };
12007
11998
  const _hoisted_6$6 = {
12008
11999
  key: 0,
12009
12000
  class: "url mt-8"
@@ -12052,7 +12043,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12052
12043
  ])
12053
12044
  ]),
12054
12045
  vue.createElementVNode("div", null, [
12055
- vue.createElementVNode("div", _hoisted_4$7, [
12046
+ vue.createElementVNode("div", _hoisted_4$8, [
12056
12047
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
12057
12048
  [vue.unref(bluesea.vT), { key: "pb.prop.color" }]
12058
12049
  ]),
@@ -12083,7 +12074,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12083
12074
  ]
12084
12075
  ]) : vue.createCommentVNode("", true)
12085
12076
  ]),
12086
- vue.createElementVNode("div", _hoisted_5$7, [
12077
+ vue.createElementVNode("div", _hoisted_5$8, [
12087
12078
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
12088
12079
  [vue.unref(bluesea.vT), { key: "pb.prop.image" }]
12089
12080
  ]),
@@ -12122,8 +12113,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12122
12113
  const _hoisted_1$u = { class: "group-editor group-editor-border" };
12123
12114
  const _hoisted_2$l = { class: "flex-align-center" };
12124
12115
  const _hoisted_3$c = { class: "title" };
12125
- const _hoisted_4$6 = { class: "" };
12126
- const _hoisted_5$6 = { class: "sub-title" };
12116
+ const _hoisted_4$7 = { class: "" };
12117
+ const _hoisted_5$7 = { class: "sub-title" };
12127
12118
  const _hoisted_6$5 = { class: "color" };
12128
12119
  const _hoisted_7$5 = { class: "mt-8" };
12129
12120
  const _hoisted_8$4 = { class: "sub-title" };
@@ -12183,8 +12174,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12183
12174
  [vue.unref(bluesea.vT), { key: "pb.prop.border" }]
12184
12175
  ])
12185
12176
  ]),
12186
- vue.createElementVNode("div", _hoisted_4$6, [
12187
- vue.createElementVNode("div", _hoisted_5$6, [
12177
+ vue.createElementVNode("div", _hoisted_4$7, [
12178
+ vue.createElementVNode("div", _hoisted_5$7, [
12188
12179
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
12189
12180
  [vue.unref(bluesea.vT), { key: "pb.prop.borderColor" }]
12190
12181
  ])
@@ -12309,8 +12300,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12309
12300
  const _hoisted_1$t = { class: "group-editor group-editor-margin" };
12310
12301
  const _hoisted_2$k = { class: "flex-align-center" };
12311
12302
  const _hoisted_3$b = { class: "title" };
12312
- const _hoisted_4$5 = { class: "flex-grow-1" };
12313
- const _hoisted_5$5 = { class: "bg-gray-100 py-5 rounded-8" };
12303
+ const _hoisted_4$6 = { class: "flex-grow-1" };
12304
+ const _hoisted_5$6 = { class: "bg-gray-100 py-5 rounded-8" };
12314
12305
  const _hoisted_6$4 = { class: "text-center" };
12315
12306
  const _hoisted_7$4 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
12316
12307
  const _hoisted_8$3 = { class: "text-center" };
@@ -12345,8 +12336,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12345
12336
  [vue.unref(bluesea.vT), { key: "pb.prop.margin" }]
12346
12337
  ])
12347
12338
  ]),
12348
- vue.createElementVNode("div", _hoisted_4$5, [
12349
- vue.createElementVNode("div", _hoisted_5$5, [
12339
+ vue.createElementVNode("div", _hoisted_4$6, [
12340
+ vue.createElementVNode("div", _hoisted_5$6, [
12350
12341
  vue.createElementVNode("div", _hoisted_6$4, [
12351
12342
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
12352
12343
  "model-value": top.value,
@@ -12397,8 +12388,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12397
12388
  const _hoisted_1$s = { class: "group-editor group-editor-padding" };
12398
12389
  const _hoisted_2$j = { class: "flex-align-center" };
12399
12390
  const _hoisted_3$a = { class: "title" };
12400
- const _hoisted_4$4 = { class: "flex-grow-1" };
12401
- const _hoisted_5$4 = { class: "bg-gray-100 py-5 rounded-8" };
12391
+ const _hoisted_4$5 = { class: "flex-grow-1" };
12392
+ const _hoisted_5$5 = { class: "bg-gray-100 py-5 rounded-8" };
12402
12393
  const _hoisted_6$3 = { class: "text-center" };
12403
12394
  const _hoisted_7$3 = { class: "bs-layout-horizontal justify-content-center align-items-center" };
12404
12395
  const _hoisted_8$2 = { class: "text-center" };
@@ -12433,8 +12424,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12433
12424
  [vue.unref(bluesea.vT), { key: "pb.prop.padding" }]
12434
12425
  ])
12435
12426
  ]),
12436
- vue.createElementVNode("div", _hoisted_4$4, [
12437
- vue.createElementVNode("div", _hoisted_5$4, [
12427
+ vue.createElementVNode("div", _hoisted_4$5, [
12428
+ vue.createElementVNode("div", _hoisted_5$5, [
12438
12429
  vue.createElementVNode("div", _hoisted_6$3, [
12439
12430
  vue.createVNode(vue.unref(bluesea.BSTextInput), {
12440
12431
  "model-value": top.value,
@@ -12868,8 +12859,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12868
12859
  key: 0,
12869
12860
  class: "title mt-12"
12870
12861
  };
12871
- const _hoisted_4$3 = { class: "url mt-8" };
12872
- const _hoisted_5$3 = { class: "title mt-12" };
12862
+ const _hoisted_4$4 = { class: "url mt-8" };
12863
+ const _hoisted_5$4 = { class: "title mt-12" };
12873
12864
  const _hoisted_6$2 = { class: "title mt-12" };
12874
12865
  const _hoisted_7$2 = { class: "title mt-12" };
12875
12866
  const _hoisted_8$1 = { class: "title mt-12" };
@@ -12960,7 +12951,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12960
12951
  ]),
12961
12952
  ((_a = media.value) == null ? void 0 : _a.fileUrl) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$9, [
12962
12953
  _cache[4] || (_cache[4] = vue.createElementVNode("label", null, "URL", -1)),
12963
- vue.createElementVNode("div", _hoisted_4$3, [
12954
+ vue.createElementVNode("div", _hoisted_4$4, [
12964
12955
  vue.createTextVNode(vue.toDisplayString((_b = media.value) == null ? void 0 : _b.fileUrl) + " ", 1),
12965
12956
  vue.withDirectives(vue.createVNode(vue.unref(bluesea.BSButton), {
12966
12957
  class: "border-0 mb-2 px-1",
@@ -12989,7 +12980,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
12989
12980
  ])
12990
12981
  ])) : vue.createCommentVNode("", true),
12991
12982
  ((_c = media.value) == null ? void 0 : _c.mediaType) === "Image" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
12992
- vue.createElementVNode("div", _hoisted_5$3, [
12983
+ vue.createElementVNode("div", _hoisted_5$4, [
12993
12984
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
12994
12985
  [vue.unref(bluesea.vT), { key: "pb.prop.altText" }]
12995
12986
  ])
@@ -13325,7 +13316,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
13325
13316
  ],
13326
13317
  initialProperties: {},
13327
13318
  allowsChild: () => false,
13328
- creator: () => PbYoutubeWidget
13319
+ creator: () => _sfc_main$4$1
13329
13320
  }
13330
13321
  /*
13331
13322
  * BSP에서 사용안함
@@ -15610,6 +15601,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
15610
15601
  });
15611
15602
  const canvasStyle = '.pb-page {\n display: flex;\n flex-direction: column;\n width: 100%;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n overflow-x: hidden;\n}\n.pb-page .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}\n.pb-page .pb-section .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}\n.pb-page .pb-section .pb-block .pb-widget {\n position: relative;\n background-position: 50% 50%;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\n}\n.pb-page .pb-section .pb-block .pb-text-widget {\n width: 100%;\n height: fit-content;\n}\n.pb-page .pb-section .pb-block .pb-text-widget .text {\n display: block;\n color: #333;\n}\n.pb-page .pb-section .pb-block .pb-text-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n.pb-page .pb-section .pb-block .pb-media-widget {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-media-widget .image-container {\n margin: 0;\n padding: 0;\n}\n.pb-page .pb-section .pb-block .pb-media-widget .image {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-media-widget .video {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-media-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n.pb-page .pb-section .pb-block .pb-media-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n.pb-page .pb-section .pb-block .pb-html-widget {\n width: 100%;\n height: fit-content;\n}\n.pb-page .pb-section .pb-block .pb-html-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n.pb-page .pb-section .pb-block .pb-iframe-widget {\n width: 100%;\n height: fit-content;\n}\n.pb-page .pb-section .pb-block .pb-iframe-widget .placeholder {\n padding: 4px 0;\n font-size: 18px;\n text-align: center;\n color: #999;\n}\n.pb-page .pb-section .pb-block .pb-youtube-widget {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-youtube-widget .youtube {\n width: 100%;\n height: 100%;\n}\n.pb-page .pb-section .pb-block .pb-youtube-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n.pb-page .pb-section .pb-block .pb-youtube-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n.pb-page .pb-section .pb-block .pb-container-widget {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-container-widget .placeholder {\n height: 100px;\n background-color: #eee;\n text-align: center;\n}\n.pb-page .pb-section .pb-block .pb-container-widget .placeholder span {\n font-size: 40px;\n color: #999;\n line-height: 100px;\n vertical-align: middle;\n}\n.pb-page .pb-section .pb-block .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.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper {\n width: 25%;\n}\n.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper .product {\n width: 95%;\n margin: 0 auto;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper img {\n width: 100%;\n}\n.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper .name {\n margin-top: 8px;\n font-size: 14px;\n}\n.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper .price {\n margin-top: 8px;\n font-size: 14px;\n font-weight: bold;\n}\n.pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper .empty {\n height: 200px;\n background-color: #eee;\n text-align: center;\n}\n.pb-page .pb-section .pb-block .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@media (max-width: 768px) {\n .pb-page .pb-section .pb-block .pb-product-list-widget .product-wrapper {\n width: 50%;\n }\n}\n.pb-page .pb-section .pb-block .mobile .pb-product-list-widget .product-wrapper {\n width: 50%;\n}\n.pb-page .pb-section .pb-block .pb-login-widget {\n height: 200px;\n text-align: center;\n}\n.pb-page .pb-section .pb-block .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.pb-page * {\n box-sizing: border-box;\n}\n.pb-viewer {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n overflow-y: auto;\n}\n.pb-page-wrapper {\n margin: 0 auto;\n padding: 0;\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.pb-page .pb-page-content {\n display: flex;\n flex-direction: column;\n width: 100%;\n background-color: #fff;\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.pb-page * {\n box-sizing: border-box;\n}\n.pb-add-widget-button {\n width: 100%;\n height: 100%;\n min-height: 200px;\n position: relative;\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.pb-add-widget-button button:hover {\n background-color: #eeeeee;\n}\n.pb-add-widget-button .icon {\n font-size: 1rem;\n vertical-align: middle;\n}\n.pb-add-widget-button .text {\n font-size: 1rem;\n vertical-align: middle;\n margin-left: 0.4rem;\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}\n.pb-section:empty {\n background-color: #fff;\n}\n.pb-section:hover:not(:has(.pb-block:hover)) {\n background-color: #f0f0f0;\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.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.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.pb-section-static .pb-widget {\n outline: none;\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.pb-block:hover:not(:has(.pb-widget:hover)) {\n background-color: #f0f0f0;\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.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 min-height: 50px;\n}\n.pb-widget * {\n pointer-events: none;\n}\n.pb-widget > .invalid-widget {\n display: flex;\n height: 50px;\n justify-content: center;\n align-items: center;\n width: 100%;\n font-size: 18px;\n text-align: center;\n color: #999;\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.pb-widget .children {\n position: absolute;\n width: 100%;\n height: 100%;\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.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}\nbody {\n margin: 0;\n padding: 0;\n background-color: var(--color-canvas-frame-bg);\n overflow: hidden;\n}\n.font-icon, .material-icons-outlined {\n font-family: "Material Symbols Outlined", monospace;\n font-size: 1rem;\n max-width: 1em;\n}\n.pb-position-mark {\n background-color: #ff3333;\n opacity: 0.5;\n border-radius: 2px;\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.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.pb-add-section-handle.bottom {\n bottom: -32px;\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.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}';
15612
15603
  const _hoisted_1$h = ["width"];
15604
+ const iframeSrcdoc = "<!doctype html><html><head></head><body></body></html>";
15613
15605
  const _sfc_main$h = /* @__PURE__ */ vue.defineComponent({
15614
15606
  __name: "PbPageFrame",
15615
15607
  props: {
@@ -15620,41 +15612,41 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
15620
15612
  const props = __props;
15621
15613
  const pageBuilderEditor = usePageBuilderEditor();
15622
15614
  const iframeRef = vue.ref();
15615
+ const ready = vue.ref(false);
15623
15616
  provideMouseTracker(iframeRef);
15624
- const stopIframeWatch = vue.watch(
15625
- () => {
15626
- var _a, _b;
15627
- return (_b = (_a = iframeRef.value) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.document;
15628
- },
15629
- () => {
15630
- var _a, _b, _c, _d, _e, _f, _g, _h;
15631
- if ((_c = (_b = (_a = iframeRef.value) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.document) == null ? void 0 : _c.head) {
15632
- const externalCss = pageBuilderEditor.getExternalCss();
15633
- const head = (_e = (_d = iframeRef.value) == null ? void 0 : _d.contentWindow) == null ? void 0 : _e.document.head;
15634
- head.innerHTML = `
15635
- <meta charset="UTF-8"/>
15636
- <link
15637
- href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block"
15638
- rel="stylesheet"/>
15639
- ${externalCss}
15640
- <style>${canvasStyle}</style>
15641
- `;
15642
- const script2 = (_g = (_f = iframeRef.value) == null ? void 0 : _f.contentWindow) == null ? void 0 : _g.document.createElement("script");
15643
- script2.innerHTML = `
15644
- function forwardPostMessage(event) {
15645
- if (event.data) {
15646
- console.log(event)
15647
- window.parent.postMessage(event.data, '*');
15648
- }
15649
- }
15650
- window.addEventListener('message', forwardPostMessage);
15651
- `;
15652
- (_h = iframeRef.value) == null ? void 0 : _h.contentWindow.document.head.appendChild(script2);
15653
- pageBuilderEditor.keyHandlers.addDocumentKeyEventListener(iframeRef.value.contentWindow.document.body);
15654
- stopIframeWatch();
15655
- }
15656
- }
15657
- );
15617
+ const onIframeLoad = () => {
15618
+ var _a, _b;
15619
+ if (ready.value) return;
15620
+ const doc = (_b = (_a = iframeRef.value) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.document;
15621
+ if (!(doc == null ? void 0 : doc.head)) return;
15622
+ const externalCss = pageBuilderEditor.getExternalCss();
15623
+ doc.head.innerHTML = `
15624
+ <meta charset="UTF-8"/>
15625
+ <link
15626
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=block"
15627
+ rel="stylesheet"/>
15628
+ ${externalCss}
15629
+ <style>${canvasStyle}</style>
15630
+ `;
15631
+ const script2 = doc.createElement("script");
15632
+ script2.innerHTML = `
15633
+ function forwardPostMessage(event) {
15634
+ if (event.data) {
15635
+ console.log(event)
15636
+ window.parent.postMessage(event.data, '*');
15637
+ }
15638
+ }
15639
+ window.addEventListener('message', forwardPostMessage);
15640
+ `;
15641
+ doc.head.appendChild(script2);
15642
+ pageBuilderEditor.keyHandlers.addDocumentKeyEventListener(doc.body);
15643
+ ready.value = true;
15644
+ resizeObserver = new ResizeObserver(updateIframeHeight);
15645
+ resizeObserver.observe(doc.body, {});
15646
+ mutationObserver = new MutationObserver(updateIframeHeight);
15647
+ mutationObserver.observe(doc.body, { childList: true, subtree: true });
15648
+ updateIframeHeight();
15649
+ };
15658
15650
  const width = vue.ref(props.width);
15659
15651
  vue.ref(200);
15660
15652
  const isMobilePage = vue.computed(() => width.value <= 768);
@@ -15679,15 +15671,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
15679
15671
  }
15680
15672
  });
15681
15673
  };
15682
- vue.onMounted(() => {
15683
- if (!iframeRef.value || !iframeRef.value.contentDocument) return;
15684
- const iframeBody = iframeRef.value.contentDocument.body;
15685
- resizeObserver = new ResizeObserver(updateIframeHeight);
15686
- resizeObserver.observe(iframeBody, {});
15687
- mutationObserver = new MutationObserver(updateIframeHeight);
15688
- mutationObserver.observe(iframeBody, { childList: true, subtree: true });
15689
- iframeRef.value.onload = updateIframeHeight;
15690
- });
15691
15674
  vue.onBeforeUnmount(() => {
15692
15675
  if (resizeObserver) {
15693
15676
  resizeObserver.disconnect();
@@ -15716,11 +15699,13 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
15716
15699
  vue.createElementVNode("iframe", {
15717
15700
  ref_key: "iframeRef",
15718
15701
  ref: iframeRef,
15702
+ srcdoc: iframeSrcdoc,
15719
15703
  style: vue.normalizeStyle(style.value),
15720
15704
  width: `${width.value}px`,
15721
- class: "page-frame mt-12"
15722
- }, null, 12, _hoisted_1$h),
15723
- ((_b = (_a = iframeRef.value) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.document.body) ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
15705
+ class: "page-frame mt-12",
15706
+ onLoad: onIframeLoad
15707
+ }, null, 44, _hoisted_1$h),
15708
+ ready.value && ((_b = (_a = iframeRef.value) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.document.body) ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
15724
15709
  key: 0,
15725
15710
  to: (_d = (_c = iframeRef.value) == null ? void 0 : _c.contentWindow) == null ? void 0 : _d.document.body
15726
15711
  }, [
@@ -17578,10 +17563,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
17578
17563
  });
17579
17564
  return (_ctx, _cache) => {
17580
17565
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$f, [
17581
- (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent("script"), {
17582
- id: "youtube-iframe-js-api-script",
17583
- src: "https://www.youtube.com/iframe_api"
17584
- })),
17585
17566
  vue.createVNode(_sfc_main$o, { "toolbar-plugin": _ctx.toolbarPlugin }, null, 8, ["toolbar-plugin"]),
17586
17567
  vue.createElementVNode("div", _hoisted_2$e, [
17587
17568
  vue.createVNode(_sfc_main$n, { class: "w-240 min-w-120" }),
@@ -17962,8 +17943,8 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
17962
17943
  key: 0,
17963
17944
  class: "title mt-12"
17964
17945
  };
17965
- const _hoisted_4$2 = { class: "mt-8" };
17966
- const _hoisted_5$2 = { class: "title mt-12" };
17946
+ const _hoisted_4$3 = { class: "mt-8" };
17947
+ const _hoisted_5$3 = { class: "title mt-12" };
17967
17948
  const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
17968
17949
  __name: "PbPropertyEditorImage",
17969
17950
  props: {
@@ -18025,7 +18006,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18025
18006
  ]),
18026
18007
  ((_a = media.value) == null ? void 0 : _a.fileUrl) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$5, [
18027
18008
  _cache[0] || (_cache[0] = vue.createElementVNode("label", null, "URL", -1)),
18028
- vue.createElementVNode("div", _hoisted_4$2, [
18009
+ vue.createElementVNode("div", _hoisted_4$3, [
18029
18010
  vue.createTextVNode(vue.toDisplayString((_b = media.value) == null ? void 0 : _b.fileUrl) + " ", 1),
18030
18011
  vue.withDirectives(vue.createVNode(vue.unref(bluesea.BSButton), {
18031
18012
  class: "border-0 mb-2 px-1",
@@ -18054,7 +18035,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18054
18035
  ])
18055
18036
  ])) : vue.createCommentVNode("", true),
18056
18037
  ((_c = media.value) == null ? void 0 : _c.mediaType) === "Image" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
18057
- vue.createElementVNode("div", _hoisted_5$2, [
18038
+ vue.createElementVNode("div", _hoisted_5$3, [
18058
18039
  vue.withDirectives(vue.createElementVNode("label", null, null, 512), [
18059
18040
  [vue.unref(bluesea.vT), { key: "pb.prop.altText" }]
18060
18041
  ])
@@ -18202,7 +18183,9 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18202
18183
  }, Symbol.toStringTag, { value: "Module" }));
18203
18184
  const _hoisted_1$3 = { class: "bs-layout-vertical flex-grow-1 h-full" };
18204
18185
  const _hoisted_2$3 = { class: "pt-8" };
18205
- const _hoisted_3$3 = { class: "bs-layout-horizontal justify-content-center" };
18186
+ const _hoisted_3$3 = { class: "preview-wrapper" };
18187
+ const _hoisted_4$2 = ["src"];
18188
+ const _hoisted_5$2 = { class: "bs-layout-horizontal justify-content-center" };
18206
18189
  const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
18207
18190
  __name: "PbYoutubeModal",
18208
18191
  props: {
@@ -18213,11 +18196,54 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18213
18196
  const props = __props;
18214
18197
  const emit = __emit;
18215
18198
  const modalHandle = bluesea.useModalHandle();
18216
- const previewContainer = vue.ref();
18217
18199
  const url = vue.ref(props.url);
18218
18200
  const aspectRatio = vue.ref();
18219
- const previewWidth = vue.ref(480);
18220
- const previewHeight = vue.ref(360);
18201
+ const extractVideoId = (raw) => {
18202
+ const value = raw.trim();
18203
+ if (!value) return void 0;
18204
+ if (/^[\w-]{11}$/.test(value)) return value;
18205
+ try {
18206
+ const u = new URL(value);
18207
+ const host = u.hostname.replace(/^www\./, "");
18208
+ if (host === "youtu.be") {
18209
+ const id = u.pathname.slice(1).split("/")[0];
18210
+ return id || void 0;
18211
+ }
18212
+ if (host === "youtube.com" || host === "youtube-nocookie.com" || host === "m.youtube.com") {
18213
+ const v = u.searchParams.get("v");
18214
+ if (v) return v;
18215
+ const segs = u.pathname.split("/").filter(Boolean);
18216
+ const idx = segs.findIndex((s) => s === "embed" || s === "shorts" || s === "live" || s === "v");
18217
+ if (idx >= 0 && segs[idx + 1]) return segs[idx + 1];
18218
+ }
18219
+ } catch {
18220
+ }
18221
+ return void 0;
18222
+ };
18223
+ const embedSrc = vue.computed(() => {
18224
+ if (!url.value) return void 0;
18225
+ const id = extractVideoId(url.value);
18226
+ if (!id) return void 0;
18227
+ return `https://www.youtube-nocookie.com/embed/${id}`;
18228
+ });
18229
+ const aspectRatioCss = vue.computed(() => {
18230
+ const raw = aspectRatio.value;
18231
+ if (raw) {
18232
+ const parts = raw.split("/");
18233
+ if (parts.length === 2) {
18234
+ const w = Number(parts[0]);
18235
+ const h = Number(parts[1]);
18236
+ if (w > 0 && h > 0) return `${w} / ${h}`;
18237
+ }
18238
+ }
18239
+ return "16 / 9";
18240
+ });
18241
+ const iframeStyle = vue.computed(() => ({
18242
+ width: "100%",
18243
+ aspectRatio: aspectRatioCss.value,
18244
+ border: "0",
18245
+ display: "block"
18246
+ }));
18221
18247
  const fetchAspectRatio = async (videoUrl) => {
18222
18248
  try {
18223
18249
  const oembedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(videoUrl)}&format=json`;
@@ -18226,7 +18252,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18226
18252
  const data = await response.json();
18227
18253
  if (data.width && data.height) {
18228
18254
  aspectRatio.value = `${data.width}/${data.height}`;
18229
- previewHeight.value = Math.round(previewWidth.value * data.height / data.width);
18230
18255
  }
18231
18256
  } catch {
18232
18257
  }
@@ -18241,21 +18266,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18241
18266
  if (props.url) {
18242
18267
  fetchAspectRatio(props.url);
18243
18268
  }
18244
- const measureContainer = () => {
18245
- var _a;
18246
- const w = (_a = previewContainer.value) == null ? void 0 : _a.clientWidth;
18247
- if (w && w > 0) {
18248
- previewWidth.value = w;
18249
- previewHeight.value = Math.round(w * 9 / 16);
18250
- return true;
18251
- }
18252
- return false;
18253
- };
18254
- vue.onMounted(() => {
18255
- if (!measureContainer()) {
18256
- requestAnimationFrame(() => measureContainer());
18257
- }
18258
- });
18259
18269
  const ok = () => {
18260
18270
  emit("selectUrl", url.value, aspectRatio.value);
18261
18271
  modalHandle.close();
@@ -18278,24 +18288,27 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18278
18288
  vue.withDirectives(vue.createElementVNode("div", _hoisted_2$3, null, 512), [
18279
18289
  [vue.unref(bluesea.vT), { key: "pb.modal.youtube.preview" }]
18280
18290
  ]),
18281
- vue.createElementVNode("div", {
18282
- ref_key: "previewContainer",
18283
- ref: previewContainer,
18284
- class: "preview-container border-w-1 border border-gray",
18285
- style: vue.normalizeStyle({ minHeight: url.value ? void 0 : "300px", overflow: "hidden" })
18286
- }, [
18287
- url.value ? (vue.openBlock(), vue.createBlock(vue.unref(YouTube), {
18291
+ vue.createElementVNode("div", _hoisted_3$3, [
18292
+ embedSrc.value ? (vue.openBlock(), vue.createElementBlock("iframe", {
18288
18293
  key: 0,
18289
- ref: "youtube",
18290
- src: url.value,
18291
- width: previewWidth.value,
18292
- height: previewHeight.value
18293
- }, null, 8, ["src", "width", "height"])) : vue.createCommentVNode("", true)
18294
- ], 4)
18294
+ src: embedSrc.value,
18295
+ style: vue.normalizeStyle(iframeStyle.value),
18296
+ frameborder: "0",
18297
+ referrerpolicy: "strict-origin-when-cross-origin",
18298
+ allow: "accelerometer; encrypted-media; gyroscope; picture-in-picture; web-share",
18299
+ allowfullscreen: "",
18300
+ loading: "lazy",
18301
+ title: "YouTube preview"
18302
+ }, null, 12, _hoisted_4$2)) : (vue.openBlock(), vue.createElementBlock("div", {
18303
+ key: 1,
18304
+ class: "preview-empty border-w-1 border border-gray",
18305
+ style: vue.normalizeStyle({ aspectRatio: aspectRatioCss.value })
18306
+ }, null, 4))
18307
+ ])
18295
18308
  ])
18296
18309
  ]),
18297
18310
  buttons: vue.withCtx(() => [
18298
- vue.createElementVNode("div", _hoisted_3$3, [
18311
+ vue.createElementVNode("div", _hoisted_5$2, [
18299
18312
  vue.withDirectives(vue.createElementVNode("button", {
18300
18313
  class: "mr-4",
18301
18314
  onClick: ok
@@ -18309,7 +18322,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
18309
18322
  };
18310
18323
  }
18311
18324
  });
18312
- const PbYoutubeModal = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-c0ba6980"]]);
18325
+ const PbYoutubeModal = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-b8f2a18d"]]);
18313
18326
  const PbYoutubeModal$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
18314
18327
  __proto__: null,
18315
18328
  default: PbYoutubeModal
@@ -18667,7 +18680,7 @@ ${_html.tags}` : "";
18667
18680
  exports2.PbIframeWidget = _sfc_main$5$1;
18668
18681
  exports2.PbMediaWidget = _sfc_main$8$1;
18669
18682
  exports2.PbTextWidget = _sfc_main$7$1;
18670
- exports2.PbYoutubeWidget = PbYoutubeWidget;
18683
+ exports2.PbYoutubeWidget = _sfc_main$4$1;
18671
18684
  exports2.ROOT_TYPE = ROOT_TYPE$1;
18672
18685
  exports2.RootPart = RootPart;
18673
18686
  exports2.SECTION_TYPE = SECTION_TYPE$1;