@loword/loword-design-system 0.0.9 → 0.0.11

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 (166) hide show
  1. package/dist/components/LDAutoComplete/AutoCompleteBase.js +6 -6
  2. package/dist/components/LDBadge/LDBadge.d.ts +5 -6
  3. package/dist/components/LDBadge/LDBadge.d.ts.map +1 -1
  4. package/dist/components/LDBadge/LDBadge.js +2 -2
  5. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts +1 -2
  6. package/dist/components/LDBreadCrumb/LDBreadCrumb.d.ts.map +1 -1
  7. package/dist/components/LDButton/LDButton.d.ts +3 -3
  8. package/dist/components/LDButton/LDButton.d.ts.map +1 -1
  9. package/dist/components/LDButton/LDButton.js +5 -5
  10. package/dist/components/LDCalendar/LDCalendar.d.ts +7 -6
  11. package/dist/components/LDCalendar/LDCalendar.d.ts.map +1 -1
  12. package/dist/components/LDCalendar/LDCalendar.js +59 -16
  13. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -1
  14. package/dist/components/LDCarousel/CarouselBase.js +8 -4
  15. package/dist/components/LDCheckbox/CheckboxBase.d.ts +1 -3
  16. package/dist/components/LDCheckbox/CheckboxBase.d.ts.map +1 -1
  17. package/dist/components/LDCheckbox/CheckboxBase.js +3 -3
  18. package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -1
  19. package/dist/components/LDCheckbox/LDCheckbox.js +4 -4
  20. package/dist/components/LDCheckbox/LDCheckboxGroup.js +1 -1
  21. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts +14 -0
  22. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts.map +1 -0
  23. package/dist/components/LDCheckbox/{FormCheckbox.js → LDFormCheckbox.js} +2 -2
  24. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts +13 -0
  25. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts.map +1 -0
  26. package/dist/components/LDCheckbox/{FormCheckboxGroup.js → LDFormCheckboxGroup.js} +2 -2
  27. package/dist/components/LDDatePicker/LDDatePicker.d.ts +10 -4
  28. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -1
  29. package/dist/components/LDDatePicker/LDDatePicker.js +95 -25
  30. package/dist/components/LDDatePicker/LDFormDatePicker.d.ts +13 -0
  31. package/dist/components/LDDatePicker/LDFormDatePicker.d.ts.map +1 -0
  32. package/dist/components/LDDatePicker/LDFormDatePicker.js +15 -0
  33. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts +13 -6
  34. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -1
  35. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +143 -93
  36. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.d.ts +13 -0
  37. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.d.ts.map +1 -0
  38. package/dist/components/LDDateRangePicker/LDFormDateRangePicker.js +20 -0
  39. package/dist/components/LDDrawer/LDDrawer.js +2 -2
  40. package/dist/components/LDFileUpload/FileUploadBase.d.ts +11 -3
  41. package/dist/components/LDFileUpload/FileUploadBase.d.ts.map +1 -1
  42. package/dist/components/LDFileUpload/FileUploadBase.js +17 -17
  43. package/dist/components/LDFileUpload/LDFileUpload.d.ts.map +1 -1
  44. package/dist/components/LDFileUpload/LDFileUpload.js +3 -1
  45. package/dist/components/LDFileUpload/LDFileUploadList.js +1 -1
  46. package/dist/components/LDFileUpload/LDImageUpload.d.ts +2 -0
  47. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -1
  48. package/dist/components/LDFileUpload/LDImageUpload.js +5 -1
  49. package/dist/components/LDFileUpload/LDImageUploadList.js +1 -1
  50. package/dist/components/LDForm/LDFormErrorMessage.d.ts +3 -1
  51. package/dist/components/LDForm/LDFormErrorMessage.d.ts.map +1 -1
  52. package/dist/components/LDForm/LDFormErrorMessage.js +2 -2
  53. package/dist/components/LDInput/LDFormInput.d.ts +1 -1
  54. package/dist/components/LDInput/LDFormInput.d.ts.map +1 -1
  55. package/dist/components/LDInput/LDFormInput.js +37 -14
  56. package/dist/components/LDInput/LDInput.d.ts +4 -3
  57. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  58. package/dist/components/LDInput/LDInput.js +49 -48
  59. package/dist/components/LDModal/LDModal.d.ts +19 -40
  60. package/dist/components/LDModal/LDModal.d.ts.map +1 -1
  61. package/dist/components/LDModal/LDModal.js +56 -70
  62. package/dist/components/LDModal/LDModalView.d.ts +51 -0
  63. package/dist/components/LDModal/LDModalView.d.ts.map +1 -0
  64. package/dist/components/LDModal/LDModalView.js +72 -0
  65. package/dist/components/LDOTPInput/LDOTPInput.d.ts.map +1 -1
  66. package/dist/components/LDOTPInput/LDOTPInput.js +4 -3
  67. package/dist/components/LDPagination/LDPagination.d.ts +5 -1
  68. package/dist/components/LDPagination/LDPagination.d.ts.map +1 -1
  69. package/dist/components/LDPagination/LDPagination.js +10 -1
  70. package/dist/components/LDPagination/PaginationBase.d.ts +13 -4
  71. package/dist/components/LDPagination/PaginationBase.d.ts.map +1 -1
  72. package/dist/components/LDPagination/PaginationBase.js +8 -7
  73. package/dist/components/LDPopover/LDPopover.js +3 -3
  74. package/dist/components/LDRadio/LDFormRadioGroup.d.ts +13 -0
  75. package/dist/components/LDRadio/LDFormRadioGroup.d.ts.map +1 -0
  76. package/dist/components/LDRadio/{FormRadioGroup.js → LDFormRadioGroup.js} +2 -2
  77. package/dist/components/LDRadio/LDRadio.d.ts +1 -1
  78. package/dist/components/LDRadio/LDRadio.d.ts.map +1 -1
  79. package/dist/components/LDRadio/LDRadio.js +15 -6
  80. package/dist/components/LDRadio/LDRadioGroup.d.ts.map +1 -1
  81. package/dist/components/LDRadio/LDRadioGroup.js +1 -1
  82. package/dist/components/LDRadio/RadioBase.d.ts +2 -3
  83. package/dist/components/LDRadio/RadioBase.d.ts.map +1 -1
  84. package/dist/components/LDRadio/RadioBase.js +7 -4
  85. package/dist/components/LDSelect/LDFormMultiSelect.d.ts +13 -0
  86. package/dist/components/LDSelect/LDFormMultiSelect.d.ts.map +1 -0
  87. package/dist/components/LDSelect/{FormMultiSelect.js → LDFormMultiSelect.js} +2 -2
  88. package/dist/components/LDSelect/LDFormSelect.d.ts +13 -0
  89. package/dist/components/LDSelect/LDFormSelect.d.ts.map +1 -0
  90. package/dist/components/LDSelect/LDFormSelect.js +10 -0
  91. package/dist/components/LDSelect/LDMultiSelect.d.ts +6 -3
  92. package/dist/components/LDSelect/LDMultiSelect.d.ts.map +1 -1
  93. package/dist/components/LDSelect/LDMultiSelect.js +35 -31
  94. package/dist/components/LDSelect/LDSelect.d.ts +6 -3
  95. package/dist/components/LDSelect/LDSelect.d.ts.map +1 -1
  96. package/dist/components/LDSelect/LDSelect.js +37 -30
  97. package/dist/components/LDSelect/SelectBase.d.ts.map +1 -1
  98. package/dist/components/LDSelect/SelectBase.js +21 -7
  99. package/dist/components/LDSpinner/LDSpinner.d.ts +1 -1
  100. package/dist/components/LDSpinner/LDSpinner.d.ts.map +1 -1
  101. package/dist/components/LDSpinner/LDSpinner.js +6 -6
  102. package/dist/components/LDTable/LDTanstackTable.js +1 -1
  103. package/dist/components/LDTable/TableField.d.ts +1 -1
  104. package/dist/components/LDTable/TableField.d.ts.map +1 -1
  105. package/dist/components/LDTextarea/LDFormTextarea.d.ts +14 -0
  106. package/dist/components/LDTextarea/LDFormTextarea.d.ts.map +1 -0
  107. package/dist/components/LDTextarea/{FormTextarea.js → LDFormTextarea.js} +2 -2
  108. package/dist/components/LDTextarea/LDTextarea.d.ts +1 -1
  109. package/dist/components/LDTextarea/LDTextarea.d.ts.map +1 -1
  110. package/dist/components/LDTextarea/LDTextarea.js +30 -30
  111. package/dist/components/LDTimePicker/LDFormTimePicker.d.ts +12 -0
  112. package/dist/components/LDTimePicker/LDFormTimePicker.d.ts.map +1 -0
  113. package/dist/components/LDTimePicker/{FormTimePicker.js → LDFormTimePicker.js} +3 -3
  114. package/dist/components/LDTimePicker/LDTimePicker.js +2 -2
  115. package/dist/components/LDToast/LDToast.js +1 -1
  116. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts +12 -0
  117. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts.map +1 -0
  118. package/dist/components/LDToggleButton/{FormToggleButton.js → LDFormToggleButton.js} +2 -2
  119. package/dist/index.css +349 -207
  120. package/dist/index.d.ts +13 -12
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +13 -13
  123. package/dist/utils/cn.d.ts.map +1 -1
  124. package/dist/utils/cn.js +25 -1
  125. package/dist/utils/file.d.ts +2 -2
  126. package/dist/utils/file.d.ts.map +1 -1
  127. package/dist/utils/file.js +26 -23
  128. package/dist/utils/renderIcon.d.ts +1 -2
  129. package/dist/utils/renderIcon.d.ts.map +1 -1
  130. package/dist/utils/renderIcon.js +5 -4
  131. package/package.json +1 -1
  132. package/src/styles/components/button.css +2 -2
  133. package/src/styles/components/index.css +1 -0
  134. package/src/styles/components/input.css +2 -2
  135. package/src/styles/components/select.css +61 -0
  136. package/src/styles/motion.css +37 -0
  137. package/src/theme.css +3 -0
  138. package/dist/components/Icon/LucideIcon.d.ts +0 -12
  139. package/dist/components/Icon/LucideIcon.d.ts.map +0 -1
  140. package/dist/components/Icon/LucideIcon.js +0 -49
  141. package/dist/components/LDCheckbox/FormCheckbox.d.ts +0 -14
  142. package/dist/components/LDCheckbox/FormCheckbox.d.ts.map +0 -1
  143. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts +0 -13
  144. package/dist/components/LDCheckbox/FormCheckboxGroup.d.ts.map +0 -1
  145. package/dist/components/LDDatePicker/FormDatePicker.d.ts +0 -12
  146. package/dist/components/LDDatePicker/FormDatePicker.d.ts.map +0 -1
  147. package/dist/components/LDDatePicker/FormDatePicker.js +0 -12
  148. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts +0 -12
  149. package/dist/components/LDDateRangePicker/FormDateRangePicker.d.ts.map +0 -1
  150. package/dist/components/LDDateRangePicker/FormDateRangePicker.js +0 -10
  151. package/dist/components/LDModal/openModal.d.ts +0 -24
  152. package/dist/components/LDModal/openModal.d.ts.map +0 -1
  153. package/dist/components/LDModal/openModal.js +0 -52
  154. package/dist/components/LDRadio/FormRadioGroup.d.ts +0 -13
  155. package/dist/components/LDRadio/FormRadioGroup.d.ts.map +0 -1
  156. package/dist/components/LDSelect/FormMultiSelect.d.ts +0 -13
  157. package/dist/components/LDSelect/FormMultiSelect.d.ts.map +0 -1
  158. package/dist/components/LDSelect/FormSelect.d.ts +0 -13
  159. package/dist/components/LDSelect/FormSelect.d.ts.map +0 -1
  160. package/dist/components/LDSelect/FormSelect.js +0 -10
  161. package/dist/components/LDTextarea/FormTextarea.d.ts +0 -14
  162. package/dist/components/LDTextarea/FormTextarea.d.ts.map +0 -1
  163. package/dist/components/LDTimePicker/FormTimePicker.d.ts +0 -12
  164. package/dist/components/LDTimePicker/FormTimePicker.d.ts.map +0 -1
  165. package/dist/components/LDToggleButton/FormToggleButton.d.ts +0 -12
  166. package/dist/components/LDToggleButton/FormToggleButton.d.ts.map +0 -1
