@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,211 @@
1
+ /**
2
+ * Tabs – med.o Design System
3
+ *
4
+ * Contained style: tabs sit in a track, the selected tab is a raised thumb.
5
+ * <div class="medo-tabs medo-tabs--md [medo-tabs--full]">
6
+ * <div class="medo-tabs__list" role="tablist"> track: surface/subtle, radius/md, padding + gap 4
7
+ * <div class="medo-tab" role="tab" [data-selected]>
8
+ * <div class="medo-tab__thumb"></div> surface/thumb, elevation/1 (selected only, slides)
9
+ * <span class="medo-tab__icon">…</span> <span class="medo-tab__label">Activity</span> <span class="medo-badge-count">3</span>
10
+ * </div>
11
+ * </div>
12
+ * <div class="medo-tabs__panel" role="tabpanel">…</div>
13
+ * </div>
14
+ * Below 640 px: always lg; up to 3 tabs fill the width, more scroll with a fade.
15
+ * State contract: [data-selected] [data-hovered] [data-pressed] [data-focus-visible] [data-disabled],
16
+ * list [data-scroll-start] [data-scroll-end], panel [data-inert] (hidden).
17
+ */
18
+
19
+ .medo-tabs {
20
+ --_tab-h: var(--medo-size-control-sm); /* 32 */
21
+ --_tab-pad: var(--medo-space-3);
22
+ --_label: var(--medo-typography-label-md);
23
+ --_icon: var(--medo-size-icon-sm);
24
+
25
+ display: grid;
26
+ gap: var(--medo-space-4);
27
+ min-inline-size: 0;
28
+ }
29
+
30
+ .medo-tabs--lg {
31
+ --_tab-h: var(--medo-size-control-md); /* 40 */
32
+ --_tab-pad: var(--medo-space-4);
33
+ --_label: var(--medo-typography-label-lg);
34
+ --_icon: var(--medo-size-icon-md);
35
+ }
36
+
37
+ /* ---------- Track ---------- */
38
+
39
+ .medo-tabs__list {
40
+ display: flex;
41
+ gap: var(--medo-space-1);
42
+ justify-self: start;
43
+ max-inline-size: 100%;
44
+ padding: var(--medo-space-1);
45
+ border-radius: var(--medo-radius-md);
46
+ background-color: var(--medo-color-surface-subtle);
47
+ overflow-x: auto;
48
+ scrollbar-width: none;
49
+ outline: none;
50
+ }
51
+
52
+ .medo-tabs__list::-webkit-scrollbar {
53
+ display: none;
54
+ }
55
+
56
+ .medo-tabs--full .medo-tabs__list {
57
+ justify-self: stretch;
58
+ }
59
+
60
+ .medo-tabs--full .medo-tab {
61
+ flex: 1;
62
+ }
63
+
64
+ /* Fade at an edge that still has tabs – they never wrap. */
65
+ .medo-tabs__list[data-scroll-end] {
66
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--medo-space-8)), transparent);
67
+ }
68
+ .medo-tabs__list[data-scroll-start] {
69
+ mask-image: linear-gradient(to left, #000 calc(100% - var(--medo-space-8)), transparent);
70
+ }
71
+ .medo-tabs__list[data-scroll-start][data-scroll-end] {
72
+ mask-image: linear-gradient(to right, transparent, #000 var(--medo-space-8), #000 calc(100% - var(--medo-space-8)), transparent);
73
+ }
74
+
75
+ /* ---------- Tab ---------- */
76
+
77
+ .medo-tab {
78
+ position: relative;
79
+ box-sizing: border-box;
80
+ display: inline-flex;
81
+ flex: none;
82
+ align-items: center;
83
+ justify-content: center;
84
+ gap: var(--medo-space-2);
85
+ block-size: var(--_tab-h);
86
+ padding-inline: var(--_tab-pad);
87
+ border-radius: var(--medo-radius-sm);
88
+ font: var(--_label);
89
+ color: var(--medo-color-text-secondary);
90
+ white-space: nowrap;
91
+ cursor: pointer;
92
+ outline: none;
93
+ -webkit-tap-highlight-color: transparent;
94
+ }
95
+
96
+ /* Content above the thumb. */
97
+ .medo-tab > :not(.medo-tab__thumb) {
98
+ position: relative;
99
+ z-index: 1;
100
+ }
101
+
102
+ .medo-tab:not([data-selected])[data-hovered] {
103
+ background-color: var(--medo-color-state-hover);
104
+ color: var(--medo-color-text-primary);
105
+ }
106
+
107
+ .medo-tab:not([data-selected])[data-pressed] {
108
+ background-color: var(--medo-color-state-pressed);
109
+ color: var(--medo-color-text-primary);
110
+ }
111
+
112
+ .medo-tab[data-selected] {
113
+ color: var(--medo-color-text-primary);
114
+ cursor: default;
115
+ }
116
+
117
+ .medo-tab[data-disabled] {
118
+ color: var(--medo-color-text-disabled);
119
+ cursor: not-allowed;
120
+ }
121
+
122
+ /* Focus ring inside, drawn above the thumb. */
123
+ .medo-tab::after {
124
+ content: '';
125
+ position: absolute;
126
+ inset: 0;
127
+ z-index: 2;
128
+ border-radius: inherit;
129
+ pointer-events: none;
130
+ }
131
+
132
+ .medo-tab[data-focus-visible]::after {
133
+ box-shadow: var(--medo-shadow-focus-ring-inset);
134
+ }
135
+
136
+ .medo-tab__thumb {
137
+ position: absolute;
138
+ inset: 0;
139
+ border-radius: inherit;
140
+ background-color: var(--medo-color-surface-thumb);
141
+ box-shadow: var(--medo-shadow-elevation-1);
142
+ /* SelectionIndicator animates translate and size from the previous tab – a snappy spring, so the eye follows the selection. */
143
+ transition:
144
+ translate var(--medo-motion-spring-snappy-duration) var(--medo-motion-spring-snappy),
145
+ width var(--medo-motion-spring-snappy-duration) var(--medo-motion-spring-snappy);
146
+ }
147
+
148
+ .medo-tab__icon {
149
+ display: inline-flex;
150
+ inline-size: var(--_icon);
151
+ block-size: var(--_icon);
152
+ }
153
+
154
+ .medo-tab__icon > svg {
155
+ inline-size: 100%;
156
+ block-size: 100%;
157
+ }
158
+
159
+ /* ---------- Panel ---------- */
160
+
161
+ .medo-tabs__panel {
162
+ min-inline-size: 0;
163
+ border-radius: var(--medo-radius-sm);
164
+ outline: none;
165
+ }
166
+
167
+ .medo-tabs__panel[data-focus-visible] {
168
+ box-shadow: var(--medo-shadow-focus-ring);
169
+ }
170
+
171
+ /* Kept mounted (input is not lost), but hidden while another tab is selected. */
172
+ .medo-tabs__panel[data-inert] {
173
+ display: none;
174
+ }
175
+
176
+ /* ---------- Mobile < 640 px: always lg; up to 3 tabs fill, more scroll ---------- */
177
+
178
+ @media (max-width: 639.98px) {
179
+ .medo-tabs {
180
+ --_tab-h: var(--medo-size-control-md);
181
+ --_tab-pad: var(--medo-space-4);
182
+ --_label: var(--medo-typography-label-lg);
183
+ --_icon: var(--medo-size-icon-md);
184
+ }
185
+ .medo-tabs__list:not(:has(> .medo-tab:nth-child(4))) {
186
+ justify-self: stretch;
187
+ }
188
+ .medo-tabs__list:not(:has(> .medo-tab:nth-child(4))) > .medo-tab {
189
+ flex: 1;
190
+ }
191
+ }
192
+
193
+ @media (forced-colors: active) {
194
+ .medo-tabs__list {
195
+ border: 1px solid CanvasText;
196
+ }
197
+ .medo-tab[data-selected] .medo-tab__thumb {
198
+ border: 2px solid Highlight;
199
+ }
200
+ .medo-tab[data-focus-visible]::after {
201
+ outline: 2px solid Highlight;
202
+ outline-offset: -2px;
203
+ }
204
+ }
205
+
206
+ @media (prefers-reduced-motion: reduce) {
207
+ /* Reduced motion: the thumb appears at the new tab, no slide. */
208
+ .medo-tab__thumb {
209
+ transition: none;
210
+ }
211
+ }
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Tag – med.o Design System
3
+ *
4
+ * Compact pill for a value. Two roles, never mixed:
5
+ * removable – a chosen value (multi-select): the x removes it
6
+ * selectable – a filter: the whole tag toggles, a check marks “selected”
7
+ *
8
+ * Structure:
9
+ * <div class="medo-tag medo-tag--md [medo-tag--selectable]">
10
+ * <span class="medo-tag__icon">…</span>
11
+ * <span class="medo-tag__label">Design</span>
12
+ * <button class="medo-tag__remove" aria-label="Remove">…</button>
13
+ * </div>
14
+ *
15
+ * State contract: [data-hovered] [data-pressed] [data-selected] [data-focus-visible]
16
+ * [data-disabled] [data-allows-removing] (set by React Aria – other frameworks set the same).
17
+ */
18
+
19
+ .medo-tag-list {
20
+ display: flex;
21
+ flex-wrap: wrap;
22
+ gap: var(--medo-space-2);
23
+ }
24
+
25
+ .medo-tag {
26
+ --_bg: var(--medo-color-action-secondary);
27
+ --_fg: var(--medo-color-text-primary);
28
+ --_icon: var(--medo-color-text-secondary);
29
+ --_h: var(--medo-space-8);
30
+ --_icon-size: var(--medo-space-4);
31
+ --_pad: var(--medo-space-3);
32
+
33
+ box-sizing: border-box;
34
+ display: inline-flex;
35
+ align-items: center;
36
+ gap: var(--medo-space-1);
37
+ block-size: var(--_h);
38
+ padding-inline: var(--_pad);
39
+ border-radius: var(--medo-radius-full);
40
+ background-color: var(--_bg);
41
+ color: var(--_fg);
42
+ font: var(--medo-typography-label-md);
43
+ white-space: nowrap;
44
+ outline: none;
45
+ cursor: default;
46
+ -webkit-tap-highlight-color: transparent;
47
+ transition:
48
+ background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
49
+ color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
50
+ }
51
+
52
+ .medo-tag--sm {
53
+ --_h: var(--medo-space-6);
54
+ --_icon-size: var(--medo-space-3);
55
+ --_pad: var(--medo-space-2);
56
+ font: var(--medo-typography-label-sm);
57
+ }
58
+
59
+ .medo-tag[data-allows-removing] {
60
+ padding-inline-end: var(--medo-space-1);
61
+ }
62
+
63
+ .medo-tag__label {
64
+ max-inline-size: 12.5rem; /* 200 px, then ellipsis */
65
+ overflow: hidden;
66
+ text-overflow: ellipsis;
67
+ }
68
+
69
+ .medo-tag__icon {
70
+ display: inline-flex;
71
+ flex-shrink: 0;
72
+ color: var(--_icon);
73
+ }
74
+
75
+ .medo-tag__icon > svg {
76
+ inline-size: var(--_icon-size);
77
+ block-size: var(--_icon-size);
78
+ stroke-width: 2.66; /* ≈ 1.33 px at 16 px */
79
+ }
80
+
81
+ .medo-tag--sm .medo-tag__icon > svg {
82
+ stroke-width: 3; /* 1.5 px at 12 px */
83
+ }
84
+
85
+ /* ---------- Selectable (filter) ---------- */
86
+
87
+ .medo-tag--selectable {
88
+ cursor: pointer;
89
+ user-select: none;
90
+ }
91
+
92
+ .medo-tag--selectable[data-hovered] {
93
+ --_bg: var(--medo-color-action-secondary-hover);
94
+ }
95
+ .medo-tag--selectable[data-pressed] {
96
+ --_bg: var(--medo-color-action-secondary-pressed);
97
+ }
98
+
99
+ .medo-tag[data-selected] {
100
+ --_bg: var(--medo-color-action-selected);
101
+ --_fg: var(--medo-color-text-brand);
102
+ --_icon: var(--medo-color-text-brand);
103
+ }
104
+ .medo-tag[data-selected][data-hovered] {
105
+ --_bg: var(--medo-color-action-selected-hover);
106
+ }
107
+ .medo-tag[data-selected][data-pressed] {
108
+ --_bg: var(--medo-color-action-selected-pressed);
109
+ --_fg: var(--medo-color-text-brand-hover);
110
+ --_icon: var(--medo-color-text-brand-hover);
111
+ }
112
+
113
+ /* ---------- Focus · disabled ---------- */
114
+
115
+ .medo-tag[data-focus-visible] {
116
+ box-shadow: var(--medo-shadow-focus-ring);
117
+ }
118
+
119
+ .medo-tag[data-disabled] {
120
+ --_bg: var(--medo-color-action-disabled);
121
+ --_fg: var(--medo-color-text-disabled);
122
+ --_icon: var(--medo-color-text-disabled);
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ /* ---------- Remove button (x) ---------- */
127
+
128
+ .medo-tag__remove {
129
+ --_size: var(--medo-space-6);
130
+
131
+ position: relative;
132
+ box-sizing: border-box;
133
+ display: inline-grid;
134
+ place-items: center;
135
+ flex-shrink: 0;
136
+ inline-size: var(--_size);
137
+ block-size: var(--_size);
138
+ padding: 0;
139
+ border: 0;
140
+ border-radius: var(--medo-radius-full);
141
+ background-color: transparent;
142
+ color: var(--medo-color-text-secondary);
143
+ cursor: pointer;
144
+ outline: none;
145
+ transition: background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
146
+ }
147
+
148
+ .medo-tag__remove > svg {
149
+ inline-size: var(--medo-space-4);
150
+ block-size: var(--medo-space-4);
151
+ stroke-width: 2.66;
152
+ }
153
+
154
+ .medo-tag--sm .medo-tag__remove {
155
+ --_size: var(--medo-space-4);
156
+ }
157
+
158
+ .medo-tag--sm .medo-tag__remove > svg {
159
+ inline-size: var(--medo-space-3);
160
+ block-size: var(--medo-space-3);
161
+ stroke-width: 3;
162
+ }
163
+
164
+ /* sm: 16 px visible, 24 × 24 px hit area (WCAG 2.5.8). */
165
+ .medo-tag--sm .medo-tag__remove::before {
166
+ content: '';
167
+ position: absolute;
168
+ inset: calc(-1 * var(--medo-space-1));
169
+ }
170
+
171
+ .medo-tag__remove[data-hovered] {
172
+ background-color: var(--medo-color-state-hover);
173
+ color: var(--medo-color-text-primary);
174
+ }
175
+ .medo-tag__remove[data-pressed] {
176
+ background-color: var(--medo-color-state-pressed);
177
+ color: var(--medo-color-text-primary);
178
+ }
179
+ .medo-tag__remove[data-focus-visible] {
180
+ box-shadow: var(--medo-shadow-focus-ring-inset);
181
+ }
182
+ .medo-tag__remove[data-disabled] {
183
+ background-color: transparent;
184
+ color: var(--medo-color-text-disabled);
185
+ cursor: not-allowed;
186
+ }
187
+
188
+ /* ---------- System settings ---------- */
189
+
190
+ @media (forced-colors: active) {
191
+ .medo-tag {
192
+ border: var(--medo-border-width-thin) solid CanvasText;
193
+ }
194
+ .medo-tag[data-selected] {
195
+ border-width: var(--medo-border-width-thick);
196
+ }
197
+ .medo-tag[data-focus-visible],
198
+ .medo-tag__remove[data-focus-visible] {
199
+ outline: var(--medo-focus-ring-width) solid Highlight;
200
+ outline-offset: 2px;
201
+ }
202
+ }
203
+
204
+ /* New tags pop in with a snappy spring (filters, multi-select). */
205
+ @starting-style {
206
+ .medo-tag {
207
+ opacity: 0;
208
+ scale: 0.9;
209
+ }
210
+ }
211
+ .medo-tag {
212
+ transition:
213
+ background-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
214
+ color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
215
+ opacity var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
216
+ scale var(--medo-motion-spring-snappy-duration) var(--medo-motion-spring-snappy);
217
+ }
218
+
219
+ @media (prefers-reduced-motion: reduce) {
220
+ @starting-style {
221
+ .medo-tag {
222
+ scale: none;
223
+ }
224
+ }
225
+ }
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Input + Textarea – med.o Design System
3
+ *
4
+ * <div class="medo-input medo-input--md">
5
+ * <span class="medo-input__icon">…</span>
6
+ * <input class="medo-input__control">
7
+ * <button class="medo-input__action" aria-label="…">…</button>
8
+ * </div>
9
+ * <textarea class="medo-textarea medo-textarea--md"></textarea>
10
+ *
11
+ * Sizes sm / md / lg = 32 / 40 / 48 px. Mobile and touch: always lg (16 px text prevents the automatic zoom of mobile browsers).
12
+ * Focus: the border turns focus/ring plus 1 px inside (flush, no outer band).
13
+ */
14
+
15
+ .medo-input,
16
+ .medo-textarea {
17
+ --_border: var(--medo-color-border-strong);
18
+
19
+ box-sizing: border-box;
20
+ inline-size: 100%;
21
+ border: var(--medo-border-width-thin) solid var(--_border);
22
+ border-radius: var(--medo-radius-md);
23
+ background-color: var(--medo-color-surface-default);
24
+ color: var(--medo-color-text-primary);
25
+ font: var(--medo-typography-body-sm);
26
+ transition:
27
+ border-color var(--medo-motion-duration-fast) var(--medo-motion-easing-standard),
28
+ box-shadow var(--medo-motion-duration-fast) var(--medo-motion-easing-standard);
29
+ }
30
+
31
+ .medo-input {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--medo-space-2);
35
+ block-size: var(--medo-size-control-md);
36
+ padding-inline: var(--medo-space-3);
37
+ cursor: text;
38
+ }
39
+
40
+ .medo-input__control {
41
+ flex: 1;
42
+ min-inline-size: 0;
43
+ block-size: 100%;
44
+ padding: 0;
45
+ border: 0;
46
+ outline: none;
47
+ background: transparent;
48
+ color: inherit;
49
+ font: inherit;
50
+ }
51
+
52
+ .medo-input__control::placeholder,
53
+ .medo-textarea::placeholder {
54
+ color: var(--medo-color-text-secondary);
55
+ opacity: 1;
56
+ }
57
+
58
+ .medo-input__icon {
59
+ display: inline-flex;
60
+ flex-shrink: 0;
61
+ inline-size: var(--medo-size-icon-sm);
62
+ block-size: var(--medo-size-icon-sm);
63
+ color: var(--medo-color-text-secondary);
64
+ }
65
+
66
+ .medo-input__icon > svg {
67
+ inline-size: 100%;
68
+ block-size: 100%;
69
+ }
70
+
71
+ /* ---------- Textarea ---------- */
72
+
73
+ .medo-textarea {
74
+ display: block;
75
+ padding: var(--medo-space-2) var(--medo-space-3);
76
+ /* 3 rows minimum, grows with the content up to 8 rows (where supported), then scrolls. */
77
+ min-block-size: calc(3lh + 2 * var(--medo-space-2) + 2 * var(--medo-border-width-thin));
78
+ max-block-size: calc(8lh + 2 * var(--medo-space-2) + 2 * var(--medo-border-width-thin));
79
+ field-sizing: content;
80
+ resize: vertical;
81
+ overflow: auto;
82
+ outline: none;
83
+ }
84
+
85
+ /* ---------- States ---------- */
86
+
87
+ @media (hover: hover) {
88
+ .medo-input:hover:not(:has(> .medo-input__control:is(:disabled, [readonly]))),
89
+ .medo-textarea:hover:not(:disabled, [readonly]) {
90
+ --_border: var(--medo-color-border-strong-hover);
91
+ }
92
+ }
93
+
94
+ .medo-input:has(> .medo-input__control[data-invalid]),
95
+ .medo-textarea[data-invalid] {
96
+ --_border: var(--medo-color-border-danger);
97
+ }
98
+
99
+ .medo-input:has(> .medo-input__control:focus),
100
+ .medo-textarea:focus {
101
+ --_border: var(--medo-color-focus-ring);
102
+ box-shadow: inset 0 0 0 var(--medo-border-width-thin) var(--medo-color-focus-ring);
103
+ }
104
+
105
+ .medo-input:has(> .medo-input__control[readonly]),
106
+ .medo-textarea[readonly] {
107
+ --_border: var(--medo-color-border-default);
108
+ background-color: var(--medo-color-surface-subtle);
109
+ }
110
+
111
+ .medo-input:has(> .medo-input__control:disabled),
112
+ .medo-textarea:disabled {
113
+ --_border: var(--medo-color-border-default);
114
+ background-color: var(--medo-color-action-disabled);
115
+ color: var(--medo-color-text-disabled);
116
+ cursor: not-allowed;
117
+ }
118
+
119
+ .medo-input:has(> .medo-input__control:disabled) .medo-input__icon {
120
+ color: var(--medo-color-text-disabled);
121
+ }
122
+
123
+ @media (forced-colors: active) {
124
+ .medo-input:has(> .medo-input__control:focus),
125
+ .medo-textarea:focus {
126
+ outline: var(--medo-focus-ring-width) solid Highlight;
127
+ }
128
+ }
129
+
130
+ /* Color fades stay with reduced motion – they do not move anything. */
131
+
132
+ /* ---------- Sizes ---------- */
133
+
134
+ .medo-input--sm {
135
+ block-size: var(--medo-size-control-sm);
136
+ }
137
+
138
+ .medo-input--lg {
139
+ block-size: var(--medo-size-control-lg);
140
+ padding-inline: var(--medo-space-4);
141
+ font: var(--medo-typography-body-md);
142
+ }
143
+
144
+ .medo-input--lg .medo-input__icon {
145
+ inline-size: var(--medo-size-icon-md);
146
+ block-size: var(--medo-size-icon-md);
147
+ }
148
+
149
+ .medo-textarea--lg {
150
+ padding: var(--medo-space-3) var(--medo-space-4);
151
+ font: var(--medo-typography-body-md);
152
+ min-block-size: calc(3lh + 2 * var(--medo-space-3) + 2 * var(--medo-border-width-thin));
153
+ max-block-size: calc(8lh + 2 * var(--medo-space-3) + 2 * var(--medo-border-width-thin));
154
+ }
155
+
156
+ /* ---------- Trailing action (e.g. clear, show password) ---------- */
157
+
158
+ .medo-input__action {
159
+ display: inline-grid;
160
+ place-items: center;
161
+ flex-shrink: 0;
162
+ inline-size: var(--medo-size-icon-lg);
163
+ block-size: var(--medo-size-icon-lg);
164
+ margin-inline-end: calc(-1 * var(--medo-space-1));
165
+ padding: 0;
166
+ border: 0;
167
+ border-radius: var(--medo-radius-sm);
168
+ background: transparent;
169
+ color: var(--medo-color-text-secondary);
170
+ cursor: pointer;
171
+ outline: none;
172
+ }
173
+
174
+ .medo-input__action > svg {
175
+ inline-size: var(--medo-size-icon-sm);
176
+ block-size: var(--medo-size-icon-sm);
177
+ }
178
+
179
+ .medo-input__action[data-hovered] {
180
+ background: var(--medo-color-state-hover);
181
+ color: var(--medo-color-text-primary);
182
+ }
183
+
184
+ .medo-input__action[data-pressed] {
185
+ background: var(--medo-color-state-pressed);
186
+ color: var(--medo-color-text-primary);
187
+ }
188
+
189
+ .medo-input__action[data-focus-visible] {
190
+ box-shadow: inset 0 0 0 var(--medo-focus-ring-width) var(--medo-color-focus-ring);
191
+ }
192
+
193
+ .medo-input__action[data-disabled] {
194
+ color: var(--medo-color-text-disabled);
195
+ cursor: not-allowed;
196
+ }
197
+
198
+ .medo-input--lg .medo-input__action {
199
+ inline-size: var(--medo-size-control-sm);
200
+ block-size: var(--medo-size-control-sm);
201
+ }
202
+
203
+ .medo-input--lg .medo-input__action > svg {
204
+ inline-size: var(--medo-size-icon-md);
205
+ block-size: var(--medo-size-icon-md);
206
+ }