@loword/loword-design-system 0.0.10 → 0.0.13

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 (266) hide show
  1. package/dist/components/LDAccordion/AccordionBase.d.ts +41 -0
  2. package/dist/components/LDAccordion/AccordionBase.d.ts.map +1 -0
  3. package/dist/components/LDAccordion/AccordionBase.js +24 -0
  4. package/dist/components/LDAccordion/LDAccordion.d.ts +31 -0
  5. package/dist/components/LDAccordion/LDAccordion.d.ts.map +1 -0
  6. package/dist/components/LDAccordion/LDAccordion.js +21 -0
  7. package/dist/components/LDAutoComplete/AutoCompleteBase.js +6 -6
  8. package/dist/components/LDAvatar/LDAvatar.d.ts +1 -1
  9. package/dist/components/LDAvatar/LDAvatar.d.ts.map +1 -1
  10. package/dist/components/LDAvatar/LDAvatar.js +19 -10
  11. package/dist/components/LDBadge/LDBadge.d.ts +5 -6
  12. package/dist/components/LDBadge/LDBadge.d.ts.map +1 -1
  13. package/dist/components/LDBadge/LDBadge.js +2 -2
  14. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts +1 -2
  15. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts.map +1 -1
  16. package/dist/components/LDButton/LDButton.d.ts +3 -3
  17. package/dist/components/LDButton/LDButton.d.ts.map +1 -1
  18. package/dist/components/LDButton/LDButton.js +5 -5
  19. package/dist/components/LDCalendar/CalendarBase.d.ts +17 -0
  20. package/dist/components/LDCalendar/CalendarBase.d.ts.map +1 -0
  21. package/dist/components/LDCalendar/CalendarBase.js +49 -0
  22. package/dist/components/LDCalendar/LDCalendar.d.ts +8 -14
  23. package/dist/components/LDCalendar/LDCalendar.d.ts.map +1 -1
  24. package/dist/components/LDCalendar/LDCalendar.js +51 -39
  25. package/dist/components/LDCarousel/CarouselBase.d.ts +3 -3
  26. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -1
  27. package/dist/components/LDCarousel/CarouselBase.js +12 -6
  28. package/dist/components/LDCarousel/LDCarousel.d.ts +7 -8
  29. package/dist/components/LDCarousel/LDCarousel.d.ts.map +1 -1
  30. package/dist/components/LDCarousel/LDCarousel.js +2 -2
  31. package/dist/components/LDCheckbox/CheckboxBase.d.ts +1 -3
  32. package/dist/components/LDCheckbox/CheckboxBase.d.ts.map +1 -1
  33. package/dist/components/LDCheckbox/CheckboxBase.js +4 -4
  34. package/dist/components/LDCheckbox/LDCheckbox.d.ts +2 -5
  35. package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -1
  36. package/dist/components/LDCheckbox/LDCheckbox.js +66 -8
  37. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts +3 -3
  38. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts.map +1 -1
  39. package/dist/components/LDCheckbox/LDCheckboxGroup.js +11 -2
  40. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts +12 -0
  41. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts.map +1 -0
  42. package/dist/components/LDCheckbox/LDFormCheckbox.js +8 -0
  43. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts +11 -0
  44. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts.map +1 -0
  45. package/dist/components/LDCheckbox/LDFormCheckboxGroup.js +8 -0
  46. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts +17 -1
  47. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts.map +1 -1
  48. package/dist/components/LDDataCalendar/DataCalendarBase.js +34 -4
  49. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts +27 -10
  50. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts.map +1 -1
  51. package/dist/components/LDDataCalendar/LDDataCalendar.js +8 -8
  52. package/dist/components/LDDatePicker/LDDatePicker.d.ts +10 -4
  53. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -1
  54. package/dist/components/LDDatePicker/LDDatePicker.js +95 -25
  55. package/dist/components/LDDatePicker/LDFormDatePicker.d.ts +13 -0
  56. package/dist/components/LDDatePicker/LDFormDatePicker.d.ts.map +1 -0
  57. package/dist/components/LDDatePicker/LDFormDatePicker.js +15 -0
  58. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts +13 -6
  59. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -1
  60. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +143 -93
  61. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.d.ts +13 -0
  62. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.d.ts.map +1 -0
  63. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.js +20 -0
  64. package/dist/components/LDDrawer/LDDrawer.d.ts +2 -0
  65. package/dist/components/LDDrawer/LDDrawer.d.ts.map +1 -1
  66. package/dist/components/LDDrawer/LDDrawer.js +2 -2
  67. package/dist/components/LDEditor/LDEditor.d.ts.map +1 -1
  68. package/dist/components/LDEditor/LDEditor.js +94 -54
  69. package/dist/components/LDEmpty/EmptyBase.d.ts +19 -0
  70. package/dist/components/LDEmpty/EmptyBase.d.ts.map +1 -0
  71. package/dist/components/LDEmpty/EmptyBase.js +18 -0
  72. package/dist/components/LDEmpty/LDEmpty.d.ts +35 -0
  73. package/dist/components/LDEmpty/LDEmpty.d.ts.map +1 -0
  74. package/dist/components/LDEmpty/LDEmpty.js +30 -0
  75. package/dist/components/LDFileUpload/FileUploadBase.d.ts +11 -3
  76. package/dist/components/LDFileUpload/FileUploadBase.d.ts.map +1 -1
  77. package/dist/components/LDFileUpload/FileUploadBase.js +21 -21
  78. package/dist/components/LDFileUpload/LDFileUpload.d.ts +3 -0
  79. package/dist/components/LDFileUpload/LDFileUpload.d.ts.map +1 -1
  80. package/dist/components/LDFileUpload/LDFileUpload.js +3 -3
  81. package/dist/components/LDFileUpload/LDFileUploadList.d.ts +3 -0
  82. package/dist/components/LDFileUpload/LDFileUploadList.d.ts.map +1 -1
  83. package/dist/components/LDFileUpload/LDFileUploadList.js +1 -3
  84. package/dist/components/LDFileUpload/LDImageUpload.d.ts +5 -0
  85. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -1
  86. package/dist/components/LDFileUpload/LDImageUpload.js +5 -3
  87. package/dist/components/LDFileUpload/LDImageUploadList.d.ts +3 -0
  88. package/dist/components/LDFileUpload/LDImageUploadList.d.ts.map +1 -1
  89. package/dist/components/LDFileUpload/LDImageUploadList.js +1 -3
  90. package/dist/components/LDForm/LDFormErrorMessage.d.ts +3 -1
  91. package/dist/components/LDForm/LDFormErrorMessage.d.ts.map +1 -1
  92. package/dist/components/LDForm/LDFormErrorMessage.js +2 -2
  93. package/dist/components/LDInput/InputBase.d.ts +5 -3
  94. package/dist/components/LDInput/InputBase.d.ts.map +1 -1
  95. package/dist/components/LDInput/InputBase.js +4 -4
  96. package/dist/components/LDInput/LDFormInput.d.ts +1 -1
  97. package/dist/components/LDInput/LDFormInput.d.ts.map +1 -1
  98. package/dist/components/LDInput/LDFormInput.js +17 -14
  99. package/dist/components/LDInput/LDInput.d.ts +10 -3
  100. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  101. package/dist/components/LDInput/LDInput.js +114 -50
  102. package/dist/components/LDLNB/LDLNB.d.ts +42 -0
  103. package/dist/components/LDLNB/LDLNB.d.ts.map +1 -0
  104. package/dist/components/LDLNB/LDLNB.js +34 -0
  105. package/dist/components/LDLNB/LDLNBBase.d.ts +5 -13
  106. package/dist/components/LDLNB/LDLNBBase.d.ts.map +1 -1
  107. package/dist/components/LDLNB/LDLNBBase.js +52 -18
  108. package/dist/components/LDMenuBar/LDMenuBar.d.ts +33 -19
  109. package/dist/components/LDMenuBar/LDMenuBar.d.ts.map +1 -1
  110. package/dist/components/LDMenuBar/LDMenuBar.js +13 -27
  111. package/dist/components/LDMenuBar/MenuBarBase.d.ts +4 -5
  112. package/dist/components/LDMenuBar/MenuBarBase.d.ts.map +1 -1
  113. package/dist/components/LDMenuBar/MenuBarBase.js +12 -14
  114. package/dist/components/LDModal/LDModal.d.ts +20 -40
  115. package/dist/components/LDModal/LDModal.d.ts.map +1 -1
  116. package/dist/components/LDModal/LDModal.js +56 -70
  117. package/dist/components/LDModal/LDModalView.d.ts +59 -0
  118. package/dist/components/LDModal/LDModalView.d.ts.map +1 -0
  119. package/dist/components/LDModal/LDModalView.js +72 -0
  120. package/dist/components/LDNotification/LDNotification.d.ts +40 -0
  121. package/dist/components/LDNotification/LDNotification.d.ts.map +1 -0
  122. package/dist/components/LDNotification/LDNotification.js +76 -0
  123. package/dist/components/LDNotification/NotificationBase.d.ts +29 -0
  124. package/dist/components/LDNotification/NotificationBase.d.ts.map +1 -0
  125. package/dist/components/LDNotification/NotificationBase.js +27 -0
  126. package/dist/components/LDOTPInput/LDFormOTPInput.d.ts +15 -0
  127. package/dist/components/LDOTPInput/LDFormOTPInput.d.ts.map +1 -0
  128. package/dist/components/LDOTPInput/LDFormOTPInput.js +8 -0
  129. package/dist/components/LDOTPInput/LDOTPInput.d.ts +10 -22
  130. package/dist/components/LDOTPInput/LDOTPInput.d.ts.map +1 -1
  131. package/dist/components/LDOTPInput/LDOTPInput.js +44 -72
  132. package/dist/components/LDOTPInput/OTPInputBase.d.ts +46 -0
  133. package/dist/components/LDOTPInput/OTPInputBase.d.ts.map +1 -0
  134. package/dist/components/LDOTPInput/OTPInputBase.js +48 -0
  135. package/dist/components/LDPagination/LDPagination.d.ts +5 -1
  136. package/dist/components/LDPagination/LDPagination.d.ts.map +1 -1
  137. package/dist/components/LDPagination/LDPagination.js +3 -1
  138. package/dist/components/LDPagination/PaginationBase.d.ts +13 -4
  139. package/dist/components/LDPagination/PaginationBase.d.ts.map +1 -1
  140. package/dist/components/LDPagination/PaginationBase.js +8 -7
  141. package/dist/components/LDPopover/LDPopover.d.ts +1 -1
  142. package/dist/components/LDPopover/LDPopover.d.ts.map +1 -1
  143. package/dist/components/LDPopover/LDPopover.js +8 -7
  144. package/dist/components/LDProgressBar/LDProgressBar.d.ts +16 -0
  145. package/dist/components/LDProgressBar/LDProgressBar.d.ts.map +1 -0
  146. package/dist/components/LDProgressBar/LDProgressBar.js +9 -0
  147. package/dist/components/LDProgressBar/ProgressBarBase.d.ts +11 -0
  148. package/dist/components/LDProgressBar/ProgressBarBase.d.ts.map +1 -0
  149. package/dist/components/LDProgressBar/ProgressBarBase.js +10 -0
  150. package/dist/components/LDRadio/LDFormRadioGroup.d.ts +11 -0
  151. package/dist/components/LDRadio/LDFormRadioGroup.d.ts.map +1 -0
  152. package/dist/components/LDRadio/LDFormRadioGroup.js +8 -0
  153. package/dist/components/LDRadio/LDRadio.d.ts +2 -2
  154. package/dist/components/LDRadio/LDRadio.d.ts.map +1 -1
  155. package/dist/components/LDRadio/LDRadio.js +70 -15
  156. package/dist/components/LDRadio/LDRadioGroup.d.ts +5 -3
  157. package/dist/components/LDRadio/LDRadioGroup.d.ts.map +1 -1
  158. package/dist/components/LDRadio/LDRadioGroup.js +11 -2
  159. package/dist/components/LDRadio/RadioBase.d.ts +2 -3
  160. package/dist/components/LDRadio/RadioBase.d.ts.map +1 -1
  161. package/dist/components/LDRadio/RadioBase.js +7 -4
  162. package/dist/components/LDSectionNav/LDSectionNav.d.ts +11 -0
  163. package/dist/components/LDSectionNav/LDSectionNav.d.ts.map +1 -0
  164. package/dist/components/LDSectionNav/LDSectionNav.js +11 -0
  165. package/dist/components/LDSectionNav/SectionNavBase.d.ts +20 -0
  166. package/dist/components/LDSectionNav/SectionNavBase.d.ts.map +1 -0
  167. package/dist/components/LDSectionNav/SectionNavBase.js +53 -0
  168. package/dist/components/LDSelect/LDFormMultiSelect.d.ts +13 -0
  169. package/dist/components/LDSelect/LDFormMultiSelect.d.ts.map +1 -0
  170. package/dist/components/LDSelect/{FormMultiSelect.js → LDFormMultiSelect.js} +2 -2
  171. package/dist/components/LDSelect/LDFormSelect.d.ts +13 -0
  172. package/dist/components/LDSelect/LDFormSelect.d.ts.map +1 -0
  173. package/dist/components/LDSelect/LDFormSelect.js +10 -0
  174. package/dist/components/LDSelect/LDMultiSelect.d.ts +6 -3
  175. package/dist/components/LDSelect/LDMultiSelect.d.ts.map +1 -1
  176. package/dist/components/LDSelect/LDMultiSelect.js +35 -31
  177. package/dist/components/LDSelect/LDSelect.d.ts +6 -3
  178. package/dist/components/LDSelect/LDSelect.d.ts.map +1 -1
  179. package/dist/components/LDSelect/LDSelect.js +37 -30
  180. package/dist/components/LDSelect/SelectBase.d.ts.map +1 -1
  181. package/dist/components/LDSelect/SelectBase.js +21 -7
  182. package/dist/components/LDSpinner/LDSpinner.d.ts +1 -1
  183. package/dist/components/LDSpinner/LDSpinner.d.ts.map +1 -1
  184. package/dist/components/LDSpinner/LDSpinner.js +6 -6
  185. package/dist/components/LDTable/LDCollapsibleTanstackTable.d.ts.map +1 -1
  186. package/dist/components/LDTable/LDCollapsibleTanstackTable.js +12 -9
  187. package/dist/components/LDTable/LDTable.d.ts.map +1 -1
  188. package/dist/components/LDTable/LDTable.js +1 -1
  189. package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -1
  190. package/dist/components/LDTable/LDTanstackTable.js +6 -7
  191. package/dist/components/LDTable/TableField.d.ts +1 -1
  192. package/dist/components/LDTable/TableField.d.ts.map +1 -1
  193. package/dist/components/LDTextarea/LDFormTextarea.d.ts +14 -0
  194. package/dist/components/LDTextarea/LDFormTextarea.d.ts.map +1 -0
  195. package/dist/components/LDTextarea/{FormTextarea.js → LDFormTextarea.js} +2 -2
  196. package/dist/components/LDTextarea/LDTextarea.d.ts +1 -1
  197. package/dist/components/LDTextarea/LDTextarea.d.ts.map +1 -1
  198. package/dist/components/LDTextarea/LDTextarea.js +30 -30
  199. package/dist/components/LDTimePicker/LDFormTimePicker.d.ts +12 -0
  200. package/dist/components/LDTimePicker/LDFormTimePicker.d.ts.map +1 -0
  201. package/dist/components/LDTimePicker/{FormTimePicker.js → LDFormTimePicker.js} +3 -3
  202. package/dist/components/LDTimePicker/LDTimePicker.js +3 -3
  203. package/dist/components/LDToast/LDToast.js +1 -1
  204. package/dist/components/LDToast/LDToaster.d.ts +2 -1
  205. package/dist/components/LDToast/LDToaster.d.ts.map +1 -1
  206. package/dist/components/LDToast/LDToaster.js +2 -2
  207. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts +10 -0
  208. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts.map +1 -0
  209. package/dist/components/LDToggleButton/LDFormToggleButton.js +8 -0
  210. package/dist/components/LDTooltip/LDTooltip.js +1 -1
  211. package/dist/components/LDTooltip/TooltipBase.d.ts +6 -2
  212. package/dist/components/LDTooltip/TooltipBase.d.ts.map +1 -1
  213. package/dist/components/LDTooltip/TooltipBase.js +4 -4
  214. package/dist/index.css +913 -307
  215. package/dist/index.d.ts +28 -19
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +32 -20
  218. package/dist/utils/file.d.ts +2 -2
  219. package/dist/utils/file.d.ts.map +1 -1
  220. package/dist/utils/file.js +26 -23
  221. package/dist/utils/renderIcon.d.ts +1 -2
  222. package/dist/utils/renderIcon.d.ts.map +1 -1
  223. package/dist/utils/renderIcon.js +5 -4
  224. package/package.json +14 -2
  225. package/src/styles/carousel.css +15 -14
  226. package/src/styles/components/button.css +2 -2
  227. package/src/styles/components/editor.css +6 -0
  228. package/src/styles/components/index.css +1 -0
  229. package/src/styles/components/input.css +16 -2
  230. package/src/styles/components/select.css +61 -0
  231. package/src/styles/components/shared.css +6 -6
  232. package/src/styles/motion.css +115 -0
  233. package/src/theme.css +3 -0
  234. package/dist/components/Icon/LucideIcon.d.ts +0 -12
  235. package/dist/components/Icon/LucideIcon.d.ts.map +0 -1
  236. package/dist/components/Icon/LucideIcon.js +0 -49
  237. package/dist/components/LDCheckbox/FormCheckbox.d.ts +0 -14
  238. package/dist/components/LDCheckbox/FormCheckbox.d.ts.map +0 -1
  239. package/dist/components/LDCheckbox/FormCheckbox.js +0 -9
  240. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts +0 -13
  241. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts.map +0 -1
  242. package/dist/components/LDCheckbox/FormCheckboxGroup.js +0 -9
  243. package/dist/components/LDDatePicker/FormDatePicker.d.ts +0 -12
  244. package/dist/components/LDDatePicker/FormDatePicker.d.ts.map +0 -1
  245. package/dist/components/LDDatePicker/FormDatePicker.js +0 -12
  246. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts +0 -12
  247. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts.map +0 -1
  248. package/dist/components/LDDateRangePicker/FormDateRangePicker.js +0 -10
  249. package/dist/components/LDModal/openModal.d.ts +0 -24
  250. package/dist/components/LDModal/openModal.d.ts.map +0 -1
  251. package/dist/components/LDModal/openModal.js +0 -52
  252. package/dist/components/LDRadio/FormRadioGroup.d.ts +0 -13
  253. package/dist/components/LDRadio/FormRadioGroup.d.ts.map +0 -1
  254. package/dist/components/LDRadio/FormRadioGroup.js +0 -9
  255. package/dist/components/LDSelect/FormMultiSelect.d.ts +0 -13
  256. package/dist/components/LDSelect/FormMultiSelect.d.ts.map +0 -1
  257. package/dist/components/LDSelect/FormSelect.d.ts +0 -13
  258. package/dist/components/LDSelect/FormSelect.d.ts.map +0 -1
  259. package/dist/components/LDSelect/FormSelect.js +0 -10
  260. package/dist/components/LDTextarea/FormTextarea.d.ts +0 -14
  261. package/dist/components/LDTextarea/FormTextarea.d.ts.map +0 -1
  262. package/dist/components/LDTimePicker/FormTimePicker.d.ts +0 -12
  263. package/dist/components/LDTimePicker/FormTimePicker.d.ts.map +0 -1
  264. package/dist/components/LDToggleButton/FormToggleButton.d.ts +0 -12
  265. package/dist/components/LDToggleButton/FormToggleButton.d.ts.map +0 -1
  266. package/dist/components/LDToggleButton/FormToggleButton.js +0 -9
