@loword/loword-design-system 0.0.16 → 0.0.18

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 (106) hide show
  1. package/dist/components/LDAutoComplete/AutoCompleteBase.d.ts +1 -1
  2. package/dist/components/LDAutoComplete/AutoCompleteBase.d.ts.map +1 -1
  3. package/dist/components/LDAutoComplete/AutoCompleteBase.js +13 -4
  4. package/dist/components/LDBadge/LDBadge.d.ts +4 -6
  5. package/dist/components/LDBadge/LDBadge.d.ts.map +1 -1
  6. package/dist/components/LDBadge/LDBadge.js +1 -2
  7. package/dist/components/LDButton/LDButton.d.ts +0 -1
  8. package/dist/components/LDButton/LDButton.d.ts.map +1 -1
  9. package/dist/components/LDButton/LDButton.js +230 -91
  10. package/dist/components/LDCarousel/CarouselBase.d.ts +2 -2
  11. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -1
  12. package/dist/components/LDCarousel/CarouselBase.js +13 -7
  13. package/dist/components/LDChart/ChartBase.d.ts +14 -0
  14. package/dist/components/LDChart/ChartBase.d.ts.map +1 -0
  15. package/dist/components/LDChart/ChartBase.js +19 -0
  16. package/dist/components/LDChart/LDChart.d.ts +47 -0
  17. package/dist/components/LDChart/LDChart.d.ts.map +1 -0
  18. package/dist/components/LDChart/LDChart.js +183 -0
  19. package/dist/components/LDDataCalendar/LDDataCalendar.js +2 -2
  20. package/dist/components/LDDataCalendar/{DataCalendarBase.d.ts → LDDataCalendarBase.d.ts} +3 -3
  21. package/dist/components/LDDataCalendar/LDDataCalendarBase.d.ts.map +1 -0
  22. package/dist/components/LDDataCalendar/{DataCalendarBase.js → LDDataCalendarBase.js} +2 -2
  23. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -1
  24. package/dist/components/LDDatePicker/LDDatePicker.js +2 -2
  25. package/dist/components/LDDateRangePicker/LDDateRangePicker.d.ts.map +1 -1
  26. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +12 -2
  27. package/dist/components/LDDaumPostButton/LDDaumPostButton.d.ts +18 -0
  28. package/dist/components/LDDaumPostButton/LDDaumPostButton.d.ts.map +1 -0
  29. package/dist/components/LDDaumPostButton/LDDaumPostButton.js +32 -0
  30. package/dist/components/LDEmpty/LDEmpty.d.ts.map +1 -1
  31. package/dist/components/LDEmpty/LDEmpty.js +16 -12
  32. package/dist/components/LDFileUpload/LDFileUploadList.d.ts +1 -1
  33. package/dist/components/LDFileUpload/LDFileUploadList.d.ts.map +1 -1
  34. package/dist/components/LDFileUpload/LDImageUpload.d.ts +1 -1
  35. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -1
  36. package/dist/components/LDFileUpload/LDImageUploadList.d.ts +1 -1
  37. package/dist/components/LDFileUpload/LDImageUploadList.d.ts.map +1 -1
  38. package/dist/components/LDInput/LDFormInput.d.ts.map +1 -1
  39. package/dist/components/LDInput/LDFormInput.js +5 -7
  40. package/dist/components/LDInput/LDInput.d.ts +0 -1
  41. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  42. package/dist/components/LDInput/LDInput.js +161 -62
  43. package/dist/components/LDModal/LDModalView.d.ts.map +1 -1
  44. package/dist/components/LDModal/LDModalView.js +1 -2
  45. package/dist/components/LDNotification/LDNotification.d.ts.map +1 -1
  46. package/dist/components/LDNotification/LDNotification.js +27 -7
  47. package/dist/components/LDRadio/RadioBase.d.ts.map +1 -1
  48. package/dist/components/LDRadio/RadioBase.js +2 -2
  49. package/dist/components/LDRate/LDFormRate.d.ts +2 -2
  50. package/dist/components/LDRate/LDFormRate.d.ts.map +1 -1
  51. package/dist/components/LDRate/LDFormRate.js +3 -3
  52. package/dist/components/LDRate/LDRate.d.ts +4 -2
  53. package/dist/components/LDRate/LDRate.d.ts.map +1 -1
  54. package/dist/components/LDRate/LDRate.js +36 -22
  55. package/dist/components/LDSegmented/LDSegmented.d.ts +29 -0
  56. package/dist/components/LDSegmented/LDSegmented.d.ts.map +1 -0
  57. package/dist/components/LDSegmented/LDSegmented.js +149 -0
  58. package/dist/components/LDSegmented/SegmentedBase.d.ts +33 -0
  59. package/dist/components/LDSegmented/SegmentedBase.d.ts.map +1 -0
  60. package/dist/components/LDSegmented/SegmentedBase.js +136 -0
  61. package/dist/components/LDSegmented/useIsomorphicLayoutEffect.d.ts +6 -0
  62. package/dist/components/LDSegmented/useIsomorphicLayoutEffect.d.ts.map +1 -0
  63. package/dist/components/LDSegmented/useIsomorphicLayoutEffect.js +5 -0
  64. package/dist/components/LDSelect/LDMultiSelect.d.ts.map +1 -1
  65. package/dist/components/LDSelect/LDMultiSelect.js +132 -39
  66. package/dist/components/LDSelect/LDSelect.d.ts.map +1 -1
  67. package/dist/components/LDSelect/LDSelect.js +109 -45
  68. package/dist/components/LDSelect/SelectBase.d.ts.map +1 -1
  69. package/dist/components/LDSelect/SelectBase.js +2 -1
  70. package/dist/components/LDTable/LDCollapsibleTanstackTable.d.ts.map +1 -1
  71. package/dist/components/LDTable/LDCollapsibleTanstackTable.js +16 -5
  72. package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -1
  73. package/dist/components/LDTable/LDTanstackTable.js +11 -6
  74. package/dist/components/LDTable/TableField.d.ts +5 -2
  75. package/dist/components/LDTable/TableField.d.ts.map +1 -1
  76. package/dist/components/LDTable/TableField.js +54 -3
  77. package/dist/components/LDTabs/LDTabs.d.ts +11 -10
  78. package/dist/components/LDTabs/LDTabs.d.ts.map +1 -1
  79. package/dist/components/LDTabs/LDTabs.js +365 -218
  80. package/dist/components/LDTabs/TabsBase.d.ts +1 -1
  81. package/dist/components/LDTabs/TabsBase.d.ts.map +1 -1
  82. package/dist/components/LDTextarea/LDFormTextarea.d.ts.map +1 -1
  83. package/dist/components/LDTextarea/LDFormTextarea.js +1 -2
  84. package/dist/components/LDTextarea/LDTextarea.d.ts.map +1 -1
  85. package/dist/components/LDTextarea/LDTextarea.js +103 -72
  86. package/dist/index.css +174 -89
  87. package/dist/index.d.ts +5 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +7 -0
  90. package/dist/types/common.d.ts +13 -0
  91. package/dist/types/common.d.ts.map +1 -0
  92. package/dist/types/common.js +1 -0
  93. package/dist/types/subset.d.ts +17 -0
  94. package/dist/types/subset.d.ts.map +1 -0
  95. package/dist/types/subset.js +1 -0
  96. package/dist/utils/cn.d.ts.map +1 -1
  97. package/dist/utils/cn.js +33 -4
  98. package/dist/utils/tv.d.ts +151 -0
  99. package/dist/utils/tv.d.ts.map +1 -0
  100. package/dist/utils/tv.js +101 -0
  101. package/dist/utils/utils.d.ts +4 -0
  102. package/dist/utils/utils.d.ts.map +1 -1
  103. package/dist/utils/utils.js +20 -0
  104. package/package.json +31 -12
  105. package/src/styles/components/input.css +25 -0
  106. package/dist/components/LDDataCalendar/DataCalendarBase.d.ts.map +0 -1
