From 23e949eedd1d22751148020c94b3a0a77ab6d2c9 Mon Sep 17 00:00:00 2001 From: kimsman Date: Sat, 21 Mar 2026 19:26:54 +0900 Subject: [PATCH 01/15] =?UTF-8?q?[Feat]=20=ED=8F=BC=20=EB=B0=8F=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=A1=9C=EB=8D=94=EC=9A=A9=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/icons/index.tsx | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/shared/ui/icons/index.tsx b/src/shared/ui/icons/index.tsx index 8753a49..536a9d4 100644 --- a/src/shared/ui/icons/index.tsx +++ b/src/shared/ui/icons/index.tsx @@ -191,6 +191,68 @@ export const EyeOffIcon: React.FC = ({ size = 20, ...props }) => ( ); +// File Text 아이콘 +export const FileTextIcon: React.FC = ({ size = 20, ...props }) => ( + + + + + + + +); + +// Upload 아이콘 +export const UploadIcon: React.FC = ({ size = 20, ...props }) => ( + + + + + +); + +// Image 아이콘 +export const ImageIcon: React.FC = ({ size = 20, ...props }) => ( + + + + + +); + // Chevron Left 아이콘 export const ChevronLeftIcon: React.FC = ({ size = 20, ...props }) => ( Date: Sat, 21 Mar 2026 19:27:03 +0900 Subject: [PATCH 02/15] =?UTF-8?q?[Feat]=20=EA=B3=B5=ED=86=B5=20Form=20?= =?UTF-8?q?=EA=B8=B0=EC=B4=88=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=84=B8=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/form/form.stories.tsx | 162 ++++++++++++++++++++++++++++ src/shared/ui/form/form.tsx | 75 +++++++++++++ src/shared/ui/form/index.ts | 1 + 3 files changed, 238 insertions(+) create mode 100644 src/shared/ui/form/form.stories.tsx create mode 100644 src/shared/ui/form/form.tsx create mode 100644 src/shared/ui/form/index.ts diff --git a/src/shared/ui/form/form.stories.tsx b/src/shared/ui/form/form.stories.tsx new file mode 100644 index 0000000..ec0cf20 --- /dev/null +++ b/src/shared/ui/form/form.stories.tsx @@ -0,0 +1,162 @@ +import { useState } from "react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { FormField, FormLabel, FormHelperText, FormErrorMessage } from "./form"; +import { Input, Textarea } from "@/shared/ui/inputBox/inputBox"; +import { Checkbox } from "@/shared/ui/checkbox/checkbox"; +import { + ThumbnailUploader, + FileListItem, + FileUploader, +} from "@/shared/ui/file-uploader/file-uploader"; +import { Button } from "@/shared/ui/button/button"; + +const meta = { + title: "Shared/UI/Form", + component: FormField, + parameters: { + layout: "centered", + }, + tags: ["autodocs"], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +// --- 종합 폼 예시 (포트폴리오 작성) --- +const PortfolioCreateForm = () => { + const [preview, setPreview] = useState(); + const [files, setFiles] = useState([ + { id: "1", name: "기획서_최종.pdf", size: "1.2 MB", type: "application/pdf" }, + ]); + + return ( +
+ {/* Header */} +
+

+ 포트폴리오 작성 +

+

+ 당신의 멋진 프로젝트를 세상에 공유해 보세요. +

+
+ + {/* Basic Info Section */} +
+

+ 기본 정보 +

+ + + 프로젝트 제목 + + + + + 간단 설명 +