@loword/loword-design-system 0.0.7 → 0.0.9

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 (126) hide show
  1. package/dist/components/Icon/LucideIcon.d.ts +2 -1
  2. package/dist/components/Icon/LucideIcon.d.ts.map +1 -1
  3. package/dist/components/Icon/LucideIcon.js +2 -2
  4. package/dist/components/LDAutoComplete/AutoCompleteBase.js +1 -1
  5. package/dist/components/LDBreadCrumb/LDBreadCrumb.js +7 -7
  6. package/dist/components/LDButton/LDButton.d.ts +1 -0
  7. package/dist/components/LDButton/LDButton.d.ts.map +1 -1
  8. package/dist/components/LDButton/LDButton.js +3 -3
  9. package/dist/components/LDCarousel/CarouselBase.d.ts +6 -2
  10. package/dist/components/LDCarousel/CarouselBase.d.ts.map +1 -1
  11. package/dist/components/LDCarousel/CarouselBase.js +11 -5
  12. package/dist/components/LDCarousel/LDCarousel.d.ts +9 -2
  13. package/dist/components/LDCarousel/LDCarousel.d.ts.map +1 -1
  14. package/dist/components/LDCarousel/LDCarousel.js +3 -2
  15. package/dist/components/LDCheckbox/FormCheckbox.js +2 -2
  16. package/dist/components/LDCheckbox/FormCheckboxGroup.js +2 -2
  17. package/dist/components/LDCheckbox/LDCheckbox.d.ts.map +1 -1
  18. package/dist/components/LDCheckbox/LDCheckbox.js +7 -1
  19. package/dist/components/LDDatePicker/FormDatePicker.js +2 -2
  20. package/dist/components/LDDatePicker/LDDatePicker.d.ts.map +1 -1
  21. package/dist/components/LDDatePicker/LDDatePicker.js +1 -3
  22. package/dist/components/LDDateRangePicker/FormDateRangePicker.js +2 -2
  23. package/dist/components/LDDateRangePicker/LDDateRangePicker.js +8 -8
  24. package/dist/components/LDFileUpload/FileUploadBase.d.ts +6 -3
  25. package/dist/components/LDFileUpload/FileUploadBase.d.ts.map +1 -1
  26. package/dist/components/LDFileUpload/FileUploadBase.js +28 -11
  27. package/dist/components/LDFileUpload/LDFileUpload.d.ts +2 -0
  28. package/dist/components/LDFileUpload/LDFileUpload.d.ts.map +1 -1
  29. package/dist/components/LDFileUpload/LDFileUpload.js +1 -1
  30. package/dist/components/LDFileUpload/LDFileUploadList.d.ts +2 -0
  31. package/dist/components/LDFileUpload/LDFileUploadList.d.ts.map +1 -1
  32. package/dist/components/LDFileUpload/LDFileUploadList.js +1 -1
  33. package/dist/components/LDFileUpload/LDImageUpload.d.ts +2 -0
  34. package/dist/components/LDFileUpload/LDImageUpload.d.ts.map +1 -1
  35. package/dist/components/LDFileUpload/LDImageUpload.js +1 -1
  36. package/dist/components/LDFileUpload/LDImageUploadList.d.ts +2 -0
  37. package/dist/components/LDFileUpload/LDImageUploadList.d.ts.map +1 -1
  38. package/dist/components/LDFileUpload/LDImageUploadList.js +1 -1
  39. package/dist/components/LDForm/LDForm.d.ts +21 -0
  40. package/dist/components/LDForm/LDForm.d.ts.map +1 -0
  41. package/dist/components/{Form/Form.js → LDForm/LDForm.js} +3 -3
  42. package/dist/components/LDForm/LDFormErrorMessage.d.ts +9 -0
  43. package/dist/components/LDForm/LDFormErrorMessage.d.ts.map +1 -0
  44. package/dist/components/LDForm/LDFormErrorMessage.js +17 -0
  45. package/dist/components/{Form/FormField.d.ts → LDForm/LDFormField.d.ts} +6 -6
  46. package/dist/components/LDForm/LDFormField.d.ts.map +1 -0
  47. package/dist/components/{Form/FormField.js → LDForm/LDFormField.js} +2 -2
  48. package/dist/components/LDInput/LDFormInput.d.ts +15 -0
  49. package/dist/components/LDInput/LDFormInput.d.ts.map +1 -0
  50. package/dist/components/LDInput/{FormInput.js → LDFormInput.js} +12 -7
  51. package/dist/components/LDInput/LDInput.d.ts.map +1 -1
  52. package/dist/components/LDInput/LDInput.js +21 -13
  53. package/dist/components/LDPagination/PaginationBase.d.ts.map +1 -1
  54. package/dist/components/LDPagination/PaginationBase.js +7 -7
  55. package/dist/components/LDPopover/LDPopover.js +3 -3
  56. package/dist/components/LDPopover/PopoverBase.js +1 -1
  57. package/dist/components/LDRadio/FormRadioGroup.js +2 -2
  58. package/dist/components/LDRadio/LDRadio.d.ts.map +1 -1
  59. package/dist/components/LDRadio/LDRadio.js +3 -5
  60. package/dist/components/LDRadio/RadioBase.d.ts.map +1 -1
  61. package/dist/components/LDRadio/RadioBase.js +1 -3
  62. package/dist/components/LDSelect/FormMultiSelect.js +2 -2
  63. package/dist/components/LDSelect/FormSelect.js +2 -2
  64. package/dist/components/LDSelect/LDMultiSelect.js +3 -3
  65. package/dist/components/LDSelect/LDSelect.js +1 -1
  66. package/dist/components/LDTable/LDCollapsibleTanstackTable.d.ts +26 -0
  67. package/dist/components/LDTable/LDCollapsibleTanstackTable.d.ts.map +1 -0
  68. package/dist/components/LDTable/LDCollapsibleTanstackTable.js +38 -0
  69. package/dist/components/LDTable/LDTable.d.ts +5 -1
  70. package/dist/components/LDTable/LDTable.d.ts.map +1 -1
  71. package/dist/components/LDTable/LDTable.js +13 -17
  72. package/dist/components/LDTable/LDTanstackTable.d.ts +15 -13
  73. package/dist/components/LDTable/LDTanstackTable.d.ts.map +1 -1
  74. package/dist/components/LDTable/LDTanstackTable.js +21 -23
  75. package/dist/components/LDTable/TableField.d.ts +17 -5
  76. package/dist/components/LDTable/TableField.d.ts.map +1 -1
  77. package/dist/components/LDTable/TableField.js +16 -6
  78. package/dist/components/LDTeamHistory/LDTeamHistory.d.ts +12 -0
  79. package/dist/components/LDTeamHistory/LDTeamHistory.d.ts.map +1 -0
  80. package/dist/components/LDTeamHistory/LDTeamHistory.js +14 -0
  81. package/dist/components/{LDAnchor/AnchorBase.d.ts → LDTeamHistory/TeamHistoryBase.d.ts} +12 -6
  82. package/dist/components/LDTeamHistory/TeamHistoryBase.d.ts.map +1 -0
  83. package/dist/components/LDTeamHistory/TeamHistoryBase.js +108 -0
  84. package/dist/components/LDTextarea/FormTextarea.d.ts +14 -0
  85. package/dist/components/LDTextarea/FormTextarea.d.ts.map +1 -0
  86. package/dist/components/LDTextarea/FormTextarea.js +10 -0
  87. package/dist/components/LDTextarea/LDTextarea.d.ts +26 -0
  88. package/dist/components/LDTextarea/LDTextarea.d.ts.map +1 -0
  89. package/dist/components/LDTextarea/LDTextarea.js +163 -0
  90. package/dist/components/LDTimePicker/FormTimePicker.js +2 -2
  91. package/dist/components/LDTimePicker/LDTimePicker.js +4 -4
  92. package/dist/components/LDToggleButton/FormToggleButton.js +2 -2
  93. package/dist/components/LDTooltip/TooltipBase.js +1 -1
  94. package/dist/index.css +914 -684
  95. package/dist/index.d.ts +8 -5
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +10 -6
  98. package/dist/utils/renderIcon.d.ts +1 -1
  99. package/package.json +23 -21
  100. package/src/styles/carousel.css +54 -7
  101. package/src/styles/components/auto-complete.css +66 -64
  102. package/src/styles/components/badge.css +29 -27
  103. package/src/styles/components/bread-crumb.css +49 -17
  104. package/src/styles/components/button.css +146 -144
  105. package/src/styles/components/icon.css +25 -23
  106. package/src/styles/components/index.css +1 -0
  107. package/src/styles/components/input.css +43 -41
  108. package/src/styles/components/modal.css +14 -12
  109. package/src/styles/components/shared.css +2 -2
  110. package/src/styles/components/spinner.css +25 -23
  111. package/src/styles/components/team-history.css +10 -0
  112. package/src/styles/focus.css +1 -1
  113. package/src/styles/slider.css +58 -54
  114. package/dist/components/Form/Form.d.ts +0 -21
  115. package/dist/components/Form/Form.d.ts.map +0 -1
  116. package/dist/components/Form/FormErrorMessage.d.ts +0 -9
  117. package/dist/components/Form/FormErrorMessage.d.ts.map +0 -1
  118. package/dist/components/Form/FormErrorMessage.js +0 -6
  119. package/dist/components/Form/FormField.d.ts.map +0 -1
  120. package/dist/components/LDAnchor/AnchorBase.d.ts.map +0 -1
  121. package/dist/components/LDAnchor/AnchorBase.js +0 -69
  122. package/dist/components/LDAnchor/LDAnchor.d.ts +0 -10
  123. package/dist/components/LDAnchor/LDAnchor.d.ts.map +0 -1
  124. package/dist/components/LDAnchor/LDAnchor.js +0 -14
  125. package/dist/components/LDInput/FormInput.d.ts +0 -15
  126. package/dist/components/LDInput/FormInput.d.ts.map +0 -1
