@nurimedia/react-ui 0.1.0 โ 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/index.cjs +4 -180
- package/dist/AlertDialog/index.cjs.map +1 -1
- package/dist/AlertDialog/index.js +5 -144
- package/dist/AlertDialog/index.js.map +1 -1
- package/dist/Button/index.cjs +4 -131
- package/dist/Button/index.cjs.map +1 -1
- package/dist/Button/index.js +5 -105
- package/dist/Button/index.js.map +1 -1
- package/dist/Checkbox/index.cjs +4 -78
- package/dist/Checkbox/index.cjs.map +1 -1
- package/dist/Checkbox/index.js +5 -42
- package/dist/Checkbox/index.js.map +1 -1
- package/dist/Input/index.cjs +4 -98
- package/dist/Input/index.cjs.map +1 -1
- package/dist/Input/index.js +5 -72
- package/dist/Input/index.js.map +1 -1
- package/dist/Modal/index.cjs +4 -115
- package/dist/Modal/index.cjs.map +1 -1
- package/dist/Modal/index.js +5 -79
- package/dist/Modal/index.js.map +1 -1
- package/dist/Radio/index.cjs +6 -81
- package/dist/Radio/index.cjs.map +1 -1
- package/dist/Radio/index.js +6 -43
- package/dist/Radio/index.js.map +1 -1
- package/dist/Select/index.cjs +4 -111
- package/dist/Select/index.cjs.map +1 -1
- package/dist/Select/index.js +5 -75
- package/dist/Select/index.js.map +1 -1
- package/dist/Switch/index.cjs +4 -66
- package/dist/Switch/index.cjs.map +1 -1
- package/dist/Switch/index.js +5 -30
- package/dist/Switch/index.js.map +1 -1
- package/dist/Textarea/index.cjs +4 -122
- package/dist/Textarea/index.cjs.map +1 -1
- package/dist/Textarea/index.js +5 -96
- package/dist/Textarea/index.js.map +1 -1
- package/dist/Toast/index.cjs +4 -177
- package/dist/Toast/index.cjs.map +1 -1
- package/dist/Toast/index.js +6 -141
- package/dist/Toast/index.js.map +1 -1
- package/dist/Tooltip/index.cjs +6 -100
- package/dist/Tooltip/index.cjs.map +1 -1
- package/dist/Tooltip/index.js +6 -62
- package/dist/Tooltip/index.js.map +1 -1
- package/dist/chunk-2LFW4MM6.cjs +47 -0
- package/dist/chunk-2LFW4MM6.cjs.map +1 -0
- package/dist/chunk-2WKLA5RC.cjs +82 -0
- package/dist/chunk-2WKLA5RC.cjs.map +1 -0
- package/dist/chunk-2YGYLCCA.js +66 -0
- package/dist/chunk-2YGYLCCA.js.map +1 -0
- package/dist/chunk-323VGYMK.cjs +147 -0
- package/dist/chunk-323VGYMK.cjs.map +1 -0
- package/dist/chunk-3H47QMKS.js +47 -0
- package/dist/chunk-3H47QMKS.js.map +1 -0
- package/dist/chunk-3QSLHLC2.cjs +45 -0
- package/dist/chunk-3QSLHLC2.cjs.map +1 -0
- package/dist/chunk-4N5JIGIU.js +82 -0
- package/dist/chunk-4N5JIGIU.js.map +1 -0
- package/dist/chunk-DTGPVOJK.js +99 -0
- package/dist/chunk-DTGPVOJK.js.map +1 -0
- package/dist/chunk-DTQE42F7.js +33 -0
- package/dist/chunk-DTQE42F7.js.map +1 -0
- package/dist/chunk-DYO4PIBB.js +75 -0
- package/dist/chunk-DYO4PIBB.js.map +1 -0
- package/dist/chunk-GBMYANHH.js +149 -0
- package/dist/chunk-GBMYANHH.js.map +1 -0
- package/dist/chunk-I7KJ7WTN.cjs +149 -0
- package/dist/chunk-I7KJ7WTN.cjs.map +1 -0
- package/dist/chunk-JM4HDCLU.cjs +110 -0
- package/dist/chunk-JM4HDCLU.cjs.map +1 -0
- package/dist/chunk-JXJ6G634.cjs +75 -0
- package/dist/chunk-JXJ6G634.cjs.map +1 -0
- package/dist/chunk-LAPTEQ5N.js +45 -0
- package/dist/chunk-LAPTEQ5N.js.map +1 -0
- package/dist/chunk-LRATCHCB.cjs +66 -0
- package/dist/chunk-LRATCHCB.cjs.map +1 -0
- package/dist/chunk-OM4QMC4F.js +110 -0
- package/dist/chunk-OM4QMC4F.js.map +1 -0
- package/dist/chunk-PAXRFQUJ.cjs +33 -0
- package/dist/chunk-PAXRFQUJ.cjs.map +1 -0
- package/dist/chunk-PC3B67B4.cjs +78 -0
- package/dist/chunk-PC3B67B4.cjs.map +1 -0
- package/dist/chunk-PS6QXS5Z.js +11 -0
- package/dist/chunk-PS6QXS5Z.js.map +1 -0
- package/dist/chunk-Q26BJSLP.cjs +99 -0
- package/dist/chunk-Q26BJSLP.cjs.map +1 -0
- package/dist/chunk-R4E4BIPC.cjs +11 -0
- package/dist/chunk-R4E4BIPC.cjs.map +1 -0
- package/dist/chunk-R757N7RU.js +78 -0
- package/dist/chunk-R757N7RU.js.map +1 -0
- package/dist/chunk-RC773ZEY.js +147 -0
- package/dist/chunk-RC773ZEY.js.map +1 -0
- package/dist/index.cjs +54 -899
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -833
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/Button/Button.tsx","../src/Button/Spinner.tsx","../src/utils/cx.ts","../src/Input/Input.tsx","../src/Textarea/Textarea.tsx","../src/Checkbox/Checkbox.tsx","../src/Radio/Radio.tsx","../src/Switch/Switch.tsx","../src/Select/Select.tsx","../src/Modal/Modal.tsx","../src/AlertDialog/AlertDialog.tsx","../src/AlertDialog/icons.tsx","../src/Toast/Toaster.tsx","../src/Toast/store.ts","../src/Toast/icons.tsx","../src/Toast/toast.ts","../src/Tooltip/Tooltip.tsx"],"sourcesContent":["export * from './Button/index.js';\nexport * from './Input/index.js';\nexport * from './Textarea/index.js';\nexport * from './Checkbox/index.js';\nexport * from './Radio/index.js';\nexport * from './Switch/index.js';\nexport * from './Select/index.js';\nexport * from './Modal/index.js';\nexport * from './AlertDialog/index.js';\nexport * from './Toast/index.js';\nexport * from './Tooltip/index.js';\n","'use client';\n\nimport './styles.css';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Children, cloneElement, forwardRef, isValidElement } from 'react';\nimport type { ButtonHTMLAttributes, MouseEvent, ReactElement, ReactNode } from 'react';\nimport { Spinner } from './Spinner.js';\nimport { cx } from '../utils/cx.js';\n\ntype Variant = 'primary' | 'secondary' | 'outline' | 'ghost';\ntype Size = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {\n /**\n * ์๊ฐ ์ ํ.\n * - `primary`: ๋ธ๋๋ ์ ๋ฐฐ๊ฒฝ (๊ธฐ๋ณธ)\n * - `secondary`: ๋ธ๋๋ ์
์ ํค ๋ฐฐ๊ฒฝ\n * - `outline`: ํฌ๋ช
๋ฐฐ๊ฒฝ + ํ
๋๋ฆฌ\n * - `ghost`: ํฌ๋ช
๋ฐฐ๊ฒฝ, hover ์์๋ง ๋ฐฐ๊ฒฝ ์ฑ์\n * @default 'primary'\n */\n variant?: Variant;\n\n /**\n * ์ฌ์ด์ฆ.\n * - `sm`: 36px ๋์ด โ ๋ฐ์ง๋ UI, ํ
์ด๋ธ ์ก์
\n * - `md`: 42px ๋์ด โ ์ผ๋ฐ ์ฝํ
์ธ ์์ญ (๊ธฐ๋ณธ)\n * - `lg`: 48px ๋์ด โ ์ฃผ์ CTA, ๋ชจ๋ฐ์ผ ํฐ์น\n * @default 'md'\n */\n size?: Size;\n\n /**\n * ๋ผ๋ฒจ ์ข์ธก์ ํ์ํ ์์ด์ฝ.\n * @example <Button iconLeft={<SearchIcon />}>๊ฒ์</Button>\n */\n iconLeft?: ReactNode;\n\n /**\n * ๋ผ๋ฒจ ์ฐ์ธก์ ํ์ํ ์์ด์ฝ.\n */\n iconRight?: ReactNode;\n\n /**\n * ์์ด์ฝ๋ง ํ์ํ๋ ์ ์ฌ๊ฐ ๋ฒํผ. **`aria-label` ํ์**\n * (icon-only๋ ์๊ฐ์ ์ผ๋ก๋ง ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์คํฌ๋ฆฐ๋ฆฌ๋์ฉ ๋ผ๋ฒจ์ด ์์ผ๋ฉด ์ฌ์ฉ์๊ฐ ์ฉ๋๋ฅผ ์ ์ ์์).\n * children์ ๋จ์ผ ์์ด์ฝ ์๋ฆฌ๋จผํธ.\n * @example <Button iconOnly aria-label=\"๋ซ๊ธฐ\"><CloseIcon /></Button>\n */\n iconOnly?: boolean;\n\n /**\n * ์ปจํ
์ด๋ ์ ์ฒด ๋๋น๋ก ํ์ฅ.\n */\n block?: boolean;\n\n /**\n * ๋ก๋ฉ ์ค ํ์. ์คํผ๋๋ฅผ ์ข์ธก ์์ด์ฝ ์๋ฆฌ์ ํ์ํ๊ณ , ํด๋ฆญ์ ์ฐจ๋จํ๋ฉฐ `aria-busy=\"true\"`๋ฅผ ๋ถ์ฌ.\n */\n loading?: boolean;\n\n /**\n * Radix Slot์ผ๋ก ์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ ๋ โ ์์์ด Button์ classNameยทrefยท์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ชจ๋ ๋ฌผ๋ ค๋ฐ์.\n * ๋งํฌ๋ฅผ ๋ฒํผ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ๋ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ (next/link, react-router Link ๋ฑ).\n * @example\n * <Button asChild><Link href=\"/about\">์๊ฐ</Link></Button>\n */\n asChild?: boolean;\n\n /**\n * ํผ ๋ฒํผ ํ์
. ์๋์น ์์ form submit ๋ฐฉ์ง๋ฅผ ์ํด ๊ธฐ๋ณธ๊ฐ `'button'`.\n * ํผ ์ ์ถ ๋ฒํผ์ด๋ฉด ๋ช
์์ ์ผ๋ก `type=\"submit\"` ์ง์ .\n * @default 'button'\n */\n type?: 'button' | 'submit' | 'reset';\n\n children?: ReactNode;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n iconLeft,\n iconRight,\n iconOnly = false,\n block = false,\n loading = false,\n disabled = false,\n asChild = false,\n type = 'button',\n className,\n children,\n onClick,\n ...rest\n },\n ref,\n) {\n const isBlocked = disabled || loading;\n\n if (\n process.env.NODE_ENV !== 'production' &&\n iconOnly &&\n !rest['aria-label'] &&\n !rest['aria-labelledby']\n ) {\n // iconOnly ๋ฒํผ์ ํ
์คํธ๊ฐ ์์ด ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ์ฉ๋๋ฅผ ์ ์ ์์ โ ๊ฐ๋ฐ ๋ชจ๋ ๊ฒฝ๊ณ \n console.warn(\n '[nuri/Button] `iconOnly` ๋ฒํผ์ `aria-label`(๋๋ `aria-labelledby`)์ด ํ์ํฉ๋๋ค.',\n );\n }\n\n const hasLeftSlot = !iconOnly && (loading || iconLeft != null);\n const hasRightSlot = !iconOnly && !loading && iconRight != null;\n\n const classes = cx(\n 'nuri-button',\n `nuri-button--${variant}`,\n `nuri-button--${size}`,\n block && 'nuri-button--block',\n iconOnly && 'nuri-button--icon-only',\n isBlocked && 'nuri-button--disabled',\n loading && 'nuri-button--loading',\n hasLeftSlot && 'nuri-button--has-left',\n hasRightSlot && 'nuri-button--has-right',\n className,\n );\n\n const handleClick = (e: MouseEvent<HTMLButtonElement>) => {\n if (isBlocked) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n onClick?.(e);\n };\n\n const renderContent = (content: ReactNode) => {\n if (iconOnly) {\n return (\n <span className=\"nuri-button__icon\" aria-hidden=\"true\">\n {loading ? <Spinner /> : content}\n </span>\n );\n }\n return (\n <>\n {loading ? (\n <Spinner />\n ) : (\n iconLeft != null && (\n <span className=\"nuri-button__icon nuri-button__icon--left\" aria-hidden=\"true\">\n {iconLeft}\n </span>\n )\n )}\n {content}\n {hasRightSlot && (\n <span className=\"nuri-button__icon nuri-button__icon--right\" aria-hidden=\"true\">\n {iconRight}\n </span>\n )}\n </>\n );\n };\n\n if (asChild) {\n const child = Children.only(children);\n if (!isValidElement(child)) return null;\n const childElement = child as ReactElement<{ children?: ReactNode }>;\n return (\n <Slot\n ref={ref}\n className={classes}\n aria-disabled={isBlocked || undefined}\n aria-busy={loading || undefined}\n onClick={handleClick}\n {...rest}\n >\n {cloneElement(childElement, undefined, renderContent(childElement.props.children))}\n </Slot>\n );\n }\n\n return (\n <button\n ref={ref}\n type={type}\n className={classes}\n // disabled = ์ง์ง ๋นํ์ฑ โ native disabled (ํฌ์ปค์ค ๋ถ๊ฐ, ์๋๋ ๋์)\n // loading = ์ผ์์ ์ฒ๋ฆฌ์ค โ aria-disabled๋ก ํฌ์ปค์ค ์ ์ง (ํด๋ฆญ์ handleClick์ด ๊ฐ๋)\n disabled={disabled}\n aria-disabled={loading || undefined}\n aria-busy={loading || undefined}\n onClick={handleClick}\n {...rest}\n >\n {renderContent(children)}\n </button>\n );\n});\n","export const Spinner = () => (\n <span className=\"nuri-button__icon\" aria-hidden=\"true\">\n <svg className=\"nuri-button__spinner\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"2\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </span>\n);\n","/**\n * ์กฐ๊ฑด๋ถ className ํฉ์ฑ ์ ํธ. falsy ๊ฐ(undefined/false/null/'')์ ์ ๊ฑฐ.\n * @example cx('btn', isActive && 'btn--active', className)\n */\nexport function cx(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(' ');\n}\n","'use client';\n\nimport './styles.css';\nimport { forwardRef, useId } from 'react';\nimport type { InputHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\ntype Size = 'sm' | 'md' | 'lg';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n /**\n * ์ฌ์ด์ฆ. sm 36 / md 42 / lg 48 px ๋์ด.\n * @default 'md'\n */\n size?: Size;\n /**\n * ๋ผ๋ฒจ (ํ๋ ์). ์ง์ ์ `<label>`๋ก ๋ ๋๋์ด ์๋ ์ฐ๊ฒฐ๋จ.\n * ๋ผ๋ฒจ์ ๋์ง ์์ผ๋ฉด `aria-label`๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฆ์ ์ฃผ์ธ์\n * (placeholder๋ ์ด๋ฆ์ ๋์ฒดํ์ง ๋ชปํจ โ ์
๋ ฅ ์ ์ฌ๋ผ์ง๊ณ ๋๋น๊ฐ ๋ฎ์).\n */\n label?: ReactNode;\n /**\n * ๋ผ๋ฒจ์ ์๊ฐ์ ์ผ๋ก๋ง ์จ๊น (์คํฌ๋ฆฐ๋ฆฌ๋์๋ ๋
ธ์ถ). ๋์์ธ์ ๋ผ๋ฒจ์ ์ ๋ณด์ด๊ฒ ํ๋\n * ์ ๊ทผ์ฑ ์ด๋ฆ์ ์ ์งํ ๋ ์ฌ์ฉ.\n * @default false\n */\n hideLabel?: boolean;\n /** ํ์์ ํํธ (ํ์, ํ๋ ์๋). `aria-describedby`๋ก ์ฐ๊ฒฐ๋จ. */\n description?: ReactNode;\n /** ์๋ฌ ์ํ โ ๋ณด๋ยทํ
์คํธยท๋ฐฐ๊ฒฝ์ด ์๋ฌ์์ผ๋ก ๋ฐ๋๊ณ `aria-invalid`๊ฐ ์ค์ ๋จ. */\n invalid?: boolean;\n /** `invalid`์ผ ๋ ํ์ํ ์๋ฌ ๋ฉ์์ง (๋นจ๊ฐ). ์์ผ๋ฉด description์ ๋์ฒด. */\n errorMessage?: ReactNode;\n /** ์ข์ธก ์ด๋๋จผํธ (์์ด์ฝ ๋ฑ). */\n iconLeft?: ReactNode;\n /** ์ฐ์ธก ์ด๋๋จผํธ (์์ด์ฝยทclearยท๋ฒํผ ๋ฑ). */\n iconRight?: ReactNode;\n /** ์ปจํ
์ด๋ ์ ์ฒด ๋๋น๋ก ํ์ฅ. @default false */\n block?: boolean;\n}\n\n/**\n * ํ
์คํธ ์
๋ ฅ ํ๋. ์ต์
์ผ๋ก ๋ผ๋ฒจ(์)ยทํฌํผ/์๋ฌ ๋ฉ์์ง(์๋)๋ฅผ ํฌํจํ๋ ์์ฒด ์๊ฒฐํ.\n * ์ํ(default/focus/invalid/disabled)๋ CSS๋ก, ๊ฐ ์ฑ์(filled)์ ๋ค์ดํฐ๋ธ๋ก ์ฒ๋ฆฌ.\n *\n * @example ๊ธฐ๋ณธ\n * <Input placeholder=\"๊ฒ์์ด\" aria-label=\"๊ฒ์\" />\n *\n * @example ๋ผ๋ฒจ + ํฌํผ + ์๋ฌ\n * <Input\n * label=\"๋น๋ฐ๋ฒํธ\"\n * description=\"8์ ์ด์ ์
๋ ฅํ์ธ์\"\n * invalid\n * errorMessage=\"๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค\"\n * />\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n size = 'md',\n label,\n hideLabel = false,\n description,\n invalid = false,\n errorMessage,\n iconLeft,\n iconRight,\n block = false,\n disabled = false,\n className,\n id: idProp,\n 'aria-describedby': ariaDescribedby,\n ...rest\n },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `nuri-input-${reactId}`;\n const messageId = `${id}-message`;\n\n // invalid + errorMessage โ ์๋ฌ ๋ฉ์์ง / ์๋๋ฉด ํํธ. ์๊ฐ ์ฌ๋กฏ์ ํญ์ ํ ์ค.\n const message = invalid && errorMessage != null ? errorMessage : description;\n const hasMessage = message != null;\n const describedBy =\n cx(hasMessage ? messageId : undefined, ariaDescribedby as string | undefined) || undefined;\n\n return (\n <div className={cx('nuri-input', block && 'nuri-input--block', className)}>\n {label != null && (\n <label htmlFor={id} className={cx('nuri-input__label', hideLabel && 'nuri-sr-only')}>\n {label}\n </label>\n )}\n\n <div\n className={cx(\n 'nuri-input__field',\n `nuri-input__field--${size}`,\n invalid && 'nuri-input__field--invalid',\n disabled && 'nuri-input__field--disabled',\n )}\n >\n {iconLeft != null && (\n <span className=\"nuri-input__icon\" aria-hidden=\"true\">\n {iconLeft}\n </span>\n )}\n <input\n ref={ref}\n id={id}\n className=\"nuri-input__control\"\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n {...rest}\n />\n {iconRight != null && (\n <span className=\"nuri-input__icon\" aria-hidden=\"true\">\n {iconRight}\n </span>\n )}\n </div>\n\n {hasMessage && (\n <p\n id={messageId}\n className={cx('nuri-input__message', invalid && 'nuri-input__message--error')}\n >\n {message}\n </p>\n )}\n </div>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport { forwardRef, useCallback, useId, useLayoutEffect, useRef } from 'react';\nimport type { ChangeEvent, TextareaHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /**\n * ๋ผ๋ฒจ (ํ๋ ์). ์ง์ ์ `<label>`๋ก ๋ ๋๋์ด ์๋ ์ฐ๊ฒฐ๋จ.\n * ๋ผ๋ฒจ์ ๋์ง ์์ผ๋ฉด `aria-label`๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฆ์ ์ฃผ์ธ์.\n */\n label?: ReactNode;\n /** ๋ผ๋ฒจ์ ์๊ฐ์ ์ผ๋ก๋ง ์จ๊น (์คํฌ๋ฆฐ๋ฆฌ๋์๋ ๋
ธ์ถ). @default false */\n hideLabel?: boolean;\n /** ํ์์ ํํธ (ํ์, ํ๋ ์๋). `aria-describedby`๋ก ์ฐ๊ฒฐ๋จ. */\n description?: ReactNode;\n /** ์๋ฌ ์ํ โ ๋ณด๋ยทํ
์คํธยท๋ฐฐ๊ฒฝ์ด ์๋ฌ์์ผ๋ก ๋ฐ๋๊ณ `aria-invalid`๊ฐ ์ค์ ๋จ. */\n invalid?: boolean;\n /** `invalid`์ผ ๋ ํ์ํ ์๋ฌ ๋ฉ์์ง (๋นจ๊ฐ). ์์ผ๋ฉด description์ ๋์ฒด. */\n errorMessage?: ReactNode;\n /** ์ปจํ
์ด๋ ์ ์ฒด ๋๋น๋ก ํ์ฅ. @default false */\n block?: boolean;\n /**\n * ํฌ๊ธฐ ์กฐ์ ํธ๋ค. ์ธ๋ก ์กฐ์ ํ์ฉ์ด ๊ธฐ๋ณธ โ ๊ธด ์
๋ ฅ์ ์ฌ์ฉ์๊ฐ ๋๋ ค ๋ณผ ์ ์๊ฒ.\n * `autosize`๊ฐ ์ผ์ง๋ฉด ๋ฌด์๋๋ค(์๋ ํฌ๊ธฐ์ ์๋ ํธ๋ค์ ์ถฉ๋).\n * @default 'vertical'\n */\n resize?: 'vertical' | 'none';\n /**\n * ๋ด์ฉ์ ๋ฐ๋ผ ๋์ด ์๋ ์กฐ์ . `rows`(์ต์)์์ ์์ํด ๋ด์ฉ๋งํผ ๋์ด๋๊ณ ,\n * `maxRows`์ ๋๋ฌํ๋ฉด ๋ฉ์ถ๊ณ ์คํฌ๋กค์ด ์๊ธด๋ค.\n * @default false\n */\n autosize?: boolean;\n /** `autosize`์ผ ๋ ์ต๋ ์ค ์ โ ๋์ผ๋ฉด ์คํฌ๋กค. ๋ฏธ์ง์ ์ ๋ฌด์ ํ ํ์ฅ. */\n maxRows?: number;\n}\n\n/**\n * ์ฌ๋ฌ ์ค ํ
์คํธ ์
๋ ฅ. Input๊ณผ ๋์ผํ ๋์์ธ ์ธ์ด(๋ณด๋ยท์ํยทํ์ดํฌ)์\n * ๋ผ๋ฒจ/ํํธ/์๋ฌ ์๋ ์ฐ๊ฒฐ ํจํด์ ๋ฐ๋ฅด๋ ์์ฒด ์๊ฒฐํ.\n * ๋์ด๋ native `rows`(๊ธฐ๋ณธ 3)๋ก ์ ์ดํ๊ณ , `autosize`๋ก ์๋ ํ์ฅ๋ ์ง์ํ๋ค.\n *\n * @example\n * <Textarea label=\"๋ฌธ์ ๋ด์ฉ\" rows={5} block />\n *\n * @example ์๋ ๋์ด โ 3์ค์์ ์์ํด 8์ค๊น์ง ๋์ด๋ ๋ค ์คํฌ๋กค\n * <Textarea label=\"๋๊ธ\" autosize rows={3} maxRows={8} />\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n label,\n hideLabel = false,\n description,\n invalid = false,\n errorMessage,\n block = false,\n resize = 'vertical',\n autosize = false,\n maxRows,\n rows = 3,\n disabled = false,\n className,\n id: idProp,\n value,\n onChange,\n 'aria-describedby': ariaDescribedby,\n ...rest\n },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `nuri-textarea-${reactId}`;\n const messageId = `${id}-message`;\n\n const innerRef = useRef<HTMLTextAreaElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref],\n );\n\n // autosize: height๋ฅผ ๋ด์ฉ(scrollHeight)์ ๋ง์ถ๋ maxRows ์ํ์์ ํด๋จํ.\n const fitHeight = useCallback(() => {\n const el = innerRef.current;\n if (!el) return;\n const cs = getComputedStyle(el);\n const borders = parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth);\n const lineHeight = parseFloat(cs.lineHeight);\n // maxRows โ px ์ํ (line-height ๊ณ์ฐ ๋ถ๊ฐ ํ๊ฒฝ์์๋ ๋ฌด์ ํ)\n const maxHeight =\n maxRows != null && !Number.isNaN(lineHeight)\n ? maxRows * lineHeight + parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom) + borders\n : Infinity;\n\n el.style.height = 'auto'; // ์ค์ด๋๋ ๊ฒฝ์ฐ๋ ๋ฐ์๋๋๋ก ์ด๊ธฐํ ํ ์ธก์ \n const contentHeight = el.scrollHeight + borders; // scrollHeight๋ border ๋ฏธํฌํจ(border-box ๋ณด์ )\n const next = Math.min(contentHeight, maxHeight);\n if (!Number.isNaN(next)) el.style.height = `${next}px`;\n el.style.overflowY = contentHeight > maxHeight ? 'auto' : 'hidden';\n }, [maxRows]);\n\n // ๋ง์ดํธยท์ ์ดํ value ๋ณ๊ฒฝยทautosize ํ ๊ธ ์ ์ฌ๊ณ์ฐ\n useLayoutEffect(() => {\n if (autosize) fitHeight();\n }, [autosize, fitHeight, value]);\n\n const handleChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n onChange?.(e);\n if (autosize) fitHeight(); // ๋น์ ์ดํ ์
๋ ฅ์๋ ๋ฐ์\n };\n\n // invalid + errorMessage โ ์๋ฌ ๋ฉ์์ง / ์๋๋ฉด ํํธ. ์๊ฐ ์ฌ๋กฏ์ ํญ์ ํ ์ค. (Input๊ณผ ๋์ผ)\n const message = invalid && errorMessage != null ? errorMessage : description;\n const hasMessage = message != null;\n const describedBy =\n cx(hasMessage ? messageId : undefined, ariaDescribedby as string | undefined) || undefined;\n\n return (\n <div className={cx('nuri-textarea', block && 'nuri-textarea--block', className)}>\n {label != null && (\n <label htmlFor={id} className={cx('nuri-textarea__label', hideLabel && 'nuri-sr-only')}>\n {label}\n </label>\n )}\n\n <textarea\n ref={setRefs}\n id={id}\n rows={rows}\n value={value}\n onChange={handleChange}\n className={cx(\n 'nuri-textarea__control',\n invalid && 'nuri-textarea__control--invalid',\n (resize === 'none' || autosize) && 'nuri-textarea__control--resize-none',\n )}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n aria-describedby={describedBy}\n {...rest}\n />\n\n {hasMessage && (\n <p\n id={messageId}\n className={cx('nuri-textarea__message', invalid && 'nuri-textarea__message--error')}\n >\n {message}\n </p>\n )}\n </div>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { forwardRef, useId } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\ntype Size = 'sm' | 'md';\n\nexport interface CheckboxProps {\n /** ๋ผ๋ฒจ (์ปจํธ๋กค ์ฐ์ธก). ์ง์ ์ ํด๋ฆญ ์์ญ์ ํฌํจ๋๊ณ ์๋ ์ฐ๊ฒฐ๋จ. ์์ผ๋ฉด `aria-label` ํ์. */\n label?: ReactNode;\n /**\n * ์ฌ์ด์ฆ. md 16px(๋์์ธ Large, ๊ธฐ๋ณธ) / sm 12px(๋์์ธ Small).\n * @default 'md'\n */\n size?: Size;\n /** ์ฒดํฌ ์ํ (์ ์ดํ). `'indeterminate'`๋ ๋ถ๋ถ ์ ํ ํ์. */\n checked?: boolean | 'indeterminate';\n /** ์ด๊ธฐ ์ฒดํฌ ์ํ (๋น์ ์ดํ). */\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean | 'indeterminate') => void;\n disabled?: boolean;\n /** ํผ ์ ์ก์ฉ name โ ๋ค์ดํฐ๋ธ checkbox์ฒ๋ผ ํผ์ ์ฐธ์ฌ. */\n name?: string;\n /** ํผ ์ ์ก ์ ๊ฐ. @default 'on' */\n value?: string;\n required?: boolean;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** ์ฒดํฌ๋งํฌ. TODO(Figma ์ค์ธก): ๋์์ด๋ ์์ด์ฝ์ผ๋ก ๊ต์ฒด ์์ โ ์ ์ ํ์คํ. */\nconst CheckIcon = () => (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 6.2l2.4 2.4 4.6-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** ๋ถ๋ถ ์ ํ(indeterminate) ํ์ โ ๊ฐ๋ก ๋ง๋. */\nconst IndeterminateIcon = () => (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M2.8 6h6.4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n);\n\n/**\n * ์ฒดํฌ๋ฐ์ค. Radix Checkbox ๊ธฐ๋ฐ โ Space ํ ๊ธยทaria-checkedยทํผ ์ฐธ์ฌ ์๋.\n * ๋ผ๋ฒจ์ ์ง์ ํ๋ฉด ๋ผ๋ฒจ ํด๋ฆญ์ผ๋ก๋ ํ ๊ธ๋๋ค.\n *\n * @example\n * <Checkbox label=\"์ด์ฉ์ฝ๊ด์ ๋์ํฉ๋๋ค\" checked={agreed} onCheckedChange={setAgreed} />\n *\n * @example ๋ถ๋ถ ์ ํ (์ ์ฒด์ ํ ํค๋ ๋ฑ)\n * <Checkbox label=\"์ ์ฒด ์ ํ\" checked={someChecked ? 'indeterminate' : allChecked} โฆ />\n */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(function Checkbox(\n { label, size = 'md', disabled = false, id: idProp, className, checked, ...rest },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `nuri-checkbox-${reactId}`;\n\n return (\n <div className={cx('nuri-checkbox', `nuri-checkbox--${size}`, className)}>\n <RadixCheckbox.Root\n ref={ref}\n id={id}\n className=\"nuri-checkbox__control\"\n disabled={disabled}\n checked={checked}\n {...rest}\n >\n <RadixCheckbox.Indicator className=\"nuri-checkbox__indicator\">\n {checked === 'indeterminate' ? <IndeterminateIcon /> : <CheckIcon />}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n {label != null && (\n <label htmlFor={id} className=\"nuri-checkbox__label\">\n {label}\n </label>\n )}\n </div>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { forwardRef, useId } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\nexport interface RadioGroupProps {\n children: ReactNode;\n /** ์ ํ๋ ๊ฐ (์ ์ดํ). */\n value?: string;\n /** ์ด๊ธฐ ๊ฐ (๋น์ ์ดํ). */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** ๋ฐฐ์น ๋ฐฉํฅ โ ํค๋ณด๋ ํ์ดํ ํ์ ๋ฐฉํฅ์๋ ๋ฐ์๋จ. @default 'vertical' */\n orientation?: 'vertical' | 'horizontal';\n disabled?: boolean;\n /** ํผ ์ ์ก์ฉ name. */\n name?: string;\n required?: boolean;\n className?: string;\n /** ๊ทธ๋ฃน์ ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฆ (์๊ฐ ์ ๋ชฉ์ด ์์ ๋ ํ์). */\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n}\n\n/**\n * ๋ผ๋์ค ๊ทธ๋ฃน. Radix RadioGroup ๊ธฐ๋ฐ โ ํ์ดํ ํค ๊ทธ๋ฃน ํ์ยท๋จ์ผ ์ ํยทํผ ์ฐธ์ฌ ์๋.\n * ๊ทธ๋ฃน์ `aria-label`(๋๋ aria-labelledby)์ ์ง์ ํ๋ค.\n *\n * @example\n * <RadioGroup aria-label=\"์ ๋ ฌ\" value={sort} onValueChange={setSort}>\n * <Radio value=\"latest\" label=\"์ต์ ์\" />\n * <Radio value=\"edited\" label=\"์์ ์\" />\n * </RadioGroup>\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(function RadioGroup(\n { children, orientation = 'vertical', className, ...rest },\n ref,\n) {\n return (\n <RadixRadioGroup.Root\n ref={ref}\n orientation={orientation}\n className={cx('nuri-radio-group', `nuri-radio-group--${orientation}`, className)}\n {...rest}\n >\n {children}\n </RadixRadioGroup.Root>\n );\n});\n\nexport interface RadioProps {\n /** ์ด ํญ๋ชฉ์ด ๋ํ๋ด๋ ๊ฐ. */\n value: string;\n /** ๋ผ๋ฒจ (์ปจํธ๋กค ์ฐ์ธก). ์์ผ๋ฉด `aria-label` ํ์. */\n label?: ReactNode;\n disabled?: boolean;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** ๋ผ๋์ค ํญ๋ชฉ โ ๋ฐ๋์ RadioGroup ์์์ ์ฌ์ฉ. */\nexport const Radio = forwardRef<HTMLButtonElement, RadioProps>(function Radio(\n { value, label, disabled = false, id: idProp, className, ...rest },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `nuri-radio-${reactId}`;\n\n return (\n <div className={cx('nuri-radio', className)}>\n <RadixRadioGroup.Item\n ref={ref}\n id={id}\n value={value}\n disabled={disabled}\n className=\"nuri-radio__control\"\n {...rest}\n >\n <RadixRadioGroup.Indicator className=\"nuri-radio__indicator\" />\n </RadixRadioGroup.Item>\n {label != null && (\n <label htmlFor={id} className=\"nuri-radio__label\">\n {label}\n </label>\n )}\n </div>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { forwardRef, useId } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\nexport interface SwitchProps {\n /**\n * ๋ผ๋ฒจ (์ปจํธ๋กค ์ฐ์ธก). ๋์์ธ ์์คํ
์ Toggle์ ์ปจํธ๋กค ๋จ๋
์ ์์ง๋ง,\n * ๋ฒ์ฉ ์ฌ์ฉ์ ์ํด ๋ผ๋ฒจ์ ์ง์ํ๋ค(Checkbox ๋ผ๋ฒจ ์คํ์ผ ์ค์ฉ). ์์ผ๋ฉด `aria-label` ํ์.\n */\n label?: ReactNode;\n /** ์ผ์ง ์ํ (์ ์ดํ). */\n checked?: boolean;\n /** ์ด๊ธฐ ์ํ (๋น์ ์ดํ). */\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n /** ํผ ์ ์ก์ฉ name. */\n name?: string;\n /** ํผ ์ ์ก ์ ๊ฐ. @default 'on' */\n value?: string;\n required?: boolean;\n id?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * ์ค์์น(ํ ๊ธ). Radix Switch ๊ธฐ๋ฐ โ `role=\"switch\"`ยทSpace/Enter ํ ๊ธยทํผ ์ฐธ์ฌ ์๋.\n * ์ฆ์ ์ ์ฉ๋๋ ์ผฌ/๋ ์ค์ ์ ์ฌ์ฉํ๋ค (์ ์ถ์ด ํ์ํ ์ ํ์ Checkbox).\n *\n * @example\n * <Switch label=\"์๋ฆผ ๋ฐ๊ธฐ\" checked={on} onCheckedChange={setOn} />\n */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { label, disabled = false, id: idProp, className, ...rest },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `nuri-switch-${reactId}`;\n\n return (\n <div className={cx('nuri-switch', className)}>\n <RadixSwitch.Root\n ref={ref}\n id={id}\n className=\"nuri-switch__control\"\n disabled={disabled}\n {...rest}\n >\n <RadixSwitch.Thumb className=\"nuri-switch__thumb\" />\n </RadixSwitch.Root>\n {label != null && (\n <label htmlFor={id} className=\"nuri-switch__label\">\n {label}\n </label>\n )}\n </div>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { forwardRef } from 'react';\nimport type { ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\ntype Size = 'sm' | 'md';\n\nexport interface SelectOption {\n value: string;\n label: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /** ์ ํ์ง ๋ชฉ๋ก. */\n options: SelectOption[];\n /**\n * ์ฌ์ด์ฆ. sm 36 / md 42 px ๋์ด (๋์์ธ ์์คํ
์ Small/Large).\n * @default 'md'\n */\n size?: Size;\n /** ๊ฐ์ด ์์ ๋ ํธ๋ฆฌ๊ฑฐ์ ํ์ํ ๋ฌธ๊ตฌ. */\n placeholder?: ReactNode;\n /** ์ ํ๋ ๊ฐ (์ ์ดํ). */\n value?: string;\n /** ์ด๊ธฐ ๊ฐ (๋น์ ์ดํ). */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** ์ด๋ฆผ ์ํ ์ ์ด (์ ํ). */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n disabled?: boolean;\n /** ์ปจํ
์ด๋ ์ ์ฒด ๋๋น๋ก ํ์ฅ. @default false */\n block?: boolean;\n /** ํผ ์ ์ก์ฉ name โ ๋ค์ดํฐ๋ธ select์ฒ๋ผ ํผ์ ์ฐธ์ฌ. */\n name?: string;\n required?: boolean;\n /** ํฌํธ ๋ ๋ ๋์. ๊ธฐ๋ณธ document.body. */\n container?: HTMLElement | null;\n /** ํธ๋ฆฌ๊ฑฐ์ ์ถ๊ฐํ className. */\n className?: string;\n /** ์๊ฐ ๋ผ๋ฒจ์ด ์์ ๋ ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฆ. */\n 'aria-label'?: string;\n}\n\n/** ๋์์ธ ์์คํ
์ 8px ์ผ๊ฐ ์บ๋ฟ (์ด๋ฆผ ์ CSS๋ก ํ์ ). */\nconst CaretIcon = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1.1 2.5h5.8L4 5.9z\" fill=\"currentColor\" />\n </svg>\n);\n\n/**\n * ์
๋ ํธ ๋ฐ์ค (๋จ์ผ ์ ํ). Radix Select ๊ธฐ๋ฐ โ ํค๋ณด๋ ํ์ยทํ์
์ดํค๋ยท\n * ํฌ์ง์
๋ยทaria ์ฐ๊ฒฐ์ ์๋ ์ ๊ณต. ์ต์
๋ชฉ๋ก์ `options` ๋ฐฐ์ด๋ก ์ ๋ฌํ๋ค.\n *\n * ๋ค์ค ์ ํ(์ฒดํฌ๋ฐ์ค ์ต์
)ยท์๋ธ๋ฉ๋ด ๋ณํ์ ๋ณ๋ ์ปดํฌ๋ํธ(DropdownMenu) ๋ฒ์.\n *\n * @example\n * <Select\n * aria-label=\"์ ๋ ฌ\"\n * placeholder=\"์ ๋ ฌ ์ ํ\"\n * options={[\n * { value: 'latest', label: '์ต์ ์' },\n * { value: 'edited', label: '์์ ์' },\n * ]}\n * onValueChange={setSort}\n * />\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n size = 'md',\n placeholder,\n value,\n defaultValue,\n onValueChange,\n open,\n defaultOpen,\n onOpenChange,\n disabled = false,\n block = false,\n name,\n required,\n container,\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n return (\n <RadixSelect.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange}\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n disabled={disabled}\n name={name}\n required={required}\n >\n <RadixSelect.Trigger\n ref={ref}\n aria-label={ariaLabel}\n className={cx(\n 'nuri-select__trigger',\n `nuri-select__trigger--${size}`,\n block && 'nuri-select__trigger--block',\n className,\n )}\n >\n <span className=\"nuri-select__value\">\n <RadixSelect.Value placeholder={placeholder} />\n </span>\n <RadixSelect.Icon className=\"nuri-select__caret\">\n <CaretIcon />\n </RadixSelect.Icon>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal container={container}>\n <RadixSelect.Content className=\"nuri-select__content\" position=\"popper\" sideOffset={6}>\n <RadixSelect.Viewport className=\"nuri-select__viewport\">\n {options.map((option) => (\n <RadixSelect.Item\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n className=\"nuri-select__item\"\n >\n <RadixSelect.ItemText>{option.label}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n );\n});\n","'use client';\n\nimport './styles.css';\nimport * as Dialog from '@radix-ui/react-dialog';\nimport { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef, ElementRef, ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\ntype Placement = 'center' | 'bottom';\ntype Size = 'sm' | 'md' | 'lg';\n\n/**\n * ๋ชจ๋ฌ ๋ฃจํธ. open/onOpenChange๋ก ์ ์ดํ๊ฑฐ๋, Modal.Trigger์ ํจ๊ป ๋น์ ์ด๋ก๋ ์ฌ์ฉ.\n * Radix Dialog ๊ธฐ๋ฐ โ ํฌ์ปค์ค ํธ๋ฉยทEscยท์คํฌ๋กค ๋ฝยทํฌ์ปค์ค ๋ณต๊ทยทaria ์ฐ๊ฒฐ์ ์๋ ์ ๊ณต.\n *\n * @example ์ ์ดํ\n * <Modal open={open} onOpenChange={setOpen}>\n * <Modal.Content>...</Modal.Content>\n * </Modal>\n *\n * @example ๋น์ ์ด (ํธ๋ฆฌ๊ฑฐ)\n * <Modal>\n * <Modal.Trigger asChild><Button>์ด๊ธฐ</Button></Modal.Trigger>\n * <Modal.Content>...</Modal.Content>\n * </Modal>\n */\nconst Root = (props: ComponentPropsWithoutRef<typeof Dialog.Root>) => <Dialog.Root {...props} />;\nRoot.displayName = 'Modal';\n\n/** ๋ชจ๋ฌ์ ์ฌ๋ ํธ๋ฆฌ๊ฑฐ. `asChild`๋ก ์์ ์๋ฆฌ๋จผํธ(Button ๋ฑ)์ ์์. */\nconst Trigger = Dialog.Trigger;\n\nexport interface ModalContentProps extends ComponentPropsWithoutRef<typeof Dialog.Content> {\n /**\n * ํ์ ์์น.\n * - `center`: ํ๋ฉด ์ค์ ๋ค์ด์ผ๋ก๊ทธ (๊ธฐ๋ณธ)\n * - `bottom`: ํ๋จ ๋ฐํ
์ํธ (๋ชจ๋ฐ์ผ์์ ์๋์์ ์ฌ๋ผ์ด)\n * @default 'center'\n */\n placement?: Placement;\n /**\n * ์ต๋ ๋๋น. **`placement=\"center\"`์์๋ง ์ ์ฉ** (bottom ๋ฐํ
์ํธ๋ ํญ์ ํ width).\n * @default 'md'\n */\n size?: Size;\n /** ๋ฐฑ๋๋กญ(์ค๋ฒ๋ ์ด) ํ์ ์ฌ๋ถ. @default true */\n overlay?: boolean;\n /** ํฌํธ ๋ ๋ ๋์. ๊ธฐ๋ณธ์ document.body. ๋ค๋ฅธ ์์์ ๋ ๋ํ๋ ค๋ฉด ์ง์ . */\n container?: HTMLElement | null;\n}\n\n/**\n * ์ค๋ฒ๋ ์ด + ํฌํธ + ๋ค์ด์ผ๋ก๊ทธ ํจ๋์ ํ ๋ฒ์ ๋ ๋.\n * ๋ด๋ถ์ Modal.Header / Modal.Body / Modal.Footer๋ฅผ ์์ ๋กญ๊ฒ ํฉ์ฑ.\n */\nconst Content = forwardRef<ElementRef<typeof Dialog.Content>, ModalContentProps>(\n function ModalContent(\n { placement = 'center', size = 'md', overlay = true, container, className, children, ...rest },\n ref,\n ) {\n const classes = cx('nuri-modal', `nuri-modal--${placement}`, `nuri-modal--${size}`, className);\n\n return (\n <Dialog.Portal container={container}>\n {overlay && <Dialog.Overlay className=\"nuri-modal__overlay\" />}\n <Dialog.Content ref={ref} className={classes} {...rest}>\n {children}\n </Dialog.Content>\n </Dialog.Portal>\n );\n },\n);\n\n/** ํค๋ ์์ญ (Title/Description/CloseButton์ ๋ด๋ ๋ ์ด์์ ์ฌ๋กฏ). */\nconst Header = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(function ModalHeader(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('nuri-modal__header', className)} {...rest} />;\n});\n\nexport interface ModalTitleProps extends ComponentPropsWithoutRef<typeof Dialog.Title> {\n /**\n * ์๊ฐ์ ์ผ๋ก๋ ์จ๊ธฐ๋ ์คํฌ๋ฆฐ๋ฆฌ๋์๋ ๋
ธ์ถ. ์๊ฐ์ ์ ๋ชฉ์ด ์๋ ๋ชจ๋ฌ๋\n * ์ ๊ทผ ๊ฐ๋ฅํ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํ๋ฏ๋ก(Radix Dialog๋ Title ํ์), ์ด ์ต์
์ผ๋ก ์ฒ๋ฆฌ.\n * @example <Modal.Title visuallyHidden>์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ</Modal.Title>\n */\n visuallyHidden?: boolean;\n}\n\n/** ๋ชจ๋ฌ ์ ๋ชฉ. ๋ ๋ ์ ์๋์ผ๋ก `aria-labelledby`๋ก ์ฐ๊ฒฐ๋จ (Radix Dialog.Title). */\nconst Title = forwardRef<ElementRef<typeof Dialog.Title>, ModalTitleProps>(function ModalTitle(\n { visuallyHidden = false, className, ...rest },\n ref,\n) {\n return (\n <Dialog.Title\n ref={ref}\n className={cx('nuri-modal__title', visuallyHidden && 'nuri-sr-only', className)}\n {...rest}\n />\n );\n});\n\n/** ๋ชจ๋ฌ ์ค๋ช
. ๋ ๋ ์ ์๋์ผ๋ก `aria-describedby`๋ก ์ฐ๊ฒฐ๋จ (Radix Dialog.Description). */\nconst Description = forwardRef<\n ElementRef<typeof Dialog.Description>,\n ComponentPropsWithoutRef<typeof Dialog.Description>\n>(function ModalDescription({ className, ...rest }, ref) {\n return (\n <Dialog.Description ref={ref} className={cx('nuri-modal__description', className)} {...rest} />\n );\n});\n\n/** ๋ณธ๋ฌธ ์์ญ (์คํฌ๋กค ๊ฐ๋ฅ). */\nconst Body = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(function ModalBody(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('nuri-modal__body', className)} {...rest} />;\n});\n\nexport interface ModalFooterProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * ์ก์
๋ฒํผ ์ ๋ ฌ.\n * - `end`: ์ฐ์ธก (๊ธฐ๋ณธ, ๋ฐ์คํฌํ ๊ด๋ก)\n * - `start`: ์ข์ธก\n * - `center`: ๊ฐ์ด๋ฐ\n * - `between`: ์๋ ๋ถ์ฐ (์: ์ข์ธก ์ํ ์ก์
+ ์ฐ์ธก ํ์ธ)\n * - `full`: ๋ฒํผ๋ค์ด ๊ฐ๋ก๋ฅผ ๊ท ๋ฑํ๊ฒ ์ฑ์ (๋ชจ๋ฐ์ผ ์ ์ฒด๋๋น)\n * @default 'end'\n */\n align?: 'start' | 'center' | 'end' | 'between' | 'full';\n}\n\n/** ํธํฐ ์์ญ (์ก์
๋ฒํผ ๋ฐฐ์น). ์ ๋ ฌ์ `align` prop์ผ๋ก ์ ์ด. */\nconst Footer = forwardRef<HTMLDivElement, ModalFooterProps>(function ModalFooter(\n { align = 'end', className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cx('nuri-modal__footer', `nuri-modal__footer--${align}`, className)}\n {...rest}\n />\n );\n});\n\n/**\n * ๋ชจ๋ฌ์ ๋ซ๋ ์ก์
. `asChild`๋ก ์์ ์๋ฆฌ๋จผํธ์ ์์.\n * @example <Modal.Close asChild><Button variant=\"outline\">์ทจ์</Button></Modal.Close>\n */\nconst Close = Dialog.Close;\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n/** ์ฐ์๋จ X ๋ซ๊ธฐ ๋ฒํผ (๋ฏธ๋ฆฌ ์คํ์ผ๋ง๋จ). ๊ธฐ๋ณธ `aria-label=\"๋ซ๊ธฐ\"`. */\nconst CloseButton = forwardRef<\n HTMLButtonElement,\n Omit<ComponentPropsWithoutRef<'button'>, 'children'> & { children?: ReactNode }\n>(function ModalCloseButton(\n { className, 'aria-label': ariaLabel = '๋ซ๊ธฐ', children, ...rest },\n ref,\n) {\n return (\n <Dialog.Close asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={ariaLabel}\n className={cx('nuri-modal__close', className)}\n {...rest}\n >\n {children ?? <CloseIcon />}\n </button>\n </Dialog.Close>\n );\n});\n\nexport const Modal = Object.assign(Root, {\n Trigger,\n Content,\n Header,\n Title,\n Description,\n Body,\n Footer,\n Close,\n CloseButton,\n});\n","'use client';\n\nimport './styles.css';\nimport * as Alert from '@radix-ui/react-alert-dialog';\nimport { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef, ElementRef, ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\nimport { defaultToneIcon } from './icons.js';\n\ntype Tone = 'info' | 'success' | 'warning';\n\n/**\n * ํ์ธ ๊ฐ์ ํ ๋ค์ด์ผ๋ก๊ทธ (alertdialog). Radix AlertDialog ๊ธฐ๋ฐ.\n *\n * ์ผ๋ฐ Modal๊ณผ์ ์ฐจ์ด:\n * - `role=\"alertdialog\"` โ ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๋ ๊ฐํ๊ฒ ์๋ด\n * - **๋ฐ๊นฅ(๋ฐฑ๋๋กญ) ํด๋ฆญ์ผ๋ก ๋ซํ์ง ์์** โ ์ค์๋ก ๋ซํ๋ ๊ฒ ๋ฐฉ์ง\n * - ํฌ์ปค์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก Cancel(์ทจ์)์ ์์น โ ์ค์๋ก ์ํ ์ก์
๋ฐฉ์ง\n * - **์ค์ ์ ๋ ฌ + ์๋จ ์์ด์ฝ** (๋์์ธ ์์คํ
ํ์ค ๋ ์ด์์)\n *\n * Esc ํค๋ ๋ซํ(ํค๋ณด๋ ํ์ถ๊ตฌ โ ์ ๊ทผ์ฑ). ๋ง์ผ๋ ค๋ฉด Content์ `onEscapeKeyDown` ์ ๋ฌ.\n *\n * @example\n * <AlertDialog>\n * <AlertDialog.Trigger asChild><Button>์ญ์ </Button></AlertDialog.Trigger>\n * <AlertDialog.Content tone=\"warning\">\n * <AlertDialog.Header>\n * <AlertDialog.Title>์ ๋ง ์ญ์ ํ ๊น์?</AlertDialog.Title>\n * <AlertDialog.Description>๋๋๋ฆด ์ ์์ต๋๋ค.</AlertDialog.Description>\n * </AlertDialog.Header>\n * <AlertDialog.Footer>\n * <AlertDialog.Cancel asChild><Button variant=\"outline\">์ทจ์</Button></AlertDialog.Cancel>\n * <AlertDialog.Action asChild><Button onClick={onDelete}>์ญ์ </Button></AlertDialog.Action>\n * </AlertDialog.Footer>\n * </AlertDialog.Content>\n * </AlertDialog>\n */\nconst Root = (props: ComponentPropsWithoutRef<typeof Alert.Root>) => <Alert.Root {...props} />;\nRoot.displayName = 'AlertDialog';\n\n/** ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ฌ๋ ํธ๋ฆฌ๊ฑฐ. `asChild`๋ก ์์ ์๋ฆฌ๋จผํธ์ ์์. */\nconst Trigger = Alert.Trigger;\n\nexport interface AlertDialogContentProps extends ComponentPropsWithoutRef<typeof Alert.Content> {\n /**\n * ์ํ ํค โ ๊ธฐ๋ณธ ์์ด์ฝ๊ณผ ๊ทธ ์์ ๊ฒฐ์ .\n * @default 'info'\n */\n tone?: Tone;\n /**\n * ์๋จ ์์ด์ฝ.\n * - ๋ฏธ์ง์ : `tone`์ ๋ง๋ **๊ธฐ๋ณธ ์์ด์ฝ** ์๋ ๋ ๋\n * - `ReactNode`: ์ปค์คํ
์์ด์ฝ์ผ๋ก ๊ต์ฒด\n * - `null`: ์์ด์ฝ ์ ๊ฑฐ\n */\n icon?: ReactNode | null;\n /** ๋ฐฑ๋๋กญ(์ค๋ฒ๋ ์ด) ํ์ ์ฌ๋ถ. @default true */\n overlay?: boolean;\n /** ํฌํธ ๋ ๋ ๋์. ๊ธฐ๋ณธ์ document.body. ๋ค๋ฅธ ์์์ ๋ ๋ํ๋ ค๋ฉด ์ง์ . */\n container?: HTMLElement | null;\n}\n\n/** ์ค๋ฒ๋ ์ด + ํฌํธ + ํจ๋์ ํ ๋ฒ์ ๋ ๋. ์ค์ ์ ๋ ฌ + ์๋จ ์์ด์ฝ ๋ ์ด์์. */\nconst Content = forwardRef<ElementRef<typeof Alert.Content>, AlertDialogContentProps>(\n function AlertDialogContent(\n { tone = 'info', icon, overlay = true, container, className, children, ...rest },\n ref,\n ) {\n // icon ๋ฏธ์ง์ (undefined) โ ๊ธฐ๋ณธ tone ์์ด์ฝ / null โ ์ ๊ฑฐ / ReactNode โ ๊ต์ฒด\n const resolvedIcon = icon === undefined ? defaultToneIcon[tone] : icon;\n return (\n <Alert.Portal container={container}>\n {overlay && <Alert.Overlay className=\"nuri-alert__overlay\" />}\n <Alert.Content\n ref={ref}\n className={cx('nuri-alert', `nuri-alert--${tone}`, className)}\n {...rest}\n >\n {resolvedIcon != null && (\n <div className=\"nuri-alert__icon\" aria-hidden=\"true\">\n {resolvedIcon}\n </div>\n )}\n {children}\n </Alert.Content>\n </Alert.Portal>\n );\n },\n);\n\n/** ํค๋ ์ฌ๋กฏ (Title/Description ๋ฌถ์, ์ค์ ์ ๋ ฌ). */\nconst Header = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n function AlertDialogHeader({ className, ...rest }, ref) {\n return <div ref={ref} className={cx('nuri-alert__header', className)} {...rest} />;\n },\n);\n\n/** ์ ๋ชฉ. ์๋์ผ๋ก `aria-labelledby`๋ก ์ฐ๊ฒฐ๋จ. */\nconst Title = forwardRef<\n ElementRef<typeof Alert.Title>,\n ComponentPropsWithoutRef<typeof Alert.Title>\n>(function AlertDialogTitle({ className, ...rest }, ref) {\n return <Alert.Title ref={ref} className={cx('nuri-alert__title', className)} {...rest} />;\n});\n\n/** ์ค๋ช
. ์๋์ผ๋ก `aria-describedby`๋ก ์ฐ๊ฒฐ๋จ. */\nconst Description = forwardRef<\n ElementRef<typeof Alert.Description>,\n ComponentPropsWithoutRef<typeof Alert.Description>\n>(function AlertDialogDescription({ className, ...rest }, ref) {\n return (\n <Alert.Description ref={ref} className={cx('nuri-alert__description', className)} {...rest} />\n );\n});\n\n/** ๋ณธ๋ฌธ ์ฌ๋กฏ (์ถ๊ฐ ์ฝํ
์ธ ). */\nconst Body = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(function AlertDialogBody(\n { className, ...rest },\n ref,\n) {\n return <div ref={ref} className={cx('nuri-alert__body', className)} {...rest} />;\n});\n\nexport interface AlertDialogFooterProps extends ComponentPropsWithoutRef<'div'> {\n /**\n * ๋ฒํผ ์ ๋ ฌ. ๋์์ธ ํ์ค์ ์ ์ฒด๋๋น ๋ฒํผ์ด๋ผ ๊ธฐ๋ณธ๊ฐ `full`.\n * @default 'full'\n */\n align?: 'start' | 'center' | 'end' | 'between' | 'full';\n}\n\n/** ํธํฐ ์ฌ๋กฏ (Cancel/Action ๋ฐฐ์น). ๊ธฐ๋ณธ ์ ์ฒด๋๋น(`full`). */\nconst Footer = forwardRef<HTMLDivElement, AlertDialogFooterProps>(function AlertDialogFooter(\n { align = 'full', className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cx('nuri-alert__footer', `nuri-alert__footer--${align}`, className)}\n {...rest}\n />\n );\n});\n\n/**\n * ํ์ธ(์ฃผ ์ก์
) ๋ฒํผ. ํด๋ฆญ ์ ๋ซํ. `asChild`๋ก Button ์์.\n * @example <AlertDialog.Action asChild><Button onClick={onConfirm}>์ญ์ </Button></AlertDialog.Action>\n */\nconst Action = Alert.Action;\n\n/**\n * ์ทจ์ ๋ฒํผ. ํด๋ฆญ ์ ๋ซํ. ํฌ์ปค์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๊ธฐ ์์น.\n * @example <AlertDialog.Cancel asChild><Button variant=\"outline\">์ทจ์</Button></AlertDialog.Cancel>\n */\nconst Cancel = Alert.Cancel;\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M5 5l10 10M15 5L5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\n/**\n * ์ฐ์๋จ X ๋ซ๊ธฐ ๋ฒํผ (์ต์
). ๋ด๋ถ์ ์ผ๋ก Cancel๊ณผ ๋์ผํ๊ฒ ๋ซํ. ๊ธฐ๋ณธ `aria-label=\"๋ซ๊ธฐ\"`.\n * ํ์ธ์ ๊ฐ์ ํ๋ ค๋ฉด ์ฌ์ฉํ์ง ์๋ ํธ์ด ์ข์ต๋๋ค (Cancel/Action์ผ๋ก ๋ช
์์ ์ ํ ์ ๋).\n */\nconst CloseButton = forwardRef<\n HTMLButtonElement,\n Omit<ComponentPropsWithoutRef<'button'>, 'children'> & { children?: ReactNode }\n>(function AlertDialogCloseButton(\n { className, 'aria-label': ariaLabel = '๋ซ๊ธฐ', children, ...rest },\n ref,\n) {\n return (\n <Alert.Cancel asChild>\n <button\n ref={ref}\n type=\"button\"\n aria-label={ariaLabel}\n className={cx('nuri-alert__close', className)}\n {...rest}\n >\n {children ?? <CloseIcon />}\n </button>\n </Alert.Cancel>\n );\n});\n\nexport const AlertDialog = Object.assign(Root, {\n Trigger,\n Content,\n Header,\n Title,\n Description,\n Body,\n Footer,\n Action,\n Cancel,\n CloseButton,\n});\n","/**\n * tone๋ณ ๊ธฐ๋ณธ ์์ด์ฝ โ ๋์์ด๋ ์์คํ
(Figma) ์์
์ ๊ทธ๋๋ก inline SVG๋ก ์ฌํ.\n * ๊ตฌ์กฐ: ํดํธ ์ ๋ฐฐ๊ฒฝ + tone ์ ์ฌ๋ณผ. ์์ ํ ํฐ(`--nuri-alert-tone-*`)์ผ๋ก ๋ถ๋ฆฌ.\n * AlertDialog.Content์ `icon` ๋ฏธ์ง์ ์ tone์ ๋ง์ถฐ ์๋ ๋ ๋.\n * `icon={<Custom/>}`๋ก ๊ต์ฒด, `icon={null}`๋ก ์ ๊ฑฐ ๊ฐ๋ฅ.\n */\nimport type { ReactNode } from 'react';\n\nconst SuccessIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--nuri-alert-tone-success-bg)\" />\n <path\n d=\"M15.77 9.58L10.65 14.70L8.90 12.95\"\n stroke=\"var(--nuri-alert-tone-success-fg)\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst WarningIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--nuri-alert-tone-warning-bg)\" />\n <path\n d=\"M12 6.75V12\"\n stroke=\"var(--nuri-alert-tone-warning-fg)\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"12\" cy=\"16.31\" r=\"1.1\" fill=\"var(--nuri-alert-tone-warning-fg)\" />\n </svg>\n);\n\nconst InfoIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--nuri-alert-tone-info-bg)\" />\n <path\n d=\"M12.25 7h0.01\"\n stroke=\"var(--nuri-alert-tone-info-fg)\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 12h1.25v5h1.25\"\n stroke=\"var(--nuri-alert-tone-info-fg)\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const defaultToneIcon: Record<'info' | 'success' | 'warning', ReactNode> = {\n info: <InfoIcon />,\n success: <SuccessIcon />,\n warning: <WarningIcon />,\n};\n","'use client';\n\nimport './styles.css';\nimport * as RadixToast from '@radix-ui/react-toast';\nimport { cx } from '../utils/cx.js';\nimport { toastStore, useToasts } from './store.js';\nimport { toneIcon } from './icons.js';\n\nexport interface ToasterProps {\n /**\n * ์ค์์ดํ๋ก ๋ซ๋ ๋ฐฉํฅ. ํ๋จ ํ์๋ผ ๊ธฐ๋ณธ `down`(์๋๋ก ๋ฐ์ด ๋ซ๊ธฐ โ ํฐ์นยท๋๋๊ทธ ๋ชจ๋).\n * @default 'down'\n */\n swipeDirection?: RadixToast.ToastProviderProps['swipeDirection'];\n /** ์ค์์ดํ ์๊ณ ๊ฑฐ๋ฆฌ(px). @default 50 */\n swipeThreshold?: number;\n /** ๋ทฐํฌํธ์ ์ถ๊ฐํ className (์์น ์ปค์คํฐ๋ง์ด์ฆ ๋ฑ). */\n className?: string;\n /** ์คํฌ๋ฆฐ๋ฆฌ๋์ฉ ์ง์ญ ๋ผ๋ฒจ. @default '์๋ฆผ' */\n label?: string;\n}\n\n/**\n * ํ ์คํธ ๋ ๋๋ฌ. **์ฑ ๋ฃจํธ์ 1ํ๋ง** ๋ง์ดํธํ๋ฉด ๋๊ณ , ํ์๋ `toast()` ํธ์ถ๋ก ํธ๋ฆฌ๊ฑฐํ๋ค.\n * (์ฌ์ฉ์ฒ๋ง๋ค ๋ ๋ํ ํ์ ์์ โ ๋ชจ๋ store๋ฅผ ๊ตฌ๋
ํด ์ด ์ปดํฌ๋ํธ๋ง ๋ ๋)\n *\n * Radix Toast ๊ธฐ๋ฐ์ด๋ผ ์๋ ๋ซํ ํ์ด๋จธยทhover ์ ์ผ์์ ์งยท์ค์์ดํ ๋ซ๊ธฐยท\n * ์คํฌ๋ฆฐ๋ฆฌ๋ announce(aria-live)๋ฅผ ํ์ค์ผ๋ก ์ ๊ณตํ๋ค.\n *\n * @example\n * // app/layout.tsx\n * <body>{children}<Toaster /></body>\n */\nexport function Toaster({\n swipeDirection = 'down',\n swipeThreshold = 50,\n className,\n label = '์๋ฆผ',\n}: ToasterProps) {\n const toasts = useToasts();\n\n return (\n <RadixToast.Provider\n swipeDirection={swipeDirection}\n swipeThreshold={swipeThreshold}\n label={label}\n >\n {toasts.map((t) => (\n <RadixToast.Root\n key={t.id}\n duration={t.duration}\n onOpenChange={(open) => {\n if (!open) toastStore.remove(t.id);\n }}\n // error๋ foreground(assertive)๋ก ์ฆ์ ์๋ด, ๊ทธ ์ธ๋ background(polite)\n type={t.tone === 'error' ? 'foreground' : 'background'}\n className={cx('nuri-toast', t.tone !== 'default' && `nuri-toast--${t.tone}`)}\n >\n {t.tone !== 'default' && (\n <span className=\"nuri-toast__icon\" aria-hidden=\"true\">\n {toneIcon[t.tone]}\n </span>\n )}\n <RadixToast.Title className=\"nuri-toast__message\">{t.message}</RadixToast.Title>\n </RadixToast.Root>\n ))}\n {/* ๋๋๋งํฌ ์ด๋ฆ โ ์คํฌ๋ฆฐ๋ฆฌ๋ ์์ญ ํ์์ฉ. {hotkey}๋ Radix๊ฐ ์ค์ ํค(F8)๋ก ์นํ */}\n <RadixToast.Viewport\n className={cx('nuri-toast__viewport', className)}\n label={`${label} ({hotkey})`}\n />\n </RadixToast.Provider>\n );\n}\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport type { ReactNode } from 'react';\n\nexport type ToastTone = 'default' | 'success' | 'error' | 'info';\n\nexport interface ToastOptions {\n /** ํค โ ์์ด์ฝยท์ ๊ฒฐ์ . @default 'default' (์์ด์ฝ ์์) */\n tone?: ToastTone;\n /** ์๋ ๋ซํ๊น์ง ms. @default 3000 */\n duration?: number;\n /** id ์ง์ ์ง์ (๊ฐ์ id๋ฉด ๊ต์ฒด โ ์ค๋ณต ๋ฐฉ์งยท์๋ dismiss์ฉ). */\n id?: string;\n}\n\nexport interface ToastRecord {\n id: string;\n message: ReactNode;\n tone: ToastTone;\n duration: number;\n}\n\n// โโ React ๋ฐ ๋ชจ๋ ์ฑ๊ธํค store (์๋ฌด ๋ฐ์๋ toast() ํธ์ถ ๊ฐ๋ฅํ ์ด์ ) โโ\nlet toasts: ToastRecord[] = [];\nconst listeners = new Set<() => void>();\nconst EMPTY: ToastRecord[] = []; // ์๋ฒ ์ค๋
์ท์ฉ ์์ ์ฐธ์กฐ\nlet counter = 0;\n\nconst emit = () => {\n for (const l of listeners) l();\n};\n\nfunction add(message: ReactNode, options: ToastOptions = {}): string {\n const id = options.id ?? `nuri-toast-${++counter}`;\n const record: ToastRecord = {\n id,\n message,\n tone: options.tone ?? 'default',\n duration: options.duration ?? 3000,\n };\n const idx = toasts.findIndex((t) => t.id === id);\n toasts = idx >= 0 ? toasts.map((t) => (t.id === id ? record : t)) : [...toasts, record];\n emit();\n return id;\n}\n\nfunction remove(id: string) {\n toasts = toasts.filter((t) => t.id !== id);\n emit();\n}\n\nfunction clear() {\n toasts = [];\n emit();\n}\n\nexport const toastStore = {\n add,\n remove,\n clear,\n subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getSnapshot: () => toasts,\n getServerSnapshot: () => EMPTY,\n};\n\n/** ํ์ฌ ํ ์คํธ ๋ชฉ๋ก์ ๊ตฌ๋
(Toaster ๋ด๋ถ ์ ์ฉ). */\nexport function useToasts(): ToastRecord[] {\n return useSyncExternalStore(\n toastStore.subscribe,\n toastStore.getSnapshot,\n toastStore.getServerSnapshot,\n );\n}\n","import type { ReactNode } from 'react';\nimport type { ToastTone } from './store.js';\n\n// 16px, currentColor โ ์์ .nuri-toast--{tone}์ด ํค ํ ํฐ์ผ๋ก ์ง์ .\nconst CheckIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M3.5 8.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ErrorIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 4v4.5\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.3\" r=\"0.95\" fill=\"currentColor\" />\n </svg>\n);\n\nconst InfoIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 7.5v4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"4.7\" r=\"0.95\" fill=\"currentColor\" />\n </svg>\n);\n\n/** default ํค์ ์์ด์ฝ ์์. */\nexport const toneIcon: Record<Exclude<ToastTone, 'default'>, ReactNode> = {\n success: <CheckIcon />,\n error: <ErrorIcon />,\n info: <InfoIcon />,\n};\n","import type { ReactNode } from 'react';\nimport { toastStore } from './store.js';\nimport type { ToastOptions } from './store.js';\n\ntype ToneOptions = Omit<ToastOptions, 'tone'>;\n\n/**\n * ํ ์คํธ๋ฅผ ๋์ด๋ค. React ๋ฐ ๋ชจ๋ ํจ์๋ผ ์ปดํฌ๋ํธยท์ด๋ฒคํธ ํธ๋ค๋ฌยทAPI ๋ ์ด์ด ๋ฑ\n * **์ด๋์๋** ํธ์ถ ๊ฐ๋ฅ. ํ๋ฉด ๋ ๋๋ ์ฑ ๋ฃจํธ์ 1ํ ๋ง์ดํธํ `<Toaster/>`๊ฐ ๋ด๋นํ๋ค.\n *\n * @returns ํ ์คํธ id (์๋ dismiss์ ์ฌ์ฉ)\n * @example\n * toast.success('์ ์ฅ๋์ต๋๋ค');\n * const id = toast.error('์ค๋ฅ', { duration: 5000 });\n * toast.dismiss(id);\n */\nfunction toastFn(message: ReactNode, options?: ToastOptions): string {\n return toastStore.add(message, options);\n}\n\nexport const toast = Object.assign(toastFn, {\n success: (message: ReactNode, options?: ToneOptions) =>\n toastStore.add(message, { ...options, tone: 'success' }),\n error: (message: ReactNode, options?: ToneOptions) =>\n toastStore.add(message, { ...options, tone: 'error' }),\n info: (message: ReactNode, options?: ToneOptions) =>\n toastStore.add(message, { ...options, tone: 'info' }),\n /** id ์ง์ ์ ํด๋น ํ ์คํธ๋ง, ์์ผ๋ฉด ์ ์ฒด ์ ๊ฑฐ. */\n dismiss: (id?: string) => (id ? toastStore.remove(id) : toastStore.clear()),\n});\n","'use client';\n\nimport './styles.css';\nimport * as RadixTooltip from '@radix-ui/react-tooltip';\nimport { createContext, useContext } from 'react';\nimport type { ReactElement, ReactNode } from 'react';\nimport { cx } from '../utils/cx.js';\n\ntype Side = 'top' | 'bottom' | 'left' | 'right';\ntype Align = 'start' | 'center' | 'end';\n\nexport interface TooltipProps {\n /** ํดํ ๋ด์ฉ. */\n content: ReactNode;\n /** ํธ๋ฆฌ๊ฑฐ โ ๋จ์ผ ์๋ฆฌ๋จผํธ์ asChild๋ก ์์ (Button, ์์ด์ฝ ๋ฒํผ ๋ฑ). */\n children: ReactElement;\n /**\n * ํดํ์ด ๋จ๋ ๋ฐฉํฅ. (๋์์ธ์ Direction์ ๊ผฌ๋ฆฌ ๋ฐฉํฅ ๊ธฐ์ค์ด๋ผ ๋ฐ๋ โ\n * ์: ๋์์ธ Direction=Bottom โ side=\"top\")\n * ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๋์ชฝ์ผ๋ก ๋ฐ์ ๋๋ค.\n * @default 'top'\n */\n side?: Side;\n /** ํธ๋ฆฌ๊ฑฐ ๊ธฐ์ค ์ ๋ ฌ. @default 'center' */\n align?: Align;\n /** ๊ผฌ๋ฆฌ(ํ์ดํ) ํ์ ์ฌ๋ถ โ ๋์์ธ์ showTail. @default true */\n arrow?: boolean;\n /**\n * ์ด๋ฆผ ์ง์ฐ ms. ๋ฏธ์ง์ ์ โ ๋จ๋
์ฌ์ฉ์ 100ms(๊ฑฐ์ ์ฆ์, ์ค์ณ ์ง๋๊ฐ ๋ ๊น๋นก์๋ง ๋ฐฉ์ง),\n * TooltipProvider ์์์๋ ํ๋ก๋ฐ์ด๋ ์ค์ ์ ๋ฐ๋ฆ. 0์ด๋ฉด ์ฆ์.\n * ํค๋ณด๋ ํฌ์ปค์ค๋ ์ง์ฐ ์์ด ํญ์ ์ฆ์ ํ์๋๋ค.\n */\n delayDuration?: number;\n /** ์ด๋ฆผ ์ํ ์ ์ด โ ํญ์ ํ์(์ฝ์น๋งํฌ๋ฅ)๋ ์๋ ์ ์ด์ ์ฌ์ฉ. */\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** true๋ฉด ํดํ ์์ด ํธ๋ฆฌ๊ฑฐ๋ง ๋ ๋ (์กฐ๊ฑด๋ถ ํดํ). @default false */\n disabled?: boolean;\n /** ํฌํธ ๋ ๋ ๋์. ๊ธฐ๋ณธ document.body. */\n container?: HTMLElement | null;\n /** ํดํ ํจ๋์ ์ถ๊ฐํ className. */\n className?: string;\n}\n\n// TooltipProvider ์กด์ฌ ๊ฐ์ง์ฉ โ ์์ผ๋ฉด Tooltip์ด ์์ฒด Provider๋ก ๊ฐ์ผ๋ค(์ ๋ก ์
์
).\nconst HasProviderContext = createContext(false);\n\nexport type TooltipProviderProps = RadixTooltip.TooltipProviderProps;\n\n/**\n * ์ง์ฐ ์๊ฐ์ ๊ณต์ ํ๋ ํ๋ก๋ฐ์ด๋ (์ ํ). ์ฑ ๋ฃจํธ์ 1ํ ๋๋ฉด ํดํ ํ๋๋ฅผ ๋ณธ ์งํ\n * ์ธ์ ํธ๋ฆฌ๊ฑฐ๋ก ์ด๋ํ ๋ ์ง์ฐ ์์ด ๋ฐ๋ก ํ์๋๋ค(skipDelayDuration).\n * ์์ด๋ Tooltip์ ๋จ๋
์ผ๋ก ๋์ํ๋ค.\n *\n * @example\n * <TooltipProvider delayDuration={300}><App /></TooltipProvider>\n */\nexport function TooltipProvider({ children, ...props }: TooltipProviderProps) {\n return (\n <HasProviderContext.Provider value={true}>\n <RadixTooltip.Provider {...props}>{children}</RadixTooltip.Provider>\n </HasProviderContext.Provider>\n );\n}\n\n/**\n * ํดํ. Radix Tooltip ๊ธฐ๋ฐ โ hover์ **ํค๋ณด๋ ํฌ์ปค์ค** ๋ชจ๋์์ ์ด๋ฆฌ๊ณ ,\n * Esc๋ก ๋ซํ๋ฉฐ, `aria-describedby`๊ฐ ์๋ ์ฐ๊ฒฐ๋๋ค. ํฌํธ + ์ถฉ๋ ๊ฐ์ง\n * ํฌ์ง์
๋์ด๋ผ ๋ถ๋ชจ overflow์ ์๋ฆฌ์ง ์๊ณ ํ๋ฉด ๋ฐ์ผ๋ก ๋๊ฐ์ง ์๋๋ค.\n *\n * ํฐ์น ๊ธฐ๊ธฐ์์๋ ํ์๋์ง ์๋๋ค(hover ๊ฐ๋
๋ถ์ฌ โ Radix ๊ธฐ๋ณธ ๋์).\n * ๋ซ๊ธฐ ๋ฒํผ์ด ์๋ ์ง์ํ ์๋ด(์ฝ์น๋งํฌ)๋ ํดํ ๋ฒ์๊ฐ ์๋๋ค.\n *\n * @example\n * <Tooltip content=\"์ฆ๊ฒจ์ฐพ๊ธฐ์ ์ถ๊ฐ\">\n * <Button iconOnly aria-label=\"์ฆ๊ฒจ์ฐพ๊ธฐ\">โ
</Button>\n * </Tooltip>\n */\nexport function Tooltip({\n content,\n children,\n side = 'top',\n align = 'center',\n arrow = true,\n delayDuration,\n open,\n defaultOpen,\n onOpenChange,\n disabled = false,\n container,\n className,\n}: TooltipProps) {\n const hasProvider = useContext(HasProviderContext);\n\n if (disabled) return children;\n\n const root = (\n <RadixTooltip.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n delayDuration={delayDuration}\n >\n <RadixTooltip.Trigger asChild>{children}</RadixTooltip.Trigger>\n <RadixTooltip.Portal container={container}>\n <RadixTooltip.Content\n className={cx('nuri-tooltip', className)}\n side={side}\n align={align}\n sideOffset={4}\n collisionPadding={8}\n arrowPadding={6}\n // ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ทฐํฌํธ/์คํฌ๋กค ์์ญ์์ ์์ ํ ์ฌ๋ผ์ง๋ฉด ํดํ๋ ์จ๊น\n // (๊ธฐ์ค ์์ ์์ด ํดํ๋ง ๋ ์๋ ํ์ ๋ฐฉ์ง)\n hideWhenDetached\n >\n {content}\n {arrow && <RadixTooltip.Arrow className=\"nuri-tooltip__arrow\" width={14} height={7} />}\n </RadixTooltip.Content>\n </RadixTooltip.Portal>\n </RadixTooltip.Root>\n );\n\n // ์ฑ์ TooltipProvider๊ฐ ์์ด๋ ๋์ํ๋๋ก ์์ฒด Provider๋ก ํด๋ฐฑ.\n // ์ฑ Provider๊ฐ ์์ผ๋ฉด ๊ฐ์ธ์ง ์๋๋ค โ ์์ชฝ ์ปจํ
์คํธ๊ฐ ์ด๊ธฐ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ ๊ฐ์ธ๋ฉด\n // ์ฑ์ด ์ค์ ํ delayDurationยทskipDelayDuration์ด ๋ฌด์๋๋ค.\n // ํด๋ฐฑ ์ง์ฐ 100ms โ ๊ฑฐ์ ์ฆ์๋ก ๋๊ปด์ง๋, ๋ง์ฐ์ค๊ฐ ์ค์ณ ์ง๋๊ฐ ๋ ์ฐ์ ๊น๋นก์์ ๋ฐฉ์ง\n // (๋ฒํผ ํ๋๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ ๋ฐ ~30โ50ms โ ๊ทธ๋ณด๋ค ๊ธธ๊ฒ ๋จธ๋ฌธ ๊ฒฝ์ฐ๋ง ์๋๋ก ํ์ ).\n return hasProvider ? (\n root\n ) : (\n <RadixTooltip.Provider delayDuration={100}>{root}</RadixTooltip.Provider>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","Button","import_styles","import_react","import_jsx_runtime","Input","import_styles","import_react","import_jsx_runtime","Textarea","import_styles","import_react","import_jsx_runtime","Checkbox","import_styles","import_react","import_jsx_runtime","RadioGroup","Radio","import_styles","import_react","import_jsx_runtime","Switch","import_styles","import_react","import_jsx_runtime","Select","import_styles","import_react","import_jsx_runtime","Root","Trigger","Content","Title","Description","Close","import_styles","import_react","import_jsx_runtime","import_jsx_runtime","Root","Trigger","Content","Header","Title","Description","Body","Footer","Action","Cancel","CloseIcon","CloseButton","import_styles","import_react","import_jsx_runtime","CheckIcon","InfoIcon","import_jsx_runtime","toasts","import_styles","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["/Users/summerhoony/Desktop/projects/nuri-ui/dist/index.cjs"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ioBAAC","file":"/Users/summerhoony/Desktop/projects/nuri-ui/dist/index.cjs"}
|