@reliability-design/web 1.3.1 → 1.4.0
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/components/rel-accordion/README.md +13 -13
- package/dist/components/rel-accordion/rel-accordion.ts +80 -45
- package/dist/components/rel-alert/README.md +15 -15
- package/dist/components/rel-alert/rel-alert.ts +153 -158
- package/dist/components/rel-avatar/README.md +15 -15
- package/dist/components/rel-avatar/rel-avatar.ts +42 -38
- package/dist/components/rel-badge/README.md +5 -5
- package/dist/components/rel-badge/rel-badge.ts +46 -11
- package/dist/components/rel-breadcrumb/README.md +7 -7
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +16 -13
- package/dist/components/rel-button/README.md +20 -20
- package/dist/components/rel-button/rel-button.ts +292 -105
- package/dist/components/rel-calendar/README.md +5 -5
- package/dist/components/rel-calendar/rel-calendar.ts +61 -45
- package/dist/components/rel-card/README.md +6 -6
- package/dist/components/rel-card/rel-card.ts +88 -35
- package/dist/components/rel-cardmedia/README.md +9 -9
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +27 -20
- package/dist/components/rel-carousel/README.md +3 -3
- package/dist/components/rel-carousel/rel-carousel.ts +174 -90
- package/dist/components/rel-chart/README.md +8 -8
- package/dist/components/rel-chart/rel-chart.ts +59 -41
- package/dist/components/rel-checkbox/README.md +7 -7
- package/dist/components/rel-checkbox/rel-checkbox.ts +61 -61
- package/dist/components/rel-chip/README.md +16 -16
- package/dist/components/rel-chip/rel-chip.ts +143 -111
- package/dist/components/rel-container/README.md +11 -11
- package/dist/components/rel-container/rel-container.ts +35 -9
- package/dist/components/rel-date-picker/README.md +43 -7
- package/dist/components/rel-date-picker/date-format.test.ts +43 -0
- package/dist/components/rel-date-picker/date-format.ts +47 -0
- package/dist/components/rel-date-picker/rel-date-picker.ts +154 -82
- package/dist/components/rel-divider/README.md +9 -9
- package/dist/components/rel-divider/rel-divider.ts +10 -9
- package/dist/components/rel-drawer/README.md +1 -1
- package/dist/components/rel-drawer/rel-drawer-footer.ts +1 -1
- package/dist/components/rel-drawer/rel-drawer.ts +56 -28
- package/dist/components/rel-kbd/README.md +20 -20
- package/dist/components/rel-kbd/rel-kbd.ts +119 -25
- package/dist/components/rel-layout/README.md +1 -1
- package/dist/components/rel-layout/rel-layout.ts +2 -2
- package/dist/components/rel-menu/README.md +15 -15
- package/dist/components/rel-menu/rel-menu.ts +155 -88
- package/dist/components/rel-menubar/README.md +20 -20
- package/dist/components/rel-menubar/rel-menubar.ts +47 -31
- package/dist/components/rel-nav-menu/README.md +21 -21
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +17 -14
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +33 -14
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +14 -7
- package/dist/components/rel-navbar/README.md +7 -7
- package/dist/components/rel-navbar/rel-navbar.ts +12 -11
- package/dist/components/rel-otp/README.md +3 -3
- package/dist/components/rel-otp/rel-otp.ts +46 -30
- package/dist/components/rel-pagination/README.md +18 -18
- package/dist/components/rel-pagination/rel-pagination.ts +141 -90
- package/dist/components/rel-popover/README.md +13 -13
- package/dist/components/rel-popover/rel-popover-content.ts +39 -14
- package/dist/components/rel-popover/rel-popover.ts +18 -7
- package/dist/components/rel-progress/README.md +5 -5
- package/dist/components/rel-progress/rel-progress.ts +16 -12
- package/dist/components/rel-radio/README.md +9 -9
- package/dist/components/rel-radio/rel-radio.ts +64 -50
- package/dist/components/rel-range-picker/rel-range-picker.ts +120 -117
- package/dist/components/rel-resizable/README.md +4 -4
- package/dist/components/rel-resizable/rel-resizable-group.ts +15 -4
- package/dist/components/rel-resizable/rel-resizable-handle.ts +13 -9
- package/dist/components/rel-resizable/rel-resizable-panel.ts +11 -0
- package/dist/components/rel-segmented-button/README.md +10 -10
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +39 -40
- package/dist/components/rel-select/README.md +14 -14
- package/dist/components/rel-select/rel-select.ts +120 -188
- package/dist/components/rel-sheet/README.md +10 -10
- package/dist/components/rel-sheet/rel-sheet.ts +82 -23
- package/dist/components/rel-sidebar/README.md +5 -5
- package/dist/components/rel-sidebar/rel-sidebar.ts +75 -60
- package/dist/components/rel-skeleton/rel-skeleton.ts +8 -13
- package/dist/components/rel-slider/README.md +10 -10
- package/dist/components/rel-slider/rel-slider.ts +230 -57
- package/dist/components/rel-snackbar/README.md +9 -9
- package/dist/components/rel-snackbar/rel-snackbar.ts +44 -32
- package/dist/components/rel-stepper/README.md +10 -10
- package/dist/components/rel-stepper/rel-stepper.ts +110 -46
- package/dist/components/rel-switch/README.md +5 -5
- package/dist/components/rel-switch/rel-switch.ts +23 -12
- package/dist/components/rel-tab/README.md +13 -13
- package/dist/components/rel-tab/rel-tab.ts +63 -19
- package/dist/components/rel-table/README.md +7 -7
- package/dist/components/rel-table/rel-table-body.ts +2 -1
- package/dist/components/rel-table/rel-table-caption.ts +10 -7
- package/dist/components/rel-table/rel-table-cell.ts +7 -6
- package/dist/components/rel-table/rel-table-footer.ts +4 -3
- package/dist/components/rel-table/rel-table-head.ts +11 -9
- package/dist/components/rel-table/rel-table-header.ts +2 -1
- package/dist/components/rel-table/rel-table-row.ts +5 -4
- package/dist/components/rel-table/rel-table.ts +16 -7
- package/dist/components/rel-textfield/README.md +11 -11
- package/dist/components/rel-textfield/rel-textfield.ts +172 -91
- package/dist/components/rel-toast/README.md +11 -11
- package/dist/components/rel-toast/rel-toast.ts +33 -30
- package/dist/components/rel-tooltip/README.md +7 -7
- package/dist/components/rel-tooltip/rel-tooltip.ts +160 -123
- package/dist/components/rel-topbar/rel-topbar-actions.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar-brand.ts +8 -5
- package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +10 -8
- package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -5
- package/dist/components/rel-topbar/rel-topbar-item.ts +23 -22
- package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -1
- package/dist/components/rel-topbar/rel-topbar-profile.ts +68 -50
- package/dist/components/rel-topbar/rel-topbar-utilities.ts +1 -2
- package/dist/components/rel-topbar/rel-topbar.ts +31 -29
- package/dist/index.d.mts +151 -39
- package/dist/index.d.ts +151 -39
- package/dist/index.js +3544 -2289
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3876 -2622
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +653 -363
- package/dist/vars-WY2XCF5G.css +653 -0
- package/package.json +3 -2
- package/dist/components/rel-range-picker/rel-range-picker.css +0 -349
- package/dist/styles/vars-v2.css +0 -525
- package/dist/vars-F54UGCHM.css +0 -363
- package/dist/vars-v2-VMGWTFJZ.css +0 -525
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { LitElement, html, css, nothing } from "lit";
|
|
2
2
|
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
-
import "../../styles/vars-v2.css";
|
|
4
3
|
import "@reliability-design/icons/rel-icon";
|
|
5
4
|
|
|
6
5
|
export type TextFieldState = "default" | "error" | "disabled";
|
|
@@ -63,27 +62,37 @@ export class RelTextfield extends LitElement {
|
|
|
63
62
|
|
|
64
63
|
static styles = css`
|
|
65
64
|
:host {
|
|
65
|
+
color: var(--rel-text-default);
|
|
66
66
|
display: block;
|
|
67
|
-
font-family: var(--rel-
|
|
67
|
+
font-family: var(--rel-fonts-font-family);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/* Wrapper */
|
|
71
71
|
.textfield-wrapper {
|
|
72
72
|
display: flex;
|
|
73
73
|
flex-direction: column;
|
|
74
|
-
gap: var(--rel-spacing-
|
|
74
|
+
gap: var(--rel-spacing-2xs);
|
|
75
75
|
width: 100%;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/* Label */
|
|
79
79
|
.textfield-label {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
color: var(--rel-text-label);
|
|
81
|
+
|
|
82
|
+
font-family: var(--rel-body-sm-medium-font-family);
|
|
83
|
+
|
|
84
|
+
font-weight: var(--rel-body-sm-medium-font-weight);
|
|
85
|
+
|
|
86
|
+
font-size: var(--rel-body-sm-medium-font-size);
|
|
87
|
+
|
|
88
|
+
line-height: var(--rel-body-sm-medium-line-height);
|
|
89
|
+
|
|
90
|
+
letter-spacing: var(--rel-body-sm-medium-letter-spacing);
|
|
91
|
+
|
|
83
92
|
}
|
|
84
93
|
|
|
85
94
|
.required-mark {
|
|
86
|
-
color: var(--rel-
|
|
95
|
+
color: var(--rel-text-danger);
|
|
87
96
|
margin-left: 2px;
|
|
88
97
|
}
|
|
89
98
|
|
|
@@ -100,24 +109,26 @@ export class RelTextfield extends LitElement {
|
|
|
100
109
|
|
|
101
110
|
:host([floatinglabel]) .textfield-label {
|
|
102
111
|
position: absolute;
|
|
103
|
-
left: var(--rel-spacing-
|
|
112
|
+
left: var(--rel-spacing-sm);
|
|
104
113
|
top: 50%;
|
|
105
114
|
transform: translateY(-50%);
|
|
106
|
-
|
|
107
|
-
font-weight: var(--rel-fontWeights-regular);
|
|
108
|
-
color: var(--rel-color-text-placeholder);
|
|
115
|
+
color: var(--rel-text-placeholder);
|
|
109
116
|
pointer-events: none;
|
|
110
117
|
transition: top 0.15s ease, font-size 0.15s ease, color 0.15s ease, transform 0.15s ease;
|
|
111
|
-
background: var(--rel-
|
|
118
|
+
background: var(--rel-bg-neutral);
|
|
112
119
|
padding: 0 2px;
|
|
113
120
|
z-index: 1;
|
|
114
|
-
line-height: 1;
|
|
115
121
|
white-space: nowrap;
|
|
122
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
123
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
124
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
125
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
126
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
116
127
|
}
|
|
117
128
|
|
|
118
129
|
/* Floating label in multiline mode anchors to top instead of vertical center */
|
|
119
130
|
:host([floatinglabel][multiline]) .textfield-label {
|
|
120
|
-
top: var(--rel-spacing-
|
|
131
|
+
top: var(--rel-spacing-sm);
|
|
121
132
|
transform: none;
|
|
122
133
|
}
|
|
123
134
|
|
|
@@ -125,46 +136,54 @@ export class RelTextfield extends LitElement {
|
|
|
125
136
|
:host([floatinglabel]) .textfield-wrapper.has-value .textfield-label {
|
|
126
137
|
top: 0;
|
|
127
138
|
transform: translateY(-50%);
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
color: var(--rel-text-default);
|
|
140
|
+
font-family: var(--rel-body-xs-regular-font-family);
|
|
141
|
+
font-weight: var(--rel-body-xs-regular-font-weight);
|
|
142
|
+
font-size: var(--rel-body-xs-regular-font-size);
|
|
143
|
+
line-height: var(--rel-body-xs-regular-line-height);
|
|
144
|
+
letter-spacing: var(--rel-body-xs-regular-letter-spacing);
|
|
130
145
|
}
|
|
131
146
|
|
|
132
147
|
:host([floatinglabel]) .textfield-wrapper.error .textfield-label {
|
|
133
|
-
color: var(--rel-
|
|
148
|
+
color: var(--rel-text-danger);
|
|
134
149
|
}
|
|
135
150
|
|
|
136
151
|
:host([floatinglabel]) .textfield-wrapper.focused:not(.error) .textfield-label {
|
|
137
|
-
color: var(--rel-
|
|
152
|
+
color: var(--rel-text-default);
|
|
138
153
|
}
|
|
139
154
|
|
|
140
155
|
:host([floatinglabel]) .textfield-wrapper.focused.error .textfield-label,
|
|
141
156
|
:host([floatinglabel]) .textfield-wrapper.has-value.error .textfield-label {
|
|
142
157
|
top: 0;
|
|
143
158
|
transform: translateY(-50%);
|
|
144
|
-
|
|
145
|
-
|
|
159
|
+
color: var(--rel-text-danger);
|
|
160
|
+
font-family: var(--rel-body-xs-regular-font-family);
|
|
161
|
+
font-weight: var(--rel-body-xs-regular-font-weight);
|
|
162
|
+
font-size: var(--rel-body-xs-regular-font-size);
|
|
163
|
+
line-height: var(--rel-body-xs-regular-line-height);
|
|
164
|
+
letter-spacing: var(--rel-body-xs-regular-letter-spacing);
|
|
146
165
|
}
|
|
147
166
|
|
|
148
167
|
:host([floatinglabel]) .textfield-input {
|
|
149
|
-
padding-top: var(--rel-spacing-
|
|
150
|
-
padding-bottom: var(--rel-spacing-
|
|
168
|
+
padding-top: var(--rel-spacing-sm);
|
|
169
|
+
padding-bottom: var(--rel-spacing-sm);
|
|
151
170
|
}
|
|
152
171
|
|
|
153
172
|
:host([floatinglabel]) .textfield-input.has-left-icon {
|
|
154
|
-
padding-left: var(--rel-spacing-
|
|
173
|
+
padding-left: var(--rel-spacing-2xl);
|
|
155
174
|
}
|
|
156
175
|
|
|
157
176
|
:host([floatinglabel]) .textfield-label.has-left-icon {
|
|
158
|
-
left: var(--rel-spacing-
|
|
177
|
+
left: var(--rel-spacing-2xl);
|
|
159
178
|
}
|
|
160
179
|
|
|
161
180
|
:host([floatinglabel]) .textfield-wrapper.focused .textfield-label.has-left-icon,
|
|
162
181
|
:host([floatinglabel]) .textfield-wrapper.has-value .textfield-label.has-left-icon {
|
|
163
|
-
left: var(--rel-spacing-
|
|
182
|
+
left: var(--rel-spacing-sm);
|
|
164
183
|
}
|
|
165
184
|
|
|
166
185
|
:host([floatinglabel]) .textfield-wrapper.disabled .textfield-label {
|
|
167
|
-
background: var(--rel-
|
|
186
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
168
187
|
}
|
|
169
188
|
|
|
170
189
|
/* Container */
|
|
@@ -172,15 +191,15 @@ export class RelTextfield extends LitElement {
|
|
|
172
191
|
display: flex;
|
|
173
192
|
align-items: center;
|
|
174
193
|
position: relative;
|
|
175
|
-
border: 1px solid var(--rel-
|
|
176
|
-
border-radius: var(--rel-
|
|
177
|
-
background: var(--rel-
|
|
194
|
+
border: 1px solid var(--rel-border-default);
|
|
195
|
+
border-radius: var(--rel-border-radius-xs);
|
|
196
|
+
background: var(--rel-bg-neutral);
|
|
178
197
|
overflow: hidden;
|
|
179
198
|
transition: border 0.2s;
|
|
180
199
|
}
|
|
181
200
|
|
|
182
201
|
.textfield-container.disabled {
|
|
183
|
-
background: var(--rel-
|
|
202
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
184
203
|
cursor: not-allowed;
|
|
185
204
|
}
|
|
186
205
|
|
|
@@ -194,16 +213,19 @@ export class RelTextfield extends LitElement {
|
|
|
194
213
|
flex: 1;
|
|
195
214
|
border: none;
|
|
196
215
|
outline: none;
|
|
197
|
-
|
|
198
|
-
padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
|
|
216
|
+
padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
|
|
199
217
|
background: transparent;
|
|
200
|
-
|
|
201
|
-
|
|
218
|
+
color: var(--rel-text-body);
|
|
219
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
220
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
221
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
222
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
223
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
202
224
|
}
|
|
203
225
|
|
|
204
226
|
.textfield-input:disabled {
|
|
205
227
|
cursor: not-allowed;
|
|
206
|
-
color: var(--rel-
|
|
228
|
+
color: var(--rel-text-disabled);
|
|
207
229
|
}
|
|
208
230
|
|
|
209
231
|
/* Textarea */
|
|
@@ -221,7 +243,7 @@ export class RelTextfield extends LitElement {
|
|
|
221
243
|
background: transparent;
|
|
222
244
|
}
|
|
223
245
|
textarea.textfield-input::-webkit-scrollbar-thumb {
|
|
224
|
-
background: var(--rel-
|
|
246
|
+
background: var(--rel-text-placeholder);
|
|
225
247
|
border-radius: 2px;
|
|
226
248
|
}
|
|
227
249
|
|
|
@@ -229,7 +251,7 @@ export class RelTextfield extends LitElement {
|
|
|
229
251
|
position: absolute;
|
|
230
252
|
display: flex;
|
|
231
253
|
pointer-events: none;
|
|
232
|
-
color: var(--rel-
|
|
254
|
+
color: var(--rel-text-placeholder);
|
|
233
255
|
}
|
|
234
256
|
|
|
235
257
|
.icon.left {
|
|
@@ -240,33 +262,54 @@ export class RelTextfield extends LitElement {
|
|
|
240
262
|
right: 8px;
|
|
241
263
|
}
|
|
242
264
|
|
|
265
|
+
.textfield-wrapper.small .textfield-support {
|
|
266
|
+
font-weight: var(--rel-body-xs-medium-font-weight);
|
|
267
|
+
}
|
|
268
|
+
|
|
243
269
|
.textfield-wrapper.small .textfield-input {
|
|
244
|
-
padding: var(--rel-spacing-
|
|
245
|
-
font-
|
|
270
|
+
padding: var(--rel-spacing-xs) var(--rel-spacing-sm);
|
|
271
|
+
font-family: var(--rel-body-sm-regular-font-family);
|
|
272
|
+
font-weight: var(--rel-body-sm-regular-font-weight);
|
|
273
|
+
font-size: var(--rel-body-sm-regular-font-size);
|
|
274
|
+
line-height: var(--rel-body-sm-regular-line-height);
|
|
275
|
+
letter-spacing: var(--rel-body-sm-regular-letter-spacing);
|
|
246
276
|
}
|
|
247
277
|
|
|
248
278
|
.textfield-wrapper.medium .textfield-input {
|
|
249
|
-
padding: var(--rel-spacing-
|
|
250
|
-
font-
|
|
279
|
+
padding: var(--rel-spacing-sm) var(--rel-spacing-md);
|
|
280
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
281
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
282
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
283
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
284
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
251
285
|
}
|
|
252
286
|
|
|
253
287
|
.textfield-wrapper.large .textfield-input {
|
|
254
|
-
padding: var(--rel-spacing-
|
|
255
|
-
font-
|
|
288
|
+
padding: var(--rel-spacing-md) var(--rel-spacing-md);
|
|
289
|
+
font-family: var(--rel-body-lg-regular-font-family);
|
|
290
|
+
font-weight: var(--rel-body-lg-regular-font-weight);
|
|
291
|
+
font-size: var(--rel-body-lg-regular-font-size);
|
|
292
|
+
line-height: var(--rel-body-lg-regular-line-height);
|
|
293
|
+
letter-spacing: var(--rel-body-lg-regular-letter-spacing);
|
|
256
294
|
}
|
|
257
295
|
|
|
258
296
|
/* Adjust padding when icons are present */
|
|
259
297
|
.textfield-wrapper .textfield-input.has-left-icon {
|
|
260
|
-
padding-left: var(--rel-spacing-
|
|
298
|
+
padding-left: var(--rel-spacing-2xl);
|
|
261
299
|
}
|
|
262
300
|
|
|
263
301
|
.textfield-wrapper .textfield-input.has-right-icon {
|
|
264
|
-
padding-right: var(--rel-spacing-
|
|
302
|
+
padding-right: var(--rel-spacing-2xl);
|
|
265
303
|
}
|
|
266
304
|
|
|
267
305
|
/* States */
|
|
306
|
+
/* Hover (Figma State=Hover): border-strong at 1px — no focus ring */
|
|
307
|
+
.textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {
|
|
308
|
+
border-color: var(--rel-border-strong);
|
|
309
|
+
}
|
|
310
|
+
|
|
268
311
|
.textfield-wrapper.focused .textfield-container {
|
|
269
|
-
border-color: var(--rel-
|
|
312
|
+
border-color: var(--rel-text-default);
|
|
270
313
|
}
|
|
271
314
|
|
|
272
315
|
.textfield-input:focus-visible {
|
|
@@ -275,37 +318,47 @@ export class RelTextfield extends LitElement {
|
|
|
275
318
|
|
|
276
319
|
.textfield-wrapper.focused .textfield-container,
|
|
277
320
|
.textfield-container:focus-within {
|
|
278
|
-
border-color: var(--rel-
|
|
279
|
-
box-shadow: 0 0 0 1px var(--rel-
|
|
321
|
+
border-color: var(--rel-border-strong);
|
|
322
|
+
box-shadow: 0 0 0 1px var(--rel-border-strong);
|
|
280
323
|
}
|
|
281
324
|
|
|
282
325
|
.textfield-wrapper.error .textfield-container,
|
|
283
326
|
.textfield-wrapper.error .textfield-container:focus-within {
|
|
284
|
-
border-color: var(--rel-
|
|
327
|
+
border-color: var(--rel-border-danger);
|
|
285
328
|
box-shadow: none;
|
|
286
329
|
}
|
|
287
330
|
|
|
288
331
|
.textfield-wrapper.disabled .textfield-container {
|
|
289
|
-
border-color: var(--rel-
|
|
332
|
+
border-color: var(--rel-border-default);
|
|
290
333
|
}
|
|
291
334
|
|
|
292
335
|
.textfield-wrapper.disabled .textfield-label {
|
|
293
|
-
color: var(--rel-
|
|
336
|
+
color: var(--rel-text-disabled);
|
|
294
337
|
}
|
|
295
338
|
|
|
296
339
|
/* Supporting text */
|
|
297
340
|
.textfield-support {
|
|
298
|
-
|
|
299
|
-
|
|
341
|
+
color: var(--rel-text-caption);
|
|
342
|
+
|
|
343
|
+
font-family: var(--rel-body-xs-regular-font-family);
|
|
344
|
+
|
|
345
|
+
font-weight: var(--rel-body-xs-regular-font-weight);
|
|
346
|
+
|
|
347
|
+
font-size: var(--rel-body-xs-regular-font-size);
|
|
348
|
+
|
|
349
|
+
line-height: var(--rel-body-xs-regular-line-height);
|
|
350
|
+
|
|
351
|
+
letter-spacing: var(--rel-body-xs-regular-letter-spacing);
|
|
352
|
+
|
|
300
353
|
}
|
|
301
354
|
|
|
302
355
|
.textfield-support.error {
|
|
303
|
-
color: var(--rel-
|
|
356
|
+
color: var(--rel-text-danger);
|
|
304
357
|
}
|
|
305
358
|
|
|
306
359
|
/* Placeholder */
|
|
307
360
|
.textfield-input::placeholder {
|
|
308
|
-
color: var(--rel-
|
|
361
|
+
color: var(--rel-text-placeholder);
|
|
309
362
|
}
|
|
310
363
|
|
|
311
364
|
:host([floatinglabel]) .textfield-input::placeholder {
|
|
@@ -320,34 +373,38 @@ export class RelTextfield extends LitElement {
|
|
|
320
373
|
.textfield-input:-webkit-autofill,
|
|
321
374
|
.textfield-input:-webkit-autofill:hover,
|
|
322
375
|
.textfield-input:-webkit-autofill:focus {
|
|
323
|
-
-webkit-box-shadow: 0 0 0px 1000px var(--rel-
|
|
324
|
-
-webkit-text-fill-color: var(--rel-
|
|
376
|
+
-webkit-box-shadow: 0 0 0px 1000px var(--rel-bg-surface) inset;
|
|
377
|
+
-webkit-text-fill-color: var(--rel-text-default);
|
|
325
378
|
}
|
|
326
379
|
|
|
327
380
|
/* ── Underline variant ── */
|
|
328
381
|
:host([variant="underline"]) .textfield-container {
|
|
329
382
|
border: none;
|
|
330
|
-
border-bottom: 2px solid var(--rel-
|
|
383
|
+
border-bottom: 2px solid var(--rel-border-default);
|
|
331
384
|
border-radius: 0;
|
|
332
|
-
background: var(--rel-
|
|
385
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
333
386
|
box-shadow: none;
|
|
334
387
|
overflow: visible;
|
|
335
388
|
}
|
|
336
389
|
|
|
390
|
+
:host([variant="underline"]) .textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {
|
|
391
|
+
border-bottom-color: var(--rel-border-strong);
|
|
392
|
+
}
|
|
393
|
+
|
|
337
394
|
:host([variant="underline"]) .textfield-wrapper.focused .textfield-container,
|
|
338
395
|
:host([variant="underline"]) .textfield-container:focus-within {
|
|
339
|
-
border-bottom: 2px solid var(--rel-
|
|
396
|
+
border-bottom: 2px solid var(--rel-text-default);
|
|
340
397
|
box-shadow: none;
|
|
341
398
|
}
|
|
342
399
|
|
|
343
400
|
:host([variant="underline"]) .textfield-wrapper.error .textfield-container {
|
|
344
|
-
border-bottom: 2px solid var(--rel-
|
|
401
|
+
border-bottom: 2px solid var(--rel-border-danger);
|
|
345
402
|
box-shadow: none;
|
|
346
403
|
}
|
|
347
404
|
|
|
348
405
|
:host([variant="underline"]) .textfield-wrapper.disabled .textfield-container {
|
|
349
|
-
border-bottom: 2px solid var(--rel-
|
|
350
|
-
background: var(--rel-
|
|
406
|
+
border-bottom: 2px solid var(--rel-border-default);
|
|
407
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
351
408
|
}
|
|
352
409
|
|
|
353
410
|
/* Remove border radius on input for underline variant */
|
|
@@ -358,8 +415,8 @@ export class RelTextfield extends LitElement {
|
|
|
358
415
|
/* Dark mode — underline variant uses same border colors as default */
|
|
359
416
|
:host-context([data-theme="dark"]) :host([variant="underline"]) .textfield-container,
|
|
360
417
|
:host-context(.dark) :host([variant="underline"]) .textfield-container {
|
|
361
|
-
background: var(--rel-
|
|
362
|
-
border-bottom-color: var(--rel-
|
|
418
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
419
|
+
border-bottom-color: var(--rel-border-default);
|
|
363
420
|
}
|
|
364
421
|
|
|
365
422
|
/* ── Full-width control (fullWidth defaults true → block, fills parent) ── */
|
|
@@ -379,19 +436,21 @@ export class RelTextfield extends LitElement {
|
|
|
379
436
|
margin: 0;
|
|
380
437
|
min-inline-size: 0;
|
|
381
438
|
padding: 0;
|
|
382
|
-
border: 1px solid var(--rel-
|
|
383
|
-
border-radius: var(--rel-
|
|
384
|
-
background: var(--rel-
|
|
439
|
+
border: 1px solid var(--rel-border-default);
|
|
440
|
+
border-radius: var(--rel-border-radius-xs);
|
|
441
|
+
background: var(--rel-bg-neutral);
|
|
385
442
|
transition: border-color 0.2s;
|
|
386
443
|
}
|
|
387
444
|
|
|
388
445
|
:host([variant="legend"]) .field-legend {
|
|
389
|
-
margin-left: var(--rel-spacing-
|
|
390
|
-
padding: 0 var(--rel-spacing-
|
|
391
|
-
|
|
392
|
-
font-
|
|
393
|
-
|
|
394
|
-
|
|
446
|
+
margin-left: var(--rel-spacing-sm);
|
|
447
|
+
padding: 0 var(--rel-spacing-2xs);
|
|
448
|
+
color: var(--rel-text-label);
|
|
449
|
+
font-family: var(--rel-body-sm-medium-font-family);
|
|
450
|
+
font-weight: var(--rel-body-sm-medium-font-weight);
|
|
451
|
+
font-size: var(--rel-body-sm-medium-font-size);
|
|
452
|
+
line-height: var(--rel-body-sm-medium-line-height);
|
|
453
|
+
letter-spacing: var(--rel-body-sm-medium-letter-spacing);
|
|
395
454
|
}
|
|
396
455
|
|
|
397
456
|
:host([variant="legend"]) .textfield-input {
|
|
@@ -402,17 +461,18 @@ export class RelTextfield extends LitElement {
|
|
|
402
461
|
/* Prefix icon (legend): vertically centered; input inset via has-left-icon */
|
|
403
462
|
:host([variant="legend"]) .icon.left {
|
|
404
463
|
top: 50%;
|
|
405
|
-
left: var(--rel-spacing-
|
|
464
|
+
left: var(--rel-spacing-sm);
|
|
406
465
|
transform: translateY(-50%);
|
|
407
466
|
}
|
|
408
467
|
:host([variant="legend"]) .field-fieldset.multiline .icon.left {
|
|
409
|
-
top: var(--rel-spacing-
|
|
468
|
+
top: var(--rel-spacing-sm);
|
|
410
469
|
transform: none;
|
|
411
470
|
}
|
|
412
471
|
|
|
413
472
|
/* Hover */
|
|
414
473
|
:host([variant="legend"]) .field-fieldset:hover {
|
|
415
|
-
border-color: var(--rel-
|
|
474
|
+
border-color: var(--rel-border-accent);
|
|
475
|
+
border-color: var(--rel-text-placeholder);
|
|
416
476
|
}
|
|
417
477
|
|
|
418
478
|
/* Focus — border-color only. A box-shadow/outline ring hugs the full
|
|
@@ -420,31 +480,31 @@ export class RelTextfield extends LitElement {
|
|
|
420
480
|
strike through the legend. The legend also recolors on focus (below). */
|
|
421
481
|
:host([variant="legend"]) .textfield-wrapper.focused .field-fieldset,
|
|
422
482
|
:host([variant="legend"]) .field-fieldset:focus-within {
|
|
423
|
-
border-color: var(--rel-
|
|
483
|
+
border-color: var(--rel-border-focus);
|
|
424
484
|
box-shadow: none;
|
|
425
485
|
}
|
|
426
486
|
:host([variant="legend"]) .textfield-wrapper.focused .field-legend,
|
|
427
487
|
:host([variant="legend"]) .field-fieldset:focus-within .field-legend {
|
|
428
|
-
color: var(--rel-
|
|
488
|
+
color: var(--rel-border-focus);
|
|
429
489
|
}
|
|
430
490
|
|
|
431
491
|
/* Error */
|
|
432
492
|
:host([variant="legend"]) .textfield-wrapper.error .field-fieldset {
|
|
433
|
-
border-color: var(--rel-
|
|
493
|
+
border-color: var(--rel-border-danger);
|
|
434
494
|
box-shadow: none;
|
|
435
495
|
}
|
|
436
496
|
:host([variant="legend"]) .textfield-wrapper.error .field-legend {
|
|
437
|
-
color: var(--rel-
|
|
497
|
+
color: var(--rel-text-danger);
|
|
438
498
|
}
|
|
439
499
|
|
|
440
500
|
/* Disabled */
|
|
441
501
|
:host([variant="legend"]) .textfield-wrapper.disabled .field-fieldset {
|
|
442
|
-
background: var(--rel-
|
|
443
|
-
border-color: var(--rel-
|
|
502
|
+
background: var(--rel-bg-neutral-elevated-1);
|
|
503
|
+
border-color: var(--rel-border-default);
|
|
444
504
|
cursor: not-allowed;
|
|
445
505
|
}
|
|
446
506
|
:host([variant="legend"]) .textfield-wrapper.disabled .field-legend {
|
|
447
|
-
color: var(--rel-
|
|
507
|
+
color: var(--rel-text-disabled);
|
|
448
508
|
}
|
|
449
509
|
|
|
450
510
|
/* Readonly */
|
|
@@ -454,10 +514,30 @@ export class RelTextfield extends LitElement {
|
|
|
454
514
|
|
|
455
515
|
/* Legend font tracks size */
|
|
456
516
|
:host([variant="legend"]) .textfield-wrapper.small .field-legend {
|
|
457
|
-
|
|
517
|
+
|
|
518
|
+
font-family: var(--rel-body-xs-regular-font-family);
|
|
519
|
+
|
|
520
|
+
font-weight: var(--rel-body-xs-regular-font-weight);
|
|
521
|
+
|
|
522
|
+
font-size: var(--rel-body-xs-regular-font-size);
|
|
523
|
+
|
|
524
|
+
line-height: var(--rel-body-xs-regular-line-height);
|
|
525
|
+
|
|
526
|
+
letter-spacing: var(--rel-body-xs-regular-letter-spacing);
|
|
527
|
+
|
|
458
528
|
}
|
|
459
529
|
:host([variant="legend"]) .textfield-wrapper.large .field-legend {
|
|
460
|
-
|
|
530
|
+
|
|
531
|
+
font-family: var(--rel-body-md-regular-font-family);
|
|
532
|
+
|
|
533
|
+
font-weight: var(--rel-body-md-regular-font-weight);
|
|
534
|
+
|
|
535
|
+
font-size: var(--rel-body-md-regular-font-size);
|
|
536
|
+
|
|
537
|
+
line-height: var(--rel-body-md-regular-line-height);
|
|
538
|
+
|
|
539
|
+
letter-spacing: var(--rel-body-md-regular-letter-spacing);
|
|
540
|
+
|
|
461
541
|
}
|
|
462
542
|
`;
|
|
463
543
|
|
|
@@ -532,6 +612,7 @@ export class RelTextfield extends LitElement {
|
|
|
532
612
|
const labelTemplate = (extraClass = "") => {
|
|
533
613
|
if (!this.label) return "";
|
|
534
614
|
return html`<label
|
|
615
|
+
part="label"
|
|
535
616
|
class="textfield-label${extraClass}"
|
|
536
617
|
for="${inputId}"
|
|
537
618
|
>${this.label}${this.required ? html`<span class="required-mark" aria-hidden="true">*</span>` : ""}</label>`;
|
|
@@ -540,7 +621,7 @@ export class RelTextfield extends LitElement {
|
|
|
540
621
|
const ariaLabelledby = this.variant === "legend" && this.label ? legendId : undefined;
|
|
541
622
|
|
|
542
623
|
const inputTemplate = this.multiline
|
|
543
|
-
? html`<textarea
|
|
624
|
+
? html`<textarea part="input"
|
|
544
625
|
id="${inputId}"
|
|
545
626
|
class="${inputClasses}"
|
|
546
627
|
placeholder="${this.placeholder}"
|
|
@@ -559,7 +640,7 @@ export class RelTextfield extends LitElement {
|
|
|
559
640
|
@blur="${this.handleBlur}"
|
|
560
641
|
@input="${this.handleInput}"
|
|
561
642
|
></textarea>`
|
|
562
|
-
: html`<input
|
|
643
|
+
: html`<input part="input"
|
|
563
644
|
type="${this.type}"
|
|
564
645
|
id="${inputId}"
|
|
565
646
|
class="${inputClasses}"
|
|
@@ -591,7 +672,7 @@ export class RelTextfield extends LitElement {
|
|
|
591
672
|
: "";
|
|
592
673
|
|
|
593
674
|
const belowTemplate = belowText
|
|
594
|
-
? html`<div class="textfield-support ${isError ? "error" : ""}" id="${describedById}">
|
|
675
|
+
? html`<div part="helper" class="textfield-support ${isError ? "error" : ""}" id="${describedById}">
|
|
595
676
|
${belowText}
|
|
596
677
|
</div>`
|
|
597
678
|
: "";
|
|
@@ -604,7 +685,7 @@ export class RelTextfield extends LitElement {
|
|
|
604
685
|
// is always present (only its content is dynamic).
|
|
605
686
|
return html`
|
|
606
687
|
<div class="${wrapperClasses}">
|
|
607
|
-
<fieldset class="${fieldsetClass}"><legend class="field-legend" id="${legendId}">${this.label ?? ""}${this.required ? html`<span class="required-mark" aria-hidden="true">*</span>` : ""}</legend>
|
|
688
|
+
<fieldset part="control" class="${fieldsetClass}"><legend class="field-legend" id="${legendId}">${this.label ?? ""}${this.required ? html`<span class="required-mark" aria-hidden="true">*</span>` : ""}</legend>
|
|
608
689
|
${!this.multiline ? leadingIconTemplate : ""}
|
|
609
690
|
${inputTemplate}
|
|
610
691
|
</fieldset>
|
|
@@ -617,7 +698,7 @@ export class RelTextfield extends LitElement {
|
|
|
617
698
|
<div class="${wrapperClasses}">
|
|
618
699
|
${!this.floatingLabel ? labelTemplate() : ""}
|
|
619
700
|
|
|
620
|
-
<div class="${["textfield-container", this.isDisabled ? "disabled" : "", this.multiline ? "multiline" : ""].filter(Boolean).join(" ")}">
|
|
701
|
+
<div part="control" class="${["textfield-container", this.isDisabled ? "disabled" : "", this.multiline ? "multiline" : ""].filter(Boolean).join(" ")}">
|
|
621
702
|
${this.floatingLabel
|
|
622
703
|
? labelTemplate(leadingIcon && !this.multiline ? " has-left-icon" : "")
|
|
623
704
|
: ""}
|
|
@@ -98,25 +98,25 @@ None exposed.
|
|
|
98
98
|
## Tokens / CSS Variables
|
|
99
99
|
|
|
100
100
|
### Semantic Tokens
|
|
101
|
-
- `--rel-
|
|
102
|
-
- `--rel-
|
|
101
|
+
- `--rel-fonts-font-family` - Font family
|
|
102
|
+
- `--rel-body-md-regular-font-size` - Font size
|
|
103
103
|
|
|
104
104
|
### Spacing Tokens
|
|
105
|
-
- `--rel-spacing-
|
|
106
|
-
- `--rel-spacing-
|
|
107
|
-
- `--rel-spacing-
|
|
105
|
+
- `--rel-spacing-sm` - Gap between elements
|
|
106
|
+
- `--rel-spacing-md` - Padding
|
|
107
|
+
- `--rel-spacing-2xs` - Close button padding and margin
|
|
108
108
|
|
|
109
109
|
### Color Tokens
|
|
110
|
-
- `--rel-
|
|
111
|
-
- `--rel-
|
|
112
|
-
- `--rel-
|
|
113
|
-
- `--rel-
|
|
110
|
+
- `--rel-bg-neutral-inverse-1` - Default background color (dark gray)
|
|
111
|
+
- `--rel-text-danger` - Error background color
|
|
112
|
+
- `--rel-bg-surface` - Text and focus outline color
|
|
113
|
+
- `--rel-bg-brand` - Action button text color
|
|
114
114
|
|
|
115
115
|
### Shadow Tokens
|
|
116
116
|
- `--rel-shadows-shadow-300` - Drop shadow
|
|
117
117
|
|
|
118
118
|
### Border Tokens
|
|
119
|
-
- `--rel-
|
|
119
|
+
- `--rel-border-radius-sm` - Border radius
|
|
120
120
|
|
|
121
121
|
## Accessibility
|
|
122
122
|
- Uses `role="status"` and `aria-live="polite"` for screen reader announcements
|
|
@@ -144,5 +144,5 @@ None exposed.
|
|
|
144
144
|
- The component includes a `fadeInUp` animation (20px translateY → 0, opacity 0 → 1) on appearance
|
|
145
145
|
- Animation disabled when `prefers-reduced-motion: reduce` is set
|
|
146
146
|
- When `visible` is false, `hidden` class applies `display: none`
|
|
147
|
-
- **Type variants**: `default` uses `--rel-
|
|
147
|
+
- **Type variants**: `default` uses `--rel-bg-neutral-inverse-1`, `error` uses `--rel-text-danger`
|
|
148
148
|
- The toast appears inline-flex, so it sizes to content width
|