@camtomlabs/malix-design-system 0.1.2

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 (56) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +38 -0
  3. package/package.json +49 -0
  4. package/src/components/Accordion.tsx +52 -0
  5. package/src/components/Avatar.tsx +18 -0
  6. package/src/components/Badge.tsx +27 -0
  7. package/src/components/Banner.tsx +75 -0
  8. package/src/components/Breadcrumb.tsx +58 -0
  9. package/src/components/Button.tsx +47 -0
  10. package/src/components/Card.tsx +34 -0
  11. package/src/components/ChatInput.tsx +53 -0
  12. package/src/components/Checkbox.tsx +85 -0
  13. package/src/components/CreditsIndicator.tsx +41 -0
  14. package/src/components/DataTable.tsx +75 -0
  15. package/src/components/DateInput.tsx +57 -0
  16. package/src/components/Divider.tsx +12 -0
  17. package/src/components/Dropzone.tsx +94 -0
  18. package/src/components/EmptyState.tsx +65 -0
  19. package/src/components/FileCard.tsx +78 -0
  20. package/src/components/FilterTabs.tsx +49 -0
  21. package/src/components/FlyoutMenu.tsx +36 -0
  22. package/src/components/GlassPopover.tsx +38 -0
  23. package/src/components/Header.tsx +22 -0
  24. package/src/components/Input.tsx +18 -0
  25. package/src/components/InputGroup.tsx +37 -0
  26. package/src/components/LanguageSelector.tsx +81 -0
  27. package/src/components/Modal.tsx +104 -0
  28. package/src/components/OnboardingPopover.tsx +61 -0
  29. package/src/components/OperationStatus.tsx +73 -0
  30. package/src/components/Overlay.tsx +66 -0
  31. package/src/components/Pagination.tsx +89 -0
  32. package/src/components/Pill.tsx +19 -0
  33. package/src/components/PricingCard.tsx +74 -0
  34. package/src/components/ProgressBar.tsx +47 -0
  35. package/src/components/Radio.tsx +56 -0
  36. package/src/components/SectionHeader.tsx +32 -0
  37. package/src/components/SegmentedControl.tsx +42 -0
  38. package/src/components/Select.tsx +62 -0
  39. package/src/components/SelectGroup.tsx +32 -0
  40. package/src/components/SelectionCard.tsx +47 -0
  41. package/src/components/SidebarItem.tsx +27 -0
  42. package/src/components/SidebarPanel.tsx +84 -0
  43. package/src/components/SplitPane.tsx +85 -0
  44. package/src/components/StatCard.tsx +64 -0
  45. package/src/components/StatusDot.tsx +26 -0
  46. package/src/components/Stepper.tsx +40 -0
  47. package/src/components/TabBar.tsx +45 -0
  48. package/src/components/Textarea.tsx +43 -0
  49. package/src/components/Toggle.tsx +50 -0
  50. package/src/components/Tooltip.tsx +33 -0
  51. package/src/components/UserProfilePopover.tsx +100 -0
  52. package/src/components/ValidationAlert.tsx +72 -0
  53. package/src/index.ts +177 -0
  54. package/src/styles.css +3237 -0
  55. package/src/tokens.css +165 -0
  56. package/src/tokens.registry.json +75 -0
