@loword/loword-design-system 0.0.11 → 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 (169) 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/LDAvatar/LDAvatar.d.ts +1 -1
  8. package/dist/components/LDAvatar/LDAvatar.d.ts.map +1 -1
  9. package/dist/components/LDAvatar/LDAvatar.js +19 -10
  10. package/dist/components/LDCalendar/CalendarBase.d.ts +17 -0
  11. package/dist/components/LDCalendar/CalendarBase.d.ts.map +1 -0
  12. package/dist/components/LDCalendar/CalendarBase.js +49 -0
  13. package/dist/components/LDCalendar/LDCalendar.d.ts +4 -11
  14. package/dist/components/LDCalendar/LDCalendar.d.ts.map +1 -1
  15. package/dist/components/LDCalendar/LDCalendar.js +9 -40
  16. package/dist/components/LDCarousel/CarouselBase.d.ts +3 -3
  17. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -1
  18. package/dist/components/LDCarousel/CarouselBase.js +9 -7
  19. package/dist/components/LDCarousel/LDCarousel.d.ts +7 -8
  20. package/dist/components/LDCarousel/LDCarousel.d.ts.map +1 -1
  21. package/dist/components/LDCarousel/LDCarousel.js +2 -2
  22. package/dist/components/LDCheckbox/CheckboxBase.js +1 -1
  23. package/dist/components/LDCheckbox/LDCheckbox.d.ts +2 -5
  24. package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -1
  25. package/dist/components/LDCheckbox/LDCheckbox.js +65 -7
  26. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts +3 -3
  27. package/dist/components/LDCheckbox/LDCheckboxGroup.d.ts.map +1 -1
  28. package/dist/components/LDCheckbox/LDCheckboxGroup.js +11 -2
  29. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts +1 -3
  30. package/dist/components/LDCheckbox/LDFormCheckbox.d.ts.map +1 -1
  31. package/dist/components/LDCheckbox/LDFormCheckbox.js +3 -4
  32. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts +1 -3
  33. package/dist/components/LDCheckbox/LDFormCheckboxGroup.d.ts.map +1 -1
  34. package/dist/components/LDCheckbox/LDFormCheckboxGroup.js +3 -4
  35. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts +17 -1
  36. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts.map +1 -1
  37. package/dist/components/LDDataCalendar/DataCalendarBase.js +34 -4
  38. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts +27 -10
  39. package/dist/components/LDDataCalendar/LDDataCalendar.d.ts.map +1 -1
  40. package/dist/components/LDDataCalendar/LDDataCalendar.js +8 -8
  41. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -1
  42. package/dist/components/LDDatePicker/LDDatePicker.js +1 -1
  43. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -1
  44. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +1 -1
  45. package/dist/components/LDDrawer/LDDrawer.d.ts +2 -0
  46. package/dist/components/LDDrawer/LDDrawer.d.ts.map +1 -1
  47. package/dist/components/LDDrawer/LDDrawer.js +1 -1
  48. package/dist/components/LDEditor/LDEditor.d.ts.map +1 -1
  49. package/dist/components/LDEditor/LDEditor.js +94 -54
  50. package/dist/components/LDEmpty/EmptyBase.d.ts +19 -0
  51. package/dist/components/LDEmpty/EmptyBase.d.ts.map +1 -0
  52. package/dist/components/LDEmpty/EmptyBase.js +18 -0
  53. package/dist/components/LDEmpty/LDEmpty.d.ts +35 -0
  54. package/dist/components/LDEmpty/LDEmpty.d.ts.map +1 -0
  55. package/dist/components/LDEmpty/LDEmpty.js +30 -0
  56. package/dist/components/LDFileUpload/FileUploadBase.d.ts.map +1 -1
  57. package/dist/components/LDFileUpload/FileUploadBase.js +6 -6
  58. package/dist/components/LDFileUpload/LDFileUpload.d.ts +3 -0
  59. package/dist/components/LDFileUpload/LDFileUpload.d.ts.map +1 -1
  60. package/dist/components/LDFileUpload/LDFileUpload.js +2 -4
  61. package/dist/components/LDFileUpload/LDFileUploadList.d.ts +3 -0
  62. package/dist/components/LDFileUpload/LDFileUploadList.d.ts.map +1 -1
  63. package/dist/components/LDFileUpload/LDFileUploadList.js +1 -3
  64. package/dist/components/LDFileUpload/LDImageUpload.d.ts +3 -0
  65. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -1
  66. package/dist/components/LDFileUpload/LDImageUpload.js +2 -4
  67. package/dist/components/LDFileUpload/LDImageUploadList.d.ts +3 -0
  68. package/dist/components/LDFileUpload/LDImageUploadList.d.ts.map +1 -1
  69. package/dist/components/LDFileUpload/LDImageUploadList.js +1 -3
  70. package/dist/components/LDInput/InputBase.d.ts +5 -3
  71. package/dist/components/LDInput/InputBase.d.ts.map +1 -1
  72. package/dist/components/LDInput/InputBase.js +4 -4
  73. package/dist/components/LDInput/LDFormInput.d.ts.map +1 -1
  74. package/dist/components/LDInput/LDFormInput.js +7 -27
  75. package/dist/components/LDInput/LDInput.d.ts +8 -2
  76. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  77. package/dist/components/LDInput/LDInput.js +91 -28
  78. package/dist/components/LDLNB/LDLNB.d.ts +42 -0
  79. package/dist/components/LDLNB/LDLNB.d.ts.map +1 -0
  80. package/dist/components/LDLNB/LDLNB.js +34 -0
  81. package/dist/components/LDLNB/LDLNBBase.d.ts +5 -13
  82. package/dist/components/LDLNB/LDLNBBase.d.ts.map +1 -1
  83. package/dist/components/LDLNB/LDLNBBase.js +52 -18
  84. package/dist/components/LDMenuBar/LDMenuBar.d.ts +33 -19
  85. package/dist/components/LDMenuBar/LDMenuBar.d.ts.map +1 -1
  86. package/dist/components/LDMenuBar/LDMenuBar.js +13 -27
  87. package/dist/components/LDMenuBar/MenuBarBase.d.ts +4 -5
  88. package/dist/components/LDMenuBar/MenuBarBase.d.ts.map +1 -1
  89. package/dist/components/LDMenuBar/MenuBarBase.js +12 -14
  90. package/dist/components/LDModal/LDModal.d.ts +2 -1
  91. package/dist/components/LDModal/LDModal.d.ts.map +1 -1
  92. package/dist/components/LDModal/LDModal.js +1 -1
  93. package/dist/components/LDModal/LDModalView.d.ts +11 -3
  94. package/dist/components/LDModal/LDModalView.d.ts.map +1 -1
  95. package/dist/components/LDModal/LDModalView.js +4 -4
  96. package/dist/components/LDNotification/LDNotification.d.ts +40 -0
  97. package/dist/components/LDNotification/LDNotification.d.ts.map +1 -0
  98. package/dist/components/LDNotification/LDNotification.js +76 -0
  99. package/dist/components/LDNotification/NotificationBase.d.ts +29 -0
  100. package/dist/components/LDNotification/NotificationBase.d.ts.map +1 -0
  101. package/dist/components/LDNotification/NotificationBase.js +27 -0
  102. package/dist/components/LDOTPInput/LDFormOTPInput.d.ts +15 -0
  103. package/dist/components/LDOTPInput/LDFormOTPInput.d.ts.map +1 -0
  104. package/dist/components/LDOTPInput/LDFormOTPInput.js +8 -0
  105. package/dist/components/LDOTPInput/LDOTPInput.d.ts +10 -22
  106. package/dist/components/LDOTPInput/LDOTPInput.d.ts.map +1 -1
  107. package/dist/components/LDOTPInput/LDOTPInput.js +44 -73
  108. package/dist/components/LDOTPInput/OTPInputBase.d.ts +46 -0
  109. package/dist/components/LDOTPInput/OTPInputBase.d.ts.map +1 -0
  110. package/dist/components/LDOTPInput/OTPInputBase.js +48 -0
  111. package/dist/components/LDPagination/LDPagination.d.ts +1 -1
  112. package/dist/components/LDPagination/LDPagination.d.ts.map +1 -1
  113. package/dist/components/LDPagination/LDPagination.js +1 -8
  114. package/dist/components/LDPopover/LDPopover.d.ts +1 -1
  115. package/dist/components/LDPopover/LDPopover.d.ts.map +1 -1
  116. package/dist/components/LDPopover/LDPopover.js +5 -4
  117. package/dist/components/LDProgressBar/LDProgressBar.d.ts +16 -0
  118. package/dist/components/LDProgressBar/LDProgressBar.d.ts.map +1 -0
  119. package/dist/components/LDProgressBar/LDProgressBar.js +9 -0
  120. package/dist/components/LDProgressBar/ProgressBarBase.d.ts +11 -0
  121. package/dist/components/LDProgressBar/ProgressBarBase.d.ts.map +1 -0
  122. package/dist/components/LDProgressBar/ProgressBarBase.js +10 -0
  123. package/dist/components/LDRadio/LDFormRadioGroup.d.ts +1 -3
  124. package/dist/components/LDRadio/LDFormRadioGroup.d.ts.map +1 -1
  125. package/dist/components/LDRadio/LDFormRadioGroup.js +3 -4
  126. package/dist/components/LDRadio/LDRadio.d.ts +1 -1
  127. package/dist/components/LDRadio/LDRadio.d.ts.map +1 -1
  128. package/dist/components/LDRadio/LDRadio.js +58 -12
  129. package/dist/components/LDRadio/LDRadioGroup.d.ts +5 -3
  130. package/dist/components/LDRadio/LDRadioGroup.d.ts.map +1 -1
  131. package/dist/components/LDRadio/LDRadioGroup.js +11 -2
  132. package/dist/components/LDSectionNav/LDSectionNav.d.ts +11 -0
  133. package/dist/components/LDSectionNav/LDSectionNav.d.ts.map +1 -0
  134. package/dist/components/LDSectionNav/LDSectionNav.js +11 -0
  135. package/dist/components/LDSectionNav/SectionNavBase.d.ts +20 -0
  136. package/dist/components/LDSectionNav/SectionNavBase.d.ts.map +1 -0
  137. package/dist/components/LDSectionNav/SectionNavBase.js +53 -0
  138. package/dist/components/LDSelect/LDMultiSelect.js +3 -3
  139. package/dist/components/LDSelect/LDSelect.d.ts.map +1 -1
  140. package/dist/components/LDSelect/LDSelect.js +2 -2
  141. package/dist/components/LDTable/LDCollapsibleTanstackTable.d.ts.map +1 -1
  142. package/dist/components/LDTable/LDCollapsibleTanstackTable.js +12 -9
  143. package/dist/components/LDTable/LDTable.d.ts.map +1 -1
  144. package/dist/components/LDTable/LDTable.js +1 -1
  145. package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -1
  146. package/dist/components/LDTable/LDTanstackTable.js +5 -6
  147. package/dist/components/LDTable/TableField.d.ts.map +1 -1
  148. package/dist/components/LDTextarea/LDTextarea.js +1 -1
  149. package/dist/components/LDTimePicker/LDTimePicker.js +1 -1
  150. package/dist/components/LDToast/LDToaster.d.ts +2 -1
  151. package/dist/components/LDToast/LDToaster.d.ts.map +1 -1
  152. package/dist/components/LDToast/LDToaster.js +2 -2
  153. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts +1 -3
  154. package/dist/components/LDToggleButton/LDFormToggleButton.d.ts.map +1 -1
  155. package/dist/components/LDToggleButton/LDFormToggleButton.js +3 -4
  156. package/dist/components/LDTooltip/LDTooltip.js +1 -1
  157. package/dist/components/LDTooltip/TooltipBase.d.ts +6 -2
  158. package/dist/components/LDTooltip/TooltipBase.d.ts.map +1 -1
  159. package/dist/components/LDTooltip/TooltipBase.js +4 -4
  160. package/dist/index.css +633 -166
  161. package/dist/index.d.ts +21 -13
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +25 -13
  164. package/package.json +14 -2
  165. package/src/styles/carousel.css +15 -14
  166. package/src/styles/components/editor.css +6 -0
  167. package/src/styles/components/input.css +14 -0
  168. package/src/styles/components/shared.css +6 -6
  169. package/src/styles/motion.css +78 -0