@@ -0,0 +1,108 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import cn from '../../utils/cn.js';
3
+ import { createContext, useContext, useEffect, useRef, useState, } from 'react';
4
+ const TeamHistoryContext = createContext(null);
5
+ const useTeamHistoryContext = () => {
6
+ const teamHistoryContext = useContext(TeamHistoryContext);
7
+ if (!teamHistoryContext)
8
+ throw new Error('LDTeamHistory 하위 컴포넌트는 Root 내부에서 사용해야 합니다.');
9
+ return teamHistoryContext;
10
+ };
11
+ const getScrollParent = (element) => {
12
+ let parent = element?.parentElement ?? null;
13
+ while (parent && parent !== document.body) {
14
+ const style = window.getComputedStyle(parent);
15
+ const overflowY = style.overflowY;
16
+ const canScroll = parent.scrollHeight > parent.clientHeight;
17
+ if (canScroll && ['auto', 'scroll', 'overlay'].includes(overflowY)) {
18
+ return parent;
19
+ }
20
+ parent = parent.parentElement;
21
+ }
22
+ return null;
23
+ };
24
+ const getRootBottom = (root) => {
25
+ if (root)
26
+ return root.getBoundingClientRect().bottom;
27
+ return window.innerHeight ?? document.documentElement.clientHeight;
28
+ };
29
+ const Root = (props) => {
30
+ const [index, setIndex] = useState(0);
31
+ const sectionRefs = useRef(Array(props.items.length).fill(null));
32
+ const moveToSection = (targetIndex) => {
33
+ setIndex(targetIndex);
34
+ sectionRefs.current?.[targetIndex]?.scrollIntoView({
35
+ behavior: 'smooth',
36
+ block: 'end',
37
+ });
38
+ };
39
+ useEffect(() => {
40
+ const root = props.isRootWindow
41
+ ? null
42
+ : getScrollParent(sectionRefs.current[0] ?? null);
43
+ const currentSectionRefs = [...sectionRefs.current];
44
+ const observer = new IntersectionObserver(() => {
45
+ const rootBottom = getRootBottom(root);
46
+ let activeIndex = 0;
47
+ sectionRefs.current.forEach((ref, idx) => {
48
+ if (!ref)
49
+ return;
50
+ const rect = ref.getBoundingClientRect();
51
+ if (rect.top <= rootBottom) {
52
+ activeIndex = idx;
53
+ }
54
+ });
55
+ setIndex(activeIndex);
56
+ }, { root });
57
+ currentSectionRefs.forEach((ref) => {
58
+ if (ref) {
59
+ observer.observe(ref);
60
+ }
61
+ });
62
+ return () => {
63
+ observer.disconnect();
64
+ };
65
+ }, [props.isRootWindow, props.items.length]);
66
+ return (_jsx(TeamHistoryContext.Provider, { value: {
67
+ items: props.items,
68
+ index,
69
+ sectionRefs,
70
+ moveToSection,
71
+ }, children: _jsx("div", { className: cn('relative', props.className), children: props.children }) }));
72
+ };
73
+ const Navigation = ({ classNames }) => {
74
+ const { items, index, moveToSection } = useTeamHistoryContext();
75
+ const navRef = useRef(null);
76
+ useEffect(() => {
77
+ const nav = navRef.current;
78
+ if (!nav)
79
+ return;
80
+ const syncNavigationOffset = () => {
81
+ nav.style.setProperty('--ld-team-history-navigation-offset', `${nav.offsetHeight / 2}px`);
82
+ };
83
+ syncNavigationOffset();
84
+ if (typeof ResizeObserver === 'undefined')
85
+ return;
86
+ const resizeObserver = new ResizeObserver(syncNavigationOffset);
87
+ resizeObserver.observe(nav);
88
+ return () => {
89
+ resizeObserver.disconnect();
90
+ };
91
+ }, [items.length]);
92
+ return (_jsx("nav", { ref: navRef, className: classNames?.root, children: items.map((item, idx) => {
93
+ const isActive = idx === index;
94
+ return (_jsxs("div", { className: "relative flex flex-col items-end", children: [_jsxs("button", { className: classNames?.item, "aria-current": isActive ? 'true' : undefined, onClick: () => moveToSection(idx), children: [_jsx("span", { "data-active": isActive, className: classNames?.label, children: item.target }), _jsx("span", { "data-active": isActive, className: classNames?.dot })] }), idx < items.length - 1 && (_jsx("span", { "data-active": idx + 1 === index, className: classNames?.line }))] }, `${item.target}_${idx}`));
95
+ }) }));
96
+ };
97
+ const Sections = ({ rootClassName, sectionClassName, }) => {
98
+ const { items, sectionRefs } = useTeamHistoryContext();
99
+ return (_jsx("div", { className: rootClassName, children: items.map((item, idx) => (_jsx("section", { ref: (el) => {
100
+ sectionRefs.current[idx] = el;
101
+ }, className: sectionClassName, children: item.section }, `section_content_${item.target}_${idx}`))) }));
102
+ };
103
+ export const TeamHistoryBase = {
104
+ Root,
105
+ Navigation,
106
+ Sections,
107
+ };
108
+ export default TeamHistoryBase;
@@ -0,0 +1,14 @@
1
+ import { type Ref } from 'react';
2
+ import { type RegisterOptions } from 'react-hook-form';
3
+ import { type LDTextareaProps } from './LDTextarea.js';
4
+ interface FormTextareaProps extends Omit<LDTextareaProps, 'name' | 'color' | 'onChange' | 'value' | 'onBlur'> {
5
+ name: string;
6
+ options?: RegisterOptions;
7
+ ref?: Ref<HTMLTextAreaElement>;
8
+ customErrorMessage?: string;
9
+ isHiddenErrorMessage?: boolean;
10
+ errorClassName?: string;
11
+ }
12
+ declare const FormTextarea: ({ name, options, variant, disabled, ref, customErrorMessage, isHiddenErrorMessage, errorClassName, ...props }: FormTextareaProps) => import("react/jsx-runtime").JSX.Element;
13
+ export default FormTextarea;
14
+ //# sourceMappingURL=FormTextarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormTextarea.d.ts","sourceRoot":"","sources":["../../../src/components/LDTextarea/FormTextarea.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAKhE,UAAU,iBAAkB,SAAQ,IAAI,CACtC,eAAe,EACf,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CACnD;IACC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,QAAA,MAAM,YAAY,GAAI,+GAUnB,iBAAiB,4CAmCnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import LDTextarea from './LDTextarea.js';
4
+ import FormField from '../LDForm/LDFormField.js';
5
+ import FormErrorMessage from '../LDForm/LDFormErrorMessage.js';
6
+ import cn from '../../utils/cn.js';
7
+ const FormTextarea = ({ name, options, variant = 'filled', disabled = false, ref, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, ...props }) => {
8
+ return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, ref: ref, children: ({ field, fieldState }) => (_jsxs("div", { className: "relative", children: [_jsx(LDTextarea, { ...props, ...field, value: field.value ?? '', variant: variant, color: fieldState.hasError ? 'danger' : 'neutral', disabled: disabled, "aria-invalid": fieldState.hasError, "aria-describedby": fieldState.hasError ? fieldState.errorId : undefined }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { id: fieldState.errorId, error: fieldState.error, disabled: disabled, className: cn('static mt-1 text-right', errorClassName) }))] })) }));
9
+ };
10
+ export default FormTextarea;
@@ -0,0 +1,26 @@
1
+ import { type HTMLAttributes, type ReactNode, type Ref, type TextareaHTMLAttributes } from 'react';
2
+ type TextareaVariant = 'filled' | 'outline' | 'ghost';
3
+ type TextareaColor = 'neutral' | 'point' | 'danger';
4
+ export type TextareaSize = 'xSmall' | 'small' | 'medium' | 'large' | 'big' | 'xLarge';
5
+ type TextareaResize = 'normal' | 'limit' | 'fixed' | 'manual';
6
+ type TextareaContentVariant = 'characterCounter' | 'badge' | 'chip' | 'icon' | 'iconButton' | 'primaryIconButton' | 'textButton';
7
+ export interface TextareaContentProps extends HTMLAttributes<HTMLSpanElement> {
8
+ variant?: TextareaContentVariant;
9
+ }
10
+ export declare const TextareaContent: ({ variant, className, children, ...props }: TextareaContentProps) => import("react/jsx-runtime").JSX.Element;
11
+ export interface LDTextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'color' | 'rows'> {
12
+ bottom?: boolean;
13
+ variant?: TextareaVariant;
14
+ color?: TextareaColor;
15
+ size?: TextareaSize;
16
+ resize?: TextareaResize;
17
+ minRows?: number;
18
+ maxRows?: number;
19
+ rows?: number;
20
+ counterMaxLength?: number;
21
+ leadingContent?: ReactNode;
22
+ ref?: Ref<HTMLTextAreaElement>;
23
+ }
24
+ declare const LDTextarea: import("react").ForwardRefExoticComponent<Omit<LDTextareaProps, "ref"> & import("react").RefAttributes<HTMLTextAreaElement>>;
25
+ export default LDTextarea;
26
+ //# sourceMappingURL=LDTextarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LDTextarea.d.ts","sourceRoot":"","sources":["../../../src/components/LDTextarea/LDTextarea.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,GAAG,EACR,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAGf,KAAK,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AACtD,KAAK,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,KAAK,GACL,QAAQ,CAAC;AAEb,KAAK,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC9D,KAAK,sBAAsB,GACvB,kBAAkB,GAClB,OAAO,GACP,MAAM,GACN,MAAM,GACN,YAAY,GACZ,mBAAmB,GACnB,YAAY,CAAC;AAEjB,MAAM,WAAW,oBAAqB,SAAQ,cAAc,CAAC,eAAe,CAAC;IAC3E,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAYD,eAAO,MAAM,eAAe,GAAI,4CAK7B,oBAAoB,4CAMtB,CAAC;AA6EF,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAC3C,sBAAsB,CAAC,mBAAmB,CAAC,EAC3C,OAAO,GAAG,MAAM,CACjB;IACC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CAChC;AAED,QAAA,MAAM,UAAU,8HAqMf,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,163 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback, useEffect, useRef, useState, } from 'react';
3
+ import cn from '../../utils/cn.js';
4
+ const contentVariantClasses = {
5
+ characterCounter: 'display12 text-neutral500 [letter-spacing:0.02em]',
6
+ badge: 'inline-flex items-center',
7
+ chip: 'inline-flex items-center',
8
+ icon: 'inline-flex size-6 items-center justify-center text-[24px]',
9
+ iconButton: 'inline-flex items-center justify-center',
10
+ primaryIconButton: 'inline-flex items-center justify-center text-lb500',
11
+ textButton: 'display14 bold cursor-pointer text-lb500',
12
+ };
13
+ export const TextareaContent = ({ variant = 'characterCounter', className, children, ...props }) => {
14
+ return (_jsx("span", { className: cn(contentVariantClasses[variant], className), ...props, children: children }));
15
+ };
16
+ const fieldVariantColorClasses = {
17
+ filled: {
18
+ neutral: 'bg-neutral50 text-neutral900',
19
+ point: 'bg-tintBlue text-neutral900',
20
+ danger: 'bg-tintRed text-neutral900',
21
+ },
22
+ outline: {
23
+ neutral: 'bg-transparent text-neutral900',
24
+ point: 'bg-transparent text-neutral900',
25
+ danger: 'bg-transparent text-neutral900',
26
+ },
27
+ ghost: {
28
+ neutral: 'bg-transparent text-neutral900 focus-within:bg-neutral50',
29
+ point: 'bg-transparent text-neutral900 focus-within:bg-tintBlue',
30
+ danger: 'bg-transparent text-neutral900 focus-within:bg-tintRed',
31
+ },
32
+ };
33
+ const interactionVariantColorClasses = {
34
+ filled: {
35
+ neutral: 'border-transparent',
36
+ point: 'border-transparent',
37
+ danger: 'border-transparent',
38
+ },
39
+ outline: {
40
+ neutral: 'border-2 border-mono200',
41
+ point: 'border-2 border-lb500',
42
+ danger: 'border-2 border-danger500',
43
+ },
44
+ ghost: {
45
+ neutral: 'border-transparent group-hover:border-2',
46
+ point: 'border-transparent group-hover:border-2',
47
+ danger: 'border-transparent',
48
+ },
49
+ };
50
+ const focusedColorClasses = {
51
+ neutral: 'border-2 border-lb500',
52
+ point: 'border-2 border-lb500',
53
+ danger: 'border-2 border-danger500',
54
+ };
55
+ const fieldSizeClasses = {
56
+ xSmall: 'gap-1 rounded-[6px] px-1 py-1',
57
+ small: 'gap-1.5 rounded-[6px] px-1.5 py-1.5',
58
+ medium: 'gap-2 rounded-[6px] px-2.5 py-2',
59
+ large: 'gap-2.5 rounded-[8px] px-3 py-2.5',
60
+ big: 'gap-3 rounded-[10px] px-4 py-3',
61
+ xLarge: 'gap-3 rounded-[16px] px-5 py-4',
62
+ };
63
+ const textareaSizeClasses = {
64
+ xSmall: 'display10',
65
+ small: 'display12',
66
+ medium: 'display14',
67
+ large: 'display16',
68
+ big: 'display18',
69
+ xLarge: 'display20',
70
+ };
71
+ const interactionRadiusClasses = {
72
+ xSmall: 'rounded-[6px]',
73
+ small: 'rounded-[6px]',
74
+ medium: 'rounded-[6px]',
75
+ large: 'rounded-[8px]',
76
+ big: 'rounded-[10px]',
77
+ xLarge: 'rounded-[16px]',
78
+ };
79
+ const LDTextarea = forwardRef(function LDTextarea({ bottom = true, variant = 'filled', color = 'neutral', size = 'medium', resize = 'normal', minRows = 3, maxRows = 8, rows = 3, maxLength, counterMaxLength, leadingContent, disabled, readOnly, value, defaultValue, onChange, onCompositionEnd, onFocus, onBlur, className, style, ...props }, ref) {
80
+ const isControlled = value !== undefined;
81
+ const [internalValue, setInternalValue] = useState(defaultValue ?? '');
82
+ const [focused, setFocused] = useState(false);
83
+ const textareaRef = useRef(null);
84
+ const currentValue = isControlled ? value : internalValue;
85
+ const resolvedMaxLength = maxLength ?? counterMaxLength;
86
+ const limitValue = useCallback((nextValue) => {
87
+ if (resolvedMaxLength == null ||
88
+ nextValue.length <= resolvedMaxLength) {
89
+ return nextValue;
90
+ }
91
+ return nextValue.slice(0, resolvedMaxLength);
92
+ }, [resolvedMaxLength]);
93
+ const combinedRef = useCallback((node) => {
94
+ textareaRef.current = node;
95
+ if (typeof ref === 'function')
96
+ ref(node);
97
+ else if (ref)
98
+ ref.current = node;
99
+ }, [ref]);
100
+ const adjustHeight = useCallback(() => {
101
+ const el = textareaRef.current;
102
+ if (!el || resize === 'fixed' || resize === 'manual')
103
+ return;
104
+ el.style.height = 'auto';
105
+ const rowHeight = parseFloat(getComputedStyle(el).lineHeight) || 20;
106
+ const minHeight = rowHeight * minRows;
107
+ const maxHeight = resize === 'limit' ? rowHeight * maxRows : Infinity;
108
+ const height = Math.min(Math.max(el.scrollHeight, minHeight), maxHeight);
109
+ el.style.height = `${height}px`;
110
+ el.style.overflowY = el.scrollHeight > height ? 'auto' : 'hidden';
111
+ }, [resize, minRows, maxRows]);
112
+ useEffect(() => {
113
+ adjustHeight();
114
+ }, [adjustHeight, currentValue]);
115
+ const handleChange = (event) => {
116
+ if (event.nativeEvent.isComposing) {
117
+ if (!isControlled)
118
+ setInternalValue(event.target.value);
119
+ onChange?.(event);
120
+ return;
121
+ }
122
+ const nextValue = limitValue(event.target.value);
123
+ if (nextValue !== event.target.value) {
124
+ event.target.value = nextValue;
125
+ event.currentTarget.value = nextValue;
126
+ }
127
+ if (!isControlled)
128
+ setInternalValue(nextValue);
129
+ onChange?.(event);
130
+ };
131
+ const handleCompositionEnd = (event) => {
132
+ onCompositionEnd?.(event);
133
+ const nextValue = limitValue(event.currentTarget.value);
134
+ if (nextValue === event.currentTarget.value)
135
+ return;
136
+ event.currentTarget.value = nextValue;
137
+ if (event.target instanceof HTMLTextAreaElement) {
138
+ event.target.value = nextValue;
139
+ }
140
+ if (!isControlled)
141
+ setInternalValue(nextValue);
142
+ onChange?.(event);
143
+ };
144
+ const handleFocus = (event) => {
145
+ setFocused(true);
146
+ onFocus?.(event);
147
+ };
148
+ const handleBlur = (event) => {
149
+ setFocused(false);
150
+ onBlur?.(event);
151
+ };
152
+ const charCount = counterMaxLength != null && typeof currentValue === 'string'
153
+ ? currentValue.length
154
+ : null;
155
+ const resolvedLeadingContent = leadingContent !== undefined ? (leadingContent) : charCount != null && counterMaxLength != null ? (_jsxs(TextareaContent, { children: [charCount, "/", counterMaxLength] })) : null;
156
+ const showBottom = bottom && resolvedLeadingContent != null;
157
+ return (_jsx("div", { className: cn('flex flex-col gap-2', className), children: _jsxs("div", { className: "group relative w-full", children: [_jsxs("div", { className: cn('relative flex flex-col overflow-clip ld-transition', fieldSizeClasses[size], fieldVariantColorClasses[variant][color], disabled && 'opacity-40'), children: [_jsx("textarea", { ...props, ref: combinedRef, value: isControlled ? value : internalValue, onChange: handleChange, onCompositionEnd: handleCompositionEnd, onFocus: handleFocus, onBlur: handleBlur, disabled: disabled, readOnly: readOnly, rows: resize === 'fixed' || resize === 'manual' ? rows : undefined, maxLength: resolvedMaxLength, "aria-invalid": color === 'danger' || undefined, style: {
158
+ resize: resize === 'manual' ? 'vertical' : 'none',
159
+ overflowY: resize === 'fixed' || resize === 'manual' ? 'auto' : 'hidden',
160
+ ...style,
161
+ }, className: cn('w-full bg-transparent px-1 py-0 outline-none', textareaSizeClasses[size], 'placeholder:text-mono400', 'disabled:cursor-not-allowed disabled:text-mono400', 'read-only:cursor-default') }), showBottom && (_jsx("div", { className: "flex items-center gap-4", children: _jsx("div", { className: "flex flex-1 items-center gap-1 pl-1", children: resolvedLeadingContent }) }))] }), _jsx("div", { className: cn('pointer-events-none absolute inset-0 border transition-[border-color] duration-300 ease-out', interactionRadiusClasses[size], interactionVariantColorClasses[variant][color], focused && focusedColorClasses[color], disabled && 'opacity-0') })] }) }));
162
+ });
163
+ export default LDTextarea;
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import LDTimePicker from './LDTimePicker.js';
4
- import FormField from '../Form/FormField.js';
5
- import FormErrorMessage from '../Form/FormErrorMessage.js';
4
+ import FormField from '../LDForm/LDFormField.js';
5
+ import FormErrorMessage from '../LDForm/LDFormErrorMessage.js';
6
6
  import cn from '../../utils/cn.js';
