mljr-css 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +299 -0
  2. package/dist/mljr.css +12214 -0
  3. package/dist/mljr.min.css +3 -0
  4. package/dist/plugin.cjs +139 -0
  5. package/dist/plugin.d.cts +73 -0
  6. package/dist/plugin.d.ts +73 -0
  7. package/dist/plugin.js +102 -0
  8. package/package.json +60 -0
  9. package/src/base/reset.css +210 -0
  10. package/src/base/typography.css +286 -0
  11. package/src/components/accordion.css +210 -0
  12. package/src/components/alert.css +231 -0
  13. package/src/components/avatar.css +222 -0
  14. package/src/components/badge.css +315 -0
  15. package/src/components/breadcrumb.css +100 -0
  16. package/src/components/button.css +383 -0
  17. package/src/components/card.css +319 -0
  18. package/src/components/carousel.css +179 -0
  19. package/src/components/checkbox.css +303 -0
  20. package/src/components/chip.css +207 -0
  21. package/src/components/divider.css +248 -0
  22. package/src/components/drawer.css +242 -0
  23. package/src/components/dropdown.css +246 -0
  24. package/src/components/empty-state.css +216 -0
  25. package/src/components/file-upload.css +262 -0
  26. package/src/components/footer.css +231 -0
  27. package/src/components/input.css +504 -0
  28. package/src/components/modal.css +179 -0
  29. package/src/components/pagination.css +143 -0
  30. package/src/components/password.css +449 -0
  31. package/src/components/popover.css +175 -0
  32. package/src/components/progress.css +165 -0
  33. package/src/components/radio.css +200 -0
  34. package/src/components/select.css +165 -0
  35. package/src/components/sidebar.css +236 -0
  36. package/src/components/skeleton.css +161 -0
  37. package/src/components/spinner.css +259 -0
  38. package/src/components/stepper.css +257 -0
  39. package/src/components/table.css +184 -0
  40. package/src/components/tabs.css +219 -0
  41. package/src/components/textarea.css +164 -0
  42. package/src/components/toast.css +294 -0
  43. package/src/components/tooltip.css +99 -0
  44. package/src/index.css +54 -0
  45. package/src/layout/container.css +181 -0
  46. package/src/layout/footer.css +319 -0
  47. package/src/layout/header.css +223 -0
  48. package/src/layout/navbar.css +461 -0
  49. package/src/layout/navigation.css +328 -0
  50. package/src/layout/sidebar.css +334 -0
  51. package/src/plugin.ts +130 -0
  52. package/src/themes/variables.css +345 -0
  53. package/src/utilities/utilities.css +598 -0