@@ -1,88 +1,59 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useRef, useState, useContext, createContext, useEffect, } from 'react';
3
+ import { Fragment, createContext, useContext } from 'react';
4
4
  import cn from '../../utils/cn.js';
5
- const OTPInputContext = createContext(null);
6
- function useOTPInputContext() {
7
- const context = useContext(OTPInputContext);
8
- if (!context) {
9
- throw new Error('LDOTPInput 하위 컴포넌트는 LDOTPInput 안에서 사용되어야 합니다.');
10
- }
11
- return context;
12
- }
5
+ import OTPInputBase from './OTPInputBase.js';
13
6
  const sizeClasses = {
14
- xSmall: 'w-[16px] h-[16px] display10',
15
- small: 'w-[24px] h-[24px] display12',
16
- medium: 'w-[32px] h-[32px] display14',
17
- large: 'w-[40px] h-[40px] display16',
18
- xLarge: 'w-[64px] h-[64px] display20',
7
+ '2xsmall': 'w-4 h-4 display10',
8
+ xsmall: 'w-6 h-6 display12',
9
+ small: 'w-8 h-8 display14',
10
+ medium: 'w-10 h-10 display16',
11
+ large: 'w-16 h-16 display28',
12
+ xlarge: 'w-20 h-20 display40',
13
+ };
14
+ // 박스 크기에 비례한 모서리 반경
15
+ const roundedClasses = {
16
+ '2xsmall': 'rounded-[3px]',
17
+ xsmall: 'rounded-[4px]',
18
+ small: 'rounded-[5px]',
19
+ medium: 'rounded-[6px]',
20
+ large: 'rounded-[8px]',
21
+ xlarge: 'rounded-[12px]',
19
22
  };
