@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,474 @@
1
+ /**
2
+ * Date & Time – med.o Design System
3
+ *
4
+ * Field <div class="medo-input medo-input--md medo-date-box"> Input look, hugs its content
5
+ * <div class="medo-date-input"> segments (spinbuttons) </div> [– end] [calendar / clock action]
6
+ * Min widths: date 200 · range 300 · time 120 · date + time 240
7
+ * Segments 24 × 24 targets · focus action/primary + text/on-action, radius/sm · literals and placeholders text/secondary
8
+ * Calendar padding space/4 · gap space/2 (lg space/3) · header Button ghost + Icon buttons
9
+ * Day cell md 40 (circle 36) · lg 48 (circle 44, label/lg) · today 1 px ring action/primary + text/brand
10
+ * selected action/primary · range band surface/brand-subtle · disabled/outside text/disabled · focus 2 px focus/ring
11
+ * Months/Years 3 × 4 pills md 40 · lg 48, same states · week numbers 32 wide
12
+ * Panel Popover Size Auto · presets 168 with divider · time row with a divider
13
+ */
14
+
15
+ /* ---------- Field ---------- */
16
+
17
+ /* The box hugs its segments; label and messages keep the full width. */
18
+ .medo-date-field {
19
+ align-items: flex-start;
20
+ }
21
+
22
+ .medo-date-field > .medo-field__footer {
23
+ align-self: stretch;
24
+ }
25
+
26
+ .medo-date-box {
27
+ --_min: 12.5rem; /* 200 */
28
+ inline-size: auto;
29
+ min-inline-size: var(--_min);
30
+ max-inline-size: 100%;
31
+ }
32
+
33
+ .medo-time-field .medo-date-box {
34
+ --_min: 7.5rem; /* 120 */
35
+ }
36
+
37
+ .medo-date-picker--time .medo-date-box {
38
+ --_min: 15rem; /* 240 */
39
+ }
40
+
41
+ .medo-date-picker--range .medo-date-box {
42
+ --_min: 18.75rem; /* 300 */
43
+ }
44
+
45
+ .medo-date-input {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ white-space: nowrap;
49
+ font-variant-numeric: tabular-nums;
50
+ outline: none;
51
+ }
52
+
53
+ .medo-date-box__dash {
54
+ color: var(--medo-color-text-secondary);
55
+ }
56
+
57
+ /* The action (calendar, clock) sits at the end. */
58
+ .medo-date-box > .medo-input__action {
59
+ margin-inline-start: auto;
60
+ }
61
+
62
+ .medo-date-segment {
63
+ border-radius: var(--medo-radius-sm);
64
+ outline: none;
65
+ caret-color: transparent;
66
+ }
67
+
68
+ .medo-date-segment[data-type='literal'],
69
+ .medo-date-segment[data-placeholder] {
70
+ color: var(--medo-color-text-secondary);
71
+ }
72
+
73
+ /* The format hint: TT.MM.JJJJ · DD/MM/YYYY. */
74
+ .medo-date-segment[data-placeholder] {
75
+ text-transform: uppercase;
76
+ }
77
+
78
+ /* Every editable segment is a 24 × 24 target (WCAG 2.5.8); the digits stay centred. */
79
+ .medo-date-segment:not([data-type='literal']) {
80
+ display: inline-block;
81
+ box-sizing: border-box;
82
+ min-inline-size: var(--medo-space-6);
83
+ padding-inline: var(--medo-space-1);
84
+ line-height: var(--medo-space-6);
85
+ text-align: center;
86
+ }
87
+
88
+ .medo-date-segment[data-focused] {
89
+ background-color: var(--medo-color-action-primary);
90
+ color: var(--medo-color-text-on-action);
91
+ }
92
+
93
+ /* States come from the date input (data-focus-within, data-invalid, data-disabled). */
94
+ .medo-input.medo-date-box:has(.medo-date-input[data-focus-within]) {
95
+ --_border: var(--medo-color-focus-ring);
96
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-focus-ring);
97
+ }
98
+
99
+ .medo-input.medo-date-box:has(.medo-date-input[data-invalid]) {
100
+ --_border: var(--medo-color-border-danger);
101
+ }
102
+
103
+ .medo-input.medo-date-box:has(.medo-date-input[data-disabled]) {
104
+ --_border: var(--medo-color-border-default);
105
+ background-color: var(--medo-color-action-disabled);
106
+ color: var(--medo-color-text-disabled);
107
+ cursor: not-allowed;
108
+ }
109
+
110
+ .medo-date-box:has(.medo-date-input[data-disabled]) :is(.medo-date-segment, .medo-date-box__dash) {
111
+ color: var(--medo-color-text-disabled);
112
+ }
113
+
114
+ @media (forced-colors: active) {
115
+ .medo-date-box:has(.medo-date-input[data-focus-within]) {
116
+ outline: var(--medo-focus-ring-width) solid Highlight;
117
+ }
118
+ .medo-date-segment[data-focused] {
119
+ forced-color-adjust: none;
120
+ background-color: Highlight;
121
+ color: HighlightText;
122
+ }
123
+ }
124
+
125
+ /* ---------- Calendar ---------- */
126
+
127
+ .medo-calendar {
128
+ --_cell: var(--medo-size-control-md); /* 40 */
129
+ --_day: calc(var(--medo-size-control-md) - var(--medo-space-1)); /* 36 */
130
+ --_gap: var(--medo-space-2);
131
+ --_strong: var(--medo-typography-label-md-strong);
132
+
133
+ box-sizing: border-box;
134
+ inline-size: max-content;
135
+ padding: var(--medo-space-4);
136
+ color: var(--medo-color-text-primary);
137
+ }
138
+
139
+ .medo-calendar--lg {
140
+ --_cell: var(--medo-size-control-lg); /* 48 */
141
+ --_day: calc(var(--medo-size-control-lg) - var(--medo-space-1)); /* 44 */
142
+ --_gap: var(--medo-space-3);
143
+ --_strong: var(--medo-typography-label-lg-strong);
144
+ }
145
+
146
+ .medo-calendar__body {
147
+ display: grid;
148
+ gap: var(--_gap);
149
+ }
150
+
151
+ .medo-calendar__headers,
152
+ .medo-calendar__months {
153
+ display: grid;
154
+ column-gap: var(--medo-space-8);
155
+ }
156
+
157
+ .medo-calendar__header {
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: space-between;
161
+ gap: var(--medo-space-2);
162
+ }
163
+
164
+ .medo-calendar__title--static {
165
+ padding-inline: var(--medo-space-3);
166
+ font: var(--medo-typography-label-md);
167
+ }
168
+
169
+ .medo-calendar__nav {
170
+ display: flex;
171
+ gap: var(--medo-space-1);
172
+ }
173
+
174
+ .medo-calendar__month {
175
+ position: relative;
176
+ }
177
+
178
+ .medo-calendar__grid {
179
+ border-collapse: collapse;
180
+ border-spacing: 0;
181
+ }
182
+
183
+ .medo-calendar__grid td {
184
+ padding: 0;
185
+ }
186
+
187
+ .medo-calendar__weekday {
188
+ block-size: var(--medo-space-6);
189
+ padding: 0;
190
+ font: var(--medo-typography-caption);
191
+ color: var(--medo-color-text-secondary);
192
+ }
193
+
194
+ .medo-calendar__cell {
195
+ position: relative;
196
+ display: grid;
197
+ place-items: center;
198
+ inline-size: var(--_cell);
199
+ block-size: var(--_cell);
200
+ font: var(--medo-typography-label-md);
201
+ cursor: pointer;
202
+ outline: none;
203
+ }
204
+
205
+ .medo-calendar--lg .medo-calendar__cell {
206
+ font: var(--medo-typography-label-lg);
207
+ }
208
+
209
+ .medo-calendar__day {
210
+ position: relative;
211
+ z-index: 1;
212
+ display: grid;
213
+ place-items: center;
214
+ inline-size: var(--_day);
215
+ block-size: var(--_day);
216
+ border-radius: var(--medo-radius-full);
217
+ transition: background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
218
+ }
219
+
220
+ .medo-calendar__cell[data-hovered] .medo-calendar__day {
221
+ background-color: var(--medo-color-state-hover);
222
+ }
223
+
224
+ .medo-calendar__cell[data-pressed] .medo-calendar__day {
225
+ background-color: var(--medo-color-state-pressed);
226
+ }
227
+
228
+ .medo-calendar__cell[data-focus-visible] .medo-calendar__day {
229
+ outline: var(--medo-focus-ring-width) solid var(--medo-color-focus-ring);
230
+ }
231
+
232
+ .medo-calendar__cell[data-today] .medo-calendar__day {
233
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-action-primary);
234
+ color: var(--medo-color-text-brand);
235
+ font: var(--_strong);
236
+ }
237
+
238
+ /* Single: the selected day. Range: start and end (the days between get the band). */
239
+ .medo-calendar:not(.medo-calendar--range) .medo-calendar__cell[data-selected] .medo-calendar__day,
240
+ .medo-calendar__cell:is([data-selection-start], [data-selection-end]) .medo-calendar__day {
241
+ background-color: var(--medo-color-action-primary);
242
+ box-shadow: none;
243
+ color: var(--medo-color-text-on-action);
244
+ font: var(--_strong);
245
+ }
246
+
247
+ .medo-calendar:not(.medo-calendar--range) .medo-calendar__cell[data-selected][data-hovered] .medo-calendar__day,
248
+ .medo-calendar__cell:is([data-selection-start], [data-selection-end])[data-hovered] .medo-calendar__day {
249
+ background-color: var(--medo-color-action-primary-hover);
250
+ }
251
+
252
+ .medo-calendar:not(.medo-calendar--range) .medo-calendar__cell[data-selected][data-pressed] .medo-calendar__day,
253
+ .medo-calendar__cell:is([data-selection-start], [data-selection-end])[data-pressed] .medo-calendar__day {
254
+ background-color: var(--medo-color-action-primary-pressed);
255
+ }
256
+
257
+ /* Range band (36 high) behind the days; half at the ends, never on days of the other month. */
258
+ .medo-calendar--range .medo-calendar__cell[data-selected]:not([data-outside-month])::before {
259
+ content: '';
260
+ position: absolute;
261
+ inset-inline: 0;
262
+ inset-block: calc((var(--_cell) - var(--_day)) / 2);
263
+ background-color: var(--medo-color-surface-brand-subtle);
264
+ }
265
+
266
+ .medo-calendar--range .medo-calendar__cell[data-selection-start]:not([data-outside-month])::before {
267
+ inset-inline-start: 50%;
268
+ }
269
+
270
+ .medo-calendar--range .medo-calendar__cell[data-selection-end]:not([data-outside-month])::before {
271
+ inset-inline-end: 50%;
272
+ }
273
+
274
+ .medo-calendar--range .medo-calendar__cell[data-selection-start][data-selection-end]::before {
275
+ content: none;
276
+ }
277
+
278
+ .medo-calendar__cell:is([data-disabled], [data-unavailable], [data-outside-month]) {
279
+ color: var(--medo-color-text-disabled);
280
+ cursor: default;
281
+ }
282
+
283
+ .medo-calendar__cell:is([data-disabled], [data-outside-month]) .medo-calendar__day {
284
+ background-color: transparent;
285
+ }
286
+
287
+ .medo-calendar__cell[data-outside-month] {
288
+ pointer-events: none;
289
+ }
290
+
291
+ /* Days of the other month never show today or a selection – the neighbouring grid does. */
292
+ .medo-calendar .medo-calendar__cell[data-outside-month] .medo-calendar__day {
293
+ background-color: transparent;
294
+ box-shadow: none;
295
+ color: var(--medo-color-text-disabled);
296
+ font: inherit;
297
+ }
298
+
299
+ .medo-calendar__cell[data-invalid] .medo-calendar__day {
300
+ background-color: var(--medo-color-feedback-danger-solid);
301
+ color: var(--medo-color-feedback-danger-on-solid);
302
+ }
303
+
304
+ /* Week numbers: a 32 px column before the rows. */
305
+ .medo-calendar__month--weeks {
306
+ padding-inline-start: var(--medo-space-8);
307
+ }
308
+
309
+ .medo-calendar__weeks-label,
310
+ .medo-calendar__day[data-week]::before {
311
+ position: absolute;
312
+ display: grid;
313
+ place-items: center;
314
+ inline-size: var(--medo-space-8);
315
+ font: var(--medo-typography-caption);
316
+ color: var(--medo-color-text-secondary);
317
+ pointer-events: none;
318
+ }
319
+
320
+ .medo-calendar__weeks-label {
321
+ inset-block-start: 0;
322
+ inset-inline-start: 0;
323
+ block-size: var(--medo-space-6);
324
+ }
325
+
326
+ .medo-calendar__day[data-week]::before {
327
+ content: attr(data-week);
328
+ /* From the centred day circle to the 32 px column before the row. */
329
+ inset-block: 0;
330
+ inset-inline-start: calc(-1 * var(--medo-space-8) - (var(--_cell) - var(--_day)) / 2);
331
+ }
332
+
333
+ /* ---------- Months · Years ---------- */
334
+
335
+ .medo-calendar__periods {
336
+ display: grid;
337
+ grid-template-columns: repeat(3, 1fr);
338
+ gap: var(--medo-space-2);
339
+ min-inline-size: calc(7 * var(--_cell));
340
+ }
341
+
342
+ .medo-calendar__period {
343
+ block-size: var(--_cell);
344
+ padding: 0;
345
+ border: 0;
346
+ border-radius: var(--medo-radius-full);
347
+ background-color: transparent;
348
+ color: var(--medo-color-text-primary);
349
+ font: var(--medo-typography-label-md);
350
+ cursor: pointer;
351
+ outline: none;
352
+ }
353
+
354
+ .medo-calendar--lg .medo-calendar__period {
355
+ font: var(--medo-typography-label-lg);
356
+ }
357
+
358
+ .medo-calendar__period[data-hovered] {
359
+ background-color: var(--medo-color-state-hover);
360
+ }
361
+
362
+ .medo-calendar__period[data-pressed] {
363
+ background-color: var(--medo-color-state-pressed);
364
+ }
365
+
366
+ .medo-calendar__period[data-current] {
367
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-action-primary);
368
+ color: var(--medo-color-text-brand);
369
+ font: var(--_strong);
370
+ }
371
+
372
+ .medo-calendar__period[data-selected] {
373
+ background-color: var(--medo-color-action-primary);
374
+ box-shadow: none;
375
+ color: var(--medo-color-text-on-action);
376
+ font: var(--_strong);
377
+ }
378
+
379
+ .medo-calendar__period[data-selected][data-hovered] {
380
+ background-color: var(--medo-color-action-primary-hover);
381
+ }
382
+
383
+ .medo-calendar__period[data-focus-visible] {
384
+ outline: var(--medo-focus-ring-width) solid var(--medo-color-focus-ring);
385
+ }
386
+
387
+ .medo-calendar__period[data-disabled] {
388
+ background-color: transparent;
389
+ color: var(--medo-color-text-disabled);
390
+ cursor: default;
391
+ }
392
+
393
+ /* Switching days ↔ months ↔ years cross-fades. */
394
+ .medo-calendar__months,
395
+ .medo-calendar__periods {
396
+ transition: opacity var(--medo-motion-duration-normal) var(--medo-motion-easing-enter);
397
+ }
398
+ @starting-style {
399
+ .medo-calendar__months,
400
+ .medo-calendar__periods {
401
+ opacity: 0;
402
+ }
403
+ }
404
+
405
+ @media (forced-colors: active) {
406
+ .medo-calendar__cell:is([data-selected], [data-selection-start], [data-selection-end]) .medo-calendar__day,
407
+ .medo-calendar__period[data-selected] {
408
+ forced-color-adjust: none;
409
+ background-color: Highlight;
410
+ color: HighlightText;
411
+ }
412
+ .medo-calendar__cell[data-focus-visible] .medo-calendar__day,
413
+ .medo-calendar__period[data-focus-visible] {
414
+ outline-color: CanvasText;
415
+ }
416
+ }
417
+
418
+ /* ---------- Panel ---------- */
419
+
420
+ .medo-date-popover {
421
+ max-inline-size: calc(100vw - 2 * var(--medo-space-4));
422
+ }
423
+
424
+ .medo-date-panel {
425
+ display: grid;
426
+ }
427
+
428
+ .medo-date-panel__range--presets {
429
+ display: grid;
430
+ grid-template-columns: 10.5rem auto; /* presets 168 */
431
+ }
432
+
433
+ .medo-date-panel__presets {
434
+ max-block-size: none;
435
+ padding: var(--medo-space-2);
436
+ border-inline-end: var(--medo-border-width-thin) solid var(--medo-color-border-default);
437
+ }
438
+
439
+ /* Date + time: the time row below the calendar, label left. */
440
+ .medo-date-panel__time {
441
+ padding: var(--medo-space-4);
442
+ border-block-start: var(--medo-border-width-thin) solid var(--medo-color-border-default);
443
+ }
444
+
445
+ .medo-date-panel__time .medo-field {
446
+ flex-direction: row;
447
+ align-items: center;
448
+ justify-content: space-between;
449
+ gap: var(--medo-space-4);
450
+ }
451
+
452
+ /* Bottom Sheet: the lg calendar fills the width, presets above it. */
453
+ .medo-date-sheet .medo-calendar {
454
+ inline-size: 100%;
455
+ padding-inline: var(--medo-space-2);
456
+ }
457
+
458
+ .medo-date-sheet .medo-calendar__grid {
459
+ margin-inline: auto;
460
+ }
461
+
462
+ .medo-date-sheet .medo-date-panel__range--presets {
463
+ grid-template-columns: 1fr;
464
+ }
465
+
466
+ .medo-date-sheet .medo-date-panel__presets {
467
+ border-inline-end: 0;
468
+ border-block-end: var(--medo-border-width-thin) solid var(--medo-color-border-default);
469
+ }
470
+
471
+ /* Time slots: Popover width 202. */
472
+ .medo-time-slots .medo-listbox {
473
+ min-inline-size: 12.5rem;
474
+ }