@@ -1,5 +1,4 @@
1
1
  import { type ReactNode, type Ref } from 'react';
2
- import { type InputSize } from '../../components/LDInput/LDInput.js';
3
2
  export interface IAutoCompleteItem {
4
3
  id: string | number;
5
4
  }
@@ -12,6 +11,7 @@ interface RootProps<T extends IAutoCompleteItem> {
12
11
  children?: ReactNode;
13
12
  ref?: Ref<HTMLDivElement>;
14
13
  }
14
+ type InputSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
15
15
  interface InputProps {
16
16
  placeholder?: string;
17
17
  size?: InputSize;
@@ -1 +1 @@
1
- {"version":3,"file":"AutoCompleteBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDAutoComplete/AutoCompleteBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,GAAG,EAST,MAAM,OAAO,CAAC;AAEf,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,kCAAkC,CAAC;AAG1C,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AA4CD,UAAU,SAAS,CAAC,CAAC,SAAS,iBAAiB;IAC7C,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B;AAwJD,UAAU,UAAU;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgDD,UAAU,SAAS;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAuCD,eAAO,MAAM,kBAAkB;WA9RjB,CAAC,SAAS,iBAAiB,oFAQtC,SAAS,CAAC,CAAC,CAAC;+CAwJZ,UAAU;+CA0CV,SAAS;4BA+CmB,SAAS;CA0CvC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"AutoCompleteBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDAutoComplete/AutoCompleteBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,GAAG,EAST,MAAM,OAAO,CAAC;AAIf,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AA4CD,UAAU,SAAS,CAAC,CAAC,SAAS,iBAAiB;IAC7C,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B;AAyJD,KAAK,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAYhF,UAAU,UAAU;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAgDD,UAAU,SAAS;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAuCD,eAAO,MAAM,kBAAkB;WA3SjB,CAAC,SAAS,iBAAiB,oFAQtC,SAAS,CAAC,CAAC,CAAC;+CAqKZ,UAAU;+CA0CV,SAAS;4BA+CmB,SAAS;CA0CvC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -2,15 +2,14 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { createContext, useCallback, useContext, useEffect, useRef, useState, } from 'react';
4
4
  import LDSpinner from '../../components/LDSpinner/LDSpinner.js';
5
- import { inputSizeClasses, } from '../../components/LDInput/LDInput.js';
6
5
  import cn from '../../utils/cn.js';
7
6
  const getItemValue = (item, field) => item[field];
8
7
  const AutoCompleteContext = createContext(null);
9
8
  const useAutoCompleteContext = () => {
10
- const autoCompeleteContext = useContext(AutoCompleteContext);
11
- if (!autoCompeleteContext)
9
+ const autoCompleteContext = useContext(AutoCompleteContext);
10
+ if (!autoCompleteContext)
12
11
  throw new Error('LDAutoComplete 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
13
- return autoCompeleteContext;
12
+ return autoCompleteContext;
14
13
  };
15
14
  const autoCompleteSizeClasses = {
16
15
  '2xsmall': 'autocomplete-2xs',
@@ -105,6 +104,7 @@ const Root = ({ displayField, subFields, onSelectedItem, onChange, className, ch
105
104
  setIsOpen(true);
106
105
  }
107
106
  setFocusedIdx(-1);
107
+ // eslint-disable-next-line react-hooks/exhaustive-deps
108
108
  }, [query]);
109
109
  useEffect(() => {
110
110
  const handleClickOverlay = (e) => {
@@ -142,6 +142,15 @@ const Root = ({ displayField, subFields, onSelectedItem, onChange, className, ch
142
142
  itemRefs,
143
143
  }, children: _jsx("div", { ref: combinedRef, className: cn('relative z-40 w-full', className), children: children }) }));
144
144
  };
145
+ // ── 스타일 매핑 ──
146
+ const inputSizeClasses = {
147
+ '2xsmall': 'input-2xs',
148
+ xsmall: 'input-xs',
149
+ small: 'input-sm',
150
+ medium: 'input-md',
151
+ large: 'input-lg',
152
+ xlarge: 'input-xl',
153
+ };
145
154
  const Input = ({ placeholder = '검색어를 입력하세요', size = 'medium', className, }) => {
146
155
  const { query, isOpen, handleChange, handleKeyDown, setIsComposing, setIsOpen, } = useAutoCompleteContext();
147
156
  return (_jsx("input", { type: "text", placeholder: placeholder, value: query, onChange: (e) => handleChange(e.target.value), onKeyDown: handleKeyDown, onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), onFocus: () => {
@@ -1,13 +1,11 @@
1
1
  import { type ReactNode } from 'react';
2
2
  type BadgeSize = 'xsmall' | 'small' | 'medium' | 'large';
3
3
  type BadgeColor = 'orange' | 'fillOrange' | 'red' | 'fillRed' | 'green' | 'fillGreen' | 'blue' | 'fillBlue' | 'yellow' | 'fillYellow' | 'gray' | 'fillGray';
4
- export interface LDBadgeProps<T extends string> {
5
- /** 뱃지 유형 키 (colorsMap의 키와 매칭) */
6
- type: T;
4
+ export interface LDBadgeProps {
7
5
  /** 뱃지 사이즈 */
8
6
  size?: BadgeSize;
9
- /** type별 색상 매핑 객체 (프리셋 BadgeColor 또는 커스텀 Tailwind 클래스) */
10
- colorsMap: Record<T, BadgeColor | string>;
7
+ /** 뱃지 사이즈 */
8
+ color: BadgeColor;
11
9
  /** 왼쪽 아이콘 (ReactNode) */
12
10
  leftIcon?: ReactNode;
13
11
  /** 오른쪽 아이콘 (ReactNode) */
@@ -19,6 +17,6 @@ export interface LDBadgeProps<T extends string> {
19
17
  /** 인라인 스타일 */
20
18
  style?: React.CSSProperties;
21
19
  }
22
- declare const LDBadge: <T extends string>({ type, size, colorsMap, leftIcon, rightIcon, children, className, style, }: LDBadgeProps<T>) => import("react/jsx-runtime").JSX.Element;
20
+ declare const LDBadge: ({ size, color, leftIcon, rightIcon, children, className, style, }: LDBadgeProps) => import("react/jsx-runtime").JSX.Element;
23
21
  export default LDBadge;
24
22
  //# sourceMappingURL=LDBadge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LDBadge.d.ts","sourceRoot":"","sources":["../../../src/components/LDBadge/LDBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACzD,KAAK,UAAU,GACX,QAAQ,GACR,YAAY,GACZ,KAAK,GACL,SAAS,GACT,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC5C,iCAAiC;IACjC,IAAI,EAAE,CAAC,CAAC;IACR,aAAa;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IAC1C,yBAAyB;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY;IACZ,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AA+BD,QAAA,MAAM,OAAO,GAAI,CAAC,SAAS,MAAM,EAAE,6EAShC,YAAY,CAAC,CAAC,CAAC,4CAmBjB,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"LDBadge.d.ts","sourceRoot":"","sources":["../../../src/components/LDBadge/LDBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACzD,KAAK,UAAU,GACX,QAAQ,GACR,YAAY,GACZ,KAAK,GACL,SAAS,GACT,OAAO,GACP,WAAW,GACX,MAAM,GACN,UAAU,GACV,QAAQ,GACR,YAAY,GACZ,MAAM,GACN,UAAU,CAAC;AAEf,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,aAAa;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY;IACZ,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AA+BD,QAAA,MAAM,OAAO,GAAI,mEAQd,YAAY,4CAkBd,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -28,8 +28,7 @@ const iconSizes = {
28
28
  medium: 'icon-md',
29
29
  large: 'icon-lg',
30
30
  };
31
- const LDBadge = ({ type, size = 'small', colorsMap, leftIcon, rightIcon, children, className, style, }) => {
32
- const color = colorsMap[type];
31
+ const LDBadge = ({ size = 'small', color = 'blue', leftIcon, rightIcon, children, className, style, }) => {
33
32
  const iconSize = iconSizes[size];
34
33
  return (_jsxs(BadgeBase.Root, { className: cn('w-auto text-center whitespace-nowrap border border-transparent', colorClasses[color] ?? color, sizeClasses[size], className), style: style, children: [renderIcon(leftIcon, iconSize), children, renderIcon(rightIcon, iconSize)] }));
35
34
  };
@@ -6,7 +6,6 @@ type ButtonColor = 'neutral' | 'point' | 'danger';
6
6
  export type ButtonSize = '2xsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
7
7
  type ButtonShape = 'default' | 'capsule';
8
8
  type ButtonAlign = 'left' | 'center' | 'right';
9
- export declare const iconSizeClasses: Record<ButtonSize, string>;
10
9
  type _ButtonProps = {
11
10
  variant?: ButtonVariant;
12
11
  color?: ButtonColor;
@@ -1 +1 @@
1
- {"version":3,"file":"LDButton.d.ts","sourceRoot":"","sources":["../../../src/components/LDButton/LDButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAQpE,KAAK,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAC5D,KAAK,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AACb,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AACzC,KAAK,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AA+E/C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAOtD,CAAC;AAcF,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI,yBAAyB,CAC1E,CAAC,EACD,YAAY,CACb,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KACpB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAE/B,QAAA,MAAM,QAAQ,EAAE,eAoEf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"LDButton.d.ts","sourceRoot":"","sources":["../../../src/components/LDButton/LDButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AASpE,KAAK,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAC5D,KAAK,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,QAAQ,CAAC;AACb,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AACzC,KAAK,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAoO/C,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,WAAW,IAAI,yBAAyB,CAC1E,CAAC,EACD,YAAY,CACb,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,EAC5D,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KACpB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAE/B,QAAA,MAAM,QAAQ,EAAE,eAwDf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1,102 +1,241 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import cn from '../../utils/cn.js';
3
3
  import { renderIcon } from '../../utils/renderIcon.js';
4
+ import tv from '../../utils/tv.js';
4
5
  import ButtonBase from './ButtonBase.js';
5
6
  import ButtonSpinner from './ButtonSpinner.js';
6
7
  // ── 스타일 매핑 (static) ──
7
- const variantBaseClasses = {
8
- solid: {
9
- neutral: 'bg-neutral800 text-white',
10
- point: 'bg-lb500 text-white',
11
- danger: 'bg-danger500 text-white',
8
+ // 배경·테두리·텍스트 색은 variant × color 조합에서 갈리고, 거기에 disabled/loading 상태까지
9
+ // 얹혀야 하므로 compoundVariants가 담당한다. 축 하나로 결정되는 값만 variants에 둔다.
10
+ const buttonVariants = tv({
11
+ base: 'relative ld-transition',
12
+ variants: {
13
+ // 색과 무관하게 variant만 보면 정해지는 조각 — outline의 선 굵기/오프셋, link의 밑줄,
14
+ // focus 링을 안쪽에 그릴지 바깥쪽에 그릴지. 선·글자 색은 compoundVariants에 있다.
15
+ variant: {
16
+ solid: 'focus-visible:ring-offset-2',
17
+ outline: 'outline -outline-offset-1 focus-visible:ring-inset',
18
+ ghost: 'focus-visible:ring-inset',
19
+ link: 'underline underline-offset-4 focus-visible:ring-inset',
20
+ },
21
+ // focus 링 색은 variant와 무관하게 color만 본다 (disabled일 때도 유지).
22
+ color: {
23
+ neutral: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral800',
24
+ point: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lb500',
25
+ danger: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-danger500',
26
+ },
27
+ size: {
28
+ '2xsmall': 'btn-2xs',
29
+ xsmall: 'btn-xs',
30
+ small: 'btn-sm',
31
+ medium: 'btn-md',
32
+ large: 'btn-lg',
33
+ xlarge: 'btn-xl',
34
+ },
35
+ shape: {
36
+ default: 'rounded-[5px]',
37
+ capsule: 'rounded-full',
38
+ },
39
+ align: {
40
+ left: 'justify-start',
41
+ center: 'justify-center',
42
+ right: 'justify-end',
43
+ },
44
+ block: { true: 'w-full' },
45
+ // compact는 size 프리셋(btn-*)의 좌우 여백을 지우므로 size 뒤에 선언한다.
46
+ compact: { true: 'px-0 min-w-0 aspect-square' },
47
+ loading: { true: 'cursor-wait', false: 'cursor-pointer' },
48
+ // disabled 커서가 loading 커서를 이겨야 하므로 loading 뒤에 선언한다.
49
+ disabled: { true: 'cursor-not-allowed' },
12
50
  },
13
- outline: {
14
- neutral: 'bg-white outline -outline-offset-1 outline-neutral100 text-neutral900',
15
- point: 'bg-white outline -outline-offset-1 outline-lb500 text-lb500',
16
- danger: 'bg-white outline -outline-offset-1 outline-danger500 text-danger500',
51
+ compoundVariants: [
52
+ // ── 기본 (disabled 아닐 때만. loading 중에도 유지된다)
53
+ {
54
+ variant: 'solid',
55
+ color: 'neutral',
56
+ disabled: false,
57
+ className: 'bg-neutral800 text-white',
58
+ },
59
+ {
60
+ variant: 'solid',
61
+ color: 'point',
62
+ disabled: false,
63
+ className: 'bg-lb500 text-white',
64
+ },
65
+ {
66
+ variant: 'solid',
67
+ color: 'danger',
68
+ disabled: false,
69
+ className: 'bg-danger500 text-white',
70
+ },
71
+ {
72
+ variant: 'outline',
73
+ color: 'neutral',
74
+ disabled: false,
75
+ className: 'bg-white outline-neutral100 text-neutral900',
76
+ },
77
+ {
78
+ variant: 'outline',
79
+ color: 'point',
80
+ disabled: false,
81
+ className: 'bg-white outline-lb500 text-lb500',
82
+ },
83
+ {
84
+ variant: 'outline',
85
+ color: 'danger',
86
+ disabled: false,
87
+ className: 'bg-white outline-danger500 text-danger500',
88
+ },
89
+ // ghost와 link는 배경이 없어 기본 색이 동일하다 (link의 밑줄은 variant 축이 담당)
90
+ {
91
+ variant: ['ghost', 'link'],
92
+ color: 'neutral',
93
+ disabled: false,
94
+ className: 'bg-transparent text-neutral900',
95
+ },
96
+ {
97
+ variant: ['ghost', 'link'],
98
+ color: 'point',
99
+ disabled: false,
100
+ className: 'bg-transparent text-lb500',
101
+ },
102
+ {
103
+ variant: ['ghost', 'link'],
104
+ color: 'danger',
105
+ disabled: false,
106
+ className: 'bg-transparent text-danger500',
107
+ },
108
+ // ── hover/active (상호작용 가능할 때만 — loading 중엔 붙지 않는다)
109
+ // ghost는 outline과 같은 hover 배경을 쓰지만 active 유지 색이 없다.
110
+ {
111
+ variant: 'solid',
112
+ color: 'neutral',
113
+ disabled: false,
114
+ loading: false,
115
+ className: 'hover:bg-neutral900 active:bg-neutral900',
116
+ },
117
+ {
118
+ variant: 'solid',
119
+ color: 'point',
120
+ disabled: false,
121
+ loading: false,
122
+ className: 'hover:bg-lb700 active:bg-lb700',
123
+ },
124
+ {
125
+ variant: 'solid',
126
+ color: 'danger',
127
+ disabled: false,
128
+ loading: false,
129
+ className: 'hover:bg-danger700 active:bg-danger700',
130
+ },
131
+ {
132
+ variant: 'outline',
133
+ color: 'neutral',
134
+ disabled: false,
135
+ loading: false,
136
+ className: 'hover:bg-mono100 active:bg-mono100',
137
+ },
138
+ {
139
+ variant: 'outline',
140
+ color: 'point',
141
+ disabled: false,
142
+ loading: false,
143
+ className: 'hover:bg-accept50 active:bg-accept50',
144
+ },
145
+ {
146
+ variant: 'outline',
147
+ color: 'danger',
148
+ disabled: false,
149
+ loading: false,
150
+ className: 'hover:bg-danger50 active:bg-danger50',
151
+ },
152
+ {
153
+ variant: 'ghost',
154
+ color: 'neutral',
155
+ disabled: false,
156
+ loading: false,
157
+ className: 'hover:bg-mono100',
158
+ },
159
+ {
160
+ variant: 'ghost',
161
+ color: 'point',
162
+ disabled: false,
163
+ loading: false,
164
+ className: 'hover:bg-accept50',
165
+ },
166
+ {
167
+ variant: 'ghost',
168
+ color: 'danger',
169
+ disabled: false,
170
+ loading: false,
171
+ className: 'hover:bg-danger50',
172
+ },
173
+ {
174
+ variant: 'link',
175
+ color: 'neutral',
176
+ disabled: false,
177
+ loading: false,
178
+ className: 'hover:text-neutral900 active:text-neutral900',
179
+ },
180
+ {
181
+ variant: 'link',
182
+ color: 'point',
183
+ disabled: false,
184
+ loading: false,
185
+ className: 'hover:text-lb700 active:text-lb700',
186
+ },
187
+ {
188
+ variant: 'link',
189
+ color: 'danger',
190
+ disabled: false,
191
+ loading: false,
192
+ className: 'hover:text-danger600 active:text-danger600',
193
+ },
194
+ // ── disabled 색 (color와 무관하게 회색 고정)
195
+ {
196
+ variant: 'solid',
197
+ disabled: true,
198
+ className: 'bg-mono300 text-white',
199
+ },
200
+ {
201
+ variant: 'outline',
202
+ disabled: true,
203
+ className: 'text-mono300 outline-neutral100',
204
+ },
205
+ {
206
+ variant: ['ghost', 'link'],
207
+ disabled: true,
208
+ className: 'text-mono300',
209
+ },
210
+ ],
211
+ });
212
+ // leftIcon/rightIcon(svg) 크기. 버튼 자체가 아니라 아이콘 엘리먼트에 붙으므로 별도 tv()다.
213
+ const iconVariants = tv({
214
+ variants: {
215
+ size: {
216
+ '2xsmall': 'icon-2xs',
217
+ xsmall: 'icon-xs',
218
+ small: 'icon-sm',
219
+ medium: 'icon-md',
220
+ large: 'icon-lg',
221
+ xlarge: 'icon-xl',
222
+ },
17
223
  },
18
- ghost: {
19
- neutral: 'bg-transparent text-neutral900',
20
- point: 'bg-transparent text-lb500',
21
- danger: 'bg-transparent text-danger500',
22
- },
23
- link: {
24
- neutral: 'bg-transparent underline underline-offset-[4px] text-neutral900',
25
- point: 'bg-transparent text-lb500 underline underline-offset-[4px]',
26
- danger: 'bg-transparent text-danger500 underline underline-offset-[4px]',
27
- },
28
- };
29
- const variantHoverClasses = {
30
- solid: {
31
- neutral: 'hover:bg-neutral900 active:bg-neutral900',
32
- point: 'hover:bg-lb700 active:bg-lb700',
33
- danger: 'hover:bg-danger700 active:bg-danger700',
34
- },
35
- outline: {
36
- neutral: 'hover:bg-mono100 active:bg-mono100',
37
- point: 'hover:bg-accept50 active:bg-accept50',
38
- danger: 'hover:bg-danger50 active:bg-danger50',
39
- },
40
- ghost: {
41
- neutral: 'hover:bg-mono100',
42
- point: 'hover:bg-accept50',
43
- danger: 'hover:bg-danger50',
44
- },
45
- link: {
46
- neutral: 'hover:text-neutral900 active:text-neutral900',
47
- point: 'hover:text-lb700 active:text-lb700',
48
- danger: 'hover:text-danger600 active:text-danger600',
49
- },
50
- };
51
- const variantDisabledClasses = {
52
- solid: 'bg-mono300 text-white',
53
- outline: 'text-mono300 outline -outline-offset-1 outline-neutral100',
54
- ghost: 'text-mono300',
55
- link: 'text-mono300 underline underline-offset-[4px]',
56
- };
57
- const colorFocusClasses = {
58
- neutral: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-neutral800',
59
- point: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lb500',
60
- danger: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-danger500',
61
- };
62
- const sizeClasses = {
63
- '2xsmall': 'btn-2xs',
64
- xsmall: 'btn-xs',
65
- small: 'btn-sm',
66
- medium: 'btn-md',
67
- large: 'btn-lg',
68
- xlarge: 'btn-xl',
69
- };
70
- export const iconSizeClasses = {
71
- '2xsmall': 'icon-2xs',
72
- xsmall: 'icon-xs',
73
- small: 'icon-sm',
74
- medium: 'icon-md',
75
- large: 'icon-lg',
76
- xlarge: 'icon-xl',
77
- };
78
- const alignClasses = {
79
- left: 'justify-start',
80
- center: 'justify-center',
81
- right: 'justify-end',
82
- };
83
- const shapeClasses = {
84
- default: 'rounded-[5px]',
85
- capsule: 'rounded-full',
86
- };
224
+ });
87
225
  const LDButton = ({ as, variant = 'solid', color = 'point', size = 'small', shape = 'default', align = 'center', loading = false, block = false, children, className, leftIcon, rightIcon, compact = false, ref, ...props }) => {
88
- const iconSize = iconSizeClasses[size];
89
- return (_jsxs(ButtonBase.Root, { as: as, ref: ref, className: cn('relative ld-transition', {
90
- [variantBaseClasses[variant][color]]: !props.disabled,
91
- [variantHoverClasses[variant][color]]: !props.disabled && !loading,
92
- [variantDisabledClasses[variant]]: props.disabled,
93
- }, {
94
- [`${colorFocusClasses[color]} focus-visible:ring-offset-2`]: variant === 'solid',
95
- [`${colorFocusClasses[color]} focus-visible:ring-inset`]: variant !== 'solid',
96
- }, {
97
- ['cursor-pointer']: !props.disabled && !loading,
98
- ['cursor-wait']: !props.disabled && loading,
99
- ['cursor-not-allowed']: props.disabled,
100
- }, block && 'w-full', sizeClasses[size], shapeClasses[shape], alignClasses[align], compact && 'px-0 min-w-0 aspect-square', className), ...props, disabled: props.disabled || loading, children: [loading ? (_jsx(ButtonSpinner, { size: size, className: "mobile:absolute mobile:left-1/2 mobile:top-1/2 mobile:-translate-x-1/2 mobile:-translate-y-1/2" })) : (renderIcon(leftIcon, iconSize)), children && (_jsx("span", { className: cn('shrink-0', loading && 'mobile:invisible'), children: children })), renderIcon(rightIcon, iconSize, loading && 'mobile:invisible')] }));
226
+ const iconSize = iconVariants({ size });
227
+ return (_jsxs(ButtonBase.Root, { as: as, ref: ref, className: buttonVariants({
228
+ variant,
229
+ color,
230
+ size,
231
+ shape,
232
+ align,
233
+ block,
234
+ compact,
235
+ loading,
236
+ // 미지정도 false 분기(기본 색·hover)를 타야 하므로 boolean으로 좁혀 넘긴다.
237
+ disabled: !!props.disabled,
238
+ className,
239
+ }), ...props, disabled: props.disabled || loading, children: [loading ? (_jsx(ButtonSpinner, { size: size, className: "mobile:absolute mobile:left-1/2 mobile:top-1/2 mobile:-translate-x-1/2 mobile:-translate-y-1/2" })) : (renderIcon(leftIcon, iconSize)), children && (_jsx("span", { className: cn('shrink-0', loading && 'mobile:invisible'), children: children })), renderIcon(rightIcon, iconSize, loading && 'mobile:invisible')] }));
101
240
  };
102
241
  export default LDButton;
@@ -1,6 +1,6 @@
1
- import { type CSSProperties, type ReactNode } from 'react';
2
- import useEmblaCarousel from 'embla-carousel-react';
3
1
  import type { EmblaCarouselType, EmblaOptionsType } from 'embla-carousel';
2
+ import useEmblaCarousel from 'embla-carousel-react';
3
+ import { type CSSProperties, type ReactNode } from 'react';
4
4
  export type CarouselOrientation = 'horizontal' | 'vertical';
5
5
  interface AutoplayConfig {
6
6
  /** 자동 전환 간격(ms). 기본 4000 */
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDCarousel/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AACf,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AAGpD,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAUxB,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE5D,UAAU,cAAc;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,gBAAgB;IACxB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAGD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,mBAAmB,CAAC;IACjC,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;CACb;AAaD,+CAA+C;AAC/C,eAAO,MAAM,WAAW,2BAAqB,CAAC;AAG9C,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IACpC;qEACiE;IACjE,UAAU,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACxC,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC;4EACwE;IACxE,aAAa,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,KAAK,CAAC;IAClD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,eAAe,CAAC,CAAC;IAC9E,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAgHD,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAeD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA2BD,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAqCD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAqFD,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4BD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACrD;AAgBD,eAAO,MAAM,YAAY;yHA5UtB,SAAS;wCAuG+B,aAAa;gDAmBL,cAAc;0EA0C9D,UAAU;8CAkCoC,cAAc;8CAwBd,cAAc;wCAgEpB,SAAS;qCAgCZ,YAAY;mDAxEE,cAAc;CAgGnE,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDCarousel/CarouselBase.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
4
- import useEmblaCarousel from 'embla-carousel-react';
5
- import Autoplay from 'embla-carousel-autoplay';
6
3
  import AutoScroll from 'embla-carousel-auto-scroll';
7
- import cn from '../../utils/cn.js';
4
+ import Autoplay from 'embla-carousel-autoplay';
5
+ import useEmblaCarousel from 'embla-carousel-react';
8
6
  import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, } from 'lucide-react';
7
+ import { createContext, useCallback, useContext, useEffect, useState, } from 'react';
8
+ import cn from '../../utils/cn.js';
9
9
  const CarouselContext = createContext(null);
10
10
  const useCarouselContext = () => {
11
11
  const ctx = useContext(CarouselContext);
@@ -58,13 +58,15 @@ const Root = ({ orientation = 'horizontal', loop = false, autoplay = false, auto
58
58
  setScrollSnaps(emblaApi.scrollSnapList());
59
59
  //슬라이드 초기 상태 설정
60
60
  onSelect(emblaApi);
61
+ const onReInitSnaps = () => setScrollSnaps(emblaApi.scrollSnapList());
61
62
  emblaApi.on('select', onSelect);
62
63
  emblaApi.on('reInit', onSelect);
63
- emblaApi.on('reInit', () => setScrollSnaps(emblaApi.scrollSnapList()));
64
+ emblaApi.on('reInit', onReInitSnaps);
64
65
  return () => {
65
66
  //클린업 함수
66
67
  emblaApi.off('select', onSelect);
67
68
  emblaApi.off('reInit', onSelect);
69
+ emblaApi.off('reInit', onReInitSnaps);
68
70
  };
69
71
  }, [emblaApi, onSelect]);
70
72
  const scrollPrev = useCallback(() => emblaApi?.scrollPrev(), [emblaApi]);
@@ -126,8 +128,12 @@ const Next = ({ className, children, ...props }) => {
126
128
  (orientation === 'vertical' ? (_jsx(ChevronDown, { size: 28, strokeWidth: 1.4 })) : (_jsx(ChevronRight, { size: 28, strokeWidth: 1.4 }))) }));
127
129
  };
128
130
  const TopArrows = ({ className, children, ...props }) => {
129
- const { scrollNext, scrollPrev, canScrollNext, canScrollPrev, orientation } = useCarouselContext();
130
- return (_jsxs("div", { className: "flex flex-row ml-auto", children: [_jsx("button", { type: "button", onClick: scrollPrev, disabled: !canScrollPrev, "aria-label": props['aria-label'] ?? '이전', className: cn('disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer rounded-full size-8 flex justify-center items-center ld-transition', className), children: children ?? _jsx(ChevronLeft, { size: 22, strokeWidth: 1.2 }) }), _jsx("button", { type: "button", onClick: scrollNext, disabled: !canScrollNext, "aria-label": props['aria-label'] ?? '다음', className: cn('disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer rounded-full size-8 flex justify-center items-center ld-transition', className), children: children ?? _jsx(ChevronRight, { size: 22, strokeWidth: 1.2 }) })] }));
131
+ const { scrollNext, scrollPrev, canScrollNext, canScrollPrev } = useCarouselContext();
132
+ return (
133
+ // ld-carousel__nav-top: 상단 화살표 영역의 고정 훅.
134
+ // side 화살표의 .ld-carousel__nav 와 같은 역할 — 소비측에서 반응형 제어(예: 모바일에서만 숨김)를
135
+ // 할 때 마크업 구조(자식 순서 등)에 기대지 않도록 클래스를 제공한다.
136
+ _jsxs("div", { className: "ld-carousel__nav-top flex flex-row ml-auto", children: [_jsx("button", { type: "button", onClick: scrollPrev, disabled: !canScrollPrev, "aria-label": props['aria-label'] ?? '이전', className: cn('disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer rounded-full size-8 flex justify-center items-center ld-transition', className), children: children ?? _jsx(ChevronLeft, { size: 22, strokeWidth: 1.2 }) }), _jsx("button", { type: "button", onClick: scrollNext, disabled: !canScrollNext, "aria-label": props['aria-label'] ?? '다음', className: cn('disabled:opacity-40 disabled:cursor-not-allowed cursor-pointer rounded-full size-8 flex justify-center items-center ld-transition', className), children: children ?? _jsx(ChevronRight, { size: 22, strokeWidth: 1.2 }) })] }));
131
137
  };
132
138
  const Dots = ({ className, dotClassName }) => {
133
139
  const { scrollSnaps, selectedIndex, scrollTo } = useCarouselContext();
@@ -0,0 +1,14 @@
1
+ import { type ReactNode, type Ref } from 'react';
2
+ interface ChartSlotProps {
3
+ className?: string;
4
+ style?: React.CSSProperties;
5
+ children?: ReactNode;
6
+ ref?: Ref<HTMLDivElement>;
7
+ }
8
+ export declare const ChartBase: {
9
+ Root: ({ className, style, children, ref }: ChartSlotProps) => import("react/jsx-runtime").JSX.Element;
10
+ Viewport: ({ className, style, children, ref }: ChartSlotProps) => import("react/jsx-runtime").JSX.Element;
11
+ Overlay: ({ className, style, children, ref }: ChartSlotProps) => import("react/jsx-runtime").JSX.Element;
12
+ };
13
+ export default ChartBase;
14
+ //# sourceMappingURL=ChartBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartBase.d.ts","sourceRoot":"","sources":["../../../src/components/LDChart/ChartBase.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAKjD,UAAU,cAAc;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B;AA6BD,eAAO,MAAM,SAAS;gDA1B6B,cAAc;oDASV,cAAc;mDASf,cAAc;CAYnE,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // ── Root: 최외곽 래퍼 ──
3
+ const Root = ({ className, style, children, ref }) => {
4
+ return (_jsx("div", { ref: ref, style: style, className: className, children: children }));
5
+ };
6
+ // ── Viewport: canvas와 오버레이를 담는 차트 영역 ──
7
+ const Viewport = ({ className, style, children, ref }) => {
8
+ return (_jsx("div", { ref: ref, style: style, className: className, children: children }));
9
+ };
10
+ // ── Overlay: Viewport 위에 겹쳐 그리는 레이어 (로딩 표시 등) ──
11
+ const Overlay = ({ className, style, children, ref }) => {
12
+ return (_jsx("div", { ref: ref, style: style, className: className, children: children }));
13
+ };
14
+ export const ChartBase = {
15
+ Root,
16
+ Viewport,
17
+ Overlay,
18
+ };
19
+ export default ChartBase;
@@ -0,0 +1,47 @@
1
+ /** label 자동 생성 단위. dayjs의 ManipulateType 중 아래 포맷이 정의된 3개만 허용한다. */
2
+ export type LDChartUnit = 'day' | 'month' | 'year';
3
+ export type LDChartPosition = 'left' | 'right';
4
+ /** 시리즈 색상 프리셋. DS 색 팔레트의 500 단계에 대응한다. */
5
+ export type LDChartColor = 'lowordBlue' | 'blue' | 'red' | 'orange' | 'yellow' | 'green' | 'pink' | 'purple';
6
+ /**
7
+ * LDChart의 props입니다.
8
+ * 원본(mono repo LDChart) 대비 `loader?: string`은 `loading?: boolean`으로,
9
+ * 임의 hex를 받던 `bgColor?: string`은 프리셋 `color?: LDChartColor`로 대체되고,
10
+ * 미사용이던 `onChange` prop은 제거되었습니다.
11
+ * 색상 기본값이 프리셋 `'lowordBlue'`로 통일되어, 원본의 기본 렌더와는 다릅니다
12
+ * (라인 `#5F92FF` → `#6891f8`, 3색 그라디언트 → 단일 색 알파 램프, hover 배경 `#EF4545` → 시리즈 색).
13
+ */
14
+ export interface LDChartProps {
15
+ /** 차트에 그릴 단일 데이터셋(시리즈 이름, 값, 라벨) */
16
+ dataList: {
17
+ /** 범례/툴팁에 표시할 시리즈 이름 (기본값: 빈 문자열) */
18
+ keyword?: string;
19
+ /** y축 값 배열 */
20
+ value: number[];
21
+ /** x축 라벨 배열. 비어 있으면 unit 기준 오늘까지 7개 라벨을 자동 생성 */
22
+ label: string[];
23
+ };
24
+ /** 라인·포인트·그라디언트에 쓸 시리즈 색상 프리셋 (기본값: 'lowordBlue') */
25
+ color?: LDChartColor;
26
+ /** y축 위치 (기본값: 'right') */
27
+ position?: LDChartPosition;
28
+ /** true면 y축을 반전하고 채움 방향을 위쪽(start)으로 바꾼다 */
29
+ reverseYAxis?: boolean;
30
+ /** y축 눈금 뒤에 붙일 단위 문자열 */
31
+ yUnit?: string;
32
+ /** 툴팁 값 뒤에 붙일 단위 문자열 */
33
+ tooltipUnit?: string;
34
+ /** label이 비어 있을 때 자동 생성할 라벨의 단위 (기본값: 'day') */
35
+ unit?: LDChartUnit;
36
+ /** 로딩 오버레이 표시 여부 */
37
+ loading?: boolean;
38
+ /** 최외곽 래퍼(Root)에 적용할 className. 배경색은 기본 투명이므로 여기서 지정한다 */
39
+ rootClassName?: string;
40
+ /** 차트 영역(Viewport)에 적용할 className */
41
+ className?: string;
42
+ /** sizing(width/height/min·max)은 차트 영역(Viewport)에, 나머지 스타일은 Root에 적용된다 */
43
+ style?: React.CSSProperties;
44
+ }
45
+ declare const LDChart: ({ dataList, color, position, reverseYAxis, yUnit, tooltipUnit, unit, loading, rootClassName, className, style, }: LDChartProps) => import("react/jsx-runtime").JSX.Element;
46
+ export default LDChart;
47
+ //# sourceMappingURL=LDChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDChart.d.ts","sourceRoot":"","sources":["../../../src/components/LDChart/LDChart.tsx"],"names":[],"mappings":"AAwCA,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAQnD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/C,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,MAAM,GACN,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAyCb;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,QAAQ,EAAE;QACR,qCAAqC;QACrC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,iDAAiD;QACjD,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,qDAAqD;IACrD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,QAAA,MAAM,OAAO,GAAI,kHAYd,YAAY,4CAwLd,CAAC;AAEF,eAAe,OAAO,CAAC"}