@@ -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,EAAoB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9E,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;CAClD;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, className: options.className, style: options.style, buttons: list ? { direction: options.buttonsDirection, list } : undefined, children: content }));
54
+ };
55
+ root.render(_jsx(ModalHost, {}));
56
+ });
71
57
  };
72
58
  export default LDModal;
@@ -0,0 +1,51 @@
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 LDModalViewProps {
20
+ /** 모달 열림 상태 (제어 컴포넌트) */
21
+ open?: boolean;
22
+ /** 초기 열림 상태 (비제어 컴포넌트) */
23
+ defaultOpen?: boolean;
24
+ /** 열림 상태 변경 시 호출되는 콜백 */
25
+ onOpenChange?: (open: boolean) => void;
26
+ /** 서브 타이틀 (title 위에 표시) */
27
+ name?: string;
28
+ /** 모달 제목 */
29
+ title?: string;
30
+ /** 모달 설명 텍스트 */
31
+ description?: string;
32
+ /** 본문 콘텐츠 */
33
+ children?: ReactNode;
34
+ /** 모달 너비 프리셋 */
35
+ size?: ModalSize;
36
+ /** 너비 직접 지정 (size보다 우선) */
37
+ icon?: 'success' | 'fail';
38
+ /** 하단 버튼 목록 */
39
+ buttons?: ModalButtons;
40
+ /** 스크롤 동작 */
41
+ scrollBehavior?: 'inside' | 'outside';
42
+ /** 추가 CSS 클래스 (모달 패널에 적용) */
43
+ className?: string;
44
+ /** 인라인 스타일 (모달 패널에 적용) */
45
+ style?: React.CSSProperties;
46
+ /** 버튼 클릭 시 해당 버튼의 value를 전달하는 콜백 */
47
+ onButtonClick?: (value: unknown) => void;
48
+ }
49
+ declare const LDModalView: ({ open, defaultOpen, onOpenChange, name, title, description, children, size, icon, buttons, scrollBehavior, className, style, onButtonClick, }: LDModalViewProps) => import("react/jsx-runtime").JSX.Element;
50
+ export default LDModalView;
51
+ //# 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,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,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,WAAW,GAAI,gJAelB,gBAAgB,4CAkKlB,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', 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, { asChild: true, className: "absolute top-4 right-5 text-neutral500 cursor-pointer outline-hidden", 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]), 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: "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 LDModalView;
@@ -1 +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"}
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;AAqBD;;;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"}
@@ -18,8 +18,9 @@ const sizeClasses = {
18
18
  xLarge: 'w-[64px] h-[64px] display20',
19
19
  };
