From 4840a530b6b6808d90d6e237ee6eeba0c0c005e3 Mon Sep 17 00:00:00 2001 From: Jaybe Date: Fri, 12 Dec 2025 18:04:31 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../forms/FormCheckboxPropertiesPanel.tsx | 56 +-- src/app/editor/forms/FormControllerPanel.tsx | 12 +- .../editor/forms/FormInputPropertiesPanel.tsx | 46 +- .../editor/forms/FormRadioPropertiesPanel.tsx | 84 ++-- .../forms/FormSelectPropertiesPanel.tsx | 54 +- src/app/editor/page.tsx | 21 +- src/app/editor/panels/BlocksSidebar.tsx | 59 ++- .../editor/panels/SectionPropertiesPanel.tsx | 62 +-- src/app/editor/templates/pricingTemplate.ts | 14 +- .../editor/templates/testimonialsTemplate.ts | 10 +- src/app/layout.tsx | 9 +- src/app/p/[slug]/PublicProjectPageClient.tsx | 11 +- src/app/projects/[slug]/submissions/page.tsx | 53 +- .../components/NumericPropertyControl.tsx | 2 +- .../editor/components/PublicPageRenderer.tsx | 2 +- src/features/editor/state/editorStore.ts | 150 +++--- src/features/i18n/LocaleSwitcher.tsx | 7 + src/features/i18n/messages/editor.ts | 11 + .../i18n/messages/editorBlockDefaults.ts | 121 +++++ .../i18n/messages/editorButtonPanel.ts | 8 +- .../messages/editorDividerPropertiesPanel.ts | 8 +- .../i18n/messages/editorFormCheckboxPanel.ts | 28 +- .../messages/editorFormControllerPanel.ts | 26 +- .../i18n/messages/editorFormInputPanel.ts | 117 ++++- .../i18n/messages/editorFormRadioPanel.ts | 154 +++++- .../i18n/messages/editorFormSelectPanel.ts | 24 +- .../i18n/messages/editorImagePanel.ts | 8 +- src/features/i18n/messages/editorListPanel.ts | 8 +- .../i18n/messages/editorPropertiesSidebar.ts | 38 +- .../i18n/messages/editorSectionPanel.ts | 8 +- src/features/i18n/messages/editorTextPanel.ts | 4 +- .../i18n/messages/editorVideoPanel.ts | 8 +- test-results/.last-run.json | 46 -- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- .../error-context.md | 213 -------- tests/e2e/block-styles-regression.spec.ts | 281 ++++++----- tests/e2e/editor.spec.ts | 383 +++++++------- tests/e2e/form-editor-preview-parity.spec.ts | 68 +-- tests/e2e/form-submission-flow.spec.ts | 77 +-- tests/e2e/preview.spec.ts | 467 +++++++++--------- tests/e2e/projects.spec.ts | 22 +- tests/unit/ButtonPropertiesPanel.spec.tsx | 4 +- tests/unit/DividerPropertiesPanel.spec.tsx | 8 +- tests/unit/EditorImageBlockStyle.spec.tsx | 63 +++ tests/unit/EditorSelectionFocus.spec.tsx | 2 +- tests/unit/FormFieldPropertiesPanels.spec.tsx | 94 ++-- tests/unit/ImagePropertiesPanel.spec.tsx | 2 +- tests/unit/ListPropertiesPanel.spec.tsx | 4 +- tests/unit/ProjectPropertiesPanel.spec.tsx | 8 +- tests/unit/editorStore.spec.ts | 88 +++- uploads/0133a91f-c190-40eb-88b2-5791d29b6daf | 1 + uploads/06a7cc28-f984-425a-ba9d-77833a71b137 | 1 + uploads/085f876e-618a-431b-acb0-7078263cd757 | 1 + uploads/098f11f3-afba-4a53-b3c1-d727ffbdf158 | 1 + uploads/0fecaa59-dd24-4480-8b72-71c82d3408dc | 1 + uploads/109cf4ca-0f46-4b20-87fc-1da30c2ff646 | 1 + uploads/11ad8bf6-5a96-4d74-9419-3ad0bffed027 | 1 + uploads/11c5d9e1-17b9-4842-89b7-960677443f4e | 1 + uploads/1244ddcb-02c1-4cb1-99ec-8fe6174da25b | 1 + uploads/16689118-d6f7-4ffb-bf54-3ef2f5c2d4af | 1 + uploads/1c92c15e-efea-4807-983e-c203b74b6fae | 1 + uploads/1cbb135f-61bd-4eaa-b33b-7c6b2f8fc739 | 1 + uploads/1e8d0adc-ccdd-408a-b0ff-14d91ce919c1 | 1 + uploads/28048a81-d011-442d-a061-0e85cbd69b98 | 1 + uploads/29ec9caa-2057-4de2-a644-b73968c50303 | 1 + uploads/2ce86e85-cb16-4d27-b221-28940c1ee602 | 1 + uploads/30d556a8-b5c6-4fbb-a600-6f4c3cd2f62d | 1 + uploads/31dd0255-ead7-4d7d-a8b6-49fa4c64295f | 1 + uploads/332c39fe-de4f-4c05-be13-e8ce3727beb5 | 1 + uploads/35386cc9-549e-44b9-b2c0-5e33c65a5ae5 | 1 + uploads/3717db8c-0b0d-4a9a-a149-74b0831a6e2e | 1 + uploads/3d8e6a2f-eb20-4e9a-bd51-a9597c318111 | 1 + uploads/3e7ba460-5a8e-4fb4-88eb-bf4942a7949a | 1 + uploads/41106e2c-fefc-463c-a446-e46af32cafba | 1 + uploads/49fe32ca-62ad-4949-b50b-0257ad20c140 | 1 + uploads/4d51ba66-1f72-4819-bb82-6e801e8cc2a4 | 1 + uploads/50787c25-f9b5-445a-ae90-104e45a5126c | 1 + uploads/511976e2-ff33-4733-b305-9432fef9c64e | 1 + uploads/512a884d-0d8c-4eed-ac24-e6b18f1fe51b | 1 + uploads/55e7fd72-1dac-4b04-99f9-372fd4da774d | 1 + uploads/5685a614-d830-4098-b047-b5b894750fae | 1 + uploads/5b05037e-ffc8-42ab-a9d3-93f1230e07fd | 1 + uploads/5d02e4bd-71d1-4a7d-8922-4d6fdc57b18c | 1 + uploads/6240c486-f13a-4e1a-ab5b-f4fe29849f60 | 1 + uploads/686c641f-549d-4f96-a9d6-527399ee52a3 | 1 + uploads/6b90dd9d-56c0-445b-8f57-9e8ca4ad51b8 | 1 + uploads/6bf691f9-3d3a-42f7-b377-6770e8eea1ec | 1 + uploads/6ee59300-97a9-4c92-ae27-6877ac04311d | 1 + uploads/70841d0f-6ef0-4aab-9485-65e11330a85b | 1 + uploads/70d3d617-355c-4979-99e4-600b248d6bac | 1 + uploads/71224205-127a-44ae-aea5-b3b7998405e5 | 1 + uploads/727d5430-9114-4184-bca8-d01840f3dd54 | 1 + uploads/733cf0a6-d2d5-4c39-a6da-c4c1de12a2e5 | 1 + uploads/73544864-4f95-45dc-9643-e5f03cda8a83 | 1 + uploads/73c051c1-07a6-4e5d-95b0-0aa5fe47da32 | 1 + uploads/77c52bd2-b698-4d0c-a97e-a8cebd292006 | 1 + uploads/7dd8ce0a-3fe1-4ba4-b0cd-ae52eda59a9e | 1 + uploads/7fa6df92-76f7-423b-9e30-c78c94db705b | 1 + uploads/849ab2ab-8e58-4ca3-b690-2a3d86326d00 | 1 + uploads/881ade16-a09c-4906-a361-b0a21d463213 | 1 + uploads/88b162ba-8d1d-47b5-af9d-ba363f4ae127 | 1 + uploads/8bb4cf97-8915-41a3-8b7d-673fdc7a8319 | 1 + uploads/8c22181d-7876-48ea-baeb-d45d495878a7 | 1 + uploads/8dd3323b-68fe-48c6-aef2-512e2074bc3b | 1 + uploads/8e1e2352-900a-42ad-ab73-7069f57cbcd5 | 1 + uploads/8e5041a3-d859-4149-81a2-ec0f3c3b4b04 | 1 + uploads/905cddee-91fa-4d18-9e69-9439d6daef39 | 1 + uploads/92d39c4a-b9f7-4688-a5cb-1147d6e646e9 | 1 + uploads/94eb9300-3114-4b38-9e5b-db8095575a56 | 1 + uploads/950db654-0a94-4878-993b-79d1cff68a7f | 1 + uploads/963005d1-d720-4b81-993b-a1c603933da7 | 1 + uploads/9b539d31-5cd5-47ff-a32d-f43ea4a00656 | 1 + uploads/a298b498-41ec-42a1-af6a-3a74ff459729 | 1 + uploads/a7b3d125-8a52-4fe6-8f27-8781d4a5fd4b | 1 + uploads/ad698491-f7e0-4de3-99af-0e62944fc4bd | 1 + uploads/b34d864a-67f3-4d1e-a832-d257ff32fbc8 | 1 + uploads/b6cc42cf-0208-425b-a9bc-64d3ccd665d8 | 1 + uploads/b8f53c04-6f77-42f4-aa6e-271db104554d | 1 + uploads/ba0afa7f-79fd-43e0-8039-9e5efc5189f1 | 1 + uploads/be6922d6-f6bc-4748-b21a-54490cfdf3e4 | 1 + uploads/c5f6b94f-95cf-4483-84d3-e6dd406a07b4 | 1 + uploads/c6c906d1-e7dc-468e-87c3-7e9476edc5c2 | 1 + uploads/c87d7dbe-be7a-43b3-8c41-c107d320da52 | 1 + uploads/cf66681f-2341-4b00-a240-4ce8343fd6f6 | 1 + uploads/d4fad4f2-6d74-4f18-90c6-077e0da6d3aa | 1 + uploads/d76483b4-d4c3-4e64-a47b-68d48293cba9 | 1 + uploads/d7ebed11-f577-4feb-b9bc-995feda7ead8 | 1 + uploads/db4693ed-0aa6-4864-9413-4e6e3c55192e | 1 + uploads/e6643eab-bd06-4414-8aeb-a1aeb3ceadc8 | 1 + uploads/ef822f20-c885-4889-8da7-e49ab49a72f8 | 1 + uploads/f38399af-a9aa-4cee-9cb5-bfcd25cd6154 | 1 + uploads/f5a46b57-1e54-4507-868e-87b77ded607b | 1 + uploads/f74637d7-07a4-4460-a35d-7b1926490138 | 1 + uploads/f929de37-8a2c-42c6-94db-518d60d1ef75 | 1 + uploads/fa8cba00-78f0-4020-88e1-2ecdb9e73d13 | 1 + uploads/test-image-1765417181293 | 1 + uploads/test-image-1765418445954 | 1 + uploads/test-image-1765418511120 | 1 + uploads/test-image-1765422644802 | 1 + uploads/test-image-1765423488619 | 1 + uploads/test-image-1765443582830 | 1 + uploads/test-section-bg-1765417181348 | 1 + uploads/test-section-bg-1765418445977 | 1 + uploads/test-section-bg-1765418511147 | 1 + uploads/test-section-bg-1765422644823 | 1 + uploads/test-section-bg-1765423488641 | 1 + uploads/test-section-bg-1765443582844 | 1 + uploads/test-section-bg-video-1765417181433 | 1 + uploads/test-section-bg-video-1765418445997 | 1 + uploads/test-section-bg-video-1765418511255 | 1 + uploads/test-section-bg-video-1765422644866 | 1 + uploads/test-section-bg-video-1765423488694 | 1 + uploads/test-section-bg-video-1765443582868 | 1 + uploads/test-video-1765417181406 | 1 + uploads/test-video-1765418445992 | 1 + uploads/test-video-1765418511196 | 1 + uploads/test-video-1765422644861 | 1 + uploads/test-video-1765423488688 | 1 + uploads/test-video-1765443582864 | 1 + uploads/test-video-poster-1765417181308 | 1 + uploads/test-video-poster-1765418445960 | 1 + uploads/test-video-poster-1765418511129 | 1 + uploads/test-video-poster-1765422644815 | 1 + uploads/test-video-poster-1765423488626 | 1 + uploads/test-video-poster-1765443582836 | 1 + 205 files changed, 1802 insertions(+), 9887 deletions(-) create mode 100644 src/features/i18n/messages/editorBlockDefaults.ts delete mode 100644 test-results/.last-run.json delete mode 100644 test-results/editor-Blog-템플릿-버튼을-클릭하면-3개의-포스트-카드-제목-요약-가-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-CTA-템플릿-버튼을-클릭하면-CTA-텍스트와-버튼이-포함된-섹션이-캔버스에-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Cmd-Ctrl-D-단축키로-선택된-블록을-복제할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Cmd-Ctrl-Z로-블록-추가를--86b9b-rl-Shift-Z로-Redo-할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-FAQ-템플릿-버튼을-클릭하면-질문-답변-텍스트가-세-쌍-이상-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Features-템플릿-버튼을-클릭하면-3개의-Feature-항목-제목-설명-이-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Footer-템플릿-버튼을-클릭하면-링크-카피라이트-텍스트가-포함된-섹션이-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Hero-템플릿-버튼을-클릭하면-섹션과-기본-텍스트-버튼-블록이-캔버스에-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Pricing-템플릿-버튼을-클릭하면-3개의-요금제-카드가-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Team-템플릿-버튼을-클릭하면-3명의-팀-카드가-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-Testimonials-템플릿-버튼을-클릭하면-3개의-후기-카드가-생성되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-각-캔버스-블록에-드래그-핸들-UI-f0ce8-상태가-aria-selected로-노출되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-구분선-블록을-추가하면-캔버스에-구분선이-렌더되고-정렬-두께를-변경할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-리스트-블록에도-드래그-핸들이-있고-선택-드래그가-가능해야-한다-chromium/error-context.md delete mode 100644 test-results/editor-리스트-블록을-추가하고-첫-번째-아이템과-번호-매기기-정렬을-수정할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-리스트-아이템을-선택하면-패널에서--e3894--들여쓰기-내어쓰기-버튼을-사용할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-버튼-가로-세로-패딩-px-값을-변경하면-에디터-버튼에도-패딩이-반영되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-버튼-블록을-추가하고-라벨과-링크를-수정할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-버튼-블록을-추가하면-속성-패널-기본-색상-패딩-값이-기본-버튼-스타일과-일치해야-한다-chromium/error-context.md delete mode 100644 test-results/editor-블록-드래그앤드롭으로-순서를-변경할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-속성-패널에서-선택된-텍스트-블록-내용을-수정하면-캔버스에-반영되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-속성-패널의-블록-삭제-버튼으로-선택된-블록을-삭제할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-에디터-메뉴에서-페이지-파일로-내보내기-ZIP-를-클릭하면-ZIP-다운로드가-시작되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-에디터-상태를-JSON으로-내보내고-다시-불러오면-동일한-블록-상태가-복원되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-여러-텍스트-블록-중-선택을-전환하면-속성-패널-내용과-선택-하이라이트가-바뀌어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-이미지-블록-고정-너비와-모서리-둥글기-스타일이-에디터에서-적용되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-텍스트-블록을-더블클릭해서-내용을-수정할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-텍스트-블록의-정렬과-글자-크기를--929a8-스타일-유틸리티-pf-text--가-바뀌어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-템플릿-섹션을-삭제한-뒤-텍스트-블록을-추가하면-캔버스에-새-텍스트-블록이-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-라디오-블록을-추가하면-에디터-캔버스에-그룹-라벨과-라디오-버튼들이-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-블록을-선택하면-우측-속성-패널에서-폼-필드-버튼-매핑-UI가-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-셀렉트-라디오-체크박스-블록도-우측-패널에서-기본-필드-속성을-편집할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-셀렉트-블록을-추가하면-에디터-캔버스에-라벨과-셀렉트-UI가-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-셀렉트-블록의-옵션-목록을-우측-패널에서-수정하면-캔버스-셀렉트-옵션에-반영되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-요소-사이드바에서-폼-입력-셀렉트-라디오-체크박스-블록을-추가할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-입력-블록을-추가하면-에디터-캔버스에-라벨과-입력-필드-UI가-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-입력-블록의-라벨-전송-키-필수-여부를-우측-패널에서-수정할-수-있어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-입력-블록의-스타일-텍스트-배경-4812a-에서-변경하면-캔버스-필드-UI에-반영되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-입력-필드의-타입과-Placeh-0a970--패널에서-변경하면-캔버스-UI에-반영되어야-한다-chromium/error-context.md delete mode 100644 test-results/editor-폼-체크박스-블록을-추가하면-에디터-캔버스에-체크박스와-라벨이-보여야-한다-chromium/error-context.md delete mode 100644 test-results/editor-헤더의-실행-취소-다시-실행-버튼으로-블록-추가를-Undo-Redo-할-수-있어야-한다-chromium/error-context.md create mode 100644 uploads/0133a91f-c190-40eb-88b2-5791d29b6daf create mode 100644 uploads/06a7cc28-f984-425a-ba9d-77833a71b137 create mode 100644 uploads/085f876e-618a-431b-acb0-7078263cd757 create mode 100644 uploads/098f11f3-afba-4a53-b3c1-d727ffbdf158 create mode 100644 uploads/0fecaa59-dd24-4480-8b72-71c82d3408dc create mode 100644 uploads/109cf4ca-0f46-4b20-87fc-1da30c2ff646 create mode 100644 uploads/11ad8bf6-5a96-4d74-9419-3ad0bffed027 create mode 100644 uploads/11c5d9e1-17b9-4842-89b7-960677443f4e create mode 100644 uploads/1244ddcb-02c1-4cb1-99ec-8fe6174da25b create mode 100644 uploads/16689118-d6f7-4ffb-bf54-3ef2f5c2d4af create mode 100644 uploads/1c92c15e-efea-4807-983e-c203b74b6fae create mode 100644 uploads/1cbb135f-61bd-4eaa-b33b-7c6b2f8fc739 create mode 100644 uploads/1e8d0adc-ccdd-408a-b0ff-14d91ce919c1 create mode 100644 uploads/28048a81-d011-442d-a061-0e85cbd69b98 create mode 100644 uploads/29ec9caa-2057-4de2-a644-b73968c50303 create mode 100644 uploads/2ce86e85-cb16-4d27-b221-28940c1ee602 create mode 100644 uploads/30d556a8-b5c6-4fbb-a600-6f4c3cd2f62d create mode 100644 uploads/31dd0255-ead7-4d7d-a8b6-49fa4c64295f create mode 100644 uploads/332c39fe-de4f-4c05-be13-e8ce3727beb5 create mode 100644 uploads/35386cc9-549e-44b9-b2c0-5e33c65a5ae5 create mode 100644 uploads/3717db8c-0b0d-4a9a-a149-74b0831a6e2e create mode 100644 uploads/3d8e6a2f-eb20-4e9a-bd51-a9597c318111 create mode 100644 uploads/3e7ba460-5a8e-4fb4-88eb-bf4942a7949a create mode 100644 uploads/41106e2c-fefc-463c-a446-e46af32cafba create mode 100644 uploads/49fe32ca-62ad-4949-b50b-0257ad20c140 create mode 100644 uploads/4d51ba66-1f72-4819-bb82-6e801e8cc2a4 create mode 100644 uploads/50787c25-f9b5-445a-ae90-104e45a5126c create mode 100644 uploads/511976e2-ff33-4733-b305-9432fef9c64e create mode 100644 uploads/512a884d-0d8c-4eed-ac24-e6b18f1fe51b create mode 100644 uploads/55e7fd72-1dac-4b04-99f9-372fd4da774d create mode 100644 uploads/5685a614-d830-4098-b047-b5b894750fae create mode 100644 uploads/5b05037e-ffc8-42ab-a9d3-93f1230e07fd create mode 100644 uploads/5d02e4bd-71d1-4a7d-8922-4d6fdc57b18c create mode 100644 uploads/6240c486-f13a-4e1a-ab5b-f4fe29849f60 create mode 100644 uploads/686c641f-549d-4f96-a9d6-527399ee52a3 create mode 100644 uploads/6b90dd9d-56c0-445b-8f57-9e8ca4ad51b8 create mode 100644 uploads/6bf691f9-3d3a-42f7-b377-6770e8eea1ec create mode 100644 uploads/6ee59300-97a9-4c92-ae27-6877ac04311d create mode 100644 uploads/70841d0f-6ef0-4aab-9485-65e11330a85b create mode 100644 uploads/70d3d617-355c-4979-99e4-600b248d6bac create mode 100644 uploads/71224205-127a-44ae-aea5-b3b7998405e5 create mode 100644 uploads/727d5430-9114-4184-bca8-d01840f3dd54 create mode 100644 uploads/733cf0a6-d2d5-4c39-a6da-c4c1de12a2e5 create mode 100644 uploads/73544864-4f95-45dc-9643-e5f03cda8a83 create mode 100644 uploads/73c051c1-07a6-4e5d-95b0-0aa5fe47da32 create mode 100644 uploads/77c52bd2-b698-4d0c-a97e-a8cebd292006 create mode 100644 uploads/7dd8ce0a-3fe1-4ba4-b0cd-ae52eda59a9e create mode 100644 uploads/7fa6df92-76f7-423b-9e30-c78c94db705b create mode 100644 uploads/849ab2ab-8e58-4ca3-b690-2a3d86326d00 create mode 100644 uploads/881ade16-a09c-4906-a361-b0a21d463213 create mode 100644 uploads/88b162ba-8d1d-47b5-af9d-ba363f4ae127 create mode 100644 uploads/8bb4cf97-8915-41a3-8b7d-673fdc7a8319 create mode 100644 uploads/8c22181d-7876-48ea-baeb-d45d495878a7 create mode 100644 uploads/8dd3323b-68fe-48c6-aef2-512e2074bc3b create mode 100644 uploads/8e1e2352-900a-42ad-ab73-7069f57cbcd5 create mode 100644 uploads/8e5041a3-d859-4149-81a2-ec0f3c3b4b04 create mode 100644 uploads/905cddee-91fa-4d18-9e69-9439d6daef39 create mode 100644 uploads/92d39c4a-b9f7-4688-a5cb-1147d6e646e9 create mode 100644 uploads/94eb9300-3114-4b38-9e5b-db8095575a56 create mode 100644 uploads/950db654-0a94-4878-993b-79d1cff68a7f create mode 100644 uploads/963005d1-d720-4b81-993b-a1c603933da7 create mode 100644 uploads/9b539d31-5cd5-47ff-a32d-f43ea4a00656 create mode 100644 uploads/a298b498-41ec-42a1-af6a-3a74ff459729 create mode 100644 uploads/a7b3d125-8a52-4fe6-8f27-8781d4a5fd4b create mode 100644 uploads/ad698491-f7e0-4de3-99af-0e62944fc4bd create mode 100644 uploads/b34d864a-67f3-4d1e-a832-d257ff32fbc8 create mode 100644 uploads/b6cc42cf-0208-425b-a9bc-64d3ccd665d8 create mode 100644 uploads/b8f53c04-6f77-42f4-aa6e-271db104554d create mode 100644 uploads/ba0afa7f-79fd-43e0-8039-9e5efc5189f1 create mode 100644 uploads/be6922d6-f6bc-4748-b21a-54490cfdf3e4 create mode 100644 uploads/c5f6b94f-95cf-4483-84d3-e6dd406a07b4 create mode 100644 uploads/c6c906d1-e7dc-468e-87c3-7e9476edc5c2 create mode 100644 uploads/c87d7dbe-be7a-43b3-8c41-c107d320da52 create mode 100644 uploads/cf66681f-2341-4b00-a240-4ce8343fd6f6 create mode 100644 uploads/d4fad4f2-6d74-4f18-90c6-077e0da6d3aa create mode 100644 uploads/d76483b4-d4c3-4e64-a47b-68d48293cba9 create mode 100644 uploads/d7ebed11-f577-4feb-b9bc-995feda7ead8 create mode 100644 uploads/db4693ed-0aa6-4864-9413-4e6e3c55192e create mode 100644 uploads/e6643eab-bd06-4414-8aeb-a1aeb3ceadc8 create mode 100644 uploads/ef822f20-c885-4889-8da7-e49ab49a72f8 create mode 100644 uploads/f38399af-a9aa-4cee-9cb5-bfcd25cd6154 create mode 100644 uploads/f5a46b57-1e54-4507-868e-87b77ded607b create mode 100644 uploads/f74637d7-07a4-4460-a35d-7b1926490138 create mode 100644 uploads/f929de37-8a2c-42c6-94db-518d60d1ef75 create mode 100644 uploads/fa8cba00-78f0-4020-88e1-2ecdb9e73d13 create mode 100644 uploads/test-image-1765417181293 create mode 100644 uploads/test-image-1765418445954 create mode 100644 uploads/test-image-1765418511120 create mode 100644 uploads/test-image-1765422644802 create mode 100644 uploads/test-image-1765423488619 create mode 100644 uploads/test-image-1765443582830 create mode 100644 uploads/test-section-bg-1765417181348 create mode 100644 uploads/test-section-bg-1765418445977 create mode 100644 uploads/test-section-bg-1765418511147 create mode 100644 uploads/test-section-bg-1765422644823 create mode 100644 uploads/test-section-bg-1765423488641 create mode 100644 uploads/test-section-bg-1765443582844 create mode 100644 uploads/test-section-bg-video-1765417181433 create mode 100644 uploads/test-section-bg-video-1765418445997 create mode 100644 uploads/test-section-bg-video-1765418511255 create mode 100644 uploads/test-section-bg-video-1765422644866 create mode 100644 uploads/test-section-bg-video-1765423488694 create mode 100644 uploads/test-section-bg-video-1765443582868 create mode 100644 uploads/test-video-1765417181406 create mode 100644 uploads/test-video-1765418445992 create mode 100644 uploads/test-video-1765418511196 create mode 100644 uploads/test-video-1765422644861 create mode 100644 uploads/test-video-1765423488688 create mode 100644 uploads/test-video-1765443582864 create mode 100644 uploads/test-video-poster-1765417181308 create mode 100644 uploads/test-video-poster-1765418445960 create mode 100644 uploads/test-video-poster-1765418511129 create mode 100644 uploads/test-video-poster-1765422644815 create mode 100644 uploads/test-video-poster-1765423488626 create mode 100644 uploads/test-video-poster-1765443582836 diff --git a/.gitignore b/.gitignore index de28342..8ccf91b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ node_modules/ # Playwright playwright-report/ blob-report/ +test-results/ # Docker **/.DS_Store diff --git a/src/app/editor/forms/FormCheckboxPropertiesPanel.tsx b/src/app/editor/forms/FormCheckboxPropertiesPanel.tsx index 05f163d..b57fbba 100644 --- a/src/app/editor/forms/FormCheckboxPropertiesPanel.tsx +++ b/src/app/editor/forms/FormCheckboxPropertiesPanel.tsx @@ -99,10 +99,10 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={80} step={2} presets={[ - { id: "tight", label: "타이트", value: 4 }, - { id: "normal", label: "보통", value: 8 }, - { id: "relaxed", label: "느슨", value: 12 }, - { id: "extra", label: "넓게", value: 16 }, + { id: "tight", label: "Tight", value: 4 }, + { id: "normal", label: "Normal", value: 8 }, + { id: "relaxed", label: "Relaxed", value: 12 }, + { id: "extra", label: "Extra", value: 16 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -235,7 +235,7 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc ? [...(checkboxProps as any).options] : []; next.push({ - label: "새 옵션", + label: "New option", value: `option_${next.length + 1}`, }); updateBlock(selectedBlockId, { @@ -442,9 +442,9 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={60} step={1} presets={[ - { id: "tight", label: "타이트", value: 18 }, - { id: "normal", label: "보통", value: 24 }, - { id: "loose", label: "루즈", value: 32 }, + { id: "tight", label: "Tight", value: 18 }, + { id: "normal", label: "Normal", value: 24 }, + { id: "loose", label: "Loose", value: 32 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -466,9 +466,9 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={20} step={0.5} presets={[ - { id: "tight", label: "좁게", value: -1 }, - { id: "normal", label: "보통", value: 0 }, - { id: "wide", label: "넓게", value: 2 }, + { id: "tight", label: "Tight", value: -1 }, + { id: "normal", label: "Normal", value: 0 }, + { id: "wide", label: "Wide", value: 2 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -501,9 +501,9 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={800} step={10} presets={[ - { id: "sm", label: "작게", value: 200 }, - { id: "md", label: "보통", value: 280 }, - { id: "lg", label: "넓게", value: 360 }, + { id: "sm", label: "Small", value: 200 }, + { id: "md", label: "Medium", value: 280 }, + { id: "lg", label: "Large", value: 360 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -520,11 +520,11 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={60} step={2} presets={[ - { id: "xs", label: "아주 얇게", value: 6 }, - { id: "sm", label: "얇게", value: 10 }, - { id: "md", label: "보통", value: 12 }, - { id: "lg", label: "넓게", value: 16 }, - { id: "xl", label: "아주 넓게", value: 20 }, + { id: "xs", label: "Extra thin", value: 6 }, + { id: "sm", label: "Thin", value: 10 }, + { id: "md", label: "Normal", value: 12 }, + { id: "lg", label: "Wide", value: 16 }, + { id: "xl", label: "Extra wide", value: 20 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -540,11 +540,11 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={40} step={1} presets={[ - { id: "xs", label: "아주 얇게", value: 6 }, - { id: "sm", label: "얇게", value: 8 }, - { id: "md", label: "보통", value: 10 }, - { id: "lg", label: "넓게", value: 12 }, - { id: "xl", label: "아주 넓게", value: 16 }, + { id: "xs", label: "Extra thin", value: 6 }, + { id: "sm", label: "Thin", value: 8 }, + { id: "md", label: "Normal", value: 10 }, + { id: "lg", label: "Wide", value: 12 }, + { id: "xl", label: "Extra wide", value: 16 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -560,10 +560,10 @@ export function FormCheckboxPropertiesPanel({ block, selectedBlockId, updateBloc max={40} step={1} presets={[ - { id: "tight", label: "타이트", value: 2 }, - { id: "normal", label: "보통", value: 4 }, - { id: "relaxed", label: "느슨", value: 8 }, - { id: "extra", label: "넓게", value: 12 }, + { id: "tight", label: "Tight", value: 2 }, + { id: "normal", label: "Normal", value: 4 }, + { id: "relaxed", label: "Relaxed", value: 8 }, + { id: "extra", label: "Extra", value: 12 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { diff --git a/src/app/editor/forms/FormControllerPanel.tsx b/src/app/editor/forms/FormControllerPanel.tsx index 57d6ee2..b27c266 100644 --- a/src/app/editor/forms/FormControllerPanel.tsx +++ b/src/app/editor/forms/FormControllerPanel.tsx @@ -216,6 +216,7 @@ export function FormControllerPanel({ block, blocks, selectedBlockId, updateBloc + {(formProps.formWidthMode ?? "auto") === "fixed" && ( updateBlock(selectedBlockId, { @@ -236,6 +237,7 @@ export function FormControllerPanel({ block, blocks, selectedBlockId, updateBloc } /> )} + - 필수 + {m.requiredLabel} ); @@ -371,7 +373,7 @@ export function FormControllerPanel({ block, blocks, selectedBlockId, updateBloc } as any) } > - + {blocks .filter((b) => b.type === "button") .map((buttonBlock) => { diff --git a/src/app/editor/forms/FormInputPropertiesPanel.tsx b/src/app/editor/forms/FormInputPropertiesPanel.tsx index a59f41d..a78576b 100644 --- a/src/app/editor/forms/FormInputPropertiesPanel.tsx +++ b/src/app/editor/forms/FormInputPropertiesPanel.tsx @@ -92,10 +92,10 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={80} step={2} presets={[ - { id: "tight", label: "타이트", value: 4 }, - { id: "normal", label: "보통", value: 8 }, - { id: "relaxed", label: "느슨", value: 12 }, - { id: "extra", label: "넓게", value: 16 }, + { id: "tight", label: "Tight", value: 4 }, + { id: "normal", label: "Normal", value: 8 }, + { id: "relaxed", label: "Relaxed", value: 12 }, + { id: "extra", label: "Extra", value: 16 }, ]} onChangeValue={(v) => updateBlock(selectedBlockId, { @@ -218,9 +218,9 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={60} step={1} presets={[ - { id: "tight", label: "타이트", value: 18 }, - { id: "normal", label: "보통", value: 24 }, - { id: "loose", label: "루즈", value: 32 }, + { id: "tight", label: "Tight", value: 18 }, + { id: "normal", label: "Normal", value: 24 }, + { id: "loose", label: "Loose", value: 32 }, ]} onChangeValue={(v) => { updateBlock(selectedBlockId, { @@ -242,9 +242,9 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={20} step={0.5} presets={[ - { id: "tight", label: "좁게", value: -1 }, - { id: "normal", label: "보통", value: 0 }, - { id: "wide", label: "넓게", value: 2 }, + { id: "tight", label: "Tight", value: -1 }, + { id: "normal", label: "Normal", value: 0 }, + { id: "wide", label: "Wide", value: 2 }, ]} onChangeValue={(v) => { updateBlock(selectedBlockId, { @@ -293,9 +293,9 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={800} step={10} presets={[ - { id: "sm", label: "작게", value: 200 }, - { id: "md", label: "보통", value: 280 }, - { id: "lg", label: "넓게", value: 360 }, + { id: "sm", label: "Small", value: 200 }, + { id: "md", label: "Medium", value: 280 }, + { id: "lg", label: "Large", value: 360 }, ]} onChangeValue={(v) => { updateBlock(selectedBlockId, { @@ -311,11 +311,11 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={60} step={2} presets={[ - { id: "xs", label: "아주 얇게", value: 6 }, - { id: "sm", label: "얇게", value: 10 }, - { id: "md", label: "보통", value: 12 }, - { id: "lg", label: "넓게", value: 16 }, - { id: "xl", label: "아주 넓게", value: 20 }, + { id: "xs", label: "Extra thin", value: 6 }, + { id: "sm", label: "Thin", value: 10 }, + { id: "md", label: "Normal", value: 12 }, + { id: "lg", label: "Wide", value: 16 }, + { id: "xl", label: "Extra wide", value: 20 }, ]} onChangeValue={(v) => { updateBlock(selectedBlockId, { @@ -331,11 +331,11 @@ export function FormInputPropertiesPanel({ block, selectedBlockId, updateBlock } max={40} step={1} presets={[ - { id: "xs", label: "아주 얇게", value: 6 }, - { id: "sm", label: "얇게", value: 8 }, - { id: "md", label: "보통", value: 10 }, - { id: "lg", label: "넓게", value: 12 }, - { id: "xl", label: "아주 넓게", value: 16 }, + { id: "xs", label: "Extra thin", value: 6 }, + { id: "sm", label: "Thin", value: 8 }, + { id: "md", label: "Normal", value: 10 }, + { id: "lg", label: "Wide", value: 12 }, + { id: "xl", label: "Extra wide", value: 16 }, ]} onChangeValue={(v) => { updateBlock(selectedBlockId, { diff --git a/src/app/editor/forms/FormRadioPropertiesPanel.tsx b/src/app/editor/forms/FormRadioPropertiesPanel.tsx index 7980f3e..5cbbd17 100644 --- a/src/app/editor/forms/FormRadioPropertiesPanel.tsx +++ b/src/app/editor/forms/FormRadioPropertiesPanel.tsx @@ -25,7 +25,7 @@ export function FormRadioPropertiesPanel({ block, selectedBlockId, updateBlock }

{m.sectionTitle}

{groupLabelDisplay === "visible" && ( )} {groupLabelDisplay === "visible" && (radioProps.labelLayout ?? "stacked") === "inline" && ( updateBlock(selectedBlockId, { @@ -113,7 +113,7 @@ export function FormRadioPropertiesPanel({ block, selectedBlockId, updateBlock } )}