20
23
  const variantClasses = {
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으로 대체 불가 → 유지
24
- ghost: 'bg-transparent border-b-2 border-mono200 rounded-none',
24
+ filled: 'bg-mono50 outline-2 outline-transparent [outline-style:solid] -outline-offset-2 text-lb500',
25
+ outline: 'bg-transparent outline-2 outline-mono200 [outline-style:solid] -outline-offset-2 text-lb500',
25
26
  };
26
- // ── Components ──
27
- /**
28
- * LDOTPInput (Root)
29
- * 실제 입력을 처리하는 Hidden LDInput과 상태를 관리합니다.
30
- */
31
- const LDOTPInput = ({ maxLength, value, onChange, onComplete, disabled = false, isInvalid = false, variant = 'outline', size = 'medium', className, children, }) => {
32
- const inputRef = useRef(null);
33
- const [isFocused, setIsFocused] = useState(false);
34
- const [focusedIndex, setFocusedIndex] = useState(-1);
35
- useEffect(() => {
36
- if (isFocused) {
37
- setFocusedIndex(value.length);
38
- }
39
- else {
40
- setFocusedIndex(-1);
41
- }
42
- }, [value, isFocused]);
43
- const handleInputChange = (e) => {
44
- const newValue = e.target.value
45
- .replace(/[^0-9a-zA-Z]/g, '')
46
- .slice(0, maxLength);
47
- onChange(newValue);
48
- if (newValue.length === maxLength && onComplete) {
49
- onComplete(newValue);
27
+ const OTPStyleContext = createContext({
28
+ size: 'medium',
29
+ variant: 'outline',
30
+ });
31
+ // ── Custom Layer ──
32
+ /** OTP 입력 루트 — Base.Root에 size/variant 스타일 컨텍스트를 덧씌운다. */
33
+ const LDOTPInput = ({ variant = 'outline', size = 'medium', maxLength, groups, children, ...rest }) => {
34
+ // groups 지정 시 구분선으로 나눠 렌더, 아니면 단일 그룹
35
+ const renderSlots = () => {
36
+ if (groups && groups.length > 0) {
37
+ let offset = 0;
38
+ return groups.map((count, gi) => {
39
+ const start = offset;
40
+ offset += count;
41
+ return (_jsxs(Fragment, { children: [gi > 0 && _jsx(OTPInputSeparator, {}), _jsx(OTPInputGroup, { children: Array.from({ length: count }).map((_, i) => (_jsx(OTPInputSlot, { index: start + i }, i))) })] }, gi));
42
+ });
50
43
  }
44
+ return (_jsx(OTPInputGroup, { children: Array.from({ length: maxLength }).map((_, i) => (_jsx(OTPInputSlot, { index: i }, i))) }));
51
45
  };
52
- return (_jsx(OTPInputContext.Provider, { value: {
53
- value,
54
- maxLength,
55
- focusedIndex,
56
- isInvalid,
57
- disabled,
58
- size,
59
- variant,
60
- }, children: _jsxs("div", { className: cn('relative flex items-center gap-2 cursor-text select-none', disabled && 'opacity-50 cursor-not-allowed', className), onClick: () => !disabled && inputRef.current?.focus(), children: [_jsx("input", { ref: inputRef, type: "text", inputMode: "numeric", autoComplete: "one-time-code", value: value, onChange: handleInputChange, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), disabled: disabled, className: "absolute inset-0 opacity-0 cursor-default pointer-events-none" }), children] }) }));
46
+ return (_jsx(OTPStyleContext, { value: { size, variant }, children: _jsx(OTPInputBase.Root, { maxLength: maxLength, ...rest, children: children ?? renderSlots() }) }));
61
47
  };
62
- /**
63
- * OTPInputGroup
64
- * 슬롯들을 묶어주는 컨테이너입니다.
65
- */
66
- const OTPInputGroup = ({ className, children, }) => {
67
- return (_jsx("div", { className: cn('flex items-center gap-2', className), children: children }));
68
- };
69
- /**
70
- * OTPInputSlot
71
- * 개별 글자를 보여주는 칸입니다.
72
- */
48
+ const OTPInputGroup = ({ className, children, }) => _jsx(OTPInputBase.Group, { className: className, children: children });
73
49
  const OTPInputSlot = ({ index, className, }) => {
74
- const { value, focusedIndex, isInvalid, variant, size, disabled } = useOTPInputContext();
75
- const char = value[index];
76
- const isActive = focusedIndex === index;
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" }))] }));
78
- };
79
- /**
80
- * OTPInputSeparator
81
- * 그룹 사이의 구분선입니다.
82
- */
83
- const OTPInputSeparator = ({ className }) => {
84
- return _jsx("div", { className: cn('w-2 h-[2px] bg-mono300 mx-1', className) });
50
+ const { size, variant } = useContext(OTPStyleContext);
51
+ return (_jsx(OTPInputBase.Slot, { index: index, className: ({ isActive, hasValue, isInvalid }) => cn('font-bold ld-transition', sizeClasses[size], roundedClasses[size], variantClasses[variant],
52
+ // 값이 있는 칸 강조 (filled=배경, outline=테두리)
53
+ hasValue && variant === 'filled' && 'bg-tintBlue', hasValue && variant === 'outline' && 'outline-lb500', isActive && 'outline-2 outline-lb500 outline-solid -outline-offset-2', isActive && variant === 'filled' && 'bg-white', isInvalid &&
54
+ 'outline-2 outline-danger600 outline-solid -outline-offset-2 text-danger600 bg-tintRed', className) }));
85
55
  };
56
+ const OTPInputSeparator = ({ className }) => (_jsx(OTPInputBase.Separator, { className: cn('w-2 h-0.5 bg-mono300 mx-1', className) }));
86
57
  // ── Export ──
87
58
  export { LDOTPInput, OTPInputGroup, OTPInputSlot, OTPInputSeparator };
88
59
  export default LDOTPInput;
@@ -0,0 +1,46 @@
1
+ import { type ReactNode } from 'react';
2
+ interface OTPInputContextProps {
3
+ value: string;
4
+ maxLength: number;
5
+ focusedIndex: number;
6
+ isInvalid: boolean;
7
+ disabled: boolean;
8
+ }
9
+ export declare const useOTPInputContext: () => OTPInputContextProps;
10
+ /** Slot 시각 스타일 계산에 필요한 상태 */
11
+ export interface OTPSlotState {
12
+ char?: string;
13
+ isActive: boolean;
14
+ hasValue: boolean;
15
+ isInvalid: boolean;
16
+ disabled: boolean;
17
+ }
18
+ interface RootProps {
19
+ maxLength: number;
20
+ value: string;
21
+ onChange: (value: string) => void;
22
+ onComplete?: (value: string) => void;
23
+ disabled?: boolean;
24
+ isInvalid?: boolean;
25
+ className?: string;
26
+ children: ReactNode;
27
+ }
28
+ interface SlotProps {
29
+ index: number;
30
+ /** 문자열 또는 슬롯 상태를 받아 클래스를 반환하는 함수 */
31
+ className?: string | ((state: OTPSlotState) => string);
32
+ children?: ReactNode;
33
+ }
34
+ export declare const OTPInputBase: {
35
+ Root: ({ maxLength, value, onChange, onComplete, disabled, isInvalid, className, children, }: RootProps) => import("react/jsx-runtime").JSX.Element;
36
+ Group: ({ className, children, }: {
37
+ className?: string;
38
+ children: ReactNode;
39
+ }) => import("react/jsx-runtime").JSX.Element;
40
+ Slot: ({ index, className, children }: SlotProps) => import("react/jsx-runtime").JSX.Element;
41
+ Separator: ({ className }: {
42
+ className?: string;
43
+ }) => import("react/jsx-runtime").JSX.Element;
44
+ };
45
+ export default OTPInputBase;
46
+ //# sourceMappingURL=OTPInputBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OTPInputBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDOTPInput/OTPInputBase.tsx"],"names":[],"mappings":"AAEA,OAAc,EACZ,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAIf,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAID,eAAO,MAAM,kBAAkB,4BAO9B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,UAAU,SAAS;IACjB,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,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAyED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA+BD,eAAO,MAAM,YAAY;kGAlGtB,SAAS;sCAsDT;QACD,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,SAAS,CAAC;KACrB;2CAY6C,SAAS;+BAyBrB;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAII,CAAC;AAC7D,eAAe,YAAY,CAAC"}
@@ -0,0 +1,48 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState, useContext, createContext, useEffect, } from 'react';
4
+ import cn from '../../utils/cn.js';
5
+ const OTPInputContext = createContext(null);
6
+ export const useOTPInputContext = () => {
7
+ const ctx = useContext(OTPInputContext);
8
+ if (!ctx)
9
+ throw new Error('OTPInputBase 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
10
+ return ctx;
11
+ };
12
+ const Root = ({ maxLength, value, onChange, onComplete, disabled = false, isInvalid = false, className, children, }) => {
13
+ const inputRef = useRef(null);
14
+ const [isFocused, setIsFocused] = useState(false);
15
+ const [focusedIndex, setFocusedIndex] = useState(-1);
16
+ useEffect(() => {
17
+ setFocusedIndex(isFocused ? value.length : -1);
18
+ }, [value, isFocused]);
19
+ const handleInputChange = (e) => {
20
+ const newValue = e.target.value
21
+ .replace(/[^0-9a-zA-Z]/g, '')
22
+ .slice(0, maxLength);
23
+ onChange(newValue);
24
+ if (newValue.length === maxLength && onComplete) {
25
+ onComplete(newValue);
26
+ }
27
+ };
28
+ return (_jsx(OTPInputContext, { value: { value, maxLength, focusedIndex, isInvalid, disabled }, children: _jsxs("div", { className: cn('relative flex items-center gap-2 cursor-text select-none', disabled && 'opacity-50 cursor-not-allowed', className), onClick: () => !disabled && inputRef.current?.focus(), children: [_jsx("input", { ref: inputRef, type: "text", inputMode: "numeric", autoComplete: "one-time-code", value: value, onChange: handleInputChange, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), disabled: disabled, className: "absolute inset-0 opacity-0 cursor-default pointer-events-none" }), children] }) }));
29
+ };
30
+ // ── Group: 슬롯 묶음 컨테이너 ──
31
+ const Group = ({ className, children, }) => (_jsx("div", { className: cn('flex items-center gap-2', className), children: children }));
32
+ const Slot = ({ index, className, children }) => {
33
+ const { value, focusedIndex, isInvalid, disabled } = useOTPInputContext();
34
+ const char = value[index];
35
+ const state = {
36
+ char,
37
+ isActive: focusedIndex === index,
38
+ hasValue: Boolean(char),
39
+ isInvalid,
40
+ disabled,
41
+ };
42
+ const resolved = typeof className === 'function' ? className(state) : className;
43
+ return (_jsxs("div", { className: cn('relative flex items-center justify-center', resolved), children: [children ?? char, state.isActive && !disabled && (_jsx("div", { className: "absolute inset-y-1/4 w-0.5 bg-lb500 animate-pulse" }))] }));
44
+ };
45
+ // ── Separator: 그룹 사이 구분선 ──
46
+ const Separator = ({ className }) => (_jsx("div", { className: className }));
47
+ export const OTPInputBase = { Root, Group, Slot, Separator };
48
+ export default OTPInputBase;
@@ -1,6 +1,6 @@
1
1
  import type React from 'react';
2
2
  /** 페이지네이션 크기 프리셋 */
3
- export type PaginationSize = 'small' | 'medium' | 'large';
3
+ export type PaginationSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
4
4
  export interface LDPaginationProps {
5
5
  currentPage: number;
6
6
  totalPages: number;
@@ -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;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
+ {"version":3,"file":"LDPagination.d.ts","sourceRoot":"","sources":["../../../src/components/LDPagination/LDPagination.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,oBAAoB;AACpB,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AAEb,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,4CAkBnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,14 +1,7 @@
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
- /** 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
4
  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 })] }) }));
5
+ 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: size }), _jsx(PaginationBase.List, { numbersToShow: numbersToShow, size: size }), _jsx(PaginationBase.Next, { size: size })] }) }));
13
6
  };
14
7
  export default LDPagination;
@@ -1,6 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
2
  type ItemColor = 'blue' | 'red' | 'gray';
3
- type IconSize = 'sm' | 'md' | 'lg';
3
+ type IconSize = 'small' | 'medium' | 'large' | 'xlarge';
4
4
  export interface PopoverItem {
5
5
  /** 메뉴 항목 텍스트 또는 ReactNode */
6
6
  label: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"LDPopover.d.ts","sourceRoot":"","sources":["../../../src/components/LDPopover/LDPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,wCAAwC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gCAAgC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAeD,QAAA,MAAM,SAAS,GAAI,mJAchB,cAAc,4CA8DhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"LDPopover.d.ts","sourceRoot":"","sources":["../../../src/components/LDPopover/LDPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvD,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,wCAAwC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gCAAgC;IAChC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,mCAAmC;IACnC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAgBD,QAAA,MAAM,SAAS,GAAI,mJAchB,cAAc,4CA8DhB,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -10,11 +10,12 @@ const itemColorClasses = {
10
10
  gray: 'hover:bg-mono100 text-neutral500',
11
11
  };
12
12
  const iconSizes = {
13
- sm: 12,
14
- md: 20,
15
- lg: 24,
13
+ small: 12,
14
+ medium: 20,
15
+ large: 24,
16
+ xlarge: 32,
16
17
  };
17
- const LDPopover = ({ items, content, children, open, onOpenChange, iconSize = 'sm', isHorizontal = false, align = 'end', offset, contentWidth, triggerClassName, popoverClassName, style, }) => {
18
+ const LDPopover = ({ items, content, children, open, onOpenChange, iconSize = 'small', isHorizontal = false, align = 'end', offset, contentWidth, triggerClassName, popoverClassName, style, }) => {
18
19
  const isAsChild = isValidElement(children);
19
20
  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
21
  width: contentWidth === 'trigger'
@@ -0,0 +1,16 @@
1
+ import { type CSSProperties } from 'react';
2
+ export interface LDProgressBarProps {
3
+ /** 진행률 (0~100). 범위를 벗어나면 0~100으로 clamp됩니다. */
4
+ percent: number;
5
+ /** 트랙(바탕)에 적용할 추가 CSS 클래스 */
6
+ className?: string;
7
+ /** 채움 영역 색상 Tailwind 클래스 (`bg-*`, 기본 색상: `bg-lb500`) */
8
+ fillClassName?: string;
9
+ /** percent에 따라 채움 색상(`bg-*` 클래스)을 동적으로 계산하는 함수. 지정 시 `fillColor`보다 우선하며 percent 변경마다 재계산됩니다. */
10
+ getFillClassNameByPercent?: (percent: number) => string;
11
+ /** 트랙(바탕)에 적용할 인라인 스타일 */
12
+ style?: CSSProperties;
13
+ }
14
+ declare const LDProgressBar: ({ percent, className, fillClassName, getFillClassNameByPercent, style, }: LDProgressBarProps) => import("react/jsx-runtime").JSX.Element;
15
+ export default LDProgressBar;
16
+ //# sourceMappingURL=LDProgressBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/LDProgressBar/LDProgressBar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gGAAgG;IAChG,yBAAyB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,0BAA0B;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,QAAA,MAAM,aAAa,GAAI,0EAMpB,kBAAkB,4CAuBpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ import ProgressBase from './ProgressBarBase.js';
4
+ const LDProgressBar = ({ percent, className, fillClassName, getFillClassNameByPercent, style, }) => {
5
+ const clampedPercent = Math.min(Math.max(percent, 0), 100);
6
+ const dynamicFillClassName = getFillClassNameByPercent?.(clampedPercent);
7
+ return (_jsx(ProgressBase.Root, { percent: clampedPercent, className: cn('relative w-full h-2 rounded-full bg-mono100 overflow-hidden', className), style: style, children: _jsx(ProgressBase.Fill, { className: cn('h-full rounded-full ld-transition bg-lb500', fillClassName, dynamicFillClassName), style: { width: `${clampedPercent}%` } }) }));
8
+ };
9
+ export default LDProgressBar;
@@ -0,0 +1,11 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ interface RootProps extends HTMLAttributes<HTMLDivElement> {
3
+ percent: number;
4
+ children?: ReactNode;
5
+ }
6
+ export declare const ProgressBase: {
7
+ Root: ({ percent, children, ...props }: RootProps) => import("react/jsx-runtime").JSX.Element;
8
+ Fill: (props: HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element;
9
+ };
10
+ export default ProgressBase;
11
+ //# sourceMappingURL=ProgressBarBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProgressBarBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDProgressBar/ProgressBarBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D,UAAU,SAAU,SAAQ,cAAc,CAAC,cAAc,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAkBD,eAAO,MAAM,YAAY;4CAhBsB,SAAS;kBAcnC,cAAc,CAAC,cAAc,CAAC;CAKlD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const Root = ({ percent, children, ...props }) => {
3
+ return (_jsx("div", { role: "progressbar", "aria-valuenow": percent, "aria-valuemin": 0, "aria-valuemax": 100, ...props, children: children }));
4
+ };
5
+ const Fill = (props) => _jsx("div", { ...props });
6
+ export const ProgressBase = {
7
+ Root,
8
+ Fill,
9
+ };
10
+ export default ProgressBase;
@@ -4,10 +4,8 @@ interface LDFormRadioGroupProps extends Omit<LDRadioGroupProps, 'value' | 'onCha
4
4
  name: string;
5
5
  options?: RegisterOptions;
6
6
  customErrorMessage?: string;
7
- isHiddenErrorMessage?: boolean;
8
- errorClassName?: string;
9
7
  disabled?: boolean;
10
8
  }
11
- declare const LDFormRadioGroup: ({ name, options, customErrorMessage, isHiddenErrorMessage, errorClassName, disabled, ...props }: LDFormRadioGroupProps) => import("react/jsx-runtime").JSX.Element;
9
+ declare const LDFormRadioGroup: ({ name, options, customErrorMessage, disabled, ...props }: LDFormRadioGroupProps) => import("react/jsx-runtime").JSX.Element;
12
10
  export default LDFormRadioGroup;
13
11
  //# sourceMappingURL=LDFormRadioGroup.d.ts.map
@@ -1 +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"}
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;AAGtE,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,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,gBAAgB,GAAI,2DAMvB,qBAAqB,4CAoBvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,9 +1,8 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import LDRadioGroup from './LDRadioGroup.js';
4
4
  import FormField from '../LDForm/LDFormField.js';
5
- import FormErrorMessage from '../LDForm/LDFormErrorMessage.js';
6
- const LDFormRadioGroup = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = true, errorClassName, disabled = false, ...props }) => {
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 }))] })) }));
5
+ const LDFormRadioGroup = ({ name, options, customErrorMessage = '', disabled = false, ...props }) => {
6
+ return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, children: ({ field }) => (_jsx(LDRadioGroup, { ...props, name: name, value: field.value ?? '', onChange: field.onChange, disabled: disabled, "aria-invalid": field['aria-invalid'] })) }));
8
7
  };
