@med-o/ui 0.0.0-stage → 0.3.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -2
  3. package/dist/index.d.ts +2237 -0
  4. package/dist/index.js +5119 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/styles.css +1 -0
  7. package/package.json +77 -4
  8. package/src/accordion/accordion.css +184 -0
  9. package/src/alert/alert.css +147 -0
  10. package/src/avatar/avatar.css +221 -0
  11. package/src/badge/badge.css +153 -0
  12. package/src/bottom-sheet/bottom-sheet.css +202 -0
  13. package/src/breadcrumbs/breadcrumbs.css +147 -0
  14. package/src/bulk-action-bar/bulk-action-bar.css +98 -0
  15. package/src/button/button.css +319 -0
  16. package/src/card/card.css +217 -0
  17. package/src/checkbox/choice.css +196 -0
  18. package/src/combobox/combobox.css +125 -0
  19. package/src/date-time/date-time.css +474 -0
  20. package/src/dialog/dialog.css +319 -0
  21. package/src/drawer/drawer.css +156 -0
  22. package/src/empty-state/empty-state.css +161 -0
  23. package/src/field/field.css +115 -0
  24. package/src/link/link.css +103 -0
  25. package/src/list/list.css +172 -0
  26. package/src/list-view/list-view.css +473 -0
  27. package/src/listbox/listbox.css +203 -0
  28. package/src/media/media.css +298 -0
  29. package/src/menu/menu.css +183 -0
  30. package/src/navigation/navigation.css +625 -0
  31. package/src/pagination/pagination.css +132 -0
  32. package/src/popover/popover.css +166 -0
  33. package/src/progress/progress.css +225 -0
  34. package/src/search/search.css +309 -0
  35. package/src/select/select.css +229 -0
  36. package/src/slider/slider.css +212 -0
  37. package/src/styles.css +48 -0
  38. package/src/switch/switch.css +160 -0
  39. package/src/table/table.css +286 -0
  40. package/src/tabs/tabs.css +211 -0
  41. package/src/tag/tag.css +225 -0
  42. package/src/text-field/input.css +206 -0
  43. package/src/toast/toast.css +184 -0
  44. package/src/toggle-button/toggle-button.css +143 -0
  45. package/src/tooltip/tooltip.css +66 -0
  46. package/src/upload/upload.css +380 -0
  47. package/src/utils/utilities.css +14 -0
