Files
webstudio/apps/builder/app/shared/copy-paste/plugin-embed-template.ts
T
Bogdan Chadkin 5e900ff2e8 Add component tokens support (#2147)
Ref https://github.com/webstudio-is/webstudio-builder/issues/2137

Here added static tokens support to meta. Id of resulting style source
become persistent like this "componentName:tokenName". Such token styles
are inserted only if style source with same id not exist. This way we
prevent breaking styles already changed by user.

Style source input now autocomplete global tokens and suggest to create
predefined component tokens.

Also disabled spell check in style source input.

<img width="244" alt="Screenshot 2023-08-20 at 17 18 37"
src="https://github.com/webstudio-is/webstudio-builder/assets/5635476/9572f5b1-6243-49fa-83be-a0315f104987">
2023-08-20 18:48:16 +04:00

78 lines
2.1 KiB
TypeScript

import { z } from "zod";
import {
WsEmbedTemplate,
generateDataFromEmbedTemplate,
} from "@webstudio-is/react-sdk";
import {
selectedInstanceSelectorStore,
instancesStore,
selectedPageStore,
registeredComponentMetasStore,
breakpointsStore,
} from "../nano-states";
import {
computeInstancesConstraints,
findClosestDroppableTarget,
insertTemplateData,
} from "../instance-utils";
import { isBaseBreakpoint } from "../breakpoints";
const version = "@webstudio/template";
const ClipboardData = z.object({ [version]: WsEmbedTemplate });
const parse = (clipboardData: string): WsEmbedTemplate | undefined => {
try {
const data = ClipboardData.parse(JSON.parse(clipboardData));
return data[version];
} catch {
return;
}
};
export const mimeType = "text/plain";
export const onPaste = (clipboardData: string): boolean => {
const template = parse(clipboardData);
const selectedPage = selectedPageStore.get();
if (template === undefined || selectedPage === undefined) {
return false;
}
// paste to the root if nothing is selected
const instanceSelector = selectedInstanceSelectorStore.get() ?? [
selectedPage.rootInstanceId,
];
const breakpoints = breakpointsStore.get();
const breakpointValues = Array.from(breakpoints.values());
const baseBreakpoint = breakpointValues.find(isBaseBreakpoint);
if (baseBreakpoint === undefined) {
return false;
}
const metas = registeredComponentMetasStore.get();
const templateData = generateDataFromEmbedTemplate(
template,
metas,
baseBreakpoint.id
);
const newInstances = new Map(
templateData.instances.map((instance) => [instance.id, instance])
);
const rootInstanceIds = templateData.children
.filter((child) => child.type === "id")
.map((child) => child.value);
const dropTarget = findClosestDroppableTarget(
metas,
instancesStore.get(),
instanceSelector,
computeInstancesConstraints(metas, newInstances, rootInstanceIds)
);
if (dropTarget === undefined) {
return false;
}
insertTemplateData(templateData, dropTarget);
return true;
};