@marwes-ui/presets 0.0.4 → 1.0.1

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 +1 -1
  2. package/README.md +271 -47
  3. package/dist/chunk-2JNIKK66.js +21 -0
  4. package/dist/chunk-2JNIKK66.js.map +1 -0
  5. package/dist/firstEdition/index.d.ts +3 -3
  6. package/dist/firstEdition/index.js +1 -1
  7. package/dist/index.d.ts +2 -2
  8. package/dist/index.js +1 -1
  9. package/package.json +15 -9
  10. package/src/firstEdition/accordion.css +140 -0
  11. package/src/firstEdition/avatar.css +204 -0
  12. package/src/firstEdition/badge.css +139 -0
  13. package/src/firstEdition/button.css +219 -0
  14. package/src/firstEdition/card.css +136 -0
  15. package/src/firstEdition/checkbox.css +214 -0
  16. package/src/firstEdition/dialog.css +149 -0
  17. package/src/firstEdition/divider.css +37 -0
  18. package/src/firstEdition/icon.css +72 -0
  19. package/src/firstEdition/index.ts +19 -0
  20. package/src/firstEdition/input-otp.css +107 -0
  21. package/src/firstEdition/input.css +73 -0
  22. package/src/firstEdition/molecules/accordion-field.css +46 -0
  23. package/src/firstEdition/molecules/checkbox-field.css +53 -0
  24. package/src/firstEdition/molecules/checkbox-group-field.css +67 -0
  25. package/src/firstEdition/molecules/dialog-modal.css +34 -0
  26. package/src/firstEdition/molecules/input-field.css +260 -0
  27. package/src/firstEdition/molecules/radio-group-field.css +59 -0
  28. package/src/firstEdition/molecules/slider-field.css +83 -0
  29. package/src/firstEdition/molecules/switch-field.css +37 -0
  30. package/src/firstEdition/molecules/tab-group.css +26 -0
  31. package/src/firstEdition/molecules/toast-container.css +45 -0
  32. package/src/firstEdition/radio.css +121 -0
  33. package/src/firstEdition/rich-text.css +134 -0
  34. package/src/firstEdition/select.css +337 -0
  35. package/src/firstEdition/slider.css +228 -0
  36. package/src/firstEdition/spacing.css +6 -0
  37. package/src/firstEdition/spinner.css +94 -0
  38. package/src/firstEdition/styles.css +27 -0
  39. package/src/firstEdition/switch.css +156 -0
  40. package/src/firstEdition/tab.css +81 -0
  41. package/src/firstEdition/textarea.css +63 -0
  42. package/src/firstEdition/toast.css +318 -0
  43. package/src/firstEdition/tokens.css +35 -0
  44. package/src/firstEdition/tooltip.css +112 -0
  45. package/src/firstEdition/typography.css +33 -0
  46. package/dist/chunk-UJIVT75P.js +0 -26
  47. package/dist/chunk-UJIVT75P.js.map +0 -1