package/src/styles.css ADDED
@@ -0,0 +1,3237 @@
1
+ @import "./tokens.css";
2
+
3
+ /* ═══════════════════════════════════════════════
4
+ BUTTON — Pencil: KCjkg, 5eAkI, zMyI0, zUoM5
5
+ padding: 10px 20px, gap: 8px, radius-md
6
+ ═══════════════════════════════════════════════ */
7
+
8
+ .malix-button {
9
+ font-family: var(--malix-font-body);
10
+ font-size: var(--malix-text-base);
11
+ font-weight: var(--malix-weight-medium);
12
+ border-radius: var(--malix-radius-md);
13
+ border: 1px solid transparent;
14
+ padding: 10px 20px;
15
+ gap: 8px;
16
+ display: inline-flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ cursor: pointer;
20
+ transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
21
+ position: relative;
22
+ background: none;
23
+ line-height: 1;
24
+ }
25
+
26
+ .malix-button[data-hierarchy="primary"] {
27
+ background: var(--malix-cta-primary-bg);
28
+ color: var(--malix-primary-foreground);
29
+ box-shadow: var(--malix-shadow-btn-primary);
30
+ }
31
+
32
+ .malix-button[data-hierarchy="primary"]:hover {
33
+ background: var(--malix-primary-hover);
34
+ }
35
+
36
+ .malix-button[data-hierarchy="primary"]:active {
37
+ background: var(--malix-primary-active);
38
+ }
39
+
40
+ .malix-button[data-hierarchy="secondary"] {
41
+ background: var(--malix-background-main);
42
+ border-color: var(--malix-border);
43
+ color: var(--malix-foreground);
44
+ box-shadow: var(--malix-shadow-btn-secondary);
45
+ }
46
+
47
+ .malix-button[data-hierarchy="secondary"]:hover {
48
+ background: var(--malix-surface-hover);
49
+ }
50
+
51
+ .malix-button[data-hierarchy="secondary"] .malix-button__icon {
52
+ color: var(--malix-foreground-secondary);
53
+ }
54
+
55
+ .malix-button[data-hierarchy="tertiary"] {
56
+ background: transparent;
57
+ border-color: transparent;
58
+ color: var(--malix-foreground-secondary);
59
+ box-shadow: none;
60
+ }
61
+
62
+ .malix-button[data-hierarchy="tertiary"]:hover {
63
+ background: var(--malix-surface-hover);
64
+ }
65
+
66
+ .malix-button[data-hierarchy="tertiary"] .malix-button__icon {
67
+ color: var(--malix-foreground-secondary);
68
+ }
69
+
70
+ .malix-button[data-hierarchy="ghost"] {
71
+ background: transparent;
72
+ border-color: transparent;
73
+ color: var(--malix-foreground-secondary);
74
+ box-shadow: none;
75
+ }
76
+
77
+ .malix-button[data-hierarchy="ghost"]:hover {
78
+ background: var(--malix-surface-hover);
79
+ }
80
+
81
+ .malix-button[data-hierarchy="ghost"] .malix-button__icon {
82
+ color: var(--malix-foreground-secondary);
83
+ }
84
+
85
+ /* Icon-only: 40×40 square, uniform 10px padding */
86
+ .malix-button[data-variant="icon-only"] {
87
+ width: 40px;
88
+ height: 40px;
89
+ padding: 10px;
90
+ }
91
+
92
+ .malix-button[data-variant="icon-only"] .malix-button__icon {
93
+ width: 18px;
94
+ height: 18px;
95
+ }
96
+
97
+ .malix-button[data-variant="icon-only"] .malix-button__icon > svg {
98
+ width: 18px;
99
+ height: 18px;
100
+ }
101
+
102
+ .malix-button:focus-visible {
103
+ outline: 2px solid var(--malix-border-focus);
104
+ outline-offset: 2px;
105
+ box-shadow: 0 0 0 3px rgba(0, 74, 124, 0.1);
106
+ }
107
+
108
+ .malix-button:disabled {
109
+ cursor: not-allowed;
110
+ background: var(--malix-foreground-disabled);
111
+ color: var(--malix-primary-foreground);
112
+ box-shadow: none;
113
+ border-color: transparent;
114
+ }
115
+
116
+ .malix-button[data-loading="true"] {
117
+ cursor: not-allowed;
118
+ opacity: 0.7;
119
+ pointer-events: none;
120
+ }
121
+
122
+ .malix-button__icon {
123
+ display: inline-flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ width: 16px;
127
+ height: 16px;
128
+ }
129
+
130
+ .malix-button__icon > svg {
131
+ width: 16px;
132
+ height: 16px;
133
+ }
134
+
135
+ .malix-button__badge {
136
+ border-radius: var(--malix-radius-pill);
137
+ background: var(--malix-primary-light);
138
+ color: var(--malix-foreground);
139
+ font-size: var(--malix-text-xs);
140
+ line-height: 1;
141
+ padding: 2px 6px;
142
+ }
143
+
144
+ /* ═══════════════════════════════════════════════
145
+ DIVIDER — Pencil: RwwyS
146
+ 1px height, $border color
147
+ ═══════════════════════════════════════════════ */
148
+
149
+ .malix-divider {
150
+ border: none;
151
+ height: 1px;
152
+ background: var(--malix-border);
153
+ margin: 0;
154
+ width: 100%;
155
+ }
156
+
157
+ /* ═══════════════════════════════════════════════
158
+ AVATAR — Pencil: 6GUMN
159
+ 40×40, radius 14, border $border, initials #3A3A3A
160
+ ═══════════════════════════════════════════════ */
161
+
162
+ .malix-avatar {
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ background: #ffffff;
167
+ border: 1px solid var(--malix-border);
168
+ flex-shrink: 0;
169
+ }
170
+
171
+ .malix-avatar__text {
172
+ font-family: var(--malix-font-body);
173
+ font-size: var(--malix-text-base);
174
+ font-weight: var(--malix-weight-semibold);
175
+ color: #3a3a3a;
176
+ line-height: 1;
177
+ }
178
+
179
+ /* ═══════════════════════════════════════════════
180
+ PILL — Pencil: ell1l, dXKt1, Rwdgc, IrSBY, SebDA, H195i
181
+ padding: 4px 12px, radius-pill, font 12/500
182
+ ═══════════════════════════════════════════════ */
183
+
184
+ .malix-pill {
185
+ display: inline-flex;
186
+ align-items: center;
187
+ gap: 6px;
188
+ padding: 4px 12px;
189
+ border-radius: var(--malix-radius-pill);
190
+ font-family: var(--malix-font-body);
191
+ font-size: var(--malix-text-xs);
192
+ font-weight: var(--malix-weight-medium);
193
+ line-height: 1.4;
194
+ }
195
+
196
+ .malix-pill[data-variant="default"] {
197
+ background: var(--malix-surface-secondary);
198
+ color: var(--malix-foreground-secondary);
199
+ border: 1px solid var(--malix-border);
200
+ }
201
+
202
+ .malix-pill[data-variant="primary"] {
203
+ background: var(--malix-primary-light);
204
+ color: var(--malix-cta-primary-bg);
205
+ }
206
+
207
+ .malix-pill[data-variant="success"] {
208
+ background: var(--malix-success-light);
209
+ color: var(--malix-success-foreground);
210
+ }
211
+
212
+ .malix-pill[data-variant="error"] {
213
+ background: var(--malix-error-light);
214
+ color: var(--malix-error-foreground);
215
+ }
216
+
217
+ .malix-pill[data-variant="warning"] {
218
+ background: var(--malix-warning-light);
219
+ color: var(--malix-warning-foreground);
220
+ }
221
+
222
+ .malix-pill[data-variant="info"] {
223
+ background: var(--malix-info-light);
224
+ color: var(--malix-info-foreground);
225
+ }
226
+
227
+ /* ═══════════════════════════════════════════════
228
+ INPUT GROUP — Pencil: Awg2y
229
+ gap: 6px vertical, field: 10px 14px, radius-md
230
+ ═══════════════════════════════════════════════ */
231
+
232
+ .malix-input-group {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 6px;
236
+ width: 280px;
237
+ }
238
+
239
+ .malix-input-group__label {
240
+ font-family: var(--malix-font-body);
241
+ font-size: var(--malix-text-sm);
242
+ font-weight: var(--malix-weight-medium);
243
+ color: var(--malix-foreground);
244
+ }
245
+
246
+ .malix-input-group__field {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 8px;
250
+ padding: 10px 14px;
251
+ background: var(--malix-surface);
252
+ border: 1px solid var(--malix-border);
253
+ border-radius: var(--malix-radius-md);
254
+ box-shadow: var(--malix-shadow-input);
255
+ width: 100%;
256
+ }
257
+
258
+ .malix-input-group__field:focus-within {
259
+ outline: 2px solid var(--malix-border-focus);
260
+ outline-offset: 2px;
261
+ }
262
+
263
+ .malix-input-group__icon {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ color: var(--malix-foreground-tertiary);
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ .malix-input-group__helper {
271
+ font-family: var(--malix-font-body);
272
+ font-size: var(--malix-text-xs);
273
+ font-weight: var(--malix-weight-normal);
274
+ color: var(--malix-foreground-secondary);
275
+ }
276
+
277
+ .malix-input-group[data-error] .malix-input-group__field {
278
+ border-color: var(--malix-error);
279
+ }
280
+
281
+ .malix-input-group[data-error] .malix-input-group__helper {
282
+ color: var(--malix-error-foreground);
283
+ }
284
+
285
+ /* ═══════════════════════════════════════════════
286
+ SEARCH BAR — Pencil: jjtqP
287
+ padding: 10px 14px, gap: 10px, radius-md, w:360
288
+ ═══════════════════════════════════════════════ */
289
+
290
+ .malix-input-wrap {
291
+ display: inline-flex;
292
+ align-items: center;
293
+ gap: 10px;
294
+ width: 100%;
295
+ max-width: 360px;
296
+ background: var(--malix-background-main);
297
+ border: 1px solid var(--malix-border);
298
+ border-radius: var(--malix-radius-md);
299
+ padding: 10px 14px;
300
+ box-shadow: var(--malix-shadow-btn-secondary);
301
+ }
302
+
303
+ .malix-input-wrap:focus-within {
304
+ outline: 2px solid var(--malix-border-focus);
305
+ outline-offset: 2px;
306
+ }
307
+
308
+ .malix-input {
309
+ border: none;
310
+ outline: none;
311
+ background: transparent;
312
+ width: 100%;
313
+ color: var(--malix-foreground);
314
+ font-family: var(--malix-font-body);
315
+ font-size: var(--malix-text-base);
316
+ }
317
+
318
+ .malix-input::placeholder {
319
+ color: var(--malix-foreground-tertiary);
320
+ }
321
+
322
+ /* ═══════════════════════════════════════════════
323
+ TOOLTIP — Pencil: nQhhR
324
+ radius-md, padding: 6 12, bg: foreground, shadow-tooltip
325
+ ═══════════════════════════════════════════════ */
326
+
327
+ .malix-tooltip-wrap {
328
+ position: relative;
329
+ display: inline-flex;
330
+ }
331
+
332
+ .malix-tooltip {
333
+ position: absolute;
334
+ max-width: 260px;
335
+ width: max-content;
336
+ background: var(--malix-foreground);
337
+ color: var(--malix-background-main);
338
+ border-radius: var(--malix-radius-md);
339
+ padding: 6px 12px;
340
+ font-family: var(--malix-font-body);
341
+ font-size: var(--malix-text-xs);
342
+ font-weight: var(--malix-weight-medium);
343
+ box-shadow: var(--malix-shadow-tooltip);
344
+ z-index: 20;
345
+ }
346
+
347
+ .malix-tooltip[data-placement="top"] {
348
+ bottom: calc(100% + var(--malix-space-sm));
349
+ left: 50%;
350
+ transform: translateX(-50%);
351
+ }
352
+
353
+ .malix-tooltip[data-placement="bottom"] {
354
+ top: calc(100% + var(--malix-space-sm));
355
+ left: 50%;
356
+ transform: translateX(-50%);
357
+ }
358
+
359
+ .malix-tooltip[data-placement="left"] {
360
+ right: calc(100% + var(--malix-space-sm));
361
+ top: 50%;
362
+ transform: translateY(-50%);
363
+ }
364
+
365
+ .malix-tooltip[data-placement="right"] {
366
+ left: calc(100% + var(--malix-space-sm));
367
+ top: 50%;
368
+ transform: translateY(-50%);
369
+ }
370
+
371
+ /* ═══════════════════════════════════════════════
372
+ SIDEBAR ITEM — Pencil: tov1r, B0ycx, pPf33
373
+ padding: 10 16, gap: 12, w: 240, radius-md
374
+ ═══════════════════════════════════════════════ */
375
+
376
+ .malix-sidebar-item {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 12px;
380
+ padding: 10px 16px;
381
+ width: 100%;
382
+ border: none;
383
+ background: transparent;
384
+ border-radius: var(--malix-radius-md);
385
+ cursor: pointer;
386
+ font-family: var(--malix-font-body);
387
+ font-size: var(--malix-text-base);
388
+ font-weight: var(--malix-weight-normal);
389
+ color: #696969;
390
+ transition: background-color 120ms ease, color 120ms ease;
391
+ text-align: left;
392
+ }
393
+
394
+ .malix-sidebar-item:hover {
395
+ background: var(--malix-sidebar-hover-bg);
396
+ color: var(--malix-foreground);
397
+ font-weight: var(--malix-weight-medium);
398
+ }
399
+
400
+ .malix-sidebar-item[data-active] {
401
+ background: #f3f3f3;
402
+ color: #3a3a3a;
403
+ font-weight: var(--malix-weight-semibold);
404
+ }
405
+
406
+ .malix-sidebar-item__icon {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ width: 20px;
411
+ height: 20px;
412
+ flex-shrink: 0;
413
+ }
414
+
415
+ .malix-sidebar-item__icon > svg {
416
+ width: 20px;
417
+ height: 20px;
418
+ }
419
+
420
+ .malix-sidebar-item__label {
421
+ white-space: nowrap;
422
+ overflow: hidden;
423
+ text-overflow: ellipsis;
424
+ }
425
+
426
+ /* Collapsed sidebar: icon-only 40x40 items */
427
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-item {
428
+ width: 40px;
429
+ height: 40px;
430
+ padding: 0;
431
+ justify-content: center;
432
+ gap: 0;
433
+ }
434
+
435
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-item__label {
436
+ display: none;
437
+ }
438
+
439
+ /* ═══════════════════════════════════════════════
440
+ FLYOUT MENU — Pencil: zfXyV
441
+ w: 220, p: 8, gap: 2, radius-lg, glass bg
442
+ ═══════════════════════════════════════════════ */
443
+
444
+ .malix-flyout-menu {
445
+ display: flex;
446
+ flex-direction: column;
447
+ gap: 2px;
448
+ width: 220px;
449
+ padding: 8px;
450
+ border-radius: var(--malix-radius-lg);
451
+ background: var(--malix-glass-bg);
452
+ border: 1px solid var(--malix-glass-border);
453
+ box-shadow: var(--malix-shadow-overlay);
454
+ backdrop-filter: blur(var(--malix-glass-blur));
455
+ }
456
+
457
+ .malix-flyout-menu__item {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 10px;
461
+ padding: 8px 12px;
462
+ width: 100%;
463
+ border: none;
464
+ background: transparent;
465
+ border-radius: var(--malix-radius-sm);
466
+ cursor: pointer;
467
+ font-family: var(--malix-font-body);
468
+ font-size: var(--malix-text-sm);
469
+ font-weight: var(--malix-weight-normal);
470
+ color: var(--malix-foreground-secondary);
471
+ text-align: left;
472
+ transition: background-color 120ms ease;
473
+ }
474
+
475
+ .malix-flyout-menu__item:hover {
476
+ background: var(--malix-surface-hover);
477
+ }
478
+
479
+ .malix-flyout-menu__item[data-active] {
480
+ background: #f3f3f3;
481
+ color: #3a3a3a;
482
+ font-weight: var(--malix-weight-medium);
483
+ }
484
+
485
+ .malix-flyout-menu__icon {
486
+ display: inline-flex;
487
+ align-items: center;
488
+ justify-content: center;
489
+ width: 16px;
490
+ height: 16px;
491
+ flex-shrink: 0;
492
+ }
493
+
494
+ .malix-flyout-menu__icon > svg {
495
+ width: 16px;
496
+ height: 16px;
497
+ }
498
+
499
+ .malix-flyout-menu__label {
500
+ white-space: nowrap;
501
+ }
502
+
503
+ /* ═══════════════════════════════════════════════
504
+ SIDEBAR PANEL — Pencil: RjWdU, XFneu, Qao0N
505
+ expanded: w:260, p: 24 16 | collapsed: w:64, p: 24 12
506
+ ═══════════════════════════════════════════════ */
507
+
508
+ .malix-sidebar-panel {
509
+ display: flex;
510
+ flex-direction: column;
511
+ justify-content: space-between;
512
+ width: 260px;
513
+ height: 100%;
514
+ padding: 24px 16px;
515
+ background: var(--malix-sidebar-bg);
516
+ border-right: 1px solid var(--malix-border);
517
+ box-shadow: var(--malix-shadow-sidebar);
518
+ flex-shrink: 0;
519
+ overflow-y: auto;
520
+ }
521
+
522
+ .malix-sidebar-panel[data-collapsed] {
523
+ width: 64px;
524
+ padding: 24px 12px;
525
+ align-items: center;
526
+ }
527
+
528
+ .malix-sidebar-panel__top {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 24px;
532
+ width: 100%;
533
+ }
534
+
535
+ .malix-sidebar-panel__brand {
536
+ display: flex;
537
+ align-items: center;
538
+ justify-content: space-between;
539
+ gap: 10px;
540
+ padding: 0 4px;
541
+ }
542
+
543
+ .malix-sidebar-panel__toggle {
544
+ display: inline-flex;
545
+ align-items: center;
546
+ justify-content: center;
547
+ width: 28px;
548
+ height: 28px;
549
+ border: none;
550
+ background: transparent;
551
+ border-radius: var(--malix-radius-sm);
552
+ cursor: pointer;
553
+ color: var(--malix-foreground-tertiary);
554
+ }
555
+
556
+ .malix-sidebar-panel__toggle:hover {
557
+ background: var(--malix-surface-hover);
558
+ }
559
+
560
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-panel__toggle {
561
+ width: 32px;
562
+ height: 32px;
563
+ background: #f3f3f3;
564
+ color: #3a3a3a;
565
+ border-radius: var(--malix-radius-sm);
566
+ }
567
+
568
+ .malix-sidebar-panel__collapsed-logo {
569
+ display: inline-flex;
570
+ align-items: center;
571
+ justify-content: center;
572
+ width: 40px;
573
+ height: 40px;
574
+ }
575
+
576
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-panel__brand {
577
+ justify-content: center;
578
+ padding: 0;
579
+ }
580
+
581
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-panel__nav {
582
+ align-items: center;
583
+ }
584
+
585
+ .malix-sidebar-panel__nav {
586
+ display: flex;
587
+ flex-direction: column;
588
+ gap: 2px;
589
+ width: 100%;
590
+ }
591
+
592
+ .malix-sidebar-panel__bottom {
593
+ display: flex;
594
+ align-items: center;
595
+ gap: 12px;
596
+ padding: 12px 4px;
597
+ width: 100%;
598
+ }
599
+
600
+ .malix-sidebar-panel[data-collapsed] .malix-sidebar-panel__bottom {
601
+ justify-content: center;
602
+ padding: 12px 0;
603
+ }
604
+
605
+ /* ═══════════════════════════════════════════════
606
+ HEADER — Pencil: Vc71N
607
+ h: 64, p: 0 24, bg: sidebar-bg, border-bottom
608
+ ═══════════════════════════════════════════════ */
609
+
610
+ .malix-header {
611
+ display: flex;
612
+ align-items: center;
613
+ justify-content: space-between;
614
+ height: 64px;
615
+ padding: 0 24px;
616
+ background: var(--malix-sidebar-bg);
617
+ border-bottom: 1px solid var(--malix-border);
618
+ box-shadow: var(--malix-shadow-header);
619
+ width: 100%;
620
+ }
621
+
622
+ .malix-header__left {
623
+ display: flex;
624
+ align-items: center;
625
+ gap: 16px;
626
+ }
627
+
628
+ .malix-header__title {
629
+ margin: 0;
630
+ font-family: var(--malix-font-heading);
631
+ font-size: var(--malix-text-2xl);
632
+ font-weight: var(--malix-weight-semibold);
633
+ color: var(--malix-foreground);
634
+ }
635
+
636
+ .malix-header__right {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 12px;
640
+ }
641
+
642
+ /* ═══════════════════════════════════════════════
643
+ CARD — Pencil: gS2fV, fEVPM, 0HeGI
644
+ w: 320, p: 24, gap: 16, radius-lg, bg: surface
645
+ ═══════════════════════════════════════════════ */
646
+
647
+ .malix-card {
648
+ display: flex;
649
+ flex-direction: column;
650
+ gap: 16px;
651
+ padding: 24px;
652
+ width: 320px;
653
+ background: var(--malix-surface);
654
+ border-radius: var(--malix-radius-lg);
655
+ }
656
+
657
+ .malix-card[data-level="1"] {
658
+ box-shadow: var(--malix-shadow-card-l1);
659
+ }
660
+
661
+ .malix-card[data-level="2"] {
662
+ box-shadow: var(--malix-shadow-card-l2);
663
+ }
664
+
665
+ .malix-card[data-level="3"] {
666
+ box-shadow: var(--malix-shadow-card-l3);
667
+ }
668
+
669
+ .malix-card__header {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 4px;
673
+ }
674
+
675
+ .malix-card__title {
676
+ margin: 0;
677
+ font-family: var(--malix-font-body);
678
+ font-size: var(--malix-text-lg);
679
+ font-weight: var(--malix-weight-semibold);
680
+ color: var(--malix-foreground);
681
+ }
682
+
683
+ .malix-card__desc {
684
+ margin: 0;
685
+ font-family: var(--malix-font-body);
686
+ font-size: var(--malix-text-sm);
687
+ font-weight: var(--malix-weight-normal);
688
+ color: var(--malix-foreground-secondary);
689
+ line-height: 1.5;
690
+ }
691
+
692
+ .malix-card__body {
693
+ display: flex;
694
+ flex-direction: column;
695
+ gap: 12px;
696
+ }
697
+
698
+ /* ═══════════════════════════════════════════════
699
+ MODAL — Pencil: ftLxL
700
+ w: 480, radius-xl, glass bg, backdrop blur
701
+ ═══════════════════════════════════════════════ */
702
+
703
+ .malix-modal {
704
+ display: flex;
705
+ flex-direction: column;
706
+ width: 480px;
707
+ max-width: min(480px, 100%);
708
+ max-height: 80vh;
709
+ overflow: auto;
710
+ border-radius: var(--malix-radius-xl);
711
+ background: var(--malix-glass-bg);
712
+ border: 1px solid var(--malix-glass-border);
713
+ box-shadow: var(--malix-shadow-overlay);
714
+ backdrop-filter: blur(var(--malix-glass-blur));
715
+ }
716
+
717
+ .malix-modal__header {
718
+ display: flex;
719
+ align-items: center;
720
+ justify-content: space-between;
721
+ padding: 20px 24px;
722
+ border-bottom: 1px solid #ffffff33;
723
+ }
724
+
725
+ .malix-modal__title {
726
+ margin: 0;
727
+ font-family: var(--malix-font-body);
728
+ font-size: var(--malix-text-lg);
729
+ font-weight: var(--malix-weight-semibold);
730
+ color: var(--malix-foreground);
731
+ }
732
+
733
+ .malix-modal__close {
734
+ display: inline-flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+ width: 32px;
738
+ height: 32px;
739
+ border: none;
740
+ background: transparent;
741
+ border-radius: var(--malix-radius-sm);
742
+ cursor: pointer;
743
+ color: var(--malix-foreground-secondary);
744
+ }
745
+
746
+ .malix-modal__close:hover {
747
+ background: var(--malix-surface-hover);
748
+ }
749
+
750
+ .malix-modal__body {
751
+ padding: 24px;
752
+ font-family: var(--malix-font-body);
753
+ font-size: var(--malix-text-base);
754
+ font-weight: var(--malix-weight-normal);
755
+ color: var(--malix-foreground-secondary);
756
+ line-height: 1.6;
757
+ }
758
+
759
+ .malix-modal__footer {
760
+ display: flex;
761
+ align-items: center;
762
+ justify-content: flex-end;
763
+ gap: 12px;
764
+ padding: 16px 24px;
765
+ border-top: 1px solid #ffffff33;
766
+ }
767
+
768
+ /* ═══════════════════════════════════════════════
769
+ GLASS POPOVER — Pencil: bgJHS
770
+ w: 300, radius-xl, glass bg
771
+ ═══════════════════════════════════════════════ */
772
+
773
+ .malix-glass-popover {
774
+ display: flex;
775
+ flex-direction: column;
776
+ width: 300px;
777
+ border-radius: var(--malix-radius-xl);
778
+ background: var(--malix-glass-bg);
779
+ border: 1px solid var(--malix-glass-border);
780
+ box-shadow: var(--malix-shadow-overlay);
781
+ backdrop-filter: blur(var(--malix-glass-blur));
782
+ }
783
+
784
+ .malix-glass-popover__header {
785
+ display: flex;
786
+ align-items: center;
787
+ justify-content: space-between;
788
+ padding: 16px 20px;
789
+ border-bottom: 1px solid #ffffff33;
790
+ }
791
+
792
+ .malix-glass-popover__title {
793
+ font-family: var(--malix-font-body);
794
+ font-size: var(--malix-text-base);
795
+ font-weight: var(--malix-weight-semibold);
796
+ color: var(--malix-foreground);
797
+ line-height: 1.4;
798
+ }
799
+
800
+ .malix-glass-popover__close {
801
+ display: inline-flex;
802
+ align-items: center;
803
+ justify-content: center;
804
+ border: none;
805
+ background: transparent;
806
+ cursor: pointer;
807
+ color: var(--malix-foreground-secondary);
808
+ padding: 0;
809
+ }
810
+
811
+ .malix-glass-popover__body {
812
+ padding: 20px;
813
+ font-family: var(--malix-font-body);
814
+ font-size: var(--malix-text-sm);
815
+ font-weight: var(--malix-weight-normal);
816
+ color: var(--malix-foreground-secondary);
817
+ line-height: 1.5;
818
+ }
819
+
820
+ /* ═══════════════════════════════════════════════
821
+ OVERLAY BACKDROP (shared by Modal + Overlay)
822
+ ═══════════════════════════════════════════════ */
823
+
824
+ .malix-overlay-backdrop {
825
+ position: fixed;
826
+ inset: 0;
827
+ background: var(--malix-overlay);
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: center;
831
+ padding: var(--malix-space-xl);
832
+ z-index: 50;
833
+ }
834
+
835
+ /* ═══════════════════════════════════════════════
836
+ STAT CARD
837
+ surface bg, border, subtle shadow, padding 24
838
+ ═══════════════════════════════════════════════ */
839
+
840
+ .malix-stat-card {
841
+ display: flex;
842
+ flex-direction: column;
843
+ gap: 8px;
844
+ padding: 24px;
845
+ background: var(--malix-surface);
846
+ border: 1px solid var(--malix-border);
847
+ border-radius: var(--malix-radius-lg);
848
+ box-shadow: var(--malix-shadow-card-l1);
849
+ }
850
+
851
+ .malix-stat-card__label {
852
+ font-family: var(--malix-font-body);
853
+ font-size: var(--malix-text-sm);
854
+ font-weight: var(--malix-weight-medium);
855
+ color: var(--malix-foreground-secondary);
856
+ line-height: 1;
857
+ }
858
+
859
+ .malix-stat-card__value {
860
+ font-family: var(--malix-font-heading);
861
+ font-size: var(--malix-text-2xl);
862
+ font-weight: var(--malix-weight-semibold);
863
+ color: var(--malix-foreground);
864
+ line-height: 1.2;
865
+ }
866
+
867
+ .malix-stat-card__change {
868
+ display: inline-flex;
869
+ align-items: center;
870
+ gap: 2px;
871
+ font-family: var(--malix-font-body);
872
+ font-size: 11px;
873
+ font-weight: var(--malix-weight-medium);
874
+ line-height: 1;
875
+ width: fit-content;
876
+ padding: 2px 6px;
877
+ border-radius: var(--malix-radius-pill);
878
+ }
879
+
880
+ .malix-stat-card__change-icon {
881
+ display: flex;
882
+ align-items: center;
883
+ justify-content: center;
884
+ width: 12px;
885
+ height: 12px;
886
+ }
887
+
888
+ .malix-stat-card__change-icon svg {
889
+ width: 12px;
890
+ height: 12px;
891
+ }
892
+
893
+ .malix-stat-card__change[data-type="positive"] {
894
+ color: var(--malix-success);
895
+ background: var(--malix-success-light);
896
+ }
897
+
898
+ .malix-stat-card__change[data-type="negative"] {
899
+ color: var(--malix-error);
900
+ background: var(--malix-error-light);
901
+ }
902
+
903
+ .malix-stat-card__change[data-type="neutral"] {
904
+ color: var(--malix-foreground-tertiary);
905
+ background: var(--malix-surface-secondary);
906
+ border: 1px solid var(--malix-border);
907
+ }
908
+
909
+ /* ═══════════════════════════════════════════════
910
+ DATE INPUT
911
+ styled date input with calendar icon
912
+ ═══════════════════════════════════════════════ */
913
+
914
+ .malix-date-input {
915
+ display: inline-flex;
916
+ align-items: center;
917
+ gap: 8px;
918
+ padding: 10px 14px;
919
+ background: var(--malix-surface);
920
+ border: 1px solid var(--malix-border);
921
+ border-radius: var(--malix-radius-md);
922
+ box-shadow: var(--malix-shadow-input);
923
+ width: 280px;
924
+ position: relative;
925
+ cursor: pointer;
926
+ transition: border-color 120ms ease;
927
+ }
928
+
929
+ .malix-date-input:focus-within {
930
+ outline: 2px solid var(--malix-border-focus);
931
+ outline-offset: 2px;
932
+ }
933
+
934
+ .malix-date-input[data-disabled] {
935
+ cursor: not-allowed;
936
+ opacity: 0.6;
937
+ }
938
+
939
+ .malix-date-input__native {
940
+ position: absolute;
941
+ inset: 0;
942
+ width: 100%;
943
+ height: 100%;
944
+ opacity: 0;
945
+ cursor: pointer;
946
+ border: none;
947
+ padding: 0;
948
+ margin: 0;
949
+ }
950
+
951
+ .malix-date-input[data-disabled] .malix-date-input__native {
952
+ cursor: not-allowed;
953
+ }
954
+
955
+ .malix-date-input__value {
956
+ flex: 1;
957
+ font-family: var(--malix-font-body);
958
+ font-size: var(--malix-text-base);
959
+ font-weight: var(--malix-weight-normal);
960
+ color: var(--malix-foreground-tertiary);
961
+ line-height: 1;
962
+ pointer-events: none;
963
+ }
964
+
965
+ .malix-date-input[data-filled] .malix-date-input__value {
966
+ color: var(--malix-foreground);
967
+ }
968
+
969
+ .malix-date-input__icon {
970
+ display: inline-flex;
971
+ align-items: center;
972
+ justify-content: center;
973
+ color: var(--malix-foreground-tertiary);
974
+ flex-shrink: 0;
975
+ pointer-events: none;
976
+ }
977
+
978
+ /* ═══════════════════════════════════════════════
979
+ FILTER TABS
980
+ tab bar with active state, count badges
981
+ ═══════════════════════════════════════════════ */
982
+
983
+ .malix-filter-tabs {
984
+ display: inline-flex;
985
+ align-items: center;
986
+ gap: 4px;
987
+ padding: 4px;
988
+ background: var(--malix-surface-secondary);
989
+ border: 1px solid var(--malix-border);
990
+ border-radius: var(--malix-radius-lg);
991
+ }
992
+
993
+ .malix-filter-tabs__tab {
994
+ display: inline-flex;
995
+ align-items: center;
996
+ gap: 6px;
997
+ padding: 8px 16px;
998
+ border: none;
999
+ background: transparent;
1000
+ border-radius: var(--malix-radius-md);
1001
+ cursor: pointer;
1002
+ font-family: var(--malix-font-body);
1003
+ font-size: var(--malix-text-sm);
1004
+ font-weight: var(--malix-weight-medium);
1005
+ color: var(--malix-foreground-secondary);
1006
+ transition: background-color 120ms ease, color 120ms ease;
1007
+ line-height: 1;
1008
+ }
1009
+
1010
+ .malix-filter-tabs__tab:hover {
1011
+ background: var(--malix-surface-hover);
1012
+ color: var(--malix-foreground);
1013
+ }
1014
+
1015
+ .malix-filter-tabs__tab[data-active] {
1016
+ background: var(--malix-primary-light);
1017
+ color: var(--malix-cta-primary-bg);
1018
+ }
1019
+
1020
+ .malix-filter-tabs__tab[data-active]:hover {
1021
+ background: var(--malix-primary-light);
1022
+ }
1023
+
1024
+ .malix-filter-tabs__tab:focus-visible {
1025
+ outline: 2px solid var(--malix-border-focus);
1026
+ outline-offset: 2px;
1027
+ }
1028
+
1029
+ .malix-filter-tabs__tab-label {
1030
+ white-space: nowrap;
1031
+ }
1032
+
1033
+ .malix-filter-tabs__tab-count {
1034
+ display: inline-flex;
1035
+ align-items: center;
1036
+ justify-content: center;
1037
+ min-width: 20px;
1038
+ padding: 2px 6px;
1039
+ border-radius: var(--malix-radius-pill);
1040
+ font-size: var(--malix-text-xs);
1041
+ font-weight: var(--malix-weight-medium);
1042
+ line-height: 1;
1043
+ background: var(--malix-surface-secondary);
1044
+ color: var(--malix-foreground-secondary);
1045
+ }
1046
+
1047
+ .malix-filter-tabs__tab[data-active] .malix-filter-tabs__tab-count {
1048
+ background: var(--malix-cta-primary-bg);
1049
+ color: var(--malix-primary-foreground);
1050
+ }
1051
+
1052
+ /* Legacy overlay panel (kept for backward compat) */
1053
+ .malix-overlay-panel {
1054
+ min-width: 320px;
1055
+ max-width: min(560px, 100%);
1056
+ max-height: 80vh;
1057
+ overflow: auto;
1058
+ background: var(--malix-glass-bg);
1059
+ border: 1px solid var(--malix-glass-border);
1060
+ border-radius: var(--malix-radius-lg);
1061
+ box-shadow: var(--malix-shadow-overlay);
1062
+ backdrop-filter: blur(var(--malix-glass-blur));
1063
+ padding: var(--malix-space-lg);
1064
+ }
1065
+
1066
+ .malix-overlay-title {
1067
+ margin: 0 0 var(--malix-space-sm);
1068
+ font-size: var(--malix-text-lg);
1069
+ font-family: var(--malix-font-heading);
1070
+ color: var(--malix-foreground);
1071
+ }
1072
+
1073
+ .malix-overlay-close {
1074
+ margin-top: var(--malix-space-md);
1075
+ }
1076
+
1077
+ /* ═══════════════════════════════════════════════
1078
+ BREADCRUMB
1079
+ inline nav trail with chevron separators
1080
+ ═══════════════════════════════════════════════ */
1081
+
1082
+ .malix-breadcrumb {
1083
+ display: flex;
1084
+ align-items: center;
1085
+ gap: 8px;
1086
+ font-family: var(--malix-font-body);
1087
+ font-size: 13px;
1088
+ font-weight: var(--malix-weight-normal);
1089
+ color: var(--malix-foreground-secondary);
1090
+ }
1091
+
1092
+ .malix-breadcrumb__item {
1093
+ display: inline-flex;
1094
+ align-items: center;
1095
+ gap: 6px;
1096
+ }
1097
+
1098
+ .malix-breadcrumb__icon {
1099
+ display: inline-flex;
1100
+ align-items: center;
1101
+ justify-content: center;
1102
+ width: 14px;
1103
+ height: 14px;
1104
+ flex-shrink: 0;
1105
+ }
1106
+
1107
+ .malix-breadcrumb__icon > svg {
1108
+ width: 14px;
1109
+ height: 14px;
1110
+ }
1111
+
1112
+ .malix-breadcrumb__label {
1113
+ text-decoration: none;
1114
+ color: inherit;
1115
+ transition: color 120ms ease;
1116
+ }
1117
+
1118
+ a.malix-breadcrumb__label:hover {
1119
+ color: var(--malix-foreground);
1120
+ text-decoration: underline;
1121
+ }
1122
+
1123
+ .malix-breadcrumb__item[data-active] {
1124
+ color: var(--malix-foreground);
1125
+ font-weight: var(--malix-weight-medium);
1126
+ }
1127
+
1128
+ .malix-breadcrumb__separator {
1129
+ display: inline-flex;
1130
+ align-items: center;
1131
+ justify-content: center;
1132
+ color: var(--malix-foreground-tertiary);
1133
+ flex-shrink: 0;
1134
+ }
1135
+
1136
+ .malix-breadcrumb__separator > svg {
1137
+ width: 14px;
1138
+ height: 14px;
1139
+ }
1140
+
1141
+ /* ═══════════════════════════════════════════════
1142
+ PROGRESS BAR
1143
+ track/fill bar with optional label + percent
1144
+ ═══════════════════════════════════════════════ */
1145
+
1146
+ .malix-progress-bar {
1147
+ display: flex;
1148
+ flex-direction: column;
1149
+ gap: 6px;
1150
+ width: 100%;
1151
+ font-family: var(--malix-font-body);
1152
+ }
1153
+
1154
+ .malix-progress-bar__label-row {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ justify-content: space-between;
1158
+ }
1159
+
1160
+ .malix-progress-bar__label {
1161
+ font-size: var(--malix-text-sm);
1162
+ font-weight: var(--malix-weight-medium);
1163
+ color: var(--malix-foreground);
1164
+ line-height: 1;
1165
+ }
1166
+
1167
+ .malix-progress-bar__percent {
1168
+ font-size: var(--malix-text-sm);
1169
+ font-weight: var(--malix-weight-medium);
1170
+ color: var(--malix-foreground-secondary);
1171
+ line-height: 1;
1172
+ }
1173
+
1174
+ .malix-progress-bar__track {
1175
+ width: 100%;
1176
+ height: 6px;
1177
+ background: var(--malix-surface-secondary);
1178
+ border-radius: var(--malix-radius-pill);
1179
+ overflow: hidden;
1180
+ }
1181
+
1182
+ .malix-progress-bar__fill {
1183
+ height: 100%;
1184
+ border-radius: var(--malix-radius-pill);
1185
+ transition: width 200ms ease;
1186
+ }
1187
+
1188
+ .malix-progress-bar[data-variant="default"] .malix-progress-bar__fill {
1189
+ background: var(--malix-cta-primary-bg);
1190
+ }
1191
+
1192
+ .malix-progress-bar[data-variant="success"] .malix-progress-bar__fill {
1193
+ background: var(--malix-success);
1194
+ }
1195
+
1196
+ /* ═══════════════════════════════════════════════
1197
+ EMPTY STATE
1198
+ centered placeholder with icon, title, CTA
1199
+ ═══════════════════════════════════════════════ */
1200
+
1201
+ .malix-empty-state {
1202
+ display: flex;
1203
+ flex-direction: column;
1204
+ align-items: center;
1205
+ justify-content: center;
1206
+ gap: 16px;
1207
+ padding: 48px 32px;
1208
+ border: 1px dashed var(--malix-border);
1209
+ border-radius: var(--malix-radius-lg);
1210
+ text-align: center;
1211
+ font-family: var(--malix-font-body);
1212
+ }
1213
+
1214
+ .malix-empty-state__icon-wrap {
1215
+ display: flex;
1216
+ align-items: center;
1217
+ justify-content: center;
1218
+ width: 48px;
1219
+ height: 48px;
1220
+ border-radius: var(--malix-radius-pill);
1221
+ background: var(--malix-surface-secondary);
1222
+ color: var(--malix-foreground-tertiary);
1223
+ flex-shrink: 0;
1224
+ }
1225
+
1226
+ .malix-empty-state__icon-wrap > svg {
1227
+ width: 24px;
1228
+ height: 24px;
1229
+ }
1230
+
1231
+ .malix-empty-state__title {
1232
+ margin: 0;
1233
+ font-size: var(--malix-text-lg);
1234
+ font-weight: var(--malix-weight-semibold);
1235
+ color: var(--malix-foreground);
1236
+ line-height: 1.3;
1237
+ }
1238
+
1239
+ .malix-empty-state__description {
1240
+ margin: 0;
1241
+ font-size: var(--malix-text-sm);
1242
+ font-weight: var(--malix-weight-normal);
1243
+ color: var(--malix-foreground-secondary);
1244
+ line-height: 1.5;
1245
+ max-width: 360px;
1246
+ }
1247
+
1248
+ .malix-empty-state__action {
1249
+ margin-top: 4px;
1250
+ }
1251
+
1252
+ /* ═══════════════════════════════════════════════
1253
+ STEPPER
1254
+ horizontal step indicator with connectors
1255
+ ═══════════════════════════════════════════════ */
1256
+
1257
+ .malix-stepper {
1258
+ display: flex;
1259
+ align-items: center;
1260
+ gap: 0;
1261
+ font-family: var(--malix-font-body);
1262
+ }
1263
+
1264
+ .malix-stepper__step {
1265
+ display: flex;
1266
+ align-items: center;
1267
+ gap: 8px;
1268
+ }
1269
+
1270
+ .malix-stepper__step-icon {
1271
+ display: inline-flex;
1272
+ align-items: center;
1273
+ justify-content: center;
1274
+ width: 28px;
1275
+ height: 28px;
1276
+ border-radius: var(--malix-radius-pill);
1277
+ flex-shrink: 0;
1278
+ font-size: var(--malix-text-xs);
1279
+ font-weight: var(--malix-weight-semibold);
1280
+ transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
1281
+ }
1282
+
1283
+ .malix-stepper__step-label {
1284
+ font-size: var(--malix-text-sm);
1285
+ font-weight: var(--malix-weight-medium);
1286
+ white-space: nowrap;
1287
+ transition: color 120ms ease;
1288
+ }
1289
+
1290
+ /* completed */
1291
+ .malix-stepper__step[data-status="completed"] .malix-stepper__step-icon {
1292
+ background: var(--malix-success);
1293
+ color: #ffffff;
1294
+ }
1295
+
1296
+ .malix-stepper__step[data-status="completed"] .malix-stepper__step-label {
1297
+ color: var(--malix-success-foreground);
1298
+ }
1299
+
1300
+ /* active */
1301
+ .malix-stepper__step[data-status="active"] .malix-stepper__step-icon {
1302
+ background: var(--malix-cta-primary-bg);
1303
+ color: var(--malix-primary-foreground);
1304
+ border: 2px solid var(--malix-cta-primary-bg);
1305
+ }
1306
+
1307
+ .malix-stepper__step[data-status="active"] .malix-stepper__step-label {
1308
+ color: var(--malix-cta-primary-bg);
1309
+ }
1310
+
1311
+ /* pending */
1312
+ .malix-stepper__step[data-status="pending"] .malix-stepper__step-icon {
1313
+ background: var(--malix-surface-secondary);
1314
+ color: var(--malix-foreground-tertiary);
1315
+ }
1316
+
1317
+ .malix-stepper__step[data-status="pending"] .malix-stepper__step-label {
1318
+ color: var(--malix-foreground-tertiary);
1319
+ }
1320
+
1321
+ /* connector */
1322
+ .malix-stepper__connector {
1323
+ display: block;
1324
+ width: 32px;
1325
+ height: 2px;
1326
+ background: var(--malix-border);
1327
+ margin: 0 8px;
1328
+ flex-shrink: 0;
1329
+ border-radius: 1px;
1330
+ }
1331
+
1332
+ /* ═══════════════════════════════════════════════
1333
+ TEXTAREA GROUP
1334
+ gap: 6px vertical, field: 12px 14px, radius-md
1335
+ ═══════════════════════════════════════════════ */
1336
+
1337
+ .malix-textarea-group {
1338
+ display: flex;
1339
+ flex-direction: column;
1340
+ gap: 6px;
1341
+ width: 280px;
1342
+ }
1343
+
1344
+ .malix-textarea-group__label {
1345
+ font-family: var(--malix-font-body);
1346
+ font-size: var(--malix-text-sm);
1347
+ font-weight: var(--malix-weight-medium);
1348
+ color: var(--malix-foreground);
1349
+ }
1350
+
1351
+ .malix-textarea-group__field {
1352
+ display: block;
1353
+ width: 100%;
1354
+ min-height: 80px;
1355
+ padding: 12px 14px;
1356
+ background: var(--malix-surface);
1357
+ border: 1px solid var(--malix-border);
1358
+ border-radius: var(--malix-radius-md);
1359
+ box-shadow: var(--malix-shadow-input);
1360
+ font-family: var(--malix-font-body);
1361
+ font-size: var(--malix-text-base);
1362
+ color: var(--malix-foreground);
1363
+ resize: vertical;
1364
+ outline: none;
1365
+ }
1366
+
1367
+ .malix-textarea-group__field::placeholder {
1368
+ color: var(--malix-foreground-tertiary);
1369
+ }
1370
+
1371
+ .malix-textarea-group__field:focus {
1372
+ outline: 2px solid var(--malix-border-focus);
1373
+ outline-offset: 2px;
1374
+ }
1375
+
1376
+ .malix-textarea-group__helper {
1377
+ font-family: var(--malix-font-body);
1378
+ font-size: var(--malix-text-xs);
1379
+ font-weight: var(--malix-weight-normal);
1380
+ color: var(--malix-foreground-secondary);
1381
+ }
1382
+
1383
+ .malix-textarea-group[data-error] .malix-textarea-group__field {
1384
+ border-color: var(--malix-error);
1385
+ }
1386
+
1387
+ .malix-textarea-group[data-error] .malix-textarea-group__helper {
1388
+ color: var(--malix-error-foreground);
1389
+ }
1390
+
1391
+ /* ═══════════════════════════════════════════════
1392
+ CHAT INPUT
1393
+ horizontal: input + 32x32 send button, radius-md
1394
+ ═══════════════════════════════════════════════ */
1395
+
1396
+ .malix-chat-input {
1397
+ display: flex;
1398
+ align-items: center;
1399
+ gap: 8px;
1400
+ padding: 6px 6px 6px 14px;
1401
+ background: var(--malix-surface);
1402
+ border: 1px solid var(--malix-border);
1403
+ border-radius: var(--malix-radius-md);
1404
+ box-shadow: var(--malix-shadow-input);
1405
+ width: 100%;
1406
+ }
1407
+
1408
+ .malix-chat-input:focus-within {
1409
+ outline: 2px solid var(--malix-border-focus);
1410
+ outline-offset: 2px;
1411
+ }
1412
+
1413
+ .malix-chat-input__field {
1414
+ flex: 1;
1415
+ min-width: 0;
1416
+ border: none;
1417
+ outline: none;
1418
+ background: transparent;
1419
+ font-family: var(--malix-font-body);
1420
+ font-size: var(--malix-text-base);
1421
+ color: var(--malix-foreground);
1422
+ padding: 0;
1423
+ line-height: 1;
1424
+ }
1425
+
1426
+ .malix-chat-input__field::placeholder {
1427
+ color: var(--malix-foreground-tertiary);
1428
+ }
1429
+
1430
+ .malix-chat-input__send-btn {
1431
+ display: inline-flex;
1432
+ align-items: center;
1433
+ justify-content: center;
1434
+ width: 32px;
1435
+ height: 32px;
1436
+ flex-shrink: 0;
1437
+ border: none;
1438
+ border-radius: var(--malix-radius-sm);
1439
+ background: var(--malix-cta-primary-bg);
1440
+ color: var(--malix-primary-foreground);
1441
+ cursor: pointer;
1442
+ transition: background-color 120ms ease;
1443
+ }
1444
+
1445
+ .malix-chat-input__send-btn:hover:not(:disabled) {
1446
+ background: var(--malix-primary-hover);
1447
+ }
1448
+
1449
+ .malix-chat-input__send-btn:active:not(:disabled) {
1450
+ background: var(--malix-primary-active);
1451
+ }
1452
+
1453
+ .malix-chat-input__send-btn:disabled {
1454
+ opacity: 0.5;
1455
+ cursor: not-allowed;
1456
+ }
1457
+
1458
+ .malix-chat-input__send-btn > svg {
1459
+ width: 16px;
1460
+ height: 16px;
1461
+ }
1462
+
1463
+ /* ═══════════════════════════════════════════════
1464
+ SECTION HEADER
1465
+ title + description left, actions right, bottom border
1466
+ ═══════════════════════════════════════════════ */
1467
+
1468
+ .malix-section-header {
1469
+ display: flex;
1470
+ align-items: flex-start;
1471
+ justify-content: space-between;
1472
+ padding-bottom: 16px;
1473
+ border-bottom: 1px solid var(--malix-border);
1474
+ gap: 16px;
1475
+ width: 100%;
1476
+ }
1477
+
1478
+ .malix-section-header__left {
1479
+ display: flex;
1480
+ flex-direction: column;
1481
+ gap: 4px;
1482
+ }
1483
+
1484
+ .malix-section-header__title {
1485
+ margin: 0;
1486
+ font-family: var(--malix-font-heading);
1487
+ font-size: var(--malix-text-lg);
1488
+ font-weight: var(--malix-weight-semibold);
1489
+ color: var(--malix-foreground);
1490
+ line-height: 1.4;
1491
+ }
1492
+
1493
+ .malix-section-header__description {
1494
+ margin: 0;
1495
+ font-family: var(--malix-font-body);
1496
+ font-size: var(--malix-text-sm);
1497
+ font-weight: var(--malix-weight-normal);
1498
+ color: var(--malix-foreground-secondary);
1499
+ line-height: 1.5;
1500
+ }
1501
+
1502
+ .malix-section-header__actions {
1503
+ display: flex;
1504
+ align-items: center;
1505
+ gap: 8px;
1506
+ flex-shrink: 0;
1507
+ }
1508
+
1509
+ /* ═══════════════════════════════════════════════
1510
+ FILE CARD
1511
+ icon + name/meta + three-dot action, horizontal
1512
+ ═══════════════════════════════════════════════ */
1513
+
1514
+ .malix-file-card {
1515
+ display: flex;
1516
+ align-items: center;
1517
+ gap: 12px;
1518
+ padding: 12px;
1519
+ border-radius: var(--malix-radius-md);
1520
+ background: var(--malix-surface);
1521
+ border: 1px solid var(--malix-border);
1522
+ transition: background-color 120ms ease;
1523
+ width: 100%;
1524
+ }
1525
+
1526
+ .malix-file-card:hover {
1527
+ background: var(--malix-surface-secondary);
1528
+ }
1529
+
1530
+ .malix-file-card__icon-wrap {
1531
+ display: inline-flex;
1532
+ align-items: center;
1533
+ justify-content: center;
1534
+ width: 40px;
1535
+ height: 40px;
1536
+ border-radius: var(--malix-radius-md);
1537
+ background: var(--malix-primary-light);
1538
+ flex-shrink: 0;
1539
+ }
1540
+
1541
+ .malix-file-card__icon {
1542
+ display: inline-flex;
1543
+ align-items: center;
1544
+ justify-content: center;
1545
+ color: var(--malix-cta-primary-bg);
1546
+ }
1547
+
1548
+ .malix-file-card__icon > svg {
1549
+ width: 20px;
1550
+ height: 20px;
1551
+ }
1552
+
1553
+ .malix-file-card__info {
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ gap: 2px;
1557
+ min-width: 0;
1558
+ flex: 1;
1559
+ }
1560
+
1561
+ .malix-file-card__name {
1562
+ font-family: var(--malix-font-body);
1563
+ font-size: var(--malix-text-base);
1564
+ font-weight: var(--malix-weight-medium);
1565
+ color: var(--malix-foreground);
1566
+ line-height: 1.4;
1567
+ white-space: nowrap;
1568
+ overflow: hidden;
1569
+ text-overflow: ellipsis;
1570
+ }
1571
+
1572
+ .malix-file-card__meta {
1573
+ font-family: var(--malix-font-body);
1574
+ font-size: var(--malix-text-xs);
1575
+ font-weight: var(--malix-weight-normal);
1576
+ color: var(--malix-foreground-secondary);
1577
+ line-height: 1.4;
1578
+ }
1579
+
1580
+ .malix-file-card__action {
1581
+ display: inline-flex;
1582
+ align-items: center;
1583
+ justify-content: center;
1584
+ width: 28px;
1585
+ height: 28px;
1586
+ border: none;
1587
+ background: transparent;
1588
+ border-radius: var(--malix-radius-sm);
1589
+ cursor: pointer;
1590
+ color: var(--malix-foreground-tertiary);
1591
+ flex-shrink: 0;
1592
+ transition: background-color 120ms ease, color 120ms ease;
1593
+ }
1594
+
1595
+ .malix-file-card__action:hover {
1596
+ background: var(--malix-surface-hover);
1597
+ color: var(--malix-foreground-secondary);
1598
+ }
1599
+
1600
+ .malix-file-card__action:focus-visible {
1601
+ outline: 2px solid var(--malix-border-focus);
1602
+ outline-offset: 2px;
1603
+ }
1604
+
1605
+ /* ═══════════════════════════════════════════════
1606
+ TAB BAR
1607
+ horizontal tabs with active indicator, bottom border
1608
+ ═══════════════════════════════════════════════ */
1609
+
1610
+ .malix-tab-bar {
1611
+ display: flex;
1612
+ align-items: stretch;
1613
+ gap: 0;
1614
+ border-bottom: 1px solid var(--malix-border);
1615
+ width: 100%;
1616
+ }
1617
+
1618
+ .malix-tab-bar__tab {
1619
+ display: inline-flex;
1620
+ align-items: center;
1621
+ justify-content: center;
1622
+ padding: 10px 16px;
1623
+ border: none;
1624
+ background: transparent;
1625
+ cursor: pointer;
1626
+ font-family: var(--malix-font-body);
1627
+ font-size: var(--malix-text-sm);
1628
+ font-weight: var(--malix-weight-medium);
1629
+ color: var(--malix-foreground-secondary);
1630
+ border-bottom: 2px solid transparent;
1631
+ margin-bottom: -1px;
1632
+ transition: color 120ms ease, border-color 120ms ease;
1633
+ line-height: 1;
1634
+ }
1635
+
1636
+ .malix-tab-bar__tab:hover {
1637
+ color: var(--malix-foreground);
1638
+ }
1639
+
1640
+ .malix-tab-bar__tab[data-active] {
1641
+ color: var(--malix-cta-primary-bg);
1642
+ border-bottom-color: var(--malix-cta-primary-bg);
1643
+ }
1644
+
1645
+ .malix-tab-bar__tab:focus-visible {
1646
+ outline: 2px solid var(--malix-border-focus);
1647
+ outline-offset: -2px;
1648
+ }
1649
+
1650
+ .malix-tab-bar__tab-label {
1651
+ white-space: nowrap;
1652
+ }
1653
+
1654
+ /* ═══════════════════════════════════════════════
1655
+ OPERATION STATUS
1656
+ pill-shaped status indicator with icon + label
1657
+ ═══════════════════════════════════════════════ */
1658
+
1659
+ .malix-op-status {
1660
+ display: inline-flex;
1661
+ align-items: center;
1662
+ gap: 6px;
1663
+ padding: 6px 12px;
1664
+ border-radius: var(--malix-radius-pill);
1665
+ font-family: var(--malix-font-body);
1666
+ font-size: var(--malix-text-xs);
1667
+ font-weight: var(--malix-weight-medium);
1668
+ line-height: 1;
1669
+ }
1670
+
1671
+ .malix-op-status__icon {
1672
+ display: inline-flex;
1673
+ align-items: center;
1674
+ justify-content: center;
1675
+ flex-shrink: 0;
1676
+ }
1677
+
1678
+ .malix-op-status__icon > svg {
1679
+ width: 14px;
1680
+ height: 14px;
1681
+ }
1682
+
1683
+ .malix-op-status__label {
1684
+ white-space: nowrap;
1685
+ }
1686
+
1687
+ .malix-op-status[data-status="active"] {
1688
+ background: var(--malix-primary-light);
1689
+ color: var(--malix-cta-primary-bg);
1690
+ }
1691
+
1692
+ .malix-op-status[data-status="active"] .malix-op-status__icon {
1693
+ animation: malix-blink 1.4s ease-in-out infinite;
1694
+ }
1695
+
1696
+ .malix-op-status[data-status="completed"] {
1697
+ background: var(--malix-success-light);
1698
+ color: var(--malix-success-foreground);
1699
+ }
1700
+
1701
+ .malix-op-status[data-status="failed"] {
1702
+ background: var(--malix-error-light);
1703
+ color: var(--malix-error-foreground);
1704
+ }
1705
+
1706
+ .malix-op-status[data-status="pending"] {
1707
+ background: var(--malix-warning-light);
1708
+ color: var(--malix-warning-foreground);
1709
+ }
1710
+
1711
+ @keyframes malix-blink {
1712
+ 0%, 100% { opacity: 1; }
1713
+ 50% { opacity: 0.3; }
1714
+ }
1715
+
1716
+ /* ═══════════════════════════════════════════════
1717
+ VALIDATION ALERT
1718
+ left-border accent alert with icon, content, close
1719
+ ═══════════════════════════════════════════════ */
1720
+
1721
+ .malix-validation-alert {
1722
+ display: flex;
1723
+ align-items: flex-start;
1724
+ gap: 12px;
1725
+ padding: 14px 16px;
1726
+ border-radius: var(--malix-radius-md);
1727
+ border: 1px solid transparent;
1728
+ font-family: var(--malix-font-body);
1729
+ }
1730
+
1731
+ .malix-validation-alert__icon {
1732
+ display: inline-flex;
1733
+ align-items: center;
1734
+ justify-content: center;
1735
+ width: 16px;
1736
+ height: 16px;
1737
+ flex-shrink: 0;
1738
+ padding-top: 1px;
1739
+ }
1740
+
1741
+ .malix-validation-alert__content {
1742
+ display: flex;
1743
+ flex-direction: column;
1744
+ gap: 4px;
1745
+ flex: 1;
1746
+ min-width: 0;
1747
+ }
1748
+
1749
+ .malix-validation-alert__title {
1750
+ font-size: var(--malix-text-sm);
1751
+ font-weight: var(--malix-weight-semibold);
1752
+ line-height: 1.3;
1753
+ }
1754
+
1755
+ .malix-validation-alert__message {
1756
+ font-size: var(--malix-text-sm);
1757
+ font-weight: var(--malix-weight-normal);
1758
+ line-height: 1.5;
1759
+ opacity: 0.85;
1760
+ }
1761
+
1762
+ .malix-validation-alert__close {
1763
+ display: inline-flex;
1764
+ align-items: center;
1765
+ justify-content: center;
1766
+ width: 28px;
1767
+ height: 28px;
1768
+ border: none;
1769
+ background: transparent;
1770
+ border-radius: var(--malix-radius-sm);
1771
+ cursor: pointer;
1772
+ flex-shrink: 0;
1773
+ opacity: 0.6;
1774
+ transition: opacity 120ms ease, background-color 120ms ease;
1775
+ }
1776
+
1777
+ .malix-validation-alert__close:hover {
1778
+ opacity: 1;
1779
+ background: #00000008;
1780
+ }
1781
+
1782
+ /* error variant */
1783
+ .malix-validation-alert[data-variant="error"] {
1784
+ background: var(--malix-error-light);
1785
+ border-color: var(--malix-error);
1786
+ }
1787
+
1788
+ .malix-validation-alert[data-variant="error"] .malix-validation-alert__icon,
1789
+ .malix-validation-alert[data-variant="error"] .malix-validation-alert__title {
1790
+ color: var(--malix-error);
1791
+ }
1792
+
1793
+ .malix-validation-alert[data-variant="error"] .malix-validation-alert__message {
1794
+ color: var(--malix-foreground-secondary);
1795
+ }
1796
+
1797
+ .malix-validation-alert[data-variant="error"] .malix-validation-alert__close {
1798
+ color: var(--malix-error-foreground);
1799
+ }
1800
+
1801
+ /* warning variant */
1802
+ .malix-validation-alert[data-variant="warning"] {
1803
+ background: var(--malix-warning-light);
1804
+ border-color: var(--malix-warning);
1805
+ }
1806
+
1807
+ .malix-validation-alert[data-variant="warning"] .malix-validation-alert__icon,
1808
+ .malix-validation-alert[data-variant="warning"] .malix-validation-alert__title {
1809
+ color: var(--malix-warning);
1810
+ }
1811
+
1812
+ .malix-validation-alert[data-variant="warning"] .malix-validation-alert__message {
1813
+ color: var(--malix-foreground-secondary);
1814
+ }
1815
+
1816
+ .malix-validation-alert[data-variant="warning"] .malix-validation-alert__close {
1817
+ color: var(--malix-warning-foreground);
1818
+ }
1819
+
1820
+ /* info variant */
1821
+ .malix-validation-alert[data-variant="info"] {
1822
+ background: var(--malix-info-light);
1823
+ border-color: var(--malix-info);
1824
+ }
1825
+
1826
+ .malix-validation-alert[data-variant="info"] .malix-validation-alert__icon,
1827
+ .malix-validation-alert[data-variant="info"] .malix-validation-alert__title {
1828
+ color: var(--malix-info);
1829
+ }
1830
+
1831
+ .malix-validation-alert[data-variant="info"] .malix-validation-alert__message {
1832
+ color: var(--malix-foreground-secondary);
1833
+ }
1834
+
1835
+ .malix-validation-alert[data-variant="info"] .malix-validation-alert__close {
1836
+ color: var(--malix-info-foreground);
1837
+ }
1838
+
1839
+ /* ═══════════════════════════════════════════════
1840
+ SELECTION CARD
1841
+ clickable card with active state highlight
1842
+ ═══════════════════════════════════════════════ */
1843
+
1844
+ .malix-selection-card {
1845
+ display: flex;
1846
+ flex-direction: column;
1847
+ gap: 12px;
1848
+ padding: 20px;
1849
+ background: var(--malix-surface);
1850
+ border: 1px solid var(--malix-border);
1851
+ border-radius: var(--malix-radius-lg);
1852
+ cursor: pointer;
1853
+ transition: background-color 120ms ease, border-color 120ms ease, box-shadow 120ms ease;
1854
+ font-family: var(--malix-font-body);
1855
+ }
1856
+
1857
+ .malix-selection-card:hover {
1858
+ border-color: var(--malix-border-strong);
1859
+ box-shadow: var(--malix-shadow-card-l1);
1860
+ }
1861
+
1862
+ .malix-selection-card:focus-visible {
1863
+ outline: 2px solid var(--malix-border-focus);
1864
+ outline-offset: 2px;
1865
+ }
1866
+
1867
+ .malix-selection-card__icon-wrap {
1868
+ display: inline-flex;
1869
+ align-items: center;
1870
+ justify-content: center;
1871
+ width: 40px;
1872
+ height: 40px;
1873
+ border-radius: var(--malix-radius-md);
1874
+ background: var(--malix-surface-secondary);
1875
+ color: var(--malix-foreground-secondary);
1876
+ flex-shrink: 0;
1877
+ transition: background-color 120ms ease, color 120ms ease;
1878
+ }
1879
+
1880
+ .malix-selection-card__icon-wrap > svg {
1881
+ width: 20px;
1882
+ height: 20px;
1883
+ }
1884
+
1885
+ .malix-selection-card__title {
1886
+ font-size: var(--malix-text-base);
1887
+ font-weight: var(--malix-weight-semibold);
1888
+ color: var(--malix-foreground);
1889
+ line-height: 1.3;
1890
+ }
1891
+
1892
+ .malix-selection-card__description {
1893
+ font-size: var(--malix-text-sm);
1894
+ font-weight: var(--malix-weight-normal);
1895
+ color: var(--malix-foreground-secondary);
1896
+ line-height: 1.5;
1897
+ }
1898
+
1899
+ /* active state */
1900
+ .malix-selection-card[data-active] {
1901
+ background: var(--malix-primary-light);
1902
+ border: 2px solid var(--malix-cta-primary-bg);
1903
+ padding: 19px;
1904
+ }
1905
+
1906
+ .malix-selection-card[data-active] .malix-selection-card__icon-wrap {
1907
+ background: var(--malix-cta-primary-bg);
1908
+ color: var(--malix-primary-foreground);
1909
+ }
1910
+
1911
+ .malix-selection-card[data-active] .malix-selection-card__title {
1912
+ color: var(--malix-cta-primary-bg);
1913
+ }
1914
+
1915
+ /* ═══════════════════════════════════════════════
1916
+ ACCORDION
1917
+ collapsible panel with chevron rotation
1918
+ ═══════════════════════════════════════════════ */
1919
+
1920
+ .malix-accordion {
1921
+ border: 1px solid var(--malix-border);
1922
+ border-radius: var(--malix-radius-md);
1923
+ overflow: hidden;
1924
+ font-family: var(--malix-font-body);
1925
+ }
1926
+
1927
+ .malix-accordion__header {
1928
+ display: flex;
1929
+ align-items: center;
1930
+ gap: 8px;
1931
+ width: 100%;
1932
+ padding: 12px 16px;
1933
+ background: var(--malix-surface);
1934
+ border: none;
1935
+ cursor: pointer;
1936
+ font-family: inherit;
1937
+ text-align: left;
1938
+ transition: background-color 120ms ease;
1939
+ }
1940
+
1941
+ .malix-accordion__header:hover {
1942
+ background: var(--malix-surface-secondary);
1943
+ }
1944
+
1945
+ .malix-accordion__icon {
1946
+ display: inline-flex;
1947
+ align-items: center;
1948
+ justify-content: center;
1949
+ width: 18px;
1950
+ height: 18px;
1951
+ flex-shrink: 0;
1952
+ color: var(--malix-foreground-secondary);
1953
+ }
1954
+
1955
+ .malix-accordion__icon > svg {
1956
+ width: 18px;
1957
+ height: 18px;
1958
+ }
1959
+
1960
+ .malix-accordion__title {
1961
+ flex: 1;
1962
+ font-size: var(--malix-text-base);
1963
+ font-weight: var(--malix-weight-medium);
1964
+ color: var(--malix-foreground);
1965
+ line-height: 1.4;
1966
+ }
1967
+
1968
+ .malix-accordion__chevron {
1969
+ flex-shrink: 0;
1970
+ color: var(--malix-foreground-tertiary);
1971
+ transition: transform 200ms ease;
1972
+ }
1973
+
1974
+ .malix-accordion[data-open="true"] .malix-accordion__chevron {
1975
+ transform: rotate(180deg);
1976
+ }
1977
+
1978
+ .malix-accordion__body {
1979
+ display: none;
1980
+ padding: 0 16px 16px;
1981
+ font-size: var(--malix-text-sm);
1982
+ color: var(--malix-foreground-secondary);
1983
+ line-height: 1.6;
1984
+ }
1985
+
1986
+ .malix-accordion[data-open="true"] .malix-accordion__body {
1987
+ display: block;
1988
+ }
1989
+
1990
+ /* ═══════════════════════════════════════════════
1991
+ BADGE
1992
+ small label with optional dot indicator
1993
+ ═══════════════════════════════════════════════ */
1994
+
1995
+ .malix-badge {
1996
+ display: inline-flex;
1997
+ align-items: center;
1998
+ gap: 6px;
1999
+ padding: 2px 10px;
2000
+ border-radius: var(--malix-radius-pill);
2001
+ font-family: var(--malix-font-body);
2002
+ font-size: var(--malix-text-xs);
2003
+ font-weight: var(--malix-weight-medium);
2004
+ line-height: 1.6;
2005
+ }
2006
+
2007
+ .malix-badge__dot {
2008
+ width: 6px;
2009
+ height: 6px;
2010
+ border-radius: 50%;
2011
+ flex-shrink: 0;
2012
+ }
2013
+
2014
+ .malix-badge[data-variant="default"] {
2015
+ background: var(--malix-surface-secondary);
2016
+ color: var(--malix-foreground-secondary);
2017
+ border: 1px solid var(--malix-border);
2018
+ }
2019
+
2020
+ .malix-badge[data-variant="default"] .malix-badge__dot {
2021
+ background: var(--malix-foreground-tertiary);
2022
+ }
2023
+
2024
+ .malix-badge[data-variant="primary"] {
2025
+ background: var(--malix-primary-light);
2026
+ color: var(--malix-cta-primary-bg);
2027
+ }
2028
+
2029
+ .malix-badge[data-variant="primary"] .malix-badge__dot {
2030
+ background: var(--malix-cta-primary-bg);
2031
+ }
2032
+
2033
+ .malix-badge[data-variant="success"] {
2034
+ background: var(--malix-success-light);
2035
+ color: var(--malix-success-foreground);
2036
+ }
2037
+
2038
+ .malix-badge[data-variant="success"] .malix-badge__dot {
2039
+ background: var(--malix-success);
2040
+ }
2041
+
2042
+ .malix-badge[data-variant="warning"] {
2043
+ background: var(--malix-warning-light);
2044
+ color: var(--malix-warning-foreground);
2045
+ }
2046
+
2047
+ .malix-badge[data-variant="warning"] .malix-badge__dot {
2048
+ background: var(--malix-warning);
2049
+ }
2050
+
2051
+ .malix-badge[data-variant="error"] {
2052
+ background: var(--malix-error-light);
2053
+ color: var(--malix-error-foreground);
2054
+ }
2055
+
2056
+ .malix-badge[data-variant="error"] .malix-badge__dot {
2057
+ background: var(--malix-error);
2058
+ }
2059
+
2060
+ /* ═══════════════════════════════════════════════
2061
+ BANNER
2062
+ full-width alert bar with icon, content, close
2063
+ ═══════════════════════════════════════════════ */
2064
+
2065
+ .malix-banner {
2066
+ display: flex;
2067
+ align-items: flex-start;
2068
+ gap: 12px;
2069
+ padding: 12px 16px;
2070
+ border-radius: var(--malix-radius-md);
2071
+ font-family: var(--malix-font-body);
2072
+ font-size: var(--malix-text-sm);
2073
+ line-height: 1.5;
2074
+ }
2075
+
2076
+ .malix-banner__icon {
2077
+ display: inline-flex;
2078
+ align-items: center;
2079
+ justify-content: center;
2080
+ flex-shrink: 0;
2081
+ width: 18px;
2082
+ height: 18px;
2083
+ margin-top: 1px;
2084
+ }
2085
+
2086
+ .malix-banner__icon > svg {
2087
+ width: 18px;
2088
+ height: 18px;
2089
+ }
2090
+
2091
+ .malix-banner__content {
2092
+ flex: 1;
2093
+ font-weight: var(--malix-weight-normal);
2094
+ }
2095
+
2096
+ .malix-banner__close {
2097
+ display: inline-flex;
2098
+ align-items: center;
2099
+ justify-content: center;
2100
+ width: 24px;
2101
+ height: 24px;
2102
+ padding: 0;
2103
+ border: none;
2104
+ background: none;
2105
+ cursor: pointer;
2106
+ border-radius: var(--malix-radius-sm);
2107
+ color: inherit;
2108
+ opacity: 0.6;
2109
+ flex-shrink: 0;
2110
+ transition: opacity 120ms ease;
2111
+ }
2112
+
2113
+ .malix-banner__close:hover {
2114
+ opacity: 1;
2115
+ }
2116
+
2117
+ .malix-banner[data-variant="info"] {
2118
+ background: var(--malix-info-light);
2119
+ color: var(--malix-info-foreground);
2120
+ border: 1px solid color-mix(in srgb, var(--malix-info) 25%, transparent);
2121
+ }
2122
+
2123
+ .malix-banner[data-variant="success"] {
2124
+ background: var(--malix-success-light);
2125
+ color: var(--malix-success-foreground);
2126
+ border: 1px solid color-mix(in srgb, var(--malix-success) 25%, transparent);
2127
+ }
2128
+
2129
+ .malix-banner[data-variant="warning"] {
2130
+ background: var(--malix-warning-light);
2131
+ color: var(--malix-warning-foreground);
2132
+ border: 1px solid color-mix(in srgb, var(--malix-warning) 25%, transparent);
2133
+ }
2134
+
2135
+ .malix-banner[data-variant="error"] {
2136
+ background: var(--malix-error-light);
2137
+ color: var(--malix-error-foreground);
2138
+ border: 1px solid color-mix(in srgb, var(--malix-error) 25%, transparent);
2139
+ }
2140
+
2141
+ /* ═══════════════════════════════════════════════
2142
+ CHECKBOX
2143
+ square toggle with check / indeterminate icon
2144
+ ═══════════════════════════════════════════════ */
2145
+
2146
+ .malix-checkbox {
2147
+ display: inline-flex;
2148
+ align-items: center;
2149
+ justify-content: center;
2150
+ width: 18px;
2151
+ height: 18px;
2152
+ border-radius: var(--malix-radius-sm);
2153
+ border: 1.5px solid var(--malix-border-strong);
2154
+ background: var(--malix-surface);
2155
+ cursor: pointer;
2156
+ padding: 0;
2157
+ flex-shrink: 0;
2158
+ transition: background-color 120ms ease, border-color 120ms ease;
2159
+ }
2160
+
2161
+ .malix-checkbox:hover {
2162
+ border-color: var(--malix-cta-primary-bg);
2163
+ }
2164
+
2165
+ .malix-checkbox:focus-visible {
2166
+ outline: 2px solid var(--malix-border-focus);
2167
+ outline-offset: 2px;
2168
+ }
2169
+
2170
+ .malix-checkbox[data-checked="true"] {
2171
+ background: var(--malix-cta-primary-bg);
2172
+ border-color: var(--malix-cta-primary-bg);
2173
+ }
2174
+
2175
+ .malix-checkbox[data-indeterminate="true"] {
2176
+ background: var(--malix-cta-primary-bg);
2177
+ border-color: var(--malix-cta-primary-bg);
2178
+ }
2179
+
2180
+ .malix-checkbox__icon {
2181
+ width: 12px;
2182
+ height: 12px;
2183
+ color: var(--malix-primary-foreground);
2184
+ }
2185
+
2186
+ .malix-checkbox[data-disabled="true"] {
2187
+ opacity: 0.5;
2188
+ cursor: not-allowed;
2189
+ }
2190
+
2191
+ .malix-checkbox-row {
2192
+ display: inline-flex;
2193
+ align-items: center;
2194
+ gap: 8px;
2195
+ cursor: pointer;
2196
+ font-family: var(--malix-font-body);
2197
+ }
2198
+
2199
+ .malix-checkbox-row__label {
2200
+ font-size: var(--malix-text-sm);
2201
+ font-weight: var(--malix-weight-normal);
2202
+ color: var(--malix-foreground);
2203
+ line-height: 1;
2204
+ }
2205
+
2206
+ /* ═══════════════════════════════════════════════
2207
+ CREDITS INDICATOR
2208
+ icon + label/value inline display
2209
+ ═══════════════════════════════════════════════ */
2210
+
2211
+ .malix-credits-indicator {
2212
+ display: inline-flex;
2213
+ align-items: center;
2214
+ gap: 10px;
2215
+ padding: 10px 16px;
2216
+ background: var(--malix-surface);
2217
+ border: 1px solid var(--malix-border);
2218
+ border-radius: var(--malix-radius-md);
2219
+ font-family: var(--malix-font-body);
2220
+ }
2221
+
2222
+ .malix-credits-indicator__icon {
2223
+ display: inline-flex;
2224
+ align-items: center;
2225
+ justify-content: center;
2226
+ width: 36px;
2227
+ height: 36px;
2228
+ background: var(--malix-primary-light);
2229
+ border-radius: var(--malix-radius-md);
2230
+ color: var(--malix-cta-primary-bg);
2231
+ flex-shrink: 0;
2232
+ }
2233
+
2234
+ .malix-credits-indicator__icon > svg {
2235
+ width: 20px;
2236
+ height: 20px;
2237
+ }
2238
+
2239
+ .malix-credits-indicator__info {
2240
+ display: flex;
2241
+ flex-direction: column;
2242
+ gap: 2px;
2243
+ }
2244
+
2245
+ .malix-credits-indicator__label {
2246
+ font-size: var(--malix-text-xs);
2247
+ font-weight: var(--malix-weight-normal);
2248
+ color: var(--malix-foreground-secondary);
2249
+ line-height: 1;
2250
+ }
2251
+
2252
+ .malix-credits-indicator__value {
2253
+ font-size: var(--malix-text-lg);
2254
+ font-weight: var(--malix-weight-semibold);
2255
+ color: var(--malix-foreground);
2256
+ line-height: 1.2;
2257
+ }
2258
+
2259
+ /* ═══════════════════════════════════════════════
2260
+ DATA TABLE
2261
+ standard HTML table with Malix styling
2262
+ ═══════════════════════════════════════════════ */
2263
+
2264
+ .malix-data-table {
2265
+ width: 100%;
2266
+ border-collapse: collapse;
2267
+ font-family: var(--malix-font-body);
2268
+ font-size: var(--malix-text-sm);
2269
+ border: 1px solid var(--malix-border);
2270
+ border-radius: var(--malix-radius-md);
2271
+ overflow: hidden;
2272
+ }
2273
+
2274
+ .malix-data-table__header-row {
2275
+ background: var(--malix-surface-secondary);
2276
+ }
2277
+
2278
+ .malix-data-table__header-cell {
2279
+ padding: 10px 16px;
2280
+ text-align: left;
2281
+ font-weight: var(--malix-weight-semibold);
2282
+ font-size: var(--malix-text-xs);
2283
+ color: var(--malix-foreground-secondary);
2284
+ text-transform: uppercase;
2285
+ letter-spacing: 0.5px;
2286
+ border-bottom: 1px solid var(--malix-border);
2287
+ white-space: nowrap;
2288
+ }
2289
+
2290
+ .malix-data-table__data-row {
2291
+ transition: background-color 120ms ease;
2292
+ }
2293
+
2294
+ .malix-data-table__data-row:not(:last-child) {
2295
+ border-bottom: 1px solid var(--malix-border);
2296
+ }
2297
+
2298
+ .malix-data-table__data-row:hover {
2299
+ background: var(--malix-surface-secondary);
2300
+ }
2301
+
2302
+ .malix-data-table__data-row[data-clickable] {
2303
+ cursor: pointer;
2304
+ }
2305
+
2306
+ .malix-data-table__cell {
2307
+ padding: 10px 16px;
2308
+ color: var(--malix-foreground);
2309
+ line-height: 1.4;
2310
+ }
2311
+
2312
+ /* ═══════════════════════════════════════════════
2313
+ DROPZONE
2314
+ file upload area with drag-and-drop support
2315
+ ═══════════════════════════════════════════════ */
2316
+
2317
+ .malix-dropzone {
2318
+ display: flex;
2319
+ flex-direction: column;
2320
+ align-items: center;
2321
+ justify-content: center;
2322
+ gap: 8px;
2323
+ padding: 32px 24px;
2324
+ border: 2px dashed var(--malix-border);
2325
+ border-radius: var(--malix-radius-lg);
2326
+ background: var(--malix-surface);
2327
+ cursor: pointer;
2328
+ text-align: center;
2329
+ transition: background-color 120ms ease, border-color 120ms ease;
2330
+ font-family: var(--malix-font-body);
2331
+ }
2332
+
2333
+ .malix-dropzone:hover {
2334
+ background: var(--malix-surface-secondary);
2335
+ border-color: var(--malix-border-strong);
2336
+ }
2337
+
2338
+ .malix-dropzone[data-dragging="true"] {
2339
+ background: var(--malix-primary-light);
2340
+ border-color: var(--malix-cta-primary-bg);
2341
+ }
2342
+
2343
+ .malix-dropzone[data-disabled="true"] {
2344
+ opacity: 0.5;
2345
+ cursor: not-allowed;
2346
+ }
2347
+
2348
+ .malix-dropzone__icon {
2349
+ color: var(--malix-foreground-tertiary);
2350
+ margin-bottom: 4px;
2351
+ }
2352
+
2353
+ .malix-dropzone__title {
2354
+ font-size: var(--malix-text-base);
2355
+ font-weight: var(--malix-weight-medium);
2356
+ color: var(--malix-foreground);
2357
+ line-height: 1;
2358
+ }
2359
+
2360
+ .malix-dropzone__hint {
2361
+ font-size: var(--malix-text-sm);
2362
+ color: var(--malix-foreground-secondary);
2363
+ line-height: 1;
2364
+ }
2365
+
2366
+ .malix-dropzone__browse-btn {
2367
+ display: inline-flex;
2368
+ align-items: center;
2369
+ justify-content: center;
2370
+ padding: 6px 16px;
2371
+ margin-top: 4px;
2372
+ background: var(--malix-cta-primary-bg);
2373
+ color: var(--malix-primary-foreground);
2374
+ border-radius: var(--malix-radius-md);
2375
+ font-size: var(--malix-text-sm);
2376
+ font-weight: var(--malix-weight-medium);
2377
+ transition: background-color 120ms ease;
2378
+ line-height: 1.4;
2379
+ }
2380
+
2381
+ .malix-dropzone__browse-btn:hover {
2382
+ background: var(--malix-primary-hover);
2383
+ }
2384
+
2385
+ /* ═══════════════════════════════════════════════
2386
+ LANGUAGE SELECTOR
2387
+ globe icon + native select styled overlay
2388
+ ═══════════════════════════════════════════════ */
2389
+
2390
+ .malix-language-selector {
2391
+ display: inline-flex;
2392
+ align-items: center;
2393
+ gap: 8px;
2394
+ padding: 8px 12px;
2395
+ background: var(--malix-surface);
2396
+ border: 1px solid var(--malix-border);
2397
+ border-radius: var(--malix-radius-md);
2398
+ font-family: var(--malix-font-body);
2399
+ cursor: pointer;
2400
+ position: relative;
2401
+ }
2402
+
2403
+ .malix-language-selector:hover {
2404
+ border-color: var(--malix-border-strong);
2405
+ }
2406
+
2407
+ .malix-language-selector__icon {
2408
+ display: inline-flex;
2409
+ align-items: center;
2410
+ justify-content: center;
2411
+ color: var(--malix-foreground-secondary);
2412
+ flex-shrink: 0;
2413
+ }
2414
+
2415
+ .malix-language-selector__icon > svg {
2416
+ width: 16px;
2417
+ height: 16px;
2418
+ }
2419
+
2420
+ .malix-language-selector__select {
2421
+ position: absolute;
2422
+ inset: 0;
2423
+ width: 100%;
2424
+ height: 100%;
2425
+ opacity: 0;
2426
+ cursor: pointer;
2427
+ font-size: var(--malix-text-sm);
2428
+ }
2429
+
2430
+ .malix-language-selector__label {
2431
+ font-size: var(--malix-text-sm);
2432
+ font-weight: var(--malix-weight-medium);
2433
+ color: var(--malix-foreground);
2434
+ line-height: 1;
2435
+ }
2436
+
2437
+ .malix-language-selector__chevron {
2438
+ display: inline-flex;
2439
+ align-items: center;
2440
+ justify-content: center;
2441
+ color: var(--malix-foreground-tertiary);
2442
+ flex-shrink: 0;
2443
+ }
2444
+
2445
+ .malix-language-selector__chevron > svg {
2446
+ width: 14px;
2447
+ height: 14px;
2448
+ }
2449
+
2450
+ /* ═══════════════════════════════════════════════
2451
+ ONBOARDING POPOVER
2452
+ step-by-step onboarding tooltip card
2453
+ ═══════════════════════════════════════════════ */
2454
+
2455
+ .malix-onboarding-popover {
2456
+ display: flex;
2457
+ flex-direction: column;
2458
+ gap: 8px;
2459
+ padding: 20px;
2460
+ background: var(--malix-surface);
2461
+ border: 1px solid var(--malix-border);
2462
+ border-radius: var(--malix-radius-lg);
2463
+ box-shadow: var(--malix-shadow-card-l2);
2464
+ width: 320px;
2465
+ font-family: var(--malix-font-body);
2466
+ }
2467
+
2468
+ .malix-onboarding-popover__step {
2469
+ font-size: var(--malix-text-xs);
2470
+ font-weight: var(--malix-weight-medium);
2471
+ color: var(--malix-cta-primary-bg);
2472
+ line-height: 1;
2473
+ }
2474
+
2475
+ .malix-onboarding-popover__title {
2476
+ margin: 0;
2477
+ font-size: var(--malix-text-lg);
2478
+ font-weight: var(--malix-weight-semibold);
2479
+ color: var(--malix-foreground);
2480
+ line-height: 1.3;
2481
+ }
2482
+
2483
+ .malix-onboarding-popover__description {
2484
+ margin: 0;
2485
+ font-size: var(--malix-text-sm);
2486
+ font-weight: var(--malix-weight-normal);
2487
+ color: var(--malix-foreground-secondary);
2488
+ line-height: 1.5;
2489
+ }
2490
+
2491
+ .malix-onboarding-popover__actions {
2492
+ display: flex;
2493
+ align-items: center;
2494
+ justify-content: flex-end;
2495
+ gap: 12px;
2496
+ margin-top: 4px;
2497
+ }
2498
+
2499
+ .malix-onboarding-popover__skip {
2500
+ padding: 6px 12px;
2501
+ border: none;
2502
+ background: none;
2503
+ font-family: var(--malix-font-body);
2504
+ font-size: var(--malix-text-sm);
2505
+ font-weight: var(--malix-weight-medium);
2506
+ color: var(--malix-foreground-secondary);
2507
+ cursor: pointer;
2508
+ border-radius: var(--malix-radius-md);
2509
+ transition: color 120ms ease;
2510
+ }
2511
+
2512
+ .malix-onboarding-popover__skip:hover {
2513
+ color: var(--malix-foreground);
2514
+ }
2515
+
2516
+ .malix-onboarding-popover__next-btn {
2517
+ padding: 8px 20px;
2518
+ border: none;
2519
+ background: var(--malix-cta-primary-bg);
2520
+ color: var(--malix-primary-foreground);
2521
+ font-family: var(--malix-font-body);
2522
+ font-size: var(--malix-text-sm);
2523
+ font-weight: var(--malix-weight-medium);
2524
+ border-radius: var(--malix-radius-md);
2525
+ cursor: pointer;
2526
+ transition: background-color 120ms ease;
2527
+ line-height: 1;
2528
+ }
2529
+
2530
+ .malix-onboarding-popover__next-btn:hover {
2531
+ background: var(--malix-primary-hover);
2532
+ }
2533
+
2534
+ /* ═══════════════════════════════════════════════
2535
+ PAGINATION
2536
+ page navigation with arrows and page items
2537
+ ═══════════════════════════════════════════════ */
2538
+
2539
+ .malix-pagination {
2540
+ display: inline-flex;
2541
+ align-items: center;
2542
+ gap: 4px;
2543
+ font-family: var(--malix-font-body);
2544
+ }
2545
+
2546
+ .malix-pagination__arrow {
2547
+ display: inline-flex;
2548
+ align-items: center;
2549
+ justify-content: center;
2550
+ width: 32px;
2551
+ height: 32px;
2552
+ padding: 0;
2553
+ border: 1px solid var(--malix-border);
2554
+ background: var(--malix-surface);
2555
+ border-radius: var(--malix-radius-md);
2556
+ color: var(--malix-foreground);
2557
+ cursor: pointer;
2558
+ transition: background-color 120ms ease, border-color 120ms ease;
2559
+ }
2560
+
2561
+ .malix-pagination__arrow:hover:not(:disabled) {
2562
+ background: var(--malix-surface-secondary);
2563
+ border-color: var(--malix-border-strong);
2564
+ }
2565
+
2566
+ .malix-pagination__arrow:disabled {
2567
+ opacity: 0.4;
2568
+ cursor: not-allowed;
2569
+ }
2570
+
2571
+ .malix-pagination__item {
2572
+ display: inline-flex;
2573
+ align-items: center;
2574
+ justify-content: center;
2575
+ width: 32px;
2576
+ height: 32px;
2577
+ padding: 0;
2578
+ border: 1px solid transparent;
2579
+ background: transparent;
2580
+ border-radius: var(--malix-radius-md);
2581
+ font-family: var(--malix-font-body);
2582
+ font-size: var(--malix-text-sm);
2583
+ font-weight: var(--malix-weight-medium);
2584
+ color: var(--malix-foreground-secondary);
2585
+ cursor: pointer;
2586
+ transition: background-color 120ms ease, color 120ms ease;
2587
+ line-height: 1;
2588
+ }
2589
+
2590
+ .malix-pagination__item:hover {
2591
+ background: var(--malix-surface-secondary);
2592
+ color: var(--malix-foreground);
2593
+ }
2594
+
2595
+ .malix-pagination__item[data-active] {
2596
+ background: var(--malix-cta-primary-bg);
2597
+ color: var(--malix-primary-foreground);
2598
+ }
2599
+
2600
+ .malix-pagination__label {
2601
+ font-size: var(--malix-text-sm);
2602
+ font-weight: var(--malix-weight-medium);
2603
+ color: var(--malix-foreground-secondary);
2604
+ padding: 0 8px;
2605
+ line-height: 1;
2606
+ }
2607
+
2608
+ /* ═══════════════════════════════════════════════
2609
+ PRICING CARD
2610
+ plan card with price, features, CTA
2611
+ ═══════════════════════════════════════════════ */
2612
+
2613
+ .malix-pricing-card {
2614
+ display: flex;
2615
+ flex-direction: column;
2616
+ gap: 16px;
2617
+ padding: 24px;
2618
+ width: 320px;
2619
+ background: var(--malix-surface);
2620
+ border: 1px solid var(--malix-border);
2621
+ border-radius: var(--malix-radius-lg);
2622
+ font-family: var(--malix-font-body);
2623
+ transition: border-color 120ms ease, box-shadow 120ms ease;
2624
+ }
2625
+
2626
+ .malix-pricing-card[data-highlighted] {
2627
+ border-color: var(--malix-cta-primary-bg);
2628
+ box-shadow: 0 0 0 1px var(--malix-cta-primary-bg);
2629
+ }
2630
+
2631
+ .malix-pricing-card__badge {
2632
+ display: inline-flex;
2633
+ align-self: flex-start;
2634
+ padding: 4px 12px;
2635
+ border-radius: var(--malix-radius-pill);
2636
+ background: var(--malix-primary-light);
2637
+ color: var(--malix-cta-primary-bg);
2638
+ font-size: var(--malix-text-xs);
2639
+ font-weight: var(--malix-weight-semibold);
2640
+ line-height: 1.4;
2641
+ }
2642
+
2643
+ .malix-pricing-card__price-row {
2644
+ display: flex;
2645
+ align-items: baseline;
2646
+ gap: 4px;
2647
+ }
2648
+
2649
+ .malix-pricing-card__price {
2650
+ font-size: var(--malix-text-2xl);
2651
+ font-weight: var(--malix-weight-bold);
2652
+ color: var(--malix-foreground);
2653
+ line-height: 1;
2654
+ }
2655
+
2656
+ .malix-pricing-card__period {
2657
+ font-size: var(--malix-text-sm);
2658
+ font-weight: var(--malix-weight-normal);
2659
+ color: var(--malix-foreground-secondary);
2660
+ }
2661
+
2662
+ .malix-pricing-card__description {
2663
+ margin: 0;
2664
+ font-size: var(--malix-text-sm);
2665
+ font-weight: var(--malix-weight-normal);
2666
+ color: var(--malix-foreground-secondary);
2667
+ line-height: 1.5;
2668
+ }
2669
+
2670
+ .malix-pricing-card__features {
2671
+ list-style: none;
2672
+ margin: 0;
2673
+ padding: 0;
2674
+ display: flex;
2675
+ flex-direction: column;
2676
+ gap: 10px;
2677
+ }
2678
+
2679
+ .malix-pricing-card__feature-item {
2680
+ display: flex;
2681
+ align-items: center;
2682
+ gap: 10px;
2683
+ font-size: var(--malix-text-sm);
2684
+ color: var(--malix-foreground);
2685
+ line-height: 1.4;
2686
+ }
2687
+
2688
+ .malix-pricing-card__check-icon {
2689
+ flex-shrink: 0;
2690
+ color: var(--malix-success);
2691
+ }
2692
+
2693
+ .malix-pricing-card__cta {
2694
+ width: 100%;
2695
+ padding: 10px 20px;
2696
+ border: none;
2697
+ border-radius: var(--malix-radius-md);
2698
+ background: var(--malix-cta-primary-bg);
2699
+ color: var(--malix-primary-foreground);
2700
+ font-family: var(--malix-font-body);
2701
+ font-size: var(--malix-text-base);
2702
+ font-weight: var(--malix-weight-medium);
2703
+ cursor: pointer;
2704
+ transition: background-color 120ms ease;
2705
+ line-height: 1;
2706
+ }
2707
+
2708
+ .malix-pricing-card__cta:hover {
2709
+ background: var(--malix-primary-hover);
2710
+ }
2711
+
2712
+ /* ═══════════════════════════════════════════════
2713
+ RADIO
2714
+ circular toggle with inner dot
2715
+ ═══════════════════════════════════════════════ */
2716
+
2717
+ .malix-radio {
2718
+ display: inline-flex;
2719
+ align-items: center;
2720
+ justify-content: center;
2721
+ width: 18px;
2722
+ height: 18px;
2723
+ border-radius: 50%;
2724
+ border: 1.5px solid var(--malix-border-strong);
2725
+ background: var(--malix-surface);
2726
+ cursor: pointer;
2727
+ padding: 0;
2728
+ flex-shrink: 0;
2729
+ transition: border-color 120ms ease;
2730
+ }
2731
+
2732
+ .malix-radio:hover {
2733
+ border-color: var(--malix-cta-primary-bg);
2734
+ }
2735
+
2736
+ .malix-radio:focus-visible {
2737
+ outline: 2px solid var(--malix-border-focus);
2738
+ outline-offset: 2px;
2739
+ }
2740
+
2741
+ .malix-radio[data-checked="true"] {
2742
+ border-color: var(--malix-cta-primary-bg);
2743
+ }
2744
+
2745
+ .malix-radio__dot {
2746
+ width: 8px;
2747
+ height: 8px;
2748
+ border-radius: 50%;
2749
+ background: transparent;
2750
+ transition: background-color 120ms ease;
2751
+ }
2752
+
2753
+ .malix-radio[data-checked="true"] .malix-radio__dot {
2754
+ background: var(--malix-cta-primary-bg);
2755
+ }
2756
+
2757
+ .malix-radio[data-disabled="true"] {
2758
+ opacity: 0.5;
2759
+ cursor: not-allowed;
2760
+ }
2761
+
2762
+ .malix-radio-row {
2763
+ display: inline-flex;
2764
+ align-items: center;
2765
+ gap: 8px;
2766
+ cursor: pointer;
2767
+ font-family: var(--malix-font-body);
2768
+ }
2769
+
2770
+ .malix-radio-row__label {
2771
+ font-size: var(--malix-text-sm);
2772
+ font-weight: var(--malix-weight-normal);
2773
+ color: var(--malix-foreground);
2774
+ line-height: 1;
2775
+ }
2776
+
2777
+ /* ═══════════════════════════════════════════════
2778
+ SEGMENTED CONTROL
2779
+ tab-like toggle group
2780
+ ═══════════════════════════════════════════════ */
2781
+
2782
+ .malix-segmented-control {
2783
+ display: inline-flex;
2784
+ align-items: center;
2785
+ gap: 2px;
2786
+ padding: 4px;
2787
+ background: var(--malix-surface-secondary);
2788
+ border: 1px solid var(--malix-border);
2789
+ border-radius: var(--malix-radius-lg);
2790
+ font-family: var(--malix-font-body);
2791
+ }
2792
+
2793
+ .malix-segmented-control__item {
2794
+ display: inline-flex;
2795
+ align-items: center;
2796
+ justify-content: center;
2797
+ padding: 6px 16px;
2798
+ border: none;
2799
+ background: transparent;
2800
+ border-radius: var(--malix-radius-md);
2801
+ font-family: var(--malix-font-body);
2802
+ font-size: var(--malix-text-sm);
2803
+ font-weight: var(--malix-weight-medium);
2804
+ color: var(--malix-foreground-secondary);
2805
+ cursor: pointer;
2806
+ transition: background-color 120ms ease, color 120ms ease, box-shadow 120ms ease;
2807
+ line-height: 1;
2808
+ }
2809
+
2810
+ .malix-segmented-control__item:hover {
2811
+ color: var(--malix-foreground);
2812
+ }
2813
+
2814
+ .malix-segmented-control__item[data-active] {
2815
+ background: var(--malix-surface);
2816
+ color: var(--malix-foreground);
2817
+ box-shadow: var(--malix-shadow-card-l1);
2818
+ }
2819
+
2820
+ /* ═══════════════════════════════════════════════
2821
+ SELECT
2822
+ styled native select wrapper with chevron
2823
+ ═══════════════════════════════════════════════ */
2824
+
2825
+ .malix-select {
2826
+ display: inline-flex;
2827
+ align-items: center;
2828
+ position: relative;
2829
+ min-width: 160px;
2830
+ font-family: var(--malix-font-body);
2831
+ }
2832
+
2833
+ .malix-select__native {
2834
+ appearance: none;
2835
+ width: 100%;
2836
+ padding: 10px 36px 10px 14px;
2837
+ background: var(--malix-surface);
2838
+ border: 1px solid var(--malix-border);
2839
+ border-radius: var(--malix-radius-md);
2840
+ font-family: var(--malix-font-body);
2841
+ font-size: var(--malix-text-base);
2842
+ font-weight: var(--malix-weight-normal);
2843
+ color: var(--malix-foreground);
2844
+ cursor: pointer;
2845
+ box-shadow: var(--malix-shadow-input);
2846
+ transition: border-color 120ms ease;
2847
+ line-height: 1.2;
2848
+ }
2849
+
2850
+ .malix-select__native:hover {
2851
+ border-color: var(--malix-border-strong);
2852
+ }
2853
+
2854
+ .malix-select__native:focus {
2855
+ outline: 2px solid var(--malix-border-focus);
2856
+ outline-offset: 2px;
2857
+ }
2858
+
2859
+ .malix-select__icon {
2860
+ position: absolute;
2861
+ right: 12px;
2862
+ top: 50%;
2863
+ transform: translateY(-50%);
2864
+ display: inline-flex;
2865
+ align-items: center;
2866
+ justify-content: center;
2867
+ color: var(--malix-foreground-tertiary);
2868
+ pointer-events: none;
2869
+ }
2870
+
2871
+ .malix-select__icon > svg {
2872
+ width: 16px;
2873
+ height: 16px;
2874
+ }
2875
+
2876
+ .malix-select[data-disabled] .malix-select__native {
2877
+ opacity: 0.5;
2878
+ cursor: not-allowed;
2879
+ }
2880
+
2881
+ /* ═══════════════════════════════════════════════
2882
+ SELECT GROUP
2883
+ label + select + helper wrapper
2884
+ ═══════════════════════════════════════════════ */
2885
+
2886
+ .malix-select-group {
2887
+ display: flex;
2888
+ flex-direction: column;
2889
+ gap: 6px;
2890
+ font-family: var(--malix-font-body);
2891
+ }
2892
+
2893
+ .malix-select-group__label {
2894
+ font-size: var(--malix-text-sm);
2895
+ font-weight: var(--malix-weight-medium);
2896
+ color: var(--malix-foreground);
2897
+ line-height: 1;
2898
+ }
2899
+
2900
+ .malix-select-group__helper {
2901
+ font-size: var(--malix-text-xs);
2902
+ font-weight: var(--malix-weight-normal);
2903
+ color: var(--malix-foreground-secondary);
2904
+ line-height: 1;
2905
+ }
2906
+
2907
+ .malix-select-group[data-error] .malix-select-group__helper {
2908
+ color: var(--malix-error-foreground);
2909
+ }
2910
+
2911
+ .malix-select-group[data-error] .malix-select__native {
2912
+ border-color: var(--malix-error);
2913
+ }
2914
+
2915
+ /* ═══════════════════════════════════════════════
2916
+ SPLIT PANE
2917
+ resizable two-panel layout with drag handle
2918
+ ═══════════════════════════════════════════════ */
2919
+
2920
+ .malix-split-pane {
2921
+ display: flex;
2922
+ align-items: stretch;
2923
+ width: 100%;
2924
+ height: 300px;
2925
+ border: 1px solid var(--malix-border);
2926
+ border-radius: var(--malix-radius-lg);
2927
+ overflow: hidden;
2928
+ background: var(--malix-surface);
2929
+ font-family: var(--malix-font-body);
2930
+ }
2931
+
2932
+ .malix-split-pane__left,
2933
+ .malix-split-pane__right {
2934
+ display: flex;
2935
+ flex-direction: column;
2936
+ overflow: auto;
2937
+ padding: 16px;
2938
+ }
2939
+
2940
+ .malix-split-pane__panel-title {
2941
+ font-size: var(--malix-text-xs);
2942
+ font-weight: var(--malix-weight-semibold);
2943
+ color: var(--malix-foreground-secondary);
2944
+ text-transform: uppercase;
2945
+ letter-spacing: 0.5px;
2946
+ margin-bottom: 12px;
2947
+ line-height: 1;
2948
+ }
2949
+
2950
+ .malix-split-pane__handle {
2951
+ display: flex;
2952
+ flex-direction: column;
2953
+ align-items: center;
2954
+ justify-content: center;
2955
+ gap: 3px;
2956
+ width: 12px;
2957
+ background: var(--malix-surface-secondary);
2958
+ border-left: 1px solid var(--malix-border);
2959
+ border-right: 1px solid var(--malix-border);
2960
+ cursor: col-resize;
2961
+ flex-shrink: 0;
2962
+ transition: background-color 120ms ease;
2963
+ }
2964
+
2965
+ .malix-split-pane__handle:hover {
2966
+ background: var(--malix-surface-hover);
2967
+ }
2968
+
2969
+ .malix-split-pane__handle-dot {
2970
+ width: 3px;
2971
+ height: 3px;
2972
+ border-radius: 50%;
2973
+ background: var(--malix-foreground-tertiary);
2974
+ }
2975
+
2976
+ /* ═══════════════════════════════════════════════
2977
+ STATUS DOT
2978
+ semantic dot with label
2979
+ ═══════════════════════════════════════════════ */
2980
+
2981
+ .malix-status-dot {
2982
+ display: inline-flex;
2983
+ align-items: center;
2984
+ gap: 8px;
2985
+ font-family: var(--malix-font-body);
2986
+ }
2987
+
2988
+ .malix-status-dot__dot {
2989
+ width: 8px;
2990
+ height: 8px;
2991
+ border-radius: 50%;
2992
+ flex-shrink: 0;
2993
+ }
2994
+
2995
+ .malix-status-dot__label {
2996
+ font-size: var(--malix-text-sm);
2997
+ font-weight: var(--malix-weight-medium);
2998
+ color: var(--malix-foreground);
2999
+ line-height: 1;
3000
+ }
3001
+
3002
+ .malix-status-dot[data-variant="default"] .malix-status-dot__dot {
3003
+ background: var(--malix-foreground-tertiary);
3004
+ }
3005
+
3006
+ .malix-status-dot[data-variant="success"] .malix-status-dot__dot {
3007
+ background: var(--malix-success);
3008
+ }
3009
+
3010
+ .malix-status-dot[data-variant="warning"] .malix-status-dot__dot {
3011
+ background: var(--malix-warning);
3012
+ }
3013
+
3014
+ .malix-status-dot[data-variant="error"] .malix-status-dot__dot {
3015
+ background: var(--malix-error);
3016
+ }
3017
+
3018
+ /* ═══════════════════════════════════════════════
3019
+ TOGGLE
3020
+ sliding switch with knob
3021
+ ═══════════════════════════════════════════════ */
3022
+
3023
+ .malix-toggle {
3024
+ display: inline-flex;
3025
+ align-items: center;
3026
+ width: 40px;
3027
+ height: 22px;
3028
+ padding: 2px;
3029
+ border-radius: var(--malix-radius-pill);
3030
+ border: none;
3031
+ background: var(--malix-border-strong);
3032
+ cursor: pointer;
3033
+ transition: background-color 200ms ease;
3034
+ flex-shrink: 0;
3035
+ }
3036
+
3037
+ .malix-toggle:focus-visible {
3038
+ outline: 2px solid var(--malix-border-focus);
3039
+ outline-offset: 2px;
3040
+ }
3041
+
3042
+ .malix-toggle[data-checked="true"] {
3043
+ background: var(--malix-cta-primary-bg);
3044
+ }
3045
+
3046
+ .malix-toggle__knob {
3047
+ width: 18px;
3048
+ height: 18px;
3049
+ border-radius: 50%;
3050
+ background: var(--malix-primary-foreground);
3051
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
3052
+ transition: transform 200ms ease;
3053
+ }
3054
+
3055
+ .malix-toggle[data-checked="true"] .malix-toggle__knob {
3056
+ transform: translateX(18px);
3057
+ }
3058
+
3059
+ .malix-toggle[data-disabled="true"] {
3060
+ opacity: 0.5;
3061
+ cursor: not-allowed;
3062
+ }
3063
+
3064
+ .malix-toggle-row {
3065
+ display: flex;
3066
+ align-items: center;
3067
+ justify-content: space-between;
3068
+ gap: 12px;
3069
+ font-family: var(--malix-font-body);
3070
+ }
3071
+
3072
+ .malix-toggle-row__label {
3073
+ font-size: var(--malix-text-sm);
3074
+ font-weight: var(--malix-weight-normal);
3075
+ color: var(--malix-foreground);
3076
+ line-height: 1;
3077
+ }
3078
+
3079
+ /* ═══════════════════════════════════════════════
3080
+ USER PROFILE POPOVER
3081
+ user info, credits, menu items, logout
3082
+ ═══════════════════════════════════════════════ */
3083
+
3084
+ .malix-user-profile {
3085
+ display: flex;
3086
+ flex-direction: column;
3087
+ width: 280px;
3088
+ background: var(--malix-surface);
3089
+ border: 1px solid var(--malix-border);
3090
+ border-radius: var(--malix-radius-lg);
3091
+ box-shadow: var(--malix-shadow-card-l2);
3092
+ overflow: hidden;
3093
+ font-family: var(--malix-font-body);
3094
+ }
3095
+
3096
+ .malix-user-profile__header {
3097
+ display: flex;
3098
+ align-items: center;
3099
+ gap: 12px;
3100
+ padding: 16px;
3101
+ }
3102
+
3103
+ .malix-user-profile__avatar {
3104
+ display: inline-flex;
3105
+ align-items: center;
3106
+ justify-content: center;
3107
+ flex-shrink: 0;
3108
+ }
3109
+
3110
+ .malix-user-profile__info {
3111
+ display: flex;
3112
+ flex-direction: column;
3113
+ gap: 2px;
3114
+ min-width: 0;
3115
+ }
3116
+
3117
+ .malix-user-profile__name {
3118
+ font-size: var(--malix-text-base);
3119
+ font-weight: var(--malix-weight-semibold);
3120
+ color: var(--malix-foreground);
3121
+ line-height: 1.3;
3122
+ overflow: hidden;
3123
+ text-overflow: ellipsis;
3124
+ white-space: nowrap;
3125
+ }
3126
+
3127
+ .malix-user-profile__email {
3128
+ font-size: var(--malix-text-sm);
3129
+ font-weight: var(--malix-weight-normal);
3130
+ color: var(--malix-foreground-secondary);
3131
+ line-height: 1.3;
3132
+ overflow: hidden;
3133
+ text-overflow: ellipsis;
3134
+ white-space: nowrap;
3135
+ }
3136
+
3137
+ .malix-user-profile__credits {
3138
+ display: flex;
3139
+ align-items: center;
3140
+ justify-content: space-between;
3141
+ padding: 10px 16px;
3142
+ background: var(--malix-surface-secondary);
3143
+ }
3144
+
3145
+ .malix-user-profile__credits-label {
3146
+ font-size: var(--malix-text-sm);
3147
+ font-weight: var(--malix-weight-normal);
3148
+ color: var(--malix-foreground-secondary);
3149
+ line-height: 1;
3150
+ }
3151
+
3152
+ .malix-user-profile__credits-value {
3153
+ font-size: var(--malix-text-sm);
3154
+ font-weight: var(--malix-weight-semibold);
3155
+ color: var(--malix-foreground);
3156
+ line-height: 1;
3157
+ }
3158
+
3159
+ .malix-user-profile__divider {
3160
+ border: none;
3161
+ height: 1px;
3162
+ background: var(--malix-border);
3163
+ margin: 0;
3164
+ }
3165
+
3166
+ .malix-user-profile__menu {
3167
+ display: flex;
3168
+ flex-direction: column;
3169
+ padding: 4px 0;
3170
+ }
3171
+
3172
+ .malix-user-profile__menu-item {
3173
+ display: flex;
3174
+ align-items: center;
3175
+ gap: 10px;
3176
+ padding: 8px 16px;
3177
+ border: none;
3178
+ background: none;
3179
+ cursor: pointer;
3180
+ font-family: var(--malix-font-body);
3181
+ font-size: var(--malix-text-sm);
3182
+ font-weight: var(--malix-weight-normal);
3183
+ color: var(--malix-foreground);
3184
+ text-align: left;
3185
+ width: 100%;
3186
+ transition: background-color 120ms ease;
3187
+ }
3188
+
3189
+ .malix-user-profile__menu-item:hover {
3190
+ background: var(--malix-surface-secondary);
3191
+ }
3192
+
3193
+ .malix-user-profile__menu-item-icon {
3194
+ display: inline-flex;
3195
+ align-items: center;
3196
+ justify-content: center;
3197
+ width: 16px;
3198
+ height: 16px;
3199
+ color: var(--malix-foreground-secondary);
3200
+ flex-shrink: 0;
3201
+ }
3202
+
3203
+ .malix-user-profile__menu-item-icon > svg {
3204
+ width: 16px;
3205
+ height: 16px;
3206
+ }
3207
+
3208
+ .malix-user-profile__menu-item-label {
3209
+ line-height: 1;
3210
+ }
3211
+
3212
+ .malix-user-profile__logout {
3213
+ display: flex;
3214
+ align-items: center;
3215
+ gap: 10px;
3216
+ padding: 8px 16px;
3217
+ border: none;
3218
+ background: none;
3219
+ cursor: pointer;
3220
+ font-family: var(--malix-font-body);
3221
+ font-size: var(--malix-text-sm);
3222
+ font-weight: var(--malix-weight-medium);
3223
+ color: var(--malix-error);
3224
+ text-align: left;
3225
+ width: 100%;
3226
+ transition: background-color 120ms ease;
3227
+ }
3228
+
3229
+ .malix-user-profile__logout:hover {
3230
+ background: var(--malix-error-light);
3231
+ }
3232
+
3233
+ .malix-user-profile__logout > svg {
3234
+ width: 16px;
3235
+ height: 16px;
3236
+ flex-shrink: 0;
3237
+ }