@@ -1,21 +1,35 @@
1
- import type { ComponentProps } from 'react';
2
- import MenuBarBase from './MenuBarBase.js';
3
- declare const LDMenuBar: {
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
- };
1
+ import type { ElementType, ReactNode } from 'react';
2
+ /** 메뉴바 항목 */
3
+ export interface LDMenuBarItem {
4
+ /** 항목 구분 값 (열림 상태 식별) */
5
+ value: string;
6
+ /** Trigger에 표시할 라벨/아이콘 */
7
+ label: ReactNode;
8
+ /** 드롭다운 내용. 있으면 드롭다운 항목, 없으면 단순 링크가 된다 */
9
+ content?: ReactNode;
10
+ /** content를 헤더 전체 폭(mega) 패널 + 딤으로 표시 */
11
+ mega?: boolean;
12
+ /** 단순 링크일 때 Trigger 렌더 엘리먼트 (라우터 Link 주입용, 기본 'button') */
13
+ as?: ElementType;
14
+ /** 단순 링크 href */
15
+ href?: string;
16
+ }
17
+ export interface LDMenuBarProps {
18
+ /** 메뉴바 항목 목록 */
19
+ items: LDMenuBarItem[];
20
+ /** 드롭다운 열림 트리거 방식. 기본 'hover' */
21
+ trigger?: 'hover' | 'click';
22
+ /** 좌측 로고 슬롯 */
23
+ logo?: ReactNode;
24
+ /** 우측 액션 슬롯 (알림·아바타 등) */
25
+ actions?: ReactNode;
26
+ /** Root에 적용할 추가 className */
27
+ className?: string;
28
+ }
29
+ /**
30
+ * 가로 헤더형 메뉴바. items로 네비게이션을 구성하고 logo/actions 슬롯에 임의 콘텐츠를 주입한다.
31
+ * item.content가 있으면 드롭다운, 없으면 단순 링크. item.mega면 헤더 전체 폭 패널로 열린다.
32
+ */
33
+ declare const LDMenuBar: ({ items, trigger, logo, actions, className, }: LDMenuBarProps) => import("react/jsx-runtime").JSX.Element;
20
34
  export default LDMenuBar;
