@loword/loword-design-system 0.0.4 → 0.0.5
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/package.json +2 -2
- package/dist/components/Avatar/Avatar.d.ts +0 -11
- package/dist/components/Avatar/Avatar.d.ts.map +0 -1
- package/dist/components/Avatar/Avatar.js +0 -24
- package/dist/components/Avatar/AvatarBase.d.ts +0 -32
- package/dist/components/Avatar/AvatarBase.d.ts.map +0 -1
- package/dist/components/Avatar/AvatarBase.js +0 -49
- package/dist/components/Badge/Badge.d.ts +0 -25
- package/dist/components/Badge/Badge.d.ts.map +0 -1
- package/dist/components/Badge/Badge.js +0 -36
- package/dist/components/Badge/BadgeBase.d.ts +0 -10
- package/dist/components/Badge/BadgeBase.d.ts.map +0 -1
- package/dist/components/Badge/BadgeBase.js +0 -9
- package/dist/components/BreadCrumb/BreadCrumb.d.ts +0 -17
- package/dist/components/BreadCrumb/BreadCrumb.d.ts.map +0 -1
- package/dist/components/BreadCrumb/BreadCrumb.js +0 -37
- package/dist/components/BreadCrumb/BreadCrumbBase.d.ts +0 -9
- package/dist/components/BreadCrumb/BreadCrumbBase.d.ts.map +0 -1
- package/dist/components/BreadCrumb/BreadCrumbBase.js +0 -17
- package/dist/components/Button/Button.d.ts +0 -26
- package/dist/components/Button/Button.d.ts.map +0 -1
- package/dist/components/Button/Button.js +0 -102
- package/dist/components/Button/ButtonBase.d.ts +0 -5
- package/dist/components/Button/ButtonBase.d.ts.map +0 -1
- package/dist/components/Button/ButtonBase.js +0 -10
- package/dist/components/Button/ButtonSpinner.d.ts +0 -8
- package/dist/components/Button/ButtonSpinner.d.ts.map +0 -1
- package/dist/components/Button/ButtonSpinner.js +0 -15
- package/dist/components/Calendar/Calendar.d.ts +0 -16
- package/dist/components/Calendar/Calendar.d.ts.map +0 -1
- package/dist/components/Calendar/Calendar.js +0 -75
- package/dist/components/Callout/Callout.d.ts +0 -10
- package/dist/components/Callout/Callout.d.ts.map +0 -1
- package/dist/components/Callout/Callout.js +0 -6
- package/dist/components/Callout/CalloutBase.d.ts +0 -18
- package/dist/components/Callout/CalloutBase.d.ts.map +0 -1
- package/dist/components/Callout/CalloutBase.js +0 -21
- package/dist/components/Carousel/Carousel.d.ts +0 -50
- package/dist/components/Carousel/Carousel.d.ts.map +0 -1
- package/dist/components/Carousel/Carousel.js +0 -22
- package/dist/components/Carousel/CarouselBase.d.ts +0 -98
- package/dist/components/Carousel/CarouselBase.d.ts.map +0 -1
- package/dist/components/Carousel/CarouselBase.js +0 -144
- package/dist/components/Checkbox/Checkbox.d.ts +0 -27
- package/dist/components/Checkbox/Checkbox.d.ts.map +0 -1
- package/dist/components/Checkbox/Checkbox.js +0 -30
- package/dist/components/Checkbox/CheckboxBase.d.ts +0 -40
- package/dist/components/Checkbox/CheckboxBase.d.ts.map +0 -1
- package/dist/components/Checkbox/CheckboxBase.js +0 -57
- package/dist/components/Checkbox/CheckboxGroup.d.ts +0 -22
- package/dist/components/Checkbox/CheckboxGroup.d.ts.map +0 -1
- package/dist/components/Checkbox/CheckboxGroup.js +0 -13
- package/dist/components/Checkbox/FormCheckbox.d.ts +0 -14
- package/dist/components/Checkbox/FormCheckbox.d.ts.map +0 -1
- package/dist/components/Checkbox/FormCheckbox.js +0 -9
- package/dist/components/Checkbox/FormCheckboxGroup.d.ts +0 -13
- package/dist/components/Checkbox/FormCheckboxGroup.d.ts.map +0 -1
- package/dist/components/Checkbox/FormCheckboxGroup.js +0 -9
- package/dist/components/DataCalendar/DataCalendar.d.ts +0 -12
- package/dist/components/DataCalendar/DataCalendar.d.ts.map +0 -1
- package/dist/components/DataCalendar/DataCalendar.js +0 -13
- package/dist/components/DataCalendar/DataCalendarBase.d.ts +0 -45
- package/dist/components/DataCalendar/DataCalendarBase.d.ts.map +0 -1
- package/dist/components/DataCalendar/DataCalendarBase.js +0 -57
- package/dist/components/DatePicker/DatePicker.d.ts +0 -34
- package/dist/components/DatePicker/DatePicker.d.ts.map +0 -1
- package/dist/components/DatePicker/DatePicker.js +0 -44
- package/dist/components/DatePicker/FormDatePicker.d.ts +0 -12
- package/dist/components/DatePicker/FormDatePicker.d.ts.map +0 -1
- package/dist/components/DatePicker/FormDatePicker.js +0 -12
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +0 -49
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +0 -1
- package/dist/components/DateRangePicker/DateRangePicker.js +0 -197
- package/dist/components/DateRangePicker/FormDateRangePicker.d.ts +0 -12
- package/dist/components/DateRangePicker/FormDateRangePicker.d.ts.map +0 -1
- package/dist/components/DateRangePicker/FormDateRangePicker.js +0 -10
- package/dist/components/Divider/Divider.d.ts +0 -9
- package/dist/components/Divider/Divider.d.ts.map +0 -1
- package/dist/components/Divider/Divider.js +0 -11
- package/dist/components/Divider/DividerBase.d.ts +0 -9
- package/dist/components/Divider/DividerBase.d.ts.map +0 -1
- package/dist/components/Divider/DividerBase.js +0 -9
- package/dist/components/Drawer/Drawer.d.ts +0 -51
- package/dist/components/Drawer/Drawer.d.ts.map +0 -1
- package/dist/components/Drawer/Drawer.js +0 -30
- package/dist/components/Drawer/DrawerBase.d.ts +0 -52
- package/dist/components/Drawer/DrawerBase.d.ts.map +0 -1
- package/dist/components/Drawer/DrawerBase.js +0 -38
- package/dist/components/Editor/Editor.d.ts +0 -12
- package/dist/components/Editor/Editor.d.ts.map +0 -1
- package/dist/components/Editor/Editor.js +0 -162
- package/dist/components/Editor/EditorBase.d.ts +0 -52
- package/dist/components/Editor/EditorBase.d.ts.map +0 -1
- package/dist/components/Editor/EditorBase.js +0 -89
- package/dist/components/Editor/Viewer.d.ts +0 -7
- package/dist/components/Editor/Viewer.d.ts.map +0 -1
- package/dist/components/Editor/Viewer.js +0 -9
- package/dist/components/Editor/extensions.d.ts +0 -6
- package/dist/components/Editor/extensions.d.ts.map +0 -1
- package/dist/components/Editor/extensions.js +0 -38
- package/dist/components/FileUpload/FileUploadBase.d.ts +0 -50
- package/dist/components/FileUpload/FileUploadBase.d.ts.map +0 -1
- package/dist/components/FileUpload/FileUploadBase.js +0 -102
- package/dist/components/Input/FormInput.d.ts +0 -15
- package/dist/components/Input/FormInput.d.ts.map +0 -1
- package/dist/components/Input/FormInput.js +0 -19
- package/dist/components/Input/Input.d.ts +0 -24
- package/dist/components/Input/Input.d.ts.map +0 -1
- package/dist/components/Input/Input.js +0 -71
- package/dist/components/Input/InputBase.d.ts +0 -22
- package/dist/components/Input/InputBase.d.ts.map +0 -1
- package/dist/components/Input/InputBase.js +0 -17
- package/dist/components/LNB/LNBBase.d.ts +0 -82
- package/dist/components/LNB/LNBBase.d.ts.map +0 -1
- package/dist/components/LNB/LNBBase.js +0 -108
- package/dist/components/LoadingDots/LoadingDots.d.ts +0 -8
- package/dist/components/LoadingDots/LoadingDots.d.ts.map +0 -1
- package/dist/components/LoadingDots/LoadingDots.js +0 -29
- package/dist/components/MenuBar/MenuBar.d.ts +0 -21
- package/dist/components/MenuBar/MenuBar.d.ts.map +0 -1
- package/dist/components/MenuBar/MenuBar.js +0 -33
- package/dist/components/MenuBar/MenuBarBase.d.ts +0 -43
- package/dist/components/MenuBar/MenuBarBase.d.ts.map +0 -1
- package/dist/components/MenuBar/MenuBarBase.js +0 -69
- package/dist/components/Modal/Modal.d.ts +0 -51
- package/dist/components/Modal/Modal.d.ts.map +0 -1
- package/dist/components/Modal/Modal.js +0 -72
- package/dist/components/Modal/ModalBase.d.ts +0 -42
- package/dist/components/Modal/ModalBase.d.ts.map +0 -1
- package/dist/components/Modal/ModalBase.js +0 -30
- package/dist/components/Modal/openModal.d.ts +0 -24
- package/dist/components/Modal/openModal.d.ts.map +0 -1
- package/dist/components/Modal/openModal.js +0 -52
- package/dist/components/OTPInput/OTPInput.d.ts +0 -46
- package/dist/components/OTPInput/OTPInput.d.ts.map +0 -1
- package/dist/components/OTPInput/OTPInput.js +0 -87
- package/dist/components/Pagination/Pagination.d.ts +0 -12
- package/dist/components/Pagination/Pagination.d.ts.map +0 -1
- package/dist/components/Pagination/Pagination.js +0 -5
- package/dist/components/Pagination/PaginationBase.d.ts +0 -36
- package/dist/components/Pagination/PaginationBase.d.ts.map +0 -1
- package/dist/components/Pagination/PaginationBase.js +0 -44
- package/dist/components/Pagination/paginationUtils.d.ts +0 -2
- package/dist/components/Pagination/paginationUtils.d.ts.map +0 -1
- package/dist/components/Pagination/paginationUtils.js +0 -18
- package/dist/components/Popover/Popover.d.ts +0 -42
- package/dist/components/Popover/Popover.d.ts.map +0 -1
- package/dist/components/Popover/Popover.js +0 -31
- package/dist/components/Popover/PopoverBase.d.ts +0 -31
- package/dist/components/Popover/PopoverBase.d.ts.map +0 -1
- package/dist/components/Popover/PopoverBase.js +0 -18
- package/dist/components/Radio/FormRadioGroup.d.ts +0 -13
- package/dist/components/Radio/FormRadioGroup.d.ts.map +0 -1
- package/dist/components/Radio/FormRadioGroup.js +0 -9
- package/dist/components/Radio/Radio.d.ts +0 -24
- package/dist/components/Radio/Radio.d.ts.map +0 -1
- package/dist/components/Radio/Radio.js +0 -39
- package/dist/components/Radio/RadioBase.d.ts +0 -38
- package/dist/components/Radio/RadioBase.d.ts.map +0 -1
- package/dist/components/Radio/RadioBase.js +0 -46
- package/dist/components/Radio/RadioGroup.d.ts +0 -22
- package/dist/components/Radio/RadioGroup.d.ts.map +0 -1
- package/dist/components/Radio/RadioGroup.js +0 -7
- package/dist/components/ScrollArea/ScrollArea.d.ts +0 -15
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +0 -1
- package/dist/components/ScrollArea/ScrollArea.js +0 -10
- package/dist/components/Select/FormMultiSelect.d.ts +0 -13
- package/dist/components/Select/FormMultiSelect.d.ts.map +0 -1
- package/dist/components/Select/FormMultiSelect.js +0 -14
- package/dist/components/Select/FormSelect.d.ts +0 -13
- package/dist/components/Select/FormSelect.d.ts.map +0 -1
- package/dist/components/Select/FormSelect.js +0 -10
- package/dist/components/Select/MultiSelect.d.ts +0 -31
- package/dist/components/Select/MultiSelect.d.ts.map +0 -1
- package/dist/components/Select/MultiSelect.js +0 -59
- package/dist/components/Select/Select.d.ts +0 -41
- package/dist/components/Select/Select.d.ts.map +0 -1
- package/dist/components/Select/Select.js +0 -55
- package/dist/components/Select/SelectBase.d.ts +0 -59
- package/dist/components/Select/SelectBase.d.ts.map +0 -1
- package/dist/components/Select/SelectBase.js +0 -211
- package/dist/components/Skeleton/Skeleton.d.ts +0 -10
- package/dist/components/Skeleton/Skeleton.d.ts.map +0 -1
- package/dist/components/Skeleton/Skeleton.js +0 -8
- package/dist/components/Slider/Slider.d.ts +0 -23
- package/dist/components/Slider/Slider.d.ts.map +0 -1
- package/dist/components/Slider/Slider.js +0 -195
- package/dist/components/Spinner/Spinner.d.ts +0 -25
- package/dist/components/Spinner/Spinner.d.ts.map +0 -1
- package/dist/components/Spinner/Spinner.js +0 -20
- package/dist/components/Table/Table.d.ts +0 -34
- package/dist/components/Table/Table.d.ts.map +0 -1
- package/dist/components/Table/Table.js +0 -29
- package/dist/components/Table/TableBase.d.ts +0 -37
- package/dist/components/Table/TableBase.d.ts.map +0 -1
- package/dist/components/Table/TableBase.js +0 -39
- package/dist/components/Table/TableField.d.ts +0 -64
- package/dist/components/Table/TableField.d.ts.map +0 -1
- package/dist/components/Table/TableField.js +0 -87
- package/dist/components/Table/TanstackTable.d.ts +0 -23
- package/dist/components/Table/TanstackTable.d.ts.map +0 -1
- package/dist/components/Table/TanstackTable.js +0 -35
- package/dist/components/TimePicker/FormTimePicker.d.ts +0 -12
- package/dist/components/TimePicker/FormTimePicker.d.ts.map +0 -1
- package/dist/components/TimePicker/FormTimePicker.js +0 -12
- package/dist/components/TimePicker/TimePicker.d.ts +0 -27
- package/dist/components/TimePicker/TimePicker.d.ts.map +0 -1
- package/dist/components/TimePicker/TimePicker.js +0 -120
- package/dist/components/Toast/Toast.d.ts +0 -18
- package/dist/components/Toast/Toast.d.ts.map +0 -1
- package/dist/components/Toast/Toast.js +0 -42
- package/dist/components/Toast/Toaster.d.ts +0 -7
- package/dist/components/Toast/Toaster.d.ts.map +0 -1
- package/dist/components/Toast/Toaster.js +0 -7
- package/dist/components/ToggleButton/FormToggleButton.d.ts +0 -12
- package/dist/components/ToggleButton/FormToggleButton.d.ts.map +0 -1
- package/dist/components/ToggleButton/FormToggleButton.js +0 -9
- package/dist/components/ToggleButton/ToggleButton.d.ts +0 -31
- package/dist/components/ToggleButton/ToggleButton.d.ts.map +0 -1
- package/dist/components/ToggleButton/ToggleButton.js +0 -42
- package/dist/components/ToggleButton/ToggleButtonBase.d.ts +0 -41
- package/dist/components/ToggleButton/ToggleButtonBase.d.ts.map +0 -1
- package/dist/components/ToggleButton/ToggleButtonBase.js +0 -59
- package/dist/components/Tooltip/Tooltip.d.ts +0 -18
- package/dist/components/Tooltip/Tooltip.d.ts.map +0 -1
- package/dist/components/Tooltip/Tooltip.js +0 -13
- package/dist/components/Tooltip/TooltipBase.d.ts +0 -39
- package/dist/components/Tooltip/TooltipBase.d.ts.map +0 -1
- package/dist/components/Tooltip/TooltipBase.js +0 -46
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Dispatch, type ReactNode, SetStateAction } from 'react';
|
|
2
|
-
import { TMimeType } from '../../constants/file.js';
|
|
3
|
-
import { type LDButtonProps } from '../../components/LDButton/LDButton.js';
|
|
4
|
-
import { IFile } from '../../utils/file.js';
|
|
5
|
-
interface FileUploadContextType {
|
|
6
|
-
recommendedSize?: {
|
|
7
|
-
width: number;
|
|
8
|
-
height: number;
|
|
9
|
-
};
|
|
10
|
-
maxSize: number;
|
|
11
|
-
allowedExtensions: TMimeType[];
|
|
12
|
-
fileList: IFile[];
|
|
13
|
-
setFileList: Dispatch<SetStateAction<IFile[]>>;
|
|
14
|
-
maxFileCount: number;
|
|
15
|
-
}
|
|
16
|
-
export declare const useFileUploadContext: () => FileUploadContextType;
|
|
17
|
-
interface RootProps {
|
|
18
|
-
recommendedSize?: {
|
|
19
|
-
width: number;
|
|
20
|
-
height: number;
|
|
21
|
-
};
|
|
22
|
-
maxSize: number;
|
|
23
|
-
allowedExtensions: TMimeType[];
|
|
24
|
-
fileList: IFile[] | [];
|
|
25
|
-
setFileList: Dispatch<SetStateAction<IFile[] | []>>;
|
|
26
|
-
maxFileCount?: number;
|
|
27
|
-
className?: string;
|
|
28
|
-
children?: ReactNode;
|
|
29
|
-
}
|
|
30
|
-
interface LDInputProps extends LDButtonProps<'button'> {
|
|
31
|
-
onChangeFile: ({ fileName, fileBase64, file, }: {
|
|
32
|
-
fileName: string;
|
|
33
|
-
fileBase64: string;
|
|
34
|
-
file: File;
|
|
35
|
-
}) => Promise<string | void>;
|
|
36
|
-
label?: string;
|
|
37
|
-
}
|
|
38
|
-
export declare const FileUploadBase: {
|
|
39
|
-
Root: ({ recommendedSize, maxSize, allowedExtensions, maxFileCount, fileList, setFileList, className, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
40
|
-
LDInput: ({ onChangeFile, label, ...props }: LDInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
-
CardList: ({ emptyContent, className, }: {
|
|
42
|
-
emptyContent?: ReactNode;
|
|
43
|
-
className?: string;
|
|
44
|
-
}) => import("react/jsx-runtime").JSX.Element | null;
|
|
45
|
-
Description: ({ className }: {
|
|
46
|
-
className?: string;
|
|
47
|
-
}) => import("react/jsx-runtime").JSX.Element;
|
|
48
|
-
};
|
|
49
|
-
export default FileUploadBase;
|
|
50
|
-
//# sourceMappingURL=FileUploadBase.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileUploadBase.d.ts","sourceRoot":"","sources":["../../../src/components/FileUpload/FileUploadBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,QAAQ,EACR,KAAK,SAAS,EACd,cAAc,EAGf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAmB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAiB,EACf,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAGL,KAAK,EAKN,MAAM,kBAAkB,CAAC;AAG1B,UAAU,qBAAqB;IAC7B,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/C,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,oBAAoB,6BAUhC,CAAC;AAEF,UAAU,SAAS;IACjB,eAAe,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,SAAS,EAAE,CAAC;IAC/B,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvB,WAAW,EAAE,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA8BD,UAAU,YAAa,SAAQ,aAAa,CAAC,QAAQ,CAAC;IACpD,YAAY,EAAE,CAAC,EACb,QAAQ,EACR,UAAU,EACV,IAAI,GACL,EAAE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC;KACZ,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmJD,eAAO,MAAM,cAAc;uHAjLxB,SAAS;iDAoCT,YAAY;6CA2EZ;QACD,YAAY,CAAC,EAAE,SAAS,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;iCA6CmC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAuBzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { createContext, useContext, } from 'react';
|
|
4
|
-
import cn from '../../utils/cn.js';
|
|
5
|
-
import { FILE_EXTENSIONS } from '../../constants/file.js';
|
|
6
|
-
import LDButton from '../../components/LDButton/LDButton.js';
|
|
7
|
-
import { fileToBase64, getFileSizeUnit, isImage, validAllowedExtesions, validFileSize, validImageSize, } from '../../utils/file.js';
|
|
8
|
-
import Toast from '../../components/Toast/Toast.js';
|
|
9
|
-
const FileUploadContext = createContext(null);
|
|
10
|
-
export const useFileUploadContext = () => {
|
|
11
|
-
const fileUploadContext = useContext(FileUploadContext);
|
|
12
|
-
if (!fileUploadContext) {
|
|
13
|
-
throw new Error('FileUploadBase 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
|
|
14
|
-
}
|
|
15
|
-
return fileUploadContext;
|
|
16
|
-
};
|
|
17
|
-
const Root = ({ recommendedSize, maxSize, allowedExtensions, maxFileCount, fileList, setFileList, className, children, }) => {
|
|
18
|
-
// const [file, setFile] = useState<IFile | null>(null);
|
|
19
|
-
return (_jsx(FileUploadContext.Provider, { value: {
|
|
20
|
-
recommendedSize,
|
|
21
|
-
maxSize,
|
|
22
|
-
allowedExtensions,
|
|
23
|
-
maxFileCount: maxFileCount ?? 1,
|
|
24
|
-
fileList,
|
|
25
|
-
setFileList,
|
|
26
|
-
}, children: _jsx("div", { className: cn('w-full', className), children: children }) }));
|
|
27
|
-
};
|
|
28
|
-
const LDInput = ({ onChangeFile, label = '파일 선택', ...props }) => {
|
|
29
|
-
const { allowedExtensions, maxSize, fileList, setFileList, maxFileCount } = useFileUploadContext();
|
|
30
|
-
const getFileError = async (file) => {
|
|
31
|
-
if (!validAllowedExtesions(file, allowedExtensions)) {
|
|
32
|
-
const allowed = allowedExtensions
|
|
33
|
-
.map((item) => FILE_EXTENSIONS[item].toUpperCase())
|
|
34
|
-
.join(', ');
|
|
35
|
-
return `지원하지 않는 파일 형식입니다. ${allowed} 파일만 업로드 가능합니다.`;
|
|
36
|
-
}
|
|
37
|
-
if (!validFileSize(file, maxSize)) {
|
|
38
|
-
return `파일 크기가 너무 큽니다. ${getFileSizeUnit(maxSize)} 이하 파일을 선택해주세요.`;
|
|
39
|
-
}
|
|
40
|
-
if (isImage(file.name) && !(await validImageSize(file))) {
|
|
41
|
-
return '이미지 해상도가 너무 큽니다. 더 작은 크기의 이미지를 선택해주세요.';
|
|
42
|
-
}
|
|
43
|
-
return null;
|
|
44
|
-
};
|
|
45
|
-
const handleFile = async (e) => {
|
|
46
|
-
const files = e.target.files;
|
|
47
|
-
if (!files)
|
|
48
|
-
return;
|
|
49
|
-
for (const file of files) {
|
|
50
|
-
const error = await getFileError(file);
|
|
51
|
-
if (error) {
|
|
52
|
-
Toast.error(error);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
for (const file of files) {
|
|
57
|
-
try {
|
|
58
|
-
const data = await fileToBase64(file);
|
|
59
|
-
const src = await onChangeFile({ ...data, file });
|
|
60
|
-
if (src) {
|
|
61
|
-
setFileList((prev) => [...prev, { ...data, src }]);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
if (error instanceof Error) {
|
|
66
|
-
Toast.error(error.message);
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
Toast.error('파일 업로드 중 문제가 발생했습니다. 잠시후 다시 시도해주세요.');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
return (_jsxs(LDButton, { as: "label", ...props, children: [label, _jsx("input", { type: "file", multiple: maxFileCount > 1, onClick: (e) => (e.currentTarget.value = ''), onChange: (e) => handleFile(e), className: "sr-only" })] }));
|
|
74
|
-
};
|
|
75
|
-
const CardList = ({ emptyContent, className, }) => {
|
|
76
|
-
/*
|
|
77
|
-
이미지인 경우
|
|
78
|
-
이미지가 아닌 파일인 경우
|
|
79
|
-
*/
|
|
80
|
-
const { fileList } = useFileUploadContext();
|
|
81
|
-
if (fileList.length <= 0)
|
|
82
|
-
return emptyContent ? _jsx(_Fragment, { children: emptyContent }) : null;
|
|
83
|
-
return (_jsxs(_Fragment, { children: [_jsx(_Fragment, { children: JSON.stringify(fileList, null, 2) }), _jsx(_Fragment, { children: 'length: ' + fileList.length }), _jsx("div", { className: cn('flex flex-row', className), children: fileList?.map((file, idx) => (_jsx("div", { className: "size-12 overflow-hidden", children: _jsx("img", { src: file?.src, alt: file?.fileName, className: "object-cover" }) }, `${file.fileName}_${idx}`))) })] }));
|
|
84
|
-
};
|
|
85
|
-
// const CardList = ({}) => {
|
|
86
|
-
// return <></>;
|
|
87
|
-
// };
|
|
88
|
-
const Description = ({ className }) => {
|
|
89
|
-
const { recommendedSize, maxSize, allowedExtensions } = useFileUploadContext();
|
|
90
|
-
const recommendedSizeText = recommendedSize &&
|
|
91
|
-
`권장 사이즈 ${recommendedSize.width}x${recommendedSize.height}, `;
|
|
92
|
-
const requiredText = `최대 크기 ${getFileSizeUnit(maxSize)}`;
|
|
93
|
-
const extensionsText = ` (${allowedExtensions.map((item) => FILE_EXTENSIONS[item]).join(', ')})`;
|
|
94
|
-
return (_jsxs("p", { className: cn('display14 text-neutral400 semibold', className), children: [recommendedSizeText, requiredText, extensionsText] }));
|
|
95
|
-
};
|
|
96
|
-
export const FileUploadBase = {
|
|
97
|
-
Root,
|
|
98
|
-
LDInput,
|
|
99
|
-
CardList,
|
|
100
|
-
Description,
|
|
101
|
-
};
|
|
102
|
-
export default FileUploadBase;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type Ref } from 'react';
|
|
2
|
-
import { type RegisterOptions } from 'react-hook-form';
|
|
3
|
-
import { type InputProps } from './Input.js';
|
|
4
|
-
interface FormInputProps extends Omit<InputProps, 'name' | 'color' | 'onChange' | 'value' | 'onBlur'> {
|
|
5
|
-
name: string;
|
|
6
|
-
options?: RegisterOptions;
|
|
7
|
-
ref?: Ref<HTMLInputElement>;
|
|
8
|
-
customErrorMessage?: string;
|
|
9
|
-
isHiddenErrorMessage?: boolean;
|
|
10
|
-
errorClassName?: string;
|
|
11
|
-
showEditIcon?: boolean;
|
|
12
|
-
}
|
|
13
|
-
declare const FormInput: ({ name, options, variant, size, block, disabled, ref, customErrorMessage, isHiddenErrorMessage, errorClassName, showEditIcon, rightAddon, ...props }: FormInputProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
-
export default FormInput;
|
|
15
|
-
//# sourceMappingURL=FormInput.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FormInput.d.ts","sourceRoot":"","sources":["../../../src/components/Input/FormInput.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAc,EAAE,KAAK,UAAU,EAAa,MAAM,SAAS,CAAC;AAM5D,UAAU,cAAe,SAAQ,IAAI,CACnC,UAAU,EACV,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CACnD;IACC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,QAAA,MAAM,SAAS,GAAI,sJAchB,cAAc,4CA6EhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import Input, { iconSizes } from './Input.js';
|
|
4
|
-
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
-
import FormField from '../Form/FormField.js';
|
|
6
|
-
import FormErrorMessage from '../Form/FormErrorMessage.js';
|
|
7
|
-
import cn from '../../utils/cn.js';
|
|
8
|
-
const FormInput = ({ name, options, variant = 'filled', size = 'small', block = false, disabled = false, ref, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, showEditIcon = false, rightAddon, ...props }) => {
|
|
9
|
-
const iconSize = iconSizes[size ?? 'sm'];
|
|
10
|
-
return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, ref: ref, children: ({ field, fieldState, resetField }) => {
|
|
11
|
-
const editIconAddon = showEditIcon && !disabled ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "group-focus-within:hidden", children: _jsx(LucideIcon, { name: "pencil", size: iconSize }) }), _jsx("button", { type: "button", "aria-label": "\uC785\uB825 \uB0B4\uC6A9 \uCD08\uAE30\uD654", onMouseDown: (e) => {
|
|
12
|
-
e.preventDefault();
|
|
13
|
-
resetField({ defaultValue: '' });
|
|
14
|
-
}, className: "hidden group-focus-within:block text-neutral40 cursor-pointer hover:text-lb500 ld-transition", children: _jsx(LucideIcon, { name: "x", size: iconSize }) })] })) : null;
|
|
15
|
-
const combinedAddon = editIconAddon || rightAddon ? (_jsxs(_Fragment, { children: [editIconAddon, rightAddon] })) : undefined;
|
|
16
|
-
return (_jsxs("div", { className: cn('relative border-2 border-transparent', block ? 'w-full' : 'w-auto'), children: [_jsx(Input, { ...props, ...field, value: field.value ?? '', variant: variant, color: fieldState.hasError ? 'danger' : 'neutral', size: size, block: block, rightAddon: combinedAddon, "aria-invalid": fieldState.hasError, "aria-describedby": fieldState.hasError ? fieldState.errorId : undefined }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { id: fieldState.errorId, error: fieldState.error, disabled: disabled, className: cn((showEditIcon || rightAddon) && 'right-8', errorClassName) }))] }));
|
|
17
|
-
} }));
|
|
18
|
-
};
|
|
19
|
-
export default FormInput;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { type InputHTMLAttributes, type ReactNode, type Ref } from 'react';
|
|
2
|
-
type InputVariant = 'filled' | 'outline' | 'ghost';
|
|
3
|
-
type InputColor = 'neutral' | 'point' | 'danger';
|
|
4
|
-
type InputSize = 'xSmall' | 'small' | 'medium' | 'large' | 'big' | 'xLarge';
|
|
5
|
-
export declare const iconSizes: Record<InputSize, number>;
|
|
6
|
-
export interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'color' | 'size'> {
|
|
7
|
-
/** 입력 필드 스타일 유형 */
|
|
8
|
-
variant?: InputVariant;
|
|
9
|
-
/** 색상 테마 */
|
|
10
|
-
color?: InputColor;
|
|
11
|
-
/** 입력 필드 높이 및 폰트 크기 프리셋 */
|
|
12
|
-
size?: InputSize;
|
|
13
|
-
/** 비밀번호 표시/숨김 토글 버튼 */
|
|
14
|
-
showPasswordToggle?: boolean;
|
|
15
|
-
/** true 시 너비 100% */
|
|
16
|
-
block?: boolean;
|
|
17
|
-
/** 우측 부가 요소 (아이콘 등) */
|
|
18
|
-
rightAddon?: ReactNode;
|
|
19
|
-
/** input 요소 ref */
|
|
20
|
-
ref?: Ref<HTMLInputElement>;
|
|
21
|
-
}
|
|
22
|
-
declare const Input: ({ variant, color, size, showPasswordToggle, block, type, disabled, className, style, rightAddon, ref, ...props }: InputProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
-
export default Input;
|
|
24
|
-
//# sourceMappingURL=Input.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../../../src/components/Input/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAMf,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AACnD,KAAK,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AACjD,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAqD5E,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAO/C,CAAC;AAGF,MAAM,WAAW,UAAW,SAAQ,IAAI,CACtC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,OAAO,GAAG,MAAM,CACjB;IACC,mBAAmB;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,mBAAmB;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAED,QAAA,MAAM,KAAK,GAAI,kHAaZ,UAAU,4CAuEZ,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, } from 'react';
|
|
3
|
-
import InputBase from './InputBase.js';
|
|
4
|
-
import LucideIcon from '../Icon/LucideIcon.js';
|
|
5
|
-
import cn from '../../utils/cn.js';
|
|
6
|
-
// ── 스타일 매핑 ──
|
|
7
|
-
const variantColorClasses = {
|
|
8
|
-
filled: {
|
|
9
|
-
neutral: 'bg-mono100 text-neutral900 outline-2 outline-transparent focus:bg-tintBlue focus:outline-lb500',
|
|
10
|
-
point: 'bg-mono100 text-neutral900 outline-2 outline-transparent focus:bg-tintBlue focus:outline-lb500',
|
|
11
|
-
danger: 'bg-tintRed text-neutral900 outline-2 outline-red500',
|
|
12
|
-
},
|
|
13
|
-
outline: {
|
|
14
|
-
neutral: 'bg-transparent text-neutral900 border border-mono200 focus:border-lb500',
|
|
15
|
-
point: 'bg-transparent text-neutral900 border border-mono200 focus:border-lb500',
|
|
16
|
-
danger: 'bg-transparent text-neutral900 border border-danger100 focus:border-red500',
|
|
17
|
-
},
|
|
18
|
-
ghost: {
|
|
19
|
-
neutral: 'bg-transparent text-neutral900 outline-2 outline-transparent hover:bg-mono50 focus:bg-mono100 focus:outline-lb500',
|
|
20
|
-
point: 'bg-transparent text-neutral900 outline-2 outline-transparent hover:bg-mono50 focus:bg-mono100 focus:outline-lb500',
|
|
21
|
-
danger: 'bg-transparent text-danger500 outline-2 outline-transparent hover:bg-tintRed focus:bg-tintRed focus:outline-red500',
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
const disabledVariantClasses = {
|
|
25
|
-
filled: 'bg-mono100 text-mono400',
|
|
26
|
-
outline: 'bg-transparent text-mono400 border border-mono200',
|
|
27
|
-
ghost: 'bg-transparent text-mono400',
|
|
28
|
-
};
|
|
29
|
-
const sizeClasses = {
|
|
30
|
-
xSmall: 'input-2xs',
|
|
31
|
-
small: 'input-xs',
|
|
32
|
-
medium: 'input-sm',
|
|
33
|
-
large: 'input-md',
|
|
34
|
-
big: 'input-lg',
|
|
35
|
-
xLarge: 'input-xl',
|
|
36
|
-
};
|
|
37
|
-
const addonRightPaddingClasses = {
|
|
38
|
-
xSmall: 'pr-8',
|
|
39
|
-
small: 'pr-8',
|
|
40
|
-
medium: 'pr-8',
|
|
41
|
-
large: 'pr-10',
|
|
42
|
-
big: 'pr-11',
|
|
43
|
-
xLarge: 'pr-12',
|
|
44
|
-
};
|
|
45
|
-
export const iconSizes = {
|
|
46
|
-
xSmall: 10,
|
|
47
|
-
small: 12,
|
|
48
|
-
medium: 14,
|
|
49
|
-
large: 16,
|
|
50
|
-
big: 18,
|
|
51
|
-
xLarge: 20,
|
|
52
|
-
};
|
|
53
|
-
const Input = ({ variant, color = 'neutral', size, showPasswordToggle = false, block = false, type = 'text', disabled = false, className, style, rightAddon, ref, ...props }) => {
|
|
54
|
-
const [passwordVisible, setPasswordVisible] = useState(false);
|
|
55
|
-
const resolvedType = showPasswordToggle
|
|
56
|
-
? passwordVisible
|
|
57
|
-
? 'text'
|
|
58
|
-
: 'password'
|
|
59
|
-
: type;
|
|
60
|
-
const iconSize = iconSizes[size ?? 'medium'];
|
|
61
|
-
const passwordToggleAddon = showPasswordToggle ? (_jsx("button", { type: "button", "aria-label": passwordVisible ? '비밀번호 숨기기' : '비밀번호 표시', "aria-pressed": passwordVisible, onClick: () => setPasswordVisible(!passwordVisible), disabled: disabled, className: cn('text-neutral40 ld-transition', disabled ? 'cursor-not-allowed' : 'cursor-pointer hover:text-lb500'), children: _jsx(LucideIcon, { name: passwordVisible ? 'eye' : 'eyeOff', size: iconSize }) })) : null;
|
|
62
|
-
const resolvedRightAddon = rightAddon ?? passwordToggleAddon;
|
|
63
|
-
const { width, height, minWidth, maxWidth, minHeight, maxHeight, ...fieldStyle } = style ?? {};
|
|
64
|
-
const rootStyle = { width, height, minWidth, maxWidth, minHeight, maxHeight };
|
|
65
|
-
const fieldClassName = cn('w-full bold placeholder-mono400 ld-transition outline-none', variant &&
|
|
66
|
-
(disabled
|
|
67
|
-
? disabledVariantClasses[variant]
|
|
68
|
-
: variantColorClasses[variant][color]), size && !height && sizeClasses[size], height && 'h-full', disabled && 'cursor-not-allowed', 'read-only:cursor-not-allowed', resolvedRightAddon && size && addonRightPaddingClasses[size], className);
|
|
69
|
-
return (_jsxs(InputBase.Root, { block: block, style: rootStyle, children: [_jsx(InputBase.Field, { ref: ref, type: resolvedType, disabled: disabled, className: fieldClassName, style: fieldStyle, ...props }), resolvedRightAddon && (_jsx(InputBase.Addon, { position: "right", className: "right-2.5 text-neutral40", children: resolvedRightAddon }))] }));
|
|
70
|
-
};
|
|
71
|
-
export default Input;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { type InputHTMLAttributes, type ReactNode, type Ref } from 'react';
|
|
2
|
-
interface RootProps {
|
|
3
|
-
block?: boolean;
|
|
4
|
-
className?: string;
|
|
5
|
-
style?: React.CSSProperties;
|
|
6
|
-
children?: ReactNode;
|
|
7
|
-
}
|
|
8
|
-
interface FieldProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
9
|
-
ref?: Ref<HTMLInputElement>;
|
|
10
|
-
}
|
|
11
|
-
interface AddonProps {
|
|
12
|
-
position?: 'left' | 'right';
|
|
13
|
-
className?: string;
|
|
14
|
-
children?: ReactNode;
|
|
15
|
-
}
|
|
16
|
-
export declare const InputBase: {
|
|
17
|
-
Root: ({ block, className, style, children }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
-
Field: ({ ref, ...props }: FieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
-
Addon: ({ position, className, children }: AddonProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
-
};
|
|
21
|
-
export default InputBase;
|
|
22
|
-
//# sourceMappingURL=InputBase.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputBase.d.ts","sourceRoot":"","sources":["../../../src/components/Input/InputBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAI3E,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAcD,UAAU,UAAW,SAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAChE,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAOD,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAgBD,eAAO,MAAM,SAAS;kDAzCuC,SAAS;+BAgBpC,UAAU;+CAWgB,UAAU;CAkBrE,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import cn from '../../utils/cn.js';
|
|
3
|
-
const Root = ({ block = false, className, style, children }) => {
|
|
4
|
-
return (_jsx("div", { style: style, className: cn('relative flex group', block && 'w-full', className), children: children }));
|
|
5
|
-
};
|
|
6
|
-
const Field = ({ ref, ...props }) => {
|
|
7
|
-
return _jsx("input", { ref: ref, ...props });
|
|
8
|
-
};
|
|
9
|
-
const Addon = ({ position = 'right', className, children }) => {
|
|
10
|
-
return (_jsx("span", { className: cn('absolute top-1/2 -translate-y-1/2 flex items-center', position === 'left' ? 'left-0' : 'right-0', className), children: children }));
|
|
11
|
-
};
|
|
12
|
-
export const InputBase = {
|
|
13
|
-
Root,
|
|
14
|
-
Field,
|
|
15
|
-
Addon,
|
|
16
|
-
};
|
|
17
|
-
export default InputBase;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import type { ElementType, ReactNode } from 'react';
|
|
2
|
-
export interface INavTab {
|
|
3
|
-
label: string;
|
|
4
|
-
path: string;
|
|
5
|
-
icon?: ReactNode;
|
|
6
|
-
isNotScroll?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface INavItem {
|
|
9
|
-
label: string;
|
|
10
|
-
tabs?: INavTab[];
|
|
11
|
-
noSlider?: boolean;
|
|
12
|
-
}
|
|
13
|
-
interface ProviderProps {
|
|
14
|
-
children: ReactNode;
|
|
15
|
-
isMobile: boolean;
|
|
16
|
-
items?: INavItem[];
|
|
17
|
-
pathname?: string;
|
|
18
|
-
defaultCollapsed?: boolean;
|
|
19
|
-
}
|
|
20
|
-
interface RootProps {
|
|
21
|
-
children: ReactNode;
|
|
22
|
-
className?: string;
|
|
23
|
-
}
|
|
24
|
-
interface TriggerProps {
|
|
25
|
-
className?: string;
|
|
26
|
-
}
|
|
27
|
-
interface HeaderProps {
|
|
28
|
-
name?: string;
|
|
29
|
-
email?: string;
|
|
30
|
-
profileImage?: string | null;
|
|
31
|
-
handleLogout?: () => void;
|
|
32
|
-
}
|
|
33
|
-
interface ContentProps {
|
|
34
|
-
children: ReactNode;
|
|
35
|
-
className?: string;
|
|
36
|
-
}
|
|
37
|
-
interface GroupProps {
|
|
38
|
-
children: ReactNode;
|
|
39
|
-
label?: string;
|
|
40
|
-
noSlider?: boolean;
|
|
41
|
-
}
|
|
42
|
-
interface MenuProps {
|
|
43
|
-
children: ReactNode;
|
|
44
|
-
label?: string;
|
|
45
|
-
noSlider?: boolean;
|
|
46
|
-
tabCount?: number;
|
|
47
|
-
}
|
|
48
|
-
interface MenuItemProps {
|
|
49
|
-
as?: ElementType;
|
|
50
|
-
href: string;
|
|
51
|
-
isActive?: boolean;
|
|
52
|
-
children: ReactNode;
|
|
53
|
-
icon?: ReactNode;
|
|
54
|
-
className?: string;
|
|
55
|
-
[key: string]: unknown;
|
|
56
|
-
}
|
|
57
|
-
interface MenuSubProps {
|
|
58
|
-
children: ReactNode;
|
|
59
|
-
className?: string;
|
|
60
|
-
}
|
|
61
|
-
interface MenuSubItemProps {
|
|
62
|
-
as?: ElementType;
|
|
63
|
-
href: string;
|
|
64
|
-
isActive?: boolean;
|
|
65
|
-
children: ReactNode;
|
|
66
|
-
className?: string;
|
|
67
|
-
[key: string]: unknown;
|
|
68
|
-
}
|
|
69
|
-
declare const LNBBase: {
|
|
70
|
-
Provider: ({ children, isMobile, items, pathname, defaultCollapsed, }: ProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
71
|
-
Root: ({ children, className }: RootProps) => import("react/jsx-runtime").JSX.Element;
|
|
72
|
-
Trigger: ({ className }: TriggerProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
73
|
-
Header: ({ name, email, profileImage, handleLogout }: HeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
74
|
-
Content: ({ children, className }: ContentProps) => import("react/jsx-runtime").JSX.Element;
|
|
75
|
-
Group: ({ children, label, noSlider }: GroupProps) => import("react/jsx-runtime").JSX.Element;
|
|
76
|
-
Menu: ({ children, label, noSlider, tabCount }: MenuProps) => import("react/jsx-runtime").JSX.Element;
|
|
77
|
-
MenuItem: ({ as: Comp, href, isActive, children, icon, className, ...rest }: MenuItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
78
|
-
MenuSub: ({ children, className }: MenuSubProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
79
|
-
MenuSubItem: ({ as: Comp, href, isActive, children, className, ...rest }: MenuSubItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
80
|
-
};
|
|
81
|
-
export default LNBBase;
|
|
82
|
-
//# sourceMappingURL=LNBBase.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LNBBase.d.ts","sourceRoot":"","sources":["../../../src/components/LNB/LNBBase.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAapD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0BD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAyDD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2BD,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAqCD,UAAU,YAAY;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkBD,UAAU,UAAU;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqCD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA6BD,UAAU,aAAa;IACrB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiCD,UAAU,YAAY;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,UAAU,gBAAgB;IACxB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA2BD,QAAA,MAAM,OAAO;2EA/UV,aAAa;oCAsDuB,SAAS;6BA6BhB,YAAY;0DA+BiB,WAAW;uCAwC9B,YAAY;2CAsBR,UAAU;oDA0CG,SAAS;iFA6CjE,aAAa;uCA4B0B,YAAY;8EA0BnD,gBAAgB;CA6BlB,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { createContext, useContext, useEffect, useState } from 'react';
|
|
4
|
-
import { ChevronDown, PanelLeftClose, PanelLeftOpen, LogOut, } from 'lucide-react';
|
|
5
|
-
import cn from '../../utils/cn.js';
|
|
6
|
-
import { isActivePath } from '../../utils/utils.js';
|
|
7
|
-
import LDAvatar from '../LDAvatar/LDAvatar.js';
|
|
8
|
-
const LNBContext = createContext(null);
|
|
9
|
-
const useLNBContext = () => {
|
|
10
|
-
const ctx = useContext(LNBContext);
|
|
11
|
-
if (!ctx)
|
|
12
|
-
throw new Error('LNBBase 서브컴포넌트는 LNBBase.Provider 내부에서 사용해야 합니다.');
|
|
13
|
-
return ctx;
|
|
14
|
-
};
|
|
15
|
-
const Provider = ({ children, isMobile, items = [], pathname = '', defaultCollapsed = false, }) => {
|
|
16
|
-
const [collapsed, setCollapsed] = useState(defaultCollapsed);
|
|
17
|
-
const [openGroups, setOpenGroups] = useState([]);
|
|
18
|
-
const toggleCollapsed = () => setCollapsed((prev) => !prev);
|
|
19
|
-
const toggleGroup = (label) => {
|
|
20
|
-
setOpenGroups((prev) => prev.includes(label) ? prev.filter((g) => g !== label) : [...prev, label]);
|
|
21
|
-
};
|
|
22
|
-
const isGroupOpen = (label) => openGroups.includes(label);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!isMobile)
|
|
25
|
-
return;
|
|
26
|
-
if (pathname === '/') {
|
|
27
|
-
setOpenGroups([]);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
const matchedLabel = items.find((item) => item.tabs?.some((tab) => isActivePath(pathname, tab.path)))?.label;
|
|
31
|
-
if (matchedLabel && !openGroups.includes(matchedLabel)) {
|
|
32
|
-
setOpenGroups((prev) => [...prev, matchedLabel]);
|
|
33
|
-
}
|
|
34
|
-
// 라우트(pathname) 변경 시에만 그룹 펼침을 동기화하려는 의도이므로 다른 의존성은 제외함.
|
|
35
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
-
}, [pathname]);
|
|
37
|
-
return (_jsx(LNBContext, { value: {
|
|
38
|
-
isMobile,
|
|
39
|
-
collapsed,
|
|
40
|
-
toggleCollapsed,
|
|
41
|
-
openGroups,
|
|
42
|
-
toggleGroup,
|
|
43
|
-
isGroupOpen,
|
|
44
|
-
}, children: children }));
|
|
45
|
-
};
|
|
46
|
-
const Root = ({ children, className }) => {
|
|
47
|
-
const { collapsed } = useLNBContext();
|
|
48
|
-
return (_jsx("div", { className: cn('relative mobile:w-full ld-transition', collapsed ? 'w-[60px]' : 'w-[300px]', className), children: _jsx("div", { className: cn('w-full h-full bg-mono50 mobile:bg-white', 'h-[calc(100vh-64px)] mobile:h-auto mobile:overflow-hidden', 'overflow-y-auto p-sm flex flex-col gap-md mobile:py-0 scrollbar-hide scrollbar-hover'), children: children }) }));
|
|
49
|
-
};
|
|
50
|
-
const Trigger = ({ className }) => {
|
|
51
|
-
const { isMobile, collapsed, toggleCollapsed } = useLNBContext();
|
|
52
|
-
const Icon = collapsed ? PanelLeftOpen : PanelLeftClose;
|
|
53
|
-
if (isMobile)
|
|
54
|
-
return null;
|
|
55
|
-
return (_jsx("button", { type: "button", onClick: toggleCollapsed, className: cn('absolute -right-10 top-0 z-10', 'flex items-center justify-center w-10 h-10', 'text-neutral500', 'hover:text-mono900 ld-transition cursor-pointer', className), "aria-label": collapsed ? '사이드바 펼치기' : '사이드바 접기', children: _jsx(Icon, { size: 16 }) }));
|
|
56
|
-
};
|
|
57
|
-
const Header = ({ name, email, profileImage, handleLogout }) => {
|
|
58
|
-
const { collapsed } = useLNBContext();
|
|
59
|
-
return (_jsxs("div", { className: cn('w-full flex gap-sm items-center rounded-[10px] ld-transition overflow-hidden', collapsed
|
|
60
|
-
? 'p-xs justify-center border-transparent'
|
|
61
|
-
: 'p-md mobile:p-sm border border-neutral100'), children: [_jsx(LDAvatar, { size: "md", src: profileImage }), !collapsed && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-col gap-xs flex-1 min-w-0", children: [_jsx("span", { className: "display16 bold truncate", children: name ?? '' }), _jsx("span", { className: "display14 text-neutral500 truncate", children: email ?? '' })] }), handleLogout && (_jsx(LogOut, { size: 12, className: "cursor-pointer flex-shrink-0", onClick: handleLogout }))] }))] }));
|
|
62
|
-
};
|
|
63
|
-
const Content = ({ children, className }) => (_jsxs(_Fragment, { children: [_jsx("div", { className: "w-full border-b border-neutral100" }), _jsx("div", { className: cn('flex flex-col gap-md mobile:overflow-y-auto mobile:h-[calc(62dvh-111px)]', className), children: children })] }));
|
|
64
|
-
const Group = ({ children, label, noSlider }) => {
|
|
65
|
-
const { isMobile, collapsed, toggleGroup, isGroupOpen } = useLNBContext();
|
|
66
|
-
const open = label ? isGroupOpen(label) : true;
|
|
67
|
-
return (_jsxs("div", { className: "flex flex-col gap-sm w-full items-start", children: [label && !collapsed && (_jsxs("div", { className: cn('w-full flex', isMobile && 'cursor-pointer justify-between'), onClick: () => !noSlider && isMobile && toggleGroup(label), children: [_jsx("span", { className: "display14 text-neutral500", children: label }), _jsx("div", { className: cn(isMobile &&
|
|
68
|
-
'transition-transform duration-300 ease-out flex items-center justify-center w-5 h-5 flex-shrink-0', isMobile && open ? 'rotate-180' : 'rotate-0', !isMobile && 'hidden', noSlider && 'hidden'), children: _jsx(ChevronDown, { size: 14, className: "text-neutral500" }) })] })), children] }));
|
|
69
|
-
};
|
|
70
|
-
const Menu = ({ children, label, noSlider, tabCount = 0 }) => {
|
|
71
|
-
const { isMobile, isGroupOpen } = useLNBContext();
|
|
72
|
-
const open = label ? isGroupOpen(label) : true;
|
|
73
|
-
const visible = (label && open) || !label || noSlider;
|
|
74
|
-
return (_jsx("div", { className: cn('flex flex-col w-full gap-sm opacity-100', isMobile && 'overflow-hidden ld-transition', visible ? 'opacity-100' : isMobile && 'opacity-0'), style: {
|
|
75
|
-
height: isMobile
|
|
76
|
-
? visible
|
|
77
|
-
? `calc(40px * ${tabCount} + 10px * ${tabCount > 0 ? tabCount - 1 : 0})`
|
|
78
|
-
: '0'
|
|
79
|
-
: 'auto',
|
|
80
|
-
}, children: children }));
|
|
81
|
-
};
|
|
82
|
-
const MenuItem = ({ as: Comp = 'a', href, isActive, children, icon, className, ...rest }) => {
|
|
83
|
-
const { collapsed } = useLNBContext();
|
|
84
|
-
return (_jsxs(Comp, { href: href, className: cn('flex gap-sm w-full items-center p-sm display16 mobile:display14 bold mobile:medium', 'text-neutral500 cursor-pointer hover:bg-mono300 rounded-[5px] hover:text-mono900 ld-transition', collapsed && 'justify-center', isActive &&
|
|
85
|
-
'bg-tintBlue text-blue400 hover:bg-tintBlue hover:text-blue400', className), ...rest, children: [icon && _jsx("span", { className: "flex-shrink-0", children: icon }), !collapsed && children] }));
|
|
86
|
-
};
|
|
87
|
-
const MenuSub = ({ children, className }) => {
|
|
88
|
-
const { collapsed } = useLNBContext();
|
|
89
|
-
if (collapsed)
|
|
90
|
-
return null;
|
|
91
|
-
return (_jsx("div", { className: cn('flex flex-col w-full gap-sm pl-sm', className), children: children }));
|
|
92
|
-
};
|
|
93
|
-
const MenuSubItem = ({ as: Comp = 'a', href, isActive, children, className, ...rest }) => (_jsx(Comp, { href: href, className: cn('flex gap-sm w-full items-center p-sm display14 medium', 'text-neutral500 cursor-pointer hover:bg-mono300 rounded-[5px] hover:text-mono900 ld-transition', isActive &&
|
|
94
|
-
'bg-tintBlue text-blue400 hover:bg-tintBlue hover:text-blue400', className), ...rest, children: children }));
|
|
95
|
-
// ── Export ──
|
|
96
|
-
const LNBBase = {
|
|
97
|
-
Provider,
|
|
98
|
-
Root,
|
|
99
|
-
Trigger,
|
|
100
|
-
Header,
|
|
101
|
-
Content,
|
|
102
|
-
Group,
|
|
103
|
-
Menu,
|
|
104
|
-
MenuItem,
|
|
105
|
-
MenuSub,
|
|
106
|
-
MenuSubItem,
|
|
107
|
-
};
|
|
108
|
-
export default LNBBase;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
interface LoadingDotsProps {
|
|
2
|
-
size?: LoadingDotsSize;
|
|
3
|
-
className?: string;
|
|
4
|
-
}
|
|
5
|
-
type LoadingDotsSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
|
|
6
|
-
declare const LoadingDots: ({ size, className }: LoadingDotsProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
export default LoadingDots;
|
|
8
|
-
//# sourceMappingURL=LoadingDots.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingDots.d.ts","sourceRoot":"","sources":["../../../src/components/LoadingDots/LoadingDots.tsx"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,eAAe,GAChB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,QAAA,MAAM,WAAW,GAAI,qBAA+B,gBAAgB,4CA4CnE,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import cn from '../../utils/cn.js';
|
|
3
|
-
const LoadingDots = ({ size = 'small', className }) => {
|
|
4
|
-
const sizeMap = {
|
|
5
|
-
'2xsmall': 2,
|
|
6
|
-
xsmall: 2,
|
|
7
|
-
small: 2,
|
|
8
|
-
medium: 2,
|
|
9
|
-
large: 3,
|
|
10
|
-
xlarge: 4,
|
|
11
|
-
};
|
|
12
|
-
return (_jsxs("div", { className: cn('flex items-center justify-center gap-1', className), style: { height: sizeMap[size] }, children: [_jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
13
|
-
width: sizeMap[size],
|
|
14
|
-
height: sizeMap[size],
|
|
15
|
-
animationDelay: '0ms',
|
|
16
|
-
animationDuration: '1000ms',
|
|
17
|
-
} }), _jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
18
|
-
width: sizeMap[size],
|
|
19
|
-
height: sizeMap[size],
|
|
20
|
-
animationDelay: '200ms',
|
|
21
|
-
animationDuration: '1000ms',
|
|
22
|
-
} }), _jsx("div", { className: "bg-current rounded-full animate-pulse", style: {
|
|
23
|
-
width: sizeMap[size],
|
|
24
|
-
height: sizeMap[size],
|
|
25
|
-
animationDelay: '400ms',
|
|
26
|
-
animationDuration: '1000ms',
|
|
27
|
-
} })] }));
|
|
28
|
-
};
|
|
29
|
-
export default LoadingDots;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { ComponentProps } from 'react';
|
|
2
|
-
import MenuBarBase from './MenuBarBase.js';
|
|
3
|
-
declare const MenuBar: {
|
|
4
|
-
Root: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Root>) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
-
Logo: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Logo>) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
-
Nav: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Nav>) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
Item: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Item>) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
Trigger: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Trigger>) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
-
Content: {
|
|
10
|
-
({ className, ...props }: ComponentProps<typeof MenuBarBase.Content>): import("react/jsx-runtime").JSX.Element;
|
|
11
|
-
displayName: string;
|
|
12
|
-
};
|
|
13
|
-
MegaContent: {
|
|
14
|
-
({ className, ...props }: ComponentProps<typeof MenuBarBase.Content>): import("react/jsx-runtime").JSX.Element;
|
|
15
|
-
displayName: string;
|
|
16
|
-
};
|
|
17
|
-
Actions: ({ className, ...props }: ComponentProps<typeof MenuBarBase.Actions>) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
-
Separator: ({ className, }: ComponentProps<typeof MenuBarBase.Separator>) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
-
};
|
|
20
|
-
export default MenuBar;
|
|
21
|
-
//# sourceMappingURL=MenuBar.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MenuBar.d.ts","sourceRoot":"","sources":["../../../src/components/MenuBar/MenuBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,WAAW,MAAM,eAAe,CAAC;AAkHxC,QAAA,MAAM,OAAO;oCA1GV,cAAc,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;oCAcvC,cAAc,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;mCAUvC,cAAc,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC;oCAUtC,cAAc,CAAC,OAAO,WAAW,CAAC,IAAI,CAAC;uCAOvC,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC;;kCAgB1C,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC;;;;kCAgB1C,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC;;;uCAoB1C,cAAc,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC;gCAS1C,cAAc,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC;CAc9C,CAAC;AAEF,eAAe,OAAO,CAAC"}
|