@@ -0,0 +1,236 @@
1
+ /* ============================================
2
+ MLJR CSS Framework - Sidebar Component
3
+ ============================================ */
4
+
5
+ .mljr-sidebar {
6
+ position: fixed;
7
+ top: 0;
8
+ left: 0;
9
+ width: 280px;
10
+ height: 100vh;
11
+ background: var(--mljr-bg-secondary);
12
+ border-right: 1px solid var(--mljr-border);
13
+ display: flex;
14
+ flex-direction: column;
15
+ z-index: 100;
16
+ transition: transform 0.3s ease;
17
+ box-shadow: var(--mljr-clay-shadow-lg);
18
+ }
19
+
20
+ /* Collapsed state - fully hidden */
21
+ .mljr-sidebar[data-collapsed="true"] {
22
+ transform: translateX(-100%);
23
+ }
24
+
25
+ /* Header */
26
+ .mljr-sidebar-header {
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: space-between;
30
+ padding: var(--mljr-space-4);
31
+ border-bottom: 1px solid var(--mljr-border);
32
+ background: var(--mljr-bg-secondary);
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ .mljr-sidebar-logo {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: var(--mljr-space-2);
40
+ font-size: var(--mljr-text-xl);
41
+ font-weight: 700;
42
+ color: var(--mljr-text);
43
+ text-decoration: none;
44
+ }
45
+
46
+ .mljr-sidebar-close {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ width: 2rem;
51
+ height: 2rem;
52
+ padding: 0;
53
+ background: transparent;
54
+ border: none;
55
+ border-radius: var(--mljr-radius-md);
56
+ color: var(--mljr-text-muted);
57
+ cursor: pointer;
58
+ transition: all var(--mljr-transition-fast);
59
+ flex-shrink: 0;
60
+ }
61
+
62
+ .mljr-sidebar-close:hover {
63
+ background: var(--mljr-bg-tertiary);
64
+ color: var(--mljr-text);
65
+ }
66
+
67
+ /* Navigation Container */
68
+ .mljr-sidebar-nav {
69
+ flex: 1;
70
+ overflow-y: auto;
71
+ overflow-x: hidden;
72
+ padding: var(--mljr-space-4);
73
+ min-height: 0;
74
+ }
75
+
76
+ /* Claymorphism Scrollbar - Extra Wide & Playful */
77
+ .mljr-sidebar-nav::-webkit-scrollbar {
78
+ width: 24px;
79
+ }
80
+
81
+ .mljr-sidebar-nav::-webkit-scrollbar-track {
82
+ background: var(--mljr-bg-tertiary);
83
+ border-radius: var(--mljr-radius-full);
84
+ box-shadow: inset 3px 3px 6px rgba(0, 0, 0, 0.1),
85
+ inset -3px -3px 6px rgba(255, 255, 255, 0.5);
86
+ margin: 4px;
87
+ border: 2px solid transparent;
88
+ }
89
+
90
+ .mljr-sidebar-nav::-webkit-scrollbar-thumb {
91
+ background: linear-gradient(180deg, var(--mljr-primary-300) 0%, var(--mljr-primary-500) 100%);
92
+ border-radius: var(--mljr-radius-full);
93
+ box-shadow:
94
+ 3px 3px 6px rgba(249, 115, 22, 0.3),
95
+ -2px -2px 4px rgba(255, 255, 255, 0.6),
96
+ inset 1px 1px 2px rgba(255, 255, 255, 0.3);
97
+ border: 3px solid transparent;
98
+ background-clip: content-box;
99
+ min-height: 60px;
100
+ }
101
+
102
+ .mljr-sidebar-nav::-webkit-scrollbar-thumb:hover {
103
+ background: linear-gradient(180deg, var(--mljr-primary-400) 0%, var(--mljr-primary-600) 100%);
104
+ box-shadow:
105
+ 4px 4px 8px rgba(249, 115, 22, 0.4),
106
+ -2px -2px 4px rgba(255, 255, 255, 0.6),
107
+ inset 1px 1px 2px rgba(255, 255, 255, 0.4);
108
+ }
109
+
110
+ .mljr-sidebar-nav::-webkit-scrollbar-corner {
111
+ background: transparent;
112
+ }
113
+
114
+ /* Firefox */
115
+ .mljr-sidebar-nav {
116
+ scrollbar-width: auto;
117
+ scrollbar-color: var(--mljr-primary-500) var(--mljr-bg-tertiary);
118
+ }
119
+
120
+ /* Categories */
121
+ .mljr-sidebar-category {
122
+ margin-bottom: var(--mljr-space-6);
123
+ }
124
+
125
+ .mljr-sidebar-category:last-child {
126
+ margin-bottom: 0;
127
+ }
128
+
129
+ .mljr-sidebar-category-title {
130
+ font-size: var(--mljr-text-xs);
131
+ font-weight: 600;
132
+ text-transform: uppercase;
133
+ letter-spacing: 0.05em;
134
+ color: var(--mljr-text-muted);
135
+ margin-bottom: var(--mljr-space-2);
136
+ padding-left: var(--mljr-space-2);
137
+ }
138
+
139
+ .mljr-sidebar-list {
140
+ list-style: none;
141
+ margin: 0;
142
+ padding: 0;
143
+ }
144
+
145
+ .mljr-sidebar-link {
146
+ display: block;
147
+ padding: var(--mljr-space-2) var(--mljr-space-3);
148
+ color: var(--mljr-text-secondary);
149
+ text-decoration: none;
150
+ border-radius: var(--mljr-radius-md);
151
+ font-size: var(--mljr-text-sm);
152
+ transition: all var(--mljr-transition-fast);
153
+ background: transparent;
154
+ border: none;
155
+ width: 100%;
156
+ text-align: left;
157
+ cursor: pointer;
158
+ }
159
+
160
+ .mljr-sidebar-link:hover {
161
+ background: var(--mljr-bg-tertiary);
162
+ color: var(--mljr-text);
163
+ }
164
+
165
+ .mljr-sidebar-link-active {
166
+ background: var(--mljr-primary-100);
167
+ color: var(--mljr-primary-700);
168
+ font-weight: 500;
169
+ }
170
+
171
+ /* Mobile Overlay */
172
+ .mljr-sidebar-overlay {
173
+ position: fixed;
174
+ inset: 0;
175
+ background: rgba(0, 0, 0, 0.5);
176
+ backdrop-filter: blur(4px);
177
+ z-index: 99;
178
+ opacity: 0;
179
+ visibility: hidden;
180
+ transition: opacity 0.3s ease, visibility 0.3s ease;
181
+ }
182
+
183
+ .mljr-sidebar-overlay[data-visible="true"] {
184
+ opacity: 1;
185
+ visibility: visible;
186
+ }
187
+
188
+ /* Open Button (when collapsed) */
189
+ .mljr-sidebar-open-btn {
190
+ position: fixed;
191
+ top: var(--mljr-space-4);
192
+ left: var(--mljr-space-4);
193
+ z-index: 90;
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ width: 2.5rem;
198
+ height: 2.5rem;
199
+ background: var(--mljr-bg);
200
+ border: 1px solid var(--mljr-border);
201
+ border-radius: var(--mljr-radius-lg);
202
+ box-shadow: var(--mljr-clay-shadow-sm);
203
+ color: var(--mljr-text);
204
+ cursor: pointer;
205
+ transition: all var(--mljr-transition-fast);
206
+ }
207
+
208
+ .mljr-sidebar-open-btn:hover {
209
+ box-shadow: var(--mljr-clay-shadow);
210
+ transform: translateY(-1px);
211
+ }
212
+
213
+ /* Dark Mode */
214
+ .dark .mljr-sidebar,
215
+ [data-theme="dark"] .mljr-sidebar {
216
+ background: var(--mljr-bg-secondary);
217
+ border-color: var(--mljr-border);
218
+ }
219
+
220
+ .dark .mljr-sidebar-header,
221
+ [data-theme="dark"] .mljr-sidebar-header {
222
+ background: var(--mljr-bg-secondary);
223
+ border-color: var(--mljr-border);
224
+ }
225
+
226
+ .dark .mljr-sidebar-link-active,
227
+ [data-theme="dark"] .mljr-sidebar-link-active {
228
+ background: rgba(249, 115, 22, 0.2);
229
+ color: var(--mljr-primary-300);
230
+ }
231
+
232
+ .dark .mljr-sidebar-open-btn,
233
+ [data-theme="dark"] .mljr-sidebar-open-btn {
234
+ background: var(--mljr-bg-secondary);
235
+ border-color: var(--mljr-border);
236
+ }
@@ -0,0 +1,161 @@
1
+ /* ============================================
2
+ MLJR CSS Framework - Skeleton Component
3
+ Claymorphism: Soft rounded loading placeholders
4
+ ============================================ */
5
+
6
+ .mljr-skeleton {
7
+ position: relative;
8
+ overflow: hidden;
9
+ border-radius: var(--mljr-radius-md);
10
+ background-color: var(--mljr-bg-tertiary);
11
+ box-shadow: var(--mljr-clay-inset-sm);
12
+ }
13
+
14
+ /* Soft warm shimmer */
15
+ .mljr-skeleton-shimmer {
16
+ position: absolute;
17
+ inset: 0;
18
+ z-index: 1;
19
+ background: linear-gradient(
20
+ 90deg,
21
+ transparent 0%,
22
+ rgba(249, 115, 22, 0.08) 50%,
23
+ transparent 100%
24
+ );
25
+ transform: translateX(-100%);
26
+ animation: mljr-skeleton-shimmer 2s ease-in-out infinite;
27
+ }
28
+
29
+ @keyframes mljr-skeleton-shimmer {
30
+ 0% { transform: translateX(-100%); }
31
+ 100% { transform: translateX(100%); }
32
+ }
33
+
34
+ /* Size Variants */
35
+ .mljr-skeleton-text {
36
+ height: 1rem;
37
+ width: 100%;
38
+ }
39
+
40
+ .mljr-skeleton-text-sm {
41
+ height: 0.75rem;
42
+ }
43
+
44
+ .mljr-skeleton-text-lg {
45
+ height: 1.5rem;
46
+ }
47
+
48
+ .mljr-skeleton-title {
49
+ height: 2rem;
50
+ width: 60%;
51
+ }
52
+
53
+ .mljr-skeleton-avatar {
54
+ width: 3rem;
55
+ height: 3rem;
56
+ border-radius: 30%;
57
+ }
58
+
59
+ .mljr-skeleton-avatar-sm {
60
+ width: 2rem;
61
+ height: 2rem;
62
+ }
63
+
64
+ .mljr-skeleton-avatar-lg {
65
+ width: 4rem;
66
+ height: 4rem;
67
+ }
68
+
69
+ .mljr-skeleton-avatar-xl {
70
+ width: 5rem;
71
+ height: 5rem;
72
+ }
73
+
74
+ /* Circle variant */
75
+ .mljr-skeleton-circle {
76
+ border-radius: var(--mljr-radius-full);
77
+ }
78
+
79
+ .mljr-skeleton-card {
80
+ height: 12rem;
81
+ width: 100%;
82
+ border-radius: var(--mljr-radius-xl);
83
+ }
84
+
85
+ .mljr-skeleton-button {
86
+ height: 2.5rem;
87
+ width: 8rem;
88
+ border-radius: var(--mljr-radius-lg);
89
+ }
90
+
91
+ .mljr-skeleton-image {
92
+ width: 100%;
93
+ height: 10rem;
94
+ border-radius: var(--mljr-radius-lg);
95
+ }
96
+
97
+ /* Skeleton group for multiple lines */
98
+ .mljr-skeleton-group {
99
+ display: flex;
100
+ flex-direction: column;
101
+ gap: var(--mljr-space-2);
102
+ }
103
+
104
+ .mljr-skeleton-group .mljr-skeleton:last-child {
105
+ width: 75%;
106
+ }
107
+
108
+ /* Pulse animation variant */
109
+ .mljr-skeleton-pulse {
110
+ animation: mljr-skeleton-pulse 2s ease-in-out infinite;
111
+ }
112
+
113
+ .mljr-skeleton-pulse .mljr-skeleton-shimmer {
114
+ display: none;
115
+ }
116
+
117
+ @keyframes mljr-skeleton-pulse {
118
+ 0%, 100% { opacity: 1; }
119
+ 50% { opacity: 0.4; }
120
+ }
121
+
122
+ /* No animation variant */
123
+ .mljr-skeleton-static .mljr-skeleton-shimmer {
124
+ display: none;
125
+ }
126
+
127
+ /* Color variants */
128
+ .mljr-skeleton-secondary .mljr-skeleton-shimmer {
129
+ background: linear-gradient(
130
+ 90deg,
131
+ transparent 0%,
132
+ rgba(20, 184, 166, 0.1) 50%,
133
+ transparent 100%
134
+ );
135
+ }
136
+
137
+ .mljr-skeleton-accent .mljr-skeleton-shimmer {
138
+ background: linear-gradient(
139
+ 90deg,
140
+ transparent 0%,
141
+ rgba(168, 85, 247, 0.1) 50%,
142
+ transparent 100%
143
+ );
144
+ }
145
+
146
+ /* Dark mode */
147
+ .dark .mljr-skeleton,
148
+ [data-theme="dark"] .mljr-skeleton {
149
+ background-color: var(--mljr-bg-secondary);
150
+ box-shadow: var(--mljr-clay-inset-sm);
151
+ }
152
+
153
+ .dark .mljr-skeleton-shimmer,
154
+ [data-theme="dark"] .mljr-skeleton-shimmer {
155
+ background: linear-gradient(
156
+ 90deg,
157
+ transparent 0%,
158
+ rgba(249, 115, 22, 0.12) 50%,
159
+ transparent 100%
160
+ );
161
+ }
@@ -0,0 +1,259 @@
1
+ /* ============================================
2
+ MLJR CSS Framework - Spinner/Loader Component
3
+ Claymorphism: Soft circular spinners
4
+ ============================================ */
5
+
6
+ /* Base spinner */
7
+ .mljr-spinner {
8
+ display: inline-block;
9
+ width: 2rem;
10
+ height: 2rem;
11
+ position: relative;
12
+ }
13
+
14
+ /* Circular rotating spinner - Default */
15
+ .mljr-spinner-circle {
16
+ border: 3px solid var(--mljr-bg-tertiary);
17
+ border-radius: var(--mljr-radius-full);
18
+ animation: mljr-spin 1s linear infinite;
19
+ }
20
+
21
+ .mljr-spinner-circle::before {
22
+ content: '';
23
+ position: absolute;
24
+ inset: -3px;
25
+ border: 3px solid transparent;
26
+ border-top-color: var(--mljr-primary-500);
27
+ border-radius: var(--mljr-radius-full);
28
+ }
29
+
30
+ @keyframes mljr-spin {
31
+ to {
32
+ transform: rotate(360deg);
33
+ }
34
+ }
35
+
36
+ /* Ring spinner with clay effect */
37
+ .mljr-spinner-ring {
38
+ border: 3px solid var(--mljr-bg-tertiary);
39
+ border-radius: var(--mljr-radius-full);
40
+ box-shadow: var(--mljr-clay-inset-sm);
41
+ animation: mljr-spin 1s linear infinite;
42
+ }
43
+
44
+ .mljr-spinner-ring::before {
45
+ content: '';
46
+ position: absolute;
47
+ inset: -3px;
48
+ border: 3px solid transparent;
49
+ border-top-color: var(--mljr-primary-500);
50
+ border-radius: var(--mljr-radius-full);
51
+ }
52
+
53
+ /* Soft pulse spinner */
54
+ .mljr-spinner-pulse {
55
+ background: var(--mljr-gradient-primary);
56
+ border-radius: var(--mljr-radius-full);
57
+ animation: mljr-pulse-scale 1.5s ease-in-out infinite;
58
+ box-shadow: var(--mljr-clay-shadow-sm);
59
+ }
60
+
61
+ @keyframes mljr-pulse-scale {
62
+ 0%, 100% {
63
+ transform: scale(0.8);
64
+ opacity: 0.5;
65
+ }
66
+ 50% {
67
+ transform: scale(1);
68
+ opacity: 1;
69
+ }
70
+ }
71
+
72
+ /* Dots spinner - circular dots */
73
+ .mljr-spinner-dots {
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ gap: var(--mljr-space-1);
78
+ }
79
+
80
+ .mljr-spinner-dots > *,
81
+ .mljr-spinner-dot {
82
+ width: 0.5rem;
83
+ height: 0.5rem;
84
+ background: var(--mljr-gradient-primary);
85
+ border-radius: var(--mljr-radius-full);
86
+ animation: mljr-bounce 1.4s ease-in-out infinite;
87
+ box-shadow: 0 0 4px rgba(249, 115, 22, 0.3);
88
+ }
89
+
90
+ .mljr-spinner-dots > *:nth-child(1) {
91
+ animation-delay: -0.32s;
92
+ }
93
+
94
+ .mljr-spinner-dots > *:nth-child(2) {
95
+ animation-delay: -0.16s;
96
+ }
97
+
98
+ .mljr-spinner-dots > *:nth-child(3) {
99
+ animation-delay: 0s;
100
+ }
101
+
102
+ @keyframes mljr-bounce {
103
+ 0%, 80%, 100% {
104
+ transform: scale(0.6);
105
+ opacity: 0.5;
106
+ }
107
+ 40% {
108
+ transform: scale(1);
109
+ opacity: 1;
110
+ }
111
+ }
112
+
113
+ /* Bars spinner */
114
+ .mljr-spinner-bars {
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 3px;
118
+ }
119
+
120
+ .mljr-spinner-bars > *,
121
+ .mljr-spinner-bar {
122
+ width: 4px;
123
+ height: 1.5rem;
124
+ background: var(--mljr-gradient-primary);
125
+ border-radius: var(--mljr-radius-sm);
126
+ animation: mljr-bars 1.2s ease-in-out infinite;
127
+ }
128
+
129
+ .mljr-spinner-bars > *:nth-child(1) { animation-delay: -1.2s; }
130
+ .mljr-spinner-bars > *:nth-child(2) { animation-delay: -1.1s; }
131
+ .mljr-spinner-bars > *:nth-child(3) { animation-delay: -1.0s; }
132
+ .mljr-spinner-bars > *:nth-child(4) { animation-delay: -0.9s; }
133
+ .mljr-spinner-bars > *:nth-child(5) { animation-delay: -0.8s; }
134
+
135
+ @keyframes mljr-bars {
136
+ 0%, 40%, 100% {
137
+ transform: scaleY(0.4);
138
+ }
139
+ 20% {
140
+ transform: scaleY(1);
141
+ }
142
+ }
143
+
144
+ /* Orbit spinner - two dots orbiting */
145
+ .mljr-spinner-orbit {
146
+ animation: mljr-spin 1.5s linear infinite;
147
+ }
148
+
149
+ .mljr-spinner-orbit::before,
150
+ .mljr-spinner-orbit::after {
151
+ content: '';
152
+ position: absolute;
153
+ width: 0.5rem;
154
+ height: 0.5rem;
155
+ background: var(--mljr-gradient-primary);
156
+ border-radius: var(--mljr-radius-full);
157
+ box-shadow: 0 0 6px rgba(249, 115, 22, 0.4);
158
+ }
159
+
160
+ .mljr-spinner-orbit::before {
161
+ top: 0;
162
+ left: 50%;
163
+ transform: translateX(-50%);
164
+ }
165
+
166
+ .mljr-spinner-orbit::after {
167
+ bottom: 0;
168
+ left: 50%;
169
+ transform: translateX(-50%);
170
+ opacity: 0.5;
171
+ }
172
+
173
+ /* Size variants */
174
+ .mljr-spinner-xs {
175
+ width: 1rem;
176
+ height: 1rem;
177
+ }
178
+
179
+ .mljr-spinner-sm {
180
+ width: 1.5rem;
181
+ height: 1.5rem;
182
+ }
183
+
184
+ .mljr-spinner-lg {
185
+ width: 3rem;
186
+ height: 3rem;
187
+ }
188
+
189
+ .mljr-spinner-xl {
190
+ width: 4rem;
191
+ height: 4rem;
192
+ }
193
+
194
+ /* Color variants */
195
+ .mljr-spinner-secondary.mljr-spinner-circle::before,
196
+ .mljr-spinner-secondary.mljr-spinner-ring::before {
197
+ border-top-color: var(--mljr-secondary-500);
198
+ }
199
+
200
+ .mljr-spinner-secondary.mljr-spinner-pulse,
201
+ .mljr-spinner-secondary .mljr-spinner-dot,
202
+ .mljr-spinner-secondary .mljr-spinner-bar {
203
+ background: var(--mljr-gradient-secondary);
204
+ }
205
+
206
+ .mljr-spinner-secondary.mljr-spinner-orbit::before,
207
+ .mljr-spinner-secondary.mljr-spinner-orbit::after {
208
+ background: var(--mljr-gradient-secondary);
209
+ box-shadow: 0 0 6px rgba(20, 184, 166, 0.4);
210
+ }
211
+
212
+ /* Loading overlay */
213
+ .mljr-loading-overlay {
214
+ position: absolute;
215
+ inset: 0;
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ background: rgba(255, 255, 255, 0.8);
220
+ backdrop-filter: blur(4px);
221
+ z-index: 50;
222
+ border-radius: inherit;
223
+ }
224
+
225
+ .dark .mljr-loading-overlay,
226
+ [data-theme="dark"] .mljr-loading-overlay {
227
+ background: rgba(28, 25, 23, 0.8);
228
+ }
229
+
230
+ /* Loading text */
231
+ .mljr-spinner-text {
232
+ display: flex;
233
+ flex-direction: column;
234
+ align-items: center;
235
+ gap: var(--mljr-space-3);
236
+ }
237
+
238
+ .mljr-spinner-label {
239
+ font-family: var(--mljr-font-sans);
240
+ font-size: var(--mljr-text-sm);
241
+ color: var(--mljr-text-secondary);
242
+ }
243
+
244
+ /* Button loading state helper */
245
+ .mljr-btn-loading {
246
+ position: relative;
247
+ pointer-events: none;
248
+ }
249
+
250
+ .mljr-btn-loading .mljr-spinner {
251
+ position: absolute;
252
+ top: 50%;
253
+ left: 50%;
254
+ transform: translate(-50%, -50%);
255
+ }
256
+
257
+ .mljr-btn-loading > *:not(.mljr-spinner) {
258
+ visibility: hidden;
259
+ }