@neo-design/foundations 1.0.0-rc.4

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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -0
  3. package/css/alert.css +133 -0
  4. package/css/aspect-ratio.css +32 -0
  5. package/css/badge.css +57 -0
  6. package/css/banner.css +220 -0
  7. package/css/button-icon.css +14 -0
  8. package/css/button.css +174 -0
  9. package/css/checkbox.css +124 -0
  10. package/css/chips-group.css +26 -0
  11. package/css/chips.css +88 -0
  12. package/css/combobox.css +229 -0
  13. package/css/empty-state.css +149 -0
  14. package/css/index.css +36 -0
  15. package/css/link.css +39 -0
  16. package/css/menu.css +112 -0
  17. package/css/modal-dialog.css +204 -0
  18. package/css/modal-fullscreen.css +145 -0
  19. package/css/radio-button.css +132 -0
  20. package/css/select.css +181 -0
  21. package/css/snackbar.css +85 -0
  22. package/css/spinner.css +21 -0
  23. package/css/tabs.css +126 -0
  24. package/css/tag.css +38 -0
  25. package/css/text-field.css +224 -0
  26. package/css/toggle.css +53 -0
  27. package/css/tooltip.css +32 -0
  28. package/icon-aliases.mjs +57 -0
  29. package/icons/README.md +84 -0
  30. package/icons/icons.css +16 -0
  31. package/icons/index.json +843 -0
  32. package/icons/sprite.mjs +2 -0
  33. package/package.json +44 -0
  34. package/tokens/_brand.mjs +3 -0
  35. package/tokens/_primitives.mjs +44 -0
  36. package/tokens/_util.mjs +12 -0
  37. package/tokens/api-js.mjs +11 -0
  38. package/tokens/breakpoints.mjs +8 -0
  39. package/tokens/color-semantic.mjs +47 -0
  40. package/tokens/color.mjs +58 -0
  41. package/tokens/component-tokens.mjs +24 -0
  42. package/tokens/container.mjs +8 -0
  43. package/tokens/iconSize.mjs +18 -0
  44. package/tokens/neo-color.css +97 -0
  45. package/tokens/neo-foundations.css +250 -0
  46. package/tokens/radius.mjs +18 -0
  47. package/tokens/shadows.mjs +14 -0
  48. package/tokens/spacing.mjs +21 -0
  49. package/tokens/stroke.mjs +15 -0
  50. package/tokens/typography.mjs +59 -0
