minecodex 2.0.54 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +90 -26
  2. package/apps/dashboard/app.js +20 -14
  3. package/apps/dashboard/assets/chevron-left.svg +13 -0
  4. package/apps/dashboard/assets/chevron-right.svg +13 -0
  5. package/apps/dashboard/assets/feature-showcase.js +185 -0
  6. package/apps/dashboard/assets/pause.svg +14 -0
  7. package/apps/dashboard/assets/play.svg +13 -0
  8. package/apps/dashboard/assets/previews/composer-expand.jpg +0 -0
  9. package/apps/dashboard/assets/previews/composer-expand.mp4 +0 -0
  10. package/apps/dashboard/assets/previews/file-navigation.jpg +0 -0
  11. package/apps/dashboard/assets/previews/file-navigation.mp4 +0 -0
  12. package/apps/dashboard/assets/previews/files-auto-refresh.jpg +0 -0
  13. package/apps/dashboard/assets/previews/files-auto-refresh.mp4 +0 -0
  14. package/apps/dashboard/assets/previews/images.jpg +0 -0
  15. package/apps/dashboard/assets/previews/images.mp4 +0 -0
  16. package/apps/dashboard/assets/previews/manifest.json +67 -1
  17. package/apps/dashboard/assets/previews/markdown-reading.jpg +0 -0
  18. package/apps/dashboard/assets/previews/markdown-reading.mp4 +0 -0
  19. package/apps/dashboard/assets/previews/mermaid-diagrams.jpg +0 -0
  20. package/apps/dashboard/assets/previews/mermaid-diagrams.mp4 +0 -0
  21. package/apps/dashboard/assets/previews/model-slider.jpg +0 -0
  22. package/apps/dashboard/assets/previews/model-slider.mp4 +0 -0
  23. package/apps/dashboard/assets/previews/notes.jpg +0 -0
  24. package/apps/dashboard/assets/previews/notes.mp4 +0 -0
  25. package/apps/dashboard/assets/previews/quick-chat.jpg +0 -0
  26. package/apps/dashboard/assets/previews/quick-chat.mp4 +0 -0
  27. package/apps/dashboard/assets/previews/session-status.jpg +0 -0
  28. package/apps/dashboard/assets/previews/session-status.mp4 +0 -0
  29. package/apps/dashboard/assets/previews/sidebar-focus.jpg +0 -0
  30. package/apps/dashboard/assets/previews/sidebar-focus.mp4 +0 -0
  31. package/apps/dashboard/assets/previews/sites.jpg +0 -0
  32. package/apps/dashboard/assets/previews/sites.mp4 +0 -0
  33. package/apps/dashboard/assets/previews/usage-meter.jpg +0 -0
  34. package/apps/dashboard/assets/previews/usage-meter.mp4 +0 -0
  35. package/apps/dashboard/index.html +26 -2
  36. package/apps/dashboard/styles.css +58 -39
  37. package/assets/readme/hero-dark.svg +50 -0
  38. package/assets/readme/hero.svg +36 -79
  39. package/features/images/src/adapters/codex/rspack-modules.mjs +9 -3
  40. package/features/images/src/library-prompt-source.mjs +2 -2
  41. package/features/mermaid-diagrams/assets/qv-template.json +1 -1
  42. package/features/mermaid-diagrams/src/mermaid/qv-polish.css +6 -2
  43. package/features/notes/codex-feature.json +1 -0
  44. package/features/quick-chat/src/adapters/codex/renderer.mjs +3 -1
  45. package/package.json +3 -3
  46. package/packages/cli/src/config.mjs +1 -2
  47. package/packages/cli/src/control-server.mjs +1 -1
  48. package/packages/plugin/assets/app.js +35 -35
  49. package/packages/plugin/assets/prompts.js +1 -1
  50. package/packages/runtime-host/src/codex-cdp.mjs +0 -7
  51. package/packages/runtime-host/src/codex-injection.mjs +50 -2114
  52. package/packages/runtime-host/src/codex-runtime.mjs +4 -203
  53. package/packages/runtime-host/src/feature-registry.mjs +10 -91
  54. package/packages/runtime-host/src/main.mjs +0 -1
  55. package/packages/ui/src/native/tokens.mjs +0 -28
  56. package/apps/dashboard/assets/feature-previews.js +0 -206
  57. package/features/images/src/adapters/codex/cloud-import.mjs +0 -52
  58. package/features/images/src/backend/cloud-library.mjs +0 -12
  59. package/features/images/src/chatgpt-image-source-page.mjs +0 -207
  60. package/features/images/src/chatgpt-image-source.mjs +0 -42
  61. package/features/images/src/http-server.mjs +0 -487
  62. package/features/images/src/main.mjs +0 -52
  63. package/features/images/src/save-as.mjs +0 -69
  64. package/features/images/web/app.js +0 -1780
  65. package/features/images/web/i18n.mjs +0 -132
  66. package/features/images/web/index.html +0 -187
  67. package/features/images/web/styles.css +0 -1114
  68. package/packages/runtime-host/src/host-actions.mjs +0 -221
