mljr-css 1.0.14 → 1.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 (54) hide show
  1. package/dist/mljr.css +5573 -2766
  2. package/dist/mljr.min.css +2 -3
  3. package/package.json +1 -1
  4. package/src/components/alert-dialog.css +129 -0
  5. package/src/components/alert.css +41 -22
  6. package/src/components/animated-headline.css +118 -0
  7. package/src/components/audio-visualizer.css +96 -0
  8. package/src/components/autocomplete.css +143 -0
  9. package/src/components/avatar.css +66 -0
  10. package/src/components/badge.css +82 -41
  11. package/src/components/breadcrumb.css +3 -0
  12. package/src/components/button.css +80 -58
  13. package/src/components/calendar.css +169 -0
  14. package/src/components/card.css +139 -92
  15. package/src/components/chart.css +194 -0
  16. package/src/components/checkbox.css +1 -1
  17. package/src/components/chip.css +33 -18
  18. package/src/components/context-menu.css +118 -0
  19. package/src/components/cookie-banner.css +285 -0
  20. package/src/components/diff-viewer.css +199 -0
  21. package/src/components/dock.css +211 -0
  22. package/src/components/drop-zone.css +257 -0
  23. package/src/components/footer.css +51 -5
  24. package/src/components/gauge.css +63 -0
  25. package/src/components/image-compare.css +141 -0
  26. package/src/components/infinite-scroll.css +36 -0
  27. package/src/components/inview.css +118 -0
  28. package/src/components/lazy-image.css +60 -0
  29. package/src/components/legal-page.css +346 -0
  30. package/src/components/map-embed.css +92 -0
  31. package/src/components/marquee.css +112 -0
  32. package/src/components/navbar.css +357 -0
  33. package/src/components/navigation-rail.css +220 -0
  34. package/src/components/notification-center.css +306 -0
  35. package/src/components/number-input.css +134 -0
  36. package/src/components/number-ticker.css +65 -0
  37. package/src/components/pagination.css +59 -0
  38. package/src/components/pdf-viewer.css +163 -0
  39. package/src/components/pin-input.css +153 -0
  40. package/src/components/resizable.css +82 -0
  41. package/src/components/rich-text-editor.css +216 -0
  42. package/src/components/table-of-content.css +107 -0
  43. package/src/components/table.css +116 -0
  44. package/src/components/tabs.css +93 -3
  45. package/src/components/toast.css +30 -0
  46. package/src/components/tooltip.css +8 -0
  47. package/src/components/tree-view.css +270 -0
  48. package/src/components/turnstile.css +113 -0
  49. package/src/components/video-player.css +266 -0
  50. package/src/index.css +35 -1
  51. package/src/layout/footer.css +2 -2
  52. package/src/layout/navbar.css +187 -113
  53. package/src/layout/sidebar.css +27 -0
  54. package/src/themes/variables.css +146 -97
@@ -18,7 +18,7 @@
18
18
  height: 1.25rem;
19
19
  background-color: var(--mljr-bg);
20
20
  border: none;
21
- border-radius: var(--mljr-radius-sm);
21
+ border-radius: 5px;
22
22
  cursor: pointer;
23
23
  transition: all var(--mljr-transition-fast);
24
24
  flex-shrink: 0;
@@ -29,49 +29,55 @@
29
29
  .mljr-chip-primary {
30
30
  background: var(--mljr-primary-100);
31
31
  color: var(--mljr-primary-700);
32
- box-shadow:
33
- 2px 2px 4px rgba(249, 115, 22, 0.15),
34
- -2px -2px 4px rgba(255, 255, 255, 0.8);
32
+ box-shadow:
33
+ 2px 2px 4px rgba(249, 115, 22, 0.18),
34
+ inset -2px -2px 4px rgba(100, 60, 30, 0.08),
35
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
35
36
  }
36
37
 
37
38
  .mljr-chip-secondary {
38
39
  background: var(--mljr-secondary-100);
39
40
  color: var(--mljr-secondary-700);
40
- box-shadow:
41
+ box-shadow:
41
42
  2px 2px 4px rgba(168, 85, 247, 0.15),
42
- -2px -2px 4px rgba(255, 255, 255, 0.8);
43
+ inset -2px -2px 4px rgba(80, 30, 140, 0.06),
44
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
43
45
  }
44
46
 
