@growgroup/visual-editor 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/package.json +1 -1
- package/src/editor/utils/dom-utils.ts +49 -3
- package/src/version.ts +1 -1
package/README.md
CHANGED
|
@@ -166,6 +166,12 @@ setEditorIO({
|
|
|
166
166
|
ブラウザがページから iframe の中を読ませないため、エディタ自体が動きません
|
|
167
167
|
- 仕組みと確かめたことは [docs/collab-2026-09.md](docs/collab-2026-09.md)
|
|
168
168
|
|
|
169
|
+
### スライドを開くと版面がずれる(0.8.1)
|
|
170
|
+
|
|
171
|
+
- 部品の中の罫線など**編集対象でない要素が上へ詰まる**件と、**全要素の幅・高さが 1px 膨らむ**(1px の罫線が 2px になる)件を直しました。
|
|
172
|
+
どちらもスライドを開くときの絶対配置への変換の採寸の問題で、iframe とは関係ありません。
|
|
173
|
+
原因と確かめたことは [docs/canvas-label-2026-09.md](docs/canvas-label-2026-09.md)
|
|
174
|
+
|
|
169
175
|
### 線の欄・リンク移動のキー・キャンバスのラベル崩れ(0.8.0)
|
|
170
176
|
|
|
171
177
|
- **リンク先へ移るのは Alt(Mac は ⌥ Option)+ クリック**になりました(0.7.0 は ⌘ / Ctrl + クリック)。
|
package/package.json
CHANGED
|
@@ -731,6 +731,47 @@ export function convertToAbsolutePositioning(iframeDoc: Document): number {
|
|
|
731
731
|
});
|
|
732
732
|
});
|
|
733
733
|
|
|
734
|
+
// 1.5 編集対象でない、流れの中のブロックの兄弟も一緒に倒す。
|
|
735
|
+
// 部品(data-part)の中では data-slot だけが編集対象なので、スロットの間にある罫線(h-px の div)などは
|
|
736
|
+
// 流れに残る。兄弟が絶対配置で抜けると、その分だけ上へ詰まる(ヘッダーの罫線が 116px 上へ動いた実測)。
|
|
737
|
+
// 自己検証は編集対象しか見ていなかったので、崩れたまま確定していた。
|
|
738
|
+
// 位置を固定するだけで編集対象にはしない(data-editable は付けない)
|
|
739
|
+
const captured = new Set<HTMLElement>(captures.map((c) => c.element));
|
|
740
|
+
const parentsOfCaptured = new Set<HTMLElement>();
|
|
741
|
+
captures.forEach(({ parent }) => {
|
|
742
|
+
if (parent && parent !== iframeDoc.body && parent !== artboard) parentsOfCaptured.add(parent);
|
|
743
|
+
});
|
|
744
|
+
parentsOfCaptured.forEach((parent) => {
|
|
745
|
+
Array.from(parent.children).forEach((child) => {
|
|
746
|
+
const element = child as HTMLElement;
|
|
747
|
+
if (captured.has(element) || skippedInline.some((s) => s.element === element)) return;
|
|
748
|
+
if (element.classList.contains('selection-box') || element.classList.contains('gg-comment-layer')) return;
|
|
749
|
+
if (isNonEditableTag(element)) return;
|
|
750
|
+
const computedStyle = iframeDoc.defaultView!.getComputedStyle(element);
|
|
751
|
+
// 流れの外(absolute / fixed)・非表示は兄弟に影響されない
|
|
752
|
+
if (computedStyle.position === 'absolute' || computedStyle.position === 'fixed') return;
|
|
753
|
+
if (computedStyle.display === 'none') return;
|
|
754
|
+
const parentDisplay = iframeDoc.defaultView!.getComputedStyle(parent).display;
|
|
755
|
+
const isFlexOrGridItem = /(^|\s)(inline-)?(flex|grid)($|\s)/.test(parentDisplay);
|
|
756
|
+
if (!isFlexOrGridItem && isInlineElement(element, computedStyle)) {
|
|
757
|
+
skippedInline.push({ element, rect: element.getBoundingClientRect() });
|
|
758
|
+
return;
|
|
759
|
+
}
|
|
760
|
+
captured.add(element);
|
|
761
|
+
captures.push({
|
|
762
|
+
element,
|
|
763
|
+
rect: element.getBoundingClientRect(),
|
|
764
|
+
parent,
|
|
765
|
+
parentRect: parent.getBoundingClientRect(),
|
|
766
|
+
computedStyle,
|
|
767
|
+
parentComputedStyle: iframeDoc.defaultView!.getComputedStyle(parent),
|
|
768
|
+
originalTransform: computedStyle.transform,
|
|
769
|
+
scale,
|
|
770
|
+
prevStyle: element.getAttribute('style'),
|
|
771
|
+
});
|
|
772
|
+
});
|
|
773
|
+
});
|
|
774
|
+
|
|
734
775
|
// 2. 親要素を処理(position: relative設定)
|
|
735
776
|
//
|
|
736
777
|
// [採寸より前にやる] offsetLeft/offsetTop は offsetParent 基準の値なので、
|
|
@@ -768,13 +809,18 @@ export function convertToAbsolutePositioning(iframeDoc: Document): number {
|
|
|
768
809
|
if (element.offsetParent !== parent) return;
|
|
769
810
|
// 寸法は offsetWidth(整数へ丸める)ではなく、rect の小数値を**切り上げ**て使う。
|
|
770
811
|
// 例: 必要幅1227.4pxの文字列を1227pxで固定すると最後の1文字だけが折り返す
|
|
771
|
-
// (284pxの「テキスト」で実害)。位置は1px未満の誤差が折り返しを生まないので offset
|
|
812
|
+
// (284pxの「テキスト」で実害)。位置は1px未満の誤差が折り返しを生まないので offset で良い。
|
|
813
|
+
// ただし rect は縮小した紙面の値で、ブラウザは 1/64px に丸めて返す(56px × 0.55 = 30.8 → 30.8125)。
|
|
814
|
+
// 倍率で割り戻すと 56.02 のように少しだけ大きくなり、そのまま切り上げると全部の要素が 1px 膨らむ
|
|
815
|
+
// (h-px の罫線が 2px、56px の帯が 57px になった実測)。丸めの分だけ引いてから切り上げる
|
|
772
816
|
const s = capScale || 1;
|
|
817
|
+
const quantum = 1 / 64 / s + 0.005;
|
|
818
|
+
const ceilSize = (v: number) => Math.max(0, Math.ceil(v - quantum));
|
|
773
819
|
offsets.set(element, {
|
|
774
820
|
left: element.offsetLeft,
|
|
775
821
|
top: element.offsetTop,
|
|
776
|
-
width:
|
|
777
|
-
height:
|
|
822
|
+
width: ceilSize(rect.width / s),
|
|
823
|
+
height: ceilSize(rect.height / s),
|
|
778
824
|
});
|
|
779
825
|
});
|
|
780
826
|
|
package/src/version.ts
CHANGED