@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.
Files changed (263) hide show
  1. package/README.md +77 -3
  2. package/dist/components/BreadCrumb/BreadCrumb.d.ts +17 -0
  3. package/dist/components/BreadCrumb/BreadCrumb.d.ts.map +1 -0
  4. package/dist/components/BreadCrumb/BreadCrumb.js +37 -0
  5. package/dist/components/BreadCrumb/BreadCrumbBase.d.ts +9 -0
  6. package/dist/components/BreadCrumb/BreadCrumbBase.d.ts.map +1 -0
  7. package/dist/components/BreadCrumb/BreadCrumbBase.js +17 -0
  8. package/dist/components/Button/ButtonSpinner.d.ts +1 -2
  9. package/dist/components/Button/ButtonSpinner.d.ts.map +1 -1
  10. package/dist/components/Button/ButtonSpinner.js +3 -2
  11. package/dist/components/Callout/Callout.d.ts +10 -0
  12. package/dist/components/Callout/Callout.d.ts.map +1 -0
  13. package/dist/components/Callout/Callout.js +6 -0
  14. package/dist/components/Callout/CalloutBase.d.ts +18 -0
  15. package/dist/components/Callout/CalloutBase.d.ts.map +1 -0
  16. package/dist/components/Callout/CalloutBase.js +21 -0
  17. package/dist/components/Divider/Divider.d.ts +9 -0
  18. package/dist/components/Divider/Divider.d.ts.map +1 -0
  19. package/dist/components/Divider/Divider.js +11 -0
  20. package/dist/components/Divider/DividerBase.d.ts +9 -0
  21. package/dist/components/Divider/DividerBase.d.ts.map +1 -0
  22. package/dist/components/Divider/DividerBase.js +9 -0
  23. package/dist/components/FileUpload/FileUploadBase.d.ts +5 -5
  24. package/dist/components/FileUpload/FileUploadBase.d.ts.map +1 -1
  25. package/dist/components/FileUpload/FileUploadBase.js +4 -4
  26. package/dist/components/Form/FormField.d.ts +2 -2
  27. package/dist/components/LDAvatar/AvatarBase.d.ts +32 -0
  28. package/dist/components/LDAvatar/AvatarBase.d.ts.map +1 -0
  29. package/dist/components/LDAvatar/AvatarBase.js +49 -0
  30. package/dist/components/LDAvatar/LDAvatar.d.ts +11 -0
  31. package/dist/components/LDAvatar/LDAvatar.d.ts.map +1 -0
  32. package/dist/components/LDAvatar/LDAvatar.js +24 -0
  33. package/dist/components/LDBadge/BadgeBase.d.ts +10 -0
  34. package/dist/components/LDBadge/BadgeBase.d.ts.map +1 -0
  35. package/dist/components/LDBadge/BadgeBase.js +9 -0
  36. package/dist/components/LDBadge/LDBadge.d.ts +25 -0
  37. package/dist/components/LDBadge/LDBadge.d.ts.map +1 -0
  38. package/dist/components/LDBadge/LDBadge.js +36 -0
  39. package/dist/components/LDBreadCrumb/BreadCrumbBase.d.ts +9 -0
  40. package/dist/components/LDBreadCrumb/BreadCrumbBase.d.ts.map +1 -0
  41. package/dist/components/LDBreadCrumb/BreadCrumbBase.js +17 -0
  42. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts +17 -0
  43. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts.map +1 -0
  44. package/dist/components/LDBreadCrumb/LDBreadCrumb.js +37 -0
  45. package/dist/components/LDButton/ButtonBase.d.ts +5 -0
  46. package/dist/components/LDButton/ButtonBase.d.ts.map +1 -0
  47. package/dist/components/LDButton/ButtonBase.js +10 -0
  48. package/dist/components/LDButton/ButtonSpinner.d.ts +8 -0
  49. package/dist/components/LDButton/ButtonSpinner.d.ts.map +1 -0
  50. package/dist/components/LDButton/ButtonSpinner.js +15 -0
  51. package/dist/components/LDButton/LDButton.d.ts +26 -0
  52. package/dist/components/LDButton/LDButton.d.ts.map +1 -0
  53. package/dist/components/LDButton/LDButton.js +102 -0
  54. package/dist/components/LDCalendar/LDCalendar.d.ts +16 -0
  55. package/dist/components/LDCalendar/LDCalendar.d.ts.map +1 -0
  56. package/dist/components/LDCalendar/LDCalendar.js +75 -0
  57. package/dist/components/LDCallout/CalloutBase.d.ts +18 -0
  58. package/dist/components/LDCallout/CalloutBase.d.ts.map +1 -0
  59. package/dist/components/LDCallout/CalloutBase.js +21 -0
  60. package/dist/components/LDCallout/LDCallout.d.ts +10 -0
  61. package/dist/components/LDCallout/LDCallout.d.ts.map +1 -0
  62. package/dist/components/LDCallout/LDCallout.js +6 -0
  63. package/dist/components/LDCarousel/CarouselBase.d.ts +98 -0
  64. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -0
  65. package/dist/components/LDCarousel/CarouselBase.js +144 -0
  66. package/dist/components/LDCarousel/LDCarousel.d.ts +50 -0
  67. package/dist/components/LDCarousel/LDCarousel.d.ts.map +1 -0
  68. package/dist/components/LDCarousel/LDCarousel.js +22 -0
  69. package/dist/components/LDCheckbox/CheckboxBase.d.ts +40 -0
  70. package/dist/components/LDCheckbox/CheckboxBase.d.ts.map +1 -0
  71. package/dist/components/LDCheckbox/CheckboxBase.js +57 -0
  72. package/dist/components/LDCheckbox/FormCheckbox.d.ts +14 -0
  73. package/dist/components/LDCheckbox/FormCheckbox.d.ts.map +1 -0
  74. package/dist/components/LDCheckbox/FormCheckbox.js +9 -0
  75. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts +13 -0
  76. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts.map +1 -0
  77. package/dist/components/LDCheckbox/FormCheckboxGroup.js +9 -0
  78. package/dist/components/LDCheckbox/LDCheckbox.d.ts +27 -0
  79. package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -0
  80. package/dist/components/LDCheckbox/LDCheckbox.js +30 -0
  81. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts +22 -0
  82. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts.map +1 -0
  83. package/dist/components/LDCheckbox/LDCheckboxGroup.js +13 -0
  84. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts +45 -0
  85. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts.map +1 -0
  86. package/dist/components/LDDataCalendar/DataCalendarBase.js +57 -0
  87. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts +12 -0
  88. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts.map +1 -0
  89. package/dist/components/LDDataCalendar/LDDataCalendar.js +13 -0
  90. package/dist/components/LDDatePicker/FormDatePicker.d.ts +12 -0
  91. package/dist/components/LDDatePicker/FormDatePicker.d.ts.map +1 -0
  92. package/dist/components/LDDatePicker/FormDatePicker.js +12 -0
  93. package/dist/components/LDDatePicker/LDDatePicker.d.ts +34 -0
  94. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -0
  95. package/dist/components/LDDatePicker/LDDatePicker.js +44 -0
  96. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts +12 -0
  97. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts.map +1 -0
  98. package/dist/components/LDDateRangePicker/FormDateRangePicker.js +10 -0
  99. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts +49 -0
  100. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -0
  101. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +197 -0
  102. package/dist/components/LDDivider/DividerBase.d.ts +9 -0
  103. package/dist/components/LDDivider/DividerBase.d.ts.map +1 -0
  104. package/dist/components/LDDivider/DividerBase.js +9 -0
  105. package/dist/components/LDDivider/LDDivider.d.ts +9 -0
  106. package/dist/components/LDDivider/LDDivider.d.ts.map +1 -0
  107. package/dist/components/LDDivider/LDDivider.js +11 -0
  108. package/dist/components/LDDrawer/DrawerBase.d.ts +52 -0
  109. package/dist/components/LDDrawer/DrawerBase.d.ts.map +1 -0
  110. package/dist/components/LDDrawer/DrawerBase.js +38 -0
  111. package/dist/components/LDDrawer/LDDrawer.d.ts +51 -0
  112. package/dist/components/LDDrawer/LDDrawer.d.ts.map +1 -0
  113. package/dist/components/LDDrawer/LDDrawer.js +30 -0
  114. package/dist/components/LDEditor/EditorBase.d.ts +52 -0
  115. package/dist/components/LDEditor/EditorBase.d.ts.map +1 -0
  116. package/dist/components/LDEditor/EditorBase.js +89 -0
  117. package/dist/components/LDEditor/LDEditor.d.ts +12 -0
  118. package/dist/components/LDEditor/LDEditor.d.ts.map +1 -0
  119. package/dist/components/LDEditor/LDEditor.js +162 -0
  120. package/dist/components/LDEditor/LDViewer.d.ts +7 -0
  121. package/dist/components/LDEditor/LDViewer.d.ts.map +1 -0
  122. package/dist/components/LDEditor/LDViewer.js +9 -0
  123. package/dist/components/LDEditor/extensions.d.ts +6 -0
  124. package/dist/components/LDEditor/extensions.d.ts.map +1 -0
  125. package/dist/components/LDEditor/extensions.js +38 -0
  126. package/dist/components/LDFileUpload/LDFileUploadBase.d.ts +50 -0
  127. package/dist/components/LDFileUpload/LDFileUploadBase.d.ts.map +1 -0
  128. package/dist/components/LDFileUpload/LDFileUploadBase.js +102 -0
  129. package/dist/components/LDInput/FormInput.d.ts +15 -0
  130. package/dist/components/LDInput/FormInput.d.ts.map +1 -0
  131. package/dist/components/LDInput/FormInput.js +19 -0
  132. package/dist/components/LDInput/InputBase.d.ts +22 -0
  133. package/dist/components/LDInput/InputBase.d.ts.map +1 -0
  134. package/dist/components/LDInput/InputBase.js +17 -0
  135. package/dist/components/LDInput/LDInput.d.ts +24 -0
  136. package/dist/components/LDInput/LDInput.d.ts.map +1 -0
  137. package/dist/components/LDInput/LDInput.js +71 -0
  138. package/dist/components/LDLNB/LDLNBBase.d.ts +82 -0
  139. package/dist/components/LDLNB/LDLNBBase.d.ts.map +1 -0
  140. package/dist/components/LDLNB/LDLNBBase.js +108 -0
  141. package/dist/components/LDLoadingDots/LDLoadingDots.d.ts +8 -0
  142. package/dist/components/LDLoadingDots/LDLoadingDots.d.ts.map +1 -0
  143. package/dist/components/LDLoadingDots/LDLoadingDots.js +29 -0
  144. package/dist/components/LDMenuBar/LDMenuBar.d.ts +21 -0
  145. package/dist/components/LDMenuBar/LDMenuBar.d.ts.map +1 -0
  146. package/dist/components/LDMenuBar/LDMenuBar.js +33 -0
  147. package/dist/components/LDMenuBar/MenuBarBase.d.ts +43 -0
  148. package/dist/components/LDMenuBar/MenuBarBase.d.ts.map +1 -0
  149. package/dist/components/LDMenuBar/MenuBarBase.js +69 -0
  150. package/dist/components/LDModal/LDModal.d.ts +51 -0
  151. package/dist/components/LDModal/LDModal.d.ts.map +1 -0
  152. package/dist/components/LDModal/LDModal.js +72 -0
  153. package/dist/components/LDModal/ModalBase.d.ts +42 -0
  154. package/dist/components/LDModal/ModalBase.d.ts.map +1 -0
  155. package/dist/components/LDModal/ModalBase.js +30 -0
  156. package/dist/components/LDModal/openModal.d.ts +24 -0
  157. package/dist/components/LDModal/openModal.d.ts.map +1 -0
  158. package/dist/components/LDModal/openModal.js +52 -0
  159. package/dist/components/LDOTPInput/LDOTPInput.d.ts +46 -0
  160. package/dist/components/LDOTPInput/LDOTPInput.d.ts.map +1 -0
  161. package/dist/components/LDOTPInput/LDOTPInput.js +87 -0
  162. package/dist/components/LDPagination/LDPagination.d.ts +12 -0
  163. package/dist/components/LDPagination/LDPagination.d.ts.map +1 -0
  164. package/dist/components/LDPagination/LDPagination.js +5 -0
  165. package/dist/components/LDPagination/PaginationBase.d.ts +36 -0
  166. package/dist/components/LDPagination/PaginationBase.d.ts.map +1 -0
  167. package/dist/components/LDPagination/PaginationBase.js +44 -0
  168. package/dist/components/LDPagination/paginationUtils.d.ts +2 -0
  169. package/dist/components/LDPagination/paginationUtils.d.ts.map +1 -0
  170. package/dist/components/LDPagination/paginationUtils.js +18 -0
  171. package/dist/components/LDPopover/LDPopover.d.ts +42 -0
  172. package/dist/components/LDPopover/LDPopover.d.ts.map +1 -0
  173. package/dist/components/LDPopover/LDPopover.js +31 -0
  174. package/dist/components/LDPopover/PopoverBase.d.ts +31 -0
  175. package/dist/components/LDPopover/PopoverBase.d.ts.map +1 -0
  176. package/dist/components/LDPopover/PopoverBase.js +18 -0
  177. package/dist/components/LDRadio/FormRadioGroup.d.ts +13 -0
  178. package/dist/components/LDRadio/FormRadioGroup.d.ts.map +1 -0
  179. package/dist/components/LDRadio/FormRadioGroup.js +9 -0
  180. package/dist/components/LDRadio/LDRadio.d.ts +24 -0
  181. package/dist/components/LDRadio/LDRadio.d.ts.map +1 -0
  182. package/dist/components/LDRadio/LDRadio.js +39 -0
  183. package/dist/components/LDRadio/LDRadioGroup.d.ts +22 -0
  184. package/dist/components/LDRadio/LDRadioGroup.d.ts.map +1 -0
  185. package/dist/components/LDRadio/LDRadioGroup.js +7 -0
  186. package/dist/components/LDRadio/RadioBase.d.ts +38 -0
  187. package/dist/components/LDRadio/RadioBase.d.ts.map +1 -0
  188. package/dist/components/LDRadio/RadioBase.js +46 -0
  189. package/dist/components/LDScrollArea/LDScrollArea.d.ts +15 -0
  190. package/dist/components/LDScrollArea/LDScrollArea.d.ts.map +1 -0
  191. package/dist/components/LDScrollArea/LDScrollArea.js +10 -0
  192. package/dist/components/LDSelect/FormMultiSelect.d.ts +13 -0
  193. package/dist/components/LDSelect/FormMultiSelect.d.ts.map +1 -0
  194. package/dist/components/LDSelect/FormMultiSelect.js +14 -0
  195. package/dist/components/LDSelect/FormSelect.d.ts +13 -0
  196. package/dist/components/LDSelect/FormSelect.d.ts.map +1 -0
  197. package/dist/components/LDSelect/FormSelect.js +10 -0
  198. package/dist/components/LDSelect/LDMultiSelect.d.ts +31 -0
  199. package/dist/components/LDSelect/LDMultiSelect.d.ts.map +1 -0
  200. package/dist/components/LDSelect/LDMultiSelect.js +59 -0
  201. package/dist/components/LDSelect/LDSelect.d.ts +41 -0
  202. package/dist/components/LDSelect/LDSelect.d.ts.map +1 -0
  203. package/dist/components/LDSelect/LDSelect.js +55 -0
  204. package/dist/components/LDSelect/SelectBase.d.ts +59 -0
  205. package/dist/components/LDSelect/SelectBase.d.ts.map +1 -0
  206. package/dist/components/LDSelect/SelectBase.js +211 -0
  207. package/dist/components/LDSkeleton/LDSkeleton.d.ts +10 -0
  208. package/dist/components/LDSkeleton/LDSkeleton.d.ts.map +1 -0
  209. package/dist/components/LDSkeleton/LDSkeleton.js +8 -0
  210. package/dist/components/LDSlider/LDSlider.d.ts +23 -0
  211. package/dist/components/LDSlider/LDSlider.d.ts.map +1 -0
  212. package/dist/components/LDSlider/LDSlider.js +195 -0
  213. package/dist/components/LDSpinner/LDSpinner.d.ts +25 -0
  214. package/dist/components/LDSpinner/LDSpinner.d.ts.map +1 -0
  215. package/dist/components/LDSpinner/LDSpinner.js +20 -0
  216. package/dist/components/LDTable/LDTable.d.ts +34 -0
  217. package/dist/components/LDTable/LDTable.d.ts.map +1 -0
  218. package/dist/components/LDTable/LDTable.js +29 -0
  219. package/dist/components/LDTable/LDTanstackTable.d.ts +23 -0
  220. package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -0
  221. package/dist/components/LDTable/LDTanstackTable.js +35 -0
  222. package/dist/components/LDTable/TableBase.d.ts +37 -0
  223. package/dist/components/LDTable/TableBase.d.ts.map +1 -0
  224. package/dist/components/LDTable/TableBase.js +39 -0
  225. package/dist/components/LDTable/TableField.d.ts +64 -0
  226. package/dist/components/LDTable/TableField.d.ts.map +1 -0
  227. package/dist/components/LDTable/TableField.js +87 -0
  228. package/dist/components/LDTimePicker/FormTimePicker.d.ts +12 -0
  229. package/dist/components/LDTimePicker/FormTimePicker.d.ts.map +1 -0
  230. package/dist/components/LDTimePicker/FormTimePicker.js +12 -0
  231. package/dist/components/LDTimePicker/LDTimePicker.d.ts +27 -0
  232. package/dist/components/LDTimePicker/LDTimePicker.d.ts.map +1 -0
  233. package/dist/components/LDTimePicker/LDTimePicker.js +120 -0
  234. package/dist/components/LDToast/LDToast.d.ts +18 -0
  235. package/dist/components/LDToast/LDToast.d.ts.map +1 -0
  236. package/dist/components/LDToast/LDToast.js +42 -0
  237. package/dist/components/LDToast/LDToaster.d.ts +7 -0
  238. package/dist/components/LDToast/LDToaster.d.ts.map +1 -0
  239. package/dist/components/LDToast/LDToaster.js +7 -0
  240. package/dist/components/LDToggleButton/FormToggleButton.d.ts +12 -0
  241. package/dist/components/LDToggleButton/FormToggleButton.d.ts.map +1 -0
  242. package/dist/components/LDToggleButton/FormToggleButton.js +9 -0
  243. package/dist/components/LDToggleButton/LDToggleButton.d.ts +31 -0
  244. package/dist/components/LDToggleButton/LDToggleButton.d.ts.map +1 -0
  245. package/dist/components/LDToggleButton/LDToggleButton.js +42 -0
  246. package/dist/components/LDToggleButton/ToggleButtonBase.d.ts +41 -0
  247. package/dist/components/LDToggleButton/ToggleButtonBase.d.ts.map +1 -0
  248. package/dist/components/LDToggleButton/ToggleButtonBase.js +59 -0
  249. package/dist/components/LDTooltip/LDTooltip.d.ts +18 -0
  250. package/dist/components/LDTooltip/LDTooltip.d.ts.map +1 -0
  251. package/dist/components/LDTooltip/LDTooltip.js +13 -0
  252. package/dist/components/LDTooltip/TooltipBase.d.ts +39 -0
  253. package/dist/components/LDTooltip/TooltipBase.d.ts.map +1 -0
  254. package/dist/components/LDTooltip/TooltipBase.js +46 -0
  255. package/dist/components/LNB/LNBBase.js +2 -2
  256. package/dist/components/Spinner/Spinner.d.ts +1 -1
  257. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  258. package/dist/components/Spinner/Spinner.js +1 -1
  259. package/dist/index.css +115 -13
  260. package/dist/index.d.ts +52 -49
  261. package/dist/index.d.ts.map +1 -1
  262. package/dist/index.js +88 -82
  263. 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,2 @@
1
+ export declare const calculatePaginationOptions: (currentPage?: number, totalPages?: number, numbersToShow?: number) => number[];
2
+ //# sourceMappingURL=paginationUtils.d.ts.map
@@ -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"}