mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-11-07 20:44:05 +09:00
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">
78 lines
2.1 KiB
TypeScript
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;
|
|
};
|