@loword/loword-design-system 0.0.1
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/README.md +20 -0
- package/dist/components/Avatar/Avatar.d.ts +11 -0
- package/dist/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar/Avatar.js +24 -0
- package/dist/components/Avatar/AvatarBase.d.ts +32 -0
- package/dist/components/Avatar/AvatarBase.d.ts.map +1 -0
- package/dist/components/Avatar/AvatarBase.js +49 -0
- package/dist/components/Badge/Badge.d.ts +25 -0
- package/dist/components/Badge/Badge.d.ts.map +1 -0
- package/dist/components/Badge/Badge.js +36 -0
- package/dist/components/Badge/BadgeBase.d.ts +10 -0
- package/dist/components/Badge/BadgeBase.d.ts.map +1 -0
- package/dist/components/Badge/BadgeBase.js +9 -0
- package/dist/components/Button/Button.d.ts +26 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/Button.js +102 -0
- package/dist/components/Button/ButtonBase.d.ts +5 -0
- package/dist/components/Button/ButtonBase.d.ts.map +1 -0
- package/dist/components/Button/ButtonBase.js +10 -0
- package/dist/components/Button/ButtonSpinner.d.ts +9 -0
- package/dist/components/Button/ButtonSpinner.d.ts.map +1 -0
- package/dist/components/Button/ButtonSpinner.js +14 -0
- package/dist/components/Calendar/Calendar.d.ts +16 -0
- package/dist/components/Calendar/Calendar.d.ts.map +1 -0
- package/dist/components/Calendar/Calendar.js +75 -0
- package/dist/components/Carousel/Carousel.d.ts +50 -0
- package/dist/components/Carousel/Carousel.d.ts.map +1 -0
- package/dist/components/Carousel/Carousel.js +22 -0
- package/dist/components/Carousel/CarouselBase.d.ts +98 -0
- package/dist/components/Carousel/CarouselBase.d.ts.map +1 -0
- package/dist/components/Carousel/CarouselBase.js +144 -0
- package/dist/components/Checkbox/Checkbox.d.ts +27 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +30 -0
- package/dist/components/Checkbox/CheckboxBase.d.ts +40 -0
- package/dist/components/Checkbox/CheckboxBase.d.ts.map +1 -0
- package/dist/components/Checkbox/CheckboxBase.js +57 -0
- package/dist/components/Checkbox/CheckboxGroup.d.ts +22 -0
- package/dist/components/Checkbox/CheckboxGroup.d.ts.map +1 -0
- package/dist/components/Checkbox/CheckboxGroup.js +13 -0
- package/dist/components/Checkbox/FormCheckbox.d.ts +14 -0
- package/dist/components/Checkbox/FormCheckbox.d.ts.map +1 -0
- package/dist/components/Checkbox/FormCheckbox.js +9 -0
- package/dist/components/Checkbox/FormCheckboxGroup.d.ts +13 -0
- package/dist/components/Checkbox/FormCheckboxGroup.d.ts.map +1 -0
- package/dist/components/Checkbox/FormCheckboxGroup.js +9 -0
- package/dist/components/DataCalendar/DataCalendar.d.ts +12 -0
- package/dist/components/DataCalendar/DataCalendar.d.ts.map +1 -0
- package/dist/components/DataCalendar/DataCalendar.js +13 -0
- package/dist/components/DataCalendar/DataCalendarBase.d.ts +45 -0
- package/dist/components/DataCalendar/DataCalendarBase.d.ts.map +1 -0
- package/dist/components/DataCalendar/DataCalendarBase.js +57 -0
- package/dist/components/DatePicker/DatePicker.d.ts +34 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.js +44 -0
- package/dist/components/DatePicker/FormDatePicker.d.ts +12 -0
- package/dist/components/DatePicker/FormDatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/FormDatePicker.js +12 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +49 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.js +197 -0
- package/dist/components/DateRangePicker/FormDateRangePicker.d.ts +12 -0
- package/dist/components/DateRangePicker/FormDateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker/FormDateRangePicker.js +10 -0
- package/dist/components/Drawer/Drawer.d.ts +51 -0
- package/dist/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.js +30 -0
- package/dist/components/Drawer/DrawerBase.d.ts +52 -0
- package/dist/components/Drawer/DrawerBase.d.ts.map +1 -0
- package/dist/components/Drawer/DrawerBase.js +38 -0
- package/dist/components/Editor/Editor.d.ts +12 -0
- package/dist/components/Editor/Editor.d.ts.map +1 -0
- package/dist/components/Editor/Editor.js +162 -0
- package/dist/components/Editor/EditorBase.d.ts +52 -0
- package/dist/components/Editor/EditorBase.d.ts.map +1 -0
- package/dist/components/Editor/EditorBase.js +89 -0
- package/dist/components/Editor/Viewer.d.ts +7 -0
- package/dist/components/Editor/Viewer.d.ts.map +1 -0
- package/dist/components/Editor/Viewer.js +9 -0
- package/dist/components/Editor/extensions.d.ts +6 -0
- package/dist/components/Editor/extensions.d.ts.map +1 -0
- package/dist/components/Editor/extensions.js +38 -0
- package/dist/components/FileUpload/FileUploadBase.d.ts +50 -0
- package/dist/components/FileUpload/FileUploadBase.d.ts.map +1 -0
- package/dist/components/FileUpload/FileUploadBase.js +102 -0
- package/dist/components/Form/Form.d.ts +21 -0
- package/dist/components/Form/Form.d.ts.map +1 -0
- package/dist/components/Form/Form.js +18 -0
- package/dist/components/Form/FormErrorMessage.d.ts +9 -0
- package/dist/components/Form/FormErrorMessage.d.ts.map +1 -0
- package/dist/components/Form/FormErrorMessage.js +6 -0
- package/dist/components/Form/FormField.d.ts +55 -0
- package/dist/components/Form/FormField.d.ts.map +1 -0
- package/dist/components/Form/FormField.js +43 -0
- package/dist/components/Icon/LucideIcon.d.ts +11 -0
- package/dist/components/Icon/LucideIcon.d.ts.map +1 -0
- package/dist/components/Icon/LucideIcon.js +41 -0
- package/dist/components/Input/FormInput.d.ts +15 -0
- package/dist/components/Input/FormInput.d.ts.map +1 -0
- package/dist/components/Input/FormInput.js +19 -0
- package/dist/components/Input/Input.d.ts +24 -0
- package/dist/components/Input/Input.d.ts.map +1 -0
- package/dist/components/Input/Input.js +71 -0
- package/dist/components/Input/InputBase.d.ts +22 -0
- package/dist/components/Input/InputBase.d.ts.map +1 -0
- package/dist/components/Input/InputBase.js +17 -0
- package/dist/components/LNB/LNBBase.d.ts +82 -0
- package/dist/components/LNB/LNBBase.d.ts.map +1 -0
- package/dist/components/LNB/LNBBase.js +108 -0
- package/dist/components/LoadingDots/LoadingDots.d.ts +8 -0
- package/dist/components/LoadingDots/LoadingDots.d.ts.map +1 -0
- package/dist/components/LoadingDots/LoadingDots.js +29 -0
- package/dist/components/MenuBar/MenuBar.d.ts +21 -0
- package/dist/components/MenuBar/MenuBar.d.ts.map +1 -0
- package/dist/components/MenuBar/MenuBar.js +33 -0
- package/dist/components/MenuBar/MenuBarBase.d.ts +43 -0
- package/dist/components/MenuBar/MenuBarBase.d.ts.map +1 -0
- package/dist/components/MenuBar/MenuBarBase.js +69 -0
- package/dist/components/Modal/Modal.d.ts +51 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -0
- package/dist/components/Modal/Modal.js +72 -0
- package/dist/components/Modal/ModalBase.d.ts +42 -0
- package/dist/components/Modal/ModalBase.d.ts.map +1 -0
- package/dist/components/Modal/ModalBase.js +30 -0
- package/dist/components/Modal/openModal.d.ts +24 -0
- package/dist/components/Modal/openModal.d.ts.map +1 -0
- package/dist/components/Modal/openModal.js +52 -0
- package/dist/components/OTPInput/OTPInput.d.ts +46 -0
- package/dist/components/OTPInput/OTPInput.d.ts.map +1 -0
- package/dist/components/OTPInput/OTPInput.js +87 -0
- package/dist/components/Pagination/Pagination.d.ts +12 -0
- package/dist/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.js +5 -0
- package/dist/components/Pagination/PaginationBase.d.ts +36 -0
- package/dist/components/Pagination/PaginationBase.d.ts.map +1 -0
- package/dist/components/Pagination/PaginationBase.js +44 -0
- package/dist/components/Pagination/paginationUtils.d.ts +2 -0
- package/dist/components/Pagination/paginationUtils.d.ts.map +1 -0
- package/dist/components/Pagination/paginationUtils.js +18 -0
- package/dist/components/Popover/Popover.d.ts +42 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/Popover.js +31 -0
- package/dist/components/Popover/PopoverBase.d.ts +31 -0
- package/dist/components/Popover/PopoverBase.d.ts.map +1 -0
- package/dist/components/Popover/PopoverBase.js +18 -0
- package/dist/components/Radio/FormRadioGroup.d.ts +13 -0
- package/dist/components/Radio/FormRadioGroup.d.ts.map +1 -0
- package/dist/components/Radio/FormRadioGroup.js +9 -0
- package/dist/components/Radio/Radio.d.ts +24 -0
- package/dist/components/Radio/Radio.d.ts.map +1 -0
- package/dist/components/Radio/Radio.js +39 -0
- package/dist/components/Radio/RadioBase.d.ts +38 -0
- package/dist/components/Radio/RadioBase.d.ts.map +1 -0
- package/dist/components/Radio/RadioBase.js +46 -0
- package/dist/components/Radio/RadioGroup.d.ts +22 -0
- package/dist/components/Radio/RadioGroup.d.ts.map +1 -0
- package/dist/components/Radio/RadioGroup.js +7 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +15 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.js +10 -0
- package/dist/components/Select/FormMultiSelect.d.ts +13 -0
- package/dist/components/Select/FormMultiSelect.d.ts.map +1 -0
- package/dist/components/Select/FormMultiSelect.js +14 -0
- package/dist/components/Select/FormSelect.d.ts +13 -0
- package/dist/components/Select/FormSelect.d.ts.map +1 -0
- package/dist/components/Select/FormSelect.js +10 -0
- package/dist/components/Select/MultiSelect.d.ts +31 -0
- package/dist/components/Select/MultiSelect.d.ts.map +1 -0
- package/dist/components/Select/MultiSelect.js +59 -0
- package/dist/components/Select/Select.d.ts +41 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.js +55 -0
- package/dist/components/Select/SelectBase.d.ts +59 -0
- package/dist/components/Select/SelectBase.d.ts.map +1 -0
- package/dist/components/Select/SelectBase.js +211 -0
- package/dist/components/Skeleton/Skeleton.d.ts +10 -0
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.js +8 -0
- package/dist/components/Slider/Slider.d.ts +23 -0
- package/dist/components/Slider/Slider.d.ts.map +1 -0
- package/dist/components/Slider/Slider.js +195 -0
- package/dist/components/Spinner/Spinner.d.ts +25 -0
- package/dist/components/Spinner/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner/Spinner.js +20 -0
- package/dist/components/Table/Table.d.ts +34 -0
- package/dist/components/Table/Table.d.ts.map +1 -0
- package/dist/components/Table/Table.js +29 -0
- package/dist/components/Table/TableBase.d.ts +37 -0
- package/dist/components/Table/TableBase.d.ts.map +1 -0
- package/dist/components/Table/TableBase.js +39 -0
- package/dist/components/Table/TableField.d.ts +64 -0
- package/dist/components/Table/TableField.d.ts.map +1 -0
- package/dist/components/Table/TableField.js +87 -0
- package/dist/components/Table/TanstackTable.d.ts +23 -0
- package/dist/components/Table/TanstackTable.d.ts.map +1 -0
- package/dist/components/Table/TanstackTable.js +35 -0
- package/dist/components/TimePicker/FormTimePicker.d.ts +12 -0
- package/dist/components/TimePicker/FormTimePicker.d.ts.map +1 -0
- package/dist/components/TimePicker/FormTimePicker.js +12 -0
- package/dist/components/TimePicker/TimePicker.d.ts +27 -0
- package/dist/components/TimePicker/TimePicker.d.ts.map +1 -0
- package/dist/components/TimePicker/TimePicker.js +120 -0
- package/dist/components/Toast/Toast.d.ts +18 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -0
- package/dist/components/Toast/Toast.js +42 -0
- package/dist/components/Toast/Toaster.d.ts +7 -0
- package/dist/components/Toast/Toaster.d.ts.map +1 -0
- package/dist/components/Toast/Toaster.js +7 -0
- package/dist/components/ToggleButton/FormToggleButton.d.ts +12 -0
- package/dist/components/ToggleButton/FormToggleButton.d.ts.map +1 -0
- package/dist/components/ToggleButton/FormToggleButton.js +9 -0
- package/dist/components/ToggleButton/ToggleButton.d.ts +31 -0
- package/dist/components/ToggleButton/ToggleButton.d.ts.map +1 -0
- package/dist/components/ToggleButton/ToggleButton.js +42 -0
- package/dist/components/ToggleButton/ToggleButtonBase.d.ts +41 -0
- package/dist/components/ToggleButton/ToggleButtonBase.d.ts.map +1 -0
- package/dist/components/ToggleButton/ToggleButtonBase.js +59 -0
- package/dist/components/Tooltip/Tooltip.d.ts +18 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +13 -0
- package/dist/components/Tooltip/TooltipBase.d.ts +39 -0
- package/dist/components/Tooltip/TooltipBase.d.ts.map +1 -0
- package/dist/components/Tooltip/TooltipBase.js +46 -0
- package/dist/constants/file.d.ts +42 -0
- package/dist/constants/file.d.ts.map +1 -0
- package/dist/constants/file.js +47 -0
- package/dist/index.css +4061 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/types/polymorphic.d.ts +19 -0
- package/dist/types/polymorphic.d.ts.map +1 -0
- package/dist/types/polymorphic.js +1 -0
- package/dist/utils/cn.d.ts +4 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +6 -0
- package/dist/utils/file.d.ts +16 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +58 -0
- package/dist/utils/renderIcon.d.ts +4 -0
- package/dist/utils/renderIcon.d.ts.map +1 -0
- package/dist/utils/renderIcon.js +11 -0
- package/dist/utils/utils.d.ts +2 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +5 -0
- package/package.json +239 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface FormErrorMessageProps {
|
|
2
|
+
id?: string;
|
|
3
|
+
error: string;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const FormErrorMessage: ({ id, error, disabled, className, }: FormErrorMessageProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default FormErrorMessage;
|
|
9
|
+
//# sourceMappingURL=FormErrorMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/Form/FormErrorMessage.tsx"],"names":[],"mappings":"AAEA,UAAU,qBAAqB;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,qCAKvB,qBAAqB,4CAcvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import cn from '../../utils/cn.js';
|
|
3
|
+
const FormErrorMessage = ({ id, error, disabled = false, className, }) => {
|
|
4
|
+
return (_jsx("div", { id: id, role: "alert", className: cn('text-red500 display12 bold absolute bottom-1 right-2', error && !disabled ? 'error-show' : 'error-hide', className), children: error && `*${error}` }));
|
|
5
|
+
};
|
|
6
|
+
export default FormErrorMessage;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ReactNode, type Ref } from 'react';
|
|
2
|
+
import { type RegisterOptions } from 'react-hook-form';
|
|
3
|
+
interface FieldState {
|
|
4
|
+
error: string;
|
|
5
|
+
hasError: boolean;
|
|
6
|
+
errorId?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* FormField의 render prop에 전달되는 인자 타입.
|
|
10
|
+
*
|
|
11
|
+
* @template TValue - 폼 필드의 값 타입. string, string[], boolean 등 다양한 타입을
|
|
12
|
+
* 지원하기 위해 기본값이 any인 제네릭으로 선언됨.
|
|
13
|
+
* 사용처에서 `<FormField<string>>` 와 같이 구체화할 수 있음.
|
|
14
|
+
*/
|
|
15
|
+
interface FormFieldRenderProps<TValue = any> {
|
|
16
|
+
field: {
|
|
17
|
+
name: string;
|
|
18
|
+
value: TValue;
|
|
19
|
+
/**
|
|
20
|
+
* react-hook-form의 controllerField.ref와 외부 ref를 합친 콜백 ref.
|
|
21
|
+
* Input, Select 등 다양한 DOM 요소에 연결되므로 element 타입을 any로 받음.
|
|
22
|
+
*/
|
|
23
|
+
ref: (element: any) => void;
|
|
24
|
+
/**
|
|
25
|
+
* react-hook-form 내부에서 `(...event: any[]) => void` 로 정의된 시그니처를 그대로 따름.
|
|
26
|
+
* 임의로 좁히면 라이브러리 타입과 충돌이 발생함.
|
|
27
|
+
*/
|
|
28
|
+
onChange: (...event: any[]) => void;
|
|
29
|
+
onBlur: () => void;
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
/** 에러 발생 시 true, 정상 시 false */
|
|
32
|
+
'aria-invalid'?: boolean | 'true' | 'false';
|
|
33
|
+
/** 에러 메시지 요소의 id와 연결되어 스크린 리더에서 에러를 읽을 수 있게 함 */
|
|
34
|
+
'aria-describedby'?: string;
|
|
35
|
+
};
|
|
36
|
+
fieldState: FieldState;
|
|
37
|
+
resetField: (options?: {
|
|
38
|
+
defaultValue?: TValue;
|
|
39
|
+
}) => void;
|
|
40
|
+
}
|
|
41
|
+
interface FormFieldProps<TValue = any> {
|
|
42
|
+
name: string;
|
|
43
|
+
options?: RegisterOptions;
|
|
44
|
+
customErrorMessage?: string;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Input, Select 등 다양한 컴포넌트의 ref를 받아야 하므로 Ref<any>로 선언.
|
|
48
|
+
* (HTMLInputElement, HTMLButtonElement 등 요소 타입이 사용처마다 다름)
|
|
49
|
+
*/
|
|
50
|
+
ref?: Ref<any>;
|
|
51
|
+
children: (props: FormFieldRenderProps<TValue>) => ReactNode;
|
|
52
|
+
}
|
|
53
|
+
declare const FormField: <TValue = any>({ name, options, customErrorMessage, disabled, ref, children, }: FormFieldProps<TValue>) => ReactNode;
|
|
54
|
+
export default FormField;
|
|
55
|
+
//# sourceMappingURL=FormField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../../src/components/Form/FormField.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,UAAU,oBAAoB,CAAC,MAAM,GAAG,GAAG;IACzC,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;QAC5B;;;WAGG;QACH,QAAQ,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QACpC,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,+BAA+B;QAC/B,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QAC5C,iDAAiD;QACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC3D;AAED,UAAU,cAAc,CAAC,MAAM,GAAG,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;CAC9D;AAED,QAAA,MAAM,SAAS,GAAI,MAAM,GAAG,GAAG,EAAG,iEAO/B,cAAc,CAAC,MAAM,CAAC,cAyCxB,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useController, useFormContext, } from 'react-hook-form';
|
|
3
|
+
const FormField = ({ name, options, customErrorMessage = '', disabled, ref, children, }) => {
|
|
4
|
+
const { resetField } = useFormContext();
|
|
5
|
+
const { field: controllerField, fieldState } = useController({
|
|
6
|
+
name,
|
|
7
|
+
rules: options,
|
|
8
|
+
});
|
|
9
|
+
const errorMessage = customErrorMessage || fieldState.error?.message || '';
|
|
10
|
+
// 에러 메시지 요소의 id. aria-describedby와 FormErrorMessage의 id로 함께 사용됨.
|
|
11
|
+
const errorId = `${name}-error`;
|
|
12
|
+
/**
|
|
13
|
+
* react-hook-form의 ref와 외부에서 전달된 ref를 하나의 콜백 ref로 합성.
|
|
14
|
+
* ref 타입이 함수형과 객체형(RefObject) 두 가지를 모두 지원함.
|
|
15
|
+
*/
|
|
16
|
+
const combinedRef = (element) => {
|
|
17
|
+
controllerField.ref(element);
|
|
18
|
+
if (ref) {
|
|
19
|
+
if (typeof ref === 'function') {
|
|
20
|
+
ref(element);
|
|
21
|
+
}
|
|
22
|
+
else if (ref && typeof ref === 'object' && 'current' in ref) {
|
|
23
|
+
ref.current = element;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return children({
|
|
28
|
+
field: {
|
|
29
|
+
...controllerField,
|
|
30
|
+
ref: combinedRef,
|
|
31
|
+
disabled,
|
|
32
|
+
'aria-invalid': !!errorMessage,
|
|
33
|
+
'aria-describedby': errorMessage ? errorId : undefined,
|
|
34
|
+
},
|
|
35
|
+
fieldState: {
|
|
36
|
+
error: errorMessage,
|
|
37
|
+
hasError: !!errorMessage,
|
|
38
|
+
errorId,
|
|
39
|
+
},
|
|
40
|
+
resetField: (opts) => resetField(name, opts),
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
export default FormField;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type LucideIcon as LucideIconType } from 'lucide-react';
|
|
2
|
+
declare const LUCIDE_ICONS: Record<string, LucideIconType>;
|
|
3
|
+
export type IconName = keyof typeof LUCIDE_ICONS;
|
|
4
|
+
interface ILucideIconProps {
|
|
5
|
+
name: IconName;
|
|
6
|
+
className?: string;
|
|
7
|
+
size?: number;
|
|
8
|
+
}
|
|
9
|
+
declare const LucideIcon: ({ name, className, size }: ILucideIconProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export default LucideIcon;
|
|
11
|
+
//# sourceMappingURL=LucideIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LucideIcon.d.ts","sourceRoot":"","sources":["../../../src/components/Icon/LucideIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,EA0BL,KAAK,UAAU,IAAI,cAAc,EAKlC,MAAM,cAAc,CAAC;AAEtB,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA8BhD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,YAAY,CAAC;AAEjD,UAAU,gBAAgB;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,QAAA,MAAM,UAAU,GAAI,2BAA2B,gBAAgB,mDAQ9D,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowLeft, ArrowRight, Check, ChevronLeft, ChevronRight, ChevronDown, ChevronUp, Copy, Ellipsis, Pencil, Plus, Search, Trash, Trash2, X, ArrowUpRight, Wand, CloudDownload, Calendar, RefreshCw, Settings, RotateCw, Clock, EyeClosed, Minus, Eye, EyeOff, CircleAlert, EllipsisVertical, } from 'lucide-react';
|
|
3
|
+
const LUCIDE_ICONS = {
|
|
4
|
+
arrowLeft: ArrowLeft,
|
|
5
|
+
arrowRight: ArrowRight,
|
|
6
|
+
check: Check,
|
|
7
|
+
chevronLeft: ChevronLeft,
|
|
8
|
+
chevronRight: ChevronRight,
|
|
9
|
+
chevronDown: ChevronDown,
|
|
10
|
+
chevronUp: ChevronUp,
|
|
11
|
+
copy: Copy,
|
|
12
|
+
ellipsis: Ellipsis,
|
|
13
|
+
pencil: Pencil,
|
|
14
|
+
plus: Plus,
|
|
15
|
+
search: Search,
|
|
16
|
+
trash: Trash,
|
|
17
|
+
trash2: Trash2,
|
|
18
|
+
x: X,
|
|
19
|
+
arrowUpRight: ArrowUpRight,
|
|
20
|
+
wand: Wand,
|
|
21
|
+
cloudDownload: CloudDownload,
|
|
22
|
+
calendar: Calendar,
|
|
23
|
+
refreshCw: RefreshCw,
|
|
24
|
+
settings: Settings,
|
|
25
|
+
rotateCw: RotateCw,
|
|
26
|
+
clock: Clock,
|
|
27
|
+
minus: Minus,
|
|
28
|
+
eyeClosed: EyeClosed,
|
|
29
|
+
eye: Eye,
|
|
30
|
+
eyeOff: EyeOff,
|
|
31
|
+
circleAlert: CircleAlert,
|
|
32
|
+
ellipsisVertical: EllipsisVertical,
|
|
33
|
+
};
|
|
34
|
+
const LucideIcon = ({ name, className, size }) => {
|
|
35
|
+
const IconComponent = LUCIDE_ICONS[name];
|
|
36
|
+
if (!IconComponent) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return _jsx(IconComponent, { className: className, size: size });
|
|
40
|
+
};
|
|
41
|
+
export default LucideIcon;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Ref } from 'react';
|
|
2
|
+
import { type RegisterOptions } from 'react-hook-form';
|
|
3
|
+
import { type InputProps } from './Input.js';
|
|
4
|
+
interface FormInputProps extends Omit<InputProps, 'name' | 'color' | 'onChange' | 'value' | 'onBlur'> {
|
|
5
|
+
name: string;
|
|
6
|
+
options?: RegisterOptions;
|
|
7
|
+
ref?: Ref<HTMLInputElement>;
|
|
8
|
+
customErrorMessage?: string;
|
|
9
|
+
isHiddenErrorMessage?: boolean;
|
|
10
|
+
errorClassName?: string;
|
|
11
|
+
showEditIcon?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare const FormInput: ({ name, options, variant, size, block, disabled, ref, customErrorMessage, isHiddenErrorMessage, errorClassName, showEditIcon, rightAddon, ...props }: FormInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export default FormInput;
|
|
15
|
+
//# sourceMappingURL=FormInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormInput.d.ts","sourceRoot":"","sources":["../../../src/components/Input/FormInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAc,EAAE,KAAK,UAAU,EAAa,MAAM,SAAS,CAAC;AAM5D,UAAU,cAAe,SAAQ,IAAI,CACnC,UAAU,EACV,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CACnD;IACC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,SAAS,GAAI,sJAchB,cAAc,4CA6EhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Input, { iconSizes } from './Input.js';
|
|
4
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
+
import FormField from '../Form/FormField.js';
|
|
6
|
+
import FormErrorMessage from '../Form/FormErrorMessage.js';
|
|
7
|
+
import cn from '../../utils/cn.js';
|
|
8
|
+
const FormInput = ({ name, options, variant = 'filled', size = 'small', block = false, disabled = false, ref, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, showEditIcon = false, rightAddon, ...props }) => {
|
|
9
|
+
const iconSize = iconSizes[size ?? 'sm'];
|
|
10
|
+
return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, ref: ref, children: ({ field, fieldState, resetField }) => {
|
|
11
|
+
const editIconAddon = showEditIcon && !disabled ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "group-focus-within:hidden", children: _jsx(LucideIcon, { name: "pencil", size: iconSize }) }), _jsx("button", { type: "button", "aria-label": "\uC785\uB825 \uB0B4\uC6A9 \uCD08\uAE30\uD654", onMouseDown: (e) => {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
resetField({ defaultValue: '' });
|
|
14
|
+
}, className: "hidden group-focus-within:block text-neutral40 cursor-pointer hover:text-lb500 ld-transition", children: _jsx(LucideIcon, { name: "x", size: iconSize }) })] })) : null;
|
|
15
|
+
const combinedAddon = editIconAddon || rightAddon ? (_jsxs(_Fragment, { children: [editIconAddon, rightAddon] })) : undefined;
|
|
16
|
+
return (_jsxs("div", { className: cn('relative border-2 border-transparent', block ? 'w-full' : 'w-auto'), children: [_jsx(Input, { ...props, ...field, value: field.value ?? '', variant: variant, color: fieldState.hasError ? 'danger' : 'neutral', size: size, block: block, rightAddon: combinedAddon, "aria-invalid": fieldState.hasError, "aria-describedby": fieldState.hasError ? fieldState.errorId : undefined }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { id: fieldState.errorId, error: fieldState.error, disabled: disabled, className: cn((showEditIcon || rightAddon) && 'right-8', errorClassName) }))] }));
|
|
17
|
+
} }));
|
|
18
|
+
};
|
|
19
|
+
export default FormInput;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type ReactNode, type Ref } from 'react';
|
|
2
|
+
type InputVariant = 'filled' | 'outline' | 'ghost';
|
|
3
|
+
type InputColor = 'neutral' | 'point' | 'danger';
|
|
4
|
+
type InputSize = 'xSmall' | 'small' | 'medium' | 'large' | 'big' | 'xLarge';
|
|
5
|
+
export declare const iconSizes: Record<InputSize, number>;
|
|
6
|
+
export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'color' | 'size'> {
|
|
7
|
+
/** 입력 필드 스타일 유형 */
|
|
8
|
+
variant?: InputVariant;
|
|
9
|
+
/** 색상 테마 */
|
|
10
|
+
color?: InputColor;
|
|
11
|
+
/** 입력 필드 높이 및 폰트 크기 프리셋 */
|
|
12
|
+
size?: InputSize;
|
|
13
|
+
/** 비밀번호 표시/숨김 토글 버튼 */
|
|
14
|
+
showPasswordToggle?: boolean;
|
|
15
|
+
/** true 시 너비 100% */
|
|
16
|
+
block?: boolean;
|
|
17
|
+
/** 우측 부가 요소 (아이콘 등) */
|
|
18
|
+
rightAddon?: ReactNode;
|
|
19
|
+
/** input 요소 ref */
|
|
20
|
+
ref?: Ref<HTMLInputElement>;
|
|
21
|
+
}
|
|
22
|
+
declare const Input: ({ variant, color, size, showPasswordToggle, block, type, disabled, className, style, rightAddon, ref, ...props }: InputProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export default Input;
|
|
24
|
+
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAMf,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AACnD,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AACjD,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAqD5E,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAO/C,CAAC;AAGF,MAAM,WAAW,UAAW,SAAQ,IAAI,CACtC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,OAAO,GAAG,MAAM,CACjB;IACC,mBAAmB;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,mBAAmB;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAED,QAAA,MAAM,KAAK,GAAI,kHAaZ,UAAU,4CAuEZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, } from 'react';
|
|
3
|
+
import InputBase from './InputBase.js';
|
|
4
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
+
import cn from '../../utils/cn.js';
|
|
6
|
+
// ── 스타일 매핑 ──
|
|
7
|
+
const variantColorClasses = {
|
|
8
|
+
filled: {
|
|
9
|
+
neutral: 'bg-mono100 text-neutral900 outline-2 outline-transparent focus:bg-tintBlue focus:outline-lb500',
|
|
10
|
+
point: 'bg-mono100 text-neutral900 outline-2 outline-transparent focus:bg-tintBlue focus:outline-lb500',
|
|
11
|
+
danger: 'bg-tintRed text-neutral900 outline-2 outline-red500',
|
|
12
|
+
},
|
|
13
|
+
outline: {
|
|
14
|
+
neutral: 'bg-transparent text-neutral900 border border-mono200 focus:border-lb500',
|
|
15
|
+
point: 'bg-transparent text-neutral900 border border-mono200 focus:border-lb500',
|
|
16
|
+
danger: 'bg-transparent text-neutral900 border border-danger100 focus:border-red500',
|
|
17
|
+
},
|
|
18
|
+
ghost: {
|
|
19
|
+
neutral: 'bg-transparent text-neutral900 outline-2 outline-transparent hover:bg-mono50 focus:bg-mono100 focus:outline-lb500',
|
|
20
|
+
point: 'bg-transparent text-neutral900 outline-2 outline-transparent hover:bg-mono50 focus:bg-mono100 focus:outline-lb500',
|
|
21
|
+
danger: 'bg-transparent text-danger500 outline-2 outline-transparent hover:bg-tintRed focus:bg-tintRed focus:outline-red500',
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const disabledVariantClasses = {
|
|
25
|
+
filled: 'bg-mono100 text-mono400',
|
|
26
|
+
outline: 'bg-transparent text-mono400 border border-mono200',
|
|
27
|
+
ghost: 'bg-transparent text-mono400',
|
|
28
|
+
};
|
|
29
|
+
const sizeClasses = {
|
|
30
|
+
xSmall: 'input-2xs',
|
|
31
|
+
small: 'input-xs',
|
|
32
|
+
medium: 'input-sm',
|
|
33
|
+
large: 'input-md',
|
|
34
|
+
big: 'input-lg',
|
|
35
|
+
xLarge: 'input-xl',
|
|
36
|
+
};
|
|
37
|
+
const addonRightPaddingClasses = {
|
|
38
|
+
xSmall: 'pr-8',
|
|
39
|
+
small: 'pr-8',
|
|
40
|
+
medium: 'pr-8',
|
|
41
|
+
large: 'pr-10',
|
|
42
|
+
big: 'pr-11',
|
|
43
|
+
xLarge: 'pr-12',
|
|
44
|
+
};
|
|
45
|
+
export const iconSizes = {
|
|
46
|
+
xSmall: 10,
|
|
47
|
+
small: 12,
|
|
48
|
+
medium: 14,
|
|
49
|
+
large: 16,
|
|
50
|
+
big: 18,
|
|
51
|
+
xLarge: 20,
|
|
52
|
+
};
|
|
53
|
+
const Input = ({ variant, color = 'neutral', size, showPasswordToggle = false, block = false, type = 'text', disabled = false, className, style, rightAddon, ref, ...props }) => {
|
|
54
|
+
const [passwordVisible, setPasswordVisible] = useState(false);
|
|
55
|
+
const resolvedType = showPasswordToggle
|
|
56
|
+
? passwordVisible
|
|
57
|
+
? 'text'
|
|
58
|
+
: 'password'
|
|
59
|
+
: type;
|
|
60
|
+
const iconSize = iconSizes[size ?? 'medium'];
|
|
61
|
+
const passwordToggleAddon = showPasswordToggle ? (_jsx("button", { type: "button", "aria-label": passwordVisible ? '비밀번호 숨기기' : '비밀번호 표시', "aria-pressed": passwordVisible, onClick: () => setPasswordVisible(!passwordVisible), disabled: disabled, className: cn('text-neutral40 ld-transition', disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:text-lb500'), children: _jsx(LucideIcon, { name: passwordVisible ? 'eye' : 'eyeOff', size: iconSize }) })) : null;
|
|
62
|
+
const resolvedRightAddon = rightAddon ?? passwordToggleAddon;
|
|
63
|
+
const { width, height, minWidth, maxWidth, minHeight, maxHeight, ...fieldStyle } = style ?? {};
|
|
64
|
+
const rootStyle = { width, height, minWidth, maxWidth, minHeight, maxHeight };
|
|
65
|
+
const fieldClassName = cn('w-full bold placeholder-mono400 ld-transition outline-none', variant &&
|
|
66
|
+
(disabled
|
|
67
|
+
? disabledVariantClasses[variant]
|
|
68
|
+
: variantColorClasses[variant][color]), size && !height && sizeClasses[size], height && 'h-full', disabled && 'cursor-not-allowed', 'read-only:cursor-not-allowed', resolvedRightAddon && size && addonRightPaddingClasses[size], className);
|
|
69
|
+
return (_jsxs(InputBase.Root, { block: block, style: rootStyle, children: [_jsx(InputBase.Field, { ref: ref, type: resolvedType, disabled: disabled, className: fieldClassName, style: fieldStyle, ...props }), resolvedRightAddon && (_jsx(InputBase.Addon, { position: "right", className: "right-2.5 text-neutral40", children: resolvedRightAddon }))] }));
|
|
70
|
+
};
|
|
71
|
+
export default Input;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type ReactNode, type Ref } from 'react';
|
|
2
|
+
interface RootProps {
|
|
3
|
+
block?: boolean;
|
|
4
|
+
className?: string;
|
|
5
|
+
style?: React.CSSProperties;
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
interface FieldProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
9
|
+
ref?: Ref<HTMLInputElement>;
|
|
10
|
+
}
|
|
11
|
+
interface AddonProps {
|
|
12
|
+
position?: 'left' | 'right';
|
|
13
|
+
className?: string;
|
|
14
|
+
children?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare const InputBase: {
|
|
17
|
+
Root: ({ block, className, style, children }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
Field: ({ ref, ...props }: FieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
Addon: ({ position, className, children }: AddonProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
};
|
|
21
|
+
export default InputBase;
|
|
22
|
+
//# sourceMappingURL=InputBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputBase.d.ts","sourceRoot":"","sources":["../../../src/components/Input/InputBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAI3E,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAcD,UAAU,UAAW,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAChE,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAOD,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAgBD,eAAO,MAAM,SAAS;kDAzCuC,SAAS;+BAgBpC,UAAU;+CAWgB,UAAU;CAkBrE,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import cn from '../../utils/cn.js';
|
|
3
|
+
const Root = ({ block = false, className, style, children }) => {
|
|
4
|
+
return (_jsx("div", { style: style, className: cn('relative flex group', block && 'w-full', className), children: children }));
|
|
5
|
+
};
|
|
6
|
+
const Field = ({ ref, ...props }) => {
|
|
7
|
+
return _jsx("input", { ref: ref, ...props });
|
|
8
|
+
};
|
|
9
|
+
const Addon = ({ position = 'right', className, children }) => {
|
|
10
|
+
return (_jsx("span", { className: cn('absolute top-1/2 -translate-y-1/2 flex items-center', position === 'left' ? 'left-0' : 'right-0', className), children: children }));
|
|
11
|
+
};
|
|
12
|
+
export const InputBase = {
|
|
13
|
+
Root,
|
|
14
|
+
Field,
|
|
15
|
+
Addon,
|
|
16
|
+
};
|
|
17
|
+
export default InputBase;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { ElementType, ReactNode } from 'react';
|
|
2
|
+
export interface INavTab {
|
|
3
|
+
label: string;
|
|
4
|
+
path: string;
|
|
5
|
+
icon?: ReactNode;
|
|
6
|
+
isNotScroll?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface INavItem {
|
|
9
|
+
label: string;
|
|
10
|
+
tabs?: INavTab[];
|
|
11
|
+
noSlider?: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface ProviderProps {
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
isMobile: boolean;
|
|
16
|
+
items?: INavItem[];
|
|
17
|
+
pathname?: string;
|
|
18
|
+
defaultCollapsed?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface RootProps {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
interface TriggerProps {
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
interface HeaderProps {
|
|
28
|
+
name?: string;
|
|
29
|
+
email?: string;
|
|
30
|
+
profileImage?: string | null;
|
|
31
|
+
handleLogout?: () => void;
|
|
32
|
+
}
|
|
33
|
+
interface ContentProps {
|
|
34
|
+
children: ReactNode;
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
interface GroupProps {
|
|
38
|
+
children: ReactNode;
|
|
39
|
+
label?: string;
|
|
40
|
+
noSlider?: boolean;
|
|
41
|
+
}
|
|
42
|
+
interface MenuProps {
|
|
43
|
+
children: ReactNode;
|
|
44
|
+
label?: string;
|
|
45
|
+
noSlider?: boolean;
|
|
46
|
+
tabCount?: number;
|
|
47
|
+
}
|
|
48
|
+
interface MenuItemProps {
|
|
49
|
+
as?: ElementType;
|
|
50
|
+
href: string;
|
|
51
|
+
isActive?: boolean;
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
icon?: ReactNode;
|
|
54
|
+
className?: string;
|
|
55
|
+
[key: string]: unknown;
|
|
56
|
+
}
|
|
57
|
+
interface MenuSubProps {
|
|
58
|
+
children: ReactNode;
|
|
59
|
+
className?: string;
|
|
60
|
+
}
|
|
61
|
+
interface MenuSubItemProps {
|
|
62
|
+
as?: ElementType;
|
|
63
|
+
href: string;
|
|
64
|
+
isActive?: boolean;
|
|
65
|
+
children: ReactNode;
|
|
66
|
+
className?: string;
|
|
67
|
+
[key: string]: unknown;
|
|
68
|
+
}
|
|
69
|
+
declare const LNBBase: {
|
|
70
|
+
Provider: ({ children, isMobile, items, pathname, defaultCollapsed, }: ProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
71
|
+
Root: ({ children, className }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
72
|
+
Trigger: ({ className }: TriggerProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
73
|
+
Header: ({ name, email, profileImage, handleLogout }: HeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
74
|
+
Content: ({ children, className }: ContentProps) => import("react/jsx-runtime").JSX.Element;
|
|
75
|
+
Group: ({ children, label, noSlider }: GroupProps) => import("react/jsx-runtime").JSX.Element;
|
|
76
|
+
Menu: ({ children, label, noSlider, tabCount }: MenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
77
|
+
MenuItem: ({ as: Comp, href, isActive, children, icon, className, ...rest }: MenuItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
78
|
+
MenuSub: ({ children, className }: MenuSubProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
79
|
+
MenuSubItem: ({ as: Comp, href, isActive, children, className, ...rest }: MenuSubItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
80
|
+
};
|
|
81
|
+
export default LNBBase;
|
|
82
|
+
//# sourceMappingURL=LNBBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LNBBase.d.ts","sourceRoot":"","sources":["../../../src/components/LNB/LNBBase.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAapD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0BD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAyDD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2BD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAqCD,UAAU,YAAY;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,UAAU,UAAU;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqCD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6BD,UAAU,aAAa;IACrB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiCD,UAAU,YAAY;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,UAAU,gBAAgB;IACxB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA2BD,QAAA,MAAM,OAAO;2EA/UV,aAAa;oCAsDuB,SAAS;6BA6BhB,YAAY;0DA+BiB,WAAW;uCAwC9B,YAAY;2CAsBR,UAAU;oDA0CG,SAAS;iFA6CjE,aAAa;uCA4B0B,YAAY;8EA0BnD,gBAAgB;CA6BlB,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext, useEffect, useState } from 'react';
|
|
4
|
+
import { ChevronDown, PanelLeftClose, PanelLeftOpen, LogOut, } from 'lucide-react';
|
|
5
|
+
import cn from '../../utils/cn.js';
|
|
6
|
+
import { isActivePath } from '../../utils/utils.js';
|
|
7
|
+
import Avatar from '../Avatar/Avatar.js';
|
|
8
|
+
const LNBContext = createContext(null);
|
|
9
|
+
const useLNBContext = () => {
|
|
10
|
+
const ctx = useContext(LNBContext);
|
|
11
|
+
if (!ctx)
|
|
12
|
+
throw new Error('LNBBase 서브컴포넌트는 LNBBase.Provider 내부에서 사용해야 합니다.');
|
|
13
|
+
return ctx;
|
|
14
|
+
};
|
|
15
|
+
const Provider = ({ children, isMobile, items = [], pathname = '', defaultCollapsed = false, }) => {
|
|
16
|
+
const [collapsed, setCollapsed] = useState(defaultCollapsed);
|
|
17
|
+
const [openGroups, setOpenGroups] = useState([]);
|
|
18
|
+
const toggleCollapsed = () => setCollapsed((prev) => !prev);
|
|
19
|
+
const toggleGroup = (label) => {
|
|
20
|
+
setOpenGroups((prev) => prev.includes(label) ? prev.filter((g) => g !== label) : [...prev, label]);
|
|
21
|
+
};
|
|
22
|
+
const isGroupOpen = (label) => openGroups.includes(label);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!isMobile)
|
|
25
|
+
return;
|
|
26
|
+
if (pathname === '/') {
|
|
27
|
+
setOpenGroups([]);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const matchedLabel = items.find((item) => item.tabs?.some((tab) => isActivePath(pathname, tab.path)))?.label;
|
|
31
|
+
if (matchedLabel && !openGroups.includes(matchedLabel)) {
|
|
32
|
+
setOpenGroups((prev) => [...prev, matchedLabel]);
|
|
33
|
+
}
|
|
34
|
+
// 라우트(pathname) 변경 시에만 그룹 펼침을 동기화하려는 의도이므로 다른 의존성은 제외함.
|
|
35
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
+
}, [pathname]);
|
|
37
|
+
return (_jsx(LNBContext, { value: {
|
|
38
|
+
isMobile,
|
|
39
|
+
collapsed,
|
|
40
|
+
toggleCollapsed,
|
|
41
|
+
openGroups,
|
|
42
|
+
toggleGroup,
|
|
43
|
+
isGroupOpen,
|
|
44
|
+
}, children: children }));
|
|
45
|
+
};
|
|
46
|
+
const Root = ({ children, className }) => {
|
|
47
|
+
const { collapsed } = useLNBContext();
|
|
48
|
+
return (_jsx("div", { className: cn('relative mobile:w-full ld-transition', collapsed ? 'w-[60px]' : 'w-[300px]', className), children: _jsx("div", { className: cn('w-full h-full bg-mono50 mobile:bg-white', 'h-[calc(100vh-64px)] mobile:h-auto mobile:overflow-hidden', 'overflow-y-auto p-sm flex flex-col gap-md mobile:py-0 scrollbar-hide scrollbar-hover'), children: children }) }));
|
|
49
|
+
};
|
|
50
|
+
const Trigger = ({ className }) => {
|
|
51
|
+
const { isMobile, collapsed, toggleCollapsed } = useLNBContext();
|
|
52
|
+
const Icon = collapsed ? PanelLeftOpen : PanelLeftClose;
|
|
53
|
+
if (isMobile)
|
|
54
|
+
return null;
|
|
55
|
+
return (_jsx("button", { type: "button", onClick: toggleCollapsed, className: cn('absolute -right-10 top-0 z-10', 'flex items-center justify-center w-10 h-10', 'text-neutral500', 'hover:text-mono900 ld-transition cursor-pointer', className), "aria-label": collapsed ? '사이드바 펼치기' : '사이드바 접기', children: _jsx(Icon, { size: 16 }) }));
|
|
56
|
+
};
|
|
57
|
+
const Header = ({ name, email, profileImage, handleLogout }) => {
|
|
58
|
+
const { collapsed } = useLNBContext();
|
|
59
|
+
return (_jsxs("div", { className: cn('w-full flex gap-sm items-center rounded-[10px] ld-transition overflow-hidden', collapsed
|
|
60
|
+
? 'p-xs justify-center border-transparent'
|
|
61
|
+
: 'p-md mobile:p-sm border border-neutral100'), children: [_jsx(Avatar, { size: "md", src: profileImage }), !collapsed && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col gap-xs flex-1 min-w-0", children: [_jsx("span", { className: "display16 bold truncate", children: name ?? '' }), _jsx("span", { className: "display14 text-neutral500 truncate", children: email ?? '' })] }), handleLogout && (_jsx(LogOut, { size: 12, className: "cursor-pointer flex-shrink-0", onClick: handleLogout }))] }))] }));
|
|
62
|
+
};
|
|
63
|
+
const Content = ({ children, className }) => (_jsxs(_Fragment, { children: [_jsx("div", { className: "w-full border-b border-neutral100" }), _jsx("div", { className: cn('flex flex-col gap-md mobile:overflow-y-auto mobile:h-[calc(62dvh-111px)]', className), children: children })] }));
|
|
64
|
+
const Group = ({ children, label, noSlider }) => {
|
|
65
|
+
const { isMobile, collapsed, toggleGroup, isGroupOpen } = useLNBContext();
|
|
66
|
+
const open = label ? isGroupOpen(label) : true;
|
|
67
|
+
return (_jsxs("div", { className: "flex flex-col gap-sm w-full items-start", children: [label && !collapsed && (_jsxs("div", { className: cn('w-full flex', isMobile && 'cursor-pointer justify-between'), onClick: () => !noSlider && isMobile && toggleGroup(label), children: [_jsx("span", { className: "display14 text-neutral500", children: label }), _jsx("div", { className: cn(isMobile &&
|
|
68
|
+
'transition-transform duration-300 ease-out flex items-center justify-center w-5 h-5 flex-shrink-0', isMobile && open ? 'rotate-180' : 'rotate-0', !isMobile && 'hidden', noSlider && 'hidden'), children: _jsx(ChevronDown, { size: 14, className: "text-neutral500" }) })] })), children] }));
|
|
69
|
+
};
|
|
70
|
+
const Menu = ({ children, label, noSlider, tabCount = 0 }) => {
|
|
71
|
+
const { isMobile, isGroupOpen } = useLNBContext();
|
|
72
|
+
const open = label ? isGroupOpen(label) : true;
|
|
73
|
+
const visible = (label && open) || !label || noSlider;
|
|
74
|
+
return (_jsx("div", { className: cn('flex flex-col w-full gap-sm opacity-100', isMobile && 'overflow-hidden ld-transition', visible ? 'opacity-100' : isMobile && 'opacity-0'), style: {
|
|
75
|
+
height: isMobile
|
|
76
|
+
? visible
|
|
77
|
+
? `calc(40px * ${tabCount} + 10px * ${tabCount > 0 ? tabCount - 1 : 0})`
|
|
78
|
+
: '0'
|
|
79
|
+
: 'auto',
|
|
80
|
+
}, children: children }));
|
|
81
|
+
};
|
|
82
|
+
const MenuItem = ({ as: Comp = 'a', href, isActive, children, icon, className, ...rest }) => {
|
|
83
|
+
const { collapsed } = useLNBContext();
|
|
84
|
+
return (_jsxs(Comp, { href: href, className: cn('flex gap-sm w-full items-center p-sm display16 mobile:display14 bold mobile:medium', 'text-neutral500 cursor-pointer hover:bg-mono300 rounded-[5px] hover:text-mono900 ld-transition', collapsed && 'justify-center', isActive &&
|
|
85
|
+
'bg-tintBlue text-blue400 hover:bg-tintBlue hover:text-blue400', className), ...rest, children: [icon && _jsx("span", { className: "flex-shrink-0", children: icon }), !collapsed && children] }));
|
|
86
|
+
};
|
|
87
|
+
const MenuSub = ({ children, className }) => {
|
|
88
|
+
const { collapsed } = useLNBContext();
|
|
89
|
+
if (collapsed)
|
|
90
|
+
return null;
|
|
91
|
+
return (_jsx("div", { className: cn('flex flex-col w-full gap-sm pl-sm', className), children: children }));
|
|
92
|
+
};
|
|
93
|
+
const MenuSubItem = ({ as: Comp = 'a', href, isActive, children, className, ...rest }) => (_jsx(Comp, { href: href, className: cn('flex gap-sm w-full items-center p-sm display14 medium', 'text-neutral500 cursor-pointer hover:bg-mono300 rounded-[5px] hover:text-mono900 ld-transition', isActive &&
|
|
94
|
+
'bg-tintBlue text-blue400 hover:bg-tintBlue hover:text-blue400', className), ...rest, children: children }));
|
|
95
|
+
// ── Export ──
|
|
96
|
+
const LNBBase = {
|
|
97
|
+
Provider,
|
|
98
|
+
Root,
|
|
99
|
+
Trigger,
|
|
100
|
+
Header,
|
|
101
|
+
Content,
|
|
102
|
+
Group,
|
|
103
|
+
Menu,
|
|
104
|
+
MenuItem,
|
|
105
|
+
MenuSub,
|
|
106
|
+
MenuSubItem,
|
|
107
|
+
};
|
|
108
|
+
export default LNBBase;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LoadingDotsProps {
|
|
2
|
+
size?: LoadingDotsSize;
|
|
3
|
+
className?: string;
|
|
4
|
+
}
|
|
5
|
+
type LoadingDotsSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
|
|
6
|
+
declare const LoadingDots: ({ size, className }: LoadingDotsProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default LoadingDots;
|
|
8
|
+
//# sourceMappingURL=LoadingDots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingDots.d.ts","sourceRoot":"","sources":["../../../src/components/LoadingDots/LoadingDots.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,eAAe,GAChB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,QAAA,MAAM,WAAW,GAAI,qBAA+B,gBAAgB,4CA4CnE,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import cn from '../../utils/cn.js';
|
|
3
|
+
const LoadingDots = ({ size = 'small', className }) => {
|
|
4
|
+
const sizeMap = {
|
|
5
|
+
'2xsmall': 2,
|
|
6
|
+
xsmall: 2,
|
|
7
|
+
small: 2,
|
|
8
|
+
medium: 2,
|
|
9
|
+
large: 3,
|
|
10
|
+
xlarge: 4,
|
|
11
|
+
};
|
|
12
|
+
return (_jsxs("div", { className: cn('flex items-center justify-center gap-1', className), style: { height: sizeMap[size] }, children: [_jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
13
|
+
width: sizeMap[size],
|
|
14
|
+
height: sizeMap[size],
|
|
15
|
+
animationDelay: '0ms',
|
|
16
|
+
animationDuration: '1000ms',
|
|
17
|
+
} }), _jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
18
|
+
width: sizeMap[size],
|
|
19
|
+
height: sizeMap[size],
|
|
20
|
+
animationDelay: '200ms',
|
|
21
|
+
animationDuration: '1000ms',
|
|
22
|
+
} }), _jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
23
|
+
width: sizeMap[size],
|
|
24
|
+
height: sizeMap[size],
|
|
25
|
+
animationDelay: '400ms',
|
|
26
|
+
animationDuration: '1000ms',
|
|
27
|
+
} })] }));
|
|
28
|
+
};
|
|
29
|
+
export default LoadingDots;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
|
+
import MenuBarBase from './MenuBarBase.js';
|
|
3
|
+
declare const MenuBar: {
|
|
4
|
+
Root: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Root>) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
Logo: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Logo>) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
Nav: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Nav>) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
Item: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Item>) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
Trigger: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Trigger>) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
Content: {
|
|
10
|
+
({ className, ...props }: ComponentProps<typeof MenuBarBase.Content>): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
displayName: string;
|
|
12
|
+
};
|
|
13
|
+
MegaContent: {
|
|
14
|
+
({ className, ...props }: ComponentProps<typeof MenuBarBase.Content>): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
displayName: string;
|
|
16
|
+
};
|
|
17
|
+
Actions: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Actions>) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
Separator: ({ className, }: ComponentProps<typeof MenuBarBase.Separator>) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
};
|
|
20
|
+
export default MenuBar;
|
|
21
|
+
//# sourceMappingURL=MenuBar.d.ts.map
|