9
8
  export default LDFormRadioGroup;
@@ -1,5 +1,5 @@
1
1
  import { type InputHTMLAttributes, type Ref } from 'react';
2
- type RadioSize = 'sm' | 'md';
2
+ export type RadioSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
3
3
  type RadioType = 'default' | 'circle' | 'pill';
4
4
  export interface LDRadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size' | 'checked' | 'disabled'> {
5
5
  /** controlled 체크 상태 */
@@ -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,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"}
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,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AACb,KAAK,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAmE/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;AAiGD,QAAA,MAAM,OAAO,GAAI,4GAYd,YAAY,4CAkDd,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -2,21 +2,66 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import RadioBase, { useRadioContext } from './RadioBase.js';
3
3
  import cn from '../../utils/cn.js';
4
4
  const radioSizeClasses = {
5
- sm: 'size-4',
6
- md: 'size-5',
5
+ '2xsmall': 'size-2.5',
6
+ xsmall: 'size-3',
7
+ small: 'size-4',
8
+ medium: 'size-5',
9
+ large: 'size-6',
10
+ xlarge: 'size-7',
7
11
  };
8
12
  const checkIconSizes = {
9
- sm: 10,
10
- md: 12,
13
+ '2xsmall': 6,
14
+ xsmall: 8,
15
+ small: 10,
16
+ medium: 12,
17
+ large: 14,
18
+ xlarge: 16,
11
19
  };
