@loidolt/theme-styles 0.5.0 → 0.6.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/package.json +2 -2
- package/src/accessibility.css +65 -4
- package/src/components/actions.css +13 -0
- package/src/components/data.css +111 -0
- package/src/components/feedback.css +93 -0
- package/src/components/forms.css +316 -0
- package/src/components/layout.css +65 -0
- package/src/components/media.css +478 -0
- package/src/components/overlays.css +138 -0
- package/src/components/selection.css +37 -0
- package/src/components/surfaces.css +63 -0
- package/src/components.css +1 -0
- package/src/utilities.css +16 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loidolt/theme-styles",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Base styles, fonts, accessibility helpers, and utilities for Loidolt applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"build": "node -e \"console.log('theme-styles: source CSS is publish-ready')\""
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@loidolt/theme-tokens": "^0.
|
|
31
|
+
"@loidolt/theme-tokens": "^0.6.0"
|
|
32
32
|
},
|
|
33
33
|
"publishConfig": {
|
|
34
34
|
"access": "public",
|
package/src/accessibility.css
CHANGED
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
.ldt-dialog__body,
|
|
21
21
|
.ldt-drawer__body,
|
|
22
22
|
.ldt-tabs__list,
|
|
23
|
-
.ldt-toggle-group
|
|
23
|
+
.ldt-toggle-group,
|
|
24
|
+
.ldt-listbox,
|
|
25
|
+
.ldt-media-grid
|
|
24
26
|
)
|
|
25
27
|
:where(:focus-visible) {
|
|
26
28
|
outline-offset: -2px;
|
|
@@ -41,6 +43,20 @@
|
|
|
41
43
|
border: 0 !important;
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
/* Hidden until it, or something inside it, takes focus — for a "skip" or "back to top" link
|
|
47
|
+
that should not occupy the layout for pointer users. */
|
|
48
|
+
.ldt-sr-only-focusable:not(:focus, :focus-within) {
|
|
49
|
+
position: absolute !important;
|
|
50
|
+
width: 1px !important;
|
|
51
|
+
height: 1px !important;
|
|
52
|
+
padding: 0 !important;
|
|
53
|
+
margin: -1px !important;
|
|
54
|
+
overflow: hidden !important;
|
|
55
|
+
clip: rect(0, 0, 0, 0) !important;
|
|
56
|
+
white-space: nowrap !important;
|
|
57
|
+
border: 0 !important;
|
|
58
|
+
}
|
|
59
|
+
|
|
44
60
|
.ldt-skip-link {
|
|
45
61
|
position: fixed;
|
|
46
62
|
z-index: var(--loidolt-z-skip-link);
|
|
@@ -58,6 +74,20 @@
|
|
|
58
74
|
min-width: 44px;
|
|
59
75
|
min-height: 44px;
|
|
60
76
|
}
|
|
77
|
+
/* Enlarges the hit area without moving anything: a small glyph button in dense UI keeps its
|
|
78
|
+
visual size, and an invisible 44px square centred on it takes the press. */
|
|
79
|
+
.ldt-touch-target-expand {
|
|
80
|
+
position: relative;
|
|
81
|
+
}
|
|
82
|
+
.ldt-touch-target-expand::after {
|
|
83
|
+
content: '';
|
|
84
|
+
position: absolute;
|
|
85
|
+
top: 50%;
|
|
86
|
+
left: 50%;
|
|
87
|
+
width: max(100%, 44px);
|
|
88
|
+
height: max(100%, 44px);
|
|
89
|
+
transform: translate(-50%, -50%);
|
|
90
|
+
}
|
|
61
91
|
|
|
62
92
|
/* Preserve the compact visual density for mouse/keyboard layouts, but give touch-first devices
|
|
63
93
|
the 44px target size recommended for comfortable coarse-pointer operation. */
|
|
@@ -73,17 +103,48 @@
|
|
|
73
103
|
.ldt-choice,
|
|
74
104
|
.ldt-switch,
|
|
75
105
|
.ldt-number-field__button,
|
|
76
|
-
.ldt-menu__item
|
|
106
|
+
.ldt-menu__item,
|
|
107
|
+
.ldt-listbox__item,
|
|
108
|
+
.ldt-combobox,
|
|
109
|
+
.ldt-password-input,
|
|
110
|
+
.ldt-chip,
|
|
111
|
+
.ldt-data-table__edit,
|
|
112
|
+
.ldt-media-controls__button,
|
|
113
|
+
.ldt-media-controls__speed,
|
|
114
|
+
.ldt-media-controls__range,
|
|
115
|
+
.ldt-lightbox__control,
|
|
116
|
+
.ldt-media-carousel__control
|
|
77
117
|
) {
|
|
78
118
|
min-height: 44px;
|
|
79
119
|
}
|
|
80
|
-
:where(
|
|
120
|
+
:where(
|
|
121
|
+
.ldt-icon-button,
|
|
122
|
+
.ldt-number-field__button,
|
|
123
|
+
.ldt-combobox__trigger,
|
|
124
|
+
.ldt-password-input__toggle,
|
|
125
|
+
.ldt-chip__remove,
|
|
126
|
+
.ldt-media-controls__button,
|
|
127
|
+
.ldt-lightbox__control,
|
|
128
|
+
.ldt-media-carousel__control
|
|
129
|
+
) {
|
|
81
130
|
min-width: 44px;
|
|
82
131
|
}
|
|
132
|
+
/* The thumb keeps its drawn size; an invisible 44px square around it takes the touch. */
|
|
133
|
+
.ldt-slider__thumb {
|
|
134
|
+
position: relative;
|
|
135
|
+
}
|
|
136
|
+
.ldt-slider__thumb::after {
|
|
137
|
+
content: '';
|
|
138
|
+
position: absolute;
|
|
139
|
+
inset: 50% auto auto 50%;
|
|
140
|
+
width: 44px;
|
|
141
|
+
height: 44px;
|
|
142
|
+
transform: translate(-50%, -50%);
|
|
143
|
+
}
|
|
83
144
|
:where(.ldt-icon-button) {
|
|
84
145
|
width: 44px;
|
|
85
146
|
}
|
|
86
|
-
.ldt-number-field {
|
|
147
|
+
.ldt-number-field:not(.ldt-number-field--bare) {
|
|
87
148
|
grid-template-columns: 44px minmax(0, 1fr) 44px;
|
|
88
149
|
}
|
|
89
150
|
}
|
|
@@ -104,6 +104,19 @@
|
|
|
104
104
|
border-radius: 50%;
|
|
105
105
|
animation: ldt-spin 0.7s linear infinite;
|
|
106
106
|
}
|
|
107
|
+
.ldt-spinner--sm {
|
|
108
|
+
width: 0.875rem;
|
|
109
|
+
height: 0.875rem;
|
|
110
|
+
}
|
|
111
|
+
.ldt-spinner--md {
|
|
112
|
+
width: 1.25rem;
|
|
113
|
+
height: 1.25rem;
|
|
114
|
+
}
|
|
115
|
+
.ldt-spinner--lg {
|
|
116
|
+
width: 2rem;
|
|
117
|
+
height: 2rem;
|
|
118
|
+
border-width: 3px;
|
|
119
|
+
}
|
|
107
120
|
@keyframes ldt-spin {
|
|
108
121
|
to {
|
|
109
122
|
transform: rotate(360deg);
|
package/src/components/data.css
CHANGED
|
@@ -196,3 +196,114 @@
|
|
|
196
196
|
.ldt-record-stepper__count {
|
|
197
197
|
white-space: nowrap;
|
|
198
198
|
}
|
|
199
|
+
/* The filters narrowing a list, each removable on its own. Sits under the list's toolbar. */
|
|
200
|
+
.ldt-filter-chips {
|
|
201
|
+
display: flex;
|
|
202
|
+
flex-wrap: wrap;
|
|
203
|
+
align-items: center;
|
|
204
|
+
gap: var(--loidolt-space-2);
|
|
205
|
+
}
|
|
206
|
+
.ldt-filter-chips__list {
|
|
207
|
+
display: flex;
|
|
208
|
+
flex-wrap: wrap;
|
|
209
|
+
gap: var(--loidolt-space-2);
|
|
210
|
+
margin: 0;
|
|
211
|
+
padding: 0;
|
|
212
|
+
list-style: none;
|
|
213
|
+
}
|
|
214
|
+
/* DataTable: selection, editable cells, responsive columns, virtual spacers. */
|
|
215
|
+
.ldt-table :where(th, td).ldt-data-table__select {
|
|
216
|
+
width: 2.75rem;
|
|
217
|
+
padding-inline-end: 0;
|
|
218
|
+
}
|
|
219
|
+
.ldt-data-table__radio {
|
|
220
|
+
width: 1rem;
|
|
221
|
+
height: 1rem;
|
|
222
|
+
accent-color: var(--loidolt-accent);
|
|
223
|
+
}
|
|
224
|
+
.ldt-table tbody tr[data-selected] {
|
|
225
|
+
background: var(--loidolt-surface-alt);
|
|
226
|
+
}
|
|
227
|
+
.ldt-table tbody tr[data-selected] td:first-child {
|
|
228
|
+
box-shadow: inset 3px 0 0 var(--loidolt-accent);
|
|
229
|
+
}
|
|
230
|
+
.ldt-data-table__spacer td {
|
|
231
|
+
padding: 0;
|
|
232
|
+
border: 0;
|
|
233
|
+
}
|
|
234
|
+
/* The resting state of an editable cell: reads as the value, reveals itself on hover or focus. */
|
|
235
|
+
.ldt-data-table__edit {
|
|
236
|
+
min-height: 1.5rem;
|
|
237
|
+
width: 100%;
|
|
238
|
+
border: 0;
|
|
239
|
+
border-bottom: var(--loidolt-border-width) dashed transparent;
|
|
240
|
+
padding: 0;
|
|
241
|
+
color: inherit;
|
|
242
|
+
background: transparent;
|
|
243
|
+
font: inherit;
|
|
244
|
+
text-align: inherit;
|
|
245
|
+
cursor: text;
|
|
246
|
+
}
|
|
247
|
+
.ldt-data-table__edit:hover {
|
|
248
|
+
border-bottom-color: var(--loidolt-border-control);
|
|
249
|
+
}
|
|
250
|
+
.ldt-data-table__edit-input {
|
|
251
|
+
width: 100%;
|
|
252
|
+
min-height: 1.5rem;
|
|
253
|
+
border: 0;
|
|
254
|
+
border-bottom: var(--loidolt-border-width) solid var(--loidolt-accent);
|
|
255
|
+
padding: 0;
|
|
256
|
+
color: inherit;
|
|
257
|
+
background: var(--loidolt-surface-input);
|
|
258
|
+
font: inherit;
|
|
259
|
+
text-align: inherit;
|
|
260
|
+
}
|
|
261
|
+
@media (max-width: 1024px) {
|
|
262
|
+
.ldt-table :where(th, td)[data-hide-below='expanded'] {
|
|
263
|
+
display: none;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
@media (max-width: 760px) {
|
|
267
|
+
.ldt-table :where(th, td)[data-hide-below='compact'] {
|
|
268
|
+
display: none;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* A faceted-filter trigger carries the number of values chosen. */
|
|
273
|
+
.ldt-facet__count {
|
|
274
|
+
display: inline-grid;
|
|
275
|
+
min-width: 1.25rem;
|
|
276
|
+
place-items: center;
|
|
277
|
+
margin-inline-start: 0.4rem;
|
|
278
|
+
padding-inline: 0.3rem;
|
|
279
|
+
color: var(--loidolt-on-accent);
|
|
280
|
+
background: var(--loidolt-accent);
|
|
281
|
+
font-size: var(--loidolt-font-size-xs);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* The footer under a data table: status line, rows-per-page, page trail. */
|
|
285
|
+
.ldt-data-table-pagination {
|
|
286
|
+
display: flex;
|
|
287
|
+
flex-wrap: wrap;
|
|
288
|
+
align-items: center;
|
|
289
|
+
justify-content: space-between;
|
|
290
|
+
gap: var(--loidolt-space-3);
|
|
291
|
+
}
|
|
292
|
+
.ldt-data-table-pagination__summary {
|
|
293
|
+
margin: 0;
|
|
294
|
+
color: var(--loidolt-text-muted);
|
|
295
|
+
font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
|
|
296
|
+
font-variant-numeric: tabular-nums;
|
|
297
|
+
}
|
|
298
|
+
.ldt-data-table-pagination__size {
|
|
299
|
+
display: flex;
|
|
300
|
+
align-items: center;
|
|
301
|
+
gap: var(--loidolt-space-2);
|
|
302
|
+
color: var(--loidolt-text-muted);
|
|
303
|
+
font: var(--loidolt-font-size-xs) var(--loidolt-font-utility);
|
|
304
|
+
letter-spacing: var(--loidolt-font-tracking-utility);
|
|
305
|
+
text-transform: uppercase;
|
|
306
|
+
}
|
|
307
|
+
.ldt-data-table-pagination__size .ldt-select {
|
|
308
|
+
width: auto;
|
|
309
|
+
}
|
|
@@ -45,6 +45,38 @@
|
|
|
45
45
|
transform-origin: left center;
|
|
46
46
|
transition: transform var(--loidolt-motion-normal) var(--loidolt-motion-easing);
|
|
47
47
|
}
|
|
48
|
+
.ldt-progress--sm {
|
|
49
|
+
height: 0.2rem;
|
|
50
|
+
}
|
|
51
|
+
.ldt-progress--lg {
|
|
52
|
+
height: 0.6rem;
|
|
53
|
+
}
|
|
54
|
+
.ldt-progress--success .ldt-progress__bar {
|
|
55
|
+
background: var(--loidolt-success);
|
|
56
|
+
}
|
|
57
|
+
.ldt-progress--warning .ldt-progress__bar {
|
|
58
|
+
background: var(--loidolt-warning);
|
|
59
|
+
}
|
|
60
|
+
.ldt-progress--error .ldt-progress__bar {
|
|
61
|
+
background: var(--loidolt-danger);
|
|
62
|
+
}
|
|
63
|
+
.ldt-progress--info .ldt-progress__bar {
|
|
64
|
+
background: var(--loidolt-info);
|
|
65
|
+
}
|
|
66
|
+
.ldt-progress-field {
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: var(--loidolt-space-3);
|
|
70
|
+
}
|
|
71
|
+
.ldt-progress-field__value {
|
|
72
|
+
flex: none;
|
|
73
|
+
min-width: 4ch;
|
|
74
|
+
white-space: nowrap;
|
|
75
|
+
color: var(--loidolt-text-muted);
|
|
76
|
+
font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
|
|
77
|
+
font-variant-numeric: tabular-nums;
|
|
78
|
+
text-align: end;
|
|
79
|
+
}
|
|
48
80
|
.ldt-progress--indeterminate .ldt-progress__bar {
|
|
49
81
|
width: 40%;
|
|
50
82
|
transform: none;
|
|
@@ -69,6 +101,38 @@
|
|
|
69
101
|
background-size: 200% 100%;
|
|
70
102
|
animation: ldt-shimmer 1.5s linear infinite;
|
|
71
103
|
}
|
|
104
|
+
/* Shapes take the metrics of what they stand in for, so the layout does not jump on load. */
|
|
105
|
+
.ldt-skeleton--text,
|
|
106
|
+
.ldt-skeleton--title,
|
|
107
|
+
.ldt-skeleton--avatar,
|
|
108
|
+
.ldt-skeleton--button,
|
|
109
|
+
.ldt-skeleton--card {
|
|
110
|
+
display: block;
|
|
111
|
+
}
|
|
112
|
+
.ldt-skeleton--text {
|
|
113
|
+
height: 0.8em;
|
|
114
|
+
min-height: 0;
|
|
115
|
+
margin-block: 0.35em;
|
|
116
|
+
}
|
|
117
|
+
.ldt-skeleton--title {
|
|
118
|
+
width: 60%;
|
|
119
|
+
height: 1.4em;
|
|
120
|
+
}
|
|
121
|
+
.ldt-skeleton--avatar {
|
|
122
|
+
width: var(--loidolt-size-control);
|
|
123
|
+
height: var(--loidolt-size-control);
|
|
124
|
+
}
|
|
125
|
+
.ldt-skeleton--button {
|
|
126
|
+
width: 7rem;
|
|
127
|
+
height: var(--loidolt-size-control);
|
|
128
|
+
}
|
|
129
|
+
.ldt-skeleton--card {
|
|
130
|
+
width: 100%;
|
|
131
|
+
height: 10rem;
|
|
132
|
+
}
|
|
133
|
+
.ldt-skeleton-lines {
|
|
134
|
+
display: block;
|
|
135
|
+
}
|
|
72
136
|
@keyframes ldt-shimmer {
|
|
73
137
|
to {
|
|
74
138
|
background-position: -200% 0;
|
|
@@ -120,6 +184,35 @@
|
|
|
120
184
|
grid-area: 1 / 2 / span 2 / auto;
|
|
121
185
|
align-self: start;
|
|
122
186
|
}
|
|
187
|
+
.ldt-toast__actions {
|
|
188
|
+
grid-column: 1;
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-wrap: wrap;
|
|
191
|
+
gap: 0.4rem;
|
|
192
|
+
margin-top: 0.2rem;
|
|
193
|
+
}
|
|
194
|
+
/* Logical insets, so `start`/`end` follow the writing direction. */
|
|
195
|
+
.ldt-toast-viewport--bottom-start {
|
|
196
|
+
right: auto;
|
|
197
|
+
left: 1rem;
|
|
198
|
+
inset-inline: 1rem auto;
|
|
199
|
+
}
|
|
200
|
+
.ldt-toast-viewport--bottom-center,
|
|
201
|
+
.ldt-toast-viewport--top-center {
|
|
202
|
+
right: auto;
|
|
203
|
+
left: 50%;
|
|
204
|
+
transform: translateX(-50%);
|
|
205
|
+
}
|
|
206
|
+
.ldt-toast-viewport--top-end,
|
|
207
|
+
.ldt-toast-viewport--top-start,
|
|
208
|
+
.ldt-toast-viewport--top-center {
|
|
209
|
+
top: 1rem;
|
|
210
|
+
bottom: auto;
|
|
211
|
+
}
|
|
212
|
+
.ldt-toast-viewport--top-start {
|
|
213
|
+
right: auto;
|
|
214
|
+
inset-inline: 1rem auto;
|
|
215
|
+
}
|
|
123
216
|
/* A colored dot that reports state where a Badge would be too loud. */
|
|
124
217
|
.ldt-status-dot {
|
|
125
218
|
display: inline-block;
|
package/src/components/forms.css
CHANGED
|
@@ -76,6 +76,24 @@
|
|
|
76
76
|
height: 1rem;
|
|
77
77
|
accent-color: var(--loidolt-accent);
|
|
78
78
|
}
|
|
79
|
+
/* A choice with a sentence under it: the control aligns with the label's first line. */
|
|
80
|
+
.ldt-choice--described {
|
|
81
|
+
align-items: flex-start;
|
|
82
|
+
}
|
|
83
|
+
.ldt-choice--described input {
|
|
84
|
+
margin-top: 0.1rem;
|
|
85
|
+
}
|
|
86
|
+
.ldt-choice__text {
|
|
87
|
+
display: grid;
|
|
88
|
+
gap: 0.15rem;
|
|
89
|
+
}
|
|
90
|
+
.ldt-choice__description {
|
|
91
|
+
color: var(--loidolt-text-muted);
|
|
92
|
+
font: var(--loidolt-font-size-sm) / var(--loidolt-font-line-height-normal)
|
|
93
|
+
var(--loidolt-font-display);
|
|
94
|
+
letter-spacing: normal;
|
|
95
|
+
text-transform: none;
|
|
96
|
+
}
|
|
79
97
|
.ldt-fieldset {
|
|
80
98
|
min-width: 0;
|
|
81
99
|
margin: 0;
|
|
@@ -139,6 +157,9 @@
|
|
|
139
157
|
grid-template-columns: 2rem minmax(0, 1fr) 2rem;
|
|
140
158
|
border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
141
159
|
}
|
|
160
|
+
.ldt-number-field--bare {
|
|
161
|
+
grid-template-columns: minmax(0, 1fr);
|
|
162
|
+
}
|
|
142
163
|
.ldt-number-field .ldt-number-field__input {
|
|
143
164
|
border: 0;
|
|
144
165
|
text-align: center;
|
|
@@ -199,3 +220,298 @@
|
|
|
199
220
|
opacity: 0.4;
|
|
200
221
|
cursor: not-allowed;
|
|
201
222
|
}
|
|
223
|
+
/*
|
|
224
|
+
* Combobox and MultiSelect. The wrapper draws the field — underline, or box when `--boxed` —
|
|
225
|
+
* so chips, the text input and the open button all sit inside one boundary.
|
|
226
|
+
*/
|
|
227
|
+
.ldt-combobox {
|
|
228
|
+
width: 100%;
|
|
229
|
+
min-height: var(--loidolt-size-control);
|
|
230
|
+
display: flex;
|
|
231
|
+
flex-wrap: wrap;
|
|
232
|
+
align-items: center;
|
|
233
|
+
gap: 0.3rem;
|
|
234
|
+
border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
235
|
+
padding: 0.2rem 0 0.2rem 0.15rem;
|
|
236
|
+
color: var(--loidolt-text);
|
|
237
|
+
}
|
|
238
|
+
.ldt-combobox--boxed {
|
|
239
|
+
border: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
240
|
+
padding-inline: 0.5rem 0;
|
|
241
|
+
background: var(--loidolt-surface-input);
|
|
242
|
+
}
|
|
243
|
+
.ldt-combobox:focus-within {
|
|
244
|
+
border-color: var(--loidolt-accent);
|
|
245
|
+
}
|
|
246
|
+
.ldt-combobox:has([aria-invalid='true']) {
|
|
247
|
+
border-color: var(--loidolt-danger);
|
|
248
|
+
}
|
|
249
|
+
.ldt-combobox[data-disabled],
|
|
250
|
+
.ldt-combobox:has(:disabled) {
|
|
251
|
+
opacity: 0.55;
|
|
252
|
+
}
|
|
253
|
+
.ldt-combobox__input {
|
|
254
|
+
flex: 1 1 6rem;
|
|
255
|
+
min-width: 0;
|
|
256
|
+
min-height: 1.5rem;
|
|
257
|
+
border: 0;
|
|
258
|
+
padding: 0.2rem 0;
|
|
259
|
+
color: inherit;
|
|
260
|
+
background: transparent;
|
|
261
|
+
}
|
|
262
|
+
.ldt-combobox__trigger {
|
|
263
|
+
display: inline-grid;
|
|
264
|
+
place-items: center;
|
|
265
|
+
align-self: stretch;
|
|
266
|
+
width: 1.75rem;
|
|
267
|
+
min-height: 1.5rem;
|
|
268
|
+
border: 0;
|
|
269
|
+
padding: 0;
|
|
270
|
+
color: var(--loidolt-text-muted);
|
|
271
|
+
background: transparent;
|
|
272
|
+
}
|
|
273
|
+
.ldt-combobox__trigger svg {
|
|
274
|
+
transition: transform var(--loidolt-motion-fast) var(--loidolt-motion-easing);
|
|
275
|
+
}
|
|
276
|
+
.ldt-combobox__trigger[data-state='open'] svg {
|
|
277
|
+
transform: rotate(180deg);
|
|
278
|
+
}
|
|
279
|
+
.ldt-multi-select__chips {
|
|
280
|
+
display: flex;
|
|
281
|
+
flex-wrap: wrap;
|
|
282
|
+
gap: 0.3rem;
|
|
283
|
+
margin: 0;
|
|
284
|
+
padding: 0;
|
|
285
|
+
list-style: none;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/*
|
|
289
|
+
* Slider. The wrapper's inline padding is half a thumb, so a thumb centred on either end value
|
|
290
|
+
* stays inside the box without the browser measuring it after hydration.
|
|
291
|
+
*/
|
|
292
|
+
.ldt-slider {
|
|
293
|
+
--ldt-slider-thumb: 1rem;
|
|
294
|
+
width: 100%;
|
|
295
|
+
display: flex;
|
|
296
|
+
align-items: center;
|
|
297
|
+
gap: var(--loidolt-space-3);
|
|
298
|
+
padding-inline: calc(var(--ldt-slider-thumb) / 2);
|
|
299
|
+
}
|
|
300
|
+
.ldt-slider__control {
|
|
301
|
+
position: relative;
|
|
302
|
+
flex: 1;
|
|
303
|
+
min-height: 1.5rem;
|
|
304
|
+
display: flex;
|
|
305
|
+
align-items: center;
|
|
306
|
+
touch-action: none;
|
|
307
|
+
user-select: none;
|
|
308
|
+
}
|
|
309
|
+
.ldt-slider__track {
|
|
310
|
+
position: relative;
|
|
311
|
+
width: 100%;
|
|
312
|
+
height: var(--ldt-slider-thickness, 0.25rem);
|
|
313
|
+
overflow: hidden;
|
|
314
|
+
background: var(--loidolt-border);
|
|
315
|
+
}
|
|
316
|
+
.ldt-slider__range {
|
|
317
|
+
position: absolute;
|
|
318
|
+
height: 100%;
|
|
319
|
+
background: var(--loidolt-accent);
|
|
320
|
+
}
|
|
321
|
+
.ldt-slider__thumb {
|
|
322
|
+
display: block;
|
|
323
|
+
width: var(--ldt-slider-thumb);
|
|
324
|
+
height: var(--ldt-slider-thumb);
|
|
325
|
+
border: 2px solid var(--loidolt-accent);
|
|
326
|
+
background: var(--loidolt-surface-input);
|
|
327
|
+
cursor: grab;
|
|
328
|
+
transition: background var(--loidolt-motion-fast) var(--loidolt-motion-easing);
|
|
329
|
+
}
|
|
330
|
+
.ldt-slider__thumb[data-active] {
|
|
331
|
+
background: var(--loidolt-accent);
|
|
332
|
+
cursor: grabbing;
|
|
333
|
+
}
|
|
334
|
+
.ldt-slider__tick {
|
|
335
|
+
width: var(--loidolt-border-width);
|
|
336
|
+
height: 0.5rem;
|
|
337
|
+
background: var(--loidolt-border-strong);
|
|
338
|
+
transform: translateY(0.55rem);
|
|
339
|
+
}
|
|
340
|
+
.ldt-slider__value {
|
|
341
|
+
min-width: 3ch;
|
|
342
|
+
color: var(--loidolt-text-muted);
|
|
343
|
+
font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
|
|
344
|
+
font-variant-numeric: tabular-nums;
|
|
345
|
+
text-align: end;
|
|
346
|
+
}
|
|
347
|
+
.ldt-slider[data-disabled] {
|
|
348
|
+
opacity: 0.45;
|
|
349
|
+
}
|
|
350
|
+
.ldt-slider[data-disabled] .ldt-slider__thumb {
|
|
351
|
+
cursor: not-allowed;
|
|
352
|
+
}
|
|
353
|
+
.ldt-slider--vertical {
|
|
354
|
+
width: auto;
|
|
355
|
+
height: var(--ldt-slider-length, 10rem);
|
|
356
|
+
flex-direction: column;
|
|
357
|
+
padding-inline: 0;
|
|
358
|
+
padding-block: calc(var(--ldt-slider-thumb) / 2);
|
|
359
|
+
}
|
|
360
|
+
.ldt-slider--vertical .ldt-slider__control {
|
|
361
|
+
min-height: 0;
|
|
362
|
+
width: 1.5rem;
|
|
363
|
+
flex-direction: column;
|
|
364
|
+
justify-content: center;
|
|
365
|
+
}
|
|
366
|
+
.ldt-slider--vertical .ldt-slider__track {
|
|
367
|
+
width: var(--ldt-slider-thickness, 0.25rem);
|
|
368
|
+
height: 100%;
|
|
369
|
+
}
|
|
370
|
+
.ldt-slider--vertical .ldt-slider__range {
|
|
371
|
+
width: 100%;
|
|
372
|
+
height: auto;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/* Password field: the input and its reveal button share the field's boundary. */
|
|
376
|
+
.ldt-password-input {
|
|
377
|
+
width: 100%;
|
|
378
|
+
min-height: var(--loidolt-size-control);
|
|
379
|
+
display: flex;
|
|
380
|
+
align-items: stretch;
|
|
381
|
+
border-bottom: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
382
|
+
}
|
|
383
|
+
.ldt-password-input--boxed {
|
|
384
|
+
border: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
385
|
+
background: var(--loidolt-surface-input);
|
|
386
|
+
}
|
|
387
|
+
.ldt-password-input:focus-within {
|
|
388
|
+
border-color: var(--loidolt-accent);
|
|
389
|
+
}
|
|
390
|
+
.ldt-password-input:has([aria-invalid='true']) {
|
|
391
|
+
border-color: var(--loidolt-danger);
|
|
392
|
+
}
|
|
393
|
+
.ldt-password-input__input {
|
|
394
|
+
flex: 1;
|
|
395
|
+
min-width: 0;
|
|
396
|
+
border: 0;
|
|
397
|
+
padding: 0.45rem 0.15rem;
|
|
398
|
+
color: var(--loidolt-text);
|
|
399
|
+
background: transparent;
|
|
400
|
+
}
|
|
401
|
+
.ldt-password-input--boxed .ldt-password-input__input {
|
|
402
|
+
padding-inline: 0.65rem;
|
|
403
|
+
}
|
|
404
|
+
.ldt-password-input__toggle {
|
|
405
|
+
display: inline-grid;
|
|
406
|
+
place-items: center;
|
|
407
|
+
width: 2.25rem;
|
|
408
|
+
min-height: 1.5rem;
|
|
409
|
+
border: 0;
|
|
410
|
+
padding: 0;
|
|
411
|
+
color: var(--loidolt-text-muted);
|
|
412
|
+
background: transparent;
|
|
413
|
+
}
|
|
414
|
+
.ldt-password-input__toggle:hover:not(:disabled),
|
|
415
|
+
.ldt-password-input__toggle[aria-pressed='true'] {
|
|
416
|
+
color: var(--loidolt-text-accent);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* One-time code: one square cell per character over a single hidden input. */
|
|
420
|
+
.ldt-otp-input {
|
|
421
|
+
display: inline-flex;
|
|
422
|
+
align-items: center;
|
|
423
|
+
gap: 0.35rem;
|
|
424
|
+
}
|
|
425
|
+
.ldt-otp-input__cell {
|
|
426
|
+
position: relative;
|
|
427
|
+
width: var(--loidolt-size-control-lg);
|
|
428
|
+
height: var(--loidolt-size-control-lg);
|
|
429
|
+
display: grid;
|
|
430
|
+
place-items: center;
|
|
431
|
+
border: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
432
|
+
color: var(--loidolt-text);
|
|
433
|
+
background: var(--loidolt-surface-input);
|
|
434
|
+
font: var(--loidolt-font-size-lg) var(--loidolt-font-utility);
|
|
435
|
+
font-variant-numeric: tabular-nums;
|
|
436
|
+
}
|
|
437
|
+
/* The input is visually hidden, so the active cell carries the focus indicator for it. */
|
|
438
|
+
.ldt-otp-input:focus-within .ldt-otp-input__cell[data-active] {
|
|
439
|
+
border-color: var(--loidolt-accent);
|
|
440
|
+
outline: 2px solid var(--loidolt-focus-ring);
|
|
441
|
+
outline-offset: 1px;
|
|
442
|
+
}
|
|
443
|
+
.ldt-otp-input:has([aria-invalid='true']) .ldt-otp-input__cell {
|
|
444
|
+
border-color: var(--loidolt-danger);
|
|
445
|
+
}
|
|
446
|
+
.ldt-otp-input__gap {
|
|
447
|
+
width: 0.5rem;
|
|
448
|
+
height: var(--loidolt-border-width);
|
|
449
|
+
background: var(--loidolt-border-strong);
|
|
450
|
+
}
|
|
451
|
+
.ldt-otp-input__caret {
|
|
452
|
+
width: 1px;
|
|
453
|
+
height: 1.1em;
|
|
454
|
+
background: currentColor;
|
|
455
|
+
animation: ldt-caret 1s steps(1) infinite;
|
|
456
|
+
}
|
|
457
|
+
@keyframes ldt-caret {
|
|
458
|
+
50% {
|
|
459
|
+
opacity: 0;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/* Signature capture: a paper-toned pad with a baseline, so drawing feels like signing a line. */
|
|
464
|
+
.ldt-signature {
|
|
465
|
+
display: grid;
|
|
466
|
+
gap: var(--loidolt-space-2);
|
|
467
|
+
}
|
|
468
|
+
.ldt-signature__surface {
|
|
469
|
+
position: relative;
|
|
470
|
+
border: var(--loidolt-border-width) solid var(--loidolt-border-control);
|
|
471
|
+
color: var(--loidolt-text);
|
|
472
|
+
background: var(--loidolt-surface-input);
|
|
473
|
+
}
|
|
474
|
+
.ldt-signature__surface::after {
|
|
475
|
+
content: '';
|
|
476
|
+
position: absolute;
|
|
477
|
+
inset: auto var(--loidolt-space-4) 28%;
|
|
478
|
+
border-bottom: var(--loidolt-border-width) dashed var(--loidolt-border-strong);
|
|
479
|
+
pointer-events: none;
|
|
480
|
+
}
|
|
481
|
+
.ldt-signature__canvas {
|
|
482
|
+
display: block;
|
|
483
|
+
width: 100%;
|
|
484
|
+
height: var(--ldt-signature-height, 10rem);
|
|
485
|
+
touch-action: none;
|
|
486
|
+
cursor: crosshair;
|
|
487
|
+
}
|
|
488
|
+
.ldt-signature[data-disabled] .ldt-signature__canvas {
|
|
489
|
+
cursor: not-allowed;
|
|
490
|
+
opacity: 0.5;
|
|
491
|
+
}
|
|
492
|
+
.ldt-signature__hint {
|
|
493
|
+
margin: 0;
|
|
494
|
+
color: var(--loidolt-text-muted);
|
|
495
|
+
font: var(--loidolt-font-size-sm) var(--loidolt-font-utility);
|
|
496
|
+
}
|
|
497
|
+
.ldt-signature__typed {
|
|
498
|
+
display: grid;
|
|
499
|
+
gap: var(--loidolt-space-2);
|
|
500
|
+
}
|
|
501
|
+
.ldt-signature__preview {
|
|
502
|
+
min-height: 4.5rem;
|
|
503
|
+
margin: 0;
|
|
504
|
+
overflow: hidden;
|
|
505
|
+
border-bottom: var(--loidolt-border-width) dashed var(--loidolt-border-strong);
|
|
506
|
+
padding: var(--loidolt-space-2) var(--loidolt-space-3) 0;
|
|
507
|
+
color: var(--loidolt-text);
|
|
508
|
+
font-size: 2.5rem;
|
|
509
|
+
line-height: 1.5;
|
|
510
|
+
text-overflow: ellipsis;
|
|
511
|
+
white-space: nowrap;
|
|
512
|
+
}
|
|
513
|
+
.ldt-signature__actions {
|
|
514
|
+
display: flex;
|
|
515
|
+
justify-content: flex-end;
|
|
516
|
+
gap: var(--loidolt-space-2);
|
|
517
|
+
}
|