@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.
- package/dist/styles.css +171 -87
- package/package.json +1 -1
- package/src/components/dropdown/markup/Template.tsx +20 -50
- package/src/components/dropdown/styles/dropdown.scss +44 -23
- package/src/components/dropdown/styles/variables.scss +25 -0
- package/src/components/dropdown/types/base.ts +2 -2
- package/src/components/dropdown/types/props.ts +0 -12
- package/src/components/select/hooks/interaction.ts +5 -5
- package/src/components/select/img/chevron/primary/xsmall.svg +3 -0
- package/src/components/select/markup/Default.tsx +183 -214
- package/src/components/select/markup/foundation/Base.tsx +16 -4
- package/src/components/select/markup/foundation/Icon.tsx +9 -3
- package/src/components/select/markup/foundation/Selected.tsx +115 -11
- package/src/components/select/markup/multiple/Multiple.tsx +64 -138
- package/src/components/select/styles/select.scss +128 -72
- package/src/components/select/styles/variables.scss +11 -0
- package/src/components/select/types/base.ts +3 -2
- package/src/components/select/types/icon.ts +34 -3
- package/src/components/select/types/interaction.ts +1 -1
- package/src/components/select/types/option.ts +0 -80
- package/src/components/select/types/props.ts +171 -96
- package/src/components/select/types/trigger.ts +54 -3
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
76
|
+
&:where([data-multiple="true"]) {
|
|
66
77
|
align-items: center;
|
|
67
78
|
flex-wrap: nowrap;
|
|
68
79
|
overflow: hidden;
|
|
69
80
|
}
|
|
70
81
|
|
|
71
|
-
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
190
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
white-space: nowrap;
|
|
244
|
+
caret-color: var(--select-primary-color-text);
|
|
245
|
+
cursor: default;
|
|
229
246
|
|
|
230
|
-
|
|
231
|
-
|
|
247
|
+
// 변경: custom mode(편집 가능 상태)에서만 text cursor를 사용한다.
|
|
248
|
+
&:where(:not([readonly])) {
|
|
249
|
+
cursor: text;
|
|
232
250
|
}
|
|
233
251
|
|
|
234
|
-
|
|
235
|
-
color: var(--select-
|
|
252
|
+
&::placeholder {
|
|
253
|
+
color: var(--select-primary-color-placeholder);
|
|
236
254
|
}
|
|
237
255
|
|
|
238
|
-
.select-button[data-priority="
|
|
239
|
-
color: var(--select-
|
|
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-
|
|
243
|
-
|
|
244
|
-
color: var(--select-
|
|
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"]
|
|
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"]
|
|
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"]
|
|
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"]
|
|
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-
|
|
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"]
|
|
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"]
|
|
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"]
|
|
334
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
17
|
-
* @property {
|
|
34
|
+
* @property {SelectChevronNonPrimaryIconSizeMap} secondary secondary priority용 아이콘 컬렉션
|
|
35
|
+
* @property {SelectChevronNonPrimaryIconSizeMap} table table priority용 아이콘 컬렉션
|
|
18
36
|
*/
|
|
19
|
-
export
|
|
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} [
|
|
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
|
-
}
|