@med-o/ui 0.0.0-stage → 0.1.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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -2
  3. package/dist/index.d.ts +2021 -0
  4. package/dist/index.js +4721 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +78 -4
  7. package/src/accordion/accordion.css +184 -0
  8. package/src/alert/alert.css +147 -0
  9. package/src/avatar/avatar.css +221 -0
  10. package/src/badge/badge.css +153 -0
  11. package/src/bottom-sheet/bottom-sheet.css +202 -0
  12. package/src/breadcrumbs/breadcrumbs.css +147 -0
  13. package/src/bulk-action-bar/bulk-action-bar.css +98 -0
  14. package/src/button/button.css +319 -0
  15. package/src/card/card.css +217 -0
  16. package/src/checkbox/choice.css +196 -0
  17. package/src/combobox/combobox.css +125 -0
  18. package/src/date-time/date-time.css +474 -0
  19. package/src/dialog/dialog.css +319 -0
  20. package/src/drawer/drawer.css +156 -0
  21. package/src/empty-state/empty-state.css +161 -0
  22. package/src/field/field.css +115 -0
  23. package/src/link/link.css +103 -0
  24. package/src/list/list.css +172 -0
  25. package/src/list-view/list-view.css +473 -0
  26. package/src/listbox/listbox.css +203 -0
  27. package/src/media/media.css +298 -0
  28. package/src/menu/menu.css +183 -0
  29. package/src/navigation/navigation.css +626 -0
  30. package/src/pagination/pagination.css +132 -0
  31. package/src/popover/popover.css +166 -0
  32. package/src/progress/progress.css +225 -0
  33. package/src/search/search.css +309 -0
  34. package/src/select/select.css +229 -0
  35. package/src/slider/slider.css +212 -0
  36. package/src/styles.css +40 -0
  37. package/src/switch/switch.css +160 -0
  38. package/src/table/table.css +276 -0
  39. package/src/tabs/tabs.css +211 -0
  40. package/src/tag/tag.css +225 -0
  41. package/src/text-field/input.css +206 -0
  42. package/src/toast/toast.css +184 -0
  43. package/src/toggle-button/toggle-button.css +143 -0
  44. package/src/tooltip/tooltip.css +66 -0
  45. package/src/upload/upload.css +380 -0
  46. package/src/utils/utilities.css +14 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Upload – med.o Design System