12
20
  const labelSizeClasses = {
13
- sm: 'display12',
14
- md: 'display14 bold',
21
+ '2xsmall': 'display10 bold',
22
+ xsmall: 'display10 bold',
23
+ small: 'display12 bold',
24
+ medium: 'display14 bold',
25
+ large: 'display16 bold',
26
+ xlarge: 'display18 bold',
27
+ };
28
+ // default/circle 타입 라벨↔인디케이터 간격 (LDCheckbox의 gapClasses와 동일 스케일)
29
+ const gapClasses = {
30
+ '2xsmall': 'gap-2xs',
31
+ xsmall: 'gap-2xs',
32
+ small: 'gap-xs',
33
+ medium: 'gap-sm',
34
+ large: 'gap-sm',
35
+ xlarge: 'gap-sm',
36
+ };
37
+ const pillClasses = {
38
+ '2xsmall': 'h-[24px] px-1.5 display10 bold',
39
+ xsmall: 'h-[28px] px-2 display10 bold',
40
+ small: 'h-[34px] px-3 display12 bold',
41
+ medium: 'h-[40px] px-4 display14 bold',
42
+ large: 'h-[46px] px-5 display18 bold',
43
+ xlarge: 'h-[52px] px-6 display20 bold',
44
+ };
45
+ const pillIconSizes = {
46
+ '2xsmall': 12,
47
+ xsmall: 16,
48
+ small: 16,
49
+ medium: 20,
50
+ large: 24,
51
+ xlarge: 24,
52
+ };
53
+ const pillCheckedPad = {
54
+ '2xsmall': 'pl-[14px]',
55
+ xsmall: 'pl-[18px]',
56
+ small: 'pl-[20px]',
57
+ medium: 'pl-[24px]',
58
+ large: 'pl-[28px]',
59
+ xlarge: 'pl-[28px]',
15
60
  };
