@mercury-fx/ui 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/components/actions/Button/Button.d.ts +17 -0
  4. package/dist/components/actions/Button/index.d.ts +1 -0
  5. package/dist/components/actions/IconButton/IconButton.d.ts +24 -0
  6. package/dist/components/actions/IconButton/index.d.ts +1 -0
  7. package/dist/components/actions/Link/Link.d.ts +26 -0
  8. package/dist/components/actions/Link/index.d.ts +1 -0
  9. package/dist/components/data-display/Avatar/Avatar.d.ts +8 -0
  10. package/dist/components/data-display/Avatar/index.d.ts +1 -0
  11. package/dist/components/data-display/Badge/Badge.d.ts +8 -0
  12. package/dist/components/data-display/Badge/index.d.ts +1 -0
  13. package/dist/components/data-display/Blockquote/Blockquote.d.ts +18 -0
  14. package/dist/components/data-display/Blockquote/index.d.ts +1 -0
  15. package/dist/components/data-display/Card/Card.d.ts +9 -0
  16. package/dist/components/data-display/Card/index.d.ts +1 -0
  17. package/dist/components/data-display/Chart/Chart.d.ts +41 -0
  18. package/dist/components/data-display/Chart/index.d.ts +1 -0
  19. package/dist/components/data-display/Checklist/Checklist.d.ts +14 -0
  20. package/dist/components/data-display/Checklist/index.d.ts +1 -0
  21. package/dist/components/data-display/Chip/Chip.d.ts +13 -0
  22. package/dist/components/data-display/Chip/index.d.ts +1 -0
  23. package/dist/components/data-display/Code/Code.d.ts +22 -0
  24. package/dist/components/data-display/Code/index.d.ts +1 -0
  25. package/dist/components/data-display/DataList/DataList.d.ts +27 -0
  26. package/dist/components/data-display/DataList/index.d.ts +1 -0
  27. package/dist/components/data-display/Kbd/Kbd.d.ts +14 -0
  28. package/dist/components/data-display/Kbd/index.d.ts +1 -0
  29. package/dist/components/data-display/ListRow/ListRow.d.ts +16 -0
  30. package/dist/components/data-display/ListRow/index.d.ts +1 -0
  31. package/dist/components/data-display/Stat/Stat.d.ts +16 -0
  32. package/dist/components/data-display/Stat/index.d.ts +1 -0
  33. package/dist/components/data-display/Table/Table.d.ts +14 -0
  34. package/dist/components/data-display/Table/index.d.ts +1 -0
  35. package/dist/components/data-display/Tag/Tag.d.ts +9 -0
  36. package/dist/components/data-display/Tag/index.d.ts +1 -0
  37. package/dist/components/feedback/Alert/Alert.d.ts +11 -0
  38. package/dist/components/feedback/Alert/index.d.ts +1 -0
  39. package/dist/components/feedback/Callout/Callout.d.ts +26 -0
  40. package/dist/components/feedback/Callout/index.d.ts +1 -0
  41. package/dist/components/feedback/PasswordStrength/PasswordStrength.d.ts +13 -0
  42. package/dist/components/feedback/PasswordStrength/index.d.ts +1 -0
  43. package/dist/components/feedback/Progress/Progress.d.ts +9 -0
  44. package/dist/components/feedback/Progress/index.d.ts +1 -0
  45. package/dist/components/feedback/Skeleton/Skeleton.d.ts +19 -0
  46. package/dist/components/feedback/Skeleton/index.d.ts +1 -0
  47. package/dist/components/feedback/Spinner/Spinner.d.ts +18 -0
  48. package/dist/components/feedback/Spinner/index.d.ts +1 -0
  49. package/dist/components/foundations/Divider/Divider.d.ts +11 -0
  50. package/dist/components/foundations/Divider/index.d.ts +1 -0
  51. package/dist/components/foundations/Heading/Heading.d.ts +26 -0
  52. package/dist/components/foundations/Heading/index.d.ts +1 -0
  53. package/dist/components/foundations/Icon/Icon.d.ts +9 -0
  54. package/dist/components/foundations/Icon/index.d.ts +1 -0
  55. package/dist/components/foundations/Separator/Separator.d.ts +20 -0
  56. package/dist/components/foundations/Separator/index.d.ts +1 -0
  57. package/dist/components/foundations/Text/Text.d.ts +19 -0
  58. package/dist/components/foundations/Text/index.d.ts +1 -0
  59. package/dist/components/inputs/AuthCode/AuthCode.d.ts +10 -0
  60. package/dist/components/inputs/AuthCode/index.d.ts +1 -0
  61. package/dist/components/inputs/Calendar/Calendar.d.ts +24 -0
  62. package/dist/components/inputs/Calendar/index.d.ts +1 -0
  63. package/dist/components/inputs/DateField/DateField.d.ts +25 -0
  64. package/dist/components/inputs/DateField/index.d.ts +1 -0
  65. package/dist/components/inputs/Input/Input.d.ts +9 -0
  66. package/dist/components/inputs/Input/index.d.ts +1 -0
  67. package/dist/components/inputs/Label/Label.d.ts +20 -0
  68. package/dist/components/inputs/Label/index.d.ts +1 -0
  69. package/dist/components/inputs/MoneyInput/MoneyInput.d.ts +12 -0
  70. package/dist/components/inputs/MoneyInput/index.d.ts +1 -0
  71. package/dist/components/inputs/Search/Search.d.ts +7 -0
  72. package/dist/components/inputs/Search/index.d.ts +1 -0
  73. package/dist/components/inputs/Select/Select.d.ts +14 -0
  74. package/dist/components/inputs/Select/index.d.ts +1 -0
  75. package/dist/components/inputs/Textarea/Textarea.d.ts +9 -0
  76. package/dist/components/inputs/Textarea/index.d.ts +1 -0
  77. package/dist/components/layout/AspectRatio/AspectRatio.d.ts +14 -0
  78. package/dist/components/layout/AspectRatio/index.d.ts +1 -0
  79. package/dist/components/layout/AuthLayout/AuthLayout.d.ts +30 -0
  80. package/dist/components/layout/AuthLayout/index.d.ts +1 -0
  81. package/dist/components/layout/Box/Box.d.ts +35 -0
  82. package/dist/components/layout/Box/index.d.ts +1 -0
  83. package/dist/components/layout/Center/Center.d.ts +13 -0
  84. package/dist/components/layout/Center/index.d.ts +1 -0
  85. package/dist/components/layout/Cluster/Cluster.d.ts +18 -0
  86. package/dist/components/layout/Cluster/index.d.ts +1 -0
  87. package/dist/components/layout/Collapsible/Collapsible.d.ts +26 -0
  88. package/dist/components/layout/Collapsible/index.d.ts +1 -0
  89. package/dist/components/layout/Container/Container.d.ts +19 -0
  90. package/dist/components/layout/Container/index.d.ts +1 -0
  91. package/dist/components/layout/Flex/Flex.d.ts +24 -0
  92. package/dist/components/layout/Flex/index.d.ts +1 -0
  93. package/dist/components/layout/Grid/Grid.d.ts +26 -0
  94. package/dist/components/layout/Grid/index.d.ts +1 -0
  95. package/dist/components/layout/GridItem/GridItem.d.ts +19 -0
  96. package/dist/components/layout/GridItem/index.d.ts +1 -0
  97. package/dist/components/layout/ScrollArea/ScrollArea.d.ts +22 -0
  98. package/dist/components/layout/ScrollArea/index.d.ts +1 -0
  99. package/dist/components/layout/Section/Section.d.ts +18 -0
  100. package/dist/components/layout/Section/index.d.ts +1 -0
  101. package/dist/components/layout/Sidebar/Sidebar.d.ts +21 -0
  102. package/dist/components/layout/Sidebar/index.d.ts +1 -0
  103. package/dist/components/layout/Spacer/Spacer.d.ts +15 -0
  104. package/dist/components/layout/Spacer/index.d.ts +1 -0
  105. package/dist/components/layout/Stack/Stack.d.ts +20 -0
  106. package/dist/components/layout/Stack/index.d.ts +1 -0
  107. package/dist/components/layout/scales.d.ts +20 -0
  108. package/dist/components/navigation/Accordion/Accordion.d.ts +17 -0
  109. package/dist/components/navigation/Accordion/index.d.ts +1 -0
  110. package/dist/components/navigation/Menubar/Menubar.d.ts +53 -0
  111. package/dist/components/navigation/Menubar/index.d.ts +1 -0
  112. package/dist/components/navigation/Pagination/Pagination.d.ts +14 -0
  113. package/dist/components/navigation/Pagination/index.d.ts +1 -0
  114. package/dist/components/navigation/TabNav/TabNav.d.ts +38 -0
  115. package/dist/components/navigation/TabNav/index.d.ts +1 -0
  116. package/dist/components/navigation/Tabs/Tabs.d.ts +12 -0
  117. package/dist/components/navigation/Tabs/index.d.ts +1 -0
  118. package/dist/components/overlay/AlertDialog/AlertDialog.d.ts +33 -0
  119. package/dist/components/overlay/AlertDialog/index.d.ts +1 -0
  120. package/dist/components/overlay/ContextMenu/ContextMenu.d.ts +40 -0
  121. package/dist/components/overlay/ContextMenu/index.d.ts +1 -0
  122. package/dist/components/overlay/Dialog/Dialog.d.ts +33 -0
  123. package/dist/components/overlay/Dialog/index.d.ts +1 -0
  124. package/dist/components/overlay/Dropdown/Dropdown.d.ts +48 -0
  125. package/dist/components/overlay/Dropdown/index.d.ts +1 -0
  126. package/dist/components/overlay/HoverCard/HoverCard.d.ts +35 -0
  127. package/dist/components/overlay/HoverCard/index.d.ts +1 -0
  128. package/dist/components/overlay/LinkPreview/LinkPreview.d.ts +33 -0
  129. package/dist/components/overlay/LinkPreview/index.d.ts +1 -0
  130. package/dist/components/overlay/Modal/Modal.d.ts +10 -0
  131. package/dist/components/overlay/Modal/index.d.ts +1 -0
  132. package/dist/components/overlay/Popover/Popover.d.ts +35 -0
  133. package/dist/components/overlay/Popover/index.d.ts +1 -0
  134. package/dist/components/overlay/Tooltip/Tooltip.d.ts +6 -0
  135. package/dist/components/overlay/Tooltip/index.d.ts +1 -0
  136. package/dist/components/overlay/_overlay/Portal.d.ts +14 -0
  137. package/dist/components/selection/Checkbox/Checkbox.d.ts +12 -0
  138. package/dist/components/selection/Checkbox/index.d.ts +1 -0
  139. package/dist/components/selection/CheckboxCards/CheckboxCards.d.ts +20 -0
  140. package/dist/components/selection/CheckboxCards/index.d.ts +1 -0
  141. package/dist/components/selection/CheckboxGroup/CheckboxGroup.d.ts +17 -0
  142. package/dist/components/selection/CheckboxGroup/index.d.ts +1 -0
  143. package/dist/components/selection/Radio/Radio.d.ts +11 -0
  144. package/dist/components/selection/Radio/index.d.ts +1 -0
  145. package/dist/components/selection/RadioCards/RadioCards.d.ts +20 -0
  146. package/dist/components/selection/RadioCards/index.d.ts +1 -0
  147. package/dist/components/selection/RadioGroup/RadioGroup.d.ts +18 -0
  148. package/dist/components/selection/RadioGroup/index.d.ts +1 -0
  149. package/dist/components/selection/Segmented/Segmented.d.ts +13 -0
  150. package/dist/components/selection/Segmented/index.d.ts +1 -0
  151. package/dist/components/selection/Slider/Slider.d.ts +13 -0
  152. package/dist/components/selection/Slider/index.d.ts +1 -0
  153. package/dist/components/selection/Switch/Switch.d.ts +10 -0
  154. package/dist/components/selection/Switch/index.d.ts +1 -0
  155. package/dist/components/selection/Toggle/Toggle.d.ts +36 -0
  156. package/dist/components/selection/Toggle/index.d.ts +1 -0
  157. package/dist/index.d.ts +93 -0
  158. package/dist/mercury-ui.css +1 -0
  159. package/dist/mercury-ui.js +4049 -0
  160. package/package.json +58 -0
  161. package/src/styles/additions.css +1030 -0
  162. package/src/styles/fonts/DMMono-Italic.woff2 +0 -0
  163. package/src/styles/fonts/DMMono-Light.woff2 +0 -0
  164. package/src/styles/fonts/DMMono-LightItalic.woff2 +0 -0
  165. package/src/styles/fonts/DMMono-Medium.woff2 +0 -0
  166. package/src/styles/fonts/DMMono-MediumItalic.woff2 +0 -0
  167. package/src/styles/fonts/DMMono-Regular.woff2 +0 -0
  168. package/src/styles/fonts/DMSans-Bold.woff2 +0 -0
  169. package/src/styles/fonts/DMSans-BoldItalic.woff2 +0 -0
  170. package/src/styles/fonts/DMSans-Italic.woff2 +0 -0
  171. package/src/styles/fonts/DMSans-Medium.woff2 +0 -0
  172. package/src/styles/fonts/DMSans-MediumItalic.woff2 +0 -0
  173. package/src/styles/fonts/DMSans-Regular.woff2 +0 -0
  174. package/src/styles/fonts/DMSerifDisplay-Italic.woff2 +0 -0
  175. package/src/styles/fonts/DMSerifDisplay-Regular.woff2 +0 -0
  176. package/src/styles/index.css +5 -0
  177. package/src/styles/layout.css +55 -0
  178. package/src/styles/mercury.css +676 -0
  179. package/src/styles/tokens.css +438 -0