20
20
  const variantClasses = {
21
- filled: 'bg-lb50 border-2 border-transparent text-lb900',
22
- outline: 'bg-transparent border border-mono200',
21
+ filled: 'bg-lb50 outline-2 outline-transparent [outline-style:solid] -outline-offset-2 text-lb900',
22
+ outline: 'bg-transparent outline-1 outline-mono200 [outline-style:solid] -outline-offset-1',
23
+ // ghost는 하단 밑줄(border-b-2)이라 전체 링인 outline으로 대체 불가 → 유지
23
24
  ghost: 'bg-transparent border-b-2 border-mono200 rounded-none',
24
25
  };
25
26
  // ── Components ──
@@ -73,7 +74,7 @@ const OTPInputSlot = ({ index, className, }) => {
73
74
  const { value, focusedIndex, isInvalid, variant, size, disabled } = useOTPInputContext();
74
75
  const char = value[index];
75
76
  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
+ 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', 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
  };
78
79
  /**
79
80
  * OTPInputSeparator
@@ -1,12 +1,16 @@
1
1
  import type React from 'react';
2
+ /** 페이지네이션 크기 프리셋 */
3
+ export type PaginationSize = 'small' | 'medium' | 'large';
2
4
  export interface LDPaginationProps {
3
5
  currentPage: number;
4
6
  totalPages: number;
5
7
  onPageChange: (page: number) => void;
6
8
  numbersToShow?: number;
9
+ /** 페이지네이션 크기 프리셋 (기본 small) */
10
+ size?: PaginationSize;
7
11
  className?: string;
8
12
  style?: React.CSSProperties;
9
13
  }
