From 146c0814f9c5115dc7851201491d5e183e7a52e2 Mon Sep 17 00:00:00 2001 From: Lee Seung Heon Date: Wed, 21 Jan 2026 17:56:39 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8=20feat:=20tooltip=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=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/tooltip.tsx | 56 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/shared/ui/tooltip.tsx diff --git a/src/shared/ui/tooltip.tsx b/src/shared/ui/tooltip.tsx new file mode 100644 index 00000000..0076796f --- /dev/null +++ b/src/shared/ui/tooltip.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { useState } from "react"; +import cn from "@/src/shared/lib/cn"; + +type TooltipProps = { + content: React.ReactNode; + children: React.ReactNode; + className?: string; +}; + +export default function Tooltip({ + content, + children, + className, +}: TooltipProps) { + const [open, setOpen] = useState(false); + + return ( + setOpen(true)} + onMouseLeave={() => setOpen(false)} + onFocus={() => setOpen(true)} + onBlur={() => setOpen(false)} + > + {children} + + {open && ( + + {content} + + + + )} + + ); +} From 74e555ccfb20b1dc94a775e4b830e0b8fd4728b9 Mon Sep 17 00:00:00 2001 From: Lee Seung Heon Date: Wed, 21 Jan 2026 22:55:36 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=8A=AC=EB=9E=99?= =?UTF-8?q?=ED=8A=B8=20=ED=86=B5=ED=95=A9=20=EB=B0=8F=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/demo/page.tsx | 10 +++ next.config.ts | 13 +++- src/shared/ui/client-select.tsx | 21 ------ src/shared/ui/select.tsx | 115 +++++++++++++++++++++++--------- src/stories/Select.stories.tsx | 17 ----- 5 files changed, 104 insertions(+), 72 deletions(-) create mode 100644 app/demo/page.tsx delete mode 100644 src/shared/ui/client-select.tsx diff --git a/app/demo/page.tsx b/app/demo/page.tsx new file mode 100644 index 00000000..5e11d9b4 --- /dev/null +++ b/app/demo/page.tsx @@ -0,0 +1,10 @@ +import Select from "@/src/shared/ui/select"; +import React from "react"; + +export default function page() { + return ( +
+ { - onValueChange?.(e.target.value); - }} - /> - ); -} diff --git a/src/shared/ui/select.tsx b/src/shared/ui/select.tsx index f4701584..de871e20 100644 --- a/src/shared/ui/select.tsx +++ b/src/shared/ui/select.tsx @@ -1,16 +1,26 @@ +"use client"; + import * as React from "react"; import cn from "@/src/shared/lib/cn"; +import ArrowDownIcon from "@/src/shared/ui/icons/arroaw/down.svg"; +import ArrowUpIcon from "@/src/shared/ui/icons/arroaw/up.svg"; + export type SelectOption = { value: string; label: string; disabled?: boolean; }; -export type SelectProps = React.SelectHTMLAttributes & { +export type SelectProps = Omit< + React.SelectHTMLAttributes, + "onChange" +> & { label?: string; options?: SelectOption[]; placeholder?: string; + onValueChange?: (value: string) => void; + onChange?: React.SelectHTMLAttributes["onChange"]; }; export default function Select({ @@ -22,51 +32,92 @@ export default function Select({ placeholder, disabled, className, + onChange, + onValueChange, ...rest }: SelectProps) { const reactId = React.useId(); const selectId = id ?? reactId; const hasChildren = React.Children.count(children) > 0; + const [isOpen, setIsOpen] = React.useState(false); + return (
{label ? ( -
); } - -// TODO 디자인 도입 시 변경 예정 diff --git a/src/stories/Select.stories.tsx b/src/stories/Select.stories.tsx index b717b4c1..138a8c64 100644 --- a/src/stories/Select.stories.tsx +++ b/src/stories/Select.stories.tsx @@ -1,6 +1,5 @@ import type { Meta, StoryObj } from "@storybook/react"; import Select from "@/src/shared/ui/select"; -import ClientSelect from "@/src/shared/ui/client-select"; const meta: Meta = { title: "ui-kit/Select", @@ -47,19 +46,3 @@ export const Disabled: Story = { disabled: true, }, }; - -/* ---------------- Client Select ---------------- */ - -export const ClientSelectExample: StoryObj = { - render: () => ( - { - console.log("선택된 값:", value); - }} - /> - ), - name: "ClientSelect (onValueChange)", -}; From 0250ce277469e2a4041f8e378e81523368df2b30 Mon Sep 17 00:00:00 2001 From: Lee Seung Heon Date: Wed, 21 Jan 2026 23:00:11 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EB=8D=B0=EB=AA=A8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/demo/page.tsx | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 app/demo/page.tsx diff --git a/app/demo/page.tsx b/app/demo/page.tsx deleted file mode 100644 index 5e11d9b4..00000000 --- a/app/demo/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import Select from "@/src/shared/ui/select"; -import React from "react"; - -export default function page() { - return ( -
-