16
61
  // ── Inner: pill 타입 ──
17
- const PillInner = ({ label, ref, ...props }) => {
62
+ const PillInner = ({ size, label, ref, ...props }) => {
18
63
  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, { 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 }))] })] }));
64
+ return (_jsxs(_Fragment, { children: [_jsx(RadioBase.HiddenInput, { ref: ref, ...props }), _jsxs("div", { className: "relative flex items-center", children: [_jsx(RadioBase.Indicator, { iconSize: pillIconSizes[size], 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 ? pillCheckedPad[size] : 'pl-sm pr-sm'), children: label }))] })] }));
20
65
  };
21
66
  // ── Inner: default, circle 타입 ──
22
67
  const DefaultInner = ({ type, size, label, ref, ...props }) => {
@@ -24,7 +69,8 @@ const DefaultInner = ({ type, size, label, ref, ...props }) => {
24
69
  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
70
  'outline-lb500 bg-lb500': !disabled && checked && type === 'default',
26
71
  'bg-white outline-neutral100': !disabled && !checked && type === 'default',
27
- 'bg-white outline-lb500': !disabled && type === 'circle',
72
+ 'bg-white outline-lb500': !disabled && checked && type === 'circle',
73
+ 'bg-white outline-neutral500': !disabled && !checked && type === 'circle',
28
74
  }, disabled && 'outline-neutral200 bg-mono100', radioSizeClasses[size]), iconClassName: cn('shrink-0 ld-transition', {
29
75
  'text-neutral300': checked && disabled && type === 'default',
30
76
  'text-white': checked && !disabled && type === 'default',
@@ -33,14 +79,14 @@ const DefaultInner = ({ type, size, label, ref, ...props }) => {
33
79
  'opacity-0': !checked,
34
80
  }) }), label && (_jsx(RadioBase.Label, { className: "text-neutral500", children: label }))] }));
