이미지 파일 업로드 기능
CI / test (push) Failing after 10m34s
CI / pr_and_merge (push) Has been cancelled

This commit is contained in:
2025-11-23 19:07:41 +09:00
parent 8ea8a186a0
commit 7a8ad7c057
77 changed files with 3206 additions and 124 deletions
+43
View File
@@ -125,6 +125,12 @@ export interface ImageBlockProps {
widthPx?: number;
// 모서리 둥글기
borderRadius?: "none" | "sm" | "md" | "lg" | "full";
// 모서리 둥글기 px 값 (이미지에 한해서는 연속적인 px 단위 조정을 지원한다)
borderRadiusPx?: number;
// 이미지 소스 타입: 업로드된 에셋 또는 외부 URL
sourceType?: "asset" | "externalUrl";
// 업로드된 에셋인 경우 Asset.id 를 저장해둔다.
assetId?: string | null;
}
// 구분선 블록 속성
@@ -553,6 +559,8 @@ export interface FormCheckboxBlockProps extends FormFieldStyleProps {
// 그룹 타이틀 자체도 텍스트/이미지 모드를 가질 수 있도록 분리한다.
groupLabelMode?: FormLabelMode;
groupLabelImageUrl?: string;
groupLabelImageSource?: "url" | "upload";
optionImageSource?: "url" | "upload";
}
// 폼 라디오 그룹 옵션/블록 속성
@@ -571,6 +579,8 @@ export interface FormRadioBlockProps extends FormFieldStyleProps {
// 라디오 그룹 타이틀의 텍스트/이미지 모드
groupLabelMode?: FormLabelMode;
groupLabelImageUrl?: string;
groupLabelImageSource?: "url" | "upload";
optionImageSource?: "url" | "upload";
}
// 폼 필드 설정
@@ -611,6 +621,19 @@ export interface FormBlockProps {
marginYPx?: number;
}
export type CanvasPreset = "mobile" | "tablet" | "desktop" | "full" | "custom";
export interface ProjectConfig {
title: string;
slug: string;
canvasPreset: CanvasPreset;
canvasWidthPx?: number;
canvasBgColorHex?: string;
bodyBgColorHex?: string;
headHtml?: string;
trackingScript?: string;
}
// 공통 블록 모델
export interface Block {
id: string;
@@ -639,6 +662,8 @@ export interface EditorState {
selectedListItemId?: string | null;
history: Block[][];
future: Block[][];
projectConfig: ProjectConfig;
updateProjectConfig: (partial: Partial<ProjectConfig>) => void;
addTextBlock: () => void;
addButtonBlock: () => void;
addImageBlock: () => void;
@@ -716,6 +741,24 @@ const createEditorState = (set: any, get: any): EditorState => ({
selectedListItemId: null,
history: [],
future: [],
projectConfig: {
title: "새 페이지",
slug: "my-landing",
canvasPreset: "full",
canvasBgColorHex: "#020617",
bodyBgColorHex: "#020617",
headHtml: "",
trackingScript: "",
},
updateProjectConfig: (partial: Partial<ProjectConfig>) => {
set((state: EditorState) => ({
projectConfig: {
...state.projectConfig,
...partial,
},
}));
},
// 텍스트 블록 추가: 기본 텍스트와 함께 생성 후 선택 상태로 만든다
addTextBlock: () => {