@@ -0,0 +1,676 @@
1
+ /*
2
+ Mercury Design System — Component layer.
3
+ Companion to tokens.css. Every rule reads the semantic tokens defined there
4
+ (rgb(var(--token))) so components respond to .dark-theme / .light-theme.
5
+
6
+ Class names mirror the Mercury component library 1:1 (.mx-btn, .mx-in, …),
7
+ so React/HTML markup maps directly onto the Svelte sources.
8
+ */
9
+
10
+ /* ============================================================
11
+ BUTTON .mx-btn
12
+ ============================================================ */
13
+ .mx-btn {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ gap: 8px;
18
+ border-radius: var(--radius-8);
19
+ border: 1px solid transparent;
20
+ font-family: var(--font-primary);
21
+ font-weight: 600;
22
+ letter-spacing: -0.005em;
23
+ cursor: pointer;
24
+ transition: background 120ms ease, border-color 120ms ease, color 120ms ease, box-shadow 120ms ease, transform 80ms ease;
25
+ white-space: nowrap;
26
+ }
27
+ .mx-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px rgb(var(--ring-focus)); }
28
+ .mx-btn:active:not(:disabled) { transform: scale(0.98); }
29
+ .mx-btn.is-full { width: 100%; }
30
+
31
+ .mx-btn--sm { height: 32px; padding: 0 14px; font-size: 13px; border-radius: var(--radius-6); }
32
+ .mx-btn--md { height: 40px; padding: 0 18px; font-size: 14px; }
33
+ .mx-btn--lg { height: 48px; padding: 0 22px; font-size: 15px; border-radius: var(--radius-12); }
34
+
35
+ .mx-btn--primary { background: rgb(var(--bg-brand)); color: rgb(var(--fg-on-brand)); }
36
+ .mx-btn--primary:hover:not(:disabled) { background: rgb(var(--bg-brand-hover)); }
37
+ .mx-btn--primary:active:not(:disabled) { background: rgb(var(--bg-brand-pressed)); }
38
+
39
+ .mx-btn--secondary { background: rgb(var(--bg-secondary)); color: rgb(var(--fg-primary)); border-color: rgb(var(--border-primary)); }
40
+ .mx-btn--secondary:hover:not(:disabled) { background: rgb(var(--bg-tertiary)); }
41
+
42
+ .mx-btn--ghost { background: transparent; color: rgb(var(--fg-primary)); }
43
+ .mx-btn--ghost:hover:not(:disabled) { background: rgb(var(--bg-hover)); }
44
+ .mx-btn--ghost:active:not(:disabled) { background: rgb(var(--bg-pressed)); }
45
+
46
+ .mx-btn--danger { background: rgb(var(--bg-negative)); color: rgb(var(--fg-on-negative)); }
47
+ .mx-btn--danger:hover:not(:disabled) { filter: brightness(0.94); }
48
+
49
+ .mx-btn:disabled { opacity: 0.45; cursor: not-allowed; }
50
+ .mx-btn__icon { display: inline-flex; align-items: center; }
51
+ .mx-btn__icon--trail { margin-left: -2px; }
52
+ .mx-btn__spin {
53
+ width: 14px; height: 14px; border-radius: 50%;
54
+ border: 2px solid currentColor; border-top-color: transparent;
55
+ animation: mx-spin 0.7s linear infinite;
56
+ }
57
+ @keyframes mx-spin { to { transform: rotate(360deg); } }
58
+
59
+ /* ============================================================
60
+ INPUT .mx-in
61
+ ============================================================ */
62
+ .mx-in { display: flex; flex-direction: column; gap: 6px; font-family: var(--font-primary); width: 100%; max-width: 320px; }
63
+ .mx-in__lbl { font-size: 13px; font-weight: 500; color: rgb(var(--fg-secondary)); }
64
+ .mx-in__req { color: rgb(var(--fg-negative)); }
65
+ .mx-in__field {
66
+ display: inline-flex; align-items: center; height: 40px;
67
+ border-radius: var(--radius-8);
68
+ background: rgb(var(--bg-primary));
69
+ box-shadow: inset 0 0 0 1px rgb(var(--border-primary));
70
+ transition: box-shadow 140ms ease;
71
+ }
72
+ .mx-in__field:focus-within { box-shadow: inset 0 0 0 2px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
73
+ .mx-in--err .mx-in__field { box-shadow: inset 0 0 0 2px rgb(var(--border-negative)); }
74
+ .mx-in--err .mx-in__field:focus-within { box-shadow: inset 0 0 0 2px rgb(var(--border-negative)), 0 0 0 3px rgb(var(--ring-negative)); }
75
+ .mx-in--dis .mx-in__field { background: rgb(var(--bg-disabled)); opacity: 0.7; }
76
+ .mx-in__inp {
77
+ flex: 1; min-width: 0; height: 100%; padding: 0 14px;
78
+ border: 0; outline: 0; background: transparent;
79
+ color: rgb(var(--fg-primary)); font: 500 14px/1 var(--font-primary);
80
+ }
81
+ .mx-in__inp::placeholder { color: rgb(var(--fg-tertiary)); }
82
+ .mx-in__inp:disabled { cursor: not-allowed; }
83
+ .mx-in__aff { display: inline-flex; align-items: center; color: rgb(var(--fg-tertiary)); font-size: 14px; }
84
+ .mx-in__aff--lead { padding-left: 12px; }
85
+ .mx-in__aff--trail { padding-right: 12px; }
86
+ .mx-in__msg { font-size: 12px; color: rgb(var(--fg-secondary)); }
87
+ .mx-in__msg--err { color: rgb(var(--fg-negative)); }
88
+
89
+ /* ============================================================
90
+ TEXTAREA .mx-ta
91
+ ============================================================ */
92
+ .mx-ta { display: flex; flex-direction: column; gap: 6px; font-family: var(--font-primary); width: 100%; max-width: 480px; }
93
+ .mx-ta__lbl { font-size: 13px; font-weight: 500; color: rgb(var(--fg-secondary)); }
94
+ .mx-ta__req { color: rgb(var(--fg-negative)); }
95
+ .mx-ta__field {
96
+ border-radius: var(--radius-8);
97
+ background: rgb(var(--bg-primary));
98
+ box-shadow: inset 0 0 0 1px rgb(var(--border-primary));
99
+ transition: box-shadow 140ms ease;
100
+ }
101
+ .mx-ta__field:focus-within { box-shadow: inset 0 0 0 2px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
102
+ .mx-ta--err .mx-ta__field { box-shadow: inset 0 0 0 2px rgb(var(--border-negative)); }
103
+ .mx-ta--dis .mx-ta__field { background: rgb(var(--bg-disabled)); opacity: 0.7; }
104
+ .mx-ta__inp {
105
+ display: block; width: 100%; padding: 12px 14px;
106
+ border: 0; outline: 0; background: transparent;
107
+ color: rgb(var(--fg-primary)); font: 400 14px/1.5 var(--font-primary); resize: none;
108
+ }
109
+ .mx-ta__field.is-resize .mx-ta__inp { resize: vertical; }
110
+ .mx-ta__inp::placeholder { color: rgb(var(--fg-tertiary)); }
111
+ .mx-ta__foot { display: flex; justify-content: space-between; font: 500 12px/1.4 var(--font-primary); color: rgb(var(--fg-secondary)); }
112
+ .mx-ta__msg--err { color: rgb(var(--fg-negative)); }
113
+ .mx-ta__count { font-family: var(--font-secondary); color: rgb(var(--fg-tertiary)); }
114
+ .mx-ta__count.is-over { color: rgb(var(--fg-negative)); }
115
+
116
+ /* ============================================================
117
+ SELECT .mx-sl
118
+ ============================================================ */
119
+ .mx-sl { display: flex; flex-direction: column; gap: 6px; font-family: var(--font-primary); width: 100%; max-width: 320px; }
120
+ .mx-sl__lbl { font-size: 13px; font-weight: 500; color: rgb(var(--fg-secondary)); }
121
+ .mx-sl__req { color: rgb(var(--fg-negative)); }
122
+ .mx-sl__field {
123
+ position: relative; height: 40px;
124
+ border-radius: var(--radius-8);
125
+ background: rgb(var(--bg-primary));
126
+ box-shadow: inset 0 0 0 1px rgb(var(--border-primary));
127
+ transition: box-shadow 140ms ease;
128
+ }
129
+ .mx-sl__field:focus-within { box-shadow: inset 0 0 0 2px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
130
+ .mx-sl--err .mx-sl__field { box-shadow: inset 0 0 0 2px rgb(var(--border-negative)); }
131
+ .mx-sl--dis .mx-sl__field { background: rgb(var(--bg-disabled)); opacity: 0.7; }
132
+ .mx-sl__sel {
133
+ width: 100%; height: 100%; padding: 0 40px 0 14px;
134
+ border: 0; outline: 0; background: transparent;
135
+ color: rgb(var(--fg-primary)); font: 500 14px/1 var(--font-primary);
136
+ appearance: none; -webkit-appearance: none; cursor: pointer;
137
+ }
138
+ .mx-sl__sel:disabled { cursor: not-allowed; }
139
+ .mx-sl__sel option { color: rgb(var(--fg-primary)); background: rgb(var(--bg-elevated)); }
140
+ .mx-sl__chev {
141
+ position: absolute; top: 50%; inset-inline-end: 14px;
142
+ transform: translateY(-75%) rotate(45deg);
143
+ width: 8px; height: 8px;
144
+ border-right: 2px solid rgb(var(--fg-secondary));
145
+ border-bottom: 2px solid rgb(var(--fg-secondary));
146
+ pointer-events: none;
147
+ }
148
+ .mx-sl__msg { font-size: 12px; color: rgb(var(--fg-secondary)); }
149
+ .mx-sl__msg--err { color: rgb(var(--fg-negative)); }
150
+
151
+ /* ============================================================
152
+ SEARCH .mx-sr
153
+ ============================================================ */
154
+ .mx-sr {
155
+ position: relative; display: inline-flex; align-items: center;
156
+ width: 100%; max-width: 320px; height: 40px; padding: 0 14px;
157
+ border-radius: var(--radius-8);
158
+ background: rgb(var(--bg-primary));
159
+ box-shadow: inset 0 0 0 1px rgb(var(--border-primary));
160
+ font-family: var(--font-primary); transition: box-shadow 140ms ease;
161
+ }
162
+ .mx-sr:focus-within { box-shadow: inset 0 0 0 2px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
163
+ .mx-sr--dis { opacity: 0.6; background: rgb(var(--bg-disabled)); }
164
+ .mx-sr__icon { color: rgb(var(--fg-tertiary)); display: inline-flex; margin-right: 10px; }
165
+ .mx-sr__inp {
166
+ flex: 1; min-width: 0; border: 0; outline: 0; background: transparent;
167
+ color: rgb(var(--fg-primary)); font: 500 14px/1 var(--font-primary);
168
+ }
169
+ .mx-sr__inp::placeholder { color: rgb(var(--fg-tertiary)); }
170
+ .mx-sr__inp::-webkit-search-cancel-button { display: none; }
171
+ .mx-sr__x {
172
+ width: 20px; height: 20px; margin-inline-start: 8px;
173
+ border: 0; background: rgb(var(--bg-tertiary)); color: rgb(var(--fg-secondary));
174
+ border-radius: 50%; cursor: pointer; font-size: 14px; line-height: 1;
175
+ display: inline-flex; align-items: center; justify-content: center;
176
+ }
177
+ .mx-sr__x:hover { background: rgb(var(--bg-hover)); color: rgb(var(--fg-primary)); }
178
+
179
+ /* ============================================================
180
+ CHECKBOX .mx-cb
181
+ ============================================================ */
182
+ .mx-cb {
183
+ display: inline-flex; align-items: center; gap: 8px;
184
+ font: 500 13px/1.4 var(--font-primary); color: rgb(var(--fg-primary));
185
+ cursor: pointer; user-select: none; position: relative;
186
+ }
187
+ .mx-cb input { position: absolute; inset: 0; opacity: 0; width: 0; height: 0; pointer-events: none; }
188
+ .mx-cb__box {
189
+ width: 16px; height: 16px; border-radius: var(--radius-4);
190
+ background: rgb(var(--bg-primary)); color: rgb(var(--fg-on-brand));
191
+ display: inline-flex; align-items: center; justify-content: center;
192
+ box-shadow: inset 0 0 0 1.5px rgb(var(--border-primary));
193
+ transition: box-shadow 120ms ease, background 120ms ease; flex-shrink: 0;
194
+ }
195
+ .mx-cb input:focus-visible ~ .mx-cb__box { box-shadow: inset 0 0 0 1.5px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
196
+ .mx-cb input:checked ~ .mx-cb__box,
197
+ .mx-cb input:indeterminate ~ .mx-cb__box { background: rgb(var(--bg-brand)); box-shadow: inset 0 0 0 1.5px rgb(var(--bg-brand)); }
198
+ .mx-cb--dis { opacity: 0.45; cursor: not-allowed; }
199
+ .mx-cb__lbl a { color: rgb(var(--fg-brand)); }
200
+
201
+ /* ============================================================
202
+ RADIO .mx-rd
203
+ ============================================================ */
204
+ .mx-rd {
205
+ display: inline-flex; align-items: center; gap: 8px;
206
+ font: 500 13px/1.4 var(--font-primary); color: rgb(var(--fg-primary));
207
+ cursor: pointer; user-select: none; position: relative;
208
+ }
209
+ .mx-rd input { position: absolute; inset: 0; opacity: 0; width: 0; height: 0; pointer-events: none; }
210
+ .mx-rd__ring {
211
+ width: 16px; height: 16px; border-radius: 50%;
212
+ background: rgb(var(--bg-primary));
213
+ box-shadow: inset 0 0 0 1.5px rgb(var(--border-primary));
214
+ display: inline-flex; align-items: center; justify-content: center;
215
+ transition: box-shadow 120ms ease; flex-shrink: 0;
216
+ }
217
+ .mx-rd__dot { width: 8px; height: 8px; border-radius: 50%; background: rgb(var(--bg-primary)); transform: scale(0); transition: transform 120ms ease; }
218
+ .mx-rd input:checked ~ .mx-rd__ring { box-shadow: inset 0 0 0 5px rgb(var(--bg-brand)); }
219
+ .mx-rd input:checked ~ .mx-rd__ring .mx-rd__dot { transform: scale(1); }
220
+ .mx-rd input:focus-visible ~ .mx-rd__ring { box-shadow: inset 0 0 0 1.5px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
221
+ .mx-rd input:checked:focus-visible ~ .mx-rd__ring { box-shadow: inset 0 0 0 5px rgb(var(--bg-brand)), 0 0 0 3px rgb(var(--ring-focus)); }
222
+ .mx-rd--dis { opacity: 0.45; cursor: not-allowed; }
223
+
224
+ /* ============================================================
225
+ SWITCH .mx-sw
226
+ ============================================================ */
227
+ .mx-sw {
228
+ display: inline-flex; align-items: center; gap: 10px;
229
+ font: 500 14px/1.4 var(--font-primary); color: rgb(var(--fg-primary));
230
+ cursor: pointer; user-select: none; position: relative;
231
+ }
232
+ .mx-sw input { position: absolute; inset: 0; opacity: 0; width: 0; height: 0; pointer-events: none; }
233
+ .mx-sw__track {
234
+ width: 38px; height: 22px; border-radius: var(--radius-full);
235
+ background: rgb(var(--bg-brand)); position: relative;
236
+ transition: background 140ms ease, box-shadow 140ms ease; flex-shrink: 0;
237
+ }
238
+ .mx-sw__thumb {
239
+ position: absolute; top: 2px; inset-inline-start: 18px;
240
+ width: 18px; height: 18px; border-radius: 50%;
241
+ background: rgb(var(--slate-1)); box-shadow: 0 1px 3px rgb(28 32 36 / 0.25);
242
+ transition: inset-inline-start 140ms ease;
243
+ }
244
+ .mx-sw--off .mx-sw__track { background: rgb(var(--slate-7)); }
245
+ .mx-sw--off .mx-sw__thumb { inset-inline-start: 2px; }
246
+ .mx-sw input:focus-visible ~ .mx-sw__track { box-shadow: 0 0 0 3px rgb(var(--ring-focus)); }
247
+ .mx-sw--dis { opacity: 0.45; cursor: not-allowed; }
248
+
249
+ /* ============================================================
250
+ SEGMENTED .mx-seg
251
+ ============================================================ */
252
+ .mx-seg {
253
+ display: inline-flex; padding: 3px; gap: 2px;
254
+ background: rgb(var(--bg-tertiary)); border-radius: var(--radius-8);
255
+ font-family: var(--font-primary);
256
+ }
257
+ .mx-seg.is-full { display: flex; width: 100%; }
258
+ .mx-seg.is-full .mx-seg__seg { flex: 1; }
259
+ .mx-seg__seg {
260
+ border: 0; background: transparent; cursor: pointer; border-radius: var(--radius-6);
261
+ color: rgb(var(--fg-secondary)); font: 500 13px/1 var(--font-primary);
262
+ transition: background 120ms ease, color 120ms ease, box-shadow 120ms ease; white-space: nowrap;
263
+ }
264
+ .mx-seg--sm .mx-seg__seg { padding: 5px 10px; font-size: 12px; }
265
+ .mx-seg--md .mx-seg__seg { padding: 7px 14px; }
266
+ .mx-seg--lg .mx-seg__seg { padding: 9px 18px; font-size: 14px; }
267
+ .mx-seg__seg:hover:not(:disabled) { color: rgb(var(--fg-primary)); }
268
+ .mx-seg__seg.is-active { background: rgb(var(--bg-primary)); color: rgb(var(--fg-primary)); box-shadow: var(--shadow-100); }
269
+ .mx-seg__seg:disabled { opacity: 0.4; cursor: not-allowed; }
270
+ .mx-seg__seg:focus-visible { outline: none; box-shadow: 0 0 0 2px rgb(var(--ring-focus)); }
271
+
272
+ /* ============================================================
273
+ SLIDER .mx-sd
274
+ ============================================================ */
275
+ .mx-sd { display: block; font-family: var(--font-primary); width: 100%; max-width: 320px; }
276
+ .mx-sd__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
277
+ .mx-sd__lbl { font: 500 13px/1 var(--font-primary); color: rgb(var(--fg-secondary)); }
278
+ .mx-sd__val { font: 500 13px/1 var(--font-secondary); color: rgb(var(--fg-primary)); }
279
+ .mx-sd__track { position: relative; height: 18px; display: flex; align-items: center; }
280
+ .mx-sd__track::before, .mx-sd__track::after {
281
+ content: ""; position: absolute; height: 4px; border-radius: var(--radius-full);
282
+ top: 50%; transform: translateY(-50%); pointer-events: none;
283
+ }
284
+ .mx-sd__track::before { inset-inline: 0; background: rgb(var(--bg-tertiary)); }
285
+ .mx-sd__track::after { inset-inline-start: 0; width: var(--mx-pct, 0%); background: rgb(var(--bg-brand)); }
286
+ .mx-sd--sm .mx-sd__track::before, .mx-sd--sm .mx-sd__track::after { height: 2px; }
287
+ .mx-sd__inp {
288
+ appearance: none; -webkit-appearance: none; width: 100%; height: 18px;
289
+ background: transparent; margin: 0; padding: 0; cursor: pointer; position: relative; z-index: 2;
290
+ }
291
+ .mx-sd__inp::-webkit-slider-thumb {
292
+ -webkit-appearance: none; appearance: none; width: 16px; height: 16px; border-radius: 50%;
293
+ background: rgb(var(--bg-primary)); box-shadow: inset 0 0 0 3px rgb(var(--bg-brand)), var(--shadow-100);
294
+ cursor: pointer; transition: transform 120ms ease, box-shadow 120ms ease;
295
+ }
296
+ .mx-sd__inp::-moz-range-thumb {
297
+ width: 16px; height: 16px; border-radius: 50%;
298
+ background: rgb(var(--bg-primary)); border: 3px solid rgb(var(--bg-brand)); cursor: pointer;
299
+ }
300
+ .mx-sd__inp:focus-visible::-webkit-slider-thumb { box-shadow: inset 0 0 0 3px rgb(var(--bg-brand)), 0 0 0 4px rgb(var(--ring-focus)); }
301
+ .mx-sd__inp:disabled { cursor: not-allowed; }
302
+ .mx-sd--dis { opacity: 0.5; }
303
+
304
+ /* ============================================================
305
+ AUTH CODE .mx-auth
306
+ ============================================================ */
307
+ .mx-auth { font-family: var(--font-primary); }
308
+ .mx-auth__row { display: inline-flex; gap: 8px; }
309
+ .mx-auth__cell {
310
+ width: 44px; height: 52px; border: 0; outline: 0; border-radius: var(--radius-8);
311
+ background: rgb(var(--bg-primary)); box-shadow: inset 0 0 0 1px rgb(var(--border-primary));
312
+ text-align: center; font: 700 20px/1 var(--font-secondary); color: rgb(var(--fg-primary));
313
+ transition: box-shadow 140ms ease;
314
+ }
315
+ .mx-auth__cell:focus { box-shadow: inset 0 0 0 2px rgb(var(--border-focus)), 0 0 0 3px rgb(var(--ring-focus)); }
316
+ .mx-auth--err .mx-auth__cell { box-shadow: inset 0 0 0 2px rgb(var(--border-negative)); }
317
+ .mx-auth--dis { opacity: 0.6; }
318
+ .mx-auth__msg { margin-top: 8px; font: 500 12px/1.4 var(--font-primary); color: rgb(var(--fg-negative)); }
319
+
320
+ /* ============================================================
321
+ ALERT .mx-alt
322
+ ============================================================ */
323
+ .mx-alt {
324
+ display: flex; gap: 12px; padding: 14px 16px; border-radius: var(--radius-12);
325
+ font-family: var(--font-primary); max-width: 480px; border: 1px solid transparent;
326
+ }
327
+ .mx-alt__icon {
328
+ width: 22px; height: 22px; flex-shrink: 0; border-radius: 50%;
329
+ display: inline-flex; align-items: center; justify-content: center;
330
+ font: 700 13px/1 var(--font-secondary); color: rgb(var(--slate-1));
331
+ }
332
+ .mx-alt__body { flex: 1; min-width: 0; }
333
+ .mx-alt__h { margin: 0 0 4px; font: 600 14px/1.3 var(--font-primary); }
334
+ .mx-alt__msg { font: 400 13px/1.5 var(--font-primary); }
335
+ .mx-alt__x {
336
+ border: 0; background: transparent; cursor: pointer; font-size: 18px; line-height: 1;
337
+ color: inherit; opacity: 0.6; padding: 0; width: 22px; height: 22px; border-radius: 50%;
338
+ transition: opacity 120ms ease, background 120ms ease;
339
+ }
340
+ .mx-alt__x:hover { opacity: 1; background: rgb(var(--bg-hover)); }
341
+ .mx-alt--info { background: rgb(var(--bg-info-subtle)); color: rgb(var(--fg-info)); }
342
+ .mx-alt--info .mx-alt__icon { background: rgb(var(--bg-info)); }
343
+ .mx-alt--success { background: rgb(var(--bg-positive-subtle)); color: rgb(var(--fg-positive)); }
344
+ .mx-alt--success .mx-alt__icon { background: rgb(var(--bg-positive)); }
345
+ .mx-alt--warning { background: rgb(var(--bg-caution-subtle)); color: rgb(var(--fg-caution)); }
346
+ .mx-alt--warning .mx-alt__icon { background: rgb(var(--bg-caution)); color: rgb(var(--slate-12)); }
347
+ .mx-alt--danger { background: rgb(var(--bg-negative-subtle)); color: rgb(var(--fg-negative)); }
348
+ .mx-alt--danger .mx-alt__icon { background: rgb(var(--bg-negative)); }
349
+
350
+ /* ============================================================
351
+ PROGRESS .mx-pr
352
+ ============================================================ */
353
+ .mx-pr { width: 100%; font-family: var(--font-primary); }
354
+ .mx-pr__track { width: 100%; background: rgb(var(--bg-tertiary)); border-radius: var(--radius-full); overflow: hidden; }
355
+ .mx-pr__bar { height: 100%; border-radius: var(--radius-full); transition: width 300ms ease; }
356
+ .mx-pr--sm .mx-pr__track { height: 4px; }
357
+ .mx-pr--md .mx-pr__track { height: 6px; }
358
+ .mx-pr--lg .mx-pr__track { height: 10px; }
359
+ .mx-pr--brand .mx-pr__bar { background: rgb(var(--bg-brand)); }
360
+ .mx-pr--positive .mx-pr__bar { background: rgb(var(--bg-positive)); }
361
+ .mx-pr--negative .mx-pr__bar { background: rgb(var(--bg-negative)); }
362
+ .mx-pr--caution .mx-pr__bar { background: rgb(var(--bg-caution)); }
363
+ .mx-pr--info .mx-pr__bar { background: rgb(var(--bg-info)); }
364
+ .mx-pr.is-indet .mx-pr__bar { width: 40%; animation: mx-pr-sweep 1.2s ease-in-out infinite; }
365
+ @keyframes mx-pr-sweep { 0% { margin-inline-start: -40%; } 100% { margin-inline-start: 100%; } }
366
+
367
+ /* ============================================================
368
+ BUTTON — extra variants (outline, inverse, destructive)
369
+ ============================================================ */
370
+ .mx-btn--outline { background: transparent; color: rgb(var(--fg-primary)); border-color: rgb(var(--border-primary)); }
371
+ .mx-btn--outline:hover:not(:disabled) { background: rgb(var(--bg-hover)); }
372
+ .mx-btn--outline:active:not(:disabled) { background: rgb(var(--bg-pressed)); }
373
+ .mx-btn--inverse { background: rgb(var(--bg-inverse)); color: rgb(var(--fg-inverse)); }
374
+ .mx-btn--inverse:hover:not(:disabled) { background: rgb(var(--bg-inverse-hover)); }
375
+ .mx-btn--destructive { background: rgb(var(--bg-negative)); color: rgb(var(--fg-on-negative)); }
376
+ .mx-btn--destructive:hover:not(:disabled) { filter: brightness(0.94); }
377
+
378
+ /* ============================================================
379
+ CHIP .mx-chip
380
+ ============================================================ */
381
+ .mx-chip {
382
+ display: inline-flex; align-items: center; gap: 6px;
383
+ height: 26px; padding: 0 10px; border-radius: 6px;
384
+ font: 600 12px/1 var(--font-primary); letter-spacing: 0.02px;
385
+ border: 1px solid transparent; white-space: nowrap;
386
+ }
387
+ .mx-chip--sm { height: 22px; padding: 0 8px; font-size: 11px; border-radius: 4px; }
388
+ .mx-chip--lg { height: 32px; padding: 0 14px; font-size: 13px; border-radius: 8px; }
389
+ .mx-chip--neutral { background: rgb(var(--bg-secondary)); color: rgb(var(--fg-primary)); border-color: rgb(var(--border-primary)); }
390
+ .mx-chip--brand { background: rgb(var(--bg-brand-subtle)); color: rgb(var(--fg-brand)); }
391
+ .mx-chip--positive { background: rgb(var(--bg-positive-subtle)); color: rgb(var(--fg-positive)); }
392
+ .mx-chip--negative { background: rgb(var(--bg-negative-subtle)); color: rgb(var(--fg-negative)); }
393
+ .mx-chip--caution { background: rgb(var(--bg-caution-subtle)); color: rgb(var(--fg-caution)); }
394
+ .mx-chip--info { background: rgb(var(--bg-info-subtle)); color: rgb(var(--fg-info)); }
395
+ .mx-chip--discovery { background: rgb(var(--bg-discovery-subtle)); color: rgb(var(--fg-discovery)); }
396
+ .mx-chip--selectable { cursor: pointer; transition: background .12s ease, color .12s ease; }
397
+ .mx-chip.is-selected { background: rgb(var(--bg-brand)); color: rgb(var(--fg-on-brand)); border-color: transparent; }
398
+ .mx-chip__x { border: 0; background: transparent; color: inherit; cursor: pointer; padding: 0; display: inline-flex; align-items: center; opacity: 0.7; }
399
+ .mx-chip__x:hover { opacity: 1; }
400
+
401
+ /* ============================================================
402
+ BADGE .mx-badge (count pills)
403
+ ============================================================ */
404
+ .mx-badge {
405
+ display: inline-flex; align-items: center; justify-content: center;
406
+ height: 20px; min-width: 20px; padding: 0 7px; border-radius: 9999px;
407
+ font: 700 11px/1 var(--font-primary); color: rgb(var(--fg-on-negative));
408
+ }
409
+ .mx-badge--sm { height: 16px; min-width: 16px; padding: 0 5px; font-size: 10px; }
410
+ .mx-badge--lg { height: 24px; min-width: 24px; padding: 0 9px; font-size: 12px; }
411
+ .mx-badge--brand { background: rgb(var(--bg-brand)); color: rgb(var(--fg-on-brand)); }
412
+ .mx-badge--negative { background: rgb(var(--bg-negative)); }
413
+ .mx-badge--positive { background: rgb(var(--bg-positive)); }
414
+ .mx-badge--caution { background: rgb(var(--bg-caution)); color: rgb(var(--slate-12)); }
415
+ .mx-badge--info { background: rgb(var(--bg-info)); }
416
+
417
+ /* ============================================================
418
+ AVATAR .mx-avatar (size + bg color set inline — data-driven)
419
+ ============================================================ */
420
+ .mx-avatar { position: relative; display: inline-flex; flex-shrink: 0; }
421
+ .mx-avatar__img {
422
+ display: inline-flex; align-items: center; justify-content: center;
423
+ width: 100%; height: 100%; border-radius: 50%; overflow: hidden;
424
+ color: rgb(var(--fg-on-brand)); font-family: var(--font-primary);
425
+ font-weight: 600; letter-spacing: -0.02em;
426
+ }
427
+ .mx-avatar__img img { width: 100%; height: 100%; object-fit: cover; }
428
+ .mx-avatar__status { position: absolute; bottom: 0; right: 0; border-radius: 50%; border: 2px solid rgb(var(--bg-primary)); }
429
+
430
+ /* ============================================================
431
+ CARD .mx-card
432
+ ============================================================ */
433
+ .mx-card { background: rgb(var(--bg-primary)); border: 1px solid rgb(var(--border-secondary)); border-radius: 12px; }
434
+ .mx-card--raised { box-shadow: var(--shadow-200); }
435
+ .mx-card--floating { box-shadow: var(--shadow-400); }
436
+ .mx-card__header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-12); margin-bottom: var(--space-12); }
437
+ .mx-card__title { font-family: var(--font-secondary); font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase; color: rgb(var(--fg-tertiary)); }
438
+ .mx-card__actions { margin-left: auto; display: inline-flex; align-items: center; gap: var(--space-8); }
439
+
440
+ /* ============================================================
441
+ TABS .mx-tabs / .mx-tab
442
+ ============================================================ */
443
+ .mx-tabs { display: flex; gap: 4px; border-bottom: 1px solid rgb(var(--border-secondary)); }
444
+ .mx-tab {
445
+ border: 0; background: transparent; cursor: pointer; padding: 12px 14px;
446
+ font: 500 14px/1 var(--font-primary); color: rgb(var(--fg-secondary));
447
+ border-bottom: 2px solid transparent; margin-bottom: -1px;
448
+ transition: color .12s ease, border-color .12s ease;
449
+ }
450
+ .mx-tab:hover { color: rgb(var(--fg-primary)); }
451
+ .mx-tab.is-active { color: rgb(var(--fg-primary)); font-weight: 600; border-bottom-color: rgb(var(--bg-brand)); }
452
+ .mx-tabs--pills { display: inline-flex; padding: 4px; background: rgb(var(--bg-secondary)); border-radius: 10px; gap: 2px; border: 0; }
453
+ .mx-tabs--pills .mx-tab { padding: 8px 14px; border-radius: 7px; border: 0; margin: 0; font-size: 13px; }
454
+ .mx-tabs--pills .mx-tab:hover { color: rgb(var(--fg-primary)); }
455
+ .mx-tabs--pills .mx-tab.is-active { background: rgb(var(--bg-primary)); box-shadow: var(--shadow-100); border: 0; }
456
+
457
+ /* ============================================================
458
+ MODAL .mx-modal
459
+ ============================================================ */
460
+ .mx-modal-backdrop {
461
+ position: absolute; inset: 0; z-index: 100;
462
+ background: rgb(var(--bg-backdrop));
463
+ display: flex; align-items: center; justify-content: center; padding: 16px;
464
+ animation: mx-fade-in 120ms ease;
465
+ }
466
+ .mx-modal {
467
+ background: rgb(var(--bg-elevated)); border-radius: 14px;
468
+ box-shadow: var(--shadow-500); width: 100%; max-width: 520px;
469
+ border: 1px solid rgb(var(--border-secondary));
470
+ animation: mx-pop-in 140ms cubic-bezier(.2,.8,.2,1);
471
+ }
472
+ .mx-modal--sm { max-width: 400px; }
473
+ .mx-modal--lg { max-width: 720px; }
474
+ .mx-modal__head { padding: 18px 24px 12px; display: flex; align-items: center; justify-content: space-between; }
475
+ .mx-modal__title { font: 700 18px/1.3 var(--font-primary); margin: 0; letter-spacing: -0.01em; }
476
+ .mx-modal__x { border: 0; background: transparent; color: rgb(var(--fg-secondary)); cursor: pointer; padding: 4px; display: inline-flex; border-radius: 6px; }
477
+ .mx-modal__x:hover { background: rgb(var(--bg-hover)); }
478
+ .mx-modal__body { padding: 8px 24px 20px; font: 400 14px/22px var(--font-primary); color: rgb(var(--fg-secondary)); }
479
+ .mx-modal__foot { padding: 16px 24px; border-top: 1px solid rgb(var(--border-secondary)); display: flex; gap: 8px; justify-content: flex-end; }
480
+ @keyframes mx-fade-in { from { opacity: 0; } to { opacity: 1; } }
481
+ @keyframes mx-pop-in { from { opacity: 0; transform: translateY(8px) scale(0.98); } to { opacity: 1; transform: none; } }
482
+
483
+ /* ============================================================
484
+ TOOLTIP .mx-tooltip (CSS hover)
485
+ ============================================================ */
486
+ .mx-tooltip-wrap { position: relative; display: inline-flex; }
487
+ .mx-tooltip {
488
+ position: absolute; bottom: 100%; left: 50%; transform: translate(-50%, -6px);
489
+ background: rgb(var(--bg-inverse)); color: rgb(var(--fg-inverse));
490
+ padding: 6px 10px; border-radius: 6px; font: 500 12px/1 var(--font-primary);
491
+ white-space: nowrap; pointer-events: none; z-index: 20; box-shadow: var(--shadow-300);
492
+ opacity: 0; transition: opacity .12s ease;
493
+ }
494
+ .mx-tooltip-wrap:hover .mx-tooltip { opacity: 1; }
495
+
496
+ /* ============================================================
497
+ TABLE .mx-table
498
+ ============================================================ */
499
+ .mx-table-wrap { overflow: auto; border: 1px solid rgb(var(--border-secondary)); border-radius: 10px; background: rgb(var(--bg-primary)); }
500
+ .mx-table { width: 100%; border-collapse: collapse; font-family: var(--font-primary); font-size: 13px; }
501
+ .mx-table th {
502
+ text-align: left; padding: 12px 16px;
503
+ font: 700 11px/1 var(--font-primary); letter-spacing: 1.5px; text-transform: uppercase;
504
+ color: rgb(var(--fg-tertiary)); background: rgb(var(--bg-secondary));
505
+ border-bottom: 1px solid rgb(var(--border-secondary));
506
+ }
507
+ .mx-table th.is-right, .mx-table td.is-right { text-align: right; }
508
+ .mx-table td { padding: 14px 16px; color: rgb(var(--fg-primary)); vertical-align: middle; border-bottom: 1px solid rgb(var(--border-secondary)); }
509
+ .mx-table tbody tr:last-child td { border-bottom: 0; }
510
+ .mx-table--striped tbody tr:nth-child(even) td { background: rgb(var(--bg-secondary) / 0.45); }
511
+
512
+ /* ============================================================
513
+ LINK .mx-link
514
+ ============================================================ */
515
+ .mx-link {
516
+ display: inline-flex; align-items: center; gap: 6px;
517
+ border: 0; background: transparent; padding: 0; cursor: pointer;
518
+ color: rgb(var(--fg-brand)); font-family: var(--font-primary); font-weight: 600;
519
+ text-decoration: none;
520
+ }
521
+ .mx-link--md { font-size: 14px; line-height: 1.4; }
522
+ .mx-link--sm { font-size: 13px; line-height: 1.4; }
523
+ .mx-link--muted { color: rgb(var(--fg-tertiary)); }
524
+ .mx-link:hover:not(.is-disabled) { text-decoration: underline; }
525
+ .mx-link:focus-visible { outline: none; border-radius: 4px; box-shadow: 0 0 0 3px rgb(var(--ring-focus)); }
526
+ .mx-link.is-disabled { color: rgb(var(--fg-tertiary)); cursor: not-allowed; }
527
+ .mx-link__icon { display: inline-flex; align-items: center; }
528
+
529
+ /* ============================================================
530
+ DIVIDER .mx-divider
531
+ ============================================================ */
532
+ .mx-divider { border: 0; height: 1px; width: 100%; background: rgb(var(--border-secondary)); margin: 0; }
533
+ .mx-divider--v { display: inline-block; width: 1px; height: 100%; min-height: 1em; }
534
+ .mx-divider--label { display: flex; align-items: center; gap: 12px; height: auto; background: none; }
535
+ .mx-divider--label .mx-divider__line { flex: 1; height: 1px; background: rgb(var(--border-secondary)); }
536
+ .mx-divider--label .mx-divider__lbl {
537
+ font: 500 11px/1 var(--font-primary); letter-spacing: 0.08em; text-transform: uppercase;
538
+ color: rgb(var(--fg-tertiary)); white-space: nowrap;
539
+ }
540
+
541
+ /* ============================================================
542
+ CHECKLIST .mx-checklist
543
+ ============================================================ */
544
+ .mx-checklist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
545
+ .mx-checklist__item {
546
+ display: flex; align-items: center; gap: 8px;
547
+ font: 500 13px/1.3 var(--font-primary); color: rgb(var(--fg-tertiary));
548
+ }
549
+ .mx-checklist__mark { width: 14px; display: inline-flex; justify-content: center; }
550
+ .mx-checklist__item.is-met { color: rgb(var(--fg-positive)); }
551
+
552
+ /* ============================================================
553
+ PASSWORD STRENGTH .mx-pwstr
554
+ ============================================================ */
555
+ .mx-pwstr { display: flex; align-items: center; gap: 12px; }
556
+ .mx-pwstr .mx-pr { flex: 1; }
557
+ .mx-pwstr__lbl { font: 600 12px/1 var(--font-primary); flex-shrink: 0; min-width: 48px; }
558
+ .mx-pwstr__lbl--negative { color: rgb(var(--fg-negative)); }
559
+ .mx-pwstr__lbl--caution { color: rgb(var(--fg-caution)); }
560
+ .mx-pwstr__lbl--positive { color: rgb(var(--fg-positive)); }
561
+
562
+ /* ============================================================
563
+ AUTH LAYOUT .mx-al
564
+ ============================================================ */
565
+ .mx-al {
566
+ display: grid; grid-template-columns: 1.05fr 1fr; height: 100%; min-height: 600px;
567
+ background: rgb(var(--bg-primary)); color: rgb(var(--fg-primary)); font-family: var(--font-primary);
568
+ }
569
+ .mx-al__brand {
570
+ position: relative; overflow: hidden; display: flex; flex-direction: column; padding: 40px;
571
+ background:
572
+ radial-gradient(120% 80% at 0% 0%, rgb(var(--iris-9) / 0.22), transparent 60%),
573
+ linear-gradient(160deg, rgb(var(--bg-secondary)), rgb(var(--bg-tertiary)));
574
+ border-inline-end: 1px solid rgb(var(--border-secondary));
575
+ }
576
+ .mx-al__brandtop { display: flex; align-items: center; gap: 10px; position: relative; z-index: 2; }
577
+ .mx-al__logo { display: inline-flex; color: rgb(var(--iris-9)); }
578
+ .mx-al__wordmark { font: 700 18px/1 var(--font-primary); letter-spacing: -0.01em; }
579
+ .mx-al__badge {
580
+ font: 600 10px/1 var(--font-secondary); letter-spacing: 0.1em; text-transform: uppercase;
581
+ color: rgb(var(--fg-on-brand)); background: rgb(var(--iris-9)); padding: 4px 6px; border-radius: 5px;
582
+ }
583
+ .mx-al__brandmid { margin-top: auto; margin-bottom: auto; position: relative; z-index: 2; }
584
+ .mx-al__brandh {
585
+ margin: 0 0 28px; max-width: 14ch;
586
+ font: 400 40px/1.08 var(--font-display); letter-spacing: -0.01em; color: rgb(var(--fg-primary));
587
+ }
588
+ .mx-al__feat { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
589
+ .mx-al__feat li { display: flex; align-items: center; gap: 12px; font: 500 14px/1.4 var(--font-primary); color: rgb(var(--fg-secondary)); }
590
+ .mx-al__check {
591
+ width: 22px; height: 22px; flex-shrink: 0; border-radius: 50%;
592
+ display: inline-flex; align-items: center; justify-content: center;
593
+ background: rgb(var(--bg-brand-subtle)); color: rgb(var(--fg-brand)); font: 700 11px/1 var(--font-secondary);
594
+ }
595
+ .mx-al__brandfoot {
596
+ position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between;
597
+ padding-top: 24px; border-top: 1px solid rgb(var(--border-secondary));
598
+ }
599
+ .mx-al__statline { display: inline-flex; align-items: center; gap: 8px; font: 500 12px/1 var(--font-primary); color: rgb(var(--fg-secondary)); }
600
+ .mx-al__dot { width: 8px; height: 8px; border-radius: 50%; background: rgb(var(--green-9)); box-shadow: 0 0 0 3px rgb(var(--green-9) / 0.2); }
601
+ .mx-al__ver { font: 500 12px/1 var(--font-secondary); color: rgb(var(--fg-tertiary)); }
602
+ .mx-al__glow { position: absolute; border-radius: 50%; filter: blur(60px); opacity: 0.5; pointer-events: none; z-index: 1; }
603
+ .mx-al__glow--1 { width: 320px; height: 320px; background: rgb(var(--iris-9) / 0.4); top: -80px; right: -60px; }
604
+ .mx-al__glow--2 { width: 260px; height: 260px; background: rgb(var(--indigo-9) / 0.3); bottom: -60px; left: 30px; }
605
+
606
+ .mx-al__main { display: flex; align-items: center; justify-content: center; padding: 40px; overflow-y: auto; }
607
+ .mx-al__form { width: 100%; max-width: 400px; }
608
+ .mx-al__eyebrow {
609
+ margin: 0 0 10px; font: 600 12px/1 var(--font-secondary);
610
+ letter-spacing: 0.14em; text-transform: uppercase; color: rgb(var(--fg-brand));
611
+ }
612
+ .mx-al__h { margin: 0 0 8px; font: 700 28px/1.1 var(--font-primary); letter-spacing: -0.02em; }
613
+ .mx-al__sub { margin: 0 0 28px; font: 400 15px/1.5 var(--font-primary); color: rgb(var(--fg-secondary)); }
614
+ .mx-al__body { display: flex; flex-direction: column; gap: 16px; }
615
+ /* Form controls fill the auth column regardless of their own max-width. */
616
+ .mx-al__body .mx-in,
617
+ .mx-al__body .mx-ta,
618
+ .mx-al__body .mx-sr { max-width: none; width: 100%; }
619
+ .mx-al__foot { margin-top: 28px; }
620
+
621
+ @media (max-width: 880px) {
622
+ .mx-al { grid-template-columns: 1fr; }
623
+ .mx-al__brand { display: none; }
624
+ }
625
+
626
+ /* ════════════════════════════════════════════════════════════════════════
627
+ CHART .mx-chart — a token-driven SVG curve/area primitive
628
+ ════════════════════════════════════════════════════════════════════════ */
629
+ .mx-chart { position: relative; padding-left: 44px; padding-bottom: 22px; }
630
+ .mx-chart__svg { width: 100%; height: 100%; display: block; overflow: visible; }
631
+ .mx-chart__grid { stroke: rgb(var(--border-secondary)); stroke-width: 1; vector-effect: non-scaling-stroke; }
632
+ .mx-chart__marker { stroke: rgb(var(--fg-tertiary)); stroke-width: 1.5; stroke-dasharray: 4 4; vector-effect: non-scaling-stroke; }
633
+ .mx-chart__marker--solid { stroke-dasharray: none; }
634
+ .mx-chart__line { fill: none; stroke-linejoin: round; stroke-linecap: round; }
635
+ .mx-chart__yaxis {
636
+ position: absolute; left: 0; top: 0; bottom: 22px; width: 40px;
637
+ display: flex; flex-direction: column; justify-content: space-between;
638
+ font-family: var(--font-secondary); font-size: 11px; color: rgb(var(--fg-tertiary)); text-align: right;
639
+ }
640
+ .mx-chart__xaxis {
641
+ position: absolute; left: 44px; right: 0; bottom: 0;
642
+ display: flex; justify-content: space-between;
643
+ font-family: var(--font-secondary); font-size: 11px; color: rgb(var(--fg-tertiary));
644
+ }
645
+
646
+ /* ════════════════════════════════════════════════════════════════════════
647
+ STAT .mx-stat — a KPI / metric tile
648
+ ════════════════════════════════════════════════════════════════════════ */
649
+ .mx-stat {
650
+ display: flex; flex-direction: column; gap: var(--space-6);
651
+ padding: var(--space-16); border: 1px solid rgb(var(--border-primary));
652
+ border-radius: var(--radius-12); background: rgb(var(--bg-elevated));
653
+ }
654
+ .mx-stat--center { align-items: center; text-align: center; }
655
+ .mx-stat__head { display: flex; align-items: center; gap: var(--space-6); }
656
+ .mx-stat__icon { color: rgb(var(--fg-brand)); display: inline-flex; }
657
+ .mx-stat__label {
658
+ font-family: var(--font-primary); font-size: 12px; letter-spacing: 0.02em;
659
+ text-transform: uppercase; color: rgb(var(--fg-tertiary));
660
+ }
661
+ .mx-stat__value {
662
+ font-family: var(--font-secondary); font-size: 26px; font-weight: 600; line-height: 1.15;
663
+ color: rgb(var(--fg-primary)); font-variant-numeric: tabular-nums;
664
+ }
665
+ .mx-stat__foot { display: flex; align-items: center; gap: var(--space-8); flex-wrap: wrap; }
666
+ .mx-stat__hint { font-family: var(--font-primary); font-size: 12px; color: rgb(var(--fg-secondary)); }
667
+ .mx-stat__delta {
668
+ font-family: var(--font-secondary); font-size: 12px; font-weight: 600;
669
+ padding: 2px var(--space-6); border-radius: var(--radius-6);
670
+ }
671
+ .mx-stat__delta--neutral { background: rgb(var(--bg-secondary)); color: rgb(var(--fg-primary)); }
672
+ .mx-stat__delta--positive { background: rgb(var(--bg-positive-subtle)); color: rgb(var(--fg-positive)); }
673
+ .mx-stat__delta--negative { background: rgb(var(--bg-negative-subtle)); color: rgb(var(--fg-negative)); }
674
+ .mx-stat__delta--caution { background: rgb(var(--bg-caution-subtle)); color: rgb(var(--fg-caution)); }
675
+ .mx-stat__delta--brand { background: rgb(var(--bg-brand-subtle)); color: rgb(var(--fg-brand)); }
676
+ .mx-stat__delta--info { background: rgb(var(--bg-info-subtle)); color: rgb(var(--fg-info)); }