35
81
  };
36
- const LDRadio = ({ checked, defaultChecked, onCheckedChange, size = 'sm', type = 'default', label, disabled = false, className, style, ref, ...props }) => {
82
+ const LDRadio = ({ checked, defaultChecked, onCheckedChange, size = 'small', type = 'default', label, disabled = false, className, style, ref, ...props }) => {
37
83
  if (type === 'pill') {
38
84
  return (_jsx(RadioBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style,
39
85
  // pill은 checked 여부에 따라 Root(<label>) 배경/텍스트가 바뀌어야 함.
40
86
  // Inner에서는 Root 밖 스타일을 줄 수 없으므로,
41
87
  // className을 함수로 받아 Root 내부의 resolved 값을 주입함.
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 }) }));
88
+ className: (c) => cn('items-center gap-2 rounded-full ld-transition', pillClasses[size], c ? 'bg-tintBlue text-lb500' : 'bg-mono100 text-mono500', disabled && 'opacity-50 cursor-not-allowed', className), children: _jsx(PillInner, { size: size, label: label, ref: ref, ...props }) }));
43
89
  }
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 }) }));
90
+ return (_jsx(RadioBase.Root, { checked: checked, defaultChecked: defaultChecked, onCheckedChange: onCheckedChange, disabled: disabled, style: style, className: cn('items-center', gapClasses[size], labelSizeClasses[size], className), children: _jsx(DefaultInner, { type: type, size: size, label: label, ref: ref, ...props }) }));
45
91
  };