7
7
  const FormTimePicker = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, disabled = false, block = false, ...props }) => {
8
8
  return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, children: ({ field, fieldState }) => (_jsxs("div", { className: cn('relative border-2 border-transparent', block ? 'w-full' : 'w-auto'), children: [_jsx(LDTimePicker, { ...props, block: block, value: field.value ?? '', onChange: (time) => {
@@ -80,19 +80,19 @@ const LDTimePicker = ({ value, defaultValue, onChange, placeholder = 'HH:MM', di
80
80
  return (_jsx("div", { className: cn(block ? 'w-full' : 'w-auto', className), children: _jsxs(PopoverBase.Root, { open: open, onOpenChange: setOpen, children: [_jsxs(PopoverBase.Trigger, { disabled: disabled, style: style, onClick: (e) => {
81
81
  if (isEditable)
82
82
  e.preventDefault();
83
- }, className: cn('border border-neutral10 h-[38px] w-full display14 px-4 rounded-[5px]', 'flex flex-row items-center justify-between gap-4', 'outline-2 outline-transparent ld-transition', disabled && 'cursor-not-allowed opacity-50', color === 'danger'
83
+ }, className: cn('border border-neutral100 h-[38px] w-full display14 px-4 rounded-[5px]', 'flex flex-row items-center justify-between gap-4', 'outline-2 outline-transparent ld-transition', disabled && 'cursor-not-allowed opacity-50', color === 'danger'
84
84
  ? 'bg-tintRed outline-red500'
85
85
  : 'focus:bg-tintBlue focus:outline-lb500', triggerClassName), children: [_jsx("input", { ref: inputRef, type: "text", value: resolved ?? '', onChange: handleInputChange, onBlur: handleInputBlur, onKeyDown: (e) => {
86
86
  if (e.key === 'ArrowDown') {
87
87
  e.preventDefault();
88
88
  setOpen(true);
89
89
  }
90
- }, placeholder: placeholder, "aria-label": "\uC2DC\uAC04 \uC785\uB825", disabled: disabled, readOnly: !isEditable, className: cn('flex-1 bg-transparent outline-none min-w-0', !resolved && 'text-neutral40', !isEditable && 'cursor-pointer') }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [_jsx("span", { "data-pencil-button": true, role: "button", tabIndex: 0, "aria-label": "\uC9C1\uC811 \uC785\uB825 \uBAA8\uB4DC \uC804\uD658", onClick: handlePencilClick, onKeyDown: (e) => {
90
+ }, placeholder: placeholder, "aria-label": "\uC2DC\uAC04 \uC785\uB825", disabled: disabled, readOnly: !isEditable, className: cn('flex-1 bg-transparent outline-none min-w-0', !resolved && 'text-neutral500', !isEditable && 'cursor-pointer') }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [_jsx("span", { "data-pencil-button": true, role: "button", tabIndex: 0, "aria-label": "\uC9C1\uC811 \uC785\uB825 \uBAA8\uB4DC \uC804\uD658", onClick: handlePencilClick, onKeyDown: (e) => {
91
91
  if (e.key === 'Enter' || e.key === ' ') {
92
92
  e.preventDefault();
93
93
  handlePencilClick(e);
94
94
  }
95
- }, className: cn('p-0 transition-colors cursor-pointer', isEditable ? 'text-lb500' : 'text-neutral40'), children: _jsx(LucideIcon, { name: "pencil", size: 15 }) }), _jsx(LucideIcon, { name: "clock", size: 15, className: "text-neutral40" })] })] }), _jsx(PopoverBase.Content, { className: "rounded-md border border-neutral-200 bg-white shadow-md p-0", style: { width: 'var(--radix-popover-trigger-width)' }, onOpenAutoFocus: (e) => {
95
+ }, className: cn('p-0 transition-colors cursor-pointer', isEditable ? 'text-lb500' : 'text-neutral500'), children: _jsx(LucideIcon, { name: "pencil", size: 15 }) }), _jsx(LucideIcon, { name: "clock", size: 15, className: "text-neutral500" })] })] }), _jsx(PopoverBase.Content, { className: "rounded-md border border-neutral-200 bg-white shadow-md p-0", style: { width: 'var(--radix-popover-trigger-width)' }, onOpenAutoFocus: (e) => {
96
96
  e.preventDefault();
97
97
  const targetTime = timeOptions.find((t) => t >= (resolved || '00:00')) ||
98
98
  timeOptions[0];
@@ -114,7 +114,7 @@ const LDTimePicker = ({ value, defaultValue, onChange, placeholder = 'HH:MM', di
114
114
  target.previousElementSibling?.focus();
115
115
  }
116
116
  }, className: cn('w-full text-left px-3 py-2 rounded-[5px] display14 transition-all cursor-pointer outline-none', 'hover:bg-lb50 hover:text-lb500', 'focus:bg-lb50 focus:text-lb500 focus:ring-1 focus:ring-inset focus:ring-lb500', resolved === time
117
- ? 'bg-neutral10 font-bold'
117
+ ? 'bg-neutral100 font-bold'
118
118
  : 'text-neutral800'), children: time }, time))) }) })] }) }));
