@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,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
+ }