farming-code 2.2.7 → 2.2.11

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 (102) hide show
  1. package/README.md +110 -199
  2. package/README.zh_cn.md +106 -237
  3. package/THIRD_PARTY_NOTICES.md +11 -2
  4. package/backend/acp-checkpoint-store.js +198 -0
  5. package/backend/acp-runtime.js +306 -83
  6. package/backend/acp-session-state.js +202 -6
  7. package/backend/acp-transcript.js +112 -0
  8. package/backend/agent-activity.js +6 -157
  9. package/backend/agent-manager.js +1496 -737
  10. package/backend/agent-provider-session.js +17 -242
  11. package/backend/agent-runtime-binding.js +219 -0
  12. package/backend/agent-session-history.js +66 -1
  13. package/backend/auth.js +79 -6
  14. package/backend/codex-models.js +81 -84
  15. package/backend/codex-session-archive.js +45 -0
  16. package/backend/codex-terminal-profile.js +500 -0
  17. package/backend/codex-transcript-sanitizer.js +12 -0
  18. package/backend/codex-transcript.js +230 -8
  19. package/backend/config-manager.js +30 -0
  20. package/backend/control-api.js +192 -17
  21. package/backend/farming-net-pass.js +285 -0
  22. package/backend/farming-net-registry.js +112 -0
  23. package/backend/farming-net-server.js +298 -0
  24. package/backend/farming-session-store.js +5 -13
  25. package/backend/git-worktree-info.js +181 -0
  26. package/backend/local-session-engine.js +411 -186
  27. package/backend/main-page-session.js +5 -2
  28. package/backend/native-pty-controller-generation.js +106 -0
  29. package/backend/native-pty-host-client.js +275 -7
  30. package/backend/native-pty-host-identity.js +86 -0
  31. package/backend/native-pty-host.js +813 -114
  32. package/backend/native-session-engine.js +100 -28
  33. package/backend/packaged-node-pty.js +22 -2
  34. package/backend/provider-adapters.js +253 -0
  35. package/backend/provider-session-service.js +241 -0
  36. package/backend/runtime-observation.js +81 -0
  37. package/backend/server.js +294 -86
  38. package/backend/session-engine-bridge.js +21 -2
  39. package/backend/session-engine-router.js +1 -1
  40. package/backend/session-engine.js +1 -1
  41. package/backend/session-stream-protocol.js +185 -0
  42. package/backend/storage-layout.js +55 -0
  43. package/backend/terminal-attach-checkpoint.js +74 -0
  44. package/backend/terminal-exit-quiescence.js +39 -0
  45. package/backend/terminal-reducer-flow-control.js +97 -0
  46. package/backend/terminal-screen-state.js +11 -2
  47. package/backend/terminal-screen-worker-pool.js +59 -6
  48. package/backend/terminal-screen-worker-thread.js +97 -57
  49. package/backend/terminal-screen-worker.js +133 -51
  50. package/backend/terminal-state-serialization.js +127 -0
  51. package/backend/terminal-status.js +23 -4
  52. package/backend/usage-monitor.js +81 -4
  53. package/backend/workspace-directory.js +152 -0
  54. package/backend/workspace-file-router.js +182 -76
  55. package/backend/workspace-file-service.js +319 -4
  56. package/backend/workspace-root-registry.js +164 -0
  57. package/dist/assets/App-CHYpgECZ.js +208 -0
  58. package/dist/assets/{FileEditorMarkdownPreview-elKWc8Im.js → FileEditorMarkdownPreview--Cri80nQ.js} +92 -92
  59. package/dist/assets/FileEditorPane-DGJlEKdf.js +2 -0
  60. package/dist/assets/IconGlyphs-Cc14sepw.js +1 -0
  61. package/dist/assets/ProjectFilesSection-Cz1wG4NT.js +12 -0
  62. package/dist/assets/{ReviewPage-BaXu1ZdX.js → ReviewPage-LonRc6Fz.js} +1 -1
  63. package/dist/assets/code-dark-B1pAtO_P.css +1 -0
  64. package/dist/assets/file-icons-Bw2qd5iT.js +1 -0
  65. package/dist/assets/{index-B8SHldPE.js → index-miO2r9IZ.js} +3 -3
  66. package/dist/assets/main-DNe0jPw-.css +1 -0
  67. package/dist/assets/workspace-editor-model-BQol4qbA.js +1 -0
  68. package/dist/assets/workspace-editor-monaco-5gFbeDPF.js +1 -0
  69. package/dist/assets/workspace-editor-monaco-xPv8JzHH.js +4 -0
  70. package/dist/assets/workspace-view-state-DvYG_9PH.js +7 -0
  71. package/dist/assets/workspace-working-copy-D8-s_Sgh.js +1 -0
  72. package/dist/index.html +1 -1
  73. package/frontend/farming-net/app.css +625 -0
  74. package/frontend/farming-net/app.js +268 -0
  75. package/frontend/farming-net/index.html +86 -0
  76. package/frontend/reading-anchor.js +198 -0
  77. package/frontend/session-bridge.js +12 -3
  78. package/frontend/session-modal-bridge.js +5 -12
  79. package/frontend/skins/crt/app.js +1976 -793
  80. package/frontend/skins/crt/index.html +313 -23
  81. package/frontend/skins/crt/styles/billing.css +294 -223
  82. package/frontend/skins/crt/styles/monochrome-green.css +7 -2
  83. package/frontend/terminal-replay.js +372 -0
  84. package/package.json +10 -3
  85. package/shared/browser-protocol.d.ts +5 -0
  86. package/shared/browser-protocol.js +130 -0
  87. package/dist/assets/App-iA2BU9P6.js +0 -124
  88. package/dist/assets/FileEditorPane-RWiFD2cq.js +0 -5
  89. package/dist/assets/IconGlyphs-DfL0EBnj.js +0 -1
  90. package/dist/assets/ProjectFilesSection-Q4PDsWmM.js +0 -12
  91. package/dist/assets/code-dark-CDkOQAtK.css +0 -1
  92. package/dist/assets/file-icons-EFUGSSwf.js +0 -1
  93. package/dist/assets/main-DpYuBonn.css +0 -1
  94. package/dist/assets/qoder-C9LmmOSf.svg +0 -1
  95. package/dist/assets/qoder-Cf9gl0Y5.svg +0 -1
  96. package/dist/assets/qoder-gHCinseV.svg +0 -1
  97. package/dist/assets/workspace-view-state-CTyDzk2D.js +0 -1
  98. package/dist/assets/zsh-CLpveKlF.svg +0 -1
  99. package/dist/assets/zsh-FxSpMPbz.svg +0 -1
  100. /package/dist/assets/{api-D1lyBYIQ.js → api-D8nyOEbz.js} +0 -0
  101. /package/dist/assets/{core-ZlAPicox.js → core-D0LFJkDt.js} +0 -0
  102. /package/dist/assets/{useWorkspaceMenuKeyboard-CneKAZUJ.js → useWorkspaceMenuKeyboard-Brws6Ar9.js} +0 -0