21
35
  //# sourceMappingURL=LDMenuBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LDMenuBar.d.ts","sourceRoot":"","sources":["../../../src/components/LDMenuBar/LDMenuBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,WAAW,MAAM,eAAe,CAAC;AAkHxC,QAAA,MAAM,SAAS;oCA1GZ,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,SAAS,CAAC"}
1
+ {"version":3,"file":"LDMenuBar.d.ts","sourceRoot":"","sources":["../../../src/components/LDMenuBar/LDMenuBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOpD,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,iCAAiC;IACjC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,eAAe;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD;;;GAGG;AACH,QAAA,MAAM,SAAS,GAAI,+CAMhB,cAAc,4CAuDhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1,33 +1,19 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import cn from '../../utils/cn.js';
4
4
  import MenuBarBase from './MenuBarBase.js';
5
- // 스타일 래퍼: Base 골격에 디자인 토큰 클래스를 입혀 재노출.
6
- // className을 주면 cn으로 머지되어 소비측 오버라이드 우선.
7
- const Root = ({ className, ...props }) => (_jsx(MenuBarBase.Root, { className: cn('relative flex items-center justify-between w-full h-[64px] min-h-[64px]', 'px-md gap-10 bg-white border-b border-mono100 sticky top-0 z-50', className), ...props }));
8
- const Logo = ({ className, ...props }) => (_jsx(MenuBarBase.Logo, { className: cn('flex items-center shrink-0', className), ...props }));
9
- const Nav = ({ className, ...props }) => (_jsx(MenuBarBase.Nav, { className: cn('flex flex-1 items-center justify-start gap-xs', className), ...props }));
10
- const Item = ({ className, ...props }) => (_jsx(MenuBarBase.Item, { className: className, ...props }));
11
- const Trigger = ({ className, ...props }) => (_jsx(MenuBarBase.Trigger, { className: cn('flex items-center gap-xs px-sm py-xs rounded-[5px] cursor-pointer', 'display16 bold text-mono700 hover:bg-mono100 hover:text-mono900 ld-transition', 'aria-expanded:bg-tintBlue aria-expanded:text-blue400', className), ...props }));
5
+ const TRIGGER_CLASS = cn('flex items-center gap-xs px-sm py-xs rounded-[5px] cursor-pointer', 'display16 bold text-mono700 hover:bg-mono100 hover:text-mono900 ld-transition', 'aria-expanded:bg-tintBlue aria-expanded:text-blue400');
12
6
  // item 모드: 항목 바로 아래 작은 드롭다운
13
- const Content = ({ className, ...props }) => (_jsx(MenuBarBase.Content, { className: cn('absolute top-full left-0 mt-xs min-w-[180px] z-50', 'flex flex-col gap-xs p-xs rounded-[8px] bg-white border border-mono100 shadow-lg', className), ...props }));
14
- // mega 모드: 헤더 전체 폭 패널 + 뒤쪽 딤(클릭 시 닫기)
15
- // fixed로 부모 li(relative)를 벗어나 뷰포트(=헤더) 전체 폭을 차지. top-16 = 헤더 높이 64px.
16
- const MegaContent = ({ className, ...props }) => (_jsx(MenuBarBase.Content, { backdrop: true, backdropClassName: "fixed left-0 right-0 top-16 bottom-0 z-40 bg-black/40", className: cn('fixed left-0 right-0 top-16 z-50', 'p-lg bg-white border-b border-mono100 shadow-lg', className), ...props }));
17
- // Item의 드롭다운 자동 판정이 래퍼를 통과하도록 Base와 동일한 displayName 부여
18
- Content.displayName = MenuBarBase.Content.displayName;
19
- MegaContent.displayName = MenuBarBase.Content.displayName;
20
- const Actions = ({ className, ...props }) => (_jsx(MenuBarBase.Actions, { className: cn('flex items-center gap-sm shrink-0', className), ...props }));
21
- const Separator = ({ className, }) => (_jsx(MenuBarBase.Separator, { className: cn('w-px h-5 bg-mono200', className) }));
22
- const LDMenuBar = {
23
- Root,
24
- Logo,
25
- Nav,
26
- Item,
27
- Trigger,
28
- Content,
29
- MegaContent,
30
- Actions,
31
- Separator,
7
+ const DROPDOWN_CLASS = cn('absolute top-full left-0 mt-xs min-w-[180px] z-50', 'flex flex-col gap-xs p-xs rounded-[8px] bg-white border border-mono100 shadow-lg');
8
+ // mega 모드: fixed로 부모 li(relative)를 벗어나 헤더 전체 폭 차지. top-16 = 헤더 높이 64px.
9
+ const MEGA_CLASS = cn('fixed left-0 right-0 top-16 z-50', 'p-lg bg-white border-b border-mono100 shadow-lg');
10
+ const MEGA_BACKDROP_CLASS = 'fixed left-0 right-0 top-16 bottom-0 z-40 bg-black/40';
11
+ /**
12
+ * 가로 헤더형 메뉴바. items로 네비게이션을 구성하고 logo/actions 슬롯에 임의 콘텐츠를 주입한다.
13
+ * item.content가 있으면 드롭다운, 없으면 단순 링크. item.mega면 헤더 전체 폭 패널로 열린다.
14
+ */
15
+ const LDMenuBar = ({ items, trigger = 'hover', logo, actions, className, }) => {
16
+ return (_jsxs(MenuBarBase.Root, { trigger: trigger, className: cn('relative flex items-center justify-between w-full h-[64px] min-h-[64px]', 'px-md gap-10 bg-white border-b border-mono100 sticky top-0 z-50', className), children: [logo && (_jsx(MenuBarBase.Logo, { className: "flex items-center shrink-0", children: logo })), _jsx(MenuBarBase.Nav, { className: "flex flex-1 items-center justify-start gap-xs", children: items.map((item) => (_jsxs(MenuBarBase.Item, { value: item.value, hasDropdown: !!item.content, children: [_jsx(MenuBarBase.Trigger, { as: item.content ? undefined : item.as, href: item.content ? undefined : item.href, className: TRIGGER_CLASS, children: item.label }), item.content &&
17
+ (item.mega ? (_jsx(MenuBarBase.Content, { backdrop: true, backdropClassName: MEGA_BACKDROP_CLASS, className: MEGA_CLASS, children: item.content })) : (_jsx(MenuBarBase.Content, { className: DROPDOWN_CLASS, children: item.content })))] }, item.value))) }), actions && (_jsx(MenuBarBase.Actions, { className: "flex items-center gap-sm shrink-0", children: actions }))] }));
32
18
  };
33
19
  export default LDMenuBar;
@@ -10,6 +10,8 @@ interface SlotProps {
10
10
  }
11
11
  interface ItemProps {
12
12
  value: string;
13
+ /** 드롭다운(Content/MegaContent)을 가진 항목이면 true. 지정 시 hover/click으로 열리고 Trigger가 토글로 동작한다. 없으면 단순 링크. */
14
+ hasDropdown?: boolean;
13
15
  children: ReactNode;
14
16
  className?: string;
15
17
  }
@@ -28,12 +30,9 @@ declare const MenuBarBase: {
28
30
  Root: ({ children, className, trigger }: RootProps) => import("react/jsx-runtime").JSX.Element;
29
31
  Logo: ({ children, className }: SlotProps) => import("react/jsx-runtime").JSX.Element;
30
32
  Nav: ({ children, className }: SlotProps) => import("react/jsx-runtime").JSX.Element;
31
- Item: ({ value, children, className }: ItemProps) => import("react/jsx-runtime").JSX.Element;
33
+ Item: ({ value, hasDropdown, children, className, }: ItemProps) => import("react/jsx-runtime").JSX.Element;
32
34
  Trigger: ({ as: Comp, children, className, ...rest }: TriggerProps) => import("react/jsx-runtime").JSX.Element;
33
- Content: {
34
- ({ children, className, backdrop, backdropClassName, }: ContentProps): import("react/jsx-runtime").JSX.Element | null;
35
- displayName: string;
36
- };
35
+ Content: ({ children, className, backdrop, backdropClassName, }: ContentProps) => import("react/jsx-runtime").JSX.Element;
37
36
  Actions: ({ children, className }: SlotProps) => import("react/jsx-runtime").JSX.Element;
38
37
  Separator: ({ className }: {
39
38
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuBarBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDMenuBar/MenuBarBase.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA0CpD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B;AAqBD,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAuCD,UAAU,YAAa,SAAQ,SAAS;IACtC,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA0BD,QAAA,MAAM,WAAW;6CAjJyC,SAAS;oCAwB5B,SAAS;mCAIV,SAAS;2CAmBD,SAAS;0DAoCpD,YAAY;;gEA2CZ,YAAY;;;uCA9F2B,SAAS;+BAIjB;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAsHvD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MenuBarBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDMenuBar/MenuBarBase.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAwCpD,UAAU,SAAS;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B;AAqBD,UAAU,SAAS;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmBD,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oGAAoG;IACpG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyBD,UAAU,YAAY;IACpB,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAuCD,UAAU,YAAa,SAAQ,SAAS;IACtC,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAmCD,QAAA,MAAM,WAAW;6CA3JyC,SAAS;oCAwB5B,SAAS;mCAIV,SAAS;yDA0B5C,SAAS;0DA8BT,YAAY;qEA2CZ,YAAY;uCA/F2B,SAAS;+BAIjB;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAgIvD,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,8 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Children, createContext, isValidElement, useContext, useState, } from 'react';
3
+ import { createContext, useContext, useState } from 'react';
4
4
  import cn from '../../utils/cn.js';
5
- const CONTENT_NAME = 'MenuBarContent';
6
5
  const MenuBarContext = createContext(null);
7
6
  const useMenuBarContext = () => {
8
7
  const ctx = useContext(MenuBarContext);
@@ -26,21 +25,18 @@ const Logo = ({ children, className }) => (_jsx("div", { className: className, c
26
25
  const Nav = ({ children, className }) => (_jsx("ul", { className: className, children: children }));
27
26
  const Actions = ({ children, className }) => (_jsx("div", { className: className, children: children }));
28
27
  const Separator = ({ className }) => (_jsx("span", { "aria-hidden": true, className: className }));
29
- const Item = ({ value, children, className }) => {
28
+ const Item = ({ value, hasDropdown = false, children, className, }) => {
30
29
  const { trigger, setOpenValue } = useMenuBarContext();
31
- // Content 존재 여부로 드롭다운 항목인지 자동 판정 (스타일 래퍼도 같은 displayName을 가짐)
32
- const hasContent = Children.toArray(children).some((c) => isValidElement(c) &&
33
- c.type?.displayName === CONTENT_NAME);
34
- const hoverProps = trigger === 'hover' && hasContent
30
+ const hoverProps = trigger === 'hover' && hasDropdown
35
31
  ? { onMouseEnter: () => setOpenValue(value) }
36
32
  : {};
37
- return (_jsx(ItemContext, { value: { value, hasContent }, children: _jsx("li", { className: cn('relative', className), ...hoverProps, children: children }) }));
33
+ return (_jsx(ItemContext, { value: { value, hasDropdown }, children: _jsx("li", { className: cn('relative', className), ...hoverProps, children: children }) }));
38
34
  };
39
35
  const Trigger = ({ as: Comp = 'button', children, className, ...rest }) => {
40
36
  const { trigger, setOpenValue, isOpen } = useMenuBarContext();
41
- const { value, hasContent } = useItemContext();
37
+ const { value, hasDropdown } = useItemContext();
42
38
  // 드롭다운 없는 항목 → 순수 링크/버튼 (토글 안 함)
43
- if (!hasContent) {
39
+ if (!hasDropdown) {
44
40
  return (_jsx(Comp, { className: className, ...rest, children: children }));
45
41
  }
46
42
  const handleClick = trigger === 'click'
@@ -51,11 +47,13 @@ const Trigger = ({ as: Comp = 'button', children, className, ...rest }) => {
51
47
  const Content = ({ children, className, backdrop, backdropClassName, }) => {
52
48
  const { isOpen, setOpenValue } = useMenuBarContext();
53
49
  const { value } = useItemContext();
54
- if (!isOpen(value))
55
- return null;
56
- return (_jsxs(_Fragment, { children: [backdrop && (_jsx("div", { "aria-hidden": true, onClick: () => setOpenValue(null), className: backdropClassName })), _jsx("div", { className: className, children: children })] }));
50
+ const open = isOpen(value);
51
+ // 항상 마운트해두고 data-open으로 opacity를 300ms 전환(열림 fade-in / 닫힘 fade-out).
52
+ // 닫힘 상태에선 inert로 클릭·포커스·스크린리더에서 제외한다 — 안 그러면 opacity:0인
53
+ // mega 딤이 화면 전체 클릭을 가로챈다.
54
+ const fade = 'ld-transition data-[open=false]:opacity-0';
55
+ return (_jsxs(_Fragment, { children: [backdrop && (_jsx("div", { "aria-hidden": true, "data-open": open, inert: !open, onClick: () => setOpenValue(null), className: cn(fade, backdropClassName) })), _jsx("div", { "data-open": open, inert: !open, className: cn(fade, className), children: children })] }));
57
56
  };
58
- Content.displayName = CONTENT_NAME;
59
57
  const MenuBarBase = {
60
58
  Root,
61
59
  Logo,
@@ -1,51 +1,31 @@
1
- import { type ReactNode } from 'react';
2
- export type ModalSize = 'small' | 'medium' | 'large' | 'xlarge';
3
- export interface ModalButtons {
4
- direction?: 'row' | 'column';
5
- list?: ModalButton[];
6
- }
7
- export interface ModalButton<T = unknown> {
8
- /** 버튼 텍스트 */
9
- label: string;
10
- /** 버튼 식별 값 (onButtonClick에 전달) */
11
- value: T;
12
- /** 버튼 스타일 유형 */
13
- variant?: 'solid' | 'outline' | 'ghost';
14
- /** 버튼 색상 테마 */
15
- color?: 'neutral' | 'point' | 'danger';
16
- /** 클릭 핸들러 (false 반환 시 모달 닫힘 방지) */
17
- onClick?: () => void | boolean | Promise<void | boolean>;
18
- }
19
- export interface LDModalProps {
20
- /** 모달 열림 상태 (제어 컴포넌트) */
21
- open?: boolean;
22
- /** 초기 열림 상태 (비제어 컴포넌트) */
23
- defaultOpen?: boolean;
24
- /** 열림 상태 변경 시 호출되는 콜백 */
25
- onOpenChange?: (open: boolean) => void;
26
- /** 서브 타이틀 (title 위에 표시) */
1
+ import { TModalClassNames, type ModalSize } from './LDModalView.js';
2
+ export interface LDModalOptions<T = undefined> {
27
3
  name?: string;
28
- /** 모달 제목 */
29
4
  title?: string;
30
- /** 모달 설명 텍스트 */
31
5
  description?: string;
32
- /** 본문 콘텐츠 */
33
- children?: ReactNode;
34
- /** 모달 너비 프리셋 */
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';
35
18
  size?: ModalSize;
36
- /** 너비 직접 지정 (size보다 우선) */
37
19
  icon?: 'success' | 'fail';
38
- /** 하단 버튼 목록 */
39
- buttons?: ModalButtons;
40
- /** 스크롤 동작 */
20
+ /** 스크롤 동작 (LDModalView와 동일) */
41
21
  scrollBehavior?: 'inside' | 'outside';
42
- /** 추가 CSS 클래스 (모달 패널에 적용) */
22
+ /** 모달 패널에 적용할 추가 CSS 클래스 */
43
23
  className?: string;
44
- /** 인라인 스타일 (모달 패널에 적용) */
24
+ /** 모달 패널 인라인 스타일 (자유 width/height 등) */
45
25
  style?: React.CSSProperties;
46
- /** 버튼 클릭 시 해당 버튼의 value를 전달하는 콜백 */
47
- onButtonClick?: (value: unknown) => void;
26
+ onBeforeClose?: () => Promise<boolean> | boolean;
27
+ classNames?: TModalClassNames;
48
28
  }
49
- declare const LDModal: ({ open, defaultOpen, onOpenChange, name, title, description, children, size, icon, buttons, scrollBehavior, className, style, onButtonClick, }: LDModalProps) => import("react/jsx-runtime").JSX.Element;
29
+ declare const LDModal: <T = undefined>(options: LDModalOptions<T>) => Promise<T | undefined>;
50
30
  export default LDModal;
51
31
  //# sourceMappingURL=LDModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LDModal.d.ts","sourceRoot":"","sources":["../../../src/components/LDModal/LDModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAO/C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,CAAC,CAAC;IACT,gBAAgB;IAChB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,eAAe;IACf,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvC,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yBAAyB;IACzB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,eAAe;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,aAAa;IACb,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AA6CD,QAAA,MAAM,OAAO,GAAI,gJAed,YAAY,4CA0Jd,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"LDModal.d.ts","sourceRoot":"","sources":["../../../src/components/LDModal/LDModal.tsx"],"names":[],"mappings":"AAIA,OAAoB,EAClB,gBAAgB,EAEhB,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,SAAS;IAC3C,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,+BAA+B;IAC/B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjD,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,QAAA,MAAM,OAAO,GAAI,CAAC,GAAG,SAAS,EAC5B,SAAS,cAAc,CAAC,CAAC,CAAC,KACzB,OAAO,CAAC,CAAC,GAAG,SAAS,CA2EvB,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -1,72 +1,58 @@
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
- }) }))] })] }) })] }));
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useRef, useState } from 'react';
4
+ import { createRoot } from 'react-dom/client';
5
+ import LDModalView from './LDModalView.js';
6
+ const LDModal = (options) => {
7
+ return new Promise((resolve) => {
8
+ const container = document.createElement('div');
9
+ document.body.appendChild(container);
10
+ const root = createRoot(container);
11
+ const closeModal = () => {
12
+ root.unmount();
13
+ container.remove();
14
+ };
15
+ const ModalHost = () => {
16
+ const [open, setOpen] = useState(true);
17
+ const closingRef = useRef(false);
18
+ const close = async (value) => {
19
+ if (closingRef.current)
20
+ return;
21
+ if (options.onBeforeClose) {
22
+ const canClose = await options.onBeforeClose();
23
+ if (!canClose)
24
+ return;
25
+ }
26
+ closingRef.current = true;
27
+ setOpen(false);
28
+ resolve(value);
29
+ setTimeout(closeModal, 300);
30
+ };
31
+ const list = options.buttons?.map((btn) => ({
32
+ ...btn,
33
+ value: btn.value,
34
+ onClick: async () => {
35
+ let shouldClose = true;
36
+ if (btn.onClick) {
37
+ const res = await btn.onClick();
38
+ if (res === false)
39
+ shouldClose = false;
40
+ }
41
+ if (shouldClose) {
42
+ close(btn.value);
43
+ }
44
+ return false; // LDModalView 내부의 기본 닫기 동작 방지
45
+ },
46
+ }));
47
+ const content = typeof options.content === 'function'
48
+ ? options.content({ onClose: close })
49
+ : options.content;
50
+ return (_jsx(LDModalView, { open: open, onOpenChange: (next) => {
51
+ if (!next)
52
+ close(undefined);
53
+ }, name: options.name, title: options.title, description: options.description, size: options.size, icon: options.icon, scrollBehavior: options.scrollBehavior, style: options.style, buttons: list ? { direction: options.buttonsDirection, list } : undefined, classNames: options.classNames, children: content }));
54
+ };
55
+ root.render(_jsx(ModalHost, {}));
56
+ });
71
57
  };
