@uniai-fe/uds-primitives 0.3.19 → 0.3.21

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.
@@ -7,12 +7,12 @@
7
7
  min-width: 0;
8
8
  }
9
9
 
10
- .select[data-width="auto"] {
10
+ .select:where([data-width="auto"]) {
11
11
  --select-width: auto;
12
12
  --select-flex: 0 1 auto;
13
13
  }
14
14
 
15
- .select[data-width="fill"] {
15
+ .select:where([data-width="fill"]) {
16
16
  --select-width: auto;
17
17
  --select-flex: 1 1 0%;
18
18
  }
@@ -23,12 +23,12 @@
23
23
  --select-flex: 0 0 100%;
24
24
  }
25
25
 
26
- .select[data-width="fit"] {
26
+ .select:where([data-width="fit"]) {
27
27
  --select-width: fit-content;
28
28
  --select-flex: 0 0 auto;
29
29
  }
30
30
 
31
- .select[data-width="custom"] {
31
+ .select:where([data-width="custom"]) {
32
32
  --select-flex: 0 0 auto;
33
33
  }
34
34
 
@@ -52,23 +52,34 @@
52
52
  color 150ms ease;
53
53
  text-align: left;
54
54
 
55
- &[data-size="small"] {
55
+ &:where([data-size="small"]) {
56
56
  min-height: var(--select-primary-height-small);
57
57
  border-radius: var(--select-primary-radius-small);
58
58
  }
59
59
 
60
- &[data-size="large"] {
60
+ &:where([data-size="xsmall"]) {
61
+ // 변경: xsmall은 primary 전용 trigger spacing/height 스펙을 적용한다.
62
+ min-height: var(--select-primary-height-xsmall);
63
+ border-radius: var(--select-primary-radius-xsmall);
64
+ gap: var(--select-primary-gap-inline-xsmall);
65
+ padding: var(--select-primary-padding-block-xsmall)
66
+ var(--select-primary-padding-inline-end-xsmall)
67
+ var(--select-primary-padding-block-xsmall)
68
+ var(--select-primary-padding-inline-start-xsmall);
69
+ }
70
+
71
+ &:where([data-size="large"]) {
61
72
  min-height: var(--select-primary-height-large);
62
73
  border-radius: var(--select-primary-radius-large);
63
74
  }
64
75
 
65
- &[data-multiple="true"] {
76
+ &:where([data-multiple="true"]) {
66
77
  align-items: center;
67
78
  flex-wrap: nowrap;
68
79
  overflow: hidden;
69
80
  }
70
81
 
71
- &[data-priority="secondary"] {
82
+ &:where([data-priority="secondary"]) {
72
83
  width: fit-content;
73
84
  max-width: 100%;
74
85
  min-height: auto;
@@ -84,16 +95,17 @@
84
95
  background-color 150ms ease,
85
96
  color 150ms ease;
86
97
 
87
- &:hover:not([data-state="disabled"]) {
98
+ &:where(:hover):where(:not([data-state="disabled"])) {
88
99
  background-color: var(--select-color-surface-secondary-hover);
89
100
  }
90
101
 
91
- &:active:not([data-state="disabled"]) {
102
+ &:where(:active):where(:not([data-state="disabled"])) {
92
103
  background-color: var(--select-color-surface-secondary-active);
93
104
  }
94
105
 
95
- &[data-state="focused"],
96
- &[data-open="true"] {
106
+ &:where([data-state="focused"]),
107
+ &:where([data-open="true"]),
108
+ &:where(:focus-within) {
97
109
  background-color: var(--select-color-surface-secondary-hover);
98
110
 
99
111
  &::after {
@@ -102,14 +114,14 @@
102
114
  }
103
115
  }
104
116
 
105
- &[data-state="disabled"],
106
- &:disabled {
117
+ &:where([data-state="disabled"]),
118
+ &:where(:disabled) {
107
119
  color: var(--select-secondary-color-text-disabled);
108
120
  cursor: not-allowed;
109
121
  }
110
122
  }
111
123
 
112
- &[data-priority="table"] {
124
+ &:where([data-priority="table"]) {
113
125
  // 변경: table priority는 input table과 동일하게 기본 border/background를 최소화한다.
114
126
  border-radius: var(--select-table-radius);
115
127
  border-color: var(--select-table-border-default-color);
@@ -117,47 +129,49 @@
117
129
  --select-icon-fill: var(--select-table-icon-color-default);
118
130
  }
119
131
 
120
- &:not([data-priority="secondary"])[data-state="focused"],
121
- &:not([data-priority="secondary"])[data-open="true"],
122
- &:not([data-priority="secondary"]):focus-visible {
132
+ &:where(:not([data-priority="secondary"])):where([data-state="focused"]),
133
+ &:where(:not([data-priority="secondary"])):where([data-open="true"]),
134
+ &:where(:not([data-priority="secondary"])):focus-visible,
135
+ &:where(:not([data-priority="secondary"])):focus-within {
123
136
  border-color: var(--select-primary-color-border-focused);
124
137
  border-width: var(--select-primary-border-width-focus);
125
138
  --select-icon-fill: var(--select-icon-color-focused);
126
139
  }
127
140
 
128
- &[data-priority="table"][data-state="focused"],
129
- &[data-priority="table"][data-open="true"],
130
- &[data-priority="table"]:focus-visible {
141
+ &:where([data-priority="table"]):where([data-state="focused"]),
142
+ &:where([data-priority="table"]):where([data-open="true"]),
143
+ &:where([data-priority="table"]):focus-visible,
144
+ &:where([data-priority="table"]):focus-within {
131
145
  border-color: var(--select-table-border-focus-color);
132
146
  border-width: var(--select-primary-border-width-focus);
133
147
  --select-icon-fill: var(--select-table-icon-color-focused);
134
148
  }
135
149
 
136
- &:not([data-priority="secondary"])[data-state="error"] {
150
+ &:where(:not([data-priority="secondary"])):where([data-state="error"]) {
137
151
  border-color: var(--select-primary-color-border-error);
138
152
  --select-icon-fill: var(--select-icon-color-default);
139
153
  }
140
154
 
141
- &[data-priority="secondary"][data-state="error"] {
155
+ &:where([data-priority="secondary"]):where([data-state="error"]) {
142
156
  &::after {
143
157
  height: var(--select-secondary-underline-width-focus);
144
158
  background-color: var(--select-color-border-secondary-error);
145
159
  }
146
160
  }
147
161
 
148
- &[data-priority="table"][data-state="error"] {
162
+ &:where([data-priority="table"]):where([data-state="error"]) {
149
163
  border-color: var(--select-table-border-error-color);
150
164
  --select-icon-fill: var(--select-table-icon-color-default);
151
165
  }
152
166
 
153
- &:not([data-priority="secondary"])[data-readonly="true"] {
167
+ &:where(:not([data-priority="secondary"])):where([data-readonly="true"]) {
154
168
  border-color: var(--select-primary-color-border-disabled);
155
169
  background-color: var(--select-primary-color-surface-disabled);
156
170
  cursor: default;
157
171
  --select-icon-fill: var(--select-icon-color-disabled);
158
172
  }
159
173
 
160
- &[data-priority="secondary"][data-readonly="true"] {
174
+ &:where([data-priority="secondary"]):where([data-readonly="true"]) {
161
175
  border-color: transparent;
162
176
  background-color: var(--select-color-surface-secondary-disabled);
163
177
  cursor: default;
@@ -168,7 +182,7 @@
168
182
  }
169
183
  }
170
184
 
171
- &[data-priority="table"][data-readonly="true"] {
185
+ &:where([data-priority="table"]):where([data-readonly="true"]) {
172
186
  border-color: var(--select-table-border-readonly-color);
173
187
  background-color: var(--select-table-surface-readonly-color);
174
188
  cursor: not-allowed;
@@ -178,16 +192,16 @@
178
192
  // &:not([data-priority="secondary"]):hover:not(:disabled) {
179
193
  // }
180
194
 
181
- &:not([data-priority="secondary"])[data-state="disabled"],
182
- &:not([data-priority="secondary"]):disabled {
195
+ &:where(:not([data-priority="secondary"])):where([data-state="disabled"]),
196
+ &:where(:not([data-priority="secondary"])):disabled {
183
197
  border-color: var(--select-primary-color-border-disabled);
184
198
  background-color: var(--select-primary-color-surface-disabled);
185
199
  cursor: not-allowed;
186
200
  --select-icon-fill: var(--select-icon-color-disabled);
187
201
  }
188
202
 
189
- &[data-priority="secondary"][data-state="disabled"],
190
- &[data-priority="secondary"]:disabled {
203
+ &:where([data-priority="secondary"]):where([data-state="disabled"]),
204
+ &:where([data-priority="secondary"]):disabled {
191
205
  border-color: transparent;
192
206
  background-color: var(--select-color-surface-secondary-disabled);
193
207
 
@@ -197,8 +211,8 @@
197
211
  }
198
212
  }
199
213
 
200
- &[data-priority="table"][data-state="disabled"],
201
- &[data-priority="table"]:disabled {
214
+ &:where([data-priority="table"]):where([data-state="disabled"]),
215
+ &:where([data-priority="table"]):disabled {
202
216
  border-color: var(--select-table-border-disabled-color);
203
217
  background-color: var(--select-table-surface-disabled-color);
204
218
  cursor: not-allowed;
@@ -214,124 +228,161 @@
214
228
  gap: var(--select-value-gap);
215
229
  }
216
230
 
217
- .select-label {
218
- flex: 1 1 auto;
231
+ .select-input-label {
232
+ width: 100%;
219
233
  min-width: 0;
234
+ border: none;
235
+ background: transparent;
236
+ outline: none;
237
+ box-shadow: none;
220
238
  font-family: var(--select-text-font-family);
221
239
  font-size: var(--select-text-medium-size);
222
240
  font-weight: var(--select-text-medium-weight);
223
241
  line-height: var(--select-text-medium-line-height);
224
242
  letter-spacing: var(--select-text-medium-letter-spacing);
225
243
  color: var(--select-primary-color-text);
226
- overflow: hidden;
227
- text-overflow: ellipsis;
228
- white-space: nowrap;
244
+ caret-color: var(--select-primary-color-text);
245
+ cursor: default;
229
246
 
230
- .select-button[data-priority="secondary"] & {
231
- color: var(--select-secondary-color-text);
247
+ // 변경: custom mode(편집 가능 상태)에서만 text cursor를 사용한다.
248
+ &:where(:not([readonly])) {
249
+ cursor: text;
232
250
  }
233
251
 
234
- .select-button[data-priority="table"] & {
235
- color: var(--select-table-color-text);
252
+ &::placeholder {
253
+ color: var(--select-primary-color-placeholder);
236
254
  }
237
255
 
238
- .select-button[data-priority="table"][data-readonly="true"] & {
239
- color: var(--select-table-color-text-readonly);
256
+ .select-button:where([data-priority="secondary"]) & {
257
+ color: var(--select-secondary-color-text);
258
+ caret-color: var(--select-secondary-color-text);
240
259
  }
241
260
 
242
- .select-button[data-state="focused"] &,
243
- .select-button[data-open="true"] & {
244
- color: var(--select-primary-color-text-focused);
261
+ .select-button:where([data-priority="table"]) & {
262
+ color: var(--select-table-color-text);
263
+ caret-color: var(--select-table-color-text);
245
264
  }
246
265
 
247
- .select-button[data-state="disabled"] & {
266
+ .select-button:where([data-state="disabled"]) & {
248
267
  color: var(--select-primary-color-text-disabled);
268
+ caret-color: var(--select-primary-color-text-disabled);
249
269
  }
250
270
 
251
- .select-button[data-readonly="true"] & {
271
+ .select-button:where([data-readonly="true"]) & {
252
272
  color: var(--select-primary-color-text-readonly);
273
+ caret-color: var(--select-primary-color-text-readonly);
274
+ }
275
+ // 변경: legacy label 텍스트 색상 규칙을 input 렌더 구조로 이관한다.
276
+ .select-button:where([data-state="focused"]) &,
277
+ .select-button:where(:focus-within) & {
278
+ color: var(--color-label-strong);
253
279
  }
254
280
 
255
- .select-button[data-priority="secondary"][data-state="disabled"] & {
281
+ .select-button:where([data-priority="secondary"]):where(
282
+ [data-state="disabled"]
283
+ )
284
+ & {
256
285
  color: var(--select-secondary-color-text-disabled);
257
286
  }
258
287
 
259
- .select-button[data-priority="secondary"][data-readonly="true"] & {
288
+ .select-button:where([data-priority="secondary"]):where(
289
+ [data-readonly="true"]
290
+ )
291
+ & {
260
292
  color: var(--select-secondary-color-text-readonly);
261
293
  }
262
294
  }
263
295
 
264
- .select-label-placeholder {
296
+ .select-input-label-placeholder {
265
297
  color: var(--select-primary-color-placeholder);
266
298
 
267
- .select-button[data-priority="secondary"] & {
299
+ .select-button:where([data-priority="secondary"]) & {
268
300
  color: var(--select-secondary-color-placeholder);
269
301
  }
270
302
 
271
- .select-button[data-priority="table"] & {
303
+ .select-button:where([data-priority="table"]) & {
272
304
  color: var(--select-table-color-placeholder);
273
305
  }
274
306
 
275
307
  // 변경: disabled/readonly placeholder 색상을 상태 토큰으로 분리한다.
276
- .select-button[data-state="disabled"] & {
308
+ .select-button:where([data-state="disabled"]) & {
277
309
  color: var(--select-primary-color-placeholder-disabled);
278
310
  }
279
311
 
280
- .select-button[data-readonly="true"] & {
312
+ .select-button:where([data-readonly="true"]) & {
281
313
  color: var(--select-primary-color-placeholder-readonly);
282
314
  }
283
315
 
284
- .select-button[data-priority="secondary"][data-state="disabled"] & {
316
+ .select-button:where([data-priority="secondary"]):where(
317
+ [data-state="disabled"]
318
+ )
319
+ & {
285
320
  color: var(--select-secondary-color-placeholder-disabled);
286
321
  }
287
322
 
288
- .select-button[data-priority="secondary"][data-readonly="true"] & {
323
+ .select-button:where([data-priority="secondary"]):where(
324
+ [data-readonly="true"]
325
+ )
326
+ & {
289
327
  color: var(--select-secondary-color-placeholder-readonly);
290
328
  }
291
329
 
292
- .select-button[data-priority="table"][data-state="disabled"] & {
330
+ .select-button:where([data-priority="table"]):where([data-state="disabled"])
331
+ & {
293
332
  color: var(--select-table-color-placeholder-disabled);
294
333
  }
295
334
 
296
- .select-button[data-priority="table"][data-readonly="true"] & {
335
+ .select-button:where([data-priority="table"]):where([data-readonly="true"])
336
+ & {
297
337
  color: var(--select-table-color-placeholder-readonly);
298
338
  }
299
339
  }
300
340
 
301
- .select-button[data-size="small"] .select-label {
341
+ .select-button:where([data-size="small"]) :where(.select-input-label) {
302
342
  font-size: var(--select-text-small-size);
303
343
  line-height: var(--select-text-small-line-height);
304
344
  letter-spacing: var(--select-text-small-letter-spacing);
305
345
  font-weight: var(--select-text-small-weight);
306
346
  }
307
347
 
308
- .select-button[data-priority="table"][data-size="small"] .select-label {
348
+ .select-button:where([data-size="xsmall"]) :where(.select-input-label) {
349
+ font-size: var(--select-text-xsmall-size);
350
+ line-height: var(--select-text-xsmall-line-height);
351
+ letter-spacing: var(--select-text-xsmall-letter-spacing);
352
+ font-weight: var(--select-text-xsmall-weight);
353
+ }
354
+
355
+ .select-button:where([data-priority="table"]):where([data-size="small"])
356
+ :where(.select-input-label) {
309
357
  font-size: var(--select-table-text-small-size);
310
358
  line-height: var(--select-table-text-small-line-height);
311
359
  font-weight: var(--select-table-text-small-weight);
312
360
  }
313
361
 
314
- .select-button[data-size="large"] .select-label {
362
+ .select-button:where([data-size="large"]) :where(.select-input-label) {
315
363
  font-size: var(--select-text-large-size);
316
364
  line-height: var(--select-text-large-line-height);
317
365
  letter-spacing: var(--select-text-large-letter-spacing);
318
366
  font-weight: var(--select-text-large-weight);
319
367
  }
320
368
 
321
- .select-button[data-priority="table"][data-size="medium"] .select-label {
369
+ .select-button:where([data-priority="table"]):where([data-size="medium"])
370
+ :where(.select-input-label) {
322
371
  font-size: var(--select-table-text-medium-size);
323
372
  line-height: var(--select-table-text-medium-line-height);
324
373
  font-weight: var(--select-table-text-medium-weight);
325
374
  }
326
375
 
327
- .select-button[data-priority="table"][data-size="large"] .select-label {
376
+ .select-button:where([data-priority="table"]):where([data-size="large"])
377
+ :where(.select-input-label) {
328
378
  font-size: var(--select-table-text-large-size);
329
379
  line-height: var(--select-table-text-large-line-height);
330
380
  font-weight: var(--select-table-text-large-weight);
331
381
  }
332
382
 
333
- .select-button[data-priority="secondary"][data-size="large"] .select-label {
334
- --select-text-large-weight: 600;
383
+ .select-button:where([data-priority="secondary"]):where([data-size="large"])
384
+ :where(.select-input-label) {
385
+ font-weight: 600;
335
386
  }
336
387
 
337
388
  .select-tags {
@@ -363,12 +414,12 @@
363
414
  border-color: var(--select-color-border-secondary-focused);
364
415
  }
365
416
 
366
- &[data-removable="true"] {
417
+ &:where([data-removable="true"]) {
367
418
  padding-right: var(--select-multiple-chip-removable-padding-right);
368
419
  }
369
420
  }
370
421
 
371
- .select-tag[data-kind="summary"],
422
+ .select-tag:where([data-kind="summary"]),
372
423
  .select-tag-summary {
373
424
  background-color: var(--select-multiple-chip-summary-surface);
374
425
  border-color: var(--select-multiple-chip-summary-border-color);
@@ -438,17 +489,22 @@
438
489
  justify-content: center;
439
490
  margin-left: auto;
440
491
 
441
- &[data-size="small"] {
492
+ &:where([data-size="small"]) {
442
493
  width: var(--select-icon-size-small);
443
494
  height: var(--select-icon-size-small);
444
495
  }
445
496
 
446
- &[data-size="large"] {
497
+ &:where([data-size="xsmall"]) {
498
+ width: var(--select-icon-size-xsmall);
499
+ height: var(--select-icon-size-xsmall);
500
+ }
501
+
502
+ &:where([data-size="large"]) {
447
503
  width: var(--select-icon-size-large);
448
504
  height: var(--select-icon-size-large);
449
505
  }
450
506
 
451
- [data-open="true"] & {
507
+ :where([data-open="true"]) & {
452
508
  transform: rotate(180deg);
453
509
  }
454
510
 
@@ -9,14 +9,20 @@
9
9
  --select-primary-height-small: var(--input-default-height-small);
10
10
  --select-primary-height-medium: var(--input-default-height-medium);
11
11
  --select-primary-height-large: var(--input-default-height-large);
12
+ --select-primary-height-xsmall: 24px;
12
13
 
13
14
  --select-primary-radius-small: var(--input-default-radius-base);
14
15
  --select-primary-radius-medium: var(--input-default-radius-base);
15
16
  --select-primary-radius-large: var(--input-default-radius-base);
17
+ --select-primary-radius-xsmall: var(--theme-radius-medium-2);
16
18
 
17
19
  --select-primary-padding-inline: var(--input-default-padding-inline);
18
20
  --select-primary-padding-block: var(--input-default-padding-block);
19
21
  --select-primary-gap-inline: var(--input-default-gap);
22
+ --select-primary-padding-inline-start-xsmall: var(--spacing-padding-4);
23
+ --select-primary-padding-inline-end-xsmall: var(--spacing-padding-3);
24
+ --select-primary-padding-block-xsmall: var(--spacing-padding-2);
25
+ --select-primary-gap-inline-xsmall: var(--spacing-gap-1);
20
26
  --select-primary-border-width-default: var(--input-border-width-default);
21
27
  --select-primary-border-width-focus: var(--input-border-width-emphasis);
22
28
 
@@ -71,6 +77,10 @@
71
77
  --select-text-small-line-height: var(--input-text-small-line-height);
72
78
  --select-text-small-letter-spacing: var(--input-text-small-letter-spacing);
73
79
  --select-text-small-weight: var(--input-text-small-weight);
80
+ --select-text-xsmall-size: 12px;
81
+ --select-text-xsmall-line-height: 18px;
82
+ --select-text-xsmall-letter-spacing: 0;
83
+ --select-text-xsmall-weight: 400;
74
84
  --select-text-medium-size: var(--input-text-medium-size);
75
85
  --select-text-medium-line-height: var(--input-text-medium-line-height);
76
86
  --select-text-medium-letter-spacing: var(--input-text-medium-letter-spacing);
@@ -80,6 +90,7 @@
80
90
  --select-text-large-letter-spacing: var(--input-text-large-letter-spacing);
81
91
  --select-text-large-weight: var(--input-text-large-weight);
82
92
 
93
+ --select-icon-size-xsmall: 1.4rem;
83
94
  --select-icon-size-small: 1.6rem;
84
95
  --select-icon-size-medium: 2rem;
85
96
  --select-icon-size-large: 2rem;
@@ -9,12 +9,13 @@ export type SelectPriority = "primary" | "secondary" | "table";
9
9
 
10
10
  /**
11
11
  * Select size scale
12
- * @typedef {"small" | "medium" | "large"} SelectSize
12
+ * @typedef {"xsmall" | "small" | "medium" | "large"} SelectSize
13
+ * - xsmall: primary 전용 초소형 레이아웃
13
14
  * - small: 컴팩트 레이아웃
14
15
  * - medium: 기본 사이즈
15
16
  * - large: 확장 레이아웃
16
17
  */
17
- export type SelectSize = "small" | "medium" | "large";
18
+ export type SelectSize = "xsmall" | "small" | "medium" | "large";
18
19
 
19
20
  /**
20
21
  * Select visual state
@@ -4,19 +4,50 @@ import type { SelectPriority, SelectSize } from "./base";
4
4
 
5
5
  /**
6
6
  * Select 아이콘 사이즈 맵
7
+ * @property {ElementType} xsmall xsmall 사이즈 아이콘 컴포넌트
7
8
  * @property {ElementType} small small 사이즈 아이콘 컴포넌트
8
9
  * @property {ElementType} medium medium 사이즈 아이콘 컴포넌트
9
10
  * @property {ElementType} large large 사이즈 아이콘 컴포넌트
10
11
  */
11
12
  export type SelectIconSizeMap = Record<SelectSize, ElementType>;
12
13
 
14
+ /**
15
+ * Select Chevron non-primary 사이즈
16
+ * @typedef {"small" | "medium" | "large"} SelectChevronNonPrimarySize
17
+ */
18
+ export type SelectChevronNonPrimarySize = Exclude<SelectSize, "xsmall">;
19
+
20
+ /**
21
+ * Select Chevron non-primary 사이즈 맵
22
+ * @property {ElementType} small small 사이즈 아이콘 컴포넌트
23
+ * @property {ElementType} medium medium 사이즈 아이콘 컴포넌트
24
+ * @property {ElementType} large large 사이즈 아이콘 컴포넌트
25
+ */
26
+ export type SelectChevronNonPrimaryIconSizeMap = Record<
27
+ SelectChevronNonPrimarySize,
28
+ ElementType
29
+ >;
30
+
13
31
  /**
14
32
  * Select 아이콘 priority 맵
15
33
  * @property {SelectIconSizeMap} primary primary priority용 아이콘 컬렉션
16
- * @property {SelectIconSizeMap} secondary secondary priority용 아이콘 컬렉션
17
- * @property {SelectIconSizeMap} table table priority용 아이콘 컬렉션
34
+ * @property {SelectChevronNonPrimaryIconSizeMap} secondary secondary priority용 아이콘 컬렉션
35
+ * @property {SelectChevronNonPrimaryIconSizeMap} table table priority용 아이콘 컬렉션
18
36
  */
19
- export type SelectIconPriorityMap = Record<SelectPriority, SelectIconSizeMap>;
37
+ export interface SelectIconPriorityMap {
38
+ /**
39
+ * primary priority용 아이콘 컬렉션
40
+ */
41
+ primary: SelectIconSizeMap;
42
+ /**
43
+ * secondary priority용 아이콘 컬렉션
44
+ */
45
+ secondary: SelectChevronNonPrimaryIconSizeMap;
46
+ /**
47
+ * table priority용 아이콘 컬렉션
48
+ */
49
+ table: SelectChevronNonPrimaryIconSizeMap;
50
+ }
20
51
 
21
52
  /**
22
53
  * Select multi remove priority 맵
@@ -4,7 +4,7 @@ import type { SelectDropdownBehaviorProps } from "./props";
4
4
  * Select Hook Types; Dropdown open state hook 입력 파라미터
5
5
  * @property {boolean} [open] 외부 제어형 open 상태
6
6
  * @property {boolean} [defaultOpen] 비제어형 초기 open 상태
7
- * @property {(open: boolean) => void} [onOpenChange] open 상태 변경 콜백
7
+ * @property {(open: boolean) => void} [onOpen] open 상태 변경 콜백
8
8
  */
9
9
  export interface UseSelectDropdownOpenStateParams extends SelectDropdownBehaviorProps {}
10
10
 
@@ -96,83 +96,3 @@ export interface SelectOptionRenderData {
96
96
  */
97
97
  export interface SelectDropdownOption<OptionData = unknown>
98
98
  extends SelectOptionData<OptionData>, SelectOptionRenderData {}
99
-
100
- /**
101
- * Select option change payload; 단일/다중 선택 결과를 서비스가 즉시 소비할 수 있게 전달한다.
102
- * @property {"single" | "multiple"} mode 선택 모드
103
- * @property {string[]} selectedOptionIds 선택된 option id 목록
104
- * @property {SelectOptionValue[]} selectedValues 선택된 value 목록
105
- * @property {SelectDropdownOption<OptionData>[]} selectedOptions 선택된 option 목록
106
- * @property {SelectDropdownOption<OptionData>} currentOption 현재 상호작용한 option
107
- * @property {boolean} isSelected currentOption 선택 여부
108
- */
109
- export interface SelectOptionChangePayload<OptionData = unknown> {
110
- /**
111
- * 선택 모드
112
- * - "single": 단일 선택
113
- * - "multiple": 다중 선택
114
- */
115
- mode: "single" | "multiple";
116
- /**
117
- * 선택된 option id 목록
118
- * - legacy controlled 상태 동기화가 필요할 때 사용한다.
119
- */
120
- selectedOptionIds: string[];
121
- /**
122
- * 선택된 value 목록
123
- * - form 제출값을 바로 반영할 때 사용한다.
124
- */
125
- selectedValues: SelectOptionValue[];
126
- /**
127
- * 선택된 option 전체 데이터 목록
128
- * - label/data 등 2차 데이터를 즉시 사용하려는 권장 소비 지점이다.
129
- */
130
- selectedOptions: SelectDropdownOption<OptionData>[];
131
- /**
132
- * 현재 상호작용한 option
133
- * - 어떤 option 클릭으로 상태가 변경되었는지 추적할 때 사용한다.
134
- */
135
- currentOption: SelectDropdownOption<OptionData>;
136
- /**
137
- * currentOption 선택 여부
138
- * - multiple 토글 시 add/remove 방향을 구분할 때 사용한다.
139
- */
140
- isSelected: boolean;
141
- }
142
-
143
- /**
144
- * Select legacy option 데이터 구조; 과거 key/optionName 스키마 호환을 위해 유지한다.
145
- * @property {string} key 렌더링 키
146
- * @property {SelectOptionValue} value 실제 값
147
- * @property {ReactNode} optionName 사용자 노출 라벨
148
- * @property {boolean} [selected] 선택 여부
149
- * @property {boolean} [disabled] 비활성 여부
150
- * @property {OptionData} [data] 추가 데이터 payload
151
- * @deprecated SelectDropdownOption으로 마이그레이션한다.
152
- */
153
- export interface SelectLegacyOption<OptionData = unknown> {
154
- /**
155
- * 렌더링 키
156
- */
157
- key: string;
158
- /**
159
- * 실제 값
160
- */
161
- value: SelectOptionValue;
162
- /**
163
- * 사용자 노출 라벨
164
- */
165
- optionName: ReactNode;
166
- /**
167
- * 선택 여부
168
- */
169
- selected?: boolean;
170
- /**
171
- * 비활성 여부
172
- */
173
- disabled?: boolean;
174
- /**
175
- * 추가 데이터 payload
176
- */
177
- data?: OptionData;
178
- }