package/css/select.css ADDED
@@ -0,0 +1,181 @@
1
+ /* packages/foundations/css/select.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .select {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--neo-space-xs-rem);
7
+ position: relative;
8
+ width: 100%;
9
+ }
10
+
11
+
12
+ .select__label-row {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: var(--neo-space-xs-rem);
16
+ }
17
+
18
+ .select__label {
19
+ font-size: var(--neo-type-body-lg-medium-size-rem);
20
+ font-weight: var(--neo-type-body-lg-medium-weight);
21
+ line-height: var(--neo-type-body-lg-medium-line-height-rem);
22
+ color: var(--text--base--default);
23
+ }
24
+
25
+
26
+ .select__trigger {
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--neo-space-sm-rem);
30
+ min-height: 44px;
31
+ padding-block: var(--neo-space-sm-rem);
32
+ padding-inline: var(--neo-space-md-rem);
33
+ min-width: 160px;
34
+ border: var(--neo-stroke-xs) solid var(--border--base--default);
35
+ border-radius: var(--neo-radius-sm);
36
+ background: var(--fill--base--default);
37
+ cursor: pointer;
38
+ width: 100%;
39
+ text-align: left;
40
+ transition: border-color 100ms ease, box-shadow 100ms ease;
41
+ }
42
+
43
+ .select__value {
44
+ flex: 1;
45
+ font-size: var(--neo-type-body-lg-regular-size-rem);
46
+ font-weight: var(--neo-type-body-lg-regular-weight);
47
+ line-height: var(--neo-type-body-lg-regular-line-height-rem);
48
+ color: var(--text--base--default);
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ white-space: nowrap;
52
+ }
53
+
54
+ .select__value--placeholder {
55
+ color: var(--text--base--secondary);
56
+ }
57
+
58
+ .select__chevron {
59
+ flex-shrink: 0;
60
+ width: var(--neo-icon-size-md-rem);
61
+ height: var(--neo-icon-size-md-rem);
62
+ fill: var(--icon--base--secondary);
63
+ color: var(--icon--base--secondary);
64
+ transition: transform 150ms ease;
65
+ }
66
+
67
+ @media (prefers-reduced-motion: reduce) {
68
+ .select__chevron { transition: none; }
69
+ }
70
+
71
+
72
+ .select__helper,
73
+ .select__feedback {
74
+ font-size: var(--neo-type-body-md-regular-size-rem);
75
+ font-weight: var(--neo-type-body-md-regular-weight);
76
+ line-height: var(--neo-type-body-md-regular-line-height-rem);
77
+ }
78
+
79
+ .select__helper { color: var(--text--base--secondary); }
80
+ .select__feedback { color: var(--text--semantic--error); }
81
+
82
+
83
+ .select__trigger:focus-visible,
84
+ .select--focus .select__trigger {
85
+ outline: none;
86
+ box-shadow:
87
+ 0 0 0 var(--neo-stroke-focus-ring-width) var(--focus--gap--default),
88
+ 0 0 0 calc(var(--neo-stroke-focus-ring-width) * 2) var(--focus--ring--default);
89
+ }
90
+
91
+ .select--active .select__trigger {
92
+ border-color: var(--border--base--focus);
93
+ }
94
+
95
+ .select--active .select__chevron {
96
+ transform: rotate(180deg);
97
+ }
98
+
99
+ .select--filled .select__value {
100
+ color: var(--text--base--default);
101
+ }
102
+
103
+
104
+ .select--error .select__trigger {
105
+ border-color: var(--border--semantic--error-solid);
106
+ }
107
+
108
+ .select--error .select__label {
109
+ color: var(--text--semantic--error);
110
+ }
111
+
112
+ .select--error .select__trigger:focus-visible,
113
+ .select--error.select--focus .select__trigger {
114
+ border-color: var(--border--semantic--error-solid);
115
+ box-shadow:
116
+ 0 0 0 var(--neo-stroke-focus-ring-width) var(--focus--gap--default),
117
+ 0 0 0 calc(var(--neo-stroke-focus-ring-width) * 2) var(--focus--ring--default);
118
+ }
119
+
120
+ .select--read-only .select__trigger {
121
+ background: var(--fill--base--medium);
122
+ border-color: var(--border--base--default);
123
+ cursor: default;
124
+ pointer-events: none;
125
+ }
126
+
127
+ .select--disabled .select__trigger {
128
+ background: var(--fill--base--disabled);
129
+ border-color: var(--border--base--disabled);
130
+ cursor: not-allowed;
131
+ pointer-events: none;
132
+ }
133
+
134
+ .select--disabled .select__label {
135
+ color: var(--text--base--disabled);
136
+ }
137
+
138
+ .select--disabled .select__value,
139
+ .select--disabled .select__value--placeholder {
140
+ color: var(--text--base--disabled);
141
+ }
142
+
143
+ .select--disabled .select__chevron {
144
+ fill: var(--icon--base--disabled);
145
+ color: var(--icon--base--disabled);
146
+ }
147
+
148
+ .select--disabled .select__helper {
149
+ color: var(--text--base--disabled);
150
+ }
151
+
152
+
153
+ .select__icon--tooltip {
154
+ width: var(--neo-icon-size-xs-rem);
155
+ height: var(--neo-icon-size-xs-rem);
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ button.select__icon--tooltip {
160
+ padding: 0;
161
+ border: none;
162
+ background: none;
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ cursor: pointer;
167
+ color: inherit;
168
+ }
169
+
170
+ button.select__icon--tooltip { position: relative; }
171
+ button.select__icon--tooltip::after {
172
+ content: '';
173
+ position: absolute;
174
+ inset: calc((var(--neo-icon-size-md-rem) - var(--neo-icon-size-xs-rem)) / -2);
175
+ }
176
+
177
+ .select__icon--tooltip > svg {
178
+ width: 100%;
179
+ height: 100%;
180
+ display: block;
181
+ }
@@ -0,0 +1,85 @@
1
+ /* packages/foundations/css/snackbar.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .snackbar {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--neo-space-sm-rem);
7
+ max-width: 100%;
8
+ padding-block: var(--neo-space-md-rem);
9
+ padding-inline: var(--neo-space-lg-rem);
10
+ border-radius: var(--neo-radius-lg);
11
+ background: var(--fill--base--inverse);
12
+ color: var(--text--base--contrast);
13
+ }
14
+
15
+ .snackbar[hidden] { display: none; }
16
+
17
+ .snackbar__message {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: var(--neo-space-sm-rem);
21
+ flex: none;
22
+ min-width: 0;
23
+ min-height: var(--neo-icon-size-lg-rem);
24
+ margin: 0;
25
+ }
26
+
27
+ .snackbar__icon {
28
+ flex-shrink: 0;
29
+ width: var(--neo-icon-size-md-rem);
30
+ height: var(--neo-icon-size-md-rem);
31
+ }
32
+
33
+ .snackbar__text {
34
+ min-width: 0;
35
+ color: var(--text--base--contrast);
36
+ font-size: var(--neo-type-body-lg-bold-size-rem);
37
+ font-weight: var(--neo-type-body-lg-bold-weight);
38
+ line-height: var(--neo-type-body-lg-bold-line-height-rem);
39
+ }
40
+
41
+ .snackbar__action {
42
+ flex-shrink: 0;
43
+ display: flex;
44
+ align-items: center;
45
+ padding-inline-start: var(--neo-space-sm-rem);
46
+ }
47
+
48
+ .snackbar__close {
49
+ flex-shrink: 0;
50
+ width: var(--neo-icon-size-lg-rem);
51
+ height: var(--neo-icon-size-lg-rem);
52
+ border-radius: var(--neo-radius-pill);
53
+ }
54
+
55
+ @media (max-width: 575px) {
56
+ .snackbar {
57
+ display: grid;
58
+ grid-template-columns: 1fr auto;
59
+ grid-template-rows: minmax(var(--neo-icon-size-lg-rem), auto);
60
+ row-gap: var(--neo-space-sm-rem);
61
+ column-gap: var(--neo-space-sm-rem);
62
+ width: 100%;
63
+ }
64
+ .snackbar__message {
65
+ grid-column: 1;
66
+ grid-row: 1;
67
+ align-self: start;
68
+ align-items: flex-start;
69
+ min-height: 0;
70
+ padding-block-start: var(--neo-space-xs-rem);
71
+ }
72
+ .snackbar__close { grid-column: 2; grid-row: 1; align-self: start; }
73
+ .snackbar__action {
74
+ grid-column: 1 / -1;
75
+ grid-row: 2;
76
+ justify-self: end;
77
+ }
78
+ .snackbar__text {
79
+ flex: 1;
80
+ display: -webkit-box;
81
+ -webkit-box-orient: vertical;
82
+ -webkit-line-clamp: 2;
83
+ overflow: hidden;
84
+ }
85
+ }
@@ -0,0 +1,21 @@
1
+ /* packages/foundations/css/spinner.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .spinner {
4
+ display: inline-block;
5
+ border: 2px solid transparent;
6
+ border-top-color: var(--icon--base--default);
7
+ border-radius: var(--neo-radius-pill);
8
+ animation: neo-spin 0.8s linear infinite;
9
+ }
10
+
11
+ .spinner--small { width: 20px; height: 20px; }
12
+ .spinner--medium { width: 24px; height: 24px; }
13
+ .spinner--large { width: 32px; height: 32px; border-width: 3px; }
14
+
15
+ @keyframes neo-spin {
16
+ to { transform: rotate(360deg); }
17
+ }
18
+
19
+ @media (prefers-reduced-motion: reduce) {
20
+ .spinner { animation: none; }
21
+ }
package/css/tabs.css ADDED
@@ -0,0 +1,126 @@
1
+ /* packages/foundations/css/tabs.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .tabs {
4
+ display: flex;
5
+ flex-direction: column;
6
+ background: var(--fill--base--default);
7
+ }
8
+
9
+ [role="tablist"] {
10
+ display: flex;
11
+ align-items: stretch;
12
+ overflow-x: auto;
13
+ position: relative;
14
+ background: var(--fill--base--default);
15
+ border-style: solid;
16
+ border-width: var(--neo-stroke-xs);
17
+ border-color: var(--border--base--secondary);
18
+ border-radius: var(--neo-radius-sm) var(--neo-radius-sm) 0 0;
19
+ box-shadow: var(--neo-elevation-md);
20
+ }
21
+
22
+ [role="tab"] {
23
+ display: inline-flex;
24
+ flex-shrink: 0;
25
+ align-items: center;
26
+ justify-content: center;
27
+ gap: var(--neo-space-sm-rem);
28
+ padding-inline: var(--neo-space-lg-rem);
29
+ padding-block: var(--neo-space-md-rem);
30
+ background: var(--fill--tertiary--default);
31
+ border: none;
32
+ cursor: pointer;
33
+ font-size: var(--neo-type-body-lg-medium-size-rem);
34
+ font-weight: var(--neo-type-body-lg-medium-weight);
35
+ line-height: var(--neo-type-body-lg-medium-line-height-rem);
36
+ color: var(--text--base--secondary);
37
+ position: relative;
38
+ white-space: nowrap;
39
+ transition: color 100ms ease, background 100ms ease;
40
+ }
41
+
42
+ [role="tab"]:first-child { border-top-left-radius: var(--neo-radius-sm); }
43
+ [role="tab"]:last-child { border-top-right-radius: var(--neo-radius-sm); }
44
+
45
+ [role="tab"] svg {
46
+ fill: var(--icon--base--secondary);
47
+ color: var(--icon--base--secondary);
48
+ width: var(--neo-icon-size-sm-rem);
49
+ height: var(--neo-icon-size-sm-rem);
50
+ flex-shrink: 0;
51
+ }
52
+
53
+ [role="tab"]:not(:last-child)::before {
54
+ content: '';
55
+ position: absolute;
56
+ top: 0;
57
+ bottom: 0;
58
+ right: 0;
59
+ width: var(--neo-stroke-xs);
60
+ background: var(--border--base--secondary);
61
+ z-index: 1;
62
+ }
63
+
64
+ [role="tab"]::after {
65
+ content: '';
66
+ position: absolute;
67
+ bottom: 0;
68
+ left: 0;
69
+ right: 0;
70
+ height: var(--neo-stroke-sm);
71
+ background: var(--border--base--default);
72
+ transition: background 100ms ease;
73
+ }
74
+
75
+ [role="tab"]:hover:not([aria-selected="true"]):not([aria-disabled="true"]) {
76
+ background: var(--fill--tertiary--hover);
77
+ color: var(--text--base--default);
78
+ }
79
+
80
+ [role="tab"][aria-selected="true"] {
81
+ background: var(--fill--tertiary--active);
82
+ color: var(--text--base--default);
83
+ }
84
+
85
+ [role="tab"][aria-selected="true"]::after {
86
+ background: var(--border--base--focus);
87
+ }
88
+
89
+ [role="tab"][aria-selected="true"] svg {
90
+ fill: currentColor;
91
+ }
92
+
93
+ [role="tab"]:focus-visible {
94
+ outline: var(--neo-stroke-focus-ring-width) solid var(--focus--ring--default);
95
+ outline-offset: calc(-1 * var(--neo-stroke-focus-ring-width));
96
+ box-shadow: inset 0 0 0 calc(var(--neo-stroke-focus-ring-width) * 2) var(--focus--gap--default);
97
+ isolation: isolate;
98
+ }
99
+
100
+ [role="tab"]:focus-visible::before,
101
+ [role="tab"]:focus-visible::after {
102
+ z-index: -1;
103
+ }
104
+
105
+ [role="tab"][aria-disabled="true"] {
106
+ color: var(--text--base--disabled);
107
+ cursor: not-allowed;
108
+ pointer-events: none;
109
+ }
110
+
111
+ [role="tab"][aria-disabled="true"]::after {
112
+ background: var(--border--base--secondary);
113
+ }
114
+
115
+ [role="tab"][aria-disabled="true"] svg {
116
+ fill: var(--icon--base--disabled);
117
+ color: var(--icon--base--disabled);
118
+ }
119
+
120
+ [role="tabpanel"] {
121
+ padding-block: var(--neo-space-lg-rem);
122
+ }
123
+
124
+ [role="tabpanel"][hidden] {
125
+ display: none;
126
+ }
package/css/tag.css ADDED
@@ -0,0 +1,38 @@
1
+ /* packages/foundations/css/tag.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .tag {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--neo-space-xs-rem);
7
+ padding-inline: var(--neo-space-sm-rem);
8
+ padding-block: var(--neo-space-xs-rem);
9
+ background: var(--fill--base--light);
10
+ border: var(--neo-stroke-xs) solid var(--border--base--default);
11
+ border-radius: var(--neo-radius-xs);
12
+ font-size: var(--neo-type-body-md-medium-size-rem);
13
+ font-weight: var(--neo-type-body-md-medium-weight);
14
+ line-height: var(--neo-type-body-md-medium-line-height-rem);
15
+ color: var(--text--base--secondary);
16
+ white-space: nowrap;
17
+ }
18
+
19
+ .tag svg,
20
+ .tag [aria-hidden="true"] {
21
+ flex-shrink: 0;
22
+ fill: var(--icon--base--secondary);
23
+ color: var(--icon--base--secondary);
24
+ width: var(--neo-icon-size-sm-rem);
25
+ height: var(--neo-icon-size-sm-rem);
26
+ }
27
+
28
+ .tag--solid {
29
+ background: var(--fill--base--inverse);
30
+ border-color: var(--fill--base--inverse);
31
+ color: var(--text--base--contrast);
32
+ }
33
+
34
+ .tag--solid svg,
35
+ .tag--solid [aria-hidden="true"] {
36
+ fill: var(--icon--base--contrast);
37
+ color: var(--icon--base--contrast);
38
+ }
@@ -0,0 +1,224 @@
1
+ /* packages/foundations/css/text-field.css — emitted without comments. The reasoning behind each decision lives in Neo's source repository. */
2
+
3
+ .field {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--neo-space-xs-rem);
7
+ width: 100%;
8
+ }
9
+
10
+ .field__label-row {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: var(--neo-space-xs-rem);
14
+ }
15
+
16
+ .field__label {
17
+ font-size: var(--neo-type-body-lg-medium-size-rem);
18
+ font-weight: var(--neo-type-body-lg-medium-weight);
19
+ line-height: var(--neo-type-body-lg-medium-line-height-rem);
20
+ color: var(--text--base--default);
21
+ overflow: hidden;
22
+ text-overflow: ellipsis;
23
+ white-space: nowrap;
24
+ }
25
+
26
+ .field__label--required::after {
27
+ content: ' *';
28
+ color: var(--text--semantic--error);
29
+ }
30
+
31
+ .field__input-wrapper {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--neo-space-sm-rem);
35
+ min-height: 44px;
36
+ padding-inline: var(--neo-space-md-rem);
37
+ padding-block: var(--neo-space-sm-rem);
38
+ border: var(--neo-stroke-xs) solid var(--border--base--default);
39
+ border-radius: var(--neo-radius-sm);
40
+ background: var(--fill--base--default);
41
+ transition: border-color 100ms ease, box-shadow 100ms ease;
42
+ }
43
+
44
+ .field__input {
45
+ flex: 1;
46
+ border: none;
47
+ background: transparent;
48
+ font-size: var(--neo-type-body-lg-regular-size-rem);
49
+ font-weight: var(--neo-type-body-lg-regular-weight);
50
+ line-height: var(--neo-type-body-lg-regular-line-height-rem);
51
+ color: var(--text--base--default);
52
+ outline: none;
53
+ min-width: 0;
54
+ }
55
+
56
+ .field__input-wrapper:has(textarea),
57
+ .field__input-wrapper--textarea {
58
+ box-sizing: border-box;
59
+ min-height: 112px;
60
+ padding-block: var(--neo-space-md-rem);
61
+ align-items: flex-start;
62
+ }
63
+
64
+ .field__input::placeholder {
65
+ color: var(--text--base--secondary);
66
+ }
67
+
68
+ .field__icon {
69
+ fill: var(--icon--base--default);
70
+ color: var(--icon--base--default);
71
+ width: var(--neo-icon-size-md-rem);
72
+ height: var(--neo-icon-size-md-rem);
73
+ flex-shrink: 0;
74
+ flex-shrink: 0;
75
+ }
76
+
77
+ .field__icon > svg {
78
+ width: 100%;
79
+ height: 100%;
80
+ display: block;
81
+ }
82
+
83
+ .field__icon--tooltip {
84
+ width: var(--neo-icon-size-xs-rem);
85
+ height: var(--neo-icon-size-xs-rem);
86
+ flex-shrink: 0;
87
+ }
88
+
89
+ .field__icon--tooltip > svg {
90
+ width: 100%;
91
+ height: 100%;
92
+ display: block;
93
+ }
94
+
95
+ button.field__icon,
96
+ button.field__icon--tooltip {
97
+ padding: 0;
98
+ border: none;
99
+ background: none;
100
+ display: inline-flex;
101
+ align-items: center;
102
+ justify-content: center;
103
+ cursor: pointer;
104
+ color: inherit;
105
+ }
106
+
107
+ button.field__icon--tooltip { position: relative; }
108
+ button.field__icon--tooltip::after {
109
+ content: '';
110
+ position: absolute;
111
+ inset: calc((var(--neo-icon-size-md-rem) - var(--neo-icon-size-xs-rem)) / -2);
112
+ }
113
+
114
+ .field__prefix,
115
+ .field__suffix {
116
+ flex-shrink: 0;
117
+ font-size: var(--neo-type-body-lg-regular-size-rem);
118
+ font-weight: var(--neo-type-body-lg-regular-weight);
119
+ line-height: var(--neo-type-body-lg-regular-line-height-rem);
120
+ color: var(--text--base--default);
121
+ }
122
+
123
+
124
+ .field--active .field__input-wrapper,
125
+ .field--writing .field__input-wrapper {
126
+ border-width: var(--neo-stroke-sm);
127
+ border-color: var(--border--base--focus);
128
+ }
129
+
130
+ .field--focus .field__input-wrapper {
131
+ border-width: var(--neo-stroke-sm);
132
+ border-color: var(--border--base--focus);
133
+ box-shadow:
134
+ 0 0 0 var(--neo-stroke-focus-ring-width) var(--focus--gap--default),
135
+ 0 0 0 calc(var(--neo-stroke-focus-ring-width) * 2) var(--focus--ring--default);
136
+ }
137
+
138
+ .field--filled .field__input-wrapper {
139
+ border-width: var(--neo-stroke-xs);
140
+ border-color: var(--border--base--default);
141
+ }
142
+
143
+ .field--error .field__input-wrapper {
144
+ border-width: var(--neo-stroke-sm);
145
+ border-color: var(--border--semantic--error-solid);
146
+ }
147
+
148
+ .field--error.field--focus .field__input-wrapper {
149
+ box-shadow:
150
+ 0 0 0 var(--neo-stroke-focus-ring-width) var(--focus--gap--default),
151
+ 0 0 0 calc(var(--neo-stroke-focus-ring-width) * 2) var(--focus--ring--default);
152
+ }
153
+
154
+ .field--error .field__label {
155
+ color: var(--text--semantic--error);
156
+ }
157
+
158
+ .field__feedback {
159
+ font-size: var(--neo-type-body-md-regular-size-rem);
160
+ font-weight: var(--neo-type-body-md-regular-weight);
161
+ line-height: var(--neo-type-body-md-regular-line-height-rem);
162
+ color: var(--text--semantic--error);
163
+ }
164
+
165
+ .field--read-only .field__input-wrapper {
166
+ background: var(--fill--base--medium);
167
+ border-width: var(--neo-stroke-xs);
168
+ border-color: var(--border--base--default);
169
+ }
170
+
171
+ .field--read-only .field__input {
172
+ color: var(--text--base--default);
173
+ cursor: default;
174
+ }
175
+
176
+ .field--disabled .field__input-wrapper {
177
+ background: var(--fill--base--disabled);
178
+ border-width: var(--neo-stroke-xs);
179
+ border-color: var(--border--base--disabled);
180
+ pointer-events: none;
181
+ }
182
+
183
+ .field--disabled .field__label,
184
+ .field--disabled .field__input,
185
+ .field--disabled .field__prefix,
186
+ .field--disabled .field__suffix,
187
+ .field--disabled .field__helper {
188
+ color: var(--text--base--disabled);
189
+ }
190
+
191
+ .field--disabled .field__icon {
192
+ fill: var(--icon--base--disabled);
193
+ color: var(--icon--base--disabled);
194
+ }
195
+
196
+ .field__footer {
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: flex-start;
200
+ gap: var(--neo-space-sm-rem);
201
+ }
202
+
203
+ .field__helper {
204
+ font-size: var(--neo-type-body-md-regular-size-rem);
205
+ font-weight: var(--neo-type-body-md-regular-weight);
206
+ line-height: var(--neo-type-body-md-regular-line-height-rem);
207
+ color: var(--text--base--secondary);
208
+ min-width: 0;
209
+ flex: 1;
210
+ overflow: hidden;
211
+ text-overflow: ellipsis;
212
+ white-space: nowrap;
213
+ }
214
+
215
+ .field__counter {
216
+ font-size: var(--neo-type-body-md-regular-size-rem);
217
+ font-weight: var(--neo-type-body-md-regular-weight);
218
+ line-height: var(--neo-type-body-md-regular-line-height-rem);
219
+ color: var(--text--base--secondary);
220
+ white-space: nowrap;
221
+ flex-shrink: 0;
222
+ margin-left: auto;
223
+ }
224
+