@@ -0,0 +1,473 @@
1
+ /**
2
+ * List view – med.o Design System
3
+ *
4
+ * <div class="medo-list-view medo-list-view--plain|card" role="grid">
5
+ * <div class="medo-list-row medo-list-row--lines-1|2|3 [medo-list-row--unread]" role="row">
6
+ * [check] [leading] <span class="medo-list-row__main">content · meta · trailing · chevron</span>
7
+ * </div>
8
+ * </div>
9
+ * Height 48 · 64 · 88. Padding 12 vertical, 16 left, 8 right, gap 12. Inset divider: starts at the text, none after the last row.
10
+ * State contract: [data-hovered] [data-pressed] [data-selected] [data-focus-visible] [data-disabled] (React Aria).
11
+ */
12
+
13
+ .medo-list-view {
14
+ display: flex;
15
+ flex-direction: column;
16
+ outline: none;
17
+ }
18
+
19
+ .medo-list-view--card {
20
+ overflow: hidden;
21
+ border: var(--medo-border-width-thin) solid var(--medo-color-border-default);
22
+ border-radius: var(--medo-radius-lg);
23
+ background-color: var(--medo-color-surface-default);
24
+ }
25
+
26
+ .medo-list-view[data-focus-visible] {
27
+ box-shadow: var(--medo-shadow-focus-ring);
28
+ }
29
+
30
+ .medo-list-view__empty {
31
+ padding-inline: var(--medo-space-4);
32
+ }
33
+
34
+ /* ---------- Row ---------- */
35
+
36
+ .medo-list-row {
37
+ --_lead: var(--medo-size-control-md); /* 40 */
38
+
39
+ position: relative;
40
+ box-sizing: border-box;
41
+ display: flex;
42
+ align-items: center;
43
+ gap: var(--medo-space-3);
44
+ padding-inline-start: var(--medo-space-4);
45
+ color: var(--medo-color-text-primary);
46
+ cursor: default;
47
+ outline: none;
48
+ -webkit-tap-highlight-color: transparent;
49
+ }
50
+
51
+ .medo-list-row--lines-1 {
52
+ --_lead: var(--medo-size-icon-lg); /* 24 */
53
+ }
54
+
55
+ .medo-list-row[data-href],
56
+ .medo-list-row[data-allows-selection],
57
+ .medo-list-row[data-has-action] {
58
+ cursor: pointer;
59
+ }
60
+
61
+ /* Row feedback fades; pressed shows at once, so a tap feels immediate. */
62
+ .medo-list-row {
63
+ transition: background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
64
+ }
65
+ .medo-list-row[data-pressed] {
66
+ transition-duration: 0s;
67
+ }
68
+
69
+ .medo-list-row[data-hovered] {
70
+ background-color: var(--medo-color-state-hover);
71
+ }
72
+
73
+ .medo-list-row[data-pressed] {
74
+ background-color: var(--medo-color-state-pressed);
75
+ }
76
+
77
+ .medo-list-row[data-selected] {
78
+ background-color: var(--medo-color-action-selected);
79
+ }
80
+
81
+ .medo-list-row[data-focus-visible] {
82
+ box-shadow: var(--medo-shadow-focus-ring-inset);
83
+ }
84
+
85
+ .medo-list-row[data-disabled] {
86
+ opacity: 0.5;
87
+ cursor: not-allowed;
88
+ }
89
+
90
+ /* 3 lines: leading and trailing top aligned. */
91
+ .medo-list-row--lines-3 {
92
+ align-items: flex-start;
93
+ }
94
+
95
+ .medo-list-row__check,
96
+ .medo-list-row__leading {
97
+ display: flex;
98
+ flex: none;
99
+ align-items: center;
100
+ padding-block: var(--medo-space-3);
101
+ }
102
+
103
+ .medo-list-row__leading > * {
104
+ max-inline-size: var(--_lead);
105
+ max-block-size: var(--_lead);
106
+ }
107
+
108
+ /* Icon tile 40 (settings). */
109
+ .medo-list-row__icon {
110
+ display: inline-grid;
111
+ place-items: center;
112
+ inline-size: var(--_lead);
113
+ block-size: var(--_lead);
114
+ border-radius: var(--medo-radius-md);
115
+ background-color: var(--medo-color-surface-subtle);
116
+ color: var(--medo-color-text-secondary);
117
+ }
118
+
119
+ .medo-list-row__icon > svg {
120
+ inline-size: var(--medo-size-icon-md);
121
+ block-size: var(--medo-size-icon-md);
122
+ }
123
+
124
+ /* Main: content, meta and trailing. Its bottom border is the inset divider – it starts at the text. */
125
+ .medo-list-row__main {
126
+ display: flex;
127
+ flex: 1;
128
+ align-self: stretch;
129
+ align-items: center;
130
+ gap: var(--medo-space-3);
131
+ min-inline-size: 0;
132
+ padding: var(--medo-space-3) var(--medo-space-2) var(--medo-space-3) 0;
133
+ border-block-end: var(--medo-border-width-thin) solid var(--medo-color-border-default);
134
+ }
135
+
136
+ .medo-list-row--lines-3 .medo-list-row__main {
137
+ align-items: flex-start;
138
+ }
139
+
140
+ .medo-list-row:last-child .medo-list-row__main {
141
+ border-block-end-color: transparent;
142
+ }
143
+
144
+ .medo-list-row__content {
145
+ display: grid;
146
+ flex: 1;
147
+ gap: var(--medo-space-0-5);
148
+ min-inline-size: 0;
149
+ }
150
+
151
+ .medo-list-row__title {
152
+ overflow: hidden;
153
+ font: var(--medo-typography-label-md);
154
+ color: var(--medo-color-text-primary);
155
+ text-overflow: ellipsis;
156
+ white-space: nowrap;
157
+ }
158
+
159
+ .medo-list-row__description {
160
+ display: -webkit-box;
161
+ overflow: hidden;
162
+ font: var(--medo-typography-body-sm);
163
+ color: var(--medo-color-text-secondary);
164
+ -webkit-box-orient: vertical;
165
+ -webkit-line-clamp: 1;
166
+ line-clamp: 1;
167
+ }
168
+
169
+ .medo-list-row--lines-3 .medo-list-row__description {
170
+ -webkit-line-clamp: 2;
171
+ line-clamp: 2;
172
+ }
173
+
174
+ /* Meta stack: meta text, unread dot below (gap 6). */
175
+ .medo-list-row__meta {
176
+ display: flex;
177
+ flex: none;
178
+ flex-direction: column;
179
+ align-items: flex-end;
180
+ gap: var(--medo-space-1-5);
181
+ }
182
+
183
+ .medo-list-row__meta-text {
184
+ font: var(--medo-typography-caption);
185
+ color: var(--medo-color-text-secondary);
186
+ white-space: nowrap;
187
+ }
188
+
189
+ .medo-list-row__dot {
190
+ inline-size: var(--medo-space-2);
191
+ block-size: var(--medo-space-2);
192
+ border-radius: var(--medo-radius-full);
193
+ background-color: var(--medo-color-action-primary);
194
+ }
195
+
196
+ .medo-list-row__trailing {
197
+ display: flex;
198
+ flex: none;
199
+ align-items: center;
200
+ gap: var(--medo-space-2);
201
+ }
202
+
203
+ .medo-list-row__chevron {
204
+ display: inline-flex;
205
+ flex: none;
206
+ inline-size: var(--medo-size-icon-md);
207
+ block-size: var(--medo-size-icon-md);
208
+ color: var(--medo-color-text-secondary);
209
+ }
210
+
211
+ .medo-list-row__chevron > svg {
212
+ inline-size: 100%;
213
+ block-size: 100%;
214
+ }
215
+
216
+ /* Unread: strong title and excerpt, meta in brand (never colour alone – plus the dot and hidden text). */
217
+ .medo-list-row--unread .medo-list-row__title {
218
+ font: var(--medo-typography-label-md-strong);
219
+ }
220
+
221
+ .medo-list-row--unread .medo-list-row__description {
222
+ font: var(--medo-typography-body-sm-strong);
223
+ }
224
+
225
+ .medo-list-row--unread .medo-list-row__meta-text {
226
+ color: var(--medo-color-text-brand);
227
+ }
228
+
229
+ /* Loading rows. */
230
+ .medo-list-row--loading .medo-list-row__content {
231
+ gap: var(--medo-space-2);
232
+ }
233
+
234
+ @media (forced-colors: active) {
235
+ .medo-list-row[data-selected] {
236
+ outline: 2px solid Highlight;
237
+ outline-offset: -2px;
238
+ }
239
+ .medo-list-row__dot {
240
+ background-color: CanvasText;
241
+ }
242
+ }
243
+
244
+ /* ---------- Cards ---------- */
245
+
246
+ .medo-list-view--cards {
247
+ gap: var(--medo-space-3);
248
+ }
249
+
250
+ .medo-list-card {
251
+ box-sizing: border-box;
252
+ display: flex;
253
+ align-items: flex-start;
254
+ gap: var(--medo-space-3);
255
+ padding: var(--medo-space-4);
256
+ border: var(--medo-border-width-thin) solid var(--medo-color-border-default);
257
+ border-radius: var(--medo-radius-md);
258
+ background-color: var(--medo-color-surface-default);
259
+ color: var(--medo-color-text-primary);
260
+ cursor: default;
261
+ outline: none;
262
+ -webkit-tap-highlight-color: transparent;
263
+ }
264
+
265
+ .medo-list-card[data-href],
266
+ .medo-list-card[data-allows-selection],
267
+ .medo-list-card[data-has-action] {
268
+ cursor: pointer;
269
+ }
270
+
271
+ .medo-list-card[data-hovered] {
272
+ background-color: var(--medo-color-state-hover);
273
+ }
274
+
275
+ .medo-list-card[data-pressed] {
276
+ background-color: var(--medo-color-state-pressed);
277
+ }
278
+
279
+ .medo-list-card[data-selected] {
280
+ border-color: var(--medo-color-action-primary);
281
+ background-color: var(--medo-color-action-selected);
282
+ }
283
+
284
+ .medo-list-card[data-focus-visible] {
285
+ box-shadow: var(--medo-shadow-focus-ring);
286
+ }
287
+
288
+ .medo-list-card[data-disabled] {
289
+ opacity: 0.5;
290
+ cursor: not-allowed;
291
+ }
292
+
293
+ .medo-list-card__check {
294
+ display: flex;
295
+ flex: none;
296
+ }
297
+
298
+ .medo-list-card__content {
299
+ display: grid;
300
+ flex: 1;
301
+ gap: var(--medo-space-2);
302
+ min-inline-size: 0;
303
+ }
304
+
305
+ .medo-list-card__top,
306
+ .medo-list-card__bottom {
307
+ display: flex;
308
+ align-items: center;
309
+ justify-content: space-between;
310
+ gap: var(--medo-space-3);
311
+ min-inline-size: 0;
312
+ }
313
+
314
+ .medo-list-card__title {
315
+ overflow: hidden;
316
+ font: var(--medo-typography-label-md);
317
+ text-overflow: ellipsis;
318
+ white-space: nowrap;
319
+ }
320
+
321
+ .medo-list-card__amount {
322
+ flex: none;
323
+ font: var(--medo-typography-label-md-strong);
324
+ font-variant-numeric: tabular-nums;
325
+ white-space: nowrap;
326
+ }
327
+
328
+ .medo-list-card__description {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: var(--medo-space-2);
332
+ min-inline-size: 0;
333
+ overflow: hidden;
334
+ font: var(--medo-typography-body-sm);
335
+ color: var(--medo-color-text-secondary);
336
+ white-space: nowrap;
337
+ }
338
+
339
+ .medo-list-card__meta {
340
+ font: var(--medo-typography-caption);
341
+ font-variant-numeric: tabular-nums;
342
+ color: var(--medo-color-text-secondary);
343
+ }
344
+
345
+ .medo-list-card--loading .medo-list-card__content {
346
+ gap: var(--medo-space-3);
347
+ }
348
+
349
+ @media (forced-colors: active) {
350
+ .medo-list-card[data-selected] {
351
+ outline: 2px solid Highlight;
352
+ outline-offset: -2px;
353
+ }
354
+ }
355
+
356
+ /* ---------- Swipe – touch only ----------
357
+ * <div class="medo-list-row medo-list-row--swipe">
358
+ * <span class="medo-list-row__swipe-action --end|--start --danger|--primary" style="inline-size: |offset|">icon + label</span>
359
+ * <span class="medo-list-row__surface" style="transform">…row content…</span>
360
+ * </div>
361
+ * Action 88 wide at the edge · icon 20 + label/sm · Delete feedback/danger/solid · Archive action/primary
362
+ */
363
+
364
+ .medo-list-row--swipe {
365
+ overflow: hidden;
366
+ padding-inline-start: 0;
367
+ }
368
+
369
+ .medo-list-row__surface {
370
+ position: relative;
371
+ display: flex;
372
+ flex: 1;
373
+ align-self: stretch;
374
+ align-items: center;
375
+ gap: var(--medo-space-3);
376
+ min-inline-size: 0;
377
+ padding-inline-start: var(--medo-space-4);
378
+ /* Vertical scrolling stays with the browser; horizontal moves swipe the row. */
379
+ touch-action: pan-y;
380
+ /* Settles with a smooth spring (open, closed, back). */
381
+ transition: transform var(--medo-motion-spring-smooth-duration) var(--medo-motion-spring-smooth);
382
+ }
383
+
384
+ .medo-list-row--lines-3 .medo-list-row__surface {
385
+ align-items: flex-start;
386
+ }
387
+
388
+ .medo-list-row__surface--dragging {
389
+ transition: none;
390
+ }
391
+
392
+ /* A full swipe: the row leaves quickly, accelerating. */
393
+ .medo-list-row__surface--leaving {
394
+ transition: transform var(--medo-motion-duration-normal) var(--medo-motion-easing-exit);
395
+ }
396
+ .medo-list-row:has(.medo-list-row__surface--dragging) .medo-list-row__swipe-action {
397
+ transition: none;
398
+ }
399
+ .medo-list-row:has(.medo-list-row__surface--leaving) .medo-list-row__swipe-action {
400
+ transition: inline-size var(--medo-motion-duration-normal) var(--medo-motion-easing-exit);
401
+ }
402
+
403
+ .medo-list-row__swipe-action {
404
+ /* Grows with the surface – same spring, same timing. */
405
+ transition: inline-size var(--medo-motion-spring-smooth-duration) var(--medo-motion-spring-smooth);
406
+ position: absolute;
407
+ inset-block: 0;
408
+ z-index: 0;
409
+ display: flex;
410
+ align-items: center;
411
+ overflow: hidden;
412
+ cursor: pointer;
413
+ }
414
+
415
+ .medo-list-row__swipe-action--end {
416
+ inset-inline-end: 0;
417
+ justify-content: flex-end;
418
+ }
419
+
420
+ .medo-list-row__swipe-action--start {
421
+ inset-inline-start: 0;
422
+ justify-content: flex-start;
423
+ }
424
+
425
+ .medo-list-row__swipe-action--danger {
426
+ background-color: var(--medo-color-feedback-danger-solid);
427
+ color: var(--medo-color-feedback-danger-on-solid);
428
+ }
429
+
430
+ .medo-list-row__swipe-action--primary {
431
+ background-color: var(--medo-color-action-primary);
432
+ color: var(--medo-color-text-on-action);
433
+ }
434
+
435
+ /* Icon and label centred in the 88 px at the edge. */
436
+ .medo-list-row__swipe-label {
437
+ display: flex;
438
+ flex: none;
439
+ flex-direction: column;
440
+ align-items: center;
441
+ justify-content: center;
442
+ gap: var(--medo-space-1);
443
+ inline-size: calc(var(--medo-space-20) + var(--medo-space-2)); /* 88 */
444
+ font: var(--medo-typography-label-sm);
445
+ }
446
+
447
+ .medo-list-row__swipe-label > svg {
448
+ inline-size: var(--medo-size-icon-md);
449
+ block-size: var(--medo-size-icon-md);
450
+ }
451
+
452
+ /* While a row is open, a tap on it closes it. */
453
+ .medo-list-row__swipe-shield {
454
+ position: absolute;
455
+ inset: 0;
456
+ z-index: 1;
457
+ }
458
+
459
+ @media (prefers-reduced-motion: reduce) {
460
+ .medo-list-row__surface,
461
+ .medo-list-row__swipe-action {
462
+ transition-duration: var(--medo-motion-duration-fast);
463
+ transition-timing-function: var(--medo-motion-easing-standard);
464
+ }
465
+ }
466
+
467
+ @media (forced-colors: active) {
468
+ .medo-list-row__swipe-action {
469
+ forced-color-adjust: none;
470
+ background-color: Highlight;
471
+ color: HighlightText;
472
+ }
473
+ }
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Option & Listbox – med.o Design System
3
+ *
4
+ * The popup list behind Select, Combobox and the Bottom Sheet.
5
+ * <div class="medo-popover medo-listbox-popover">
6
+ * <div class="medo-listbox medo-listbox--md" role="listbox">
7
+ * <section class="medo-listbox__section">
8
+ * <header class="medo-listbox__header">Group</header>
9
+ * <div class="medo-option" role="option">
10
+ * <span class="medo-option__icon">…</span>
11
+ * <span class="medo-option__content"><span class="medo-option__label">…</span><span class="medo-option__description">…</span></span>
12
+ * <span class="medo-option__check">✓</span>
13
+ * </div>
14
+ * </section>
15
+ * <section class="medo-listbox__section">…</section> (a line divides the groups)
16
+ * </div>
17
+ * </div>
18
+ *
19
+ * Highlighted (keyboard or pointer) = state/hover. Selected has no fill: check (single, right) or checkbox (multi, left).
20
+ * State contract: [data-focused] [data-hovered] [data-selected] [data-disabled] [data-selection-mode]
21
+ */
22
+
23
+ /* ---------- Popover (shared by Select and Combobox) ---------- */
24
+
25
+ .medo-listbox-popover {
26
+ box-sizing: border-box;
27
+ min-inline-size: var(--trigger-width);
28
+ max-inline-size: calc(100vw - 2 * var(--medo-space-4));
29
+ border: var(--medo-border-width-thin) solid var(--medo-color-border-default);
30
+ border-radius: var(--medo-radius-md);
31
+ background-color: var(--medo-color-surface-raised);
32
+ box-shadow: var(--medo-shadow-elevation-2);
33
+ z-index: var(--medo-layer-dropdown);
34
+ outline: none;
35
+ overflow: hidden;
36
+ }
37
+
38
+ /* Motion: unfolds from the field with a snappy spring and fades in; out: a quick fade. */
39
+ .medo-listbox-popover {
40
+ transform-origin: var(--trigger-anchor-point, top);
41
+ transition:
42
+ opacity var(--medo-motion-duration-normal) var(--medo-motion-easing-enter),
43
+ scale var(--medo-motion-spring-snappy-duration) var(--medo-motion-spring-snappy);
44
+ }
45
+ .medo-listbox-popover[data-entering] {
46
+ opacity: 0;
47
+ scale: 0.98;
48
+ }
49
+ .medo-listbox-popover[data-exiting] {
50
+ opacity: 0;
51
+ scale: 0.98;
52
+ transition:
53
+ opacity var(--medo-motion-duration-fast) var(--medo-motion-easing-exit),
54
+ scale var(--medo-motion-duration-fast) var(--medo-motion-easing-exit);
55
+ }
56
+
57
+ /* ---------- Listbox ---------- */
58
+
59
+ .medo-listbox {
60
+ --_pad: var(--medo-space-2);
61
+ --_label: var(--medo-typography-body-sm);
62
+ --_desc: var(--medo-typography-caption);
63
+ --_icon: var(--medo-size-icon-sm);
64
+
65
+ box-sizing: border-box;
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: var(--medo-space-1);
69
+ max-block-size: 20rem; /* 320 px, then scroll */
70
+ padding: var(--medo-space-1);
71
+ overflow: auto;
72
+ outline: none;
73
+ color: var(--medo-color-text-primary);
74
+ }
75
+
76
+ .medo-listbox--lg {
77
+ --_pad: var(--medo-space-3);
78
+ --_label: var(--medo-typography-body-md);
79
+ --_desc: var(--medo-typography-body-sm);
80
+ --_icon: var(--medo-size-icon-md);
81
+ }
82
+
83
+ .medo-listbox__section {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--medo-space-1);
87
+ }
88
+
89
+ .medo-listbox__header {
90
+ padding: var(--medo-space-2) var(--medo-space-2) var(--medo-space-1);
91
+ font: var(--medo-typography-overline);
92
+ color: var(--medo-color-text-secondary);
93
+ }
94
+
95
+ /* Divider between groups (CSS, because role=separator is not allowed inside a listbox). */
96
+ .medo-listbox__section + .medo-listbox__section {
97
+ margin-block-start: var(--medo-space-1);
98
+ padding-block-start: var(--medo-space-1);
99
+ border-block-start: var(--medo-border-width-thin) solid var(--medo-color-border-default);
100
+ }
101
+
102
+ /* Empty and loading row: never an empty popup. */
103
+ .medo-listbox__message {
104
+ padding: var(--_pad);
105
+ font: var(--_label);
106
+ color: var(--medo-color-text-secondary);
107
+ }
108
+
109
+ /* ---------- Option ---------- */
110
+
111
+ .medo-option {
112
+ box-sizing: border-box;
113
+ display: flex;
114
+ align-items: flex-start;
115
+ gap: var(--medo-space-2);
116
+ padding: var(--_pad);
117
+ border-radius: var(--medo-radius-sm);
118
+ font: var(--_label);
119
+ color: var(--medo-color-text-primary);
120
+ cursor: pointer;
121
+ outline: none;
122
+ -webkit-tap-highlight-color: transparent;
123
+ }
124
+
125
+ .medo-option[data-focused],
126
+ .medo-option[data-hovered] {
127
+ background-color: var(--medo-color-state-hover);
128
+ }
129
+
130
+ /* Keyboard focus is the same neutral highlight (no extra ring on options). */
131
+
132
+ .medo-option[data-disabled] {
133
+ color: var(--medo-color-text-disabled);
134
+ cursor: not-allowed;
135
+ }
136
+
137
+ .medo-option__content {
138
+ display: flex;
139
+ flex: 1;
140
+ flex-direction: column;
141
+ min-inline-size: 0;
142
+ overflow-wrap: anywhere; /* labels wrap, never truncate */
143
+ }
144
+
145
+ .medo-option__match {
146
+ font-weight: var(--medo-font-weight-semibold);
147
+ }
148
+
149
+ .medo-option__description {
150
+ font: var(--_desc);
151
+ color: var(--medo-color-text-secondary);
152
+ }
153
+
154
+ /* Icons and the check sit on the first line of the label. */
155
+ .medo-option__icon,
156
+ .medo-option__check {
157
+ display: inline-flex;
158
+ flex: none;
159
+ inline-size: var(--_icon);
160
+ block-size: var(--_icon);
161
+ margin-block-start: var(--medo-space-0-5);
162
+ }
163
+
164
+ .medo-option__icon {
165
+ color: var(--medo-color-text-secondary);
166
+ }
167
+
168
+ .medo-option__check {
169
+ color: var(--medo-color-text-brand);
170
+ }
171
+
172
+ .medo-option__icon > svg,
173
+ .medo-option__check > svg {
174
+ inline-size: 100%;
175
+ block-size: 100%;
176
+ }
177
+
178
+ .medo-option[data-disabled] :is(.medo-option__icon, .medo-option__check) {
179
+ color: var(--medo-color-text-disabled);
180
+ }
181
+
182
+ /* Multi: checkbox on the left (visual only; the option itself is the selectable element). */
183
+ .medo-option__checkbox {
184
+ flex: none;
185
+ }
186
+
187
+ @media (forced-colors: active) {
188
+ .medo-option:is([data-focused], [data-hovered]) {
189
+ forced-color-adjust: none;
190
+ background-color: Highlight;
191
+ color: HighlightText;
192
+ }
193
+ }
194
+
195
+ @media (prefers-reduced-motion: reduce) {
196
+ /* Reduced motion: a short cross-fade, no scaling. */
197
+ .medo-listbox-popover {
198
+ transition: opacity var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
199
+ }
200
+ .medo-listbox-popover:is([data-entering], [data-exiting]) {
201
+ scale: none;
202
+ }
203
+ }