@@ -0,0 +1,625 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ --bg: #f3f6f2;
4
+ --bg-deep: #e7eee7;
5
+ --surface: rgba(255, 255, 255, 0.78);
6
+ --surface-strong: rgba(255, 255, 255, 0.94);
7
+ --surface-hover: #ffffff;
8
+ --border: rgba(35, 67, 48, 0.13);
9
+ --border-strong: rgba(35, 67, 48, 0.24);
10
+ --text: #17221b;
11
+ --text-soft: #5d6d62;
12
+ --text-faint: #829087;
13
+ --accent: #207446;
14
+ --accent-bright: #2c9159;
15
+ --accent-soft: #e2f2e7;
16
+ --warning: #a86719;
17
+ --shadow: 0 18px 45px rgba(27, 54, 37, 0.08);
18
+ --shadow-hover: 0 22px 55px rgba(27, 54, 37, 0.14);
19
+ font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
20
+ font-synthesis: none;
21
+ text-rendering: optimizeLegibility;
22
+ }
23
+
24
+ @media (prefers-color-scheme: dark) {
25
+ :root {
26
+ --bg: #0c120f;
27
+ --bg-deep: #111c16;
28
+ --surface: rgba(20, 31, 25, 0.82);
29
+ --surface-strong: rgba(24, 38, 30, 0.96);
30
+ --surface-hover: #1b2b22;
31
+ --border: rgba(160, 205, 174, 0.12);
32
+ --border-strong: rgba(160, 205, 174, 0.24);
33
+ --text: #edf5ef;
34
+ --text-soft: #a5b6aa;
35
+ --text-faint: #718078;
36
+ --accent: #70d395;
37
+ --accent-bright: #88e1a8;
38
+ --accent-soft: rgba(62, 151, 94, 0.18);
39
+ --warning: #e4aa5c;
40
+ --shadow: 0 20px 55px rgba(0, 0, 0, 0.26);
41
+ --shadow-hover: 0 24px 65px rgba(0, 0, 0, 0.38);
42
+ }
43
+ }
44
+
45
+ * {
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ html {
50
+ min-height: 100%;
51
+ background: var(--bg);
52
+ }
53
+
54
+ body {
55
+ min-height: 100vh;
56
+ margin: 0;
57
+ overflow-x: hidden;
58
+ color: var(--text);
59
+ background:
60
+ radial-gradient(circle at 80% -10%, rgba(65, 156, 94, 0.13), transparent 34rem),
61
+ linear-gradient(150deg, var(--bg), var(--bg-deep));
62
+ }
63
+
64
+ button,
65
+ input {
66
+ font: inherit;
67
+ }
68
+
69
+ button,
70
+ a {
71
+ -webkit-tap-highlight-color: transparent;
72
+ }
73
+
74
+ .page-glow {
75
+ position: fixed;
76
+ z-index: 0;
77
+ width: 26rem;
78
+ height: 26rem;
79
+ border-radius: 999px;
80
+ pointer-events: none;
81
+ filter: blur(90px);
82
+ opacity: 0.25;
83
+ }
84
+
85
+ .page-glow-one {
86
+ top: 16rem;
87
+ left: -14rem;
88
+ background: #88c99b;
89
+ }
90
+
91
+ .page-glow-two {
92
+ right: -12rem;
93
+ bottom: -12rem;
94
+ background: #9ecfa9;
95
+ }
96
+
97
+ .shell {
98
+ position: relative;
99
+ z-index: 1;
100
+ width: min(1120px, calc(100% - 48px));
101
+ min-height: 100vh;
102
+ margin: 0 auto;
103
+ display: flex;
104
+ flex-direction: column;
105
+ }
106
+
107
+ .topbar {
108
+ min-height: 76px;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: space-between;
112
+ border-bottom: 1px solid var(--border);
113
+ }
114
+
115
+ .brand {
116
+ display: inline-flex;
117
+ gap: 10px;
118
+ align-items: center;
119
+ color: var(--text);
120
+ font-size: 15px;
121
+ font-weight: 680;
122
+ letter-spacing: -0.01em;
123
+ text-decoration: none;
124
+ }
125
+
126
+ .brand-icon {
127
+ width: 30px;
128
+ height: 30px;
129
+ border-radius: 9px;
130
+ box-shadow: 0 4px 12px rgba(25, 95, 53, 0.18);
131
+ }
132
+
133
+ .private-badge {
134
+ display: inline-flex;
135
+ gap: 8px;
136
+ align-items: center;
137
+ padding: 7px 11px;
138
+ border: 1px solid var(--border);
139
+ border-radius: 999px;
140
+ color: var(--text-soft);
141
+ background: var(--surface);
142
+ font-size: 12px;
143
+ font-weight: 600;
144
+ backdrop-filter: blur(14px);
145
+ }
146
+
147
+ .private-badge-dot {
148
+ width: 6px;
149
+ height: 6px;
150
+ border-radius: 50%;
151
+ background: var(--accent-bright);
152
+ box-shadow: 0 0 0 4px var(--accent-soft);
153
+ }
154
+
155
+ main {
156
+ flex: 1;
157
+ }
158
+
159
+ .hero {
160
+ padding: 82px 0 44px;
161
+ }
162
+
163
+ .eyebrow {
164
+ margin: 0 0 14px;
165
+ color: var(--accent);
166
+ font-size: 11px;
167
+ font-weight: 760;
168
+ letter-spacing: 0.16em;
169
+ }
170
+
171
+ h1 {
172
+ max-width: 760px;
173
+ margin: 0;
174
+ font-family: "Avenir Next", Avenir, "Helvetica Neue", ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
175
+ font-size: clamp(42px, 7vw, 76px);
176
+ font-weight: 650;
177
+ font-kerning: normal;
178
+ font-variant-ligatures: none;
179
+ letter-spacing: -0.025em;
180
+ line-height: 0.98;
181
+ }
182
+
183
+ .subtitle {
184
+ max-width: 650px;
185
+ margin: 22px 0 0;
186
+ color: var(--text-soft);
187
+ font-size: clamp(16px, 2vw, 19px);
188
+ line-height: 1.6;
189
+ }
190
+
191
+ .toolbar {
192
+ display: grid;
193
+ grid-template-columns: minmax(0, 1fr) auto;
194
+ gap: 12px;
195
+ margin-bottom: 42px;
196
+ }
197
+
198
+ .search-field {
199
+ min-width: 0;
200
+ height: 50px;
201
+ display: flex;
202
+ gap: 11px;
203
+ align-items: center;
204
+ padding: 0 14px;
205
+ border: 1px solid var(--border);
206
+ border-radius: 14px;
207
+ background: var(--surface);
208
+ box-shadow: 0 8px 30px rgba(30, 68, 43, 0.04);
209
+ backdrop-filter: blur(16px);
210
+ transition: border-color 150ms ease, background 150ms ease, box-shadow 150ms ease;
211
+ }
212
+
213
+ .search-field:focus-within {
214
+ border-color: var(--border-strong);
215
+ background: var(--surface-strong);
216
+ box-shadow: 0 0 0 3px var(--accent-soft);
217
+ }
218
+
219
+ .search-field svg,
220
+ .refresh-button svg {
221
+ width: 18px;
222
+ height: 18px;
223
+ fill: none;
224
+ stroke: currentColor;
225
+ stroke-width: 1.8;
226
+ stroke-linecap: round;
227
+ stroke-linejoin: round;
228
+ }
229
+
230
+ .search-field svg {
231
+ flex: 0 0 auto;
232
+ color: var(--text-faint);
233
+ }
234
+
235
+ .search-field input {
236
+ min-width: 0;
237
+ flex: 1;
238
+ border: 0;
239
+ outline: 0;
240
+ color: var(--text);
241
+ background: transparent;
242
+ }
243
+
244
+ .search-field input::placeholder {
245
+ color: var(--text-faint);
246
+ }
247
+
248
+ kbd {
249
+ min-width: 24px;
250
+ padding: 3px 7px;
251
+ border: 1px solid var(--border);
252
+ border-bottom-color: var(--border-strong);
253
+ border-radius: 6px;
254
+ color: var(--text-faint);
255
+ background: var(--surface-strong);
256
+ font-family: inherit;
257
+ font-size: 11px;
258
+ text-align: center;
259
+ }
260
+
261
+ .refresh-button {
262
+ height: 50px;
263
+ display: inline-flex;
264
+ gap: 9px;
265
+ align-items: center;
266
+ justify-content: center;
267
+ padding: 0 17px;
268
+ border: 1px solid var(--border);
269
+ border-radius: 14px;
270
+ color: var(--text);
271
+ background: var(--surface);
272
+ cursor: pointer;
273
+ backdrop-filter: blur(16px);
274
+ transition: transform 140ms ease, border-color 140ms ease, background 140ms ease;
275
+ }
276
+
277
+ .refresh-button:hover {
278
+ border-color: var(--border-strong);
279
+ background: var(--surface-strong);
280
+ transform: translateY(-1px);
281
+ }
282
+
283
+ .refresh-button:active {
284
+ transform: translateY(0);
285
+ }
286
+
287
+ .refresh-button[disabled] {
288
+ cursor: wait;
289
+ opacity: 0.65;
290
+ }
291
+
292
+ .refresh-button.is-loading svg {
293
+ animation: rotate 900ms linear infinite;
294
+ }
295
+
296
+ @keyframes rotate {
297
+ to { transform: rotate(360deg); }
298
+ }
299
+
300
+ .directory {
301
+ padding-bottom: 60px;
302
+ }
303
+
304
+ .directory-heading {
305
+ display: flex;
306
+ align-items: baseline;
307
+ justify-content: space-between;
308
+ margin-bottom: 16px;
309
+ }
310
+
311
+ .directory-heading h2 {
312
+ margin: 0;
313
+ font-size: 14px;
314
+ font-weight: 690;
315
+ letter-spacing: -0.01em;
316
+ }
317
+
318
+ .instance-count {
319
+ color: var(--text-faint);
320
+ font-size: 12px;
321
+ }
322
+
323
+ .notice {
324
+ margin-bottom: 14px;
325
+ padding: 12px 14px;
326
+ border: 1px solid color-mix(in srgb, var(--warning) 30%, transparent);
327
+ border-radius: 12px;
328
+ color: var(--warning);
329
+ background: color-mix(in srgb, var(--warning) 8%, transparent);
330
+ font-size: 13px;
331
+ }
332
+
333
+ .instance-grid {
334
+ display: grid;
335
+ grid-template-columns: repeat(3, minmax(0, 1fr));
336
+ gap: 15px;
337
+ }
338
+
339
+ .instance-card {
340
+ min-width: 0;
341
+ min-height: 250px;
342
+ display: flex;
343
+ flex-direction: column;
344
+ padding: 22px;
345
+ border: 1px solid var(--border);
346
+ border-radius: 18px;
347
+ background: var(--surface);
348
+ box-shadow: var(--shadow);
349
+ backdrop-filter: blur(18px);
350
+ transition: transform 180ms ease, border-color 180ms ease, background 180ms ease, box-shadow 180ms ease;
351
+ }
352
+
353
+ .instance-card:hover {
354
+ border-color: var(--border-strong);
355
+ background: var(--surface-hover);
356
+ box-shadow: var(--shadow-hover);
357
+ transform: translateY(-3px);
358
+ }
359
+
360
+ .card-topline {
361
+ display: flex;
362
+ gap: 12px;
363
+ align-items: flex-start;
364
+ justify-content: space-between;
365
+ }
366
+
367
+ .instance-avatar {
368
+ width: 42px;
369
+ height: 42px;
370
+ display: grid;
371
+ flex: 0 0 auto;
372
+ place-items: center;
373
+ border: 1px solid color-mix(in srgb, var(--accent) 16%, transparent);
374
+ border-radius: 13px;
375
+ color: var(--accent);
376
+ background: var(--accent-soft);
377
+ font-size: 16px;
378
+ font-weight: 720;
379
+ letter-spacing: -0.02em;
380
+ }
381
+
382
+ .availability {
383
+ display: inline-flex;
384
+ gap: 6px;
385
+ align-items: center;
386
+ min-height: 26px;
387
+ padding: 0 9px;
388
+ border: 1px solid var(--border);
389
+ border-radius: 999px;
390
+ color: var(--text-faint);
391
+ font-size: 11px;
392
+ white-space: nowrap;
393
+ }
394
+
395
+ .availability-dot {
396
+ width: 6px;
397
+ height: 6px;
398
+ border-radius: 50%;
399
+ background: currentColor;
400
+ }
401
+
402
+ .availability[data-state="checking"] .availability-dot {
403
+ animation: pulse 1.2s ease-in-out infinite;
404
+ }
405
+
406
+ .availability[data-state="reachable"] {
407
+ border-color: color-mix(in srgb, var(--accent) 24%, transparent);
408
+ color: var(--accent);
409
+ background: var(--accent-soft);
410
+ }
411
+
412
+ @keyframes pulse {
413
+ 50% { opacity: 0.35; }
414
+ }
415
+
416
+ .instance-card h3 {
417
+ margin: 22px 0 0;
418
+ overflow: hidden;
419
+ font-size: 20px;
420
+ font-weight: 680;
421
+ letter-spacing: -0.025em;
422
+ line-height: 1.25;
423
+ text-overflow: ellipsis;
424
+ white-space: nowrap;
425
+ }
426
+
427
+ .instance-meta {
428
+ min-height: 19px;
429
+ margin: 7px 0 0;
430
+ overflow: hidden;
431
+ color: var(--text-faint);
432
+ font-size: 12px;
433
+ text-overflow: ellipsis;
434
+ white-space: nowrap;
435
+ }
436
+
437
+ .instance-description {
438
+ display: -webkit-box;
439
+ min-height: 43px;
440
+ margin: 13px 0 20px;
441
+ overflow: hidden;
442
+ color: var(--text-soft);
443
+ font-size: 13px;
444
+ line-height: 1.6;
445
+ -webkit-box-orient: vertical;
446
+ -webkit-line-clamp: 2;
447
+ }
448
+
449
+ .endpoint-list {
450
+ display: grid;
451
+ gap: 8px;
452
+ margin-top: auto;
453
+ }
454
+
455
+ .endpoint-link {
456
+ min-width: 0;
457
+ height: 42px;
458
+ display: flex;
459
+ gap: 8px;
460
+ align-items: center;
461
+ padding: 0 12px;
462
+ border: 1px solid var(--border);
463
+ border-radius: 11px;
464
+ color: var(--text);
465
+ background: var(--surface-strong);
466
+ font-size: 12px;
467
+ font-weight: 620;
468
+ text-decoration: none;
469
+ transition: border-color 140ms ease, color 140ms ease, background 140ms ease;
470
+ }
471
+
472
+ .endpoint-link:hover {
473
+ border-color: color-mix(in srgb, var(--accent) 35%, transparent);
474
+ color: var(--accent);
475
+ background: var(--accent-soft);
476
+ }
477
+
478
+ .endpoint-label {
479
+ min-width: 0;
480
+ overflow: hidden;
481
+ text-overflow: ellipsis;
482
+ white-space: nowrap;
483
+ }
484
+
485
+ .endpoint-scope {
486
+ margin-left: auto;
487
+ color: var(--text-faint);
488
+ font-size: 10px;
489
+ font-weight: 560;
490
+ white-space: nowrap;
491
+ }
492
+
493
+ .endpoint-arrow {
494
+ flex: 0 0 auto;
495
+ color: var(--text-faint);
496
+ font-size: 15px;
497
+ transform: translateY(-1px);
498
+ }
499
+
500
+ .empty-state {
501
+ padding: 68px 20px;
502
+ border: 1px dashed var(--border-strong);
503
+ border-radius: 18px;
504
+ color: var(--text-soft);
505
+ text-align: center;
506
+ }
507
+
508
+ .empty-mark {
509
+ width: 40px;
510
+ height: 40px;
511
+ display: grid;
512
+ margin: 0 auto 14px;
513
+ place-items: center;
514
+ border: 1px solid var(--border);
515
+ border-radius: 12px;
516
+ color: var(--text-faint);
517
+ background: var(--surface);
518
+ }
519
+
520
+ .empty-state h3 {
521
+ margin: 0;
522
+ color: var(--text);
523
+ font-size: 15px;
524
+ }
525
+
526
+ .empty-state p {
527
+ margin: 8px 0 0;
528
+ font-size: 13px;
529
+ }
530
+
531
+ footer {
532
+ min-height: 70px;
533
+ display: flex;
534
+ gap: 10px;
535
+ align-items: center;
536
+ border-top: 1px solid var(--border);
537
+ color: var(--text-faint);
538
+ font-size: 11px;
539
+ }
540
+
541
+ .footer-separator {
542
+ width: 3px;
543
+ height: 3px;
544
+ border-radius: 50%;
545
+ background: var(--text-faint);
546
+ }
547
+
548
+ @media (max-width: 860px) {
549
+ .instance-grid {
550
+ grid-template-columns: repeat(2, minmax(0, 1fr));
551
+ }
552
+ }
553
+
554
+ @media (max-width: 600px) {
555
+ .shell {
556
+ width: min(100% - 28px, 1120px);
557
+ }
558
+
559
+ .topbar {
560
+ min-height: 64px;
561
+ }
562
+
563
+ .private-badge span:last-child {
564
+ display: none;
565
+ }
566
+
567
+ .private-badge {
568
+ width: 28px;
569
+ height: 28px;
570
+ justify-content: center;
571
+ padding: 0;
572
+ }
573
+
574
+ .hero {
575
+ padding: 58px 0 34px;
576
+ }
577
+
578
+ .toolbar {
579
+ grid-template-columns: minmax(0, 1fr) 50px;
580
+ margin-bottom: 34px;
581
+ }
582
+
583
+ .refresh-button {
584
+ width: 50px;
585
+ padding: 0;
586
+ }
587
+
588
+ .refresh-button span {
589
+ display: none;
590
+ }
591
+
592
+ kbd {
593
+ display: none;
594
+ }
595
+
596
+ .instance-grid {
597
+ grid-template-columns: minmax(0, 1fr);
598
+ }
599
+
600
+ .instance-card {
601
+ min-height: 230px;
602
+ }
603
+
604
+ footer {
605
+ align-items: flex-start;
606
+ flex-direction: column;
607
+ justify-content: center;
608
+ gap: 3px;
609
+ }
610
+
611
+ .footer-separator {
612
+ display: none;
613
+ }
614
+ }
615
+
616
+ @media (prefers-reduced-motion: reduce) {
617
+ *,
618
+ *::before,
619
+ *::after {
620
+ scroll-behavior: auto !important;
621
+ animation-duration: 0.01ms !important;
622
+ animation-iteration-count: 1 !important;
623
+ transition-duration: 0.01ms !important;
624
+ }
625
+ }