@loword/loword-design-system 0.0.2 → 0.0.4
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 +77 -3
- package/dist/components/BreadCrumb/BreadCrumb.d.ts +17 -0
- package/dist/components/BreadCrumb/BreadCrumb.d.ts.map +1 -0
- package/dist/components/BreadCrumb/BreadCrumb.js +37 -0
- package/dist/components/BreadCrumb/BreadCrumbBase.d.ts +9 -0
- package/dist/components/BreadCrumb/BreadCrumbBase.d.ts.map +1 -0
- package/dist/components/BreadCrumb/BreadCrumbBase.js +17 -0
- package/dist/components/Button/ButtonSpinner.d.ts +1 -2
- package/dist/components/Button/ButtonSpinner.d.ts.map +1 -1
- package/dist/components/Button/ButtonSpinner.js +3 -2
- package/dist/components/Callout/Callout.d.ts +10 -0
- package/dist/components/Callout/Callout.d.ts.map +1 -0
- package/dist/components/Callout/Callout.js +6 -0
- package/dist/components/Callout/CalloutBase.d.ts +18 -0
- package/dist/components/Callout/CalloutBase.d.ts.map +1 -0
- package/dist/components/Callout/CalloutBase.js +21 -0
- package/dist/components/Divider/Divider.d.ts +9 -0
- package/dist/components/Divider/Divider.d.ts.map +1 -0
- package/dist/components/Divider/Divider.js +11 -0
- package/dist/components/Divider/DividerBase.d.ts +9 -0
- package/dist/components/Divider/DividerBase.d.ts.map +1 -0
- package/dist/components/Divider/DividerBase.js +9 -0
- package/dist/components/FileUpload/FileUploadBase.d.ts +5 -5
- package/dist/components/FileUpload/FileUploadBase.d.ts.map +1 -1
- package/dist/components/FileUpload/FileUploadBase.js +4 -4
- package/dist/components/Form/FormField.d.ts +2 -2
- package/dist/components/LDAvatar/AvatarBase.d.ts +32 -0
- package/dist/components/LDAvatar/AvatarBase.d.ts.map +1 -0
- package/dist/components/LDAvatar/AvatarBase.js +49 -0
- package/dist/components/LDAvatar/LDAvatar.d.ts +11 -0
- package/dist/components/LDAvatar/LDAvatar.d.ts.map +1 -0
- package/dist/components/LDAvatar/LDAvatar.js +24 -0
- package/dist/components/LDBadge/BadgeBase.d.ts +10 -0
- package/dist/components/LDBadge/BadgeBase.d.ts.map +1 -0
- package/dist/components/LDBadge/BadgeBase.js +9 -0
- package/dist/components/LDBadge/LDBadge.d.ts +25 -0
- package/dist/components/LDBadge/LDBadge.d.ts.map +1 -0
- package/dist/components/LDBadge/LDBadge.js +36 -0
- package/dist/components/LDBreadCrumb/BreadCrumbBase.d.ts +9 -0
- package/dist/components/LDBreadCrumb/BreadCrumbBase.d.ts.map +1 -0
- package/dist/components/LDBreadCrumb/BreadCrumbBase.js +17 -0
- package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts +17 -0
- package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts.map +1 -0
- package/dist/components/LDBreadCrumb/LDBreadCrumb.js +37 -0
- package/dist/components/LDButton/ButtonBase.d.ts +5 -0
- package/dist/components/LDButton/ButtonBase.d.ts.map +1 -0
- package/dist/components/LDButton/ButtonBase.js +10 -0
- package/dist/components/LDButton/ButtonSpinner.d.ts +8 -0
- package/dist/components/LDButton/ButtonSpinner.d.ts.map +1 -0
- package/dist/components/LDButton/ButtonSpinner.js +15 -0
- package/dist/components/LDButton/LDButton.d.ts +26 -0
- package/dist/components/LDButton/LDButton.d.ts.map +1 -0
- package/dist/components/LDButton/LDButton.js +102 -0
- package/dist/components/LDCalendar/LDCalendar.d.ts +16 -0
- package/dist/components/LDCalendar/LDCalendar.d.ts.map +1 -0
- package/dist/components/LDCalendar/LDCalendar.js +75 -0
- package/dist/components/LDCallout/CalloutBase.d.ts +18 -0
- package/dist/components/LDCallout/CalloutBase.d.ts.map +1 -0
- package/dist/components/LDCallout/CalloutBase.js +21 -0
- package/dist/components/LDCallout/LDCallout.d.ts +10 -0
- package/dist/components/LDCallout/LDCallout.d.ts.map +1 -0
- package/dist/components/LDCallout/LDCallout.js +6 -0
- package/dist/components/LDCarousel/CarouselBase.d.ts +98 -0
- package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -0
- package/dist/components/LDCarousel/CarouselBase.js +144 -0
- package/dist/components/LDCarousel/LDCarousel.d.ts +50 -0
- package/dist/components/LDCarousel/LDCarousel.d.ts.map +1 -0
- package/dist/components/LDCarousel/LDCarousel.js +22 -0
- package/dist/components/LDCheckbox/CheckboxBase.d.ts +40 -0
- package/dist/components/LDCheckbox/CheckboxBase.d.ts.map +1 -0
- package/dist/components/LDCheckbox/CheckboxBase.js +57 -0
- package/dist/components/LDCheckbox/FormCheckbox.d.ts +14 -0
- package/dist/components/LDCheckbox/FormCheckbox.d.ts.map +1 -0
- package/dist/components/LDCheckbox/FormCheckbox.js +9 -0
- package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts +13 -0
- package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts.map +1 -0
- package/dist/components/LDCheckbox/FormCheckboxGroup.js +9 -0
- package/dist/components/LDCheckbox/LDCheckbox.d.ts +27 -0
- package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -0
- package/dist/components/LDCheckbox/LDCheckbox.js +30 -0
- package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts +22 -0
- package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts.map +1 -0
- package/dist/components/LDCheckbox/LDCheckboxGroup.js +13 -0
- package/dist/components/LDDataCalendar/DataCalendarBase.d.ts +45 -0
- package/dist/components/LDDataCalendar/DataCalendarBase.d.ts.map +1 -0
- package/dist/components/LDDataCalendar/DataCalendarBase.js +57 -0
- package/dist/components/LDDataCalendar/LDDataCalendar.d.ts +12 -0
- package/dist/components/LDDataCalendar/LDDataCalendar.d.ts.map +1 -0
- package/dist/components/LDDataCalendar/LDDataCalendar.js +13 -0
- package/dist/components/LDDatePicker/FormDatePicker.d.ts +12 -0
- package/dist/components/LDDatePicker/FormDatePicker.d.ts.map +1 -0
- package/dist/components/LDDatePicker/FormDatePicker.js +12 -0
- package/dist/components/LDDatePicker/LDDatePicker.d.ts +34 -0
- package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -0
- package/dist/components/LDDatePicker/LDDatePicker.js +44 -0
- package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts +12 -0
- package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts.map +1 -0
- package/dist/components/LDDateRangePicker/FormDateRangePicker.js +10 -0
- package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts +49 -0
- package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -0
- package/dist/components/LDDateRangePicker/LDDateRangePicker.js +197 -0
- package/dist/components/LDDivider/DividerBase.d.ts +9 -0
- package/dist/components/LDDivider/DividerBase.d.ts.map +1 -0
- package/dist/components/LDDivider/DividerBase.js +9 -0
- package/dist/components/LDDivider/LDDivider.d.ts +9 -0
- package/dist/components/LDDivider/LDDivider.d.ts.map +1 -0
- package/dist/components/LDDivider/LDDivider.js +11 -0
- package/dist/components/LDDrawer/DrawerBase.d.ts +52 -0
- package/dist/components/LDDrawer/DrawerBase.d.ts.map +1 -0
- package/dist/components/LDDrawer/DrawerBase.js +38 -0
- package/dist/components/LDDrawer/LDDrawer.d.ts +51 -0
- package/dist/components/LDDrawer/LDDrawer.d.ts.map +1 -0
- package/dist/components/LDDrawer/LDDrawer.js +30 -0
- package/dist/components/LDEditor/EditorBase.d.ts +52 -0
- package/dist/components/LDEditor/EditorBase.d.ts.map +1 -0
- package/dist/components/LDEditor/EditorBase.js +89 -0
- package/dist/components/LDEditor/LDEditor.d.ts +12 -0
- package/dist/components/LDEditor/LDEditor.d.ts.map +1 -0
- package/dist/components/LDEditor/LDEditor.js +162 -0
- package/dist/components/LDEditor/LDViewer.d.ts +7 -0
- package/dist/components/LDEditor/LDViewer.d.ts.map +1 -0
- package/dist/components/LDEditor/LDViewer.js +9 -0
- package/dist/components/LDEditor/extensions.d.ts +6 -0
- package/dist/components/LDEditor/extensions.d.ts.map +1 -0
- package/dist/components/LDEditor/extensions.js +38 -0
- package/dist/components/LDFileUpload/LDFileUploadBase.d.ts +50 -0
- package/dist/components/LDFileUpload/LDFileUploadBase.d.ts.map +1 -0
- package/dist/components/LDFileUpload/LDFileUploadBase.js +102 -0
- package/dist/components/LDInput/FormInput.d.ts +15 -0
- package/dist/components/LDInput/FormInput.d.ts.map +1 -0
- package/dist/components/LDInput/FormInput.js +19 -0
- package/dist/components/LDInput/InputBase.d.ts +22 -0
- package/dist/components/LDInput/InputBase.d.ts.map +1 -0
- package/dist/components/LDInput/InputBase.js +17 -0
- package/dist/components/LDInput/LDInput.d.ts +24 -0
- package/dist/components/LDInput/LDInput.d.ts.map +1 -0
- package/dist/components/LDInput/LDInput.js +71 -0
- package/dist/components/LDLNB/LDLNBBase.d.ts +82 -0
- package/dist/components/LDLNB/LDLNBBase.d.ts.map +1 -0
- package/dist/components/LDLNB/LDLNBBase.js +108 -0
- package/dist/components/LDLoadingDots/LDLoadingDots.d.ts +8 -0
- package/dist/components/LDLoadingDots/LDLoadingDots.d.ts.map +1 -0
- package/dist/components/LDLoadingDots/LDLoadingDots.js +29 -0
- package/dist/components/LDMenuBar/LDMenuBar.d.ts +21 -0
- package/dist/components/LDMenuBar/LDMenuBar.d.ts.map +1 -0
- package/dist/components/LDMenuBar/LDMenuBar.js +33 -0
- package/dist/components/LDMenuBar/MenuBarBase.d.ts +43 -0
- package/dist/components/LDMenuBar/MenuBarBase.d.ts.map +1 -0
- package/dist/components/LDMenuBar/MenuBarBase.js +69 -0
- package/dist/components/LDModal/LDModal.d.ts +51 -0
- package/dist/components/LDModal/LDModal.d.ts.map +1 -0
- package/dist/components/LDModal/LDModal.js +72 -0
- package/dist/components/LDModal/ModalBase.d.ts +42 -0
- package/dist/components/LDModal/ModalBase.d.ts.map +1 -0
- package/dist/components/LDModal/ModalBase.js +30 -0
- package/dist/components/LDModal/openModal.d.ts +24 -0
- package/dist/components/LDModal/openModal.d.ts.map +1 -0
- package/dist/components/LDModal/openModal.js +52 -0
- package/dist/components/LDOTPInput/LDOTPInput.d.ts +46 -0
- package/dist/components/LDOTPInput/LDOTPInput.d.ts.map +1 -0
- package/dist/components/LDOTPInput/LDOTPInput.js +87 -0
- package/dist/components/LDPagination/LDPagination.d.ts +12 -0
- package/dist/components/LDPagination/LDPagination.d.ts.map +1 -0
- package/dist/components/LDPagination/LDPagination.js +5 -0
- package/dist/components/LDPagination/PaginationBase.d.ts +36 -0
- package/dist/components/LDPagination/PaginationBase.d.ts.map +1 -0
- package/dist/components/LDPagination/PaginationBase.js +44 -0
- package/dist/components/LDPagination/paginationUtils.d.ts +2 -0
- package/dist/components/LDPagination/paginationUtils.d.ts.map +1 -0
- package/dist/components/LDPagination/paginationUtils.js +18 -0
- package/dist/components/LDPopover/LDPopover.d.ts +42 -0
- package/dist/components/LDPopover/LDPopover.d.ts.map +1 -0
- package/dist/components/LDPopover/LDPopover.js +31 -0
- package/dist/components/LDPopover/PopoverBase.d.ts +31 -0
- package/dist/components/LDPopover/PopoverBase.d.ts.map +1 -0
- package/dist/components/LDPopover/PopoverBase.js +18 -0
- package/dist/components/LDRadio/FormRadioGroup.d.ts +13 -0
- package/dist/components/LDRadio/FormRadioGroup.d.ts.map +1 -0
- package/dist/components/LDRadio/FormRadioGroup.js +9 -0
- package/dist/components/LDRadio/LDRadio.d.ts +24 -0
- package/dist/components/LDRadio/LDRadio.d.ts.map +1 -0
- package/dist/components/LDRadio/LDRadio.js +39 -0
- package/dist/components/LDRadio/LDRadioGroup.d.ts +22 -0
- package/dist/components/LDRadio/LDRadioGroup.d.ts.map +1 -0
- package/dist/components/LDRadio/LDRadioGroup.js +7 -0
- package/dist/components/LDRadio/RadioBase.d.ts +38 -0
- package/dist/components/LDRadio/RadioBase.d.ts.map +1 -0
- package/dist/components/LDRadio/RadioBase.js +46 -0
- package/dist/components/LDScrollArea/LDScrollArea.d.ts +15 -0
- package/dist/components/LDScrollArea/LDScrollArea.d.ts.map +1 -0
- package/dist/components/LDScrollArea/LDScrollArea.js +10 -0
- package/dist/components/LDSelect/FormMultiSelect.d.ts +13 -0
- package/dist/components/LDSelect/FormMultiSelect.d.ts.map +1 -0
- package/dist/components/LDSelect/FormMultiSelect.js +14 -0
- package/dist/components/LDSelect/FormSelect.d.ts +13 -0
- package/dist/components/LDSelect/FormSelect.d.ts.map +1 -0
- package/dist/components/LDSelect/FormSelect.js +10 -0
- package/dist/components/LDSelect/LDMultiSelect.d.ts +31 -0
- package/dist/components/LDSelect/LDMultiSelect.d.ts.map +1 -0
- package/dist/components/LDSelect/LDMultiSelect.js +59 -0
- package/dist/components/LDSelect/LDSelect.d.ts +41 -0
- package/dist/components/LDSelect/LDSelect.d.ts.map +1 -0
- package/dist/components/LDSelect/LDSelect.js +55 -0
- package/dist/components/LDSelect/SelectBase.d.ts +59 -0
- package/dist/components/LDSelect/SelectBase.d.ts.map +1 -0
- package/dist/components/LDSelect/SelectBase.js +211 -0
- package/dist/components/LDSkeleton/LDSkeleton.d.ts +10 -0
- package/dist/components/LDSkeleton/LDSkeleton.d.ts.map +1 -0
- package/dist/components/LDSkeleton/LDSkeleton.js +8 -0
- package/dist/components/LDSlider/LDSlider.d.ts +23 -0
- package/dist/components/LDSlider/LDSlider.d.ts.map +1 -0
- package/dist/components/LDSlider/LDSlider.js +195 -0
- package/dist/components/LDSpinner/LDSpinner.d.ts +25 -0
- package/dist/components/LDSpinner/LDSpinner.d.ts.map +1 -0
- package/dist/components/LDSpinner/LDSpinner.js +20 -0
- package/dist/components/LDTable/LDTable.d.ts +34 -0
- package/dist/components/LDTable/LDTable.d.ts.map +1 -0
- package/dist/components/LDTable/LDTable.js +29 -0
- package/dist/components/LDTable/LDTanstackTable.d.ts +23 -0
- package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -0
- package/dist/components/LDTable/LDTanstackTable.js +35 -0
- package/dist/components/LDTable/TableBase.d.ts +37 -0
- package/dist/components/LDTable/TableBase.d.ts.map +1 -0
- package/dist/components/LDTable/TableBase.js +39 -0
- package/dist/components/LDTable/TableField.d.ts +64 -0
- package/dist/components/LDTable/TableField.d.ts.map +1 -0
- package/dist/components/LDTable/TableField.js +87 -0
- package/dist/components/LDTimePicker/FormTimePicker.d.ts +12 -0
- package/dist/components/LDTimePicker/FormTimePicker.d.ts.map +1 -0
- package/dist/components/LDTimePicker/FormTimePicker.js +12 -0
- package/dist/components/LDTimePicker/LDTimePicker.d.ts +27 -0
- package/dist/components/LDTimePicker/LDTimePicker.d.ts.map +1 -0
- package/dist/components/LDTimePicker/LDTimePicker.js +120 -0
- package/dist/components/LDToast/LDToast.d.ts +18 -0
- package/dist/components/LDToast/LDToast.d.ts.map +1 -0
- package/dist/components/LDToast/LDToast.js +42 -0
- package/dist/components/LDToast/LDToaster.d.ts +7 -0
- package/dist/components/LDToast/LDToaster.d.ts.map +1 -0
- package/dist/components/LDToast/LDToaster.js +7 -0
- package/dist/components/LDToggleButton/FormToggleButton.d.ts +12 -0
- package/dist/components/LDToggleButton/FormToggleButton.d.ts.map +1 -0
- package/dist/components/LDToggleButton/FormToggleButton.js +9 -0
- package/dist/components/LDToggleButton/LDToggleButton.d.ts +31 -0
- package/dist/components/LDToggleButton/LDToggleButton.d.ts.map +1 -0
- package/dist/components/LDToggleButton/LDToggleButton.js +42 -0
- package/dist/components/LDToggleButton/ToggleButtonBase.d.ts +41 -0
- package/dist/components/LDToggleButton/ToggleButtonBase.d.ts.map +1 -0
- package/dist/components/LDToggleButton/ToggleButtonBase.js +59 -0
- package/dist/components/LDTooltip/LDTooltip.d.ts +18 -0
- package/dist/components/LDTooltip/LDTooltip.d.ts.map +1 -0
- package/dist/components/LDTooltip/LDTooltip.js +13 -0
- package/dist/components/LDTooltip/TooltipBase.d.ts +39 -0
- package/dist/components/LDTooltip/TooltipBase.d.ts.map +1 -0
- package/dist/components/LDTooltip/TooltipBase.js +46 -0
- package/dist/components/LNB/LNBBase.js +2 -2
- package/dist/components/Spinner/Spinner.d.ts +1 -1
- package/dist/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner/Spinner.js +1 -1
- package/dist/index.css +115 -13
- package/dist/index.d.ts +52 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +88 -82
- package/package.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import ModalBase from './ModalBase.js';
|
|
4
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
+
import cn from '../../utils/cn.js';
|
|
6
|
+
import LDButton from '../LDButton/LDButton.js';
|
|
7
|
+
// ── 스타일 매핑 ──
|
|
8
|
+
const sizeClasses = {
|
|
9
|
+
small: 'modal-sm',
|
|
10
|
+
medium: 'modal-md',
|
|
11
|
+
large: 'modal-lg',
|
|
12
|
+
xlarge: 'modal-xl',
|
|
13
|
+
};
|
|
14
|
+
const buttonSizeClasses = {
|
|
15
|
+
small: 'medium',
|
|
16
|
+
medium: 'large',
|
|
17
|
+
large: 'large',
|
|
18
|
+
xlarge: 'large',
|
|
19
|
+
};
|
|
20
|
+
const buttonsGapSizeClasses = {
|
|
21
|
+
small: 'gap-xs',
|
|
22
|
+
medium: 'gap-sm',
|
|
23
|
+
large: 'gap-sm',
|
|
24
|
+
xlarge: 'gap-sm',
|
|
25
|
+
};
|
|
26
|
+
const layoutGapSizeClasses = {
|
|
27
|
+
small: 'gap-lg',
|
|
28
|
+
medium: 'gap-xl',
|
|
29
|
+
large: 'gap-xl',
|
|
30
|
+
xlarge: 'gap-xl',
|
|
31
|
+
};
|
|
32
|
+
const noHeaderPaddingTopSizeClasses = {
|
|
33
|
+
small: 'pt-lg',
|
|
34
|
+
medium: 'pt-xl',
|
|
35
|
+
large: 'pt-xl',
|
|
36
|
+
xlarge: 'pt-xl',
|
|
37
|
+
};
|
|
38
|
+
const statusIconSizeClasses = {
|
|
39
|
+
small: 'size-10',
|
|
40
|
+
medium: 'size-12.5',
|
|
41
|
+
large: 'size-12.5',
|
|
42
|
+
xlarge: 'size-12.5',
|
|
43
|
+
};
|
|
44
|
+
const LDModal = ({ open, defaultOpen, onOpenChange, name, title, description, children, size = 'small', icon, buttons, scrollBehavior = 'inside', className, style, onButtonClick, }) => {
|
|
45
|
+
const overlayRef = useRef(false);
|
|
46
|
+
const hasHeader = name || title || description || icon;
|
|
47
|
+
const handleClick = async (button) => {
|
|
48
|
+
if (button.onClick) {
|
|
49
|
+
const res = await button.onClick();
|
|
50
|
+
if (res === false)
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
onButtonClick?.(button.value);
|
|
54
|
+
onOpenChange?.(false);
|
|
55
|
+
};
|
|
56
|
+
return (_jsxs(ModalBase.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange, children: [_jsx(ModalBase.Overlay, {}), _jsx(ModalBase.Content, { className: cn({
|
|
57
|
+
['top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2']: scrollBehavior === 'inside',
|
|
58
|
+
['inset-0 overflow-y-auto flex justify-center items-start py-20']: scrollBehavior === 'outside',
|
|
59
|
+
}), onMouseDown: (e) => (overlayRef.current = e.target === e.currentTarget), onClick: (e) => {
|
|
60
|
+
if (scrollBehavior === 'outside' &&
|
|
61
|
+
e.target === e.currentTarget &&
|
|
62
|
+
overlayRef.current)
|
|
63
|
+
onOpenChange?.(false);
|
|
64
|
+
overlayRef.current = false;
|
|
65
|
+
}, children: _jsxs("div", { className: cn('relative bg-white rounded-2xl p-5', sizeClasses[size], 'mobile:max-w-[calc(100vw-40px)]', scrollBehavior === 'inside' &&
|
|
66
|
+
'flex flex-col overflow-y-auto max-h-[90dvh]', className), style: style, onClick: (e) => e.stopPropagation(), children: [_jsx(ModalBase.Close, { className: "absolute top-4 right-5 text-neutral500 cursor-pointer outline-hidden", children: _jsx(LDButton, { variant: "ghost", color: "neutral", leftIcon: "x", compact: true }) }), _jsxs("div", { className: cn('w-full flex flex-col shrink-0', scrollBehavior === 'inside' && 'flex-1 min-h-0', layoutGapSizeClasses[size], !hasHeader && noHeaderPaddingTopSizeClasses[size]), children: [hasHeader && (_jsxs("div", { className: "w-full flex gap-5 py-5 items-center flex-col text-center shrink-0", children: [icon === 'success' && (_jsx("div", { className: cn('flex items-center justify-center rounded-full bg-hyper-blue', statusIconSizeClasses[size]), children: _jsx(LucideIcon, { name: "check", className: "text-white" }) })), icon === 'fail' && (_jsx("div", { className: cn('flex items-center justify-center rounded-full bg-danger600', statusIconSizeClasses[size]), children: _jsx(LucideIcon, { name: "circleAlert", className: "text-white" }) })), name && (_jsx("span", { className: "display16 bold text-neutral500 whitespace-pre-wrap", children: name })), title && (_jsx(ModalBase.Title, { className: "display28 bold whitespace-pre-wrap text-center", children: title })), description && (_jsx(ModalBase.Description, { className: "display14 text-neutral500 whitespace-pre-wrap text-center", children: description }))] })), children && (_jsx("div", { className: cn(scrollBehavior === 'inside' &&
|
|
67
|
+
'flex-1 min-h-10 overflow-y-auto'), children: children })), buttons?.list && buttons?.list?.length > 0 && (_jsx("div", { className: cn('flex mobile:flex-1 mobile:flex-col mobile:items-center', buttons.direction === 'column' ? 'flex-col' : 'flex-row', buttonsGapSizeClasses[size]), children: buttons?.list?.map((button, index) => {
|
|
68
|
+
const isFirst = index === 0;
|
|
69
|
+
return (_jsx("div", { className: "flex flex-1 w-full", children: _jsx(LDButton, { type: "button", onClick: () => handleClick(button), variant: button.variant ?? (isFirst ? 'solid' : 'outline'), color: button.color ?? (isFirst ? 'point' : 'neutral'), size: buttonSizeClasses[size], block: true, children: button.label }) }, String(button.value)));
|
|
70
|
+
}) }))] })] }) })] }));
|
|
71
|
+
};
|
|
72
|
+
export default LDModal;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
interface RootProps {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
defaultOpen?: boolean;
|
|
5
|
+
onOpenChange?: (open: boolean) => void;
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
interface OverlayProps {
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
interface ContentProps {
|
|
12
|
+
className?: string;
|
|
13
|
+
children?: ReactNode;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
onClick?: React.MouseEventHandler<HTMLElement>;
|
|
16
|
+
onMouseDown?: React.MouseEventHandler<HTMLElement>;
|
|
17
|
+
onPointerDownOutside?: (e: Event) => void;
|
|
18
|
+
onEscapeKeyDown?: (e: KeyboardEvent) => void;
|
|
19
|
+
}
|
|
20
|
+
interface CloseProps {
|
|
21
|
+
asChild?: boolean;
|
|
22
|
+
className?: string;
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
interface TitleProps {
|
|
26
|
+
className?: string;
|
|
27
|
+
children?: ReactNode;
|
|
28
|
+
}
|
|
29
|
+
interface DescriptionProps {
|
|
30
|
+
className?: string;
|
|
31
|
+
children?: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
export declare const ModalBase: {
|
|
34
|
+
Root: ({ open, defaultOpen, onOpenChange, children }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
Overlay: ({ className }: OverlayProps) => import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
Content: ({ className, children, style, onClick, onMouseDown, onPointerDownOutside, onEscapeKeyDown, }: ContentProps) => import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
Close: ({ asChild, className, children }: CloseProps) => import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
Title: ({ className, children }: TitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
Description: ({ className, children }: DescriptionProps) => import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
};
|
|
41
|
+
export default ModalBase;
|
|
42
|
+
//# sourceMappingURL=ModalBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDModal/ModalBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAeD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAiBD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnD,oBAAoB,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CAC9C;AAgCD,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAWD,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAOD,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAQD,eAAO,MAAM,SAAS;0DA5GuC,SAAS;6BAiBtC,YAAY;4GAiCzC,YAAY;8CA4BkC,UAAU;qCAcnB,UAAU;2CAUJ,gBAAgB;CAa7D,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as Dialog from '@radix-ui/react-dialog';
|
|
3
|
+
import cn from '../../utils/cn.js';
|
|
4
|
+
const Root = ({ open, defaultOpen, onOpenChange, children }) => {
|
|
5
|
+
return (_jsx(Dialog.Root, { open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange, children: children }));
|
|
6
|
+
};
|
|
7
|
+
const Overlay = ({ className }) => {
|
|
8
|
+
return (_jsx(Dialog.Portal, { children: _jsx(Dialog.Overlay, { className: cn('fixed inset-0 z-50 bg-black/30', 'data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out', className) }) }));
|
|
9
|
+
};
|
|
10
|
+
const Content = ({ className, children, style, onClick, onMouseDown, onPointerDownOutside, onEscapeKeyDown, }) => {
|
|
11
|
+
return (_jsx(Dialog.Portal, { children: _jsx(Dialog.Content, { className: cn('fixed z-50', 'data-[state=open]:animate-fade-in data-[state=closed]:animate-fade-out', className), style: style, onClick: onClick, onMouseDown: onMouseDown, onPointerDownOutside: onPointerDownOutside, onEscapeKeyDown: onEscapeKeyDown, children: children }) }));
|
|
12
|
+
};
|
|
13
|
+
const Close = ({ asChild, className, children }) => {
|
|
14
|
+
return (_jsx(Dialog.Close, { asChild: asChild, className: className, children: children }));
|
|
15
|
+
};
|
|
16
|
+
const Title = ({ className, children }) => {
|
|
17
|
+
return _jsx(Dialog.Title, { className: className, children: children });
|
|
18
|
+
};
|
|
19
|
+
const Description = ({ className, children }) => {
|
|
20
|
+
return (_jsx(Dialog.Description, { className: className, children: children }));
|
|
21
|
+
};
|
|
22
|
+
export const ModalBase = {
|
|
23
|
+
Root,
|
|
24
|
+
Overlay,
|
|
25
|
+
Content,
|
|
26
|
+
Close,
|
|
27
|
+
Title,
|
|
28
|
+
Description,
|
|
29
|
+
};
|
|
30
|
+
export default ModalBase;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ModalSize } from './LDModal.js';
|
|
2
|
+
interface ModalOptions<T = undefined> {
|
|
3
|
+
name?: string;
|
|
4
|
+
title?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
content?: React.ReactNode | ((args: {
|
|
7
|
+
onClose: (value?: T) => void;
|
|
8
|
+
}) => React.ReactNode);
|
|
9
|
+
buttons?: {
|
|
10
|
+
value: T;
|
|
11
|
+
label: string;
|
|
12
|
+
variant?: 'solid' | 'outline' | 'ghost';
|
|
13
|
+
color?: 'neutral' | 'point' | 'danger';
|
|
14
|
+
onClick?: () => void | boolean | Promise<void | boolean>;
|
|
15
|
+
}[];
|
|
16
|
+
/** 버튼 배치 방향 */
|
|
17
|
+
buttonsDirection?: 'row' | 'column';
|
|
18
|
+
size?: ModalSize;
|
|
19
|
+
icon?: 'success' | 'fail';
|
|
20
|
+
onBeforeClose?: () => Promise<boolean> | boolean;
|
|
21
|
+
}
|
|
22
|
+
declare const modal: <T = undefined>(options: ModalOptions<T>) => Promise<T | undefined>;
|
|
23
|
+
export default modal;
|
|
24
|
+
//# sourceMappingURL=openModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openModal.d.ts","sourceRoot":"","sources":["../../../src/components/LDModal/openModal.tsx"],"names":[],"mappings":"AACA,OAAgB,EAAoB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtE,UAAU,YAAY,CAAC,CAAC,GAAG,SAAS;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EACJ,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAClE,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC;QACT,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;QACxC,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;KAC1D,EAAE,CAAC;IACJ,eAAe;IACf,gBAAgB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACpC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClD;AAED,QAAA,MAAM,KAAK,GAAI,CAAC,GAAG,SAAS,EAC1B,SAAS,YAAY,CAAC,CAAC,CAAC,KACvB,OAAO,CAAC,CAAC,GAAG,SAAS,CAgEvB,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createRoot } from 'react-dom/client';
|
|
3
|
+
import LDModal from './LDModal.js';
|
|
4
|
+
const modal = (options) => {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
|
+
const container = document.createElement('div');
|
|
7
|
+
document.body.appendChild(container);
|
|
8
|
+
const root = createRoot(container);
|
|
9
|
+
const cleanup = () => {
|
|
10
|
+
root.unmount();
|
|
11
|
+
container.remove();
|
|
12
|
+
};
|
|
13
|
+
const handleClose = async (value) => {
|
|
14
|
+
try {
|
|
15
|
+
if (options.onBeforeClose) {
|
|
16
|
+
const canClose = await options.onBeforeClose();
|
|
17
|
+
if (!canClose)
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
console.error('onBeforeClose error:', e);
|
|
23
|
+
}
|
|
24
|
+
cleanup();
|
|
25
|
+
resolve(value);
|
|
26
|
+
};
|
|
27
|
+
const list = options.buttons?.map((btn) => ({
|
|
28
|
+
...btn,
|
|
29
|
+
value: btn.value,
|
|
30
|
+
onClick: async () => {
|
|
31
|
+
let shouldClose = true;
|
|
32
|
+
if (btn.onClick) {
|
|
33
|
+
const res = await btn.onClick();
|
|
34
|
+
if (res === false)
|
|
35
|
+
shouldClose = false;
|
|
36
|
+
}
|
|
37
|
+
if (shouldClose) {
|
|
38
|
+
handleClose(btn.value);
|
|
39
|
+
}
|
|
40
|
+
return false; // LDModal 내부의 기본 닫기 동작 방지
|
|
41
|
+
},
|
|
42
|
+
}));
|
|
43
|
+
const content = typeof options.content === 'function'
|
|
44
|
+
? options.content({ onClose: handleClose })
|
|
45
|
+
: options.content;
|
|
46
|
+
root.render(_jsx(LDModal, { open: true, onOpenChange: (open) => {
|
|
47
|
+
if (!open)
|
|
48
|
+
handleClose(undefined);
|
|
49
|
+
}, name: options.name, title: options.title, description: options.description, size: options.size, icon: options.icon, buttons: list ? { direction: options.buttonsDirection, list } : undefined, children: content }));
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
export default modal;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type OTPInputSize = 'xSmall' | 'small' | 'medium' | 'large' | 'xLarge';
|
|
3
|
+
export type OTPInputVariant = 'filled' | 'outline' | 'ghost';
|
|
4
|
+
export interface LDOTPInputProps {
|
|
5
|
+
maxLength: number;
|
|
6
|
+
value: string;
|
|
7
|
+
onChange: (value: string) => void;
|
|
8
|
+
onComplete?: (value: string) => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
isInvalid?: boolean;
|
|
11
|
+
variant?: OTPInputVariant;
|
|
12
|
+
size?: OTPInputSize;
|
|
13
|
+
className?: string;
|
|
14
|
+
children: React.ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* LDOTPInput (Root)
|
|
18
|
+
* 실제 입력을 처리하는 Hidden LDInput과 상태를 관리합니다.
|
|
19
|
+
*/
|
|
20
|
+
declare const LDOTPInput: ({ maxLength, value, onChange, onComplete, disabled, isInvalid, variant, size, className, children, }: LDOTPInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
/**
|
|
22
|
+
* OTPInputGroup
|
|
23
|
+
* 슬롯들을 묶어주는 컨테이너입니다.
|
|
24
|
+
*/
|
|
25
|
+
declare const OTPInputGroup: ({ className, children, }: {
|
|
26
|
+
className?: string;
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
/**
|
|
30
|
+
* OTPInputSlot
|
|
31
|
+
* 개별 글자를 보여주는 칸입니다.
|
|
32
|
+
*/
|
|
33
|
+
declare const OTPInputSlot: ({ index, className, }: {
|
|
34
|
+
index: number;
|
|
35
|
+
className?: string;
|
|
36
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
/**
|
|
38
|
+
* OTPInputSeparator
|
|
39
|
+
* 그룹 사이의 구분선입니다.
|
|
40
|
+
*/
|
|
41
|
+
declare const OTPInputSeparator: ({ className }: {
|
|
42
|
+
className?: string;
|
|
43
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export { LDOTPInput, OTPInputGroup, OTPInputSlot, OTPInputSeparator };
|
|
45
|
+
export default LDOTPInput;
|
|
46
|
+
//# sourceMappingURL=LDOTPInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LDOTPInput.d.ts","sourceRoot":"","sources":["../../../src/components/LDOTPInput/LDOTPInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAMN,MAAM,OAAO,CAAC;AA2Bf,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAkBD;;;GAGG;AACH,QAAA,MAAM,UAAU,GAAI,sGAWjB,eAAe,4CA4DjB,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,aAAa,GAAI,0BAGpB;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,4CAIA,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,YAAY,GAAI,uBAGnB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,4CA0BA,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,iBAAiB,GAAI,eAAe;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,4CAE/D,CAAC;AAGF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC;AACtE,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRef, useState, useContext, createContext, useEffect, } from 'react';
|
|
4
|
+
import cn from '../../utils/cn.js';
|
|
5
|
+
const OTPInputContext = createContext(null);
|
|
6
|
+
function useOTPInputContext() {
|
|
7
|
+
const context = useContext(OTPInputContext);
|
|
8
|
+
if (!context) {
|
|
9
|
+
throw new Error('LDOTPInput 하위 컴포넌트는 LDOTPInput 안에서 사용되어야 합니다.');
|
|
10
|
+
}
|
|
11
|
+
return context;
|
|
12
|
+
}
|
|
13
|
+
const sizeClasses = {
|
|
14
|
+
xSmall: 'w-[16px] h-[16px] display10',
|
|
15
|
+
small: 'w-[24px] h-[24px] display12',
|
|
16
|
+
medium: 'w-[32px] h-[32px] display14',
|
|
17
|
+
large: 'w-[40px] h-[40px] display16',
|
|
18
|
+
xLarge: 'w-[64px] h-[64px] display20',
|
|
19
|
+
};
|
|
20
|
+
const variantClasses = {
|
|
21
|
+
filled: 'bg-lb50 border-2 border-transparent text-lb900',
|
|
22
|
+
outline: 'bg-transparent border border-mono200',
|
|
23
|
+
ghost: 'bg-transparent border-b-2 border-mono200 rounded-none',
|
|
24
|
+
};
|
|
25
|
+
// ── Components ──
|
|
26
|
+
/**
|
|
27
|
+
* LDOTPInput (Root)
|
|
28
|
+
* 실제 입력을 처리하는 Hidden LDInput과 상태를 관리합니다.
|
|
29
|
+
*/
|
|
30
|
+
const LDOTPInput = ({ maxLength, value, onChange, onComplete, disabled = false, isInvalid = false, variant = 'outline', size = 'medium', className, children, }) => {
|
|
31
|
+
const inputRef = useRef(null);
|
|
32
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
33
|
+
const [focusedIndex, setFocusedIndex] = useState(-1);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (isFocused) {
|
|
36
|
+
setFocusedIndex(value.length);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
setFocusedIndex(-1);
|
|
40
|
+
}
|
|
41
|
+
}, [value, isFocused]);
|
|
42
|
+
const handleInputChange = (e) => {
|
|
43
|
+
const newValue = e.target.value
|
|
44
|
+
.replace(/[^0-9a-zA-Z]/g, '')
|
|
45
|
+
.slice(0, maxLength);
|
|
46
|
+
onChange(newValue);
|
|
47
|
+
if (newValue.length === maxLength && onComplete) {
|
|
48
|
+
onComplete(newValue);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return (_jsx(OTPInputContext.Provider, { value: {
|
|
52
|
+
value,
|
|
53
|
+
maxLength,
|
|
54
|
+
focusedIndex,
|
|
55
|
+
isInvalid,
|
|
56
|
+
disabled,
|
|
57
|
+
size,
|
|
58
|
+
variant,
|
|
59
|
+
}, children: _jsxs("div", { className: cn('relative flex items-center gap-2 cursor-text select-none', disabled && 'opacity-50 cursor-not-allowed', className), onClick: () => !disabled && inputRef.current?.focus(), children: [_jsx("input", { ref: inputRef, type: "text", inputMode: "numeric", autoComplete: "one-time-code", value: value, onChange: handleInputChange, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), disabled: disabled, className: "absolute inset-0 opacity-0 cursor-default pointer-events-none" }), children] }) }));
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* OTPInputGroup
|
|
63
|
+
* 슬롯들을 묶어주는 컨테이너입니다.
|
|
64
|
+
*/
|
|
65
|
+
const OTPInputGroup = ({ className, children, }) => {
|
|
66
|
+
return (_jsx("div", { className: cn('flex items-center gap-2', className), children: children }));
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* OTPInputSlot
|
|
70
|
+
* 개별 글자를 보여주는 칸입니다.
|
|
71
|
+
*/
|
|
72
|
+
const OTPInputSlot = ({ index, className, }) => {
|
|
73
|
+
const { value, focusedIndex, isInvalid, variant, size, disabled } = useOTPInputContext();
|
|
74
|
+
const char = value[index];
|
|
75
|
+
const isActive = focusedIndex === index;
|
|
76
|
+
return (_jsxs("div", { className: cn('relative flex items-center justify-center font-bold transition-all rounded-[5px]', sizeClasses[size], variantClasses[variant], isActive && 'border-lb500 ring-2 ring-lb500/20', isActive && variant === 'filled' && 'bg-white', isActive && variant === 'ghost' && 'border-lb500', isInvalid && 'border-danger500 text-danger500 bg-tintRed', className), children: [char, isActive && !disabled && (_jsx("div", { className: "absolute inset-y-1/4 w-[2px] bg-lb500 animate-pulse" }))] }));
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* OTPInputSeparator
|
|
80
|
+
* 그룹 사이의 구분선입니다.
|
|
81
|
+
*/
|
|
82
|
+
const OTPInputSeparator = ({ className }) => {
|
|
83
|
+
return _jsx("div", { className: cn('w-2 h-[2px] bg-mono300 mx-1', className) });
|
|
84
|
+
};
|
|
85
|
+
// ── Export ──
|
|
86
|
+
export { LDOTPInput, OTPInputGroup, OTPInputSlot, OTPInputSeparator };
|
|
87
|
+
export default LDOTPInput;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
export interface LDPaginationProps {
|
|
3
|
+
currentPage: number;
|
|
4
|
+
totalPages: number;
|
|
5
|
+
onPageChange: (page: number) => void;
|
|
6
|
+
numbersToShow?: number;
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: React.CSSProperties;
|
|
9
|
+
}
|
|
10
|
+
declare const LDPagination: ({ currentPage, totalPages, onPageChange, numbersToShow, className, style, }: LDPaginationProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export default LDPagination;
|
|
12
|
+
//# sourceMappingURL=LDPagination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LDPagination.d.ts","sourceRoot":"","sources":["../../../src/components/LDPagination/LDPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,YAAY,GAAI,6EAOnB,iBAAiB,4CAYnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import PaginationBase from './PaginationBase.js';
|
|
3
|
+
import cn from '../../utils/cn.js';
|
|
4
|
+
const LDPagination = ({ currentPage, totalPages, onPageChange, numbersToShow = 5, className, style, }) => (_jsx(PaginationBase.Provider, { currentPage: currentPage, totalPages: totalPages, onPageChange: onPageChange, children: _jsxs(PaginationBase.Root, { className: cn('py-5', className), style: style, children: [_jsx(PaginationBase.Prev, {}), _jsx(PaginationBase.List, { numbersToShow: numbersToShow }), _jsx(PaginationBase.Next, {})] }) }));
|
|
5
|
+
export default LDPagination;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
interface ProviderProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
currentPage: number;
|
|
5
|
+
totalPages: number;
|
|
6
|
+
onPageChange: (page: number) => void;
|
|
7
|
+
}
|
|
8
|
+
interface RootProps extends HTMLAttributes<HTMLElement> {
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
interface PrevProps {
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
interface NextProps {
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
interface ListProps {
|
|
18
|
+
numbersToShow?: number;
|
|
19
|
+
className?: string;
|
|
20
|
+
}
|
|
21
|
+
interface ItemProps {
|
|
22
|
+
page: number;
|
|
23
|
+
isActive?: boolean;
|
|
24
|
+
onClick?: () => void;
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
declare const PaginationBase: {
|
|
28
|
+
Provider: ({ children, currentPage, totalPages, onPageChange, }: ProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
Root: ({ className, children, ...props }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
Prev: ({ className }: PrevProps) => import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
Next: ({ className }: NextProps) => import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
List: ({ numbersToShow, className }: ListProps) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
Item: ({ page, isActive, onClick, className }: ItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
};
|
|
35
|
+
export default PaginationBase;
|
|
36
|
+
//# sourceMappingURL=PaginationBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaginationBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDPagination/PaginationBase.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA0BvD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAeD,UAAU,SAAU,SAAQ,cAAc,CAAC,WAAW,CAAC;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAcD,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,UAAU,SAAS;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,UAAU,SAAS;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,QAAA,MAAM,cAAc;qEA1IjB,aAAa;8CAYiC,SAAS;0BAgB7B,SAAS;0BA+BT,SAAS;yCAgCU,SAAS;mDA+BH,SAAS;CAuB9D,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
import cn from '../../utils/cn.js';
|
|
4
|
+
import LDButton from '../LDButton/LDButton.js';
|
|
5
|
+
import { calculatePaginationOptions } from './paginationUtils.js';
|
|
6
|
+
const PaginationContext = createContext(null);
|
|
7
|
+
const usePaginationContext = () => {
|
|
8
|
+
const ctx = useContext(PaginationContext);
|
|
9
|
+
if (!ctx)
|
|
10
|
+
throw new Error('PaginationBase 서브컴포넌트는 PaginationBase.Provider 내부에서 사용해야 합니다.');
|
|
11
|
+
return ctx;
|
|
12
|
+
};
|
|
13
|
+
const Provider = ({ children, currentPage, totalPages, onPageChange, }) => (_jsx(PaginationContext, { value: { currentPage, totalPages, onPageChange }, children: children }));
|
|
14
|
+
const Root = ({ className, children, ...props }) => (_jsx("nav", { role: "navigation", "aria-label": "pagination", className: cn('flex flex-row gap-2.5 items-center', className), ...props, children: children }));
|
|
15
|
+
const Prev = ({ className }) => {
|
|
16
|
+
const { currentPage, onPageChange } = usePaginationContext();
|
|
17
|
+
const canPrevious = currentPage > 1;
|
|
18
|
+
return (_jsx(LDButton, { variant: "outline", color: "neutral", size: "medium", shape: "capsule", leftIcon: "chevronLeft", disabled: !canPrevious, onClick: () => onPageChange(currentPage - 1), "aria-label": "\uC774\uC804 \uD398\uC774\uC9C0", className: cn('size-lg! regular! p-0!', canPrevious
|
|
19
|
+
? 'bg-neutral100! text-neutral400!'
|
|
20
|
+
: 'bg-neutral50! text-neutral200!', canPrevious && 'hover:bg-neutral200!', className) }));
|
|
21
|
+
};
|
|
22
|
+
const Next = ({ className }) => {
|
|
23
|
+
const { currentPage, totalPages, onPageChange } = usePaginationContext();
|
|
24
|
+
const canNext = currentPage < totalPages;
|
|
25
|
+
return (_jsx(LDButton, { variant: "outline", color: "neutral", size: "medium", shape: "capsule", leftIcon: "chevronRight", disabled: !canNext, onClick: () => onPageChange(currentPage + 1), "aria-label": "\uB2E4\uC74C \uD398\uC774\uC9C0", className: cn('size-lg! regular! p-0!', canNext
|
|
26
|
+
? 'bg-neutral100! text-neutral400!'
|
|
27
|
+
: 'bg-neutral50! text-neutral200!', canNext && 'hover:bg-neutral200!', className) }));
|
|
28
|
+
};
|
|
29
|
+
const List = ({ numbersToShow = 5, className }) => {
|
|
30
|
+
const { currentPage, totalPages, onPageChange } = usePaginationContext();
|
|
31
|
+
const pages = calculatePaginationOptions(currentPage, totalPages, numbersToShow);
|
|
32
|
+
return (_jsx(_Fragment, { children: pages.map((page, idx) => (_jsx(Item, { page: page, isActive: currentPage === page, onClick: () => onPageChange(page), className: className }, `page_${page}_${idx}`))) }));
|
|
33
|
+
};
|
|
34
|
+
const Item = ({ page, isActive, onClick, className }) => (_jsx(LDButton, { variant: "ghost", color: isActive ? 'point' : 'neutral', size: "medium", onClick: onClick, "aria-label": `${page} 페이지`, "aria-current": isActive ? 'page' : undefined, className: cn('size-lg! regular! rounded-full', className), children: page }));
|
|
35
|
+
// ── Export ──
|
|
36
|
+
const PaginationBase = {
|
|
37
|
+
Provider,
|
|
38
|
+
Root,
|
|
39
|
+
Prev,
|
|
40
|
+
Next,
|
|
41
|
+
List,
|
|
42
|
+
Item,
|
|
43
|
+
};
|
|
44
|
+
export default PaginationBase;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginationUtils.d.ts","sourceRoot":"","sources":["../../../src/components/LDPagination/paginationUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,GACrC,cAAa,MAAU,EACvB,aAAY,MAAU,EACtB,gBAAe,MAAU,aAuB1B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const calculatePaginationOptions = (currentPage = 1, totalPages = 1, numbersToShow = 5) => {
|
|
2
|
+
const half = Math.floor(numbersToShow / 2);
|
|
3
|
+
let startPage = currentPage - half;
|
|
4
|
+
let endPage = currentPage + half;
|
|
5
|
+
if (startPage < 1) {
|
|
6
|
+
startPage = 1;
|
|
7
|
+
endPage = Math.min(numbersToShow, totalPages);
|
|
8
|
+
}
|
|
9
|
+
if (endPage > totalPages) {
|
|
10
|
+
endPage = totalPages;
|
|
11
|
+
startPage = Math.max(1, totalPages - numbersToShow + 1);
|
|
12
|
+
}
|
|
13
|
+
const paginationOptions = [];
|
|
14
|
+
for (let i = startPage; i <= endPage; ++i) {
|
|
15
|
+
paginationOptions.push(i);
|
|
16
|
+
}
|
|
17
|
+
return paginationOptions;
|
|
18
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
type ItemColor = 'blue' | 'red' | 'gray';
|
|
3
|
+
type IconSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
export interface PopoverItem {
|
|
5
|
+
/** 메뉴 항목 텍스트 또는 ReactNode */
|
|
6
|
+
label: ReactNode;
|
|
7
|
+
/** 항목 색상 */
|
|
8
|
+
color?: ItemColor;
|
|
9
|
+
/** 항목 클릭 시 실행할 함수 */
|
|
10
|
+
onClick: () => void;
|
|
11
|
+
}
|
|
12
|
+
export interface LDPopoverProps {
|
|
13
|
+
/** 메뉴 항목 목록 (제공 시 메뉴형으로 동작) */
|
|
14
|
+
items?: PopoverItem[];
|
|
15
|
+
/** 팝오버 내부 커스텀 콘텐츠 (items보다 우선순위가 높음) */
|
|
16
|
+
content?: ReactNode;
|
|
17
|
+
/** 커스텀 트리거 요소 (미제공 시 iconSize/isHorizontal 기반 기본 말줄임표 트리거 렌더) */
|
|
18
|
+
children?: ReactNode;
|
|
19
|
+
/** 팝오버 열림 상태 (Controlled) */
|
|
20
|
+
open?: boolean;
|
|
21
|
+
/** 열림 상태 변경 핸들러 (Controlled) */
|
|
22
|
+
onOpenChange?: (open: boolean) => void;
|
|
23
|
+
/** 트리거 아이콘 크기 프리셋 (기본 트리거 사용 시) */
|
|
24
|
+
iconSize?: IconSize;
|
|
25
|
+
/** true 시 가로 말줄임표 아이콘 사용 (기본 트리거 사용 시) */
|
|
26
|
+
isHorizontal?: boolean;
|
|
27
|
+
/** 팝오버 정렬 위치 */
|
|
28
|
+
align?: 'start' | 'center' | 'end';
|
|
29
|
+
/** 트리거와 팝오버 사이 간격 (px) */
|
|
30
|
+
offset?: number;
|
|
31
|
+
/** 콘텐츠 너비 (숫자, 문자열, 혹은 'trigger'로 트리거와 일치) */
|
|
32
|
+
contentWidth?: number | string | 'trigger';
|
|
33
|
+
/** 트리거 버튼 className */
|
|
34
|
+
triggerClassName?: string;
|
|
35
|
+
/** 팝오버 콘텐츠 className */
|
|
36
|
+
popoverClassName?: string;
|
|
37
|
+
/** 인라인 스타일 (트리거 버튼에 적용) */
|
|
38
|
+
style?: React.CSSProperties;
|
|
39
|
+
}
|
|
40
|
+
declare const LDPopover: ({ items, content, children, open, onOpenChange, iconSize, isHorizontal, align, offset, contentWidth, triggerClassName, popoverClassName, style, }: LDPopoverProps) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
export default LDPopover;
|
|
42
|
+
//# sourceMappingURL=LDPopover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LDPopover.d.ts","sourceRoot":"","sources":["../../../src/components/LDPopover/LDPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,wCAAwC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gCAAgC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAeD,QAAA,MAAM,SAAS,GAAI,mJAchB,cAAc,4CA8DhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { isValidElement } from 'react';
|
|
3
|
+
import PopoverBase from './PopoverBase.js';
|
|
4
|
+
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
+
import cn from '../../utils/cn.js';
|
|
6
|
+
// ── 스타일 매핑 ──
|
|
7
|
+
const itemColorClasses = {
|
|
8
|
+
blue: 'hover:bg-tintBlue text-lb500',
|
|
9
|
+
red: 'hover:bg-tintRed text-danger600',
|
|
10
|
+
gray: 'hover:bg-mono10 text-neutral40',
|
|
11
|
+
};
|
|
12
|
+
const iconSizes = {
|
|
13
|
+
sm: 12,
|
|
14
|
+
md: 20,
|
|
15
|
+
lg: 24,
|
|
16
|
+
};
|
|
17
|
+
const LDPopover = ({ items, content, children, open, onOpenChange, iconSize = 'sm', isHorizontal = false, align = 'end', offset, contentWidth, triggerClassName, popoverClassName, style, }) => {
|
|
18
|
+
const isAsChild = isValidElement(children);
|
|
19
|
+
return (_jsxs(PopoverBase.Root, { open: open, onOpenChange: onOpenChange, children: [_jsx(PopoverBase.Trigger, { asChild: isAsChild, style: style, className: cn('flex items-center justify-center cursor-pointer ld-transition rounded-[5px] outline-none', !isAsChild && 'px-2 py-1 min-h-6 hover:bg-mono10', triggerClassName), children: isAsChild ? (children) : (_jsx(LucideIcon, { name: isHorizontal ? 'ellipsis' : 'ellipsisVertical', size: iconSizes[iconSize], className: "text-neutral40" })) }), _jsx(PopoverBase.Content, { align: align, sideOffset: offset, style: {
|
|
20
|
+
width: contentWidth === 'trigger'
|
|
21
|
+
? 'var(--radix-popover-trigger-width)'
|
|
22
|
+
: contentWidth,
|
|
23
|
+
}, className: cn('min-w-[160px] rounded-[5px] bg-white border border-mono10 p-xs flex flex-col gap-xs z-50 shadow-lg', popoverClassName), children: content
|
|
24
|
+
? content
|
|
25
|
+
: items?.map((item, index) => (_jsx("button", { type: "button", className: cn('w-full flex items-center cursor-pointer justify-start px-2 py-1.5 rounded-[5px] ld-transition display12 text-left', itemColorClasses[item.color ?? 'gray']), onClick: (e) => {
|
|
26
|
+
e.stopPropagation();
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
item.onClick();
|
|
29
|
+
}, children: item.label }, index))) })] }));
|
|
30
|
+
};
|
|
31
|
+
export default LDPopover;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
interface RootProps {
|
|
3
|
+
open?: boolean;
|
|
4
|
+
onOpenChange?: (open: boolean) => void;
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
interface TriggerProps {
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
style?: React.CSSProperties;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
onClick?: (e: React.MouseEvent) => void;
|
|
13
|
+
/** Radix의 asChild 속성 (자식 요소를 트리거로 사용) */
|
|
14
|
+
asChild?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface ContentProps {
|
|
17
|
+
align?: 'start' | 'center' | 'end';
|
|
18
|
+
sideOffset?: number;
|
|
19
|
+
className?: string;
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
style?: React.CSSProperties;
|
|
22
|
+
/** 팝오버가 열릴 때 자동으로 포커스되는 동작을 커스텀 */
|
|
23
|
+
onOpenAutoFocus?: (event: Event) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare const PopoverBase: {
|
|
26
|
+
Root: ({ open, onOpenChange, children }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
Trigger: ({ disabled, className, style, children, onClick, asChild, }: TriggerProps) => import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
Content: ({ align, sideOffset, className, children, style, onOpenAutoFocus, }: ContentProps) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
};
|
|
30
|
+
export default PopoverBase;
|
|
31
|
+
//# sourceMappingURL=PopoverBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDPopover/PopoverBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAWD,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACxC,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAwBD,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,mCAAmC;IACnC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;AA6BD,eAAO,MAAM,WAAW;6CA9EwB,SAAS;2EA0BtD,YAAY;mFAgCZ,YAAY;CAwBd,CAAC;AAEF,eAAe,WAAW,CAAC"}
|