@uniai-fe/uds-primitives 0.3.9 → 0.3.11
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 +29 -4
- package/package.json +1 -1
- package/src/components/form/markup/form-field/Container.tsx +2 -0
- package/src/components/form/markup/form-field/Template.tsx +1 -0
- package/src/components/form/styles/form-field/layout.scss +12 -1
- package/src/components/form/styles/form-field/variables.scss +2 -1
- package/src/components/form/types/props.ts +11 -0
- package/src/components/input/styles/variables.scss +3 -3
- package/src/components/select/markup/foundation/Base.tsx +1 -1
- package/src/components/select/styles/select.scss +17 -0
- package/src/components/select/styles/variables.scss +3 -0
- package/src/components/select/types/base.ts +3 -2
package/dist/styles.css
CHANGED
|
@@ -293,7 +293,8 @@
|
|
|
293
293
|
--form-field-helper-font-size: var(--font-caption-medium-size);
|
|
294
294
|
--form-field-helper-font-weight: 400;
|
|
295
295
|
--form-field-helper-line-height: var(--font-caption-medium-line-height);
|
|
296
|
-
--form-field-helper-color: var(--color-label-neutral);
|
|
296
|
+
--form-field-helper-color-default: var(--color-label-neutral);
|
|
297
|
+
--form-field-helper-color-error: var(--color-feedback-error);
|
|
297
298
|
--info-box-background-color: var(--color-blue-99);
|
|
298
299
|
--info-box-border-color: var(--color-secondary-standard);
|
|
299
300
|
--info-box-icon-color: var(--color-feedback-information);
|
|
@@ -352,7 +353,7 @@
|
|
|
352
353
|
--input-label-font-weight: var(--font-label-small-weight);
|
|
353
354
|
--input-helper-color: var(--color-label-neutral);
|
|
354
355
|
--input-helper-success-color: var(--color-success);
|
|
355
|
-
--input-helper-error-color: var(--color-error);
|
|
356
|
+
--input-helper-error-color: var(--color-feedback-error);
|
|
356
357
|
--input-helper-disabled-color: var(--color-label-disabled);
|
|
357
358
|
--input-helper-font-size: var(--font-label-small-size);
|
|
358
359
|
--input-helper-line-height: var(--font-label-small-line-height);
|
|
@@ -376,7 +377,7 @@
|
|
|
376
377
|
--input-border-table-default-color: transparent;
|
|
377
378
|
--input-border-table-disabled-color: var(--input-border-table-default-color);
|
|
378
379
|
--input-border-table-readonly-color: var(--input-border-table-disabled-color);
|
|
379
|
-
/* error는
|
|
380
|
+
/* error border는 기존 RGBA 스펙을 유지한다. */
|
|
380
381
|
--input-border-error-color: rgba(218, 29, 11, 0.44);
|
|
381
382
|
--input-border-disabled-color: var(--color-border-standard-cool-gray);
|
|
382
383
|
--input-border-underline-disabled-color: var(--color-border-assistive);
|
|
@@ -458,6 +459,7 @@
|
|
|
458
459
|
--select-table-radius: var(--input-table-radius-base);
|
|
459
460
|
--select-table-border-default-color: var(--input-border-table-default-color);
|
|
460
461
|
--select-table-border-focus-color: var(--input-border-active-color);
|
|
462
|
+
--select-table-border-error-color: var(--input-border-error-color);
|
|
461
463
|
--select-table-border-disabled-color: var(--input-border-disabled-color);
|
|
462
464
|
--select-table-border-readonly-color: var(
|
|
463
465
|
--select-table-border-disabled-color
|
|
@@ -511,10 +513,12 @@
|
|
|
511
513
|
--select-primary-color-text-readonly: var(--color-label-strong);
|
|
512
514
|
--select-primary-color-border: var(--input-border-color);
|
|
513
515
|
--select-primary-color-border-focused: var(--input-border-active-color);
|
|
516
|
+
--select-primary-color-border-error: var(--input-border-error-color);
|
|
514
517
|
--select-primary-color-border-disabled: var(--input-border-disabled-color);
|
|
515
518
|
--select-color-border-secondary: var(--input-border-color);
|
|
516
519
|
--select-color-border-secondary-hover: var(--input-border-active-color);
|
|
517
520
|
--select-color-border-secondary-focused: var(--input-border-active-color);
|
|
521
|
+
--select-color-border-secondary-error: var(--input-border-error-color);
|
|
518
522
|
--select-color-border-secondary-disabled: var(
|
|
519
523
|
--input-border-underline-disabled-color
|
|
520
524
|
);
|
|
@@ -2299,10 +2303,19 @@ figure.chip {
|
|
|
2299
2303
|
margin-top: var(--form-field-gap-y);
|
|
2300
2304
|
font-size: var(--form-field-helper-font-size);
|
|
2301
2305
|
line-height: var(--form-field-helper-line-height);
|
|
2306
|
+
color: var(--form-field-helper-color-default);
|
|
2302
2307
|
}
|
|
2303
2308
|
.form-field-footer p,
|
|
2304
2309
|
.form-field-footer span {
|
|
2305
|
-
color:
|
|
2310
|
+
color: inherit;
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
.form-field-container[data-state=error] .form-field-footer {
|
|
2314
|
+
color: var(--form-field-helper-color-error);
|
|
2315
|
+
}
|
|
2316
|
+
.form-field-container[data-state=error] .form-field-footer p,
|
|
2317
|
+
.form-field-container[data-state=error] .form-field-footer span {
|
|
2318
|
+
color: inherit;
|
|
2306
2319
|
}
|
|
2307
2320
|
|
|
2308
2321
|
|
|
@@ -3684,6 +3697,18 @@ figure.chip {
|
|
|
3684
3697
|
border-width: var(--select-primary-border-width-focus);
|
|
3685
3698
|
--select-icon-fill: var(--select-table-icon-color-focused);
|
|
3686
3699
|
}
|
|
3700
|
+
.select-button:not([data-priority=secondary])[data-state=error] {
|
|
3701
|
+
border-color: var(--select-primary-color-border-error);
|
|
3702
|
+
--select-icon-fill: var(--select-icon-color-default);
|
|
3703
|
+
}
|
|
3704
|
+
.select-button[data-priority=secondary][data-state=error]::after {
|
|
3705
|
+
height: var(--select-secondary-underline-width-focus);
|
|
3706
|
+
background-color: var(--select-color-border-secondary-error);
|
|
3707
|
+
}
|
|
3708
|
+
.select-button[data-priority=table][data-state=error] {
|
|
3709
|
+
border-color: var(--select-table-border-error-color);
|
|
3710
|
+
--select-icon-fill: var(--select-table-icon-color-default);
|
|
3711
|
+
}
|
|
3687
3712
|
.select-button:not([data-priority=secondary])[data-readonly=true] {
|
|
3688
3713
|
border-color: var(--select-primary-color-border-disabled);
|
|
3689
3714
|
background-color: var(--select-primary-color-surface-disabled);
|
package/package.json
CHANGED
|
@@ -25,6 +25,7 @@ const FormFieldContainer = forwardRef<HTMLElement, FormFieldContainerProps>(
|
|
|
25
25
|
className,
|
|
26
26
|
children,
|
|
27
27
|
width,
|
|
28
|
+
state = "default",
|
|
28
29
|
style,
|
|
29
30
|
...containerProps
|
|
30
31
|
},
|
|
@@ -43,6 +44,7 @@ const FormFieldContainer = forwardRef<HTMLElement, FormFieldContainerProps>(
|
|
|
43
44
|
<ComponentTag
|
|
44
45
|
ref={ref}
|
|
45
46
|
data-width={getFormFieldWidthAttr(width)}
|
|
47
|
+
data-state={state}
|
|
46
48
|
className={clsx("form-field form-field-container", className)}
|
|
47
49
|
style={mergedStyle}
|
|
48
50
|
{...containerProps}
|
|
@@ -18,6 +18,7 @@ import FormFieldContainer from "./Container";
|
|
|
18
18
|
* @property {FormFieldHeaderProps} [headerProps] 헤더 속성
|
|
19
19
|
* @property {FormFieldFooterProps} [footerProps] 푸터 속성
|
|
20
20
|
* @property {FormFieldWidth} [width] form field 너비 옵션
|
|
21
|
+
* @property {FormFieldState} [state] visual state
|
|
21
22
|
* @property {React.HTMLAttributes<HTMLElement>} [containerProps] container 속성
|
|
22
23
|
* @property {React.ReactNode} children
|
|
23
24
|
*/
|
|
@@ -60,8 +60,19 @@
|
|
|
60
60
|
margin-top: var(--form-field-gap-y);
|
|
61
61
|
font-size: var(--form-field-helper-font-size);
|
|
62
62
|
line-height: var(--form-field-helper-line-height);
|
|
63
|
+
color: var(--form-field-helper-color-default);
|
|
63
64
|
p,
|
|
64
65
|
span {
|
|
65
|
-
color:
|
|
66
|
+
color: inherit;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.form-field-container[data-state="error"] {
|
|
71
|
+
.form-field-footer {
|
|
72
|
+
color: var(--form-field-helper-color-error);
|
|
73
|
+
p,
|
|
74
|
+
span {
|
|
75
|
+
color: inherit;
|
|
76
|
+
}
|
|
66
77
|
}
|
|
67
78
|
}
|
|
@@ -13,5 +13,6 @@
|
|
|
13
13
|
--form-field-helper-font-size: var(--font-caption-medium-size);
|
|
14
14
|
--form-field-helper-font-weight: 400;
|
|
15
15
|
--form-field-helper-line-height: var(--font-caption-medium-line-height);
|
|
16
|
-
--form-field-helper-color: var(--color-label-neutral);
|
|
16
|
+
--form-field-helper-color-default: var(--color-label-neutral);
|
|
17
|
+
--form-field-helper-color-error: var(--color-feedback-error);
|
|
17
18
|
}
|
|
@@ -11,6 +11,11 @@ import type { ElementType } from "react";
|
|
|
11
11
|
*/
|
|
12
12
|
export type FormFieldWidth = "full" | "fit" | "fill" | "auto" | number | string;
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Form; field state option
|
|
16
|
+
*/
|
|
17
|
+
export type FormFieldState = "default" | "error";
|
|
18
|
+
|
|
14
19
|
/**
|
|
15
20
|
* Form.Field Header props; `Header.tsx`에서 label/description/meta를 제어한다.
|
|
16
21
|
* @property {string} [className] 헤더 wrapper className
|
|
@@ -78,6 +83,7 @@ export interface FormFieldFooterProps extends React.HTMLAttributes<HTMLElement>
|
|
|
78
83
|
* @property {string} [className] container className
|
|
79
84
|
* @property {React.ElementType} [as] container 태그
|
|
80
85
|
* @property {FormFieldWidth} [width] width 옵션(full/fit/fill/auto/custom)
|
|
86
|
+
* @property {FormFieldState} [state] visual state
|
|
81
87
|
* @property {React.ReactNode} children Body에 전달될 콘텐츠
|
|
82
88
|
*/
|
|
83
89
|
export interface FormFieldContainerProps extends React.HTMLAttributes<HTMLElement> {
|
|
@@ -93,6 +99,10 @@ export interface FormFieldContainerProps extends React.HTMLAttributes<HTMLElemen
|
|
|
93
99
|
* width 옵션
|
|
94
100
|
*/
|
|
95
101
|
width?: FormFieldWidth;
|
|
102
|
+
/**
|
|
103
|
+
* visual state
|
|
104
|
+
*/
|
|
105
|
+
state?: FormFieldState;
|
|
96
106
|
/**
|
|
97
107
|
* 필드 children
|
|
98
108
|
*/
|
|
@@ -107,6 +117,7 @@ export interface FormFieldContainerProps extends React.HTMLAttributes<HTMLElemen
|
|
|
107
117
|
* @property {string} [className] container className
|
|
108
118
|
* @property {React.ElementType} [as] container 태그
|
|
109
119
|
* @property {FormFieldWidth} [width] width 옵션(full/fit/fill/auto/custom)
|
|
120
|
+
* @property {FormFieldState} [state] visual state
|
|
110
121
|
* @property {React.ReactNode} children Body에 전달될 콘텐츠
|
|
111
122
|
*/
|
|
112
123
|
export interface FormFieldTemplateProps extends FormFieldContainerProps {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
--input-label-font-weight: var(--font-label-small-weight);
|
|
41
41
|
--input-helper-color: var(--color-label-neutral);
|
|
42
42
|
--input-helper-success-color: var(--color-success);
|
|
43
|
-
--input-helper-error-color: var(--color-error);
|
|
43
|
+
--input-helper-error-color: var(--color-feedback-error);
|
|
44
44
|
--input-helper-disabled-color: var(--color-label-disabled);
|
|
45
45
|
--input-helper-font-size: var(--font-label-small-size);
|
|
46
46
|
--input-helper-line-height: var(--font-label-small-line-height);
|
|
@@ -66,8 +66,8 @@
|
|
|
66
66
|
--input-border-table-default-color: transparent;
|
|
67
67
|
--input-border-table-disabled-color: var(--input-border-table-default-color);
|
|
68
68
|
--input-border-table-readonly-color: var(--input-border-table-disabled-color);
|
|
69
|
-
/* error는
|
|
70
|
-
--input-border-error-color: rgba(218, 29, 11, 0.44);
|
|
69
|
+
/* error border는 기존 RGBA 스펙을 유지한다. */
|
|
70
|
+
--input-border-error-color: rgba(218, 29, 11, 0.44);
|
|
71
71
|
--input-border-disabled-color: var(--color-border-standard-cool-gray);
|
|
72
72
|
--input-border-underline-disabled-color: var(--color-border-assistive);
|
|
73
73
|
|
|
@@ -13,7 +13,7 @@ import type { SelectTriggerBaseProps } from "../../types/trigger";
|
|
|
13
13
|
* @param {SelectTriggerBaseProps} props trigger base props
|
|
14
14
|
* @param {"primary" | "secondary" | "table"} [props.priority="primary"] 스타일 우선순위
|
|
15
15
|
* @param {"small" | "medium" | "large"} [props.size="medium"] 높이 스케일
|
|
16
|
-
* @param {"default" | "focused" | "disabled"} [props.state="default"] 시각 상태
|
|
16
|
+
* @param {"default" | "focused" | "error" | "disabled"} [props.state="default"] 시각 상태
|
|
17
17
|
* @param {boolean} [props.open=false] dropdown open 상태
|
|
18
18
|
* @param {boolean} [props.block=false] block 레이아웃 여부
|
|
19
19
|
* @param {boolean} [props.multiple=false] multi select 여부
|
|
@@ -133,6 +133,23 @@
|
|
|
133
133
|
--select-icon-fill: var(--select-table-icon-color-focused);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
&:not([data-priority="secondary"])[data-state="error"] {
|
|
137
|
+
border-color: var(--select-primary-color-border-error);
|
|
138
|
+
--select-icon-fill: var(--select-icon-color-default);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
&[data-priority="secondary"][data-state="error"] {
|
|
142
|
+
&::after {
|
|
143
|
+
height: var(--select-secondary-underline-width-focus);
|
|
144
|
+
background-color: var(--select-color-border-secondary-error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
&[data-priority="table"][data-state="error"] {
|
|
149
|
+
border-color: var(--select-table-border-error-color);
|
|
150
|
+
--select-icon-fill: var(--select-table-icon-color-default);
|
|
151
|
+
}
|
|
152
|
+
|
|
136
153
|
&:not([data-priority="secondary"])[data-readonly="true"] {
|
|
137
154
|
border-color: var(--select-primary-color-border-disabled);
|
|
138
155
|
background-color: var(--select-primary-color-surface-disabled);
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
--select-table-radius: var(--input-table-radius-base);
|
|
30
30
|
--select-table-border-default-color: var(--input-border-table-default-color);
|
|
31
31
|
--select-table-border-focus-color: var(--input-border-active-color);
|
|
32
|
+
--select-table-border-error-color: var(--input-border-error-color);
|
|
32
33
|
--select-table-border-disabled-color: var(--input-border-disabled-color);
|
|
33
34
|
--select-table-border-readonly-color: var(
|
|
34
35
|
--select-table-border-disabled-color
|
|
@@ -84,10 +85,12 @@
|
|
|
84
85
|
--select-primary-color-text-readonly: var(--color-label-strong);
|
|
85
86
|
--select-primary-color-border: var(--input-border-color);
|
|
86
87
|
--select-primary-color-border-focused: var(--input-border-active-color);
|
|
88
|
+
--select-primary-color-border-error: var(--input-border-error-color);
|
|
87
89
|
--select-primary-color-border-disabled: var(--input-border-disabled-color);
|
|
88
90
|
--select-color-border-secondary: var(--input-border-color);
|
|
89
91
|
--select-color-border-secondary-hover: var(--input-border-active-color);
|
|
90
92
|
--select-color-border-secondary-focused: var(--input-border-active-color);
|
|
93
|
+
--select-color-border-secondary-error: var(--input-border-error-color);
|
|
91
94
|
--select-color-border-secondary-disabled: var(
|
|
92
95
|
--input-border-underline-disabled-color
|
|
93
96
|
);
|
|
@@ -18,12 +18,13 @@ export type SelectSize = "small" | "medium" | "large";
|
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Select visual state
|
|
21
|
-
* @typedef {"default" | "focused" | "disabled"} SelectState
|
|
21
|
+
* @typedef {"default" | "focused" | "error" | "disabled"} SelectState
|
|
22
22
|
* - default: 기본 상태
|
|
23
23
|
* - focused: focus/open 상태
|
|
24
|
+
* - error: 에러 상태
|
|
24
25
|
* - disabled: 비활성 상태
|
|
25
26
|
*/
|
|
26
|
-
export type SelectState = "default" | "focused" | "disabled";
|
|
27
|
+
export type SelectState = "default" | "focused" | "error" | "disabled";
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Select trigger button type
|