45
47
  .mljr-chip-accent {
46
48
  background: var(--mljr-accent-100);
47
49
  color: var(--mljr-accent-700);
48
- box-shadow:
50
+ box-shadow:
49
51
  2px 2px 4px rgba(20, 184, 166, 0.15),
50
- -2px -2px 4px rgba(255, 255, 255, 0.8);
52
+ inset -2px -2px 4px rgba(5, 80, 70, 0.06),
53
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
51
54
  }
52
55
 
53
56
  .mljr-chip-success {
54
57
  background: rgba(16, 185, 129, 0.15);
55
58
  color: var(--mljr-success-dark);
56
- box-shadow:
57
- 2px 2px 4px rgba(16, 185, 129, 0.1),
58
- -2px -2px 4px rgba(255, 255, 255, 0.8);
59
+ box-shadow:
60
+ 2px 2px 4px rgba(16, 185, 129, 0.12),
61
+ inset -2px -2px 4px rgba(5, 80, 50, 0.06),
62
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
59
63
  }
60
64
 
61
65
  .mljr-chip-warning {
62
66
  background: rgba(245, 158, 11, 0.15);
63
67
  color: var(--mljr-warning-dark);
64
- box-shadow:
65
- 2px 2px 4px rgba(245, 158, 11, 0.1),
66
- -2px -2px 4px rgba(255, 255, 255, 0.8);
68
+ box-shadow:
69
+ 2px 2px 4px rgba(245, 158, 11, 0.12),
70
+ inset -2px -2px 4px rgba(120, 80, 5, 0.06),
71
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
67
72
  }
68
73
 
69
74
  .mljr-chip-error {
70
75
  background: rgba(239, 68, 68, 0.15);
71
76
  color: var(--mljr-error-dark);
72
- box-shadow:
73
- 2px 2px 4px rgba(239, 68, 68, 0.1),
74
- -2px -2px 4px rgba(255, 255, 255, 0.8);
77
+ box-shadow:
78
+ 2px 2px 4px rgba(239, 68, 68, 0.12),
79
+ inset -2px -2px 4px rgba(120, 30, 30, 0.06),
80
+ inset 2px 2px 4px rgba(255, 255, 255, 0.45);
75
81
  }
76
82
 