72
58
  export default LDModal;
@@ -0,0 +1,59 @@
1
+ import { type ReactNode } from 'react';
2
+ export type ModalSize = 'small' | 'medium' | 'large' | 'xlarge';
3
+ export type TModalClassNames = {
4
+ overlay?: string;
5
+ content?: string;
6
+ layout?: string;
7
+ panel?: string;
8
+ close?: string;
9
+ title?: string;
10
+ description?: string;
11
+ };
12
+ export interface ModalButtons {
13
+ direction?: 'row' | 'column';
14
+ list?: ModalButton[];
15
+ }
16
+ export interface ModalButton<T = unknown> {
17
+ /** 버튼 텍스트 */
18
+ label: string;
19
+ /** 버튼 식별 값 (onButtonClick에 전달) */
20
+ value: T;
21
+ /** 버튼 스타일 유형 */
22
+ variant?: 'solid' | 'outline' | 'ghost';
23
+ /** 버튼 색상 테마 */
24
+ color?: 'neutral' | 'point' | 'danger';
25
+ /** 클릭 핸들러 (false 반환 시 모달 닫힘 방지) */
26
+ onClick?: () => void | boolean | Promise<void | boolean>;
27
+ }
28
+ export interface LDModalViewProps {
29
+ /** 모달 열림 상태 (제어 컴포넌트) */
30
+ open?: boolean;
31
+ /** 초기 열림 상태 (비제어 컴포넌트) */
32
+ defaultOpen?: boolean;
33
+ /** 열림 상태 변경 시 호출되는 콜백 */
34
+ onOpenChange?: (open: boolean) => void;
35
+ /** 서브 타이틀 (title 위에 표시) */
36
+ name?: string;
37
+ /** 모달 제목 */
38
+ title?: string;
39
+ /** 모달 설명 텍스트 */
40
+ description?: string;
41
+ /** 본문 콘텐츠 */
42
+ children?: ReactNode;
43
+ /** 모달 너비 프리셋 */
44
+ size?: ModalSize;
45
+ /** 너비 직접 지정 (size보다 우선) */
46
+ icon?: 'success' | 'fail';
47
+ /** 하단 버튼 목록 */
48
+ buttons?: ModalButtons;
49
+ /** 스크롤 동작 */
50
+ scrollBehavior?: 'inside' | 'outside';
51
+ /** 인라인 스타일 (모달 패널에 적용) */
52
+ style?: React.CSSProperties;
53
+ /** 버튼 클릭 시 해당 버튼의 value를 전달하는 콜백 */
54
+ onButtonClick?: (value: unknown) => void;
55
+ classNames?: TModalClassNames;
56
+ }
57
+ declare const LDModalView: ({ open, defaultOpen, onOpenChange, name, title, description, children, size, icon, buttons, scrollBehavior, classNames, style, onButtonClick, }: LDModalViewProps) => import("react/jsx-runtime").JSX.Element;
58
+ export default LDModalView;
59
+ //# sourceMappingURL=LDModalView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDModalView.d.ts","sourceRoot":"","sources":["../../../src/components/LDModal/LDModalView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAO/C,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC7B,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,CAAC,CAAC;IACT,gBAAgB;IAChB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACxC,eAAe;IACf,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACvC,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0BAA0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yBAAyB;IACzB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,eAAe;IACf,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,aAAa;IACb,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,0BAA0B;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,oCAAoC;IACpC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AA6CD,QAAA,MAAM,WAAW,GAAI,iJAelB,gBAAgB,4CAmLlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -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 cn from '../../utils/cn.js';
5
+ import LDButton from '../LDButton/LDButton.js';
6
+ import { Check, CircleAlert, X } from 'lucide-react';
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 LDModalView = ({ open, defaultOpen, onOpenChange, name, title, description, children, size = 'small', icon, buttons, scrollBehavior = 'inside', classNames, 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, { className: classNames?.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
+ }, classNames?.content), 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]', classNames?.layout), style: style, onClick: (e) => e.stopPropagation(), children: [_jsx(ModalBase.Close, { asChild: true, className: cn('absolute top-4 right-5 text-neutral500 cursor-pointer outline-hidden', classNames?.close), children: _jsx(LDButton, { variant: "ghost", color: "neutral", leftIcon: _jsx(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], classNames?.panel), 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(Check, { className: "text-white" }) })), icon === 'fail' && (_jsx("div", { className: cn('flex items-center justify-center rounded-full bg-danger600', statusIconSizeClasses[size]), children: _jsx(CircleAlert, { className: "text-white" }) })), name && (_jsx("span", { className: "display16 bold text-neutral500 whitespace-pre-wrap", children: name })), title && (_jsx(ModalBase.Title, { className: cn('display28 bold whitespace-pre-wrap text-center', classNames?.title), children: title })), description && (_jsx(ModalBase.Description, { className: cn('display14 text-neutral500 whitespace-pre-wrap text-center', classNames?.description), 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 LDModalView;
@@ -0,0 +1,40 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ import { type NotificationType } from './NotificationBase.js';
3
+ export type NotificationSize = 'small' | 'medium' | 'large';
4
+ export interface LDNotificationProps {
5
+ /** 트리거로 사용할 노드 — 벨 아이콘, 아바타 등 임의의 ReactNode */
6
+ children: ReactNode;
7
+ /** 배지 표시 방식 — 'dot'이면 점만, 'count'면 숫자로 표시 (기본값 'count') */
8
+ type?: NotificationType;
9
+ /** type='dot'일 때 점을 보여줄지 여부 (기본값 false). type='count'일 땐 사용되지 않음 */
10
+ dot?: boolean;
11
+ /** type='count'일 때 표시할 알림 개수 (기본값 0) */
12
+ count?: number;
13
+ /** type='count'일 때, count가 이 값을 초과하면 `${overflowCount}+`로 표시 (기본값 99) */
14
+ overflowCount?: number;
15
+ /** type='count'일 때, count가 0이어도 배지를 표시할지 여부 (기본값 false) */
16
+ showZero?: boolean;
17
+ /** 기본 위치(우측 상단 모서리)에서 [x, y]만큼 px 이동. x는 오른쪽, y는 아래쪽이 + 방향 */
18
+ offset?: [number, number];
19
+ /** 배지 크기 — 'small' | 'medium' | 'large' (기본값 'medium') */
20
+ size?: NotificationSize;
21
+ /** 트리거와 배지를 함께 감싸는 Root wrapper에 적용할 className */
22
+ className?: string;
23
+ /** 배지(Indicator) 자체에 적용할 className — 색상 등 기본 스타일을 덮어쓸 때 사용 */
24
+ indicatorClassName?: string;
25
+ /**
26
+ * count가 증가하는 순간 트리거(children) wrapper에 잠깐 추가되는 className.
27
+ * 예: `"animate-bell"` — 새 알림이 왔을 때 트리거를 흔드는 등 강조 효과를 주고 싶을 때 사용
28
+ */
29
+ triggerHighlightClassName?: string;
30
+ /**
31
+ * count가 증가하는 순간 배지(Indicator)에 추가되는 className.
32
+ * 예: `"animate-bounce"`
33
+ */
34
+ indicatorHighlightClassName?: string;
35
+ /** Root wrapper에 적용할 인라인 스타일 */
36
+ style?: CSSProperties;
37
+ }
38
+ declare const LDNotification: ({ children, type, dot, count, overflowCount, showZero, offset, size, className, indicatorClassName, triggerHighlightClassName, indicatorHighlightClassName, style, }: LDNotificationProps) => import("react/jsx-runtime").JSX.Element;
39
+ export default LDNotification;
40
+ //# sourceMappingURL=LDNotification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDNotification.d.ts","sourceRoot":"","sources":["../../../src/components/LDNotification/LDNotification.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAyB,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,QAAQ,EAAE,SAAS,CAAC;IACpB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,oEAAoE;IACpE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;OAGG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,gCAAgC;IAChC,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAiID,QAAA,MAAM,cAAc,GAAI,sKAcrB,mBAAmB,4CA4BrB,CAAC;AAEF,eAAe,cAAc,CAAC"}