@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.
- package/LICENSE +21 -0
- package/README.md +38 -2
- package/dist/index.d.ts +2021 -0
- package/dist/index.js +4721 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -4
- package/src/accordion/accordion.css +184 -0
- package/src/alert/alert.css +147 -0
- package/src/avatar/avatar.css +221 -0
- package/src/badge/badge.css +153 -0
- package/src/bottom-sheet/bottom-sheet.css +202 -0
- package/src/breadcrumbs/breadcrumbs.css +147 -0
- package/src/bulk-action-bar/bulk-action-bar.css +98 -0
- package/src/button/button.css +319 -0
- package/src/card/card.css +217 -0
- package/src/checkbox/choice.css +196 -0
- package/src/combobox/combobox.css +125 -0
- package/src/date-time/date-time.css +474 -0
- package/src/dialog/dialog.css +319 -0
- package/src/drawer/drawer.css +156 -0
- package/src/empty-state/empty-state.css +161 -0
- package/src/field/field.css +115 -0
- package/src/link/link.css +103 -0
- package/src/list/list.css +172 -0
- package/src/list-view/list-view.css +473 -0
- package/src/listbox/listbox.css +203 -0
- package/src/media/media.css +298 -0
- package/src/menu/menu.css +183 -0
- package/src/navigation/navigation.css +626 -0
- package/src/pagination/pagination.css +132 -0
- package/src/popover/popover.css +166 -0
- package/src/progress/progress.css +225 -0
- package/src/search/search.css +309 -0
- package/src/select/select.css +229 -0
- package/src/slider/slider.css +212 -0
- package/src/styles.css +40 -0
- package/src/switch/switch.css +160 -0
- package/src/table/table.css +276 -0
- package/src/tabs/tabs.css +211 -0
- package/src/tag/tag.css +225 -0
- package/src/text-field/input.css +206 -0
- package/src/toast/toast.css +184 -0
- package/src/toggle-button/toggle-button.css +143 -0
- package/src/tooltip/tooltip.css +66 -0
- package/src/upload/upload.css +380 -0
- package/src/utils/utilities.css +14 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field – med.o Design System
|
|
3
|
+
* Label + control + helper / error text. Used by TextField, CheckboxGroup, RadioGroup.
|
|
4
|
+
*
|
|
5
|
+
* State contract (data attributes, set by React Aria – other frameworks set the same):
|
|
6
|
+
* [data-invalid] [data-disabled] [data-required]
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
.medo-field {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
gap: var(--medo-space-1);
|
|
13
|
+
min-inline-size: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.medo-field--group {
|
|
17
|
+
gap: var(--medo-space-2);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.medo-field__label {
|
|
21
|
+
display: inline-flex;
|
|
22
|
+
gap: var(--medo-space-1);
|
|
23
|
+
padding-inline-start: var(--medo-space-0-5);
|
|
24
|
+
font: var(--medo-typography-label-md);
|
|
25
|
+
color: var(--medo-color-text-primary);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.medo-field__required {
|
|
29
|
+
color: var(--medo-color-text-danger);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.medo-field__footer {
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: flex-start;
|
|
35
|
+
gap: var(--medo-space-2);
|
|
36
|
+
padding-inline-start: var(--medo-space-0-5);
|
|
37
|
+
font: var(--medo-typography-body-sm);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.medo-field__footer:empty {
|
|
41
|
+
display: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.medo-field__description {
|
|
45
|
+
color: var(--medo-color-text-secondary);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* The error message replaces the helper text. */
|
|
49
|
+
.medo-field[data-invalid] > .medo-field__footer > .medo-field__description {
|
|
50
|
+
display: none;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.medo-field__error {
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: flex-start;
|
|
56
|
+
gap: var(--medo-space-1);
|
|
57
|
+
color: var(--medo-color-text-danger);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.medo-field__error > svg {
|
|
61
|
+
flex-shrink: 0;
|
|
62
|
+
inline-size: var(--medo-size-icon-sm);
|
|
63
|
+
block-size: var(--medo-size-icon-sm);
|
|
64
|
+
margin-block-start: var(--medo-space-0-5);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.medo-field__counter {
|
|
68
|
+
margin-inline-start: auto;
|
|
69
|
+
color: var(--medo-color-text-secondary);
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
font-variant-numeric: tabular-nums;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.medo-field__counter[data-over] {
|
|
75
|
+
color: var(--medo-color-text-danger);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.medo-field[data-disabled] .medo-field__label {
|
|
79
|
+
color: var(--medo-color-text-disabled);
|
|
80
|
+
}
|
|
81
|
+
/* Helper text stays readable when the field is disabled: it often explains why. */
|
|
82
|
+
|
|
83
|
+
/* Options of CheckboxGroup and RadioGroup */
|
|
84
|
+
.medo-field__options {
|
|
85
|
+
display: flex;
|
|
86
|
+
flex-direction: column;
|
|
87
|
+
gap: var(--medo-space-2);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.medo-field[data-orientation='horizontal'] .medo-field__options {
|
|
91
|
+
flex-direction: row;
|
|
92
|
+
flex-wrap: wrap;
|
|
93
|
+
column-gap: var(--medo-space-6);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Errors appear softly instead of popping in. */
|
|
97
|
+
.medo-field__error {
|
|
98
|
+
transition:
|
|
99
|
+
opacity var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
|
|
100
|
+
translate var(--medo-motion-spring-snappy-duration) var(--medo-motion-spring-snappy);
|
|
101
|
+
}
|
|
102
|
+
@starting-style {
|
|
103
|
+
.medo-field__error {
|
|
104
|
+
opacity: 0;
|
|
105
|
+
translate: 0 calc(-1 * var(--medo-space-1));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@media (prefers-reduced-motion: reduce) {
|
|
110
|
+
@starting-style {
|
|
111
|
+
.medo-field__error {
|
|
112
|
+
translate: none;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link – med.o Design System
|
|
3
|
+
*
|
|
4
|
+
* Navigates to a page, place or file. Actions are buttons.
|
|
5
|
+
* Inline (in running text, always underlined):
|
|
6
|
+
* <a class="medo-link" href="/privacy">privacy policy</a>
|
|
7
|
+
* Standalone (own line, underline on hover):
|
|
8
|
+
* <a class="medo-link medo-link--standalone medo-link--md" href="/projects">View all <svg …/></a>
|
|
9
|
+
*
|
|
10
|
+
* State contract: [data-hovered] [data-pressed] [data-focus-visible] [data-disabled]
|
|
11
|
+
* (set by React Aria – plain HTML falls back to :hover, :active, :focus-visible).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
.medo-link {
|
|
15
|
+
--_fg: var(--medo-color-text-brand);
|
|
16
|
+
--_underline: 1px;
|
|
17
|
+
|
|
18
|
+
color: var(--_fg);
|
|
19
|
+
font: inherit;
|
|
20
|
+
text-decoration-line: underline;
|
|
21
|
+
text-decoration-thickness: var(--_underline);
|
|
22
|
+
text-underline-offset: 0.2em;
|
|
23
|
+
border-radius: var(--medo-radius-sm);
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
outline: none;
|
|
26
|
+
-webkit-tap-highlight-color: transparent;
|
|
27
|
+
transition: color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.medo-link:is([data-hovered], :not([data-rac]):hover) {
|
|
31
|
+
--_fg: var(--medo-color-text-brand-hover);
|
|
32
|
+
--_underline: 2px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.medo-link:is([data-pressed], :not([data-rac]):active) {
|
|
36
|
+
--_fg: var(--medo-color-text-brand-pressed);
|
|
37
|
+
--_underline: 2px;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.medo-link:is([data-focus-visible], :not([data-rac]):focus-visible) {
|
|
41
|
+
outline: var(--medo-focus-ring-width) solid var(--medo-color-focus-ring);
|
|
42
|
+
outline-offset: 2px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* ---------- Standalone ---------- */
|
|
46
|
+
|
|
47
|
+
.medo-link--standalone {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: var(--medo-space-1);
|
|
51
|
+
min-block-size: var(--medo-space-6); /* 24 px target (WCAG 2.5.8) */
|
|
52
|
+
font: var(--medo-typography-label-md);
|
|
53
|
+
text-decoration-line: none;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.medo-link--standalone.medo-link--sm {
|
|
57
|
+
font: var(--medo-typography-label-sm);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.medo-link--standalone:is([data-hovered], [data-pressed], :not([data-rac]):hover, :not([data-rac]):active) {
|
|
61
|
+
text-decoration-line: underline;
|
|
62
|
+
--_underline: 1px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* ---------- Icons (external, arrow) ---------- */
|
|
66
|
+
|
|
67
|
+
.medo-link__icon {
|
|
68
|
+
display: inline-block;
|
|
69
|
+
inline-size: 1em;
|
|
70
|
+
block-size: 1em;
|
|
71
|
+
margin-inline-start: var(--medo-space-1);
|
|
72
|
+
vertical-align: -0.125em;
|
|
73
|
+
stroke-width: 2.5;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.medo-link--standalone .medo-link__icon {
|
|
77
|
+
margin-inline-start: 0;
|
|
78
|
+
vertical-align: baseline;
|
|
79
|
+
inline-size: var(--medo-space-4);
|
|
80
|
+
block-size: var(--medo-space-4);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.medo-link--standalone.medo-link--sm .medo-link__icon {
|
|
84
|
+
inline-size: var(--medo-space-3);
|
|
85
|
+
block-size: var(--medo-space-3);
|
|
86
|
+
stroke-width: 3;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.medo-link[data-disabled] {
|
|
90
|
+
--_fg: var(--medo-color-text-disabled);
|
|
91
|
+
cursor: not-allowed;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@media (forced-colors: active) {
|
|
95
|
+
.medo-link {
|
|
96
|
+
color: LinkText;
|
|
97
|
+
}
|
|
98
|
+
.medo-link:is([data-focus-visible], :not([data-rac]):focus-visible) {
|
|
99
|
+
outline-color: Highlight;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* Color fades stay with reduced motion – they do not move anything. */
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List – med.o Design System
|
|
3
|
+
*
|
|
4
|
+
* <ul class="medo-list medo-list--bullet [medo-list--md]"> bullets · <ol class="medo-list--number"> · <ul role="list" class="medo-list--check">
|
|
5
|
+
* <li class="medo-list__item">Text <ul class="medo-list …">level 2</ul></li>
|
|
6
|
+
* <li class="medo-list__item medo-list__item--excluded"><span class="medo-list__icon">×</span>…</li>
|
|
7
|
+
* </ul>
|
|
8
|
+
* <dl class="medo-dl medo-dl--auto"><div class="medo-dl__row"><dt class="medo-dl__term"/><dd class="medo-dl__value"/></div></dl>
|
|
9
|
+
* Without a size class the list takes the size of the surrounding text; markers scale with it.
|
|
10
|
+
* Marker column 24 (numbers 28), aligned to the first line. Item spacing space/2. Level 2: ring, „a.“.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
.medo-list {
|
|
14
|
+
--_col: 1.5rem; /* 24 */
|
|
15
|
+
--_icon: max(1rem, 1em); /* 16 · lg 20 */
|
|
16
|
+
|
|
17
|
+
display: grid;
|
|
18
|
+
gap: var(--medo-space-2);
|
|
19
|
+
margin: 0;
|
|
20
|
+
padding: 0;
|
|
21
|
+
list-style: none;
|
|
22
|
+
color: var(--medo-color-text-primary);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.medo-list--sm {
|
|
26
|
+
font: var(--medo-typography-body-sm);
|
|
27
|
+
}
|
|
28
|
+
.medo-list--md {
|
|
29
|
+
font: var(--medo-typography-body-md);
|
|
30
|
+
}
|
|
31
|
+
.medo-list--lg {
|
|
32
|
+
--_icon: var(--medo-size-icon-md); /* 20 */
|
|
33
|
+
font: var(--medo-typography-body-lg);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.medo-list--number {
|
|
37
|
+
--_col: 1.75rem; /* 28 */
|
|
38
|
+
counter-reset: medo-list;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.medo-list__item {
|
|
42
|
+
position: relative;
|
|
43
|
+
padding-inline-start: var(--_col);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Level 2 sits in the text column of its parent item: 24 px further in. */
|
|
47
|
+
.medo-list__item > .medo-list {
|
|
48
|
+
margin-block-start: var(--medo-space-2);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* ---------- Markers: own column, centred on the first line ---------- */
|
|
52
|
+
|
|
53
|
+
.medo-list--bullet > .medo-list__item::before,
|
|
54
|
+
.medo-list--number > .medo-list__item::before,
|
|
55
|
+
.medo-list__icon {
|
|
56
|
+
position: absolute;
|
|
57
|
+
inset-block-start: 0;
|
|
58
|
+
inset-inline-start: 0;
|
|
59
|
+
display: flex;
|
|
60
|
+
align-items: center;
|
|
61
|
+
block-size: 1lh;
|
|
62
|
+
color: var(--medo-color-text-secondary);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* Bullet: dot 6 (sm 5), centred in a box as tall as the first line. */
|
|
66
|
+
.medo-list--bullet > .medo-list__item::before {
|
|
67
|
+
content: '';
|
|
68
|
+
inset-block-start: calc(0.5lh - 0.1875em);
|
|
69
|
+
block-size: 0.375em;
|
|
70
|
+
inline-size: 0.375em;
|
|
71
|
+
border-radius: var(--medo-radius-full);
|
|
72
|
+
background-color: currentColor;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Level 2: ring. */
|
|
76
|
+
.medo-list__item .medo-list--bullet > .medo-list__item::before {
|
|
77
|
+
box-sizing: border-box;
|
|
78
|
+
border: 1.25px solid currentColor;
|
|
79
|
+
background-color: transparent;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Number: same style as the text, tabular figures, right aligned so „9.“ and „10.“ line up. */
|
|
83
|
+
.medo-list--number > .medo-list__item {
|
|
84
|
+
counter-increment: medo-list;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.medo-list--number > .medo-list__item::before {
|
|
88
|
+
content: counter(medo-list) '.';
|
|
89
|
+
justify-content: flex-end;
|
|
90
|
+
inline-size: calc(var(--_col) - 0.375em);
|
|
91
|
+
font-variant-numeric: tabular-nums;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.medo-list__item .medo-list--number > .medo-list__item::before {
|
|
95
|
+
content: counter(medo-list, lower-alpha) '.';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* ---------- Feature list ---------- */
|
|
99
|
+
|
|
100
|
+
.medo-list__icon {
|
|
101
|
+
color: var(--medo-color-text-brand);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.medo-list__icon > svg {
|
|
105
|
+
inline-size: var(--_icon);
|
|
106
|
+
block-size: var(--_icon);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.medo-list__item--excluded {
|
|
110
|
+
color: var(--medo-color-text-secondary);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.medo-list__item--excluded .medo-list__icon {
|
|
114
|
+
color: var(--medo-color-text-secondary);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ---------- Description list ---------- */
|
|
118
|
+
|
|
119
|
+
.medo-dl {
|
|
120
|
+
container-type: inline-size;
|
|
121
|
+
margin: 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.medo-dl__row {
|
|
125
|
+
display: grid;
|
|
126
|
+
grid-template-columns: 11.25rem minmax(0, 1fr); /* term column 180 */
|
|
127
|
+
gap: var(--medo-space-1) var(--medo-space-4);
|
|
128
|
+
align-items: baseline;
|
|
129
|
+
padding-block: var(--medo-space-3);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.medo-dl__row:first-child {
|
|
133
|
+
padding-block-start: 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.medo-dl__row + .medo-dl__row {
|
|
137
|
+
border-block-start: var(--medo-border-width-thin) solid var(--medo-color-border-default);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.medo-dl__term {
|
|
141
|
+
font: var(--medo-typography-label-md);
|
|
142
|
+
color: var(--medo-color-text-secondary);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.medo-dl__value {
|
|
146
|
+
min-inline-size: 0;
|
|
147
|
+
margin: 0;
|
|
148
|
+
font: var(--medo-typography-body-md);
|
|
149
|
+
color: var(--medo-color-text-primary);
|
|
150
|
+
overflow-wrap: anywhere;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.medo-dl--stacked .medo-dl__row {
|
|
154
|
+
grid-template-columns: minmax(0, 1fr);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* auto: stacked when the list itself is narrow (phone, Drawer, narrow column). */
|
|
158
|
+
@container (max-width: 22.5rem) {
|
|
159
|
+
.medo-dl--auto .medo-dl__row {
|
|
160
|
+
grid-template-columns: minmax(0, 1fr);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@media (forced-colors: active) {
|
|
165
|
+
.medo-list--bullet > .medo-list__item::before {
|
|
166
|
+
background-color: CanvasText;
|
|
167
|
+
}
|
|
168
|
+
.medo-list__item .medo-list--bullet > .medo-list__item::before {
|
|
169
|
+
background-color: transparent;
|
|
170
|
+
border-color: CanvasText;
|
|
171
|
+
}
|
|
172
|
+
}
|