119
119
  };
120
120
  export default LDTimePicker;
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import LDToggleButton from './LDToggleButton.js';
4
- import FormField from '../Form/FormField.js';
5
- import FormErrorMessage from '../Form/FormErrorMessage.js';
4
+ import FormField from '../LDForm/LDFormField.js';
5
+ import FormErrorMessage from '../LDForm/LDFormErrorMessage.js';
6
6
  const FormToggleButton = ({ name, options, customErrorMessage = '', isHiddenErrorMessage = false, errorClassName, disabled = false, ...props }) => {
7
7
  return (_jsx(FormField, { name: name, options: options, customErrorMessage: customErrorMessage, disabled: disabled, children: ({ field, fieldState }) => (_jsxs("div", { className: "relative", children: [_jsx(LDToggleButton, { ...props, checked: !!field.value, onCheckedChange: field.onChange, onBlur: field.onBlur, disabled: disabled, ref: field.ref, "aria-invalid": field['aria-invalid'], "aria-describedby": field['aria-describedby'] }), !isHiddenErrorMessage && (_jsx(FormErrorMessage, { id: fieldState.errorId, error: fieldState.error, disabled: disabled, className: errorClassName }))] })) }));
8
8
  };
@@ -30,7 +30,7 @@ const Trigger = ({ asChild, className, children }) => {
30
30
  return (_jsx(RadixTooltip.Trigger, { asChild: asChild, className: className, children: children }));
31
31
  };
32
32
  const Content = ({ side = 'top', sideOffset = 8, align = 'center', className, children, }) => {
33
- return (_jsx(RadixTooltip.Portal, { children: _jsx(RadixTooltip.Content, { side: side, sideOffset: sideOffset, align: align, className: cn('z-50 outline-hidden', 'animate-in fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0', className), children: children }) }));
33
+ return (_jsx(RadixTooltip.Portal, { children: _jsx(RadixTooltip.Content, { side: side, sideOffset: sideOffset, align: align, className: cn('z-50 outline-hidden', 'animate-fade-in data-[state=closed]:animate-fade-out', className), children: children }) }));
34
34
  };
35
35
  const Arrow = ({ className }) => {
36
36
  return _jsx(RadixTooltip.Arrow, { className: className });