diff --git a/apps/builder/app/shared/instance-utils.test.tsx b/apps/builder/app/shared/instance-utils.test.tsx
index cc2ebf23052b..a6db4c0d71e3 100644
--- a/apps/builder/app/shared/instance-utils.test.tsx
+++ b/apps/builder/app/shared/instance-utils.test.tsx
@@ -16,7 +16,6 @@ import type {
Asset,
Breakpoint,
Instance,
- Prop,
StyleDecl,
StyleDeclKey,
StyleSource,
@@ -172,175 +171,186 @@ const createFontAsset = (id: string, family: string): Asset => {
describe("insert instance children", () => {
test("insert instance children into empty target", () => {
- const instances = toMap([createInstance("body", "Body", [])]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["body"],
+ const data = renderData(
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["bodyId"],
position: "end",
});
- expect(data.instances).toEqual(
- toMap([createInstance("body", "Body", [{ type: "id", value: "box" }])])
+ expect(data).toEqual(
+ renderData(
+
+
+
+ )
);
});
test("insert instance children into the end of target", () => {
- const instances = toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- ]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["body"],
+ const data = renderData(
+
+
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["bodyId"],
position: "end",
});
- expect(data.instances).toEqual(
- toMap([
- createInstance("body", "Body", [
- { type: "id", value: "text" },
- { type: "id", value: "box" },
- ]),
- ])
+ expect(data).toEqual(
+ renderData(
+
+
+
+
+ )
);
});
test("insert instance children into the start of target", () => {
- const instances = toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- ]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["body"],
+ const data = renderData(
+
+
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["bodyId"],
position: 0,
});
- expect(data.instances).toEqual(
- toMap([
- createInstance("body", "Body", [
- { type: "id", value: "box" },
- { type: "id", value: "text" },
- ]),
- ])
+ expect(data).toEqual(
+ renderData(
+
+
+
+
+ )
);
});
test("insert instance children at the start of text", () => {
- const instances = toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [{ type: "text", value: "text" }]),
- ]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["text", "body"],
+ const data = renderData(
+
+
+ text
+
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["textId", "bodyId"],
position: 0,
});
- const [_bodyId, _textId, spanId] = data.instances.keys();
- expect(data.instances).toEqual(
- toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [
- { type: "id", value: "box" },
- { type: "id", value: spanId },
- ]),
- createInstance(spanId, "Text", [{ type: "text", value: "text" }]),
- ])
- );
- expect(data.props).toEqual(
- toMap([
- {
- id: expect.any(String) as unknown as string,
- instanceId: spanId,
- name: "tag",
- type: "string",
- value: "span",
- },
- ])
+ const [_bodyId, _textId, _divId, spanId] = data.instances.keys();
+ expect(data).toEqual(
+ renderData(
+
+
+
+
+ text
+
+
+
+ )
);
});
test("insert instance children at the end of text", () => {
- const instances = toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [{ type: "text", value: "text" }]),
- ]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["text", "body"],
+ const data = renderData(
+
+
+ text
+
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["textId", "bodyId"],
position: "end",
});
- const [_bodyId, _textId, spanId] = data.instances.keys();
- expect(data.instances).toEqual(
- toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [
- { type: "id", value: spanId },
- { type: "id", value: "box" },
- ]),
- createInstance(spanId, "Text", [{ type: "text", value: "text" }]),
- ])
- );
- expect(data.props).toEqual(
- toMap([
- {
- id: expect.any(String) as unknown as string,
- instanceId: spanId,
- name: "tag",
- type: "string",
- value: "span",
- },
- ])
+ const [_bodyId, _textId, _divId, spanId] = data.instances.keys();
+ expect(data).toEqual(
+ renderData(
+
+
+
+ text
+
+
+
+
+ )
);
});
test("insert instance children between text children", () => {
- const instances = toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [
- { type: "id", value: "bold" },
- { type: "text", value: "text" },
- { type: "id", value: "italic" },
- ]),
- createInstance("bold", "Bold", [{ type: "text", value: "bold" }]),
- createInstance("italic", "Italic", [{ type: "text", value: "italic" }]),
- ]);
- const data = getWebstudioDataStub({ instances });
- insertInstanceChildrenMutable(data, [{ type: "id", value: "box" }], {
- parentSelector: ["text", "body"],
+ const data = renderData(
+
+
+
+ strong
+
+ text
+
+ emphasis
+
+
+
+ );
+ const [div] = renderTemplate(
+
+ ).instances;
+ data.instances.set(div.id, div);
+ insertInstanceChildrenMutable(data, [{ type: "id", value: "divId" }], {
+ parentSelector: ["textId", "bodyId"],
position: 1,
});
- const [_bodyId, _textId, _boldId, _italicId, leftSpanId, rightSpanId] =
- data.instances.keys();
- expect(data.instances).toEqual(
- toMap([
- createInstance("body", "Body", [{ type: "id", value: "text" }]),
- createInstance("text", "Text", [
- { type: "id", value: leftSpanId },
- { type: "id", value: "box" },
- { type: "id", value: rightSpanId },
- ]),
- createInstance("bold", "Bold", [{ type: "text", value: "bold" }]),
- createInstance("italic", "Italic", [{ type: "text", value: "italic" }]),
- createInstance(leftSpanId, "Text", [{ type: "id", value: "bold" }]),
- createInstance(rightSpanId, "Text", [
- { type: "text", value: "text" },
- { type: "id", value: "italic" },
- ]),
- ])
- );
- expect(data.props).toEqual(
- toMap([
- {
- id: expect.any(String) as unknown as string,
- instanceId: leftSpanId,
- name: "tag",
- type: "string",
- value: "span",
- },
- {
- id: expect.any(String) as unknown as string,
- instanceId: rightSpanId,
- name: "tag",
- type: "string",
- value: "span",
- },
- ])
+ const [
+ _bodyId,
+ _textId,
+ _strongId,
+ _emId,
+ _divId,
+ leftSpanId,
+ rightSpanId,
+ ] = data.instances.keys();
+ expect(data).toEqual(
+ renderData(
+
+
+
+
+ strong
+
+
+
+
+ text
+
+ emphasis
+
+
+
+
+ )
);
});
});
diff --git a/apps/builder/app/shared/instance-utils.ts b/apps/builder/app/shared/instance-utils.ts
index 303b9a6a33d7..0519e9bff493 100644
--- a/apps/builder/app/shared/instance-utils.ts
+++ b/apps/builder/app/shared/instance-utils.ts
@@ -207,7 +207,7 @@ export const findAllEditableInstanceSelector = ({
};
export const insertInstanceChildrenMutable = (
- data: WebstudioData,
+ data: Omit,
children: Instance["children"],
insertTarget: Insertable
) => {
diff --git a/apps/builder/app/shared/tree-utils.ts b/apps/builder/app/shared/tree-utils.ts
index 9a5fcf50179f..0a578532c1f7 100644
--- a/apps/builder/app/shared/tree-utils.ts
+++ b/apps/builder/app/shared/tree-utils.ts
@@ -3,7 +3,6 @@ import { shallowEqual } from "shallow-equal";
import type {
Instance,
Instances,
- Prop,
Props,
StyleDecl,
Styles,
@@ -11,7 +10,7 @@ import type {
StyleSourceSelection,
WsComponentMeta,
} from "@webstudio-is/sdk";
-import { collectionComponent } from "@webstudio-is/sdk";
+import { collectionComponent, elementComponent } from "@webstudio-is/sdk";
import { isRichTextTree } from "./content-model";
// slots can have multiple parents so instance should be addressed
@@ -170,19 +169,12 @@ export const wrapEditableChildrenAroundDropTargetMutable = (
const leftSpan: Instance = {
id: nanoid(),
type: "instance",
- component: "Text",
+ component: elementComponent,
+ tag: "span",
children: parentInstance.children.slice(0, position),
};
newChildren.push({ type: "id", value: leftSpan.id });
instances.set(leftSpan.id, leftSpan);
- const tagProp: Prop = {
- id: nanoid(),
- instanceId: leftSpan.id,
- type: "string",
- name: "tag",
- value: "span",
- };
- props.set(tagProp.id, tagProp);
newPosition = 1;
}
// create right span when not in the end
@@ -190,19 +182,12 @@ export const wrapEditableChildrenAroundDropTargetMutable = (
const rightSpan: Instance = {
id: nanoid(),
type: "instance",
- component: "Text",
+ component: elementComponent,
+ tag: "span",
children: parentInstance.children.slice(position),
};
newChildren.push({ type: "id", value: rightSpan.id });
instances.set(rightSpan.id, rightSpan);
- const tagProp: Prop = {
- id: nanoid(),
- instanceId: rightSpan.id,
- type: "string",
- name: "tag",
- value: "span",
- };
- props.set(tagProp.id, tagProp);
}
parentInstance.children = newChildren;
return {