@@ -0,0 +1,204 @@
1
+ /*
2
+ * Avatar component styles
3
+ * Figma refs:
4
+ * - .figma/marwes/components/avatar.json
5
+ * - .figma/marwes/pages/-avatar/-avatar_1574-27460.json
6
+ * - .figma/marwes/pages/-avatar/-avatar-dark_1574-27570.json
7
+ *
8
+ * Current implementation covers:
9
+ * - Avatar atom: 3 sizes × 3 content types
10
+ * - AvatarBadge molecule: online status indicator
11
+ * - AvatarGroup molecule: stacked medium avatars with overflow counter
12
+ */
13
+
14
+ .mw-avatar {
15
+ --mw-avatar-size: 40px;
16
+ --mw-avatar-font-size: 13px;
17
+ --mw-avatar-line-height: 17px;
18
+ --mw-avatar-letter-spacing: -0.39px;
19
+ --mw-avatar-icon-size: 18px;
20
+ --mw-avatar-surface: var(--mw-color-primary-base, #2f31fc);
21
+ --mw-avatar-border-width: 0px;
22
+ --mw-avatar-border-color: transparent;
23
+ --mw-avatar-label: var(--mw-color-primary-label, #ffffff);
24
+ --mw-avatar-image-fallback: var(--mw-color-primary-base, #2f31fc);
25
+
26
+ position: relative;
27
+ display: inline-flex;
28
+ align-items: center;
29
+ justify-content: center;
30
+ flex-shrink: 0;
31
+ width: var(--mw-avatar-size);
32
+ height: var(--mw-avatar-size);
33
+ overflow: hidden;
34
+ box-sizing: border-box;
35
+ border: var(--mw-avatar-border-width) solid var(--mw-avatar-border-color);
36
+ border-radius: 9999px;
37
+ background: var(--mw-avatar-surface);
38
+ color: var(--mw-avatar-label);
39
+ font-family: var(--mw-font-primary, inherit);
40
+ font-size: var(--mw-avatar-font-size);
41
+ font-weight: 500;
42
+ line-height: var(--mw-avatar-line-height);
43
+ letter-spacing: var(--mw-avatar-letter-spacing);
44
+ }
45
+
46
+ .mw-avatar--small {
47
+ --mw-avatar-size: 32px;
48
+ --mw-avatar-font-size: 12px;
49
+ --mw-avatar-line-height: 16px;
50
+ --mw-avatar-letter-spacing: -0.36px;
51
+ --mw-avatar-icon-size: 14px;
52
+ }
53
+
54
+ .mw-avatar--medium {
55
+ --mw-avatar-size: 40px;
56
+ --mw-avatar-font-size: 13px;
57
+ --mw-avatar-line-height: 17px;
58
+ --mw-avatar-letter-spacing: -0.39px;
59
+ --mw-avatar-icon-size: 18px;
60
+ }
61
+
62
+ .mw-avatar--large {
63
+ --mw-avatar-size: 48px;
64
+ --mw-avatar-font-size: 15px;
65
+ --mw-avatar-line-height: 19px;
66
+ --mw-avatar-letter-spacing: -0.45px;
67
+ --mw-avatar-icon-size: 22px;
68
+ }
69
+
70
+ .mw-avatar--icon {
71
+ --mw-avatar-surface: var(--mw-color-surface-elevated);
72
+ --mw-avatar-border-width: 1px;
73
+ --mw-avatar-border-color: var(--mw-color-border);
74
+ --mw-avatar-label: var(--mw-color-text-muted);
75
+ }
76
+
77
+ .mw-avatar--image {
78
+ --mw-avatar-surface: var(--mw-color-surface-elevated);
79
+ --mw-avatar-border-width: 0.5px;
80
+ --mw-avatar-border-color: var(--mw-color-border-subtle);
81
+ }
82
+
83
+ .mw-avatar__initials {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ min-width: 0;
88
+ color: inherit;
89
+ line-height: inherit;
90
+ text-transform: uppercase;
91
+ }
92
+
93
+ .mw-avatar__icon {
94
+ width: var(--mw-avatar-icon-size);
95
+ height: var(--mw-avatar-icon-size);
96
+ color: inherit;
97
+ }
98
+
99
+ .mw-avatar__image {
100
+ display: block;
101
+ width: 100%;
102
+ height: 100%;
103
+ background: var(--mw-avatar-image-fallback);
104
+ object-fit: cover;
105
+ }
106
+
107
+ .mw-theme--dark .mw-avatar--icon {
108
+ --mw-avatar-surface: var(--mw-color-surface-elevated);
109
+ --mw-avatar-border-color: var(--mw-color-border);
110
+ --mw-avatar-label: var(--mw-color-text-muted);
111
+ }
112
+
113
+ .mw-theme--dark .mw-avatar--image {
114
+ --mw-avatar-surface: var(--mw-color-surface-elevated);
115
+ --mw-avatar-border-color: var(--mw-color-border-subtle);
116
+ --mw-avatar-image-fallback: var(--mw-color-primary-disabled);
117
+ }
118
+
119
+ .mw-avatar-badge {
120
+ position: relative;
121
+ display: inline-flex;
122
+ line-height: 0;
123
+ }
124
+
125
+ .mw-avatar-badge--small {
126
+ --mw-avatar-badge-indicator-size: 8px;
127
+ }
128
+
129
+ .mw-avatar-badge--medium {
130
+ --mw-avatar-badge-indicator-size: 10px;
131
+ }
132
+
133
+ .mw-avatar-badge--large {
134
+ --mw-avatar-badge-indicator-size: 12px;
135
+ }
136
+
137
+ .mw-avatar-badge__indicator {
138
+ position: absolute;
139
+ right: -1px;
140
+ bottom: -1px;
141
+ width: var(--mw-avatar-badge-indicator-size);
142
+ height: var(--mw-avatar-badge-indicator-size);
143
+ border: 2px solid var(--mw-color-surface, #f9fafb);
144
+ border-radius: 9999px;
145
+ background: var(--mw-color-success-base, #16a34a);
146
+ box-sizing: border-box;
147
+ }
148
+
149
+ .mw-theme--dark .mw-avatar-badge__indicator {
150
+ border-color: var(--mw-color-surface, #141414);
151
+ }
152
+
153
+ .mw-avatar-group {
154
+ --mw-avatar-group-overlap: 12px;
155
+ --mw-avatar-group-stroke: var(--mw-color-surface, #f9fafb);
156
+ --mw-avatar-group-stroke-width: 2.5px;
157
+ --mw-avatar-group-counter-surface: var(--mw-color-surface, #f9fafb);
158
+ --mw-avatar-group-counter-label: var(--mw-color-text-muted);
159
+
160
+ min-inline-size: 0;
161
+ display: inline-flex;
162
+ align-items: center;
163
+ margin: 0;
164
+ border: none;
165
+ padding: 0;
166
+ }
167
+
168
+ .mw-avatar-group__item,
169
+ .mw-avatar-group__counter {
170
+ position: relative;
171
+ margin-left: calc(var(--mw-avatar-group-overlap) * -1);
172
+ }
173
+
174
+ .mw-avatar-group__item:first-child {
175
+ margin-left: 0;
176
+ }
177
+
178
+ .mw-avatar-group__item > .mw-avatar {
179
+ box-shadow: 0 0 0 var(--mw-avatar-group-stroke-width) var(--mw-avatar-group-stroke);
180
+ }
181
+
182
+ .mw-avatar-group__counter {
183
+ display: inline-flex;
184
+ align-items: center;
185
+ justify-content: center;
186
+ width: 40px;
187
+ height: 40px;
188
+ border-radius: 9999px;
189
+ background: var(--mw-avatar-group-counter-surface);
190
+ box-shadow: 0 0 0 var(--mw-avatar-group-stroke-width) var(--mw-avatar-group-counter-surface);
191
+ color: var(--mw-avatar-group-counter-label);
192
+ font-family: var(--mw-font-primary, inherit);
193
+ font-size: 12px;
194
+ font-weight: 500;
195
+ line-height: 16px;
196
+ letter-spacing: -0.36px;
197
+ box-sizing: border-box;
198
+ }
199
+
200
+ .mw-theme--dark .mw-avatar-group {
201
+ --mw-avatar-group-stroke: var(--mw-color-surface, #141414);
202
+ --mw-avatar-group-counter-surface: var(--mw-color-surface, #141414);
203
+ --mw-avatar-group-counter-label: var(--mw-color-text-muted);
204
+ }
@@ -0,0 +1,139 @@
1
+ /*
2
+ * Badge Component Styles
3
+ * Validated against:
4
+ * - .figma/marwes/components/checkboxbadge.json
5
+ * - .figma/marwes/pages/-badge/-badge_1364-11603.json
6
+ * - .figma/marwes/pages/-badge/-badge-dark_2276-56582.json
7
+ * - .figma/marwes/pages/-badge/component-container_1369-6125.json
8
+ *
9
+ * The live sync uses exact semantic badge tones rather than generic color-mix()
10
+ * derivations, especially for the remaining semantic tones and dark-mode surfaces.
11
+ */
12
+
13
+ .mw-badge {
14
+ --mw-badge-surface: transparent;
15
+ --mw-badge-border: transparent;
16
+ --mw-badge-label: inherit;
17
+ --mw-badge-radius: var(--mw-ui-radius, 4px);
18
+
19
+ display: inline-flex;
20
+ align-items: center;
21
+ gap: var(--mw-spacing-sp-4);
22
+ padding: var(--mw-spacing-sp-2) var(--mw-spacing-sp-8);
23
+ border: none;
24
+ border-radius: var(--mw-badge-radius);
25
+ box-shadow: inset 0 0 0 1px var(--mw-badge-border);
26
+ background: var(--mw-badge-surface);
27
+ color: var(--mw-badge-label);
28
+ font-family: var(--mw-font-primary, inherit);
29
+ font-size: 12px;
30
+ font-weight: 500;
31
+ line-height: 16px;
32
+ letter-spacing: 0;
33
+ white-space: nowrap;
34
+ }
35
+
36
+ /* ============================================
37
+ LIGHT VARIANTS
38
+ ============================================ */
39
+
40
+ .mw-badge--neutral {
41
+ --mw-badge-surface: var(--mw-color-surface-subtle);
42
+ --mw-badge-border: var(--mw-color-border-subtle);
43
+ --mw-badge-label: var(--mw-color-text-muted);
44
+ }
45
+
46
+ .mw-badge--info {
47
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-info-base) 12%, var(--mw-color-surface));
48
+ --mw-badge-border: color-mix(
49
+ in srgb,
50
+ var(--mw-color-info-base) 45%,
51
+ var(--mw-color-border-subtle)
52
+ );
53
+ --mw-badge-label: var(--mw-color-info-base);
54
+ }
55
+
56
+ .mw-badge--success {
57
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-success-base) 12%, var(--mw-color-surface));
58
+ --mw-badge-border: color-mix(
59
+ in srgb,
60
+ var(--mw-color-success-base) 45%,
61
+ var(--mw-color-border-subtle)
62
+ );
63
+ --mw-badge-label: var(--mw-color-success-base);
64
+ }
65
+
66
+ .mw-badge--warning {
67
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-warning-base) 16%, var(--mw-color-surface));
68
+ --mw-badge-border: color-mix(
69
+ in srgb,
70
+ var(--mw-color-warning-base) 50%,
71
+ var(--mw-color-border-subtle)
72
+ );
73
+ --mw-badge-label: var(--mw-color-warning-base);
74
+ }
75
+
76
+ .mw-badge--error {
77
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-danger-base) 12%, var(--mw-color-surface));
78
+ --mw-badge-border: color-mix(
79
+ in srgb,
80
+ var(--mw-color-danger-base) 45%,
81
+ var(--mw-color-border-subtle)
82
+ );
83
+ --mw-badge-label: var(--mw-color-danger-base);
84
+ }
85
+
86
+ /* ============================================
87
+ DARK MODE OVERRIDES
88
+ ============================================ */
89
+
90
+ .mw-theme--dark .mw-badge--neutral {
91
+ --mw-badge-surface: var(--mw-color-surface-subtle);
92
+ --mw-badge-border: var(--mw-color-border-subtle);
93
+ --mw-badge-label: var(--mw-color-text-muted);
94
+ }
95
+
96
+ .mw-theme--dark .mw-badge--info {
97
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-info-base) 18%, var(--mw-color-surface));
98
+ --mw-badge-border: color-mix(
99
+ in srgb,
100
+ var(--mw-color-info-base) 55%,
101
+ var(--mw-color-border-subtle)
102
+ );
103
+ --mw-badge-label: var(--mw-color-info-base);
104
+ }
105
+
106
+ .mw-theme--dark .mw-badge--success {
107
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-success-base) 18%, var(--mw-color-surface));
108
+ --mw-badge-border: color-mix(
109
+ in srgb,
110
+ var(--mw-color-success-base) 55%,
111
+ var(--mw-color-border-subtle)
112
+ );
113
+ --mw-badge-label: var(--mw-color-success-base);
114
+ }
115
+
116
+ .mw-theme--dark .mw-badge--warning {
117
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-warning-base) 20%, var(--mw-color-surface));
118
+ --mw-badge-border: color-mix(
119
+ in srgb,
120
+ var(--mw-color-warning-base) 60%,
121
+ var(--mw-color-border-subtle)
122
+ );
123
+ --mw-badge-label: var(--mw-color-warning-base);
124
+ }
125
+
126
+ .mw-theme--dark .mw-badge--error {
127
+ --mw-badge-surface: color-mix(in srgb, var(--mw-color-danger-base) 18%, var(--mw-color-surface));
128
+ --mw-badge-border: color-mix(
129
+ in srgb,
130
+ var(--mw-color-danger-base) 55%,
131
+ var(--mw-color-border-subtle)
132
+ );
133
+ --mw-badge-label: var(--mw-color-danger-base);
134
+ }
135
+
136
+ .mw-badge-group__items {
137
+ display: inline-flex;
138
+ gap: var(--mw-spacing-sp-4);
139
+ }
@@ -0,0 +1,219 @@
1
+ /* ============================================
2
+ Button Component Styles - firstEdition
3
+ Based on Figma node: 1:1072 (Buttons)
4
+
5
+ Design Specifications:
6
+ - States: default, hover, active, disabled, error
7
+ - Variants: primary, secondary, text
8
+ - Icon positions: left, right, none
9
+ - Focus: 2px #2684FF outline + 2px offset
10
+ - Disabled: opacity 20% (light), 40% (dark)
11
+
12
+ Figma Variants:
13
+ - Primary: 1:1080, 1:1085, 1:1090
14
+ - Secondary: 1:1095, 1:1100, 1:1105
15
+ - Text: 1:1110, 1:1115, 1:1120
16
+ ============================================ */
17
+
18
+ /* BASE */
19
+ .mw-btn {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ gap: 6px; /* off-scale — icon-to-label spacing */
24
+ height: var(--mw-density-height);
25
+ padding: 0 var(--mw-density-padding-x);
26
+ border-radius: var(--mw-ui-radius);
27
+ border: 1px solid transparent;
28
+ font-family: var(--mw-font-primary, inherit);
29
+ font-size: var(--mw-density-font-size);
30
+ font-weight: 500;
31
+ line-height: 0;
32
+ cursor: pointer;
33
+ user-select: none;
34
+ transition: all 150ms ease;
35
+ }
36
+
37
+ /* FOCUS STATE - Figma spec: 2px white space + 2px Accessible blue outline */
38
+ .mw-btn:focus-visible {
39
+ outline: 2px solid var(--mw-color-focus);
40
+ outline-offset: 2px;
41
+ }
42
+
43
+ /* PRIMARY - Solid filled button */
44
+ .mw-btn--primary {
45
+ background: var(--mw-color-primary-base);
46
+ color: var(--mw-color-primary-label);
47
+ border-color: var(--mw-color-primary-base);
48
+ }
49
+
50
+ .mw-btn--primary:hover:not(:disabled) {
51
+ opacity: 0.9;
52
+ }
53
+
54
+ .mw-btn--primary:active:not(:disabled) {
55
+ opacity: 0.95;
56
+ }
57
+
58
+ /* SECONDARY - Outlined button */
59
+ .mw-btn--secondary {
60
+ background: transparent;
61
+ color: var(--mw-color-primary-base);
62
+ border-color: var(--mw-color-primary-base);
63
+ }
64
+
65
+ .mw-btn--secondary:hover:not(:disabled) {
66
+ background: color-mix(in srgb, var(--mw-color-primary-base) 8%, transparent);
67
+ }
68
+
69
+ .mw-btn--secondary:active:not(:disabled) {
70
+ background: color-mix(in srgb, var(--mw-color-primary-base) 12%, transparent);
71
+ }
72
+
73
+ /* NEUTRAL - Quiet outlined button for cancel/close/filter-style actions */
74
+ .mw-btn--neutral {
75
+ background: transparent;
76
+ color: var(--mw-color-text);
77
+ border-color: color-mix(in srgb, var(--mw-color-text) 10%, transparent);
78
+ }
79
+
80
+ .mw-btn--neutral:hover:not(:disabled) {
81
+ background: color-mix(in srgb, var(--mw-color-text) 4%, transparent);
82
+ }
83
+
84
+ .mw-btn--neutral:active:not(:disabled) {
85
+ background: color-mix(in srgb, var(--mw-color-text) 8%, transparent);
86
+ }
87
+
88
+ /* TEXT - Minimal text-only button, content-hugging (no fixed height).
89
+ Uses the same 6px icon-to-label spacing as every other button. */
90
+ .mw-btn.mw-btn--text {
91
+ background: transparent;
92
+ color: var(--mw-color-text);
93
+ border-color: transparent;
94
+ height: auto;
95
+ padding: 0.25rem 0.5rem;
96
+ line-height: 1;
97
+ border-radius: var(--mw-ui-radius);
98
+ }
99
+
100
+ .mw-btn--text:hover:not(:disabled) {
101
+ background: color-mix(in srgb, var(--mw-color-text) 8%, transparent);
102
+ }
103
+
104
+ .mw-btn--text:active:not(:disabled) {
105
+ background: color-mix(in srgb, var(--mw-color-text) 12%, transparent);
106
+ }
107
+
108
+ .mw-btn.mw-btn--text[data-action="navigate"] {
109
+ padding: 0.125rem 0;
110
+ text-decoration: underline;
111
+ text-underline-offset: 2px;
112
+ }
113
+
114
+ /* SIZES */
115
+ .mw-btn--xs {
116
+ height: 30px;
117
+ padding: 0 10px; /* off-scale — no token */
118
+ font-size: 12px;
119
+ }
120
+
121
+ .mw-btn--sm {
122
+ height: 34px;
123
+ padding: 0 12px; /* off-scale — no token */
124
+ font-size: 13px;
125
+ }
126
+
127
+ .mw-btn--md {
128
+ height: 40px;
129
+ padding: 12px 16px; /* off-scale — no token */
130
+ font-size: 14px;
131
+ }
132
+
133
+ .mw-btn--lg {
134
+ height: 46px;
135
+ padding: 0 16px;
136
+ font-size: 15px;
137
+ }
138
+
139
+ /* DISABLED STATE - Figma spec: opacity 20% (#000000 20% for light mode) */
140
+ .mw-btn:disabled {
141
+ opacity: 0.2;
142
+ cursor: not-allowed;
143
+ }
144
+
145
+ /* Dark mode disabled state: #FFFFFF 40% (middle of 20-60% range from Figma) */
146
+ .mw-theme--dark .mw-btn:disabled {
147
+ opacity: 0.4;
148
+ }
149
+
150
+ /* ERROR STATE - Figma node: 1:1072 includes error state */
151
+ .mw-btn[data-error="true"],
152
+ .mw-btn--error {
153
+ border-color: var(--mw-color-danger-base);
154
+ }
155
+
156
+ .mw-btn--primary[data-error="true"],
157
+ .mw-btn--primary.mw-btn--error {
158
+ background: var(--mw-color-danger-base);
159
+ border-color: var(--mw-color-danger-base);
160
+ }
161
+
162
+ .mw-btn--secondary[data-error="true"],
163
+ .mw-btn--secondary.mw-btn--error {
164
+ color: var(--mw-color-danger-base);
165
+ border-color: var(--mw-color-danger-base);
166
+ }
167
+
168
+ .mw-btn--text[data-error="true"],
169
+ .mw-btn--text.mw-btn--error {
170
+ color: var(--mw-color-danger-base);
171
+ }
172
+
173
+ /* SUCCESS - Positive confirmation actions */
174
+ .mw-btn--success {
175
+ background: var(--mw-color-success-base);
176
+ color: var(--mw-color-success-label);
177
+ border-color: var(--mw-color-success-base);
178
+ }
179
+
180
+ .mw-btn--success:hover:not(:disabled) {
181
+ opacity: 0.9;
182
+ }
183
+
184
+ .mw-btn--success:active:not(:disabled) {
185
+ opacity: 0.95;
186
+ }
187
+
188
+ /* ============================================
189
+ DARK MODE OVERRIDES
190
+ ============================================ */
191
+
192
+ /* Dark mode: Primary button hover state uses opacity instead of lightening */
193
+ .mw-theme--dark .mw-btn--primary:hover:not(:disabled) {
194
+ opacity: 0.8;
195
+ }
196
+
197
+ .mw-theme--dark .mw-btn--primary:active:not(:disabled) {
198
+ opacity: 0.9;
199
+ }
200
+
201
+ /* Dark mode: Neutral button uses the softer ghost border from Figma */
202
+ .mw-theme--dark .mw-btn--neutral {
203
+ border-color: color-mix(in srgb, var(--mw-color-text) 18%, transparent);
204
+ }
205
+
206
+ /* Dark mode: Error state for Secondary button (red outline on dark background) */
207
+ .mw-theme--dark .mw-btn--secondary[data-error="true"],
208
+ .mw-theme--dark .mw-btn--secondary.mw-btn--error {
209
+ border-color: var(--mw-color-danger-base);
210
+ color: var(--mw-color-danger-base);
211
+ }
212
+
213
+ /* Dark mode: Error state for Primary button */
214
+ .mw-theme--dark .mw-btn--primary[data-error="true"],
215
+ .mw-theme--dark .mw-btn--primary.mw-btn--error {
216
+ background: var(--mw-color-danger-base);
217
+ border-color: var(--mw-color-danger-base);
218
+ color: var(--mw-color-danger-label);
219
+ }
@@ -0,0 +1,136 @@
1
+ /*
2
+ * Card component styles
3
+ * Figma frames:
4
+ * - light states: 1364:11556
5
+ * - dark states: 1368:5891
6
+ *
7
+ * Live Figma values from the synced state matrix:
8
+ * - container: 8px radius, 24px padding, 8px gap
9
+ * - title: 16/18, weight 500
10
+ * - body: 14/18, weight 400
11
+ *
12
+ * Light mode:
13
+ * - default border: #e5e7eb
14
+ * - hover/pressed border: #a3a3a3
15
+ * - focus border: #2f31fc
16
+ * - disabled surface: #f3f4f6
17
+ * - disabled text: #737373
18
+ *
19
+ * Dark mode:
20
+ * - default surface/border: #474747
21
+ * - pressed surface: #2e2e2e
22
+ * - focus border: #5859fc
23
+ * - disabled surface: #000000
24
+ * - disabled text: #595959
25
+ */
26
+
27
+ .mw-card {
28
+ --mw-card-surface: var(--mw-color-surface-elevated, #ffffff);
29
+ --mw-card-border: var(--mw-color-border-subtle, #e5e7eb);
30
+ --mw-card-title: var(--mw-color-text, #141414);
31
+ --mw-card-body: color-mix(
32
+ in srgb,
33
+ var(--mw-color-text, #141414) 65%,
34
+ var(--mw-color-background, #ffffff)
35
+ );
36
+ --mw-card-radius: calc(var(--mw-ui-radius, 4px) * 2);
37
+
38
+ display: flex;
39
+ min-width: 0;
40
+ flex-direction: column;
41
+ gap: 8px;
42
+ padding: 24px;
43
+ box-sizing: border-box;
44
+ background: var(--mw-card-surface);
45
+ border: 1px solid var(--mw-card-border);
46
+ border-radius: var(--mw-card-radius);
47
+ transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
48
+ }
49
+
50
+ .mw-card__header {
51
+ min-width: 0;
52
+ }
53
+
54
+ .mw-card__title {
55
+ display: block;
56
+ margin: 0;
57
+ color: var(--mw-card-title);
58
+ font-family: var(--mw-font-primary, inherit);
59
+ font-size: 16px;
60
+ font-weight: 500;
61
+ line-height: 18px;
62
+ }
63
+
64
+ .mw-card__body {
65
+ min-width: 0;
66
+ margin: 0;
67
+ color: var(--mw-card-body);
68
+ font-family: var(--mw-font-primary, inherit);
69
+ font-size: 14px;
70
+ font-weight: 400;
71
+ line-height: 18px;
72
+ }
73
+
74
+ .mw-card:hover,
75
+ .mw-card--state-hover {
76
+ --mw-card-border: color-mix(in srgb, var(--mw-color-border, #141414) 70%, transparent);
77
+ }
78
+
79
+ .mw-card:active,
80
+ .mw-card--state-pressed {
81
+ --mw-card-border: color-mix(in srgb, var(--mw-color-border, #141414) 70%, transparent);
82
+ }
83
+
84
+ .mw-card:focus-visible,
85
+ .mw-card--state-focus {
86
+ --mw-card-border: var(--mw-color-focus, #2f31fc);
87
+ outline: none;
88
+ }
89
+
90
+ .mw-card--disabled,
91
+ .mw-card[data-disabled="true"],
92
+ .mw-card[aria-disabled="true"] {
93
+ --mw-card-surface: var(--mw-color-surface-disabled, #f3f4f6);
94
+ --mw-card-border: var(--mw-color-border-disabled, #e5e7eb);
95
+ --mw-card-title: var(--mw-color-text-disabled, #737373);
96
+ --mw-card-body: var(--mw-color-text-disabled, #737373);
97
+
98
+ cursor: not-allowed;
99
+ pointer-events: none;
100
+ }
101
+
102
+ .mw-theme--dark .mw-card {
103
+ --mw-card-surface: var(--mw-color-surface-elevated, #474747);
104
+ --mw-card-border: var(--mw-color-border-subtle, #474747);
105
+ --mw-card-title: var(--mw-color-text, #f9fafb);
106
+ --mw-card-body: color-mix(
107
+ in srgb,
108
+ var(--mw-color-text, #f9fafb) 65%,
109
+ var(--mw-color-background, #141414)
110
+ );
111
+ }
112
+
113
+ .mw-theme--dark .mw-card:hover,
114
+ .mw-theme--dark .mw-card--state-hover {
115
+ --mw-card-border: color-mix(in srgb, var(--mw-color-border, #f9fafb) 70%, transparent);
116
+ }
117
+
118
+ .mw-theme--dark .mw-card:active,
119
+ .mw-theme--dark .mw-card--state-pressed {
120
+ --mw-card-surface: var(--mw-color-surface-subtle, #2e2e2e);
121
+ --mw-card-border: color-mix(in srgb, var(--mw-color-border, #f9fafb) 70%, transparent);
122
+ }
123
+
124
+ .mw-theme--dark .mw-card:focus-visible,
125
+ .mw-theme--dark .mw-card--state-focus {
126
+ --mw-card-border: var(--mw-color-focus, #5859fc);
127
+ }
128
+
129
+ .mw-theme--dark .mw-card--disabled,
130
+ .mw-theme--dark .mw-card[data-disabled="true"],
131
+ .mw-theme--dark .mw-card[aria-disabled="true"] {
132
+ --mw-card-surface: var(--mw-color-surface-disabled, #000000);
133
+ --mw-card-border: var(--mw-color-border-disabled, #474747);
134
+ --mw-card-title: var(--mw-color-text-disabled, #595959);
135
+ --mw-card-body: var(--mw-color-text-disabled, #595959);
136
+ }