@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,98 @@
|
|
|
1
|
+
import { type CSSProperties, type ReactNode } from 'react';
|
|
2
|
+
import useEmblaCarousel from 'embla-carousel-react';
|
|
3
|
+
import type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel';
|
|
4
|
+
export type CarouselOrientation = 'horizontal' | 'vertical';
|
|
5
|
+
interface AutoplayConfig {
|
|
6
|
+
/** 자동 전환 간격(ms). 기본 4000 */
|
|
7
|
+
delay?: number;
|
|
8
|
+
/** 사용자 상호작용 시 자동재생 정지 여부. 기본 false (재개) */
|
|
9
|
+
stopOnInteraction?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface AutoScrollConfig {
|
|
12
|
+
/** 흐르는 속도. 클수록 빠름. 기본 2 */
|
|
13
|
+
speed?: number;
|
|
14
|
+
/** 진행 방향. 기본 'forward' */
|
|
15
|
+
direction?: 'forward' | 'backward';
|
|
16
|
+
/** 사용자 상호작용 시 정지 여부. 기본 false (재개) */
|
|
17
|
+
stopOnInteraction?: boolean;
|
|
18
|
+
/** 마우스 올렸을 때 정지 여부. 기본 false */
|
|
19
|
+
stopOnMouseEnter?: boolean;
|
|
20
|
+
}
|
|
21
|
+
interface CarouselContextType {
|
|
22
|
+
emblaRef: ReturnType<typeof useEmblaCarousel>[0];
|
|
23
|
+
emblaApi: EmblaCarouselType | undefined;
|
|
24
|
+
selectedIndex: number;
|
|
25
|
+
scrollSnaps: number[];
|
|
26
|
+
canScrollPrev: boolean;
|
|
27
|
+
canScrollNext: boolean;
|
|
28
|
+
scrollPrev: () => void;
|
|
29
|
+
scrollNext: () => void;
|
|
30
|
+
scrollTo: (index: number) => void;
|
|
31
|
+
orientation: CarouselOrientation;
|
|
32
|
+
/** 슬라이드 간 간격(px). embla 공식 방식대로 Container 음수 마진 + Slide 패딩으로 적용 */
|
|
33
|
+
gap: number;
|
|
34
|
+
}
|
|
35
|
+
/** 외부에서 캐러셀 컨트롤(emblaApi)에 접근하고 싶을 때 사용하는 훅 */
|
|
36
|
+
export declare const useCarousel: () => CarouselContextType;
|
|
37
|
+
export interface RootProps {
|
|
38
|
+
orientation?: CarouselOrientation;
|
|
39
|
+
loop?: boolean;
|
|
40
|
+
/** true 또는 설정 객체를 넘기면 자동재생(스텝형) 활성화 */
|
|
41
|
+
autoplay?: boolean | AutoplayConfig;
|
|
42
|
+
/** true 또는 설정 객체를 넘기면 연속 흐름(Auto Scroll) 활성화.
|
|
43
|
+
* autoplay와 동시 사용 불가 — 설정 시 autoplay보다 우선. loop와 함께 쓰는 것을 권장 */
|
|
44
|
+
autoScroll?: boolean | AutoScrollConfig;
|
|
45
|
+
/** 선택된 슬라이드가 viewport의 어디에 정렬되는지. 기본 'start'(왼쪽 끝 붙음) */
|
|
46
|
+
align?: 'start' | 'center' | 'end';
|
|
47
|
+
/** embla 추가 옵션 (dragFree, slidesToScroll 등) */
|
|
48
|
+
options?: Omit<EmblaOptionsType, 'loop' | 'axis' | 'align'>;
|
|
49
|
+
/** 슬라이드 간 간격(px). 기본 16 */
|
|
50
|
+
gap?: number;
|
|
51
|
+
className?: string;
|
|
52
|
+
style?: CSSProperties;
|
|
53
|
+
children?: ReactNode;
|
|
54
|
+
}
|
|
55
|
+
export interface ViewportProps {
|
|
56
|
+
className?: string;
|
|
57
|
+
children?: ReactNode;
|
|
58
|
+
}
|
|
59
|
+
export interface ContainerProps {
|
|
60
|
+
className?: string;
|
|
61
|
+
style?: CSSProperties;
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
}
|
|
64
|
+
export interface SlideProps {
|
|
65
|
+
/** 슬라이드 크기(basis). 기본 '100%' (한 번에 하나) */
|
|
66
|
+
size?: string;
|
|
67
|
+
index?: number;
|
|
68
|
+
total?: number;
|
|
69
|
+
className?: string;
|
|
70
|
+
style?: CSSProperties;
|
|
71
|
+
children?: ReactNode;
|
|
72
|
+
}
|
|
73
|
+
export interface NavButtonProps {
|
|
74
|
+
className?: string;
|
|
75
|
+
children?: ReactNode;
|
|
76
|
+
'aria-label'?: string;
|
|
77
|
+
}
|
|
78
|
+
export interface DotsProps {
|
|
79
|
+
className?: string;
|
|
80
|
+
dotClassName?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface CounterProps {
|
|
83
|
+
className?: string;
|
|
84
|
+
/** 표시 형식 커스터마이즈. 기본 "3 / 5" */
|
|
85
|
+
format?: (current: number, total: number) => string;
|
|
86
|
+
}
|
|
87
|
+
export declare const CarouselBase: {
|
|
88
|
+
Root: ({ orientation, loop, autoplay, autoScroll, align, options, gap, className, style, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
89
|
+
Viewport: ({ className, children }: ViewportProps) => import("react/jsx-runtime").JSX.Element;
|
|
90
|
+
Container: ({ className, style, children }: ContainerProps) => import("react/jsx-runtime").JSX.Element;
|
|
91
|
+
Slide: ({ size, index, total, className, style, children, }: SlideProps) => import("react/jsx-runtime").JSX.Element;
|
|
92
|
+
Prev: ({ className, children, ...props }: NavButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
93
|
+
Next: ({ className, children, ...props }: NavButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
94
|
+
Dots: ({ className, dotClassName }: DotsProps) => import("react/jsx-runtime").JSX.Element;
|
|
95
|
+
Counter: ({ className, format }: CounterProps) => import("react/jsx-runtime").JSX.Element;
|
|
96
|
+
};
|
|
97
|
+
export default CarouselBase;
|
|
98
|
+
//# sourceMappingURL=CarouselBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/Carousel/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AACf,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAKxB,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE5D,UAAU,cAAc;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,gBAAgB;IACxB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAGD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,mBAAmB,CAAC;IACjC,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;CACb;AAWD,+CAA+C;AAC/C,eAAO,MAAM,WAAW,2BAAqB,CAAC;AAG9C,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IACpC;qEACiE;IACjE,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,+CAA+C;IAC/C,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC5D,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA6GD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAYD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAyBD,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAmCD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqDD,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4BD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrD;AAgBD,eAAO,MAAM,YAAY;0GAnStB,SAAS;wCAqG+B,aAAa;gDAgBL,cAAc;iEAwC9D,UAAU;8CAgCoC,cAAc;8CAyBd,cAAc;wCA+BpB,SAAS;qCAgCZ,YAAY;CAuBnD,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
|
|
4
|
+
import useEmblaCarousel from 'embla-carousel-react';
|
|
5
|
+
import Autoplay from 'embla-carousel-autoplay';
|
|
6
|
+
import AutoScroll from 'embla-carousel-auto-scroll';
|
|
7
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
8
|
+
import cn from '../../utils/cn.js';
|
|
9
|
+
const CarouselContext = createContext(null);
|
|
10
|
+
const useCarouselContext = () => {
|
|
11
|
+
const ctx = useContext(CarouselContext);
|
|
12
|
+
if (!ctx)
|
|
13
|
+
throw new Error('Carousel 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
|
|
14
|
+
return ctx;
|
|
15
|
+
};
|
|
16
|
+
/** 외부에서 캐러셀 컨트롤(emblaApi)에 접근하고 싶을 때 사용하는 훅 */
|
|
17
|
+
export const useCarousel = useCarouselContext;
|
|
18
|
+
const Root = ({ orientation = 'horizontal', loop = false, autoplay = false, autoScroll = false, align = 'start', options, gap = 16, className, style, children, }) => {
|
|
19
|
+
// 자동 이동 플러그인 조립. autoScroll(연속 흐름)이 설정되면 autoplay(스텝형)보다 우선.
|
|
20
|
+
const plugins = [];
|
|
21
|
+
if (autoScroll) {
|
|
22
|
+
const c = typeof autoScroll === 'object' ? autoScroll : {};
|
|
23
|
+
plugins.push(AutoScroll({
|
|
24
|
+
speed: c.speed ?? 2,
|
|
25
|
+
direction: c.direction ?? 'forward',
|
|
26
|
+
stopOnInteraction: c.stopOnInteraction ?? false,
|
|
27
|
+
stopOnMouseEnter: c.stopOnMouseEnter ?? false,
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
else if (autoplay) {
|
|
31
|
+
const c = typeof autoplay === 'object' ? autoplay : {};
|
|
32
|
+
plugins.push(Autoplay({
|
|
33
|
+
delay: c.delay ?? 4000,
|
|
34
|
+
stopOnInteraction: c.stopOnInteraction ?? false,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
const [emblaRef, emblaApi] = useEmblaCarousel({
|
|
38
|
+
...options,
|
|
39
|
+
align,
|
|
40
|
+
loop,
|
|
41
|
+
axis: orientation === 'vertical' ? 'y' : 'x',
|
|
42
|
+
}, plugins);
|
|
43
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
44
|
+
const [scrollSnaps, setScrollSnaps] = useState([]);
|
|
45
|
+
const [canScrollPrev, setCanScrollPrev] = useState(false);
|
|
46
|
+
const [canScrollNext, setCanScrollNext] = useState(false);
|
|
47
|
+
// 슬라이드 선택 변경시 실행되는 함수
|
|
48
|
+
const onSelect = useCallback((api) => {
|
|
49
|
+
setSelectedIndex(api.selectedScrollSnap());
|
|
50
|
+
setCanScrollPrev(api.canScrollPrev());
|
|
51
|
+
setCanScrollNext(api.canScrollNext());
|
|
52
|
+
}, []);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!emblaApi)
|
|
55
|
+
return;
|
|
56
|
+
setScrollSnaps(emblaApi.scrollSnapList());
|
|
57
|
+
//슬라이드 초기 상태 설정
|
|
58
|
+
onSelect(emblaApi);
|
|
59
|
+
emblaApi.on('select', onSelect);
|
|
60
|
+
emblaApi.on('reInit', onSelect);
|
|
61
|
+
emblaApi.on('reInit', () => setScrollSnaps(emblaApi.scrollSnapList()));
|
|
62
|
+
return () => {
|
|
63
|
+
//클린업 함수
|
|
64
|
+
emblaApi.off('select', onSelect);
|
|
65
|
+
emblaApi.off('reInit', onSelect);
|
|
66
|
+
};
|
|
67
|
+
}, [emblaApi, onSelect]);
|
|
68
|
+
const scrollPrev = useCallback(() => emblaApi?.scrollPrev(), [emblaApi]);
|
|
69
|
+
const scrollNext = useCallback(() => emblaApi?.scrollNext(), [emblaApi]);
|
|
70
|
+
const scrollTo = useCallback((index) => emblaApi?.scrollTo(index), [emblaApi]);
|
|
71
|
+
return (_jsx(CarouselContext.Provider, { value: {
|
|
72
|
+
emblaRef,
|
|
73
|
+
emblaApi,
|
|
74
|
+
selectedIndex,
|
|
75
|
+
scrollSnaps,
|
|
76
|
+
canScrollPrev,
|
|
77
|
+
canScrollNext,
|
|
78
|
+
scrollPrev,
|
|
79
|
+
scrollNext,
|
|
80
|
+
scrollTo,
|
|
81
|
+
orientation,
|
|
82
|
+
gap,
|
|
83
|
+
}, children: _jsx("div", { className: cn('ld-carousel relative', className), style: style, role: "region", "aria-roledescription": "carousel", children: children }) }));
|
|
84
|
+
};
|
|
85
|
+
const Viewport = ({ className, children }) => {
|
|
86
|
+
const { emblaRef } = useCarouselContext();
|
|
87
|
+
return (_jsx("div", { ref: emblaRef, className: cn('ld-carousel__viewport', className), children: children }));
|
|
88
|
+
};
|
|
89
|
+
const Container = ({ className, style, children }) => {
|
|
90
|
+
const { orientation, gap } = useCarouselContext();
|
|
91
|
+
const isVertical = orientation === 'vertical';
|
|
92
|
+
return (_jsx("div", { className: cn('flex', isVertical ? 'flex-col h-full' : 'flex-row', className),
|
|
93
|
+
// embla 공식 방식: 간격을 Slide 패딩으로 주고, 첫 칸 패딩만 음수 마진으로 상쇄.
|
|
94
|
+
// flex gap과 달리 loop 이음새(마지막↔처음)에도 간격이 유지됨.
|
|
95
|
+
style: {
|
|
96
|
+
[isVertical ? 'marginTop' : 'marginLeft']: -gap,
|
|
97
|
+
...style,
|
|
98
|
+
}, children: children }));
|
|
99
|
+
};
|
|
100
|
+
const Slide = ({ size = '100%', index, total, className, style, children, }) => {
|
|
101
|
+
const { orientation, gap } = useCarouselContext();
|
|
102
|
+
const isVertical = orientation === 'vertical';
|
|
103
|
+
return (_jsx("div", { role: "group", "aria-roledescription": "slide", "aria-label": index != null && total != null ? `${index + 1} / ${total}` : undefined, className: cn('min-w-0 shrink-0 grow-0', className),
|
|
104
|
+
// 간격을 슬라이드 박스의 패딩으로 포함시켜야 embla가 크기를 정확히 재고
|
|
105
|
+
// loop 이음새에도 간격이 유지된다 (embla 공식 방식).
|
|
106
|
+
style: {
|
|
107
|
+
flexBasis: size,
|
|
108
|
+
[isVertical ? 'height' : 'width']: size,
|
|
109
|
+
[isVertical ? 'paddingTop' : 'paddingLeft']: gap,
|
|
110
|
+
...style,
|
|
111
|
+
}, children: children }));
|
|
112
|
+
};
|
|
113
|
+
const Prev = ({ className, children, ...props }) => {
|
|
114
|
+
const { scrollPrev, canScrollPrev, orientation } = useCarouselContext();
|
|
115
|
+
return (_jsx("button", { type: "button", onClick: scrollPrev, disabled: !canScrollPrev, "aria-label": props['aria-label'] ?? '이전', className: cn('ld-carousel__nav inline-flex items-center justify-center rounded-full bg-mono50 border border-mono200 w-9 h-9 ld-transition', 'hover:bg-neutral50 disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer', className), children: children ?? (_jsx(LucideIcon, { name: orientation === 'vertical' ? 'chevronUp' : 'chevronLeft', size: 18, className: "text-neutral900" })) }));
|
|
116
|
+
};
|
|
117
|
+
const Next = ({ className, children, ...props }) => {
|
|
118
|
+
const { scrollNext, canScrollNext, orientation } = useCarouselContext();
|
|
119
|
+
return (_jsx("button", { type: "button", onClick: scrollNext, disabled: !canScrollNext, "aria-label": props['aria-label'] ?? '다음', className: cn('ld-carousel__nav inline-flex items-center justify-center rounded-full bg-mono50 border border-mono200 w-9 h-9 ld-transition', 'hover:bg-neutral50 disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer', className), children: children ?? (_jsx(LucideIcon, { name: orientation === 'vertical' ? 'chevronDown' : 'chevronRight', size: 18, className: "text-neutral900" })) }));
|
|
120
|
+
};
|
|
121
|
+
const Dots = ({ className, dotClassName }) => {
|
|
122
|
+
const { scrollSnaps, selectedIndex, scrollTo } = useCarouselContext();
|
|
123
|
+
return (_jsx("div", { className: cn('flex items-center justify-center gap-2', className), children: scrollSnaps.map((_, i) => {
|
|
124
|
+
const isActive = i === selectedIndex;
|
|
125
|
+
return (_jsx("button", { type: "button", onClick: () => scrollTo(i), "aria-label": `${i + 1}번째 슬라이드로 이동`, "aria-current": isActive || undefined, className: cn('rounded-full ld-transition cursor-pointer', isActive ? 'w-5 h-2 bg-lb500' : 'w-2 h-2 bg-mono200', dotClassName) }, i));
|
|
126
|
+
}) }));
|
|
127
|
+
};
|
|
128
|
+
const Counter = ({ className, format }) => {
|
|
129
|
+
const { selectedIndex, scrollSnaps } = useCarouselContext();
|
|
130
|
+
const current = selectedIndex + 1;
|
|
131
|
+
const total = scrollSnaps.length;
|
|
132
|
+
return (_jsx("span", { "aria-live": "polite", className: cn('display14 regular text-neutral500', className), children: format ? format(current, total) : `${current} / ${total}` }));
|
|
133
|
+
};
|
|
134
|
+
export const CarouselBase = {
|
|
135
|
+
Root,
|
|
136
|
+
Viewport,
|
|
137
|
+
Container,
|
|
138
|
+
Slide,
|
|
139
|
+
Prev,
|
|
140
|
+
Next,
|
|
141
|
+
Dots,
|
|
142
|
+
Counter,
|
|
143
|
+
};
|
|
144
|
+
export default CarouselBase;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type Ref } from 'react';
|
|
2
|
+
type CheckboxSize = 'small';
|
|
3
|
+
type CheckboxFontSize = 'small' | 'regular';
|
|
4
|
+
type CheckboxType = 'default' | 'checkbox' | 'pill';
|
|
5
|
+
export interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'value'> {
|
|
6
|
+
/** 체크 상태 변경 콜백 (boolean) */
|
|
7
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
8
|
+
/** input value */
|
|
9
|
+
value?: string;
|
|
10
|
+
/** 체크 아이콘 크기 프리셋 */
|
|
11
|
+
size?: CheckboxSize;
|
|
12
|
+
/** 라벨 텍스트 크기 프리셋 */
|
|
13
|
+
fontSize?: CheckboxFontSize;
|
|
14
|
+
/** 라벨 텍스트 */
|
|
15
|
+
label?: string;
|
|
16
|
+
/** '필수' 라벨 표시 여부 */
|
|
17
|
+
isRequired?: boolean;
|
|
18
|
+
/** 체크박스 유형 (default: 체크 아이콘, checkbox: 박스형, pill: 알약형 토글) */
|
|
19
|
+
type?: CheckboxType;
|
|
20
|
+
/** 라벨과 체크박스 세로 가운데 정렬 */
|
|
21
|
+
itemCenter?: boolean;
|
|
22
|
+
/** input 요소 ref */
|
|
23
|
+
ref?: Ref<HTMLInputElement>;
|
|
24
|
+
}
|
|
25
|
+
declare const Checkbox: ({ checked, defaultChecked, onCheckedChange, onChange, size, fontSize, label, isRequired, type, itemCenter, disabled, className, style, ref, ...props }: CheckboxProps) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export default Checkbox;
|
|
27
|
+
//# sourceMappingURL=Checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAK3D,KAAK,YAAY,GAAG,OAAO,CAAC;AAC5B,KAAK,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AAC5C,KAAK,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAiBpD,MAAM,WAAW,aAAc,SAAQ,IAAI,CACzC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,MAAM,GAAG,OAAO,CAC1B;IACC,4BAA4B;IAC5B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AA8FD,QAAA,MAAM,QAAQ,GAAI,wJAgBf,aAAa,4CAgDf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import CheckboxBase, { useCheckboxContext } from './CheckboxBase.js';
|
|
3
|
+
import cn from '../../utils/cn.js';
|
|
4
|
+
const checkIconSizes = {
|
|
5
|
+
small: 24,
|
|
6
|
+
};
|
|
7
|
+
const labelHeight = {
|
|
8
|
+
small: 'min-h-6 leading-6',
|
|
9
|
+
};
|
|
10
|
+
const labelSizeClasses = {
|
|
11
|
+
small: 'display14',
|
|
12
|
+
regular: 'display16',
|
|
13
|
+
};
|
|
14
|
+
// ── Inner: Context에서 checked를 읽어 스타일 적용 ──
|
|
15
|
+
const PillInner = ({ label, ref, ...props }) => {
|
|
16
|
+
const { checked } = useCheckboxContext();
|
|
17
|
+
return (_jsxs(_Fragment, { children: [_jsx(CheckboxBase.HiddenInput, { ref: ref, ...props }), _jsxs("div", { className: "relative flex items-center", children: [_jsx(CheckboxBase.Indicator, { icon: "check", iconSize: 16, className: cn('absolute left-0'), iconClassName: cn('shrink-0 transition-all duration-200 ease-out', checked ? 'opacity-100' : 'opacity-0') }), label && (_jsx(CheckboxBase.Label, { className: cn('transition-all ld-transition text-nowrap', checked ? 'pl-5' : 'pl-sm pr-sm'), children: label }))] })] }));
|
|
18
|
+
};
|
|
19
|
+
const DefaultInner = ({ type, size, label, isRequired, ref, ...props }) => {
|
|
20
|
+
const { checked, disabled } = useCheckboxContext();
|
|
21
|
+
return (_jsxs(_Fragment, { children: [_jsx(CheckboxBase.HiddenInput, { ref: ref, ...props }), _jsx(CheckboxBase.Indicator, { icon: "check", iconSize: type === 'checkbox' ? 10 : checkIconSizes[size], className: cn('ld-transition', type === 'checkbox' &&
|
|
22
|
+
'border-2 rounded-[5px] border-mono300 p-[3px]', type === 'checkbox' && checked && 'bg-lb500 border-lb500', type === 'checkbox' && disabled && 'bg-mono100 border-mono100', 'peer-focus-visible:ring-2 peer-focus-visible:ring-lb500 peer-focus-visible:ring-offset-2'), iconClassName: cn('shrink-0', checked ? 'ld-transition text-blue400' : 'text-neutral500', type === 'checkbox' && 'text-white') }), isRequired && (_jsx(CheckboxBase.Label, { className: cn('text-blue400 shrink-0 block', labelHeight[size]), children: "\uD544\uC218" })), label && (_jsx(CheckboxBase.Label, { className: cn('text-neutral900 block', labelHeight[size]), children: label }))] }));
|
|
23
|
+
};
|
|
24
|
+
const Checkbox = ({ checked, defaultChecked, onCheckedChange, onChange, size = 'small', fontSize = 'small', label, isRequired = false, type = 'default', itemCenter = false, disabled = false, className, style, ref, ...props }) => {
|
|
25
|
+
if (type === 'pill') {
|
|
26
|
+
return (_jsx(CheckboxBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style, className: (c) => cn('items-center gap-2 rounded-full py-sm px-[15px] ld-transition display14 bold', c ? 'bg-tintBlue text-lb500' : 'bg-mono100 text-mono500', disabled && 'opacity-50 cursor-not-allowed', className), children: _jsx(PillInner, { label: label, ref: ref, onChange: onChange, ...props }) }));
|
|
27
|
+
}
|
|
28
|
+
return (_jsx(CheckboxBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style, className: cn('bold items-start ld-transition', itemCenter && 'items-center', labelSizeClasses[fontSize], className), children: _jsx(DefaultInner, { type: type, size: size, label: label, isRequired: isRequired, ref: ref, onChange: onChange, ...props }) }));
|
|
29
|
+
};
|
|
30
|
+
export default Checkbox;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ReactNode, type Ref } from 'react';
|
|
2
|
+
import { type IconName } from '../Icon/LucideIcon.js';
|
|
3
|
+
interface CheckboxContextType {
|
|
4
|
+
checked: boolean;
|
|
5
|
+
onCheckedChange: (checked: boolean) => void;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
isFocused: boolean;
|
|
8
|
+
setIsFocused: (focused: boolean) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare const useCheckboxContext: () => CheckboxContextType;
|
|
11
|
+
interface RootProps {
|
|
12
|
+
checked?: boolean;
|
|
13
|
+
defaultChecked?: boolean;
|
|
14
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
className?: string | ((checked: boolean) => string);
|
|
17
|
+
style?: React.CSSProperties;
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
}
|
|
20
|
+
interface HiddenInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
21
|
+
ref?: Ref<HTMLInputElement>;
|
|
22
|
+
}
|
|
23
|
+
interface IndicatorProps {
|
|
24
|
+
icon?: IconName;
|
|
25
|
+
iconSize?: number;
|
|
26
|
+
className?: string;
|
|
27
|
+
iconClassName?: string;
|
|
28
|
+
}
|
|
29
|
+
interface LabelProps {
|
|
30
|
+
className?: string;
|
|
31
|
+
children?: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
export declare const CheckboxBase: {
|
|
34
|
+
Root: ({ checked, defaultChecked, onCheckedChange, disabled, className, style, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
HiddenInput: ({ ref, onFocus, onBlur, onChange, ...props }: HiddenInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
Indicator: ({ icon, iconSize, className, iconClassName, }: IndicatorProps) => import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
Label: ({ className, children }: LabelProps) => import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
};
|
|
39
|
+
export default CheckboxBase;
|
|
40
|
+
//# sourceMappingURL=CheckboxBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxBase.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/CheckboxBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,GAAG,EAIT,MAAM,OAAO,CAAC;AACf,OAAmB,EAAE,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI/D,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAID,eAAO,MAAM,kBAAkB,2BAO9B,CAAC;AAGF,UAAU,SAAS;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAiDD,UAAU,gBAAiB,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;IAC5E,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAqCD,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAgBD,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAMD,eAAO,MAAM,YAAY;gGA5GtB,SAAS;gEAiDT,gBAAgB;+DAyChB,cAAc;qCAcuB,UAAU;CASjD,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, } from 'react';
|
|
3
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
4
|
+
import cn from '../../utils/cn.js';
|
|
5
|
+
const CheckboxContext = createContext(null);
|
|
6
|
+
export const useCheckboxContext = () => {
|
|
7
|
+
const ctx = useContext(CheckboxContext);
|
|
8
|
+
if (!ctx)
|
|
9
|
+
throw new Error('CheckboxBase 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
|
|
10
|
+
return ctx;
|
|
11
|
+
};
|
|
12
|
+
const Root = ({ checked, defaultChecked = false, onCheckedChange, disabled = false, className, style, children, }) => {
|
|
13
|
+
const [internal, setInternal] = useState(defaultChecked);
|
|
14
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
15
|
+
const isControlled = checked !== undefined;
|
|
16
|
+
const resolved = isControlled ? checked : internal;
|
|
17
|
+
const handleChange = (val) => {
|
|
18
|
+
if (!isControlled)
|
|
19
|
+
setInternal(val);
|
|
20
|
+
onCheckedChange?.(val);
|
|
21
|
+
};
|
|
22
|
+
const resolvedClassName = typeof className === 'function' ? className(resolved) : className;
|
|
23
|
+
return (_jsx(CheckboxContext, { value: {
|
|
24
|
+
checked: resolved,
|
|
25
|
+
onCheckedChange: handleChange,
|
|
26
|
+
disabled,
|
|
27
|
+
isFocused,
|
|
28
|
+
setIsFocused,
|
|
29
|
+
}, children: _jsx("label", { style: style, onClick: (e) => e.stopPropagation(), className: cn('flex flex-row w-fit gap-2.5 shrink-0', disabled ? 'cursor-not-allowed' : 'cursor-pointer', resolvedClassName), children: children }) }));
|
|
30
|
+
};
|
|
31
|
+
const HiddenInput = ({ ref, onFocus, onBlur, onChange, ...props }) => {
|
|
32
|
+
const { checked, onCheckedChange, disabled, setIsFocused } = useCheckboxContext();
|
|
33
|
+
return (_jsx("input", { type: "checkbox", ref: ref, className: "sr-only peer", checked: checked, disabled: disabled, onChange: (e) => {
|
|
34
|
+
e.stopPropagation(); // 이벤트 전파 중단
|
|
35
|
+
onCheckedChange(e.target.checked);
|
|
36
|
+
onChange?.(e);
|
|
37
|
+
}, onFocus: (e) => {
|
|
38
|
+
setIsFocused(true);
|
|
39
|
+
onFocus?.(e);
|
|
40
|
+
}, onBlur: (e) => {
|
|
41
|
+
setIsFocused(false);
|
|
42
|
+
onBlur?.(e);
|
|
43
|
+
}, ...props }));
|
|
44
|
+
};
|
|
45
|
+
const Indicator = ({ icon = 'check', iconSize = 24, className, iconClassName, }) => {
|
|
46
|
+
return (_jsx("div", { className: className, children: _jsx(LucideIcon, { name: icon, size: iconSize, className: iconClassName }) }));
|
|
47
|
+
};
|
|
48
|
+
const Label = ({ className, children }) => {
|
|
49
|
+
return _jsx("span", { className: className, children: children });
|
|
50
|
+
};
|
|
51
|
+
export const CheckboxBase = {
|
|
52
|
+
Root,
|
|
53
|
+
HiddenInput,
|
|
54
|
+
Indicator,
|
|
55
|
+
Label,
|
|
56
|
+
};
|
|
57
|
+
export default CheckboxBase;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
export interface CheckboxGroupOption {
|
|
3
|
+
label: string;
|
|
4
|
+
value: string;
|
|
5
|
+
sub?: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface CheckboxGroupProps {
|
|
9
|
+
items: CheckboxGroupOption[];
|
|
10
|
+
value?: string[];
|
|
11
|
+
onChange?: (value: string[]) => void;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
type?: 'default' | 'checkbox' | 'pill';
|
|
14
|
+
size?: 'small';
|
|
15
|
+
fontSize?: 'small' | 'regular';
|
|
16
|
+
orientation?: 'horizontal' | 'vertical';
|
|
17
|
+
className?: string;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
}
|
|
20
|
+
declare const CheckboxGroup: ({ items, value, onChange, disabled, type, size, fontSize, orientation, className, style, }: CheckboxGroupProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export default CheckboxGroup;
|
|
22
|
+
//# sourceMappingURL=CheckboxGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxGroup.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/CheckboxGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,aAAa,GAAI,4FAWpB,kBAAkB,4CA+BpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import Checkbox from './Checkbox.js';
|
|
3
|
+
import cn from '../../utils/cn.js';
|
|
4
|
+
const CheckboxGroup = ({ items, value = [], onChange, disabled = false, type = 'pill', size = 'small', fontSize = 'small', orientation = 'horizontal', className, style, }) => {
|
|
5
|
+
const handleChange = (target) => {
|
|
6
|
+
const arr = value.includes(target)
|
|
7
|
+
? value.filter((v) => v !== target)
|
|
8
|
+
: [...value, target];
|
|
9
|
+
onChange?.(arr);
|
|
10
|
+
};
|
|
11
|
+
return (_jsx("div", { className: cn('flex gap-2.5', orientation === 'vertical' ? 'flex-col' : 'flex-row', className), style: style, children: items.map((option) => (_jsx(Checkbox, { type: type, size: size, fontSize: fontSize, checked: value.includes(option.value), onCheckedChange: () => handleChange(option.value), label: option.label, disabled: disabled || option.disabled }, option.value))) }));
|
|
12
|
+
};
|
|
13
|
+
export default CheckboxGroup;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Ref } from 'react';
|
|
2
|
+
import { type RegisterOptions } from 'react-hook-form';
|
|
3
|
+
import { type CheckboxProps } from './Checkbox.js';
|
|
4
|
+
interface FormCheckboxProps extends Omit<CheckboxProps, 'checked' | 'name' | 'onCheckedChange'> {
|
|
5
|
+
name: string;
|
|
6
|
+
options?: RegisterOptions;
|
|
7
|
+
ref?: Ref<HTMLInputElement>;
|
|
8
|
+
customErrorMessage?: string;
|
|
9
|
+
isHiddenErrorMessage?: boolean;
|
|
10
|
+
errorClassName?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const FormCheckbox: ({ name, options, ref, customErrorMessage, isHiddenErrorMessage, errorClassName, disabled, ...props }: FormCheckboxProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export default FormCheckbox;
|
|
14
|
+
//# sourceMappingURL=FormCheckbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormCheckbox.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/FormCheckbox.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAI1D,UAAU,iBAAkB,SAAQ,IAAI,CACtC,aAAa,EACb,SAAS,GAAG,MAAM,GAAG,iBAAiB,CACvC;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;CACzB;AAED,QAAA,MAAM,YAAY,GAAI,sGASnB,iBAAiB,4CA8BnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Checkbox from './Checkbox.js';
|
|
4
|
+
import FormField from '../Form/FormField.js';
|
|
5
|
+
import FormErrorMessage from '../Form/FormErrorMessage.js';
|
|
6
|
+
const FormCheckbox = ({ name, options, ref, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, disabled = false, ...props }) => {
|
|
7
|
+
return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, ref: ref, children: ({ field, fieldState }) => (_jsxs("div", { className: "relative", children: [_jsx(Checkbox, { ...props, checked: !!field.value, onCheckedChange: field.onChange, onBlur: field.onBlur, disabled: disabled, ref: field.ref }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { error: fieldState.error, disabled: disabled, className: errorClassName }))] })) }));
|
|
8
|
+
};
|
|
9
|
+
export default FormCheckbox;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type RegisterOptions } from 'react-hook-form';
|
|
2
|
+
import { type CheckboxGroupProps } from './CheckboxGroup.js';
|
|
3
|
+
interface FormCheckboxGroupProps extends Omit<CheckboxGroupProps, 'value' | 'onChange'> {
|
|
4
|
+
name: string;
|
|
5
|
+
options?: RegisterOptions;
|
|
6
|
+
customErrorMessage?: string;
|
|
7
|
+
isHiddenErrorMessage?: boolean;
|
|
8
|
+
errorClassName?: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const FormCheckboxGroup: ({ name, options, customErrorMessage, isHiddenErrorMessage, errorClassName, disabled, ...props }: FormCheckboxGroupProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default FormCheckboxGroup;
|
|
13
|
+
//# sourceMappingURL=FormCheckboxGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormCheckboxGroup.d.ts","sourceRoot":"","sources":["../../../src/components/Checkbox/FormCheckboxGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAsB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAIzE,UAAU,sBAAuB,SAAQ,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB;IACC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,iBAAiB,GAAI,iGAQxB,sBAAsB,4CA2BxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import CheckboxGroup from './CheckboxGroup.js';
|
|
4
|
+
import FormField from '../Form/FormField.js';
|
|
5
|
+
import FormErrorMessage from '../Form/FormErrorMessage.js';
|
|
6
|
+
const FormCheckboxGroup = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = true, errorClassName, disabled = false, ...props }) => {
|
|
7
|
+
return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, children: ({ field, fieldState }) => (_jsxs("div", { className: "relative", children: [_jsx(CheckboxGroup, { ...props, value: field.value ?? [], onChange: field.onChange, disabled: disabled }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { error: fieldState.error, disabled: disabled, className: errorClassName }))] })) }));
|
|
8
|
+
};
|
|
9
|
+
export default FormCheckboxGroup;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
|
+
import DataCalendarBase from './DataCalendarBase.js';
|
|
3
|
+
declare const DataCalendar: {
|
|
4
|
+
Root: ({ className, ...props }: ComponentProps<typeof DataCalendarBase.Root>) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
Title: ({ className, ...props }: ComponentProps<typeof DataCalendarBase.Title>) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
Prev: ({ className, children, ...props }: ComponentProps<typeof DataCalendarBase.Prev>) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
Next: ({ className, children, ...props }: ComponentProps<typeof DataCalendarBase.Next>) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
Grid: ({ className, weekdayClassName, ...props }: ComponentProps<typeof DataCalendarBase.Grid>) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
Cell: ({ className, dateClassName, ...props }: ComponentProps<typeof DataCalendarBase.Cell>) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
};
|
|
11
|
+
export default DataCalendar;
|
|
12
|
+
//# sourceMappingURL=DataCalendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataCalendar.d.ts","sourceRoot":"","sources":["../../../src/components/DataCalendar/DataCalendar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAoFlD,QAAA,MAAM,YAAY;oCA/Ef,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;qCAU5C,cAAc,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC;8CAW7C,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;8CAgB5C,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;sDAgB5C,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;mDAY5C,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC;CAca,CAAC;AAE7D,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronLeft, ChevronRight } from 'lucide-react';
|
|
4
|
+
import cn from '../../utils/cn.js';
|
|
5
|
+
import DataCalendarBase from './DataCalendarBase.js';
|
|
6
|
+
const Root = ({ className, ...props }) => (_jsx(DataCalendarBase.Root, { className: cn('w-full select-none', className), ...props }));
|
|
7
|
+
const Title = ({ className, ...props }) => (_jsx(DataCalendarBase.Title, { className: cn('display32 bold flex justify-center', className), ...props }));
|
|
8
|
+
const Prev = ({ className, children, ...props }) => (_jsx(DataCalendarBase.Prev, { className: cn('flex items-center justify-center rounded-full size-[30px] bg-neutral100 hover:bg-mono400 text-neutral500 ld-transition cursor-pointer', className), ...props, children: children ?? _jsx(ChevronLeft, { size: 15 }) }));
|
|
9
|
+
const Next = ({ className, children, ...props }) => (_jsx(DataCalendarBase.Next, { className: cn('flex items-center justify-center rounded-full size-[30px] bg-neutral100 hover:bg-mono400 text-neutral500 ld-transition cursor-pointer', className), ...props, children: children ?? _jsx(ChevronRight, { size: 16 }) }));
|
|
10
|
+
const Grid = ({ className, weekdayClassName, ...props }) => (_jsx(DataCalendarBase.Grid, { className: className, weekdayClassName: cn('display14 text-mono500 py-[10px] ', weekdayClassName), ...props }));
|
|
11
|
+
const Cell = ({ className, dateClassName, ...props }) => (_jsx(DataCalendarBase.Cell, { className: cn('min-h-[100px] py-[10px] flex flex-col gap-[15px] data-outside:*:text-mono400', className), dateClassName: cn('display16 font-normal self-start leading-none data-[outside]:text-mono400 data-[outside]:font-normal data-[weekend]:text-danger600 data-[outside]:data-[weekend]:text-danger200', dateClassName), ...props }));
|
|
12
|
+
const DataCalendar = { Root, Title, Prev, Next, Grid, Cell };
|
|
13
|
+
export default DataCalendar;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type Dayjs } from 'dayjs';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
interface DataCalendarContextType {
|
|
4
|
+
month: Dayjs;
|
|
5
|
+
changeMonth: (delta: number) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const useDataCalendarContext: () => DataCalendarContextType;
|
|
8
|
+
interface RootProps {
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
defaultMonth?: Dayjs;
|
|
12
|
+
onMonthChange?: (month: Dayjs) => void;
|
|
13
|
+
}
|
|
14
|
+
interface TitleProps {
|
|
15
|
+
className?: string;
|
|
16
|
+
format?: string;
|
|
17
|
+
}
|
|
18
|
+
interface NavButtonProps {
|
|
19
|
+
children?: ReactNode;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
interface GridProps {
|
|
23
|
+
renderCell: (date: Dayjs, index: number, isOutside: boolean) => ReactNode;
|
|
24
|
+
weekdays?: string[];
|
|
25
|
+
className?: string;
|
|
26
|
+
weekdayClassName?: string;
|
|
27
|
+
}
|
|
28
|
+
interface CellProps {
|
|
29
|
+
date: Dayjs;
|
|
30
|
+
/** 현재 표시 중인 월과 다른 달 날짜 여부 (이전/다음 달) */
|
|
31
|
+
isOutside?: boolean;
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
className?: string;
|
|
34
|
+
dateClassName?: string;
|
|
35
|
+
}
|
|
36
|
+
declare const DataCalendarBase: {
|
|
37
|
+
Root: ({ children, className, defaultMonth, onMonthChange, }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
Title: ({ className, format }: TitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
Prev: ({ children, className }: NavButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
Next: ({ children, className }: NavButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
Grid: ({ renderCell, weekdays, className, weekdayClassName, }: GridProps) => import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
Cell: ({ date, isOutside, children, className, dateClassName, }: CellProps) => import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
};
|
|
44
|
+
export default DataCalendarBase;
|
|
45
|
+
//# sourceMappingURL=DataCalendarBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataCalendarBase.d.ts","sourceRoot":"","sources":["../../../src/components/DataCalendar/DataCalendarBase.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAID,eAAO,MAAM,sBAAsB,+BAOlC,CAAC;AAIF,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AA2BD,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD,UAAU,cAAc;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwBD,UAAU,SAAS;IACjB,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;IAC1E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAgDD,UAAU,SAAS;IACjB,IAAI,EAAE,KAAK,CAAC;IACZ,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA6BD,QAAA,MAAM,gBAAgB;kEApJnB,SAAS;mCAyBuC,UAAU;oCAYtB,cAAc;oCASd,cAAc;mEAyBlD,SAAS;qEAwDT,SAAS;CAqBoD,CAAC;AAEjE,eAAe,gBAAgB,CAAC"}
|