10
- declare const LDPagination: ({ currentPage, totalPages, onPageChange, numbersToShow, className, style, }: LDPaginationProps) => import("react/jsx-runtime").JSX.Element;
14
+ declare const LDPagination: ({ currentPage, totalPages, onPageChange, numbersToShow, size, className, style, }: LDPaginationProps) => import("react/jsx-runtime").JSX.Element;
11
15
  export default LDPagination;
12
16
  //# sourceMappingURL=LDPagination.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"LDPagination.d.ts","sourceRoot":"","sources":["../../../src/components/LDPagination/LDPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,oBAAoB;AACpB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAY1D,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,+BAA+B;IAC/B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,YAAY,GAAI,mFAQnB,iBAAiB,4CAmBnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,5 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import PaginationBase from './PaginationBase.js';
3
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, {})] }) }));
4
+ /** size별 내부 버튼 크기/패딩 매핑 */
5
+ const sizePresets = {
6
+ small: { navSize: '2xsmall', itemSize: 'xsmall' },
7
+ medium: { navSize: 'xsmall', itemSize: 'small' },
8
+ large: { navSize: 'small', itemSize: 'medium', itemClassName: 'p-5' },
9
+ };
10
+ const LDPagination = ({ currentPage, totalPages, onPageChange, numbersToShow = 5, size = 'small', className, style, }) => {
11
+ const preset = sizePresets[size];
12
+ return (_jsx(PaginationBase.Provider, { currentPage: currentPage, totalPages: totalPages, onPageChange: onPageChange, children: _jsxs(PaginationBase.Root, { className: cn('py-5', className), style: style, children: [_jsx(PaginationBase.Prev, { size: preset.navSize }), _jsx(PaginationBase.List, { numbersToShow: numbersToShow, size: preset.itemSize, className: preset.itemClassName }), _jsx(PaginationBase.Next, { size: preset.navSize })] }) }));
13
+ };
5
14
  export default LDPagination;
@@ -1,4 +1,5 @@
1
1
  import type { HTMLAttributes, ReactNode } from 'react';