3
+ *
4
+ * <div class="medo-upload [medo-upload--grid] [medo-upload--compact]" role="group">
5
+ * label · Dropzone (or File trigger) · <ul class="medo-upload__list"> File items / File tiles · live region
6
+ * </div>
7
+ *
8
+ * Dropzone padding space/8 · gap space/3 · radius/lg · 1 px dashed border/strong · Icon tile md
9
+ * [data-drop-target] 2 px solid action/primary on surface/brand-subtle · [data-focus-visible] 2 px focus/ring
10
+ * --invalid dashed border/danger + message · [data-disabled] 50 %
11
+ * File item padding space/3 · gap space/3 · radius/md · border/default (error: border/danger) · leading 40 radius/sm
12
+ * File tile 136 · radius/md · overlay/media while uploading or on error · Media icon button 28 (hit 44)
13
+ * Lists gap space/2
14
+ */
15
+
16
+ .medo-upload {
17
+ display: grid;
18
+ gap: var(--medo-space-2);
19
+ min-inline-size: 0;
20
+ }
21
+
22
+ .medo-upload--compact {
23
+ gap: var(--medo-space-3);
24
+ }
25
+
26
+ .medo-upload__list {
27
+ display: grid;
28
+ gap: var(--medo-space-2);
29
+ margin: 0;
30
+ padding: 0;
31
+ list-style: none;
32
+ }
33
+
34
+ .medo-upload__list--grid {
35
+ grid-template-columns: repeat(auto-fill, calc(2 * var(--medo-space-16) + var(--medo-space-2)));
36
+ }
37
+
38
+ .medo-upload__item {
39
+ min-inline-size: 0;
40
+ }
41
+
42
+ /* ---------- Dropzone ---------- */
43
+
44
+ .medo-dropzone {
45
+ box-sizing: border-box;
46
+ display: flex;
47
+ flex-direction: column;
48
+ align-items: center;
49
+ gap: var(--medo-space-3);
50
+ padding: var(--medo-space-8);
51
+ border: var(--medo-border-width-thin) dashed var(--medo-color-border-strong);
52
+ border-radius: var(--medo-radius-lg);
53
+ background-color: var(--medo-color-surface-default);
54
+ text-align: center;
55
+ transition:
56
+ background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
57
+ border-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
58
+ }
59
+
60
+ .medo-dropzone__title {
61
+ font: var(--medo-typography-label-md);
62
+ color: var(--medo-color-text-primary);
63
+ }
64
+
65
+ .medo-dropzone__hint {
66
+ font: var(--medo-typography-caption);
67
+ color: var(--medo-color-text-secondary);
68
+ }
69
+
70
+ .medo-dropzone__error {
71
+ justify-content: center;
72
+ font: var(--medo-typography-body-sm);
73
+ text-align: start;
74
+ }
75
+
76
+ /* 2 px without a layout shift: the 1 px border plus a 1 px inset ring. */
77
+ .medo-dropzone[data-drop-target] {
78
+ border-style: solid;
79
+ border-color: var(--medo-color-action-primary);
80
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-action-primary);
81
+ background-color: var(--medo-color-surface-brand-subtle);
82
+ }
83
+
84
+ .medo-dropzone[data-drop-target] .medo-icon-tile {
85
+ background-color: var(--medo-color-surface-default);
86
+ color: var(--medo-color-text-brand);
87
+ }
88
+
89
+ /* While dragging, the drop is the action – the button would only distract. */
90
+ .medo-dropzone[data-drop-target] .medo-dropzone__button {
91
+ display: none;
92
+ }
93
+
94
+ .medo-dropzone[data-focus-visible] {
95
+ border-style: solid;
96
+ border-color: var(--medo-color-focus-ring);
97
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-focus-ring);
98
+ }
99
+
100
+ .medo-dropzone--invalid:not([data-drop-target], [data-focus-visible]) {
101
+ border-color: var(--medo-color-border-danger);
102
+ }
103
+
104
+ .medo-dropzone[data-disabled] {
105
+ opacity: 0.5;
106
+ }
107
+
108
+ /* ---------- File trigger ---------- */
109
+
110
+ .medo-file-trigger {
111
+ gap: var(--medo-space-2);
112
+ }
113
+
114
+ /* ---------- File name: truncates in the middle ---------- */
115
+
116
+ .medo-file-name {
117
+ display: block;
118
+ min-inline-size: 0;
119
+ }
120
+
121
+ .medo-file-name__visual {
122
+ display: flex;
123
+ min-inline-size: 0;
124
+ white-space: nowrap;
125
+ }
126
+
127
+ .medo-file-name__start {
128
+ min-inline-size: 0;
129
+ overflow: hidden;
130
+ text-overflow: ellipsis;
131
+ }
132
+
133
+ .medo-file-name__end {
134
+ flex: none;
135
+ }
136
+
137
+ /* ---------- File item ---------- */
138
+
139
+ .medo-file-item {
140
+ box-sizing: border-box;
141
+ display: flex;
142
+ align-items: center;
143
+ gap: var(--medo-space-3);
144
+ padding: var(--medo-space-3);
145
+ border: var(--medo-border-width-thin) solid var(--medo-color-border-default);
146
+ border-radius: var(--medo-radius-md);
147
+ background-color: var(--medo-color-surface-default);
148
+ }
149
+
150
+ .medo-file-item--error {
151
+ border-color: var(--medo-color-border-danger);
152
+ }
153
+
154
+ .medo-file-item__icon,
155
+ .medo-file-item__thumb {
156
+ flex: none;
157
+ inline-size: var(--medo-size-control-md); /* 40 */
158
+ block-size: var(--medo-size-control-md);
159
+ border-radius: var(--medo-radius-sm);
160
+ }
161
+
162
+ .medo-file-item__icon {
163
+ display: grid;
164
+ place-items: center;
165
+ background-color: var(--medo-color-surface-subtle);
166
+ color: var(--medo-color-text-secondary);
167
+ }
168
+
169
+ .medo-file-item__icon > svg {
170
+ inline-size: var(--medo-size-icon-md);
171
+ block-size: var(--medo-size-icon-md);
172
+ }
173
+
174
+ .medo-file-item__thumb {
175
+ object-fit: cover;
176
+ }
177
+
178
+ .medo-file-item__content {
179
+ display: grid;
180
+ flex: 1;
181
+ gap: var(--medo-space-0-5);
182
+ min-inline-size: 0;
183
+ }
184
+
185
+ .medo-file-item__name {
186
+ font: var(--medo-typography-label-md);
187
+ color: var(--medo-color-text-primary);
188
+ }
189
+
190
+ /* The meta line never truncates (size, %, error). */
191
+ .medo-file-item__meta {
192
+ display: flex;
193
+ align-items: flex-start;
194
+ gap: var(--medo-space-1);
195
+ font: var(--medo-typography-caption);
196
+ font-variant-numeric: tabular-nums;
197
+ color: var(--medo-color-text-secondary);
198
+ }
199
+
200
+ .medo-file-item__meta > svg {
201
+ flex: none;
202
+ inline-size: calc(var(--medo-space-3) + var(--medo-space-0-5)); /* 14 */
203
+ block-size: calc(var(--medo-space-3) + var(--medo-space-0-5));
204
+ margin-block-start: calc(var(--medo-space-0-5) / 2);
205
+ }
206
+
207
+ .medo-file-item__done {
208
+ color: var(--medo-color-feedback-success-text);
209
+ }
210
+
211
+ .medo-file-item__meta--error {
212
+ color: var(--medo-color-feedback-danger-text);
213
+ }
214
+
215
+ .medo-file-item__progress {
216
+ margin-block-start: var(--medo-space-1);
217
+ }
218
+
219
+ .medo-file-item__actions {
220
+ display: flex;
221
+ flex: none;
222
+ gap: var(--medo-space-1);
223
+ }
224
+
225
+ /* Touch: the icon buttons grow to 44 px targets. */
226
+ @media (max-width: 639.98px) {
227
+ .medo-file-item__actions .medo-button--icon-only {
228
+ inline-size: calc(var(--medo-space-10) + var(--medo-space-1));
229
+ block-size: calc(var(--medo-space-10) + var(--medo-space-1));
230
+ }
231
+ }
232
+
233
+ /* ---------- File tile ---------- */
234
+
235
+ .medo-file-tile {
236
+ display: grid;
237
+ gap: var(--medo-space-2);
238
+ inline-size: calc(2 * var(--medo-space-16) + var(--medo-space-2)); /* 136 */
239
+ }
240
+
241
+ .medo-file-tile__media {
242
+ position: relative;
243
+ aspect-ratio: 1;
244
+ border-radius: var(--medo-radius-md);
245
+ background-color: var(--medo-color-surface-subtle);
246
+ overflow: hidden;
247
+ }
248
+
249
+ .medo-file-tile--error .medo-file-tile__media {
250
+ box-shadow: inset 0 0 0 var(--medo-border-width-thick) var(--medo-color-border-danger);
251
+ }
252
+
253
+ .medo-file-tile__image {
254
+ display: block;
255
+ inline-size: 100%;
256
+ block-size: 100%;
257
+ object-fit: cover;
258
+ }
259
+
260
+ .medo-file-tile__placeholder {
261
+ display: grid;
262
+ place-items: center;
263
+ block-size: 100%;
264
+ color: var(--medo-color-text-secondary);
265
+ }
266
+
267
+ .medo-file-tile__placeholder > svg {
268
+ inline-size: var(--medo-size-icon-lg);
269
+ block-size: var(--medo-size-icon-lg);
270
+ }
271
+
272
+ .medo-file-tile__overlay {
273
+ position: absolute;
274
+ inset: 0;
275
+ box-sizing: border-box;
276
+ display: flex;
277
+ flex-direction: column;
278
+ align-items: center;
279
+ justify-content: center;
280
+ gap: var(--medo-space-2);
281
+ padding-inline: var(--medo-space-6);
282
+ border: 0;
283
+ background-color: var(--medo-color-overlay-media);
284
+ color: var(--medo-color-text-on-media);
285
+ font: var(--medo-typography-label-md);
286
+ }
287
+
288
+ /* Error: the danger border stays visible above the overlay. */
289
+ .medo-file-tile--error .medo-file-tile__overlay {
290
+ border: var(--medo-border-width-thick) solid var(--medo-color-border-danger);
291
+ border-radius: inherit;
292
+ }
293
+
294
+ .medo-file-tile__overlay > svg {
295
+ inline-size: var(--medo-size-icon-lg);
296
+ block-size: var(--medo-size-icon-lg);
297
+ }
298
+
299
+ .medo-file-tile__retry {
300
+ cursor: pointer;
301
+ background-image: linear-gradient(var(--_tint, transparent), var(--_tint, transparent));
302
+ }
303
+
304
+ .medo-file-tile__retry[data-hovered] {
305
+ --_tint: var(--medo-color-state-hover-on-media);
306
+ }
307
+
308
+ .medo-file-tile__retry[data-pressed] {
309
+ --_tint: var(--medo-color-state-pressed-on-media);
310
+ }
311
+
312
+ .medo-file-tile__retry[data-focus-visible] {
313
+ outline: none;
314
+ box-shadow: var(--medo-shadow-focus-ring-inset);
315
+ }
316
+
317
+ .medo-file-tile__percent {
318
+ font-variant-numeric: tabular-nums;
319
+ }
320
+
321
+ /* Progress bar on the image: white fill on a translucent track. */
322
+ .medo-file-tile__progress {
323
+ inline-size: 100%;
324
+ --_fill: var(--medo-color-text-on-media);
325
+ }
326
+
327
+ .medo-file-tile__progress .medo-progress__track {
328
+ background-color: var(--medo-color-surface-on-media);
329
+ }
330
+
331
+ .medo-file-tile__remove {
332
+ position: absolute;
333
+ inset-block-start: var(--medo-space-2);
334
+ inset-inline-end: var(--medo-space-2);
335
+ }
336
+
337
+ .medo-file-tile__caption {
338
+ font: var(--medo-typography-caption);
339
+ color: var(--medo-color-text-secondary);
340
+ }
341
+
342
+ /* Error captions name the problem – they wrap instead of truncating. */
343
+ .medo-file-tile__caption--error {
344
+ color: var(--medo-color-feedback-danger-text);
345
+ }
346
+
347
+ /* New files slide in softly (iOS list insert). */
348
+ .medo-upload__item {
349
+ transition:
350
+ opacity var(--medo-motion-duration-normal) var(--medo-motion-easing-enter),
351
+ translate var(--medo-motion-spring-smooth-duration) var(--medo-motion-spring-smooth);
352
+ }
353
+ @starting-style {
354
+ .medo-upload__item {
355
+ opacity: 0;
356
+ translate: 0 var(--medo-space-2);
357
+ }
358
+ }
359
+
360
+ @media (prefers-reduced-motion: reduce) {
361
+ .medo-upload__item {
362
+ transition: opacity var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
363
+ }
364
+ @starting-style {
365
+ .medo-upload__item {
366
+ translate: none;
367
+ }
368
+ }
369
+ }
370
+
371
+ @media (forced-colors: active) {
372
+ .medo-dropzone[data-drop-target],
373
+ .medo-dropzone[data-focus-visible] {
374
+ border-color: Highlight;
375
+ }
376
+ .medo-file-item--error,
377
+ .medo-file-tile--error .medo-file-tile__overlay {
378
+ border-color: Mark;
379
+ }
380
+ }
@@ -0,0 +1,14 @@
1
+ /* Shared helpers of @med-o/ui. */
2
+
3
+ /* Hidden on screen, still read by screen readers. */
4
+ .medo-visually-hidden {
5
+ position: absolute;
6
+ inline-size: 1px;
7
+ block-size: 1px;
8
+ margin: -1px;
9
+ padding: 0;
10
+ overflow: hidden;
11
+ clip-path: inset(50%);
12
+ white-space: nowrap;
13
+ border: 0;
14
+ }