@uniai-fe/uds-primitives 0.2.6 → 0.2.8

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.
package/dist/styles.css CHANGED
@@ -2743,6 +2743,10 @@ figure.chip {
2743
2743
  margin-bottom: var(--form-field-gap-y);
2744
2744
  }
2745
2745
 
2746
+ .form-field-required {
2747
+ color: var(--color-feedback-error);
2748
+ }
2749
+
2746
2750
  .form-field-label {
2747
2751
  display: flex;
2748
2752
  align-items: center;
@@ -2751,14 +2755,10 @@ figure.chip {
2751
2755
  font-weight: var(--form-field-label-font-weight);
2752
2756
  line-height: var(--form-field-label-line-height);
2753
2757
  }
2754
- .form-field-label span {
2758
+ .form-field-label span:not(.form-field-required) {
2755
2759
  color: var(--form-field-label-color);
2756
2760
  }
2757
2761
 
2758
- .form-field-required {
2759
- color: var(--color-feedback-error);
2760
- }
2761
-
2762
2762
  .form-field-body {
2763
2763
  display: flex;
2764
2764
  flex-wrap: wrap;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-primitives",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "UNIAI Design System; Primitives Components Package",
5
5
  "type": "module",
6
6
  "private": false,
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
 
3
3
  import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
4
+ import type { DropdownMenuProps } from "@radix-ui/react-dropdown-menu";
4
5
  import type { ReactNode } from "react";
5
6
 
6
- import type { DropdownRootProps } from "../../types/base";
7
7
  import { DropdownProvider } from "./Provider";
8
8
 
9
9
  /**
10
10
  * Dropdown root; Provider와 Radix Root를 래핑한다.
11
11
  * @component
12
- * @param {DropdownRootProps} props Dropdown Root props
12
+ * @param {DropdownMenuProps} props Dropdown Root props
13
13
  * @param {ReactNode} props.children Dropdown 하위 node
14
14
  * @param {boolean} [props.modal=false] Radix modal 모드
15
15
  */
@@ -17,7 +17,7 @@ const DropdownRoot = ({
17
17
  children,
18
18
  modal = false,
19
19
  ...rootProps
20
- }: DropdownRootProps & { children: ReactNode }) => {
20
+ }: DropdownMenuProps & { children: ReactNode }) => {
21
21
  return (
22
22
  <DropdownProvider>
23
23
  <DropdownMenu.Root modal={modal} {...rootProps}>
@@ -1,19 +1,19 @@
1
1
  "use client";
2
2
 
3
3
  import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
4
+ import type { DropdownMenuTriggerProps } from "@radix-ui/react-dropdown-menu";
4
5
  import { forwardRef } from "react";
5
6
 
6
- import type { DropdownTriggerProps } from "../../types/props";
7
7
  import { mergeRefs } from "../../utils";
8
8
  import { useDropdownContext } from "./Provider";
9
9
 
10
10
  /**
11
11
  * Dropdown trigger; trigger ref를 context에 공유한다.
12
12
  * @component
13
- * @param {DropdownTriggerProps} props Dropdown trigger props
13
+ * @param {DropdownMenuTriggerProps} props Dropdown trigger props
14
14
  * @param {boolean} [props.asChild=true] asChild 패턴 유지 여부
15
15
  */
16
- const DropdownTrigger = forwardRef<HTMLElement, DropdownTriggerProps>(
16
+ const DropdownTrigger = forwardRef<HTMLElement, DropdownMenuTriggerProps>(
17
17
  ({ asChild = true, children, ...rest }, ref) => {
18
18
  const { triggerRef } = useDropdownContext("Dropdown.Trigger");
19
19
 
@@ -1,5 +1,3 @@
1
- import type { DropdownMenuProps } from "@radix-ui/react-dropdown-menu";
2
-
3
1
  /**
4
2
  * Dropdown size scale
5
3
  * @typedef {"small" | "medium" | "large"} DropdownSize
@@ -18,14 +16,3 @@ export type DropdownPanelWidth =
18
16
  | "max-content"
19
17
  | string
20
18
  | number;
21
-
22
- /**
23
- * Dropdown root props
24
- * @property {boolean} [modal] Radix modal 모드 여부
25
- */
26
- export interface DropdownRootProps extends DropdownMenuProps {
27
- /**
28
- * Radix modal 모드 여부
29
- */
30
- modal?: DropdownMenuProps["modal"];
31
- }
@@ -1,22 +1,12 @@
1
1
  import type {
2
+ DropdownMenuProps,
2
3
  DropdownMenuContentProps,
3
4
  DropdownMenuItemProps as RadixDropdownMenuItemProps,
4
- DropdownMenuTriggerProps,
5
5
  } from "@radix-ui/react-dropdown-menu";
6
6
  import type { HTMLAttributes, MutableRefObject, ReactNode } from "react";
7
7
 
8
8
  import type { CheckboxProps } from "../../checkbox/types";
9
- import type {
10
- DropdownPanelWidth,
11
- DropdownRootProps,
12
- DropdownSize,
13
- } from "./base";
14
-
15
- /**
16
- * Dropdown trigger props
17
- * @property {boolean} [asChild=true] trigger를 asChild 패턴으로 감쌀지 여부
18
- */
19
- export type DropdownTriggerProps = DropdownMenuTriggerProps;
9
+ import type { DropdownPanelWidth, DropdownSize } from "./base";
20
10
 
21
11
  /**
22
12
  * Dropdown Container props
@@ -142,9 +132,10 @@ export interface DropdownTemplateItem {
142
132
  * @property {ReactNode} trigger trigger 요소
143
133
  * @property {DropdownTemplateItem[]} items 렌더링할 menu item 리스트
144
134
  * @property {string[]} [selectedIds] 선택된 item id 배열
135
+ * @property {(item: DropdownTemplateItem) => void} [onSelect] item 선택 콜백
145
136
  * @property {DropdownSize} [size="medium"] surface height scale
146
137
  * @property {DropdownPanelWidth} [width="match"] panel width 옵션
147
- * @property {DropdownRootProps} [rootProps] Root 에 전달할 props
138
+ * @property {DropdownMenuProps} [rootProps] Root 에 전달할 props
148
139
  * @property {DropdownContainerProps} [containerProps] Container 에 전달할 props
149
140
  * @property {DropdownMenuListProps} [menuListProps] MenuList 에 전달할 props
150
141
  */
@@ -157,8 +148,9 @@ export interface DropdownTemplateProps {
157
148
  width?: DropdownPanelWidth;
158
149
  /**
159
150
  * Root 에 전달할 props
151
+ * - 타입 출처를 명확히 하기 위해 Radix 원본 타입을 직접 사용한다.
160
152
  */
161
- rootProps?: DropdownRootProps;
153
+ rootProps?: DropdownMenuProps;
162
154
  /**
163
155
  * Container 에 전달할 props
164
156
  */
@@ -32,6 +32,10 @@
32
32
  margin-bottom: var(--form-field-gap-y);
33
33
  }
34
34
 
35
+ .form-field-required {
36
+ color: var(--color-feedback-error);
37
+ }
38
+
35
39
  .form-field-label {
36
40
  display: flex;
37
41
  align-items: center;
@@ -40,15 +44,11 @@
40
44
  font-size: var(--form-field-label-font-size);
41
45
  font-weight: var(--form-field-label-font-weight);
42
46
  line-height: var(--form-field-label-line-height);
43
- span {
47
+ span:not(.form-field-required) {
44
48
  color: var(--form-field-label-color);
45
49
  }
46
50
  }
47
51
 
48
- .form-field-required {
49
- color: var(--color-feedback-error);
50
- }
51
-
52
52
  .form-field-body {
53
53
  display: flex;
54
54
  flex-wrap: wrap;
@@ -8,10 +8,8 @@ import { Dropdown } from "../../dropdown/markup";
8
8
  import { SelectTriggerBase, SelectTriggerSelected } from "./foundation";
9
9
  import Container from "./foundation/Container";
10
10
  import { useSelectDropdownOpenState } from "../hooks";
11
- import type {
12
- SelectDefaultComponentProps,
13
- SelectDropdownOption,
14
- } from "../types/props";
11
+ import type { SelectDropdownOption } from "../types/option";
12
+ import type { SelectDefaultComponentProps } from "../types/props";
15
13
 
16
14
  /**
17
15
  * Select default trigger; 단일 선택 드롭다운을 렌더링한다.
@@ -1,13 +1,87 @@
1
1
  import type { ReactNode } from "react";
2
2
 
3
3
  /**
4
- * Select option 타입
4
+ * Select option value 타입
5
5
  * @typedef {string | number} SelectOptionValue
6
6
  */
7
7
  export type SelectOptionValue = string | number;
8
8
 
9
9
  /**
10
- * Select option 데이터 구조; legacy SelectDataType과 호환되는 구조다.
10
+ * Select option data; form 상태와 직결되는 데이터 계약
11
+ * @property {string} id 렌더링/선택 추적용 고유 id
12
+ * @property {SelectOptionValue} value 실제 form value
13
+ * @property {ReactNode} label 사용자 노출 라벨
14
+ * @property {boolean} [disabled] 비활성 여부
15
+ * @property {OptionData} [data] 추가 데이터 payload
16
+ */
17
+ export interface SelectOptionData<OptionData = unknown> {
18
+ /**
19
+ * 렌더링/선택 추적용 고유 id
20
+ */
21
+ id: string;
22
+ /**
23
+ * 실제 form value
24
+ */
25
+ value: SelectOptionValue;
26
+ /**
27
+ * 사용자 노출 라벨
28
+ */
29
+ label: ReactNode;
30
+ /**
31
+ * 비활성 여부
32
+ */
33
+ disabled?: boolean;
34
+ /**
35
+ * 추가 데이터 payload
36
+ */
37
+ data?: OptionData;
38
+ }
39
+
40
+ /**
41
+ * Select option render data; Dropdown.Menu.Item 렌더링 보조 정보
42
+ * @property {ReactNode} [description] 보조 텍스트
43
+ * @property {ReactNode} [left] 좌측 콘텐츠
44
+ * @property {ReactNode} [right] 우측 콘텐츠
45
+ * @property {boolean} [multiple] multi select 스타일 여부
46
+ */
47
+ export interface SelectOptionRenderData {
48
+ /**
49
+ * 보조 텍스트
50
+ */
51
+ description?: ReactNode;
52
+ /**
53
+ * 좌측 콘텐츠
54
+ */
55
+ left?: ReactNode;
56
+ /**
57
+ * 우측 콘텐츠
58
+ */
59
+ right?: ReactNode;
60
+ /**
61
+ * multi select 스타일 여부
62
+ */
63
+ multiple?: boolean;
64
+ }
65
+
66
+ /**
67
+ * Select dropdown option; data 계약과 render 계약을 합쳐 Select 입력 모델을 구성한다.
68
+ * @extends SelectOptionData
69
+ * @extends SelectOptionRenderData
70
+ * @property {string} id 렌더링/선택 추적용 고유 id
71
+ * @property {SelectOptionValue} value 실제 form value
72
+ * @property {ReactNode} label 사용자 노출 라벨
73
+ * @property {boolean} [disabled] 비활성 여부
74
+ * @property {OptionData} [data] 추가 데이터 payload
75
+ * @property {ReactNode} [description] 보조 텍스트
76
+ * @property {ReactNode} [left] 좌측 콘텐츠
77
+ * @property {ReactNode} [right] 우측 콘텐츠
78
+ * @property {boolean} [multiple] multi select 스타일 여부
79
+ */
80
+ export interface SelectDropdownOption<OptionData = unknown>
81
+ extends SelectOptionData<OptionData>, SelectOptionRenderData {}
82
+
83
+ /**
84
+ * Select legacy option 데이터 구조; 과거 key/optionName 스키마 호환을 위해 유지한다.
11
85
  * @property {string} key 렌더링 키
12
86
  * @property {SelectOptionValue} value 실제 값
13
87
  * @property {ReactNode} optionName 사용자 노출 라벨
@@ -15,7 +89,7 @@ export type SelectOptionValue = string | number;
15
89
  * @property {boolean} [disabled] 비활성 여부
16
90
  * @property {OptionData} [data] 추가 데이터 payload
17
91
  */
18
- export interface SelectOption<OptionData = unknown> {
92
+ export interface SelectLegacyOption<OptionData = unknown> {
19
93
  /**
20
94
  * 렌더링 키
21
95
  */
@@ -1,14 +1,14 @@
1
1
  import type { HTMLAttributes, ReactNode } from "react";
2
+ import type { DropdownMenuProps } from "@radix-ui/react-dropdown-menu";
2
3
 
3
4
  import type {
4
5
  DropdownContainerProps,
5
6
  DropdownMenuListProps,
6
7
  DropdownPanelWidth,
7
- DropdownRootProps,
8
- DropdownTemplateItem,
9
8
  } from "../../dropdown/types";
10
9
  import type { FormFieldWidth } from "../../form/types";
11
10
  import type { SelectPriority, SelectSize, SelectState } from "./base";
11
+ import type { SelectDropdownOption } from "./option";
12
12
  import type {
13
13
  SelectTriggerDefaultProps,
14
14
  SelectTriggerMultipleProps,
@@ -116,18 +116,22 @@ export interface SelectWidthOption {
116
116
  /**
117
117
  * Select root props
118
118
  * @typedef {SelectStyleOptions & SelectValueOptions & SelectComponentState} SelectProps
119
+ * @property {SelectPriority} [priority] priority scale
120
+ * @property {SelectSize} [size] size scale
121
+ * @property {SelectState} [state] visual state
122
+ * @property {boolean} [block] block 여부
123
+ * @property {ReactNode} [displayLabel] 선택된 라벨
124
+ * @property {ReactNode} [placeholder] placeholder 텍스트
125
+ * @property {ReactNode[]} [tags] multi select 태그 리스트
126
+ * @property {boolean} [multiple] multi select 여부
127
+ * @property {boolean} [isOpen] dropdown open 여부
128
+ * @property {FormFieldWidth} [width] width preset 옵션
119
129
  */
120
130
  export type SelectProps = SelectStyleOptions &
121
131
  SelectValueOptions &
122
132
  SelectComponentState &
123
133
  SelectWidthOption;
124
134
 
125
- /**
126
- * Select dropdown option; Dropdown.Template item 계약을 그대로 따른다.
127
- * @extends DropdownTemplateItem
128
- */
129
- export interface SelectDropdownOption extends DropdownTemplateItem {}
130
-
131
135
  /**
132
136
  * Select dropdown 옵션 구성 props
133
137
  * @property {SelectDropdownOption[]} [options] dropdown option 리스트
@@ -135,7 +139,7 @@ export interface SelectDropdownOption extends DropdownTemplateItem {}
135
139
  * @property {(option: SelectDropdownOption) => void} [onOptionSelect] option 선택 콜백
136
140
  * @property {SelectSize} [dropdownSize] dropdown surface size 스케일
137
141
  * @property {DropdownPanelWidth} [dropdownWidth="match"] dropdown panel width 옵션
138
- * @property {DropdownRootProps} [dropdownRootProps] Dropdown.Root 전달 props(제어 props 제외)
142
+ * @property {DropdownMenuProps} [dropdownRootProps] Dropdown.Root 전달 props(제어 props 제외)
139
143
  * @property {DropdownContainerProps} [dropdownContainerProps] Dropdown.Container 전달 props(children/size 제외)
140
144
  * @property {DropdownMenuListProps} [dropdownMenuListProps] Dropdown.Menu.List 전달 props
141
145
  */
@@ -162,9 +166,10 @@ export interface SelectDropdownConfigProps {
162
166
  dropdownWidth?: DropdownPanelWidth;
163
167
  /**
164
168
  * Dropdown.Root 전달 props(제어 props 제외)
169
+ * - 타입 출처를 명확히 하기 위해 Radix 원본 타입을 직접 사용한다.
165
170
  */
166
171
  dropdownRootProps?: Omit<
167
- DropdownRootProps,
172
+ DropdownMenuProps,
168
173
  "open" | "defaultOpen" | "onOpenChange"
169
174
  >;
170
175
  /**
@@ -203,26 +208,60 @@ export interface SelectDropdownBehaviorProps {
203
208
 
204
209
  /**
205
210
  * Select.Default 컴포넌트 props
206
- * @extends SelectTriggerDefaultProps
207
- * @extends SelectDropdownConfigProps
208
- * @extends SelectDropdownBehaviorProps
211
+ * @typedef {SelectTriggerDefaultProps & SelectDropdownConfigProps & SelectDropdownBehaviorProps & SelectWidthOption} SelectDefaultComponentProps
212
+ * @property {ReactNode} [displayLabel] 선택된 라벨
213
+ * @property {ReactNode} [placeholder] placeholder 텍스트
214
+ * @property {SelectPriority} [priority] priority scale
215
+ * @property {SelectSize} [size] size scale
216
+ * @property {SelectState} [state] visual state
217
+ * @property {boolean} [block] block 여부
218
+ * @property {boolean} [isOpen] dropdown open 여부
219
+ * @property {boolean} [disabled] disabled 여부
220
+ * @property {SelectTriggerButtonType} [buttonType] button type
221
+ * @property {FormFieldWidth} [width] width preset 옵션
222
+ * @property {SelectDropdownOption[]} [options] dropdown option 리스트
223
+ * @property {string[]} [selectedOptionIds] 선택된 option id 리스트
224
+ * @property {(option: SelectDropdownOption) => void} [onOptionSelect] option 선택 콜백
225
+ * @property {SelectSize} [dropdownSize] dropdown surface size 스케일
226
+ * @property {DropdownPanelWidth} [dropdownWidth="match"] dropdown panel width 옵션
227
+ * @property {Omit<DropdownMenuProps, "open" | "defaultOpen" | "onOpenChange">} [dropdownRootProps] Dropdown.Root 전달 props
228
+ * @property {Omit<DropdownContainerProps, "children" | "size" | "width">} [dropdownContainerProps] Dropdown.Container 전달 props
229
+ * @property {DropdownMenuListProps} [dropdownMenuListProps] Dropdown.Menu.List 전달 props
230
+ * @property {boolean} [open] dropdown open 상태
231
+ * @property {boolean} [defaultOpen] uncontrolled 초기 open 상태
232
+ * @property {(open: boolean) => void} [onOpenChange] open state change 콜백
209
233
  */
210
- export interface SelectDefaultComponentProps
211
- extends
212
- SelectTriggerDefaultProps,
213
- SelectDropdownConfigProps,
214
- SelectDropdownBehaviorProps,
215
- SelectWidthOption {}
234
+ export type SelectDefaultComponentProps = SelectTriggerDefaultProps &
235
+ SelectDropdownConfigProps &
236
+ SelectDropdownBehaviorProps &
237
+ SelectWidthOption;
216
238
 
217
239
  /**
218
240
  * Select.Multiple 컴포넌트 props
219
- * @extends SelectTriggerMultipleProps
220
- * @extends SelectDropdownConfigProps
221
- * @extends SelectDropdownBehaviorProps
241
+ * @typedef {SelectTriggerMultipleProps & SelectDropdownConfigProps & SelectDropdownBehaviorProps & SelectWidthOption} SelectMultipleComponentProps
242
+ * @property {ReactNode} [displayLabel] 선택된 라벨
243
+ * @property {ReactNode} [placeholder] placeholder 텍스트
244
+ * @property {SelectMultipleTag[]} [tags] multi select tag 리스트
245
+ * @property {SelectPriority} [priority] priority scale
246
+ * @property {SelectSize} [size] size scale
247
+ * @property {SelectState} [state] visual state
248
+ * @property {boolean} [block] block 여부
249
+ * @property {boolean} [isOpen] dropdown open 여부
250
+ * @property {boolean} [disabled] disabled 여부
251
+ * @property {FormFieldWidth} [width] width preset 옵션
252
+ * @property {SelectDropdownOption[]} [options] dropdown option 리스트
253
+ * @property {string[]} [selectedOptionIds] 선택된 option id 리스트
254
+ * @property {(option: SelectDropdownOption) => void} [onOptionSelect] option 선택 콜백
255
+ * @property {SelectSize} [dropdownSize] dropdown surface size 스케일
256
+ * @property {DropdownPanelWidth} [dropdownWidth="match"] dropdown panel width 옵션
257
+ * @property {Omit<DropdownMenuProps, "open" | "defaultOpen" | "onOpenChange">} [dropdownRootProps] Dropdown.Root 전달 props
258
+ * @property {Omit<DropdownContainerProps, "children" | "size" | "width">} [dropdownContainerProps] Dropdown.Container 전달 props
259
+ * @property {DropdownMenuListProps} [dropdownMenuListProps] Dropdown.Menu.List 전달 props
260
+ * @property {boolean} [open] dropdown open 상태
261
+ * @property {boolean} [defaultOpen] uncontrolled 초기 open 상태
262
+ * @property {(open: boolean) => void} [onOpenChange] open state change 콜백
222
263
  */
223
- export interface SelectMultipleComponentProps
224
- extends
225
- SelectTriggerMultipleProps,
226
- SelectDropdownConfigProps,
227
- SelectDropdownBehaviorProps,
228
- SelectWidthOption {}
264
+ export type SelectMultipleComponentProps = SelectTriggerMultipleProps &
265
+ SelectDropdownConfigProps &
266
+ SelectDropdownBehaviorProps &
267
+ SelectWidthOption;