2
+ import { type ButtonSize } from '../LDButton/LDButton.js';
2
3
  interface ProviderProps {
3
4
  children: ReactNode;
4
5
  currentPage: number;
@@ -9,28 +10,36 @@ interface RootProps extends HTMLAttributes<HTMLElement> {
9
10
  children?: ReactNode;
10
11
  }
11
12
  interface PrevProps {
13
+ /** 이전 버튼 크기 (LDButton size 프리셋) */
14
+ size?: ButtonSize;
12
15
  className?: string;
13
16
  }
14
17
  interface NextProps {
18
+ /** 다음 버튼 크기 (LDButton size 프리셋) */
19
+ size?: ButtonSize;
15
20
  className?: string;
16
21
  }
17
22
  interface ListProps {
18
23
  numbersToShow?: number;
24
+ /** 페이지 번호 버튼 크기 (LDButton size 프리셋) */
25
+ size?: ButtonSize;
19
26
  className?: string;
20
27
  }
21
28
  interface ItemProps {
22
29
  page: number;
23
30
  isActive?: boolean;
31
+ /** 페이지 번호 버튼 크기 (LDButton size 프리셋) */
32
+ size?: ButtonSize;
24
33
  onClick?: () => void;
25
34
  className?: string;
26
35
  }
27
36
  declare const PaginationBase: {
28
37
  Provider: ({ children, currentPage, totalPages, onPageChange, }: ProviderProps) => import("react/jsx-runtime").JSX.Element;
29
38
  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;
39
+ Prev: ({ size, className }: PrevProps) => import("react/jsx-runtime").JSX.Element;
40
+ Next: ({ size, className }: NextProps) => import("react/jsx-runtime").JSX.Element;
41
+ List: ({ numbersToShow, size, className }: ListProps) => import("react/jsx-runtime").JSX.Element;
42
+ Item: ({ page, isActive, size, onClick, className, }: ItemProps) => import("react/jsx-runtime").JSX.Element;
34
43
  };
35
44
  export default PaginationBase;
36
45
  //# sourceMappingURL=PaginationBase.d.ts.map
@@ -1 +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;AAwBD,QAAA,MAAM,cAAc;qEAhJjB,aAAa;8CAYiC,SAAS;0BAgB7B,SAAS;0BA+BT,SAAS;yCAgCU,SAAS;mDA+BH,SAAS;CA6B9D,CAAC;AAEF,eAAe,cAAc,CAAC"}
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;AAGvD,OAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAwBjE,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,mCAAmC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,UAAU,SAAS;IACjB,mCAAmC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,UAAU,SAAS;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2BD,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD,QAAA,MAAM,cAAc;qEA/JjB,aAAa;8CAYiC,SAAS;gCAkBX,SAAS;gCAiCT,SAAS;+CAkCS,SAAS;0DAwCvE,SAAS;CA6BX,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { createContext, useContext } from 'react';
3
+ import { ChevronLeft, ChevronRight } from 'lucide-react';
3
4
  import cn from '../../utils/cn.js';
4
5
  import LDButton from '../LDButton/LDButton.js';
5
6
  import { calculatePaginationOptions } from './paginationUtils.js';
@@ -12,26 +13,26 @@ const usePaginationContext = () => {
12
13
  };
13
14
  const Provider = ({ children, currentPage, totalPages, onPageChange, }) => (_jsx(PaginationContext, { value: { currentPage, totalPages, onPageChange }, children: children }));
14
15
  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 Prev = ({ size = '2xsmall', className }) => {
16
17
  const { currentPage, onPageChange } = usePaginationContext();
17
18
  const canPrevious = currentPage > 1;
18
- return (_jsx(LDButton, { variant: "outline", color: "neutral", size: "2xsmall", shape: "capsule", leftIcon: "chevronLeft", compact: true, disabled: !canPrevious, onClick: () => onPageChange(currentPage - 1), "aria-label": "\uC774\uC804 \uD398\uC774\uC9C0", className: cn(canPrevious
19
+ return (_jsx(LDButton, { variant: "outline", color: "neutral", size: size, shape: "capsule", leftIcon: _jsx(ChevronLeft, {}), compact: true, disabled: !canPrevious, onClick: () => onPageChange(currentPage - 1), "aria-label": "\uC774\uC804 \uD398\uC774\uC9C0", className: cn(canPrevious
19
20
  ? 'bg-neutral100 text-neutral400'
20
21
  : 'bg-neutral50 text-neutral200', canPrevious && 'hover:bg-neutral200', className) }));
21
22
  };
22
- const Next = ({ className }) => {
23
+ const Next = ({ size = '2xsmall', className }) => {
23
24
  const { currentPage, totalPages, onPageChange } = usePaginationContext();
24
25
  const canNext = currentPage < totalPages;
25
- return (_jsx(LDButton, { variant: "outline", color: "neutral", size: "2xsmall", shape: "capsule", leftIcon: "chevronRight", disabled: !canNext, compact: true, onClick: () => onPageChange(currentPage + 1), "aria-label": "\uB2E4\uC74C \uD398\uC774\uC9C0", className: cn(canNext
26
+ return (_jsx(LDButton, { variant: "outline", color: "neutral", size: size, shape: "capsule", leftIcon: _jsx(ChevronRight, {}), disabled: !canNext, compact: true, onClick: () => onPageChange(currentPage + 1), "aria-label": "\uB2E4\uC74C \uD398\uC774\uC9C0", className: cn(canNext
26
27
  ? 'bg-neutral100 text-neutral400'
27
28
  : 'bg-neutral50 text-neutral200', canNext && 'hover:bg-neutral200', className) }));
28
29
  };
29
- const List = ({ numbersToShow = 5, className }) => {
30
+ const List = ({ numbersToShow = 5, size = 'xsmall', className }) => {
30
31
  const { currentPage, totalPages, onPageChange } = usePaginationContext();
31
32
  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
+ return (_jsx(_Fragment, { children: pages.map((page, idx) => (_jsx(Item, { page: page, isActive: currentPage === page, size: size, onClick: () => onPageChange(page), className: className }, `page_${page}_${idx}`))) }));
33
34
  };
34
- const Item = ({ page, isActive, onClick, className }) => (_jsx(LDButton, { variant: "ghost", shape: "capsule", color: isActive ? 'point' : 'neutral', size: "xsmall", compact: true, onClick: onClick, "aria-label": `${page} 페이지`, "aria-current": isActive ? 'page' : undefined, className: cn('outline-none p-3.5 regular', !isActive && 'text-neutral400', className), children: page }));
35
+ const Item = ({ page, isActive, size = 'xsmall', onClick, className, }) => (_jsx(LDButton, { variant: "ghost", shape: "capsule", color: isActive ? 'point' : 'neutral', size: size, compact: true, onClick: onClick, "aria-label": `${page} 페이지`, "aria-current": isActive ? 'page' : undefined, className: cn('outline-none regular', !isActive && 'text-neutral400', className), children: page }));
35
36
  // ── Export ──
36
37
  const PaginationBase = {
37
38
  Provider,
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { isValidElement } from 'react';
3
3
  import PopoverBase from './PopoverBase.js';
4
- import LucideIcon from '../Icon/LucideIcon.js';
5
4
  import cn from '../../utils/cn.js';
5
+ import { Ellipsis, EllipsisVertical } from 'lucide-react';
6
6
  // ── 스타일 매핑 ──
7
7
  const itemColorClasses = {
8
8
  blue: 'hover:bg-tintBlue text-lb500',
@@ -16,11 +16,11 @@ const iconSizes = {
16
16
  };
17
17
  const LDPopover = ({ items, content, children, open, onOpenChange, iconSize = 'sm', isHorizontal = false, align = 'end', offset, contentWidth, triggerClassName, popoverClassName, style, }) => {
18
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-mono100', triggerClassName), children: isAsChild ? (children) : (_jsx(LucideIcon, { name: isHorizontal ? 'ellipsis' : 'ellipsisVertical', size: iconSizes[iconSize], className: "text-neutral500" })) }), _jsx(PopoverBase.Content, { align: align, sideOffset: offset, style: {
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 && 'p-1 min-h-6 hover:bg-mono100', triggerClassName), children: isAsChild ? (children) : isHorizontal ? (_jsx(Ellipsis, { size: iconSizes[iconSize], className: "text-neutral500" })) : (_jsx(EllipsisVertical, { size: iconSizes[iconSize], className: "text-neutral500" })) }), _jsx(PopoverBase.Content, { align: align, sideOffset: offset, style: {
20
20
  width: contentWidth === 'trigger'
21
21
  ? 'var(--radix-popover-trigger-width)'
22
22
  : contentWidth,
23
- }, className: cn('min-w-[160px] rounded-[5px] bg-white border border-mono100 p-xs flex flex-col gap-xs z-50 shadow-lg', popoverClassName), children: content
23
+ }, className: cn('min-w-40 rounded-[5px] bg-white border border-mono100 p-xs flex flex-col gap-xs z-50 shadow-lg', popoverClassName), children: content
24
24
  ? content
25
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
26
  e.stopPropagation();
@@ -0,0 +1,13 @@
1
+ import { type RegisterOptions } from 'react-hook-form';
2
+ import { type LDRadioGroupProps } from './LDRadioGroup.js';
3
+ interface LDFormRadioGroupProps extends Omit<LDRadioGroupProps, 'value' | 'onChange'> {
4
+ name: string;
5
+ options?: RegisterOptions;
6
+ customErrorMessage?: string;
7
+ isHiddenErrorMessage?: boolean;
8
+ errorClassName?: string;
9
+ disabled?: boolean;
10
+ }
11
+ declare const LDFormRadioGroup: ({ name, options, customErrorMessage, isHiddenErrorMessage, errorClassName, disabled, ...props }: LDFormRadioGroupProps) => import("react/jsx-runtime").JSX.Element;
12
+ export default LDFormRadioGroup;
13
+ //# sourceMappingURL=LDFormRadioGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDFormRadioGroup.d.ts","sourceRoot":"","sources":["../../../src/components/LDRadio/LDFormRadioGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAqB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAItE,UAAU,qBAAsB,SAAQ,IAAI,CAC1C,iBAAiB,EACjB,OAAO,GAAG,UAAU,CACrB;IACC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,iGAQvB,qBAAqB,4CA8BvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import LDRadioGroup from './LDRadioGroup.js';
4
4
  import FormField from '../LDForm/LDFormField.js';
5
5
  import FormErrorMessage from '../LDForm/LDFormErrorMessage.js';
6
- const FormRadioGroup = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = true, errorClassName, disabled = false, ...props }) => {
6
+ const LDFormRadioGroup = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = true, errorClassName, disabled = false, ...props }) => {
7
7
  return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, children: ({ field, fieldState }) => (_jsxs("div", { className: "relative", children: [_jsx(LDRadioGroup, { ...props, name: name, value: field.value ?? '', onChange: field.onChange, disabled: disabled, "aria-invalid": field['aria-invalid'], "aria-describedby": field['aria-describedby'] }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { error: fieldState.error, disabled: disabled, className: errorClassName }))] })) }));
8
8
  };
9
- export default FormRadioGroup;
9
+ export default LDFormRadioGroup;
@@ -1,6 +1,6 @@
1
1
  import { type InputHTMLAttributes, type Ref } from 'react';
2
2
  type RadioSize = 'sm' | 'md';
3
- type RadioType = 'default' | 'pill';
3
+ type RadioType = 'default' | 'circle' | 'pill';
4
4
  export interface LDRadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'checked' | 'disabled'> {
5
5
  /** controlled 체크 상태 */
6
6
  checked?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"LDRadio.d.ts","sourceRoot":"","sources":["../../../src/components/LDRadio/LDRadio.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAK3D,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7B,KAAK,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAkBpC,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CACzC;IACC,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB;IAClB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AAmFD,QAAA,MAAM,OAAO,GAAI,4GAYd,YAAY,4CA0Cd,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"LDRadio.d.ts","sourceRoot":"","sources":["../../../src/components/LDRadio/LDRadio.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAK3D,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7B,KAAK,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAkB/C,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CACzC;IACC,uBAAuB;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB;IAClB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,cAAc;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB;IACpB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC7B;AA6FD,QAAA,MAAM,OAAO,GAAI,4GAYd,YAAY,4CAgDd,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -16,13 +16,22 @@ const labelSizeClasses = {
16
16
  // ── Inner: pill 타입 ──
17
17
  const PillInner = ({ label, ref, ...props }) => {
18
18
  const { checked } = useRadioContext();
19
- return (_jsxs(_Fragment, { children: [_jsx(RadioBase.HiddenInput, { ref: ref, ...props }), _jsxs("div", { className: "relative flex items-center", children: [_jsx(RadioBase.Indicator, { icon: "check", iconSize: 16, className: "absolute left-0", iconClassName: cn('shrink-0 ld-transition', checked ? 'opacity-100' : 'opacity-0') }), label && (_jsx(RadioBase.Label, { className: cn('ld-transition text-nowrap', checked ? 'pl-5' : 'pl-sm pr-sm'), children: label }))] })] }));
19
+ return (_jsxs(_Fragment, { children: [_jsx(RadioBase.HiddenInput, { ref: ref, ...props }), _jsxs("div", { className: "relative flex items-center", children: [_jsx(RadioBase.Indicator, { iconSize: 16, className: "absolute left-0", iconClassName: cn('shrink-0 ld-transition', checked ? 'opacity-100' : 'opacity-0') }), label && (_jsx(RadioBase.Label, { className: cn('ld-transition text-nowrap', checked ? 'pl-5' : 'pl-sm pr-sm'), children: label }))] })] }));
20
20
  };
21
- // ── Inner: default 타입 ──
22
- const DefaultInner = ({ size, label, ref, ...props }) => {
21
+ // ── Inner: default, circle 타입 ──
22
+ const DefaultInner = ({ type, size, label, ref, ...props }) => {
23
23
  const { checked, disabled } = useRadioContext();
24
- return (_jsxs(_Fragment, { children: [_jsx(RadioBase.HiddenInput, { ref: ref, ...props }), _jsx(RadioBase.Indicator, { icon: "check", iconSize: checkIconSizes[size], className: cn('flex items-center justify-center rounded-full ld-transition border-2 border-transparent shrink-0', !disabled &&
25
- (checked ? 'border-lb500 bg-lb500' : 'bg-white border-neutral100'), disabled && 'border-neutral200 bg-mono100', radioSizeClasses[size]), iconClassName: cn('shrink-0 ld-transition', checked ? (disabled ? 'text-neutral500' : 'text-white') : 'opacity-0') }), label && (_jsx(RadioBase.Label, { className: "text-neutral500", children: label }))] }));
24
+ return (_jsxs(_Fragment, { children: [_jsx(RadioBase.HiddenInput, { ref: ref, ...props }), _jsx(RadioBase.Indicator, { type: type, iconSize: checkIconSizes[size], className: cn('flex items-center justify-center rounded-full ld-transition outline-transparent [outline-style:solid] -outline-offset-1 shrink-0', type === 'circle' ? 'outline-1' : 'outline-2', {
25
+ 'outline-lb500 bg-lb500': !disabled && checked && type === 'default',
26
+ 'bg-white outline-neutral100': !disabled && !checked && type === 'default',
27
+ 'bg-white outline-lb500': !disabled && type === 'circle',
28
+ }, disabled && 'outline-neutral200 bg-mono100', radioSizeClasses[size]), iconClassName: cn('shrink-0 ld-transition', {
29
+ 'text-neutral300': checked && disabled && type === 'default',
30
+ 'text-white': checked && !disabled && type === 'default',
31
+ 'bg-neutral300': checked && disabled && type === 'circle',
32
+ 'text-lb500 bg-lb500': checked && !disabled && type === 'circle',
33
+ 'opacity-0': !checked,
34
+ }) }), label && (_jsx(RadioBase.Label, { className: "text-neutral500", children: label }))] }));
26
35
  };
27
36
  const LDRadio = ({ checked, defaultChecked, onCheckedChange, size = 'sm', type = 'default', label, disabled = false, className, style, ref, ...props }) => {
28
37
  if (type === 'pill') {
@@ -32,6 +41,6 @@ const LDRadio = ({ checked, defaultChecked, onCheckedChange, size = 'sm', type =
32
41
  // className을 함수로 받아 Root 내부의 resolved 값을 주입함.
33
42
  className: (c) => cn('items-center gap-2 rounded-full py-sm px-[15px] ld-transition display14 bold', c ? 'bg-tintBlue text-lb500' : 'bg-mono100 text-mono500', disabled && 'opacity-50 cursor-not-allowed', className), children: _jsx(PillInner, { label: label, ref: ref, ...props }) }));
34
43
  }
35
- return (_jsx(RadioBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style, className: cn('items-center gap-[5px]', labelSizeClasses[size], className), children: _jsx(DefaultInner, { size: size, label: label, ref: ref, ...props }) }));
44
+ return (_jsx(RadioBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style, className: cn('items-center gap-[5px]', labelSizeClasses[size], className), children: _jsx(DefaultInner, { type: type, size: size, label: label, ref: ref, ...props }) }));
36
45
  };
37
46
  export default LDRadio;
@@ -1 +1 @@
1
- {"version":3,"file":"LDRadioGroup.d.ts","sourceRoot":"","sources":["../../../src/components/LDRadio/LDRadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,YAAY,GAAI,6IAYnB,iBAAiB,4CAuBnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"LDRadioGroup.d.ts","sourceRoot":"","sources":["../../../src/components/LDRadio/LDRadioGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAGD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,YAAY,GAAI,6IAYnB,iBAAiB,4CAwBnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -2,6 +2,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import LDRadio from './LDRadio.js';
3
3
  import cn from '../../utils/cn.js';
4
4
  const LDRadioGroup = ({ items, value, onChange, disabled = false, type = 'pill', size = 'sm', name, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedby, className, style, }) => {
5
- return (_jsx("div", { role: "radiogroup", "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, className: cn('flex flex-row gap-2.5', className), style: style, children: items.map((option) => (_jsx(LDRadio, { name: name, type: type, size: size, checked: value === option.value, onCheckedChange: () => onChange?.(option.value), label: option.label, disabled: disabled || option.disabled }, option.value))) }));
5
+ return (_jsx("div", { role: "radiogroup", "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, className: cn('flex flex-row gap-5'), style: style, children: items.map((option) => (_jsx(LDRadio, { name: name, type: type, size: size, checked: value === option.value, className: className, onCheckedChange: () => onChange?.(option.value), label: option.label, disabled: disabled || option.disabled }, option.value))) }));
6
6
  };
7
7
  export default LDRadioGroup;