77
83
  .mljr-chip-outline {
@@ -183,21 +189,30 @@
183
189
  [data-theme="dark"] .mljr-chip-primary {
184
190
  background: rgba(249, 115, 22, 0.2);
185
191
  color: var(--mljr-primary-300);
186
- box-shadow:
192
+ box-shadow:
187
193
  2px 2px 4px rgba(0, 0, 0, 0.3),
188
- -2px -2px 4px rgba(68, 64, 60, 0.2);
194
+ inset -2px -2px 4px rgba(0, 0, 0, 0.15),
195
+ inset 2px 2px 4px rgba(255, 200, 150, 0.06);
189
196
  }
190
197
 
191
198
  .dark .mljr-chip-secondary,
192
199
  [data-theme="dark"] .mljr-chip-secondary {
193
200
  background: rgba(168, 85, 247, 0.2);
194
201
  color: var(--mljr-secondary-300);
202
+ box-shadow:
203
+ 2px 2px 4px rgba(0, 0, 0, 0.3),
204
+ inset -2px -2px 4px rgba(0, 0, 0, 0.15),
205
+ inset 2px 2px 4px rgba(255, 200, 150, 0.06);
195
206
  }
196
207
 
197
208
  .dark .mljr-chip-accent,
198
209
  [data-theme="dark"] .mljr-chip-accent {
199
210
  background: rgba(20, 184, 166, 0.2);
200
211
  color: var(--mljr-accent-300);
212
+ box-shadow:
213
+ 2px 2px 4px rgba(0, 0, 0, 0.3),
214
+ inset -2px -2px 4px rgba(0, 0, 0, 0.15),
215
+ inset 2px 2px 4px rgba(255, 200, 150, 0.06);
201
216
  }
202
217
 
203
218
  .dark .mljr-chip-outline,
@@ -0,0 +1,118 @@
1
+ /* ============================================
2
+ MLJR CSS Framework - Context Menu Component
3
+ Claymorphism: Right-click contextual menu
4
+ ============================================ */
5
+
6
+ .mljr-context-menu-trigger {
7
+ display: contents;
8
+ }
9
+
10
+ .mljr-context-menu {
11
+ position: fixed;
12
+ z-index: var(--mljr-z-dropdown, 1000);
13
+ min-width: 13rem;
14
+ padding: var(--mljr-space-2);
15
+ background: var(--mljr-frosted-bg-strong, var(--mljr-bg));
16
+ backdrop-filter: blur(12px);
17
+ -webkit-backdrop-filter: blur(12px);
18
+ border: 1px solid var(--mljr-frosted-border, var(--mljr-border));
19
+ border-radius: var(--mljr-radius-lg);
20
+ box-shadow: var(--mljr-clay-shadow-lg);
21
+ font-family: var(--mljr-font-sans);
22
+ font-size: var(--mljr-text-sm);
23
+ animation: mljr-context-menu-in 0.12s ease-out;
24
+ }
25
+
26
+ @keyframes mljr-context-menu-in {
27
+ from {
28
+ opacity: 0;
29
+ transform: scale(0.92);
30
+ }
31
+ to {
32
+ opacity: 1;
33
+ transform: scale(1);
34
+ }
35
+ }
36
+
37
+ .mljr-context-menu-item {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--mljr-space-2);
41
+ width: 100%;
42
+ padding: var(--mljr-space-2) var(--mljr-space-3);
43
+ color: var(--mljr-text);
44
+ background: none;
45
+ border: none;
46
+ border-radius: var(--mljr-radius-md);
47
+ text-align: left;
48
+ cursor: pointer;
49
+ transition: all var(--mljr-transition-fast);
50
+ font-family: inherit;
51
+ font-size: inherit;
52
+ line-height: 1.4;
53
+ }
54
+
55
+ .mljr-context-menu-item:hover:not(:disabled) {
56
+ background: var(--mljr-bg-secondary);
57
+ color: var(--mljr-primary-600);
58
+ }
59
+
60
+ .mljr-context-menu-item:focus-visible {
61
+ outline: none;
62
+ background: var(--mljr-bg-secondary);
63
+ color: var(--mljr-primary-600);
64
+ }
65
+
66
+ .mljr-context-menu-item:disabled,
67
+ .mljr-context-menu-item-disabled {
68
+ opacity: 0.4;
69
+ cursor: not-allowed;
70
+ pointer-events: none;
71
+ }
72
+
73
+ .mljr-context-menu-item-danger {
74
+ color: var(--mljr-error);
75
+ }
76
+
77
+ .mljr-context-menu-item-danger:hover:not(:disabled) {
78
+ background: rgba(239, 68, 68, 0.1);
79
+ color: var(--mljr-error);
80
+ }
81
+
82
+ .mljr-context-menu-item-icon {
83
+ width: 1rem;
84
+ height: 1rem;
85
+ flex-shrink: 0;
86
+ opacity: 0.7;
87
+ }
88
+
89
+ .mljr-context-menu-item-label {
90
+ flex: 1;
91
+ }
92
+
93
+ .mljr-context-menu-item-shortcut {
94
+ margin-left: auto;
95
+ font-size: var(--mljr-text-xs);
96
+ color: var(--mljr-text-muted);
97
+ white-space: nowrap;
98
+ }
99
+
100
+ .mljr-context-menu-divider {
101
+ height: 1px;
102
+ margin: var(--mljr-space-1) var(--mljr-space-1);
103
+ background: var(--mljr-border);
104
+ }
105
+
106
+ /* Dark mode */
107
+ .dark .mljr-context-menu,
108
+ [data-theme="dark"] .mljr-context-menu {
109
+ background: var(--mljr-bg-secondary);
110
+ border-color: var(--mljr-border);
111
+ box-shadow: var(--mljr-clay-shadow-lg);
112
+ }
113
+
114
+ .dark .mljr-context-menu-item:hover:not(:disabled),
115
+ [data-theme="dark"] .mljr-context-menu-item:hover:not(:disabled) {
116
+ background: var(--mljr-bg-tertiary);
117
+ color: var(--mljr-primary-400);
118
+ }
@@ -0,0 +1,285 @@
1
+ /* ============================================
2
+ Cookie Banner — GDPR consent UI
3
+ ============================================ */
4
+
5
+ /* --- Banner bar (bottom / top) --- */
6
+ .mljr-cookie-banner {
7
+ position: fixed;
8
+ bottom: 0;
9
+ left: 0;
10
+ right: 0;
11
+ z-index: 900;
12
+ padding: var(--mljr-space-4) var(--mljr-space-6);
13
+ background: var(--mljr-surface);
14
+ border-top: 1px solid var(--mljr-border);
15
+ box-shadow: var(--mljr-clay-shadow);
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ align-items: center;
19
+ gap: var(--mljr-space-4);
20
+ animation: mljr-cookie-slide-up 0.3s ease-out;
21
+ }
22
+
23
+ .mljr-cookie-banner--top {
24
+ bottom: auto;
25
+ top: 0;
26
+ border-top: none;
27
+ border-bottom: 1px solid var(--mljr-border);
28
+ animation: mljr-cookie-slide-down 0.3s ease-out;
29
+ }
30
+
31
+ @keyframes mljr-cookie-slide-up {
32
+ from { transform: translateY(100%); opacity: 0; }
33
+ to { transform: translateY(0); opacity: 1; }
34
+ }
35
+
36
+ @keyframes mljr-cookie-slide-down {
37
+ from { transform: translateY(-100%); opacity: 0; }
38
+ to { transform: translateY(0); opacity: 1; }
39
+ }
40
+
41
+ .mljr-cookie-banner__content {
42
+ flex: 1;
43
+ min-width: 0;
44
+ }
45
+
46
+ .mljr-cookie-banner__title {
47
+ font-size: var(--mljr-text-base);
48
+ font-weight: 700;
49
+ color: var(--mljr-text);
50
+ margin: 0 0 var(--mljr-space-1) 0;
51
+ }
52
+
53
+ .mljr-cookie-banner__desc {
54
+ font-size: var(--mljr-text-sm);
55
+ color: var(--mljr-text-muted);
56
+ margin: 0;
57
+ line-height: 1.5;
58
+ }
59
+
60
+ .mljr-cookie-banner__actions {
61
+ display: flex;
62
+ flex-wrap: wrap;
63
+ gap: var(--mljr-space-2);
64
+ align-items: center;
65
+ flex-shrink: 0;
66
+ }
67
+
68
+ /* --- Settings overlay --- */
69
+ .mljr-cookie-overlay {
70
+ position: fixed;
71
+ inset: 0;
72
+ z-index: 950;
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ padding: var(--mljr-space-4);
77
+ background: rgba(0, 0, 0, 0.45);
78
+ backdrop-filter: blur(4px);
79
+ animation: mljr-fade-in 0.2s ease;
80
+ }
81
+
82
+ @keyframes mljr-fade-in {
83
+ from { opacity: 0; }
84
+ to { opacity: 1; }
85
+ }
86
+
87
+ .mljr-cookie-settings {
88
+ background: var(--mljr-surface);
89
+ border-radius: var(--mljr-radius-lg);
90
+ box-shadow: var(--mljr-clay-shadow-lg);
91
+ padding: var(--mljr-space-6);
92
+ width: 100%;
93
+ max-width: 560px;
94
+ max-height: 80vh;
95
+ overflow-y: auto;
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: var(--mljr-space-5);
99
+ }
100
+
101
+ .mljr-cookie-settings__header {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: var(--mljr-space-3);
105
+ }
106
+
107
+ .mljr-cookie-settings__back {
108
+ background: none;
109
+ border: none;
110
+ cursor: pointer;
111
+ color: var(--mljr-text-muted);
112
+ padding: var(--mljr-space-1);
113
+ border-radius: var(--mljr-radius-sm);
114
+ display: flex;
115
+ align-items: center;
116
+ transition: color 0.15s, background 0.15s;
117
+ }
118
+ .mljr-cookie-settings__back:hover {
119
+ color: var(--mljr-text);
120
+ background: var(--mljr-surface-alt);
121
+ }
122
+
123
+ .mljr-cookie-settings__title {
124
+ font-size: var(--mljr-text-lg);
125
+ font-weight: 700;
126
+ color: var(--mljr-text);
127
+ margin: 0;
128
+ }
129
+
130
+ /* --- Category list --- */
131
+ .mljr-cookie-categories {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: var(--mljr-space-3);
135
+ }
136
+
137
+ .mljr-cookie-category {
138
+ border: 1px solid var(--mljr-border);
139
+ border-radius: var(--mljr-radius-md);
140
+ padding: var(--mljr-space-4);
141
+ background: var(--mljr-surface-alt);
142
+ display: flex;
143
+ align-items: flex-start;
144
+ gap: var(--mljr-space-4);
145
+ }
146
+
147
+ .mljr-cookie-category__info {
148
+ flex: 1;
149
+ min-width: 0;
150
+ }
151
+
152
+ .mljr-cookie-category__name {
153
+ font-size: var(--mljr-text-sm);
154
+ font-weight: 600;
155
+ color: var(--mljr-text);
156
+ margin: 0 0 var(--mljr-space-1) 0;
157
+ display: flex;
158
+ align-items: center;
159
+ gap: var(--mljr-space-2);
160
+ }
161
+
162
+ .mljr-cookie-category__required-badge {
163
+ font-size: var(--mljr-text-xs);
164
+ font-weight: 500;
165
+ color: var(--mljr-primary-600);
166
+ background: var(--mljr-primary-100);
167
+ padding: 1px 6px;
168
+ border-radius: var(--mljr-radius-full);
169
+ }
170
+
171
+ .mljr-cookie-category__desc {
172
+ font-size: var(--mljr-text-xs);
173
+ color: var(--mljr-text-muted);
174
+ margin: 0;
175
+ line-height: 1.5;
176
+ }
177
+
178
+ /* Toggle (reuse switch-like pattern) */
179
+ .mljr-cookie-toggle {
180
+ flex-shrink: 0;
181
+ position: relative;
182
+ width: 40px;
183
+ height: 22px;
184
+ }
185
+
186
+ .mljr-cookie-toggle input {
187
+ opacity: 0;
188
+ width: 0;
189
+ height: 0;
190
+ position: absolute;
191
+ }
192
+
193
+ .mljr-cookie-toggle__track {
194
+ position: absolute;
195
+ inset: 0;
196
+ border-radius: var(--mljr-radius-full);
197
+ background: var(--mljr-border);
198
+ cursor: pointer;
199
+ transition: background 0.2s;
200
+ }
201
+
202
+ .mljr-cookie-toggle input:checked ~ .mljr-cookie-toggle__track {
203
+ background: var(--mljr-primary-500);
204
+ }
205
+
206
+ .mljr-cookie-toggle input:disabled ~ .mljr-cookie-toggle__track {
207
+ opacity: 0.6;
208
+ cursor: not-allowed;
209
+ }
210
+
211
+ .mljr-cookie-toggle__thumb {
212
+ position: absolute;
213
+ top: 3px;
214
+ left: 3px;
215
+ width: 16px;
216
+ height: 16px;
217
+ border-radius: var(--mljr-radius-full);
218
+ background: #fff;
219
+ box-shadow: 0 1px 3px rgba(0,0,0,0.2);
220
+ pointer-events: none;
221
+ transition: transform 0.2s;
222
+ }
223
+
224
+ .mljr-cookie-toggle input:checked ~ .mljr-cookie-toggle__track .mljr-cookie-toggle__thumb {
225
+ transform: translateX(18px);
226
+ }
227
+
228
+ /* --- Settings footer --- */
229
+ .mljr-cookie-settings__footer {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ gap: var(--mljr-space-2);
233
+ justify-content: flex-end;
234
+ padding-top: var(--mljr-space-3);
235
+ border-top: 1px solid var(--mljr-border);
236
+ }
237
+
238
+ /* --- Floating settings button (bottom-left) --- */
239
+ .mljr-cookie-fab {
240
+ position: fixed;
241
+ bottom: var(--mljr-space-4);
242
+ left: var(--mljr-space-4);
243
+ z-index: 800;
244
+ width: 44px;
245
+ height: 44px;
246
+ border-radius: var(--mljr-radius-full);
247
+ background: var(--mljr-surface);
248
+ border: 1px solid var(--mljr-border);
249
+ box-shadow: var(--mljr-clay-shadow-sm);
250
+ display: flex;
251
+ align-items: center;
252
+ justify-content: center;
253
+ cursor: pointer;
254
+ color: var(--mljr-text-muted);
255
+ transition: box-shadow 0.2s, color 0.2s, transform 0.15s;
256
+ }
257
+
258
+ .mljr-cookie-fab:hover {
259
+ box-shadow: var(--mljr-clay-shadow);
260
+ color: var(--mljr-text);
261
+ transform: translateY(-2px);
262
+ }
263
+
264
+ /* --- Dark mode --- */
265
+ .dark .mljr-cookie-category__required-badge {
266
+ background: color-mix(in srgb, var(--mljr-primary-600) 20%, transparent);
267
+ color: var(--mljr-primary-400);
268
+ }
269
+
270
+ /* --- Responsive --- */
271
+ @media (max-width: 640px) {
272
+ .mljr-cookie-banner {
273
+ flex-direction: column;
274
+ align-items: stretch;
275
+ padding: var(--mljr-space-4);
276
+ }
277
+
278
+ .mljr-cookie-banner__actions {
279
+ flex-direction: column;
280
+ }
281
+
282
+ .mljr-cookie-settings {
283
+ max-height: 90vh;
284
+ }
285
+ }
@@ -0,0 +1,199 @@
1
+ /* ============================================
2
+ DiffViewer - Code/text diff display
3
+ ============================================ */
4
+
5
+ .mljr-diff {
6
+ border-radius: var(--mljr-radius-md);
7
+ border: 1px solid var(--mljr-border);
8
+ overflow: hidden;
9
+ font-family: var(--mljr-font-mono);
10
+ font-size: 0.8125rem;
11
+ line-height: 1.65;
12
+ background: var(--mljr-surface);
13
+ }
14
+
15
+ /* Header bar */
16
+ .mljr-diff-header {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ padding: 0.5rem 0.875rem;
21
+ background: var(--mljr-surface-2);
22
+ border-bottom: 1px solid var(--mljr-border);
23
+ font-family: var(--mljr-font-body);
24
+ font-size: 0.8125rem;
25
+ flex-wrap: wrap;
26
+ gap: 0.5rem;
27
+ }
28
+
29
+ .mljr-diff-title {
30
+ font-weight: 600;
31
+ color: var(--mljr-text);
32
+ }
33
+
34
+ .mljr-diff-stats {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 0.625rem;
38
+ }
39
+
40
+ .mljr-diff-stat-added {
41
+ color: #16a34a;
42
+ font-weight: 600;
43
+ }
44
+
45
+ .mljr-diff-stat-removed {
46
+ color: #dc2626;
47
+ font-weight: 600;
48
+ }
49
+
50
+ .dark .mljr-diff-stat-added { color: #4ade80; }
51
+ .dark .mljr-diff-stat-removed { color: #f87171; }
52
+
53
+ /* Mode toggle tabs */
54
+ .mljr-diff-tabs {
55
+ display: flex;
56
+ gap: 0.125rem;
57
+ background: var(--mljr-surface-3, var(--mljr-surface));
58
+ border: 1px solid var(--mljr-border);
59
+ border-radius: var(--mljr-radius-sm);
60
+ padding: 2px;
61
+ }
62
+
63
+ .mljr-diff-tab {
64
+ padding: 0.2rem 0.6rem;
65
+ border-radius: calc(var(--mljr-radius-sm) - 2px);
66
+ font-size: 0.75rem;
67
+ cursor: pointer;
68
+ border: none;
69
+ background: transparent;
70
+ color: var(--mljr-text-muted);
71
+ transition: background 150ms, color 150ms;
72
+ font-family: var(--mljr-font-body);
73
+ }
74
+
75
+ .mljr-diff-tab:hover { background: var(--mljr-surface-2); }
76
+
77
+ .mljr-diff-tab-active {
78
+ background: var(--mljr-surface);
79
+ color: var(--mljr-text);
80
+ font-weight: 600;
81
+ box-shadow: 0 1px 3px rgba(0,0,0,.08);
82
+ }
83
+
84
+ /* ── Unified (inline) mode ── */
85
+ .mljr-diff-unified {
86
+ overflow-x: auto;
87
+ }
88
+
89
+ .mljr-diff-line {
90
+ display: flex;
91
+ align-items: stretch;
92
+ min-width: max-content;
93
+ }
94
+
95
+ .mljr-diff-line-added { background: rgba(22, 163, 74, 0.10); }
96
+ .mljr-diff-line-removed { background: rgba(220, 38, 38, 0.10); }
97
+ .dark .mljr-diff-line-added { background: rgba(22, 163, 74, 0.14); }
98
+ .dark .mljr-diff-line-removed { background: rgba(220, 38, 38, 0.14); }
99
+
100
+ .mljr-diff-gutter {
101
+ min-width: 2.5rem;
102
+ text-align: right;
103
+ padding: 0 0.5rem;
104
+ color: var(--mljr-text-muted);
105
+ user-select: none;
106
+ flex-shrink: 0;
107
+ border-right: 1px solid var(--mljr-border);
108
+ font-size: 0.75rem;
109
+ line-height: inherit;
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: flex-end;
113
+ }
114
+
115
+ .mljr-diff-sign {
116
+ width: 1.25rem;
117
+ text-align: center;
118
+ flex-shrink: 0;
119
+ font-weight: 700;
120
+ line-height: inherit;
121
+ display: flex;
122
+ align-items: center;
123
+ justify-content: center;
124
+ }
125
+
126
+ .mljr-diff-line-added .mljr-diff-sign { color: #16a34a; }
127
+ .mljr-diff-line-removed .mljr-diff-sign { color: #dc2626; }
128
+ .dark .mljr-diff-line-added .mljr-diff-sign { color: #4ade80; }
129
+ .dark .mljr-diff-line-removed .mljr-diff-sign { color: #f87171; }
130
+
131
+ .mljr-diff-code {
132
+ padding: 0 0.875rem;
133
+ white-space: pre;
134
+ flex: 1;
135
+ line-height: inherit;
136
+ display: flex;
137
+ align-items: center;
138
+ overflow: hidden;
139
+ }
140
+
141
+ /* ── Split (side-by-side) mode ── */
142
+ .mljr-diff-split {
143
+ display: grid;
144
+ grid-template-columns: 1fr 1fr;
145
+ overflow-x: auto;
146
+ }
147
+
148
+ .mljr-diff-split-col {
149
+ overflow: hidden;
150
+ min-width: 0;
151
+ }
152
+
153
+ .mljr-diff-split-col + .mljr-diff-split-col {
154
+ border-left: 2px solid var(--mljr-border);
155
+ }
156
+
157
+ .mljr-diff-split-label {
158
+ padding: 0.375rem 0.875rem;
159
+ background: var(--mljr-surface-2);
160
+ border-bottom: 1px solid var(--mljr-border);
161
+ font-family: var(--mljr-font-body);
162
+ font-weight: 600;
163
+ font-size: 0.75rem;
164
+ color: var(--mljr-text-muted);
165
+ text-transform: uppercase;
166
+ letter-spacing: 0.04em;
167
+ }
168
+
169
+ /* Empty / identical */
170
+ .mljr-diff-empty {
171
+ padding: 2rem;
172
+ text-align: center;
173
+ color: var(--mljr-text-muted);
174
+ font-family: var(--mljr-font-body);
175
+ }
176
+
177
+ /* ── Syntax Highlighting Tokens ── */
178
+ .mljr-diff-token-keyword { color: #c792ea; font-weight: 600; }
179
+ .mljr-diff-token-string { color: #c3e88d; }
180
+ .mljr-diff-token-comment { color: #546e7a; font-style: italic; }
181
+ .mljr-diff-token-number { color: #f78c6c; }
182
+ .mljr-diff-token-function { color: #82aaff; }
183
+ .mljr-diff-token-type { color: #ffcb6b; }
184
+ .mljr-diff-token-operator { color: #89ddff; }
185
+ .mljr-diff-token-tag { color: #f07178; }
186
+ .mljr-diff-token-attr { color: #ffcb6b; }
187
+ .mljr-diff-token-punct { color: #89ddff; }
188
+
189
+ /* Light mode overrides */
190
+ :root:not(.dark) .mljr-diff-token-keyword { color: #7c3aed; }
191
+ :root:not(.dark) .mljr-diff-token-string { color: #16a34a; }
192
+ :root:not(.dark) .mljr-diff-token-comment { color: #78716c; }
193
+ :root:not(.dark) .mljr-diff-token-number { color: #c2410c; }
194
+ :root:not(.dark) .mljr-diff-token-function { color: #1d4ed8; }
195
+ :root:not(.dark) .mljr-diff-token-type { color: #b45309; }
196
+ :root:not(.dark) .mljr-diff-token-operator { color: #0891b2; }
197
+ :root:not(.dark) .mljr-diff-token-tag { color: #dc2626; }
198
+ :root:not(.dark) .mljr-diff-token-attr { color: #92400e; }
199
+ :root:not(.dark) .mljr-diff-token-punct { color: #0891b2; }