@@ -1,1114 +0,0 @@
1
- :root {
2
- color-scheme: light;
3
- --mcx-codex-base-accent: #339cff;
4
- --mcx-color-token-main-surface-primary: #fff;
5
- --mcx-color-token-bg-primary: #f9f9f9;
6
- --mcx-color-token-bg-secondary: color-mix(in srgb, #f9f9f9 92%, transparent);
7
- --mcx-color-surface-tertiary: #f0f0f0;
8
- --mcx-color-surface-elevated-secondary: #fff;
9
- --mcx-color-border-subtle: color-mix(in oklab, #1a1c1f 4%, transparent);
10
- --mcx-color-background-primary-ghost-hover: color-mix(in oklab, #1a1c1f 5%, transparent);
11
- --mcx-color-chart-blue: #339cff;
12
- --mcx-color-text-inverse: #fff;
13
- --mcx-color-background-elevated-primary-opaque: #fff;
14
- --mcx-color-background-panel: #f5f5f5;
15
- --mcx-color-background-primary-solid: #1a1c1f;
16
- --mcx-color-text-primary-solid: #fff;
17
- --mcx-color-background-button-secondary: color-mix(in oklab, #1a1c1f 5%, transparent);
18
- --mcx-color-background-button-secondary-hover: color-mix(in oklab, #1a1c1f 8%, transparent);
19
- --mcx-color-background-button-tertiary-hover: color-mix(in oklab, #1a1c1f 7%, transparent);
20
- --mcx-color-text-foreground: #1a1c1f;
21
- --mcx-color-text-foreground-secondary: color-mix(in oklab, #1a1c1f 70%, transparent);
22
- --mcx-color-text-foreground-tertiary: color-mix(in oklab, #1a1c1f 50%, transparent);
23
- --mcx-color-icon-tertiary: rgb(13 13 13 / 48.4%);
24
- --mcx-color-text-accent: #087ccf;
25
- --mcx-color-border: color-mix(in oklab, #1a1c1f 8%, transparent);
26
- --mcx-color-border-heavy: color-mix(in oklab, #1a1c1f 14%, transparent);
27
- --mcx-color-border-focus: #339cff;
28
- --mcx-color-token-scrollbar-slider-background: var(--mcx-color-border);
29
- --mcx-color-token-scrollbar-slider-hover-background: var(--mcx-color-border-heavy);
30
- --mcx-color-token-scrollbar-slider-active-background: var(--mcx-color-border-heavy);
31
- --mcx-color-token-list-hover-background: color-mix(in oklab, #1a1c1f 5%, transparent);
32
- --mcx-color-token-input-background: #f3f3f3;
33
- --mcx-color-token-input-border: color-mix(in oklab, #1a1c1f 14%, transparent);
34
- --mcx-color-token-input-foreground: #1a1c1f;
35
- --mcx-color-token-input-placeholder-foreground: color-mix(in oklab, #1a1c1f 50%, transparent);
36
- --mcx-font-sans-default: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
37
- --mcx-default-mono-font-family: ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, monospace;
38
- --mcx-text-heading-md: 20px;
39
- --text-heading-sm: 18px;
40
- --mcx-text-base: 14px;
41
- --mcx-text-sm: 13px;
42
- --mcx-text-xs: 12px;
43
- --mcx-radius-md: 10px;
44
- --mcx-radius-lg: 12.5px;
45
- --mcx-radius-xl: 15px;
46
- --mcx-shadow-xl: 0 8px 30px rgb(0 0 0 / 14%);
47
- --library-gutter: clamp(20px, 4vw, 56px);
48
- --library-card-radius: 16px;
49
- --library-canvas: color-mix(in srgb, var(--mcx-color-token-main-surface-primary) 98.8%, var(--mcx-color-text-foreground));
50
- --library-card-border: light-dark(rgb(0 0 0 / 5%), var(--mcx-color-border-subtle));
51
- --library-card-shadow: 0 4px 16px 0 light-dark(rgb(0 0 0 / 5%), rgb(0 0 0 / 16%));
52
- --library-detail-gutter: clamp(20px, 3vw, 40px);
53
- font-family: var(--mcx-font-sans-default);
54
- background: var(--mcx-color-token-main-surface-primary);
55
- color: var(--mcx-color-text-foreground);
56
- }
57
-
58
- :root[data-theme="dark"] {
59
- color-scheme: dark;
60
- --mcx-color-token-main-surface-primary: #181818;
61
- --mcx-color-token-bg-primary: #141414;
62
- --mcx-color-token-bg-secondary: color-mix(in srgb, #141414 92%, transparent);
63
- --mcx-color-surface-tertiary: rgb(40 40 40);
64
- --mcx-color-surface-elevated-secondary: rgb(45 45 45);
65
- --mcx-color-border-subtle: rgb(255 255 255 / 4.2%);
66
- --mcx-color-background-primary-ghost-hover: rgb(255 255 255 / 7.8%);
67
- --mcx-color-chart-blue: #339cff;
68
- --mcx-color-text-inverse: rgb(13 13 13);
69
- --mcx-color-background-elevated-primary-opaque: #363636;
70
- --mcx-color-background-panel: #232323;
71
- --mcx-color-background-primary-solid: #fff;
72
- --mcx-color-text-primary-solid: #2d2d2d;
73
- --mcx-color-background-button-secondary: rgb(255 255 255 / 5.2%);
74
- --mcx-color-background-button-secondary-hover: rgb(255 255 255 / 7.8%);
75
- --mcx-color-background-button-tertiary-hover: rgb(255 255 255 / 6.8%);
76
- --mcx-color-text-foreground: #fff;
77
- --mcx-color-text-foreground-secondary: rgb(255 255 255 / 71%);
78
- --mcx-color-text-foreground-tertiary: rgb(255 255 255 / 49.8%);
79
- --mcx-color-icon-tertiary: color-mix(in oklab, #fff 50%, transparent);
80
- --mcx-color-text-accent: #83c3ff;
81
- --mcx-color-border: rgb(255 255 255 / 8.4%);
82
- --mcx-color-border-heavy: rgb(255 255 255 / 15.6%);
83
- --mcx-color-border-focus: rgb(131 195 255 / 76%);
84
- --mcx-color-token-list-hover-background: rgb(255 255 255 / 7.8%);
85
- --mcx-color-token-input-background: rgb(45 45 45 / 96%);
86
- --mcx-color-token-input-border: rgb(255 255 255 / 15.6%);
87
- --mcx-color-token-input-foreground: #fff;
88
- --mcx-color-token-input-placeholder-foreground: rgb(255 255 255 / 49.8%);
89
- }
90
-
91
- @media (prefers-color-scheme: dark) {
92
- :root:not([data-theme]) {
93
- color-scheme: dark;
94
- --mcx-color-token-main-surface-primary: #181818;
95
- --mcx-color-token-bg-primary: #141414;
96
- --mcx-color-token-bg-secondary: color-mix(in srgb, #141414 92%, transparent);
97
- --mcx-color-surface-tertiary: rgb(40 40 40);
98
- --mcx-color-surface-elevated-secondary: rgb(45 45 45);
99
- --mcx-color-border-subtle: rgb(255 255 255 / 4.2%);
100
- --mcx-color-background-primary-ghost-hover: rgb(255 255 255 / 7.8%);
101
- --mcx-color-chart-blue: #339cff;
102
- --mcx-color-text-inverse: rgb(13 13 13);
103
- --mcx-color-background-elevated-primary-opaque: #363636;
104
- --mcx-color-background-panel: #232323;
105
- --mcx-color-background-primary-solid: #fff;
106
- --mcx-color-text-primary-solid: #2d2d2d;
107
- --mcx-color-background-button-secondary: rgb(255 255 255 / 5.2%);
108
- --mcx-color-background-button-secondary-hover: rgb(255 255 255 / 7.8%);
109
- --mcx-color-background-button-tertiary-hover: rgb(255 255 255 / 6.8%);
110
- --mcx-color-text-foreground: #fff;
111
- --mcx-color-text-foreground-secondary: rgb(255 255 255 / 71%);
112
- --mcx-color-text-foreground-tertiary: rgb(255 255 255 / 49.8%);
113
- --mcx-color-icon-tertiary: color-mix(in oklab, #fff 50%, transparent);
114
- --mcx-color-text-accent: #83c3ff;
115
- --mcx-color-border: rgb(255 255 255 / 8.4%);
116
- --mcx-color-border-heavy: rgb(255 255 255 / 15.6%);
117
- --mcx-color-border-focus: rgb(131 195 255 / 76%);
118
- --mcx-color-token-list-hover-background: rgb(255 255 255 / 7.8%);
119
- --mcx-color-token-input-background: rgb(45 45 45 / 96%);
120
- --mcx-color-token-input-border: rgb(255 255 255 / 15.6%);
121
- --mcx-color-token-input-foreground: #fff;
122
- --mcx-color-token-input-placeholder-foreground: rgb(255 255 255 / 49.8%);
123
- }
124
- }
125
-
126
- * { box-sizing: border-box; }
127
-
128
- html,
129
- body {
130
- min-height: 100%;
131
- margin: 0;
132
- background: var(--mcx-color-token-main-surface-primary);
133
- }
134
-
135
- body {
136
- min-width: 320px;
137
- color: var(--mcx-color-text-foreground);
138
- font: 400 var(--mcx-text-base)/1.5 var(--mcx-font-sans-default);
139
- -webkit-font-smoothing: antialiased;
140
- }
141
-
142
- button,
143
- input { font: inherit; }
144
-
145
- button,
146
- a { -webkit-tap-highlight-color: transparent; }
147
-
148
- button { color: inherit; }
149
-
150
- .sr-only {
151
- position: absolute;
152
- width: 1px;
153
- height: 1px;
154
- padding: 0;
155
- margin: -1px;
156
- overflow: hidden;
157
- clip: rect(0, 0, 0, 0);
158
- white-space: nowrap;
159
- border: 0;
160
- }
161
-
162
- .library-shell {
163
- position: relative;
164
- width: 100vw;
165
- height: 100vh;
166
- display: flex;
167
- overflow: hidden;
168
- background: var(--mcx-color-token-main-surface-primary);
169
- }
170
-
171
- /* 侧栏分界不占用布局宽度。 */
172
- :root[data-sidebar-open="true"] .library-shell::before {
173
- content: "";
174
- position: absolute;
175
- z-index: 12;
176
- inset: 0 auto 0 0;
177
- width: 1px;
178
- background: var(--mcx-color-border);
179
- pointer-events: none;
180
- }
181
-
182
- .library-header button,
183
- .library-header select,
184
- .source-menu { -webkit-app-region: no-drag; }
185
-
186
- .library-header .rescan-button {
187
- margin-right: calc(var(--library-scrollbar-width, 0px) - 10px);
188
- }
189
-
190
- .library-pane {
191
- width: 100%;
192
- min-width: 0;
193
- flex: 0 0 auto;
194
- display: flex;
195
- flex-direction: column;
196
- overflow: hidden;
197
- container-type: inline-size;
198
- background: var(--library-canvas);
199
- transform: translateX(0);
200
- transition: transform 160ms cubic-bezier(0.23, 1, 0.32, 1);
201
- }
202
-
203
- .library-scroll {
204
- min-height: 0;
205
- flex: 1 1 auto;
206
- overflow-y: auto;
207
- overscroll-behavior: contain;
208
- scrollbar-gutter: stable;
209
- }
210
-
211
- .library-scroll,
212
- .drawer-scroll,
213
- .source-menu {
214
- scrollbar-color: var(--mcx-color-token-scrollbar-slider-background) transparent;
215
- }
216
-
217
- .library-scroll::-webkit-scrollbar { width: 12px; }
218
- .library-scroll::-webkit-scrollbar-track { background: transparent; }
219
-
220
- .library-scroll::-webkit-scrollbar-thumb {
221
- min-height: 48px;
222
- border: 3px solid transparent;
223
- border-radius: 999px;
224
- background-clip: padding-box;
225
- }
226
-
227
- .library-scroll::-webkit-scrollbar-thumb,
228
- .drawer-scroll::-webkit-scrollbar-thumb,
229
- .source-menu::-webkit-scrollbar-thumb {
230
- background-color: var(--mcx-color-token-scrollbar-slider-background);
231
- }
232
-
233
- .library-scroll::-webkit-scrollbar-thumb:hover,
234
- .drawer-scroll::-webkit-scrollbar-thumb:hover,
235
- .source-menu::-webkit-scrollbar-thumb:hover {
236
- background-color: var(--mcx-color-token-scrollbar-slider-hover-background);
237
- }
238
-
239
- .library-scroll::-webkit-scrollbar-thumb:active,
240
- .drawer-scroll::-webkit-scrollbar-thumb:active,
241
- .source-menu::-webkit-scrollbar-thumb:active {
242
- background-color: var(--mcx-color-token-scrollbar-slider-active-background);
243
- }
244
-
245
- .library-header,
246
- .drawer-header {
247
- height: 72px;
248
- display: flex;
249
- align-items: center;
250
- border-bottom: 1px solid var(--mcx-color-border);
251
- background: var(--mcx-color-token-main-surface-primary);
252
- }
253
-
254
- .library-header {
255
- flex: 0 0 auto;
256
- z-index: 4;
257
- justify-content: space-between;
258
- gap: 16px;
259
- padding: 0 var(--library-gutter);
260
- border-bottom: 0;
261
- background: var(--library-canvas);
262
- }
263
-
264
- .identity {
265
- min-width: 0;
266
- display: flex;
267
- align-items: center;
268
- gap: 7px;
269
- }
270
-
271
- .sidebar-open-button { flex: 0 0 auto; }
272
- .sidebar-open-button[hidden] { display: none; }
273
-
274
- .sidebar-toggle-icon {
275
- width: 16px;
276
- height: 16px;
277
- fill: currentColor;
278
- }
279
-
280
- h1,
281
- h2,
282
- h3,
283
- p { margin: 0; }
284
-
285
- h1,
286
- .drawer-header h2 {
287
- font-size: var(--mcx-text-base);
288
- font-weight: 600;
289
- letter-spacing: -0.01em;
290
- }
291
-
292
- .library-header h1 {
293
- font-size: 26px;
294
- font-weight: 600;
295
- letter-spacing: -0.035em;
296
- }
297
-
298
- .library-toolbar {
299
- min-width: 0;
300
- flex: 1 1 auto;
301
- display: flex;
302
- align-items: center;
303
- justify-content: flex-end;
304
- gap: 12px;
305
- border: 0;
306
- background: transparent;
307
- }
308
-
309
- .drawer-open .library-pane,
310
- .thread-context .library-pane {
311
- width: 20%;
312
- transform: translateX(0);
313
- transition-duration: 200ms;
314
- }
315
-
316
- .drawer-open .library-toolbar,
317
- .thread-context .library-toolbar { display: none; }
318
-
319
- .source-filter,
320
- .density-control {
321
- min-width: 0;
322
- position: relative;
323
- }
324
-
325
- .toolbar-actions {
326
- flex: 0 0 auto;
327
- display: flex;
328
- align-items: center;
329
- gap: 8px;
330
- }
331
-
332
- .toolbar-button {
333
- height: 36px;
334
- min-width: 0;
335
- border: 1px solid transparent;
336
- border-radius: 999px;
337
- display: inline-flex;
338
- align-items: center;
339
- gap: 6px;
340
- padding: 0 14px;
341
- color: var(--mcx-color-text-foreground-secondary);
342
- background: transparent;
343
- cursor: pointer;
344
- font-size: var(--mcx-text-sm);
345
- font-weight: 500;
346
- }
347
-
348
- .toolbar-button:hover,
349
- .toolbar-button[aria-expanded="true"] {
350
- color: var(--mcx-color-text-foreground);
351
- background: var(--mcx-color-background-button-tertiary-hover);
352
- }
353
-
354
- .source-filter-button {
355
- width: auto;
356
- max-width: 240px;
357
- }
358
-
359
- .filter-source-icon,
360
- .source-option-icon {
361
- flex: 0 0 auto;
362
- display: grid;
363
- place-items: center;
364
- }
365
-
366
- .filter-source-icon .source-icon,
367
- .source-option-icon .source-icon {
368
- width: 14px;
369
- height: 14px;
370
- }
371
-
372
- .filter-label {
373
- min-width: 0;
374
- overflow: hidden;
375
- text-overflow: ellipsis;
376
- white-space: nowrap;
377
- }
378
-
379
- .filter-count,
380
- .source-option-count,
381
- .density-button-value {
382
- color: var(--mcx-color-text-foreground-tertiary);
383
- font-variant-numeric: tabular-nums;
384
- }
385
-
386
- .filter-count {
387
- flex: 0 0 auto;
388
- min-width: 0;
389
- padding: 0;
390
- background: transparent;
391
- line-height: 1;
392
- text-align: center;
393
- }
394
-
395
- .filter-chevron {
396
- width: 13px;
397
- height: 13px;
398
- flex: 0 0 auto;
399
- transition: transform 120ms ease;
400
- }
401
-
402
- .source-filter-button:hover,
403
- .source-filter-button[aria-expanded="true"] { background: var(--mcx-color-background-button-secondary-hover); }
404
- .source-filter-button[aria-expanded="true"] .filter-chevron { transform: rotate(180deg); }
405
-
406
- .source-menu {
407
- position: absolute;
408
- top: calc(100% + 6px);
409
- z-index: 20;
410
- border: 0;
411
- border-radius: 16px;
412
- background: var(--mcx-color-background-elevated-primary-opaque);
413
- box-shadow: 0 8px 32px var(--mcx-color-border-heavy);
414
- }
415
-
416
- .source-menu[hidden] { display: none; }
417
-
418
- /* 透明边框保留固定底部留白,不随列表内容滚走。 */
419
- #source-menu {
420
- border-bottom: 8px solid transparent;
421
- padding-bottom: 0;
422
- }
423
-
424
-
425
- .source-menu {
426
- left: 0;
427
- width: min(260px, calc(100vw - 32px));
428
- max-height: min(400px, calc(100vh - 96px));
429
- padding: 6px;
430
- overflow-y: auto;
431
- }
432
-
433
- .source-option {
434
- width: 100%;
435
- min-height: 36px;
436
- border: 0;
437
- border-radius: 10px;
438
- display: grid;
439
- grid-template-columns: 16px minmax(0, 1fr) auto;
440
- align-items: center;
441
- gap: 7px;
442
- padding: 8px 10px;
443
- color: var(--mcx-color-text-foreground-secondary);
444
- background: transparent;
445
- cursor: pointer;
446
- text-align: left;
447
- font-size: var(--mcx-text-sm);
448
- }
449
-
450
- .source-option:hover,
451
- .source-option[aria-selected="true"] {
452
- color: var(--mcx-color-text-foreground);
453
- background: var(--mcx-color-token-list-hover-background);
454
- }
455
-
456
- .source-option-label {
457
- min-width: 0;
458
- overflow: hidden;
459
- text-overflow: ellipsis;
460
- white-space: nowrap;
461
- }
462
-
463
- .source-option-count { padding-left: 8px; }
464
-
465
- .source-menu-divider {
466
- height: 1px;
467
- margin: 5px 4px;
468
- background: var(--mcx-color-border);
469
- }
470
-
471
- .density-control { display: flex; align-items: center; }
472
- .density-icon { width: 14px; height: 14px; flex: 0 0 auto; }
473
- .source-filter-button, .density-trigger {
474
- font-size: var(--mcx-text-sm);
475
- font-weight: 400;
476
- color: var(--mcx-color-icon-tertiary);
477
- }
478
- .density-trigger { padding-inline: 8px; }
479
- .density-menu { left: auto; right: 0; width: 76px; }
480
- .density-menu .source-option { display: flex; justify-content: space-between; }
481
- .density-menu .source-option[aria-selected="true"]::after { content: "✓"; }
482
- .density-menu .source-option:focus-visible { outline-offset: -2px; }
483
-
484
- .group-button[aria-pressed="true"] {
485
- color: var(--mcx-color-text-foreground);
486
- background: var(--mcx-color-background-button-secondary-hover);
487
- }
488
-
489
- .secondary-button,
490
- .primary-button,
491
- .icon-button {
492
- min-height: 32px;
493
- border: 1px solid transparent;
494
- border-radius: var(--mcx-radius-md);
495
- display: inline-flex;
496
- align-items: center;
497
- justify-content: center;
498
- gap: 6px;
499
- padding: 0 12px;
500
- color: inherit;
501
- cursor: pointer;
502
- font-size: var(--mcx-text-sm);
503
- font-weight: 500;
504
- text-decoration: none;
505
- transition: background-color 120ms ease, border-color 120ms ease, opacity 120ms ease;
506
- }
507
-
508
- .secondary-button {
509
- border-color: var(--mcx-color-border);
510
- background: var(--mcx-color-background-button-secondary);
511
- }
512
-
513
- .secondary-button:hover { background: var(--mcx-color-background-button-secondary-hover); }
514
-
515
- .primary-button {
516
- color: var(--mcx-color-text-primary-solid);
517
- background: var(--mcx-color-background-primary-solid);
518
- }
519
-
520
- .primary-button:hover { opacity: 0.88; }
521
- .primary-button:disabled { opacity: 0.45; cursor: default; }
522
-
523
- .icon-button {
524
- width: 28px;
525
- min-height: 28px;
526
- padding: 0;
527
- color: var(--mcx-color-icon-tertiary);
528
- background: transparent;
529
- }
530
-
531
- .icon-button:hover { background: var(--mcx-color-background-button-tertiary-hover); }
532
- .icon-button:disabled { opacity: 0.45; cursor: default; }
533
-
534
- .lucide {
535
- width: 16px;
536
- height: 16px;
537
- fill: none;
538
- stroke: currentColor;
539
- stroke-width: 1.5;
540
- stroke-linecap: round;
541
- stroke-linejoin: round;
542
- }
543
-
544
- .loading-ring-icon { display: none; }
545
- .rescan-button.is-loading { color: var(--mcx-color-text-foreground-secondary); }
546
- .rescan-button.is-loading .refresh-icon { display: none; }
547
- .rescan-button.is-loading .loading-ring-icon {
548
- display: block;
549
- animation: refresh-spin 700ms linear infinite;
550
- }
551
-
552
- @keyframes refresh-spin {
553
- to { transform: rotate(360deg); }
554
- }
555
-
556
- .secondary-button:focus-visible,
557
- .primary-button:focus-visible,
558
- .icon-button:focus-visible,
559
- .toolbar-button:focus-visible,
560
- .source-option:focus-visible,
561
- .density-trigger:focus-visible,
562
- .image-card:focus-visible,
563
- .thread-board:focus-visible {
564
- outline: 2px solid var(--mcx-color-border-focus);
565
- outline-offset: 2px;
566
- }
567
-
568
- .image-grid {
569
- --image-grid-gap: 16px;
570
- --grid-columns: 4;
571
- padding: 0 var(--library-gutter) 48px;
572
- display: grid;
573
- grid-template-columns: repeat(var(--grid-columns), minmax(0, 1fr));
574
- grid-auto-rows: 1px;
575
- column-gap: var(--image-grid-gap);
576
- row-gap: 0;
577
- align-items: start;
578
- }
579
-
580
- .page-sentinel {
581
- height: 1px;
582
- margin-top: -1px;
583
- }
584
-
585
- .image-card,
586
- .thread-board {
587
- position: relative;
588
- width: 100%;
589
- margin: 0 0 var(--image-grid-gap);
590
- padding: 0;
591
- overflow: hidden;
592
- border: 1px solid var(--library-card-border);
593
- border-radius: var(--library-card-radius);
594
- box-shadow: var(--library-card-shadow);
595
- display: block;
596
- color: var(--mcx-color-text-foreground);
597
- background: var(--mcx-color-token-main-surface-primary);
598
- cursor: pointer;
599
- text-align: left;
600
- transition: background-color 120ms ease, border-color 120ms ease, transform 120ms ease;
601
- }
602
-
603
- .image-card.is-wide {
604
- --library-card-shadow: 0 4px 16px 0 light-dark(rgb(0 0 0 / 7%), rgb(0 0 0 / 20%));
605
- }
606
-
607
- .image-card.is-selected {
608
- outline: 2px solid var(--mcx-color-border-focus);
609
- outline-offset: 3px;
610
- }
611
-
612
- .image-card img {
613
- width: 100%;
614
- height: auto;
615
- display: block;
616
- background: var(--mcx-color-token-bg-primary);
617
- }
618
-
619
- .thread-board-preview {
620
- position: relative;
621
- overflow: hidden;
622
- display: flex;
623
- flex-direction: column;
624
- gap: 1px;
625
- background: var(--mcx-color-border);
626
- }
627
-
628
- .thread-board-preview img {
629
- width: 100%;
630
- height: auto;
631
- min-height: 76px;
632
- aspect-ratio: 16 / 6;
633
- display: block;
634
- object-fit: cover;
635
- background: var(--mcx-color-token-bg-primary);
636
- }
637
-
638
- .thread-board-preview.is-single img {
639
- min-height: 180px;
640
- aspect-ratio: auto;
641
- object-fit: contain;
642
- }
643
-
644
- .thread-board-overflow {
645
- position: absolute;
646
- right: 8px;
647
- bottom: 8px;
648
- min-width: 32px;
649
- height: 24px;
650
- padding: 0 7px;
651
- border: 1px solid rgb(255 255 255 / 20%);
652
- border-radius: 7px;
653
- display: inline-flex;
654
- align-items: center;
655
- justify-content: center;
656
- color: #fff;
657
- background: rgb(20 20 20 / 76%);
658
- backdrop-filter: blur(8px);
659
- font-size: var(--mcx-text-xs);
660
- font-variant-numeric: tabular-nums;
661
- }
662
-
663
- .thread-board-caption {
664
- min-height: 80px;
665
- padding: 12px 16px;
666
- border-top: 0;
667
- display: flex;
668
- flex-direction: column;
669
- justify-content: center;
670
- gap: 2px;
671
- background: var(--mcx-color-token-main-surface-primary);
672
- font-size: var(--mcx-text-xs);
673
- white-space: nowrap;
674
- }
675
-
676
- .thread-board-title {
677
- overflow: hidden;
678
- color: var(--mcx-color-text-foreground);
679
- font-weight: 500;
680
- text-overflow: ellipsis;
681
- }
682
-
683
- .thread-board-meta {
684
- display: flex;
685
- align-items: center;
686
- justify-content: space-between;
687
- gap: 8px;
688
- color: var(--mcx-color-text-foreground-tertiary);
689
- font-variant-numeric: tabular-nums;
690
- }
691
-
692
- .card-caption {
693
- position: absolute;
694
- inset: auto 10px 10px;
695
- min-height: 48px;
696
- padding: 8px 12px;
697
- border: 1px solid var(--mcx-color-border-subtle);
698
- border-radius: var(--mcx-radius-lg);
699
- display: flex;
700
- flex-direction: column;
701
- gap: 2px;
702
- background: color-mix(in srgb, var(--mcx-color-token-main-surface-primary) 94%, transparent);
703
- backdrop-filter: blur(12px);
704
- font-size: var(--mcx-text-xs);
705
- font-variant-numeric: tabular-nums;
706
- white-space: nowrap;
707
- opacity: 0;
708
- pointer-events: none;
709
- transition: opacity 120ms ease;
710
- }
711
-
712
- .image-card:hover .card-caption,
713
- .image-card:focus-visible .card-caption { opacity: 1; }
714
-
715
- @media (hover: none) {
716
- .card-caption { opacity: 1; }
717
- }
718
-
719
- .source-value {
720
- min-width: 0;
721
- display: flex;
722
- align-items: center;
723
- gap: 6px;
724
- color: var(--mcx-color-text-foreground-secondary);
725
- }
726
-
727
- .source-value > span {
728
- min-width: 0;
729
- overflow: hidden;
730
- text-overflow: ellipsis;
731
- white-space: nowrap;
732
- }
733
-
734
- .source-icon {
735
- width: 14px;
736
- height: 14px;
737
- flex: 0 0 auto;
738
- }
739
-
740
- .card-source { font-weight: 500; }
741
- .card-time { color: var(--mcx-color-text-foreground-tertiary); }
742
-
743
- .empty-state {
744
- width: min(420px, calc(100% - 48px));
745
- margin: 18vh auto 0;
746
- padding: 28px;
747
- text-align: center;
748
- }
749
-
750
- .empty-state h2 { font-size: var(--mcx-text-base); font-weight: 600; }
751
- .empty-state p { margin-top: 6px; color: var(--mcx-color-text-foreground-secondary); font-size: var(--mcx-text-sm); }
752
-
753
- .status-announcer {
754
- position: absolute;
755
- width: 1px;
756
- height: 1px;
757
- padding: 0;
758
- margin: -1px;
759
- overflow: hidden;
760
- clip: rect(0, 0, 0, 0);
761
- white-space: nowrap;
762
- border: 0;
763
- }
764
-
765
- .detail-drawer {
766
- position: absolute;
767
- z-index: 4;
768
- top: 0;
769
- right: 0;
770
- bottom: 0;
771
- width: 80%;
772
- overflow: hidden;
773
- border-left: 1px solid var(--mcx-color-border);
774
- background: var(--mcx-color-token-main-surface-primary);
775
- transform: translateX(32px);
776
- opacity: 0;
777
- visibility: hidden;
778
- pointer-events: none;
779
- contain: layout paint;
780
- overscroll-behavior: contain;
781
- will-change: transform, opacity;
782
- transition:
783
- transform 160ms cubic-bezier(0.23, 1, 0.32, 1),
784
- opacity 120ms cubic-bezier(0.23, 1, 0.32, 1),
785
- visibility 0s linear 160ms;
786
- }
787
-
788
- .drawer-open .detail-drawer {
789
- transform: translateX(0);
790
- opacity: 1;
791
- visibility: visible;
792
- pointer-events: auto;
793
- transition-delay: 0s;
794
- transition-duration: 200ms, 160ms, 0s;
795
- }
796
-
797
- .drawer-surface {
798
- width: 100%;
799
- min-width: 0;
800
- height: 100%;
801
- display: flex;
802
- flex-direction: column;
803
- background: var(--mcx-color-token-main-surface-primary);
804
- }
805
-
806
- .drawer-open .image-grid {
807
- --image-grid-gap: 16px;
808
- padding: 0 20px 20px;
809
- grid-template-columns: 1fr;
810
- }
811
- .drawer-open .image-card .card-caption { display: none; }
812
- .drawer-open .library-header { padding-inline: 20px; }
813
- .drawer-open .library-header h1 { font-size: var(--text-heading-sm); }
814
-
815
- .drawer-header {
816
- flex: 0 0 auto;
817
- justify-content: space-between;
818
- padding: 0 var(--library-detail-gutter);
819
- border-bottom: 0;
820
- }
821
-
822
- .drawer-scroll {
823
- min-height: 0;
824
- flex: 1 1 auto;
825
- overflow: auto;
826
- overscroll-behavior: contain;
827
- }
828
-
829
- .drawer-figure {
830
- margin: 0;
831
- padding: 0;
832
- display: grid;
833
- place-items: center;
834
- background: transparent;
835
- }
836
-
837
- /* Native-token image editor: tokens arrive from RuntimeHost with the active Codex theme. */
838
- .image-editor { position: relative; margin: 0 var(--library-detail-gutter) 8px; border-radius: var(--library-card-radius); background: transparent; }
839
- .image-editor [hidden] { display: none !important; }
840
- .image-editor-controls { position: sticky; z-index: 6; top: 0; border-radius: var(--library-card-radius) var(--library-card-radius) 0 0; background: transparent; }
841
- .image-editor-toolbar { position: relative; display: flex; justify-content: center; min-height: 48px; padding: 8px 16px; }
842
- .image-edit-actions, .image-edit-mode { display: flex; min-width: 0; align-items: center; gap: 2px; padding: 2px; overflow: hidden; border-radius: 9999px; background: color-mix(in srgb, var(--mcx-color-surface-tertiary) 95%, transparent); box-shadow: 0 0 0 1px var(--mcx-color-border-subtle), var(--mcx-shadow-md); backdrop-filter: blur(4px); }
843
- .image-edit-action, .image-edit-mode button { display: inline-flex; height: 28px; align-items: center; justify-content: center; gap: 4px; border: 1px solid transparent; border-radius: 999px; padding: 0 6px; background: transparent; color: var(--mcx-color-text-foreground); font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-base); font-weight: var(--mcx-font-weight-normal); line-height: 18px; white-space: nowrap; cursor: pointer; }
844
- .image-edit-action:hover, .image-edit-action[aria-expanded="true"], .image-edit-mode button:hover { background: var(--mcx-color-background-primary-ghost-hover); }
845
- .image-edit-action:focus-visible, .image-edit-mode button:focus-visible, .image-zoom-trigger:focus-visible, .image-edit-menu button:focus-visible { outline: 1px solid var(--mcx-color-border-focus); outline-offset: 1px; }
846
- .image-edit-mode button:disabled { color: var(--mcx-color-text-foreground-tertiary); cursor: default; }
847
- .image-edit-mode > span { min-width: 0; overflow: hidden; padding: 0 6px; color: var(--mcx-color-text-foreground-tertiary); font-size: var(--mcx-text-base); line-height: 18px; text-overflow: ellipsis; white-space: nowrap; }
848
- .image-edit-mode button { width: 28px; padding: 0; flex: 0 0 auto; }
849
- .image-edit-mode button > svg { width: 16px; height: 16px; fill: currentColor; }
850
- .image-edit-mode button[aria-label="Redo"] > svg { transform: scaleX(-1); }
851
- .image-edit-mode [data-edit-cancel] { color: var(--mcx-color-text-foreground-tertiary); }
852
- .image-edit-mode [data-edit-cancel] > svg { width: 14px; height: 14px; }
853
- .image-edit-mode [data-edit-send] { width: auto; padding: 0 6px; background: var(--mcx-color-chart-blue); color: var(--mcx-color-text-inverse); }
854
- .image-edit-mode [data-edit-send]:hover { background: color-mix(in srgb, var(--mcx-color-chart-blue) 90%, transparent); }
855
- .image-edit-mode [data-edit-send]:disabled { color: var(--mcx-color-text-inverse); opacity: .4; }
856
- .image-zoom-trigger { position: absolute; top: 8px; right: 10px; height: 28px; display: inline-flex; align-items: center; gap: 2px; border: 1px solid transparent; border-radius: var(--mcx-radius-lg); padding: 0 8px; background: transparent; color: var(--mcx-color-text-foreground-tertiary); cursor: pointer; font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-sm); font-weight: var(--mcx-font-weight-normal); line-height: 20px; font-variant-numeric: tabular-nums; }
857
- .image-zoom-trigger:hover, .image-zoom-trigger[aria-expanded="true"] { background: var(--mcx-color-background-primary-ghost-hover); }
858
- .image-zoom-trigger [data-zoom-chevron] { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 1.5; opacity: .5; }
859
- .image-edit-menu { position: absolute; z-index: 8; width: 160px; padding: 4px; border: 0; border-radius: var(--mcx-radius-xl); background: color-mix(in srgb, var(--mcx-color-surface-elevated-secondary) 90%, transparent); box-shadow: 0 0 0 .5px var(--mcx-color-border), var(--mcx-shadow-xl); backdrop-filter: blur(4px); }
860
- .image-edit-menu button { display: flex; width: 100%; align-items: center; gap: 6px; border: 0; border-radius: var(--mcx-radius-lg); padding: 5px 8px; background: transparent; color: var(--mcx-color-text-foreground); font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-sm); font-weight: var(--mcx-font-weight-normal); line-height: var(--mcx-text-sm--line-height); text-align: left; cursor: pointer; }
861
- .image-edit-menu button:hover { background: var(--mcx-color-background-primary-ghost-hover); }
862
- .image-ratio-label { min-width: 0; flex: 1; display: flex; align-items: center; justify-content: space-between; gap: 16px; }
863
- .image-ratio-label small { margin: 0; color: var(--mcx-color-text-foreground-tertiary); font-size: inherit; }
864
- .image-ratio-icon { display: block; width: 16px; height: 16px; flex: 0 0 auto; fill: currentColor; opacity: .75; }
865
- .image-menu-check { width: 17px; height: 17px; flex: 0 0 auto; fill: currentColor; opacity: .75; }
866
- .image-menu-check.is-hidden { visibility: hidden; }
867
- .image-menu-separator { height: 1px; margin: 0 8px; background: var(--mcx-color-border); }
868
- .image-zoom-menu { width: 136px; padding: 6px; border-radius: 10px; }
869
- .image-zoom-menu button { border-radius: 6px; padding: 5px 5px 5px 8px; line-height: 20px; }
870
- .image-editor-stage { position: relative; overflow: auto; border-radius: var(--library-card-radius); touch-action: none; }
871
- .image-editor-stage img { transform-origin: center; transition: transform 120ms ease-out; }
872
- .image-edit-mask, .image-comment-layer { position: absolute; inset: 0; width: 100%; height: 100%; }
873
- .image-edit-mask { cursor: crosshair; opacity: .5; color: var(--mcx-color-text-accent); }
874
- .image-comment-layer { pointer-events: none; }
875
- .image-comment-marker { position: absolute; display: flex; width: 30px; height: 30px; align-items: center; justify-content: center; border: 0; padding: 0; background: transparent; color: var(--mcx-color-text-accent); font-family: var(--mcx-font-sans-default); transform: translate(-50%, -50%); }
876
- button.image-comment-marker { pointer-events: auto; cursor: pointer; }
877
- .image-comment-marker > svg { position: absolute; inset: 0; width: 30px; height: 30px; fill: currentColor; overflow: visible; stroke: white; stroke-width: 1.65; }
878
- .image-comment-marker > span { position: relative; z-index: 1; color: white; font-size: 10px; font-weight: 700; line-height: 10px; transform: translate(-1px, -1px); }
879
- .image-comment-popover { position: absolute; z-index: 4; width: min(294px, calc(100% - 16px)); height: 44px; padding: 8px 8px 8px 16px; border: 0; border-radius: 22px; background: var(--mcx-color-surface-elevated-secondary); box-shadow: 0 0 0 1px var(--mcx-color-border-subtle), var(--mcx-shadow-md); }
880
- .image-comment-popover input { width: 100%; height: 28px; border: 0; padding: 0; outline: 0; background: transparent; color: var(--mcx-color-token-input-foreground); font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-base); font-weight: var(--mcx-font-weight-normal); line-height: 21px; }
881
- .image-comment-popover.is-existing-comment { height: 120px; padding: 8px 12px 8px 16px; }
882
- .image-comment-popover textarea { display: block; width: 100%; height: 60px; resize: none; border: 0; padding: 2px 0 0; outline: 0; background: transparent; color: var(--mcx-color-token-input-foreground); font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-base); font-weight: var(--mcx-font-weight-normal); line-height: 24px; }
883
- .image-comment-editor-footer { height: 44px; display: flex; align-items: end; justify-content: space-between; }
884
- .image-comment-editor-actions { display: flex; gap: 6px; }
885
- .image-comment-editor-footer button { height: 28px; border: 1px solid var(--mcx-color-border); border-radius: 999px; padding: 0 8px; background: color-mix(in srgb, var(--mcx-color-token-main-surface-primary) 96%, transparent); color: var(--mcx-color-text-foreground); font-family: var(--mcx-font-sans-default); font-size: var(--mcx-text-sm); font-weight: var(--mcx-font-weight-normal); line-height: 18px; cursor: pointer; }
886
- .image-comment-editor-footer button:hover { background: var(--mcx-color-background-primary-ghost-hover); }
887
- .image-comment-editor-footer .image-comment-delete { width: 28px; padding: 0; border-color: transparent; background: transparent; }
888
- .image-comment-delete > svg { width: 20px; height: 20px; fill: currentColor; }
889
- .image-comment-editor-footer .image-comment-save { border-color: transparent; background: var(--mcx-color-background-primary-solid); color: var(--mcx-color-text-button-primary); }
890
- .image-comment-editor-footer button:disabled { cursor: default; opacity: .4; }
891
- .image-brush-slider { position: absolute; z-index: 3; top: 50%; left: 16px; transform: translateY(-50%) rotate(-90deg); transform-origin: center; }
892
- .image-brush-slider input { accent-color: var(--mcx-color-text-accent); }
893
- .image-edit-menu[data-resize-menu] { top: 48px; left: 50%; transform: translateX(-50%); }
894
- .image-zoom-menu { top: 48px; right: 10px; }
895
- .image-edit-action > svg { width: 16px; height: 16px; flex: 0 0 auto; fill: currentColor; }
896
- .image-edit-action > [data-native-image-icon="resize"] { width: 18px; height: 18px; }
897
- @media (max-width: 520px) { .image-edit-action span { display: none; } .image-edit-action { width: 28px; padding: 0; } }
898
-
899
- .drawer-figure img {
900
- width: auto;
901
- height: auto;
902
- max-width: 100%;
903
- max-height: min(68vh, 720px);
904
- display: block;
905
- object-fit: contain;
906
- border-radius: var(--mcx-radius-md);
907
- }
908
-
909
- .detail-section {
910
- margin: 0 var(--library-detail-gutter);
911
- padding: 24px 0;
912
- border-top: 0;
913
- }
914
-
915
- .detail-section + .detail-section { border-top: 1px solid var(--mcx-color-border-subtle); }
916
-
917
- .detail-section h3 {
918
- margin-bottom: 10px;
919
- color: var(--mcx-color-text-foreground);
920
- font-size: var(--mcx-text-sm);
921
- font-weight: 600;
922
- }
923
-
924
- .detail-section-heading {
925
- display: flex;
926
- align-items: center;
927
- justify-content: space-between;
928
- gap: 12px;
929
- }
930
-
931
- .detail-section-heading h3 { margin-bottom: 0; }
932
- .detail-section-heading + .drawer-prompt { margin-top: 10px; }
933
-
934
- .prompt-copy-button {
935
- width: 26px;
936
- min-height: 26px;
937
- flex: 0 0 auto;
938
- }
939
-
940
- .prompt-copy-button.is-copied {
941
- color: var(--mcx-color-text-foreground);
942
- background: var(--mcx-color-background-button-secondary);
943
- }
944
- .prompt-copy-button svg[hidden] { display: none; }
945
-
946
- .drawer-prompt {
947
- overflow-wrap: anywhere;
948
- white-space: pre-wrap;
949
- color: var(--mcx-color-text-foreground-secondary);
950
- font-size: var(--mcx-text-sm);
951
- line-height: 1.75;
952
- }
953
-
954
- .drawer-prompt.is-loading,
955
- .drawer-prompt.is-missing { color: var(--mcx-color-text-foreground-tertiary); }
956
-
957
- .image-information { margin: 0; }
958
-
959
- .image-information div {
960
- min-height: 32px;
961
- padding: 6px 0;
962
- display: grid;
963
- grid-template-columns: 86px minmax(0, 1fr);
964
- gap: 12px;
965
- }
966
-
967
- .image-information div[hidden] { display: none; }
968
-
969
- .image-information dt {
970
- color: var(--mcx-color-text-foreground-tertiary);
971
- font-size: var(--mcx-text-xs);
972
- }
973
-
974
- .image-information dd {
975
- min-width: 0;
976
- margin: 0;
977
- color: var(--mcx-color-text-foreground-secondary);
978
- font-size: var(--mcx-text-xs);
979
- font-variant-numeric: tabular-nums;
980
- }
981
-
982
- .drawer-actions {
983
- min-height: 56px;
984
- padding: 10px var(--library-detail-gutter);
985
- flex: 0 0 auto;
986
- display: grid;
987
- grid-template-columns: repeat(2, minmax(0, 144px));
988
- justify-content: end;
989
- gap: 12px;
990
- border-top: 1px solid var(--mcx-color-border);
991
- background: var(--mcx-color-token-main-surface-primary);
992
- }
993
-
994
- .source-action {
995
- min-width: 0;
996
- position: relative;
997
- display: flex;
998
- }
999
-
1000
- .source-button { width: 100%; }
1001
- .save-button { width: 100%; }
1002
- .drawer-actions button { min-height: 34px; padding-block: 6px; border-radius: 999px; }
1003
- .library-header .rescan-button,
1004
- .toolbar-actions .group-button,
1005
- .drawer-close { width: 36px; min-height: 36px; border-radius: 999px; }
1006
- /* 补偿热区与 SVG 内部留白,让叉号本身贴齐图片区域右缘。 */
1007
- .drawer-close { margin-right: -14px; }
1008
-
1009
- .source-action.is-disabled .source-button {
1010
- pointer-events: none;
1011
- opacity: 0.45;
1012
- cursor: not-allowed;
1013
- }
1014
-
1015
- .source-tooltip {
1016
- position: absolute;
1017
- z-index: 2;
1018
- left: 50%;
1019
- bottom: calc(100% + 8px);
1020
- width: max-content;
1021
- max-width: min(260px, 70vw);
1022
- padding: 6px 8px;
1023
- border: 1px solid var(--mcx-color-border-heavy);
1024
- border-radius: 7px;
1025
- color: var(--mcx-color-text-foreground);
1026
- background: var(--mcx-color-background-elevated-primary-opaque);
1027
- box-shadow: var(--mcx-shadow-xl);
1028
- font-size: var(--mcx-text-xs);
1029
- font-weight: 400;
1030
- line-height: 1.35;
1031
- text-align: center;
1032
- transform: translateX(-50%);
1033
- opacity: 0;
1034
- visibility: hidden;
1035
- transition: opacity 100ms ease, visibility 100ms ease;
1036
- pointer-events: none;
1037
- }
1038
-
1039
- .source-tooltip[hidden] { display: none; }
1040
-
1041
- .source-action.is-disabled:hover .source-tooltip {
1042
- opacity: 1;
1043
- visibility: visible;
1044
- }
1045
-
1046
- @media (max-width: 640px) {
1047
- .detail-drawer {
1048
- position: fixed;
1049
- z-index: 10;
1050
- top: 0;
1051
- right: 0;
1052
- bottom: 0;
1053
- width: 100vw;
1054
- transform: translateX(100%);
1055
- }
1056
-
1057
- .drawer-open .detail-drawer {
1058
- width: 100vw;
1059
- transform: translateX(0);
1060
- }
1061
-
1062
- .drawer-surface {
1063
- width: 100%;
1064
- min-width: 0;
1065
- }
1066
- }
1067
-
1068
- @container (max-width: 820px) {
1069
- .image-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1070
- }
1071
-
1072
- @container (max-width: 520px) {
1073
- .library-header { gap: 8px; }
1074
- .library-toolbar { gap: 4px; }
1075
- .source-filter-button { max-width: 130px; padding-inline: 10px; }
1076
- .filter-source-icon, .filter-count, .density-icon { display: none; }
1077
- .toolbar-actions { gap: 2px; }
1078
- .density-control { padding: 0; }
1079
- .image-grid { grid-template-columns: 1fr; }
1080
- }
1081
-
1082
- @media (max-width: 520px) {
1083
- :root { --library-gutter: 16px; --library-detail-gutter: 16px; --library-card-radius: 16px; }
1084
- .library-header, .drawer-header { height: 60px; }
1085
- .library-header h1 { font-size: 20px; }
1086
- .image-grid { --image-grid-gap: 16px; padding: 0 16px 16px; }
1087
- .drawer-figure { padding: 0; }
1088
- }
1089
-
1090
- @media (prefers-reduced-motion: reduce) {
1091
- *,
1092
- *::before,
1093
- *::after {
1094
- scroll-behavior: auto !important;
1095
- transition-duration: 0.01ms !important;
1096
- }
1097
- }
1098
-
1099
- /* 浮条锚定内容区,既不占据网格空间,也不随图片滚动。 */
1100
- .library-feed { position: relative; display: flex; flex: 1; min-height: 0; }
1101
- .library-feed > .library-scroll { width: 100%; }
1102
- .new-images-chip {
1103
- position: absolute; z-index: 5; top: 12px; left: 50%; transform: translateX(-50%);
1104
- display: flex; align-items: center; gap: 8px;
1105
- min-height: 36px; padding: 8px 16px; border: 1px solid var(--mcx-color-border);
1106
- border-radius: 999px; background: var(--mcx-color-surface-elevated-secondary);
1107
- color: var(--mcx-color-text-foreground); font: 500 13px/18px var(--mcx-font-sans-default);
1108
- box-shadow: 0 2px 6px #0000000a, 0 8px 24px #00000014;
1109
- white-space: nowrap; cursor: pointer; -webkit-app-region: no-drag;
1110
- }
1111
- .new-images-chip:hover { background: var(--mcx-color-background-panel); }
1112
- .new-images-chip:focus-visible { outline: 2px solid var(--mcx-color-border-focus); outline-offset: 3px; }
1113
- .new-images-arrow { font-size: 18px; line-height: 18px; }
1114
- .new-images-chip[hidden], .drawer-open .new-images-chip, .thread-context .new-images-chip { display: none; }