46
92
  export default LDRadio;
@@ -1,4 +1,5 @@
1
1
  import type React from 'react';
2
+ import { type RadioSize } from './LDRadio.js';
2
3
  export interface RadioGroupOption {
3
4
  label: string;
4
5
  value: string;
@@ -9,14 +10,15 @@ export interface LDRadioGroupProps {
9
10
  value?: string;
10
11
  onChange?: (value: string) => void;
11
12
  disabled?: boolean;
12
- type?: 'default' | 'pill';
13
- size?: 'sm' | 'md';
13
+ type?: 'default' | 'pill' | 'circle';
14
+ size?: RadioSize;
14
15
  name?: string;
15
16
  'aria-invalid'?: boolean | 'true' | 'false';
16
17
  'aria-describedby'?: string;
18
+ orientation?: 'horizontal' | 'vertical';
17
19
  className?: string;
18
20
  style?: React.CSSProperties;
19
21
  }
20
- declare const LDRadioGroup: ({ items, value, onChange, disabled, type, size, name, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, className, style, }: LDRadioGroupProps) => import("react/jsx-runtime").JSX.Element;
22
+ declare const LDRadioGroup: ({ items, value, onChange, disabled, type, size, name, "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, orientation, className, style, }: LDRadioGroupProps) => import("react/jsx-runtime").JSX.Element;
21
23
  export default LDRadioGroup;
22
24
  //# sourceMappingURL=LDRadioGroup.d.ts.map
@@ -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,4CAwBnB,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;AAC/B,OAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAIpD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAaD,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,GAAG,QAAQ,CAAC;IACrC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,YAAY,GAAI,0JAanB,iBAAiB,4CA4BnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,7 +1,16 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import LDRadio from './LDRadio.js';
3
3
  import cn from '../../utils/cn.js';
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-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))) }));
4
+ // 아이템 간 간격을 사이즈별로 확장 (수평/수직 공통)
5
+ const groupGapClasses = {
6
+ '2xsmall': 'gap-xs',
7
+ xsmall: 'gap-xs',
8
+ small: 'gap-sm',
9
+ medium: 'gap-md',
10
+ large: 'gap-md',
11
+ xlarge: 'gap-lg',
12
+ };
13
+ const LDRadioGroup = ({ items, value, onChange, disabled = false, type = 'pill', size = 'small', name, 'aria-invalid': ariaInvalid, 'aria-describedby': ariaDescribedby, orientation = 'horizontal', className, style, }) => {
14
+ return (_jsx("div", { role: "radiogroup", "aria-invalid": ariaInvalid, "aria-describedby": ariaDescribedby, className: cn('flex', groupGapClasses[size], orientation === 'vertical' ? 'flex-col' : 'flex-row'), 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
15
  };
7
16
  export default LDRadioGroup;
@@ -0,0 +1,11 @@
1
+ import { type SectionNavItem } from './SectionNavBase.js';
2
+ export type LDSectionNavItem = SectionNavItem;
3
+ export interface LDSectionNavProps {
4
+ /** 목차 항목 목록. 각 항목의 id는 대상 섹션의 DOM id와 일치해야 한다 */
5
+ items?: LDSectionNavItem[];
6
+ /** 루트 nav className */
7
+ className?: string;
8
+ }
9
+ declare const LDSectionNav: ({ items, className }: LDSectionNavProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default LDSectionNav;
11
+ //# sourceMappingURL=LDSectionNav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDSectionNav.d.ts","sourceRoot":"","sources":["../../../src/components/LDSectionNav/LDSectionNav.tsx"],"names":[],"mappings":"AAGA,OAAuB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,YAAY,GAAI,sBAAsB,iBAAiB,4CAc5D,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import cn from '../../utils/cn.js';
4
+ import SectionNavBase from './SectionNavBase.js';
5
+ const LDSectionNav = ({ items, className }) => {
6
+ return (_jsx(SectionNavBase.Root, { items: items, classNames: {
7
+ root: cn('flex flex-col gap-2.5', className),
8
+ item: cn('w-full text-left p-2 rounded-md display14 text-neutral500 cursor-pointer ld-transition', 'hover:text-lb500', 'data-[active=true]:text-lb500'),
9
+ } }));
10
+ };
11
+ export default LDSectionNav;