@kevin5251984/guild 0.2.12

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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/bin/guildd.mjs +20 -0
  3. package/cordis.yml +24 -0
  4. package/package.json +52 -0
  5. package/src/agent-file.ts +125 -0
  6. package/src/browser.ts +668 -0
  7. package/src/catalog/default-bots.ts +263 -0
  8. package/src/catalog/skills.ts +128 -0
  9. package/src/catalog/subagents.ts +70 -0
  10. package/src/chat-parts.ts +71 -0
  11. package/src/cli-args.ts +75 -0
  12. package/src/cli.ts +60 -0
  13. package/src/compact.ts +355 -0
  14. package/src/cordis.d.ts +40 -0
  15. package/src/db.ts +653 -0
  16. package/src/generate.ts +673 -0
  17. package/src/handlers.ts +1623 -0
  18. package/src/harness.ts +326 -0
  19. package/src/host-agents.ts +137 -0
  20. package/src/host-browse.ts +199 -0
  21. package/src/host-skills.ts +150 -0
  22. package/src/image-gen.ts +270 -0
  23. package/src/index.ts +12 -0
  24. package/src/llm.ts +993 -0
  25. package/src/mcp.ts +563 -0
  26. package/src/memory.ts +159 -0
  27. package/src/mention.ts +176 -0
  28. package/src/oauth.ts +1474 -0
  29. package/src/plugins/api.ts +8 -0
  30. package/src/plugins/chat.ts +31 -0
  31. package/src/plugins/harness.ts +77 -0
  32. package/src/plugins/llm.ts +50 -0
  33. package/src/plugins/mcp.ts +58 -0
  34. package/src/plugins/memory.ts +42 -0
  35. package/src/plugins/oauth.ts +47 -0
  36. package/src/plugins/server.ts +126 -0
  37. package/src/plugins/store.ts +29 -0
  38. package/src/plugins/tools.ts +79 -0
  39. package/src/public/buddy.js +432 -0
  40. package/src/public/chat.css +3045 -0
  41. package/src/public/chat.html +5834 -0
  42. package/src/public/favicon-16.png +0 -0
  43. package/src/public/favicon-16.svg +10 -0
  44. package/src/public/favicon-32.png +0 -0
  45. package/src/public/favicon.ico +0 -0
  46. package/src/public/favicon.svg +13 -0
  47. package/src/public/i18n.js +663 -0
  48. package/src/public/index.html +143 -0
  49. package/src/public/library.html +678 -0
  50. package/src/public/mcp-add.html +126 -0
  51. package/src/public/md.js +332 -0
  52. package/src/public/rpg/inn-street.jpg +0 -0
  53. package/src/public/settings.html +795 -0
  54. package/src/public/skills-add.html +212 -0
  55. package/src/public/studio.html +1181 -0
  56. package/src/public/style.css +1678 -0
  57. package/src/public/subagents-add.html +152 -0
  58. package/src/router.ts +978 -0
  59. package/src/send-budget.ts +52 -0
  60. package/src/server.ts +1 -0
  61. package/src/skill-import.ts +250 -0
  62. package/src/slash.ts +15 -0
  63. package/src/start.ts +103 -0
  64. package/src/store.ts +1208 -0
  65. package/src/subagent.ts +355 -0
  66. package/src/tools.ts +818 -0
  67. package/src/trajectory.ts +339 -0
  68. package/src/usage.ts +111 -0
  69. package/vendor/protocol/package.json +19 -0
  70. package/vendor/protocol/src/index.ts +159 -0
@@ -0,0 +1,1678 @@
1
+ :root {
2
+ --enamel: #0B0E12;
3
+ --paper: #F3EFE6;
4
+ --ink: #0B0E12;
5
+ --steel: #A8B0BC;
6
+ --signal: #C9A227;
7
+ --bg: #0B0E12;
8
+ --panel: #10141A;
9
+ --lift: #161C24;
10
+ --card: #161C24;
11
+ --card-hover: #1A222C;
12
+ --line: #1C222C;
13
+ --fill: #141A22;
14
+ --text: #E8E4DC;
15
+ --muted: #8B8F96;
16
+ --accent: #A8B0BC;
17
+ --ok: #9fdfb2;
18
+ --err: #fca5a5;
19
+ --radius: 14px;
20
+ --focus: 0 0 0 2px var(--bg), 0 0 0 3px var(--steel);
21
+ color: var(--text);
22
+ background: var(--bg);
23
+ font-family: "SF Pro Text", "PingFang TC", "Segoe UI", system-ui, sans-serif;
24
+ line-height: 1.45;
25
+ }
26
+ * { box-sizing: border-box; }
27
+ html, body { margin: 0; min-height: 100%; background: var(--bg); }
28
+ html { text-wrap: pretty; }
29
+ a { color: var(--accent); text-decoration: none; }
30
+ a:hover { text-decoration: underline; }
31
+ button:focus-visible,
32
+ a:focus-visible,
33
+ input:focus-visible,
34
+ textarea:focus-visible,
35
+ select:focus-visible {
36
+ outline: none;
37
+ box-shadow: var(--focus);
38
+ }
39
+
40
+ .appbar {
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ gap: 1rem;
45
+ padding: 0.9rem 1.4rem;
46
+ border-bottom: 1px solid var(--line);
47
+ position: sticky;
48
+ top: 0;
49
+ background: color-mix(in srgb, var(--bg) 92%, transparent);
50
+ backdrop-filter: blur(12px);
51
+ z-index: 10;
52
+ }
53
+ .logo {
54
+ font-weight: 650;
55
+ letter-spacing: 0.04em;
56
+ color: var(--text);
57
+ text-decoration: none;
58
+ }
59
+ .logo:hover { text-decoration: none; }
60
+ .appbar nav { display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; }
61
+ .nav-link {
62
+ color: var(--muted);
63
+ text-decoration: none;
64
+ padding: 0.4rem 0.7rem;
65
+ border-radius: 999px;
66
+ font-size: 0.9rem;
67
+ }
68
+ .nav-link:hover { background: var(--card); color: var(--text); text-decoration: none; }
69
+ .nav-link.on { background: var(--lift); color: var(--text); }
70
+ .locale-switch {
71
+ display: inline-flex;
72
+ gap: 2px;
73
+ margin-left: 0.5rem;
74
+ padding: 2px;
75
+ border-radius: 999px;
76
+ background: var(--line);
77
+ }
78
+ .locale-switch button {
79
+ margin: 0;
80
+ padding: 0.2rem 0.5rem;
81
+ border: 0;
82
+ border-radius: 999px;
83
+ background: transparent;
84
+ color: var(--muted);
85
+ font: inherit;
86
+ font-size: 0.75rem;
87
+ cursor: pointer;
88
+ }
89
+ .locale-switch button.on,
90
+ .locale-switch button:hover { background: var(--lift); color: var(--text); }
91
+
92
+ body.app {
93
+ display: grid;
94
+ grid-template-columns: var(--sidebar-w, 292px) 1fr;
95
+ min-height: 100%;
96
+ background: var(--bg);
97
+ }
98
+ body.app .sidebar {
99
+ position: relative;
100
+ background: var(--panel);
101
+ border-right: 1px solid var(--line);
102
+ display: flex;
103
+ flex-direction: column;
104
+ min-height: 100vh;
105
+ min-width: 0;
106
+ overflow: hidden;
107
+ }
108
+ body.app .sidebar-resizer {
109
+ position: absolute;
110
+ top: 0;
111
+ right: -3px;
112
+ width: 6px;
113
+ height: 100%;
114
+ cursor: col-resize;
115
+ z-index: 6;
116
+ }
117
+ body.app .sidebar-resizer:hover,
118
+ body.resizing-sidebar .sidebar-resizer {
119
+ background: rgba(255, 255, 255, 0.14);
120
+ }
121
+ body.resizing-sidebar {
122
+ cursor: col-resize;
123
+ user-select: none;
124
+ }
125
+ body.app .side-brand {
126
+ padding: 0.9rem 1rem 0.55rem;
127
+ }
128
+ body.app .side-brand .logo { font-size: 1.02rem; }
129
+ body.app .side-nav {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 2px;
133
+ padding: 0.25rem 0.55rem;
134
+ font-family: "PingFang TC", "Noto Sans TC", "SF Pro Text", sans-serif;
135
+ font-size: 0.92rem;
136
+ font-weight: 400;
137
+ font-synthesis: none;
138
+ }
139
+ body.app .side-nav a,
140
+ body.app .side-nav a:link,
141
+ body.app .side-nav a:visited {
142
+ padding: 0.55rem 0.75rem;
143
+ border-radius: 12px;
144
+ color: var(--muted);
145
+ text-decoration: none;
146
+ font: inherit;
147
+ }
148
+ body.app .side-nav a:hover { background: var(--lift); color: var(--text); text-decoration: none; }
149
+ body.app .side-nav a.on { background: var(--lift); color: var(--text); }
150
+ body.app .side-group {
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 2px;
154
+ margin-top: 0.15rem;
155
+ }
156
+ body.app .side-group-label {
157
+ padding: 0.55rem 0.75rem 0.15rem;
158
+ color: var(--muted);
159
+ font: inherit;
160
+ }
161
+ body.app .side-nav .side-sub {
162
+ margin-left: 1.05rem;
163
+ padding-left: 0.7rem;
164
+ }
165
+ body.app .side-nav .side-sub.roster-bot {
166
+ display: flex;
167
+ flex-direction: column;
168
+ align-items: flex-start;
169
+ gap: 0.08rem;
170
+ line-height: 1.2;
171
+ }
172
+ body.app .side-nav .side-sub.roster-bot strong {
173
+ font-weight: 560;
174
+ color: var(--text);
175
+ overflow-wrap: anywhere;
176
+ }
177
+ body.app .side-nav .side-sub.roster-bot em {
178
+ font-style: normal;
179
+ font-size: 0.75rem;
180
+ font-weight: 400;
181
+ color: var(--muted);
182
+ }
183
+ body.app.bar-page #side-roster {
184
+ display: flex;
185
+ flex-direction: column;
186
+ gap: 2px;
187
+ }
188
+ body.settings-page [data-sec-panel] { display: none; }
189
+ body.settings-page[data-section="main"] [data-sec-panel="main"],
190
+ body.settings-page[data-section="subs"] [data-sec-panel="subs"],
191
+ body.settings-page[data-section="keys"] [data-sec-panel="keys"] {
192
+ display: block;
193
+ }
194
+ body.library-page [data-lib-panel],
195
+ body.library-page [data-lib-action] { display: none; }
196
+ body.library-page[data-lib="skills"] [data-lib-panel="skills"],
197
+ body.library-page[data-lib="subagents"] [data-lib-panel="subagents"],
198
+ body.library-page[data-lib="mcp"] [data-lib-panel="mcp"] {
199
+ display: block;
200
+ }
201
+ body.library-page[data-lib="skills"] [data-lib-action="skills"],
202
+ body.library-page[data-lib="subagents"] [data-lib-action="subagents"],
203
+ body.library-page[data-lib="mcp"] [data-lib-action="mcp"] {
204
+ display: inline-flex;
205
+ }
206
+ body.app .pane-head .tabs { margin: 0; }
207
+ body.app .pane-head a.tab {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ margin: 0;
211
+ padding: 0.38rem 0.8rem;
212
+ border-radius: 999px;
213
+ font-size: 0.9rem;
214
+ font-weight: 560;
215
+ color: var(--muted);
216
+ background: transparent;
217
+ text-decoration: none;
218
+ }
219
+ body.app .pane-head a.tab:hover {
220
+ color: var(--text);
221
+ background: var(--lift);
222
+ text-decoration: none;
223
+ }
224
+ body.app .pane-head a.tab.on {
225
+ background: var(--paper);
226
+ color: var(--ink);
227
+ }
228
+ body.app .side-foot {
229
+ margin-top: auto;
230
+ padding: 0.7rem 0.85rem 0.9rem;
231
+ display: flex;
232
+ gap: 0.7rem;
233
+ flex-wrap: wrap;
234
+ align-items: center;
235
+ border-top: 1px solid var(--line);
236
+ }
237
+ body.app .pane {
238
+ display: grid;
239
+ grid-template-rows: auto 1fr;
240
+ min-width: 0;
241
+ min-height: 100vh;
242
+ background: var(--bg);
243
+ }
244
+ body.app .pane-head {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 0.7rem;
248
+ padding: 0.65rem 1.15rem;
249
+ border-bottom: 1px solid var(--line);
250
+ }
251
+ body.app .pane-head h1 {
252
+ margin: 0;
253
+ font-size: 0.98rem;
254
+ font-weight: 650;
255
+ letter-spacing: 0;
256
+ }
257
+ body.app .pane-head .meta {
258
+ color: var(--muted);
259
+ font-size: 0.82rem;
260
+ }
261
+ body.app .pane-head .btn,
262
+ body.app .pane-head .head-actions,
263
+ body.app .pane-head .locale-switch { margin-left: auto; }
264
+ body.app .page-body {
265
+ overflow: auto;
266
+ padding: 1.15rem 1.25rem 3.2rem;
267
+ min-width: 0;
268
+ }
269
+ body.app.library-page .page-body { max-width: 86rem; }
270
+ body.app.library-page .page-body .lede { max-width: 46rem; }
271
+ body.app.settings-page .page-body,
272
+ body.app.skills-add-page .page-body { max-width: 56rem; }
273
+ body.app .page-body > .lede { max-width: 46rem; }
274
+
275
+ .shell { max-width: 52rem; margin: 0 auto; padding: 2rem 1.4rem 4rem; min-width: 0; }
276
+ .shell-wide { max-width: 68rem; }
277
+
278
+ .eyebrow { margin: 0; color: var(--muted); font-size: 0.75rem; letter-spacing: 0.14em; text-transform: uppercase; }
279
+ h1 { font-weight: 560; font-size: 1.85rem; margin: 0.2rem 0 0.4rem; letter-spacing: -0.03em; }
280
+ h2 { font-weight: 560; font-size: 1.05rem; margin: 0 0 0.35rem; }
281
+ .muted { color: var(--muted); }
282
+ .health { color: var(--ok); }
283
+ .error { color: var(--err); }
284
+ .lede { color: var(--muted); margin: 0 0 1.4rem; }
285
+
286
+ .empty {
287
+ border: 1px dashed var(--line);
288
+ border-radius: var(--radius);
289
+ padding: 1.4rem;
290
+ color: var(--muted);
291
+ }
292
+
293
+ section.card, .card, .panel {
294
+ background: var(--card);
295
+ border: 1px solid var(--line);
296
+ border-radius: var(--radius);
297
+ padding: 1.1rem 1.15rem;
298
+ margin-bottom: 1rem;
299
+ }
300
+ .panel h2 { margin: 0 0 0.35rem; font-size: 1rem; font-weight: 650; }
301
+ .panel-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; }
302
+ .sub { color: var(--muted); font-size: 0.88rem; margin: 0 0 0.9rem; }
303
+
304
+ label { display: block; margin: 0.7rem 0 0.3rem; font-size: 0.82rem; color: var(--muted); }
305
+ input, textarea, select {
306
+ width: 100%;
307
+ padding: 0.7rem 0.85rem;
308
+ font: inherit;
309
+ color: var(--text);
310
+ background: var(--fill);
311
+ border: 1px solid var(--line);
312
+ border-radius: 12px;
313
+ }
314
+ input::placeholder, textarea::placeholder { color: var(--muted); }
315
+ textarea { min-height: 5rem; }
316
+ textarea.body {
317
+ min-height: 9.5rem;
318
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
319
+ font-size: 0.82rem;
320
+ }
321
+
322
+ button {
323
+ margin-top: 0.85rem;
324
+ padding: 0.55rem 0.95rem;
325
+ font: inherit;
326
+ font-weight: 560;
327
+ color: var(--ink);
328
+ background: var(--paper);
329
+ border: 0;
330
+ border-radius: 999px;
331
+ cursor: pointer;
332
+ }
333
+ button.secondary {
334
+ background: transparent;
335
+ color: var(--text);
336
+ border: 1px solid var(--line);
337
+ margin-top: 0.55rem;
338
+ }
339
+ button.danger {
340
+ color: #fca5a5;
341
+ border-color: #4a2a2a;
342
+ }
343
+ button:disabled { opacity: 0.45; }
344
+ button.is-busy:disabled {
345
+ opacity: 1;
346
+ cursor: wait;
347
+ pointer-events: none;
348
+ }
349
+ button.is-busy::after {
350
+ content: "";
351
+ display: inline-block;
352
+ width: 0.7em;
353
+ height: 0.7em;
354
+ margin-left: 0.45em;
355
+ border: 1.5px solid currentColor;
356
+ border-right-color: transparent;
357
+ border-radius: 50%;
358
+ vertical-align: -0.12em;
359
+ animation: btn-spin 0.7s linear infinite;
360
+ }
361
+ @keyframes btn-spin {
362
+ to { transform: rotate(360deg); }
363
+ }
364
+
365
+ .grid { display: grid; gap: 1rem; }
366
+ @media (min-width: 760px) {
367
+ .grid { grid-template-columns: 1fr 1fr; }
368
+ }
369
+
370
+ .search {
371
+ display: flex;
372
+ align-items: center;
373
+ gap: 0.6rem;
374
+ background: var(--fill);
375
+ border: 0;
376
+ border-radius: 999px;
377
+ padding: 0.15rem 0.95rem;
378
+ margin: 0.8rem 0 1.1rem;
379
+ }
380
+ .search svg { flex: none; opacity: 0.7; }
381
+ .search input {
382
+ border: 0;
383
+ background: transparent;
384
+ padding: 0.7rem 0;
385
+ outline: none;
386
+ min-width: 0;
387
+ }
388
+
389
+ .section-label {
390
+ color: var(--muted);
391
+ font-size: 0.8rem;
392
+ margin: 0.4rem 0 0.7rem;
393
+ }
394
+
395
+ .skill-grid {
396
+ display: grid;
397
+ gap: 0.65rem;
398
+ grid-template-columns: 1fr;
399
+ min-width: 0;
400
+ width: 100%;
401
+ }
402
+ .skill-grid > .more {
403
+ grid-column: 1 / -1;
404
+ margin: 0.2rem 0 0.4rem;
405
+ }
406
+ @media (min-width: 900px) {
407
+ .skill-grid { grid-template-columns: 1fr 1fr; }
408
+ }
409
+
410
+ .gen-row {
411
+ display: flex;
412
+ align-items: center;
413
+ flex-wrap: wrap;
414
+ gap: 0.55rem 0.85rem;
415
+ margin-top: 0.55rem;
416
+ }
417
+ .gen-row .generate { margin-top: 0; }
418
+ .block-flash {
419
+ margin: 0;
420
+ font-size: 0.88rem;
421
+ line-height: 1.35;
422
+ }
423
+ .save-row {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: flex-end;
427
+ flex-wrap: wrap;
428
+ gap: 0.55rem 0.85rem;
429
+ margin-top: 0.75rem;
430
+ }
431
+ .save-md {
432
+ display: block;
433
+ width: max-content;
434
+ margin-top: 0.75rem;
435
+ margin-left: auto;
436
+ }
437
+ .save-row .save-md { margin: 0; }
438
+ .card-foot {
439
+ display: flex;
440
+ align-items: center;
441
+ gap: 0.7rem;
442
+ margin-top: 0.75rem;
443
+ }
444
+ .card-foot .save-row { margin: 0 0 0 auto; }
445
+ .card-foot .save-md { margin: 0; }
446
+ .card-foot .ghost.danger {
447
+ margin: 0;
448
+ padding: 0.45rem 0.15rem;
449
+ background: transparent;
450
+ color: #fca5a5;
451
+ border: 0;
452
+ font-weight: 400;
453
+ }
454
+ .card-foot .ghost.danger:hover { color: #fecaca; }
455
+ #submit-btn { margin: 0.35rem 0 1.2rem; }
456
+ .skill-picker { margin: 1.2rem 0 1.6rem; }
457
+ .skill-picker h2 { margin: 0 0 0.35rem; }
458
+ .skill-card {
459
+ display: grid;
460
+ grid-template-columns: 40px minmax(0, 1fr) 22px;
461
+ gap: 0.8rem 0.85rem;
462
+ align-items: start;
463
+ margin: 0;
464
+ padding: 0.9rem 0.95rem;
465
+ background: var(--card);
466
+ border: 1px solid transparent;
467
+ border-radius: 14px;
468
+ cursor: pointer;
469
+ min-width: 0;
470
+ overflow: hidden;
471
+ }
472
+ .skill-card:hover { background: var(--card-hover); }
473
+ .skill-card.on { border-color: var(--line); background: var(--card-hover); }
474
+ .skill-card input { display: none; }
475
+ .skill-ico {
476
+ width: 40px;
477
+ height: 40px;
478
+ border-radius: 12px;
479
+ display: grid;
480
+ place-items: center;
481
+ font-size: 0.78rem;
482
+ font-weight: 700;
483
+ color: #fff;
484
+ }
485
+ .skill-meta {
486
+ min-width: 0;
487
+ }
488
+ .skill-meta strong {
489
+ display: block;
490
+ font-size: 0.95rem;
491
+ }
492
+ .skill-meta em {
493
+ display: block;
494
+ font-style: normal;
495
+ color: var(--muted);
496
+ font-size: 0.8rem;
497
+ margin-top: 0.12rem;
498
+ }
499
+ .skill-check {
500
+ width: 22px;
501
+ height: 22px;
502
+ margin-top: 0.15rem;
503
+ border-radius: 50%;
504
+ border: 1.5px solid #5a5a5a;
505
+ flex: none;
506
+ padding: 0;
507
+ background: transparent;
508
+ cursor: pointer;
509
+ justify-self: end;
510
+ }
511
+ .skill-card.on .skill-check {
512
+ border: 0;
513
+ background: var(--paper) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='%230B0E12' stroke-width='2.2' d='M3 8.2 6.3 11.5 13 4.5'/></svg>") center / 12px no-repeat;
514
+ }
515
+
516
+ .chips { display: flex; gap: 0.4rem; flex-wrap: wrap; margin: 1rem 0 0.8rem; }
517
+ .tag-row { margin: 0.2rem 0 0.85rem; }
518
+ .chip {
519
+ margin: 0;
520
+ padding: 0.35rem 0.75rem;
521
+ border-radius: 999px;
522
+ border: 0;
523
+ background: var(--fill);
524
+ color: var(--muted);
525
+ font-size: 0.85rem;
526
+ }
527
+ .chip.on { background: var(--paper); color: var(--ink); }
528
+ .chip-n {
529
+ opacity: 0.55;
530
+ font-variant-numeric: tabular-nums;
531
+ font-size: 0.78em;
532
+ }
533
+ .tag-list {
534
+ display: flex;
535
+ flex-wrap: wrap;
536
+ gap: 0.3rem;
537
+ margin: 0.4rem 0 0;
538
+ }
539
+ .mini-tag {
540
+ display: inline-flex;
541
+ margin: 0;
542
+ padding: 0.1rem 0.48rem;
543
+ border: 0;
544
+ border-radius: 999px;
545
+ background: var(--fill);
546
+ color: var(--muted);
547
+ font: inherit;
548
+ font-size: 0.72rem;
549
+ cursor: pointer;
550
+ }
551
+ .mini-tag:hover { color: var(--text); background: var(--lift); }
552
+ .mini-tag.on { background: var(--paper); color: var(--ink); }
553
+
554
+ .more {
555
+ margin: 0.4rem 0 1.2rem;
556
+ color: var(--muted);
557
+ font-size: 0.82rem;
558
+ background: none;
559
+ border: 0;
560
+ padding: 0;
561
+ text-align: left;
562
+ }
563
+ .more:hover { color: var(--text); }
564
+
565
+ .roster {
566
+ display: grid;
567
+ gap: 0.75rem;
568
+ grid-template-columns: 1fr;
569
+ }
570
+ @media (min-width: 760px) {
571
+ .roster { grid-template-columns: 1fr 1fr; }
572
+ }
573
+ .bot-card {
574
+ display: grid;
575
+ grid-template-columns: 44px 1fr auto;
576
+ gap: 0.85rem;
577
+ align-items: center;
578
+ background: var(--card);
579
+ border: 1px solid transparent;
580
+ border-radius: 14px;
581
+ padding: 0.95rem 1rem;
582
+ color: inherit;
583
+ text-decoration: none;
584
+ cursor: pointer;
585
+ }
586
+ a.bot-card:hover {
587
+ background: var(--card-hover);
588
+ border-color: var(--line);
589
+ text-decoration: none;
590
+ }
591
+ .bot-card strong { display: block; }
592
+ .bot-card span { color: var(--muted); font-size: 0.85rem; }
593
+ .bot-card .hint {
594
+ font-style: normal;
595
+ color: var(--muted);
596
+ font-size: 0.78rem;
597
+ }
598
+
599
+ .tabs { display: flex; gap: 0.4rem; margin: 0 0 1rem; }
600
+ .tab {
601
+ margin-top: 0;
602
+ background: var(--fill);
603
+ color: var(--muted);
604
+ border: 0;
605
+ }
606
+ .tab.on { background: var(--paper); color: var(--ink); }
607
+ .tab-pane.hidden { display: none; }
608
+ .hidden { display: none; }
609
+
610
+ .add-link {
611
+ display: inline-flex;
612
+ margin-top: 0.8rem;
613
+ font-size: 0.9rem;
614
+ }
615
+
616
+ .plain-list {
617
+ list-style: none;
618
+ margin: 0.4rem 0 0;
619
+ padding: 0;
620
+ display: grid;
621
+ gap: 0.35rem;
622
+ }
623
+ .plain-list li {
624
+ color: var(--text);
625
+ font-size: 0.92rem;
626
+ }
627
+ .plain-list .muted { font-size: 0.8rem; }
628
+
629
+ .toolbar {
630
+ display: flex;
631
+ flex-wrap: wrap;
632
+ gap: 0.75rem;
633
+ align-items: center;
634
+ margin: 0 0 1.1rem;
635
+ min-width: 0;
636
+ }
637
+ .toolbar .search { flex: 1 1 14rem; min-width: 0; margin: 0; }
638
+ .toolbar #skill-pick {
639
+ margin: 0;
640
+ flex: none;
641
+ white-space: nowrap;
642
+ }
643
+ @media (max-width: 640px) {
644
+ .toolbar #skill-pick { width: 100%; }
645
+ }
646
+ .skill-picker #skill-pick-flash {
647
+ margin: -0.45rem 0 0.85rem;
648
+ }
649
+ a.btn {
650
+ display: inline-flex;
651
+ align-items: center;
652
+ margin: 0;
653
+ padding: 0.55rem 0.95rem;
654
+ font-weight: 560;
655
+ color: #111;
656
+ background: var(--text);
657
+ border-radius: 999px;
658
+ text-decoration: none;
659
+ white-space: nowrap;
660
+ }
661
+ a.btn:hover { text-decoration: none; opacity: 0.92; }
662
+
663
+ .lib-card {
664
+ display: grid;
665
+ grid-template-columns: 40px minmax(0, 1fr);
666
+ gap: 0.8rem 0.85rem;
667
+ align-items: start;
668
+ margin: 0;
669
+ padding: 0.9rem 0.95rem;
670
+ background: var(--card);
671
+ border: 1px solid transparent;
672
+ border-radius: 14px;
673
+ cursor: pointer;
674
+ min-width: 0;
675
+ overflow: hidden;
676
+ }
677
+ .lib-card .lib-act {
678
+ grid-column: 1 / -1;
679
+ margin: 0.15rem 0 0;
680
+ }
681
+ .lib-card .lib-act button { margin: 0; }
682
+ .host-list {
683
+ display: flex;
684
+ flex-direction: column;
685
+ min-width: 0;
686
+ margin-top: 0.2rem;
687
+ }
688
+ .host-row {
689
+ display: grid;
690
+ grid-template-columns: minmax(0, 1fr) auto;
691
+ gap: 0.85rem 1rem;
692
+ align-items: center;
693
+ padding: 0.8rem 0;
694
+ border-top: 1px solid var(--line);
695
+ min-width: 0;
696
+ }
697
+ .host-row:first-child {
698
+ border-top: 0;
699
+ padding-top: 0.2rem;
700
+ }
701
+ .host-copy { min-width: 0; }
702
+ .host-copy strong {
703
+ display: block;
704
+ font-size: 0.95rem;
705
+ font-weight: 600;
706
+ }
707
+ .host-copy .sub {
708
+ margin: 0.2rem 0 0;
709
+ overflow: hidden;
710
+ text-overflow: ellipsis;
711
+ white-space: nowrap;
712
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
713
+ font-size: 0.75rem;
714
+ }
715
+ .host-act {
716
+ display: flex;
717
+ align-items: center;
718
+ flex: none;
719
+ }
720
+ .host-act button {
721
+ margin: 0;
722
+ white-space: nowrap;
723
+ min-width: 5.6rem;
724
+ padding: 0.45rem 1.05rem;
725
+ }
726
+ @media (max-width: 640px) {
727
+ .host-row {
728
+ grid-template-columns: 1fr;
729
+ align-items: start;
730
+ gap: 0.5rem;
731
+ }
732
+ }
733
+ .lib-card:hover { background: var(--card-hover); }
734
+ .lib-card.open { border-color: var(--line); }
735
+ .lib-card.skill-card {
736
+ grid-template-columns: 40px minmax(0, 1fr) 22px;
737
+ }
738
+ .lib-card .skill-ico { margin-top: 0.1rem; flex: none; }
739
+ .lib-card .lib-desc {
740
+ display: -webkit-box;
741
+ -webkit-box-orient: vertical;
742
+ -webkit-line-clamp: 2;
743
+ overflow: hidden;
744
+ white-space: normal;
745
+ overflow-wrap: anywhere;
746
+ line-height: 1.45;
747
+ }
748
+ .lib-card .hint {
749
+ display: block;
750
+ margin: 0.3rem 0 0;
751
+ padding: 0;
752
+ font-style: normal;
753
+ color: var(--muted);
754
+ font-size: 0.75rem;
755
+ overflow: hidden;
756
+ text-overflow: ellipsis;
757
+ white-space: nowrap;
758
+ }
759
+ .used-by {
760
+ margin: 0.35rem 0 0;
761
+ font-size: 0.8rem;
762
+ color: var(--muted);
763
+ overflow: hidden;
764
+ text-overflow: ellipsis;
765
+ white-space: nowrap;
766
+ }
767
+ .used-by a { margin-right: 0; }
768
+ .lib-body {
769
+ grid-column: 1 / -1;
770
+ margin: 0;
771
+ padding: 0.85rem 0.95rem;
772
+ background: var(--fill);
773
+ border-radius: 12px;
774
+ color: #cfcfcf;
775
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
776
+ font-size: 0.78rem;
777
+ white-space: pre-wrap;
778
+ max-height: 16rem;
779
+ overflow: auto;
780
+ }
781
+
782
+ .settings-page button { margin-top: 0; }
783
+ .settings-page input[type="checkbox"],
784
+ .settings-page input[type="radio"] {
785
+ width: auto;
786
+ height: 1rem;
787
+ padding: 0;
788
+ margin: 0;
789
+ border: 0;
790
+ background: none;
791
+ accent-color: var(--ok);
792
+ }
793
+ .settings-page .lede { color: var(--muted); }
794
+ .account {
795
+ display: grid;
796
+ grid-template-columns: minmax(0, 1fr) auto;
797
+ gap: 1rem;
798
+ align-items: center;
799
+ padding: 0.95rem 0;
800
+ border-top: 1px solid var(--line);
801
+ }
802
+ .account:first-of-type { border-top: 0; padding-top: 0.2rem; }
803
+ .account-copy { min-width: 0; }
804
+ .account strong { display: block; }
805
+ .account .sub { margin: 0.25rem 0 0; }
806
+ .account-act { display: flex; align-items: center; }
807
+ .account-act button {
808
+ white-space: nowrap;
809
+ min-width: 5.6rem;
810
+ padding: 0.45rem 1.05rem;
811
+ }
812
+ .badge {
813
+ display: inline-block;
814
+ margin-left: 0.4rem;
815
+ padding: 0.1rem 0.4rem;
816
+ border-radius: 6px;
817
+ font-size: 0.72rem;
818
+ background: #1f2a22;
819
+ color: var(--ok);
820
+ vertical-align: middle;
821
+ }
822
+ .badge.wait { background: #2a2a22; color: #e6d48a; }
823
+ .badge.empty { background: #222; color: #888; }
824
+ .row { display: grid; grid-template-columns: 1fr; gap: 0.55rem; margin-bottom: 0.7rem; }
825
+ @media (min-width: 720px) {
826
+ .row.pick { grid-template-columns: 1fr 1fr auto; align-items: end; }
827
+ }
828
+ .main-now {
829
+ margin: 0.15rem 0 0.85rem;
830
+ color: var(--text);
831
+ font-size: 0.92rem;
832
+ }
833
+ .aux-head-row,
834
+ .aux-row {
835
+ display: grid;
836
+ grid-template-columns: minmax(8.5rem, 0.85fr) minmax(0, 1.5fr) auto;
837
+ gap: 0.55rem 1rem;
838
+ align-items: center;
839
+ padding: 0.8rem 0;
840
+ border-top: 1px solid var(--line);
841
+ }
842
+ .aux-head-row {
843
+ border-top: 0;
844
+ padding: 0 0 0.45rem;
845
+ font-size: 0.7rem;
846
+ letter-spacing: 0.07em;
847
+ text-transform: uppercase;
848
+ color: #8b8b8b;
849
+ }
850
+ .aux-task strong { display: block; font-size: 0.95rem; }
851
+ .aux-row .tag {
852
+ display: inline-block;
853
+ margin: 0.2rem 0 0;
854
+ padding: 0.08rem 0.4rem;
855
+ border-radius: 999px;
856
+ background: var(--fill);
857
+ color: #aaa;
858
+ font-size: 0.72rem;
859
+ }
860
+ .aux-now b {
861
+ display: block;
862
+ font-weight: 600;
863
+ color: var(--text);
864
+ }
865
+ .aux-now .id {
866
+ display: block;
867
+ margin-top: 0.15rem;
868
+ color: #8b8b8b;
869
+ font-size: 0.75rem;
870
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
871
+ }
872
+ .aux-act {
873
+ display: flex;
874
+ align-items: center;
875
+ justify-content: flex-end;
876
+ gap: 0.55rem;
877
+ flex-wrap: wrap;
878
+ }
879
+ .aux-act .badge { margin-left: 0; }
880
+ @media (max-width: 720px) {
881
+ .aux-head-row { display: none; }
882
+ .aux-row {
883
+ grid-template-columns: 1fr;
884
+ gap: 0.35rem;
885
+ }
886
+ .aux-act { justify-content: flex-start; }
887
+ }
888
+ .linkish {
889
+ background: none;
890
+ border: 0;
891
+ color: var(--text);
892
+ text-decoration: underline;
893
+ cursor: pointer;
894
+ margin: 0 0.6rem 0 0;
895
+ padding: 0;
896
+ font: inherit;
897
+ }
898
+ .codebox {
899
+ font-family: ui-monospace, Menlo, monospace;
900
+ background: #000;
901
+ padding: 0.7rem;
902
+ border-radius: 10px;
903
+ letter-spacing: 0.08em;
904
+ }
905
+ .model-row {
906
+ display: grid;
907
+ grid-template-columns: 1fr 1fr auto;
908
+ gap: 0.4rem;
909
+ margin-top: 0.4rem;
910
+ align-items: center;
911
+ }
912
+ .model-row button { margin: 0; min-width: 2.2rem; padding: 0.4rem 0.55rem; }
913
+ .row-2 { display: grid; grid-template-columns: 1fr; gap: 0.6rem; }
914
+ @media (min-width: 720px) {
915
+ .row-2 { grid-template-columns: 1fr 1fr; }
916
+ }
917
+ .key-tabs {
918
+ display: flex;
919
+ flex-wrap: wrap;
920
+ gap: 0.4rem;
921
+ margin: 0.85rem 0 0.2rem;
922
+ }
923
+ .key-tab {
924
+ display: inline-flex;
925
+ align-items: center;
926
+ gap: 0.25rem;
927
+ margin: 0;
928
+ padding: 0.4rem 0.75rem;
929
+ border: 1px solid var(--line);
930
+ border-radius: 999px;
931
+ background: var(--fill);
932
+ color: var(--muted);
933
+ font: inherit;
934
+ font-size: 0.86rem;
935
+ cursor: pointer;
936
+ }
937
+ .key-tab:hover { color: var(--text); border-color: #333; }
938
+ .key-tab.on {
939
+ background: #1c1c1c;
940
+ color: var(--text);
941
+ border-color: #3a3a3a;
942
+ }
943
+ .key-tab.add {
944
+ border-style: dashed;
945
+ background: transparent;
946
+ color: var(--muted);
947
+ }
948
+ .key-tab.add:hover {
949
+ color: var(--text);
950
+ border-color: #555;
951
+ background: var(--fill);
952
+ }
953
+ .key-tab:focus { outline: none; }
954
+ .key-tab:focus-visible {
955
+ box-shadow: 0 0 0 2px #000, 0 0 0 4px #6a6a6a;
956
+ }
957
+ .key-tab .badge { margin-left: 0.15rem; }
958
+ dialog.pick.add-provider { width: min(32rem, 92vw); }
959
+ .preset-grid {
960
+ display: grid;
961
+ grid-template-columns: repeat(2, minmax(0, 1fr));
962
+ gap: 0.45rem;
963
+ margin: 0.15rem 0 0;
964
+ }
965
+ .preset-grid button {
966
+ margin: 0;
967
+ padding: 0.7rem 0.85rem;
968
+ border: 1px solid var(--line);
969
+ border-radius: 12px;
970
+ background: var(--fill);
971
+ color: var(--text);
972
+ font: inherit;
973
+ font-size: 0.88rem;
974
+ font-weight: 550;
975
+ text-align: left;
976
+ cursor: pointer;
977
+ }
978
+ .preset-grid button:hover {
979
+ border-color: #3a3a3a;
980
+ background: #1c1c1c;
981
+ }
982
+ .preset-grid button:focus { outline: none; }
983
+ .preset-grid button:focus-visible {
984
+ border-color: #6a6a6a;
985
+ box-shadow: 0 0 0 2px #000, 0 0 0 4px #5a5a5a;
986
+ }
987
+ .preset-grid button[data-preset="custom"] { grid-column: 1 / -1; }
988
+ .preset-grid button .hint {
989
+ display: block;
990
+ margin-top: 0.18rem;
991
+ color: var(--muted);
992
+ font-size: 0.72rem;
993
+ font-weight: 400;
994
+ }
995
+ .toggles {
996
+ display: flex;
997
+ gap: 1rem;
998
+ align-items: center;
999
+ flex-wrap: wrap;
1000
+ margin: 0.75rem 0 0.5rem;
1001
+ }
1002
+ .toggles select { width: auto; min-width: 9rem; }
1003
+ .toggles label {
1004
+ display: inline-flex;
1005
+ align-items: center;
1006
+ gap: 0.4rem;
1007
+ margin: 0;
1008
+ color: inherit;
1009
+ font-size: 0.9rem;
1010
+ }
1011
+ .warn { color: #e6d48a; font-size: 0.82rem; margin: 0.35rem 0 0; }
1012
+ .provider-card {
1013
+ border: 1px solid var(--line);
1014
+ border-radius: 12px;
1015
+ padding: 0.9rem 1rem;
1016
+ margin-top: 0.75rem;
1017
+ background: var(--lift);
1018
+ }
1019
+ .provider-card [data-f="apiKey"] {
1020
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
1021
+ letter-spacing: 0.02em;
1022
+ }
1023
+ .card-head {
1024
+ display: flex;
1025
+ justify-content: space-between;
1026
+ align-items: center;
1027
+ gap: 0.7rem;
1028
+ margin-bottom: 0.35rem;
1029
+ }
1030
+ .card-head h3 { margin: 0; font-size: 0.95rem; font-weight: 600; }
1031
+ .card-head .ghost { margin: 0; }
1032
+ .card-foot {
1033
+ display: flex;
1034
+ justify-content: flex-end;
1035
+ align-items: center;
1036
+ gap: 0.6rem;
1037
+ margin-top: 0.85rem;
1038
+ padding-top: 0.75rem;
1039
+ border-top: 1px solid var(--line);
1040
+ }
1041
+ .card-foot .hint { margin: 0; color: var(--muted); font-size: 0.8rem; margin-right: auto; }
1042
+ .card-foot button { margin: 0; }
1043
+ #apply, #paste-go { margin-top: 0.55rem; }
1044
+ dialog.pick {
1045
+ background: var(--card);
1046
+ color: var(--text);
1047
+ border: 1px solid var(--line);
1048
+ border-radius: 14px;
1049
+ padding: 1rem;
1050
+ width: min(28rem, 92vw);
1051
+ }
1052
+ dialog.pick::backdrop { background: rgba(0,0,0,0.55); }
1053
+ dialog.pick h2 { margin-bottom: 0.6rem; }
1054
+ dialog.pick .dialog-actions {
1055
+ display: flex;
1056
+ justify-content: flex-end;
1057
+ gap: 0.5rem;
1058
+ margin-top: 0.9rem;
1059
+ }
1060
+
1061
+ body.app.bar-page .page-body {
1062
+ max-width: 68rem;
1063
+ padding-top: 0.85rem;
1064
+ }
1065
+ body.app.bar-page .shell {
1066
+ max-width: none;
1067
+ padding: 1.1rem 0 2rem;
1068
+ }
1069
+ .rpg-wrap {
1070
+ max-width: 960px;
1071
+ margin: 0 auto;
1072
+ padding: 0 0 0.4rem;
1073
+ }
1074
+ .rpg-screen {
1075
+ display: grid;
1076
+ grid-template-rows: auto auto;
1077
+ position: relative;
1078
+ overflow: hidden;
1079
+ background: #000;
1080
+ border: 4px solid #0a0a12;
1081
+ box-shadow: 8px 8px 0 #000;
1082
+ image-rendering: pixelated;
1083
+ }
1084
+ body.bar-page .rpg-screen {
1085
+ background: #1a1410;
1086
+ border-color: #1a1410;
1087
+ box-shadow: 8px 8px 0 #1a1410;
1088
+ }
1089
+ .rpg-scene {
1090
+ grid-row: 1;
1091
+ grid-column: 1;
1092
+ position: relative;
1093
+ aspect-ratio: 16 / 9;
1094
+ min-height: 0;
1095
+ overflow: hidden;
1096
+ }
1097
+ .rpg-scene[hidden] { display: none; }
1098
+ .rpg-bg {
1099
+ display: block;
1100
+ width: 100%;
1101
+ height: 100%;
1102
+ object-fit: cover;
1103
+ image-rendering: pixelated;
1104
+ }
1105
+ .rpg-door {
1106
+ position: absolute;
1107
+ left: 38.5%;
1108
+ top: 49%;
1109
+ width: 8.2%;
1110
+ height: 24%;
1111
+ margin: 0;
1112
+ padding: 0;
1113
+ border: 0;
1114
+ background: transparent;
1115
+ cursor: pointer;
1116
+ }
1117
+ .rpg-door:hover { background: #f0d06022; }
1118
+ .rpg-arrow {
1119
+ position: absolute;
1120
+ left: 50%;
1121
+ top: -18px;
1122
+ width: 0;
1123
+ height: 0;
1124
+ border-left: 8px solid transparent;
1125
+ border-right: 8px solid transparent;
1126
+ border-top: 14px solid #e23b3b;
1127
+ transform: translateX(-50%);
1128
+ filter: drop-shadow(0 2px 0 #4a0000);
1129
+ animation: rpg-nudge 0.7s steps(2) infinite;
1130
+ }
1131
+ @keyframes rpg-nudge {
1132
+ 0%, 100% { transform: translateX(-50%) translateY(0); }
1133
+ 50% { transform: translateX(-50%) translateY(6px); }
1134
+ }
1135
+ .inn-map {
1136
+ position: absolute;
1137
+ inset: 0;
1138
+ background-color: #3d6b52;
1139
+ background-image: repeating-conic-gradient(#3d6b52 0% 25%, #335c46 0% 50%);
1140
+ background-size: 16px 16px;
1141
+ }
1142
+ .inn-wall {
1143
+ position: absolute;
1144
+ left: 0;
1145
+ right: 0;
1146
+ top: 0;
1147
+ height: 56px;
1148
+ display: flex;
1149
+ align-items: flex-end;
1150
+ justify-content: center;
1151
+ gap: 28px;
1152
+ padding: 0 12px 8px;
1153
+ background:
1154
+ linear-gradient(#1c2a44 0 14px, transparent 14px),
1155
+ repeating-linear-gradient(#6b5340 0 14px, #5a4534 14px 16px);
1156
+ box-shadow: inset 0 -4px 0 #1a1410;
1157
+ z-index: 1;
1158
+ }
1159
+ .inn-window {
1160
+ width: 42px;
1161
+ height: 28px;
1162
+ background:
1163
+ linear-gradient(#0b1020 0 5px, transparent 5px) 0 12px / 100% 2px no-repeat,
1164
+ linear-gradient(90deg, #0b1020 0 2px, transparent 2px) 20px 0 / 2px 100% no-repeat,
1165
+ linear-gradient(#2a3a6a, #12182c);
1166
+ box-shadow: inset 0 0 0 3px #2a2118, 0 0 0 2px #1a1410;
1167
+ }
1168
+ .inn-nook {
1169
+ position: absolute;
1170
+ top: 56px;
1171
+ bottom: 0;
1172
+ width: 56px;
1173
+ display: flex;
1174
+ flex-direction: column;
1175
+ align-items: center;
1176
+ justify-content: space-evenly;
1177
+ z-index: 1;
1178
+ background:
1179
+ repeating-linear-gradient(90deg, #2a4638 0 14px, #244032 14px 16px);
1180
+ background-size: 16px 16px;
1181
+ }
1182
+ .inn-nook-l { left: 0; border-right: 2px solid #1a2a22; }
1183
+ .inn-nook-r { right: 0; border-left: 2px solid #1a2a22; }
1184
+ .inn-prop.plant {
1185
+ width: 28px;
1186
+ height: 36px;
1187
+ background:
1188
+ linear-gradient(#3d8c4a 0 14px, transparent 14px),
1189
+ linear-gradient(#8a5a32 0 100%);
1190
+ background-position: center 0, center 16px;
1191
+ background-repeat: no-repeat;
1192
+ background-size: 18px 16px, 8px 20px;
1193
+ }
1194
+ .inn-bar {
1195
+ width: 36px;
1196
+ height: 48%;
1197
+ background: #6b3e22;
1198
+ box-shadow: inset 0 0 0 3px #4a2814, 4px 4px 0 #2a160e;
1199
+ }
1200
+ .inn-bottles {
1201
+ display: flex;
1202
+ gap: 4px;
1203
+ align-items: flex-end;
1204
+ height: 22px;
1205
+ }
1206
+ .inn-bottles span {
1207
+ width: 6px;
1208
+ height: 16px;
1209
+ box-shadow: 0 -4px 0 -2px #e8e8e8;
1210
+ }
1211
+ .inn-actors {
1212
+ position: absolute;
1213
+ top: 56px;
1214
+ left: 56px;
1215
+ right: 56px;
1216
+ bottom: 0;
1217
+ z-index: 2;
1218
+ display: grid;
1219
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1220
+ align-content: start;
1221
+ justify-items: center;
1222
+ gap: 12px 6px;
1223
+ padding: 22px 0 10px;
1224
+ overflow: auto;
1225
+ }
1226
+ .inn-station {
1227
+ position: relative;
1228
+ display: flex;
1229
+ flex-direction: column;
1230
+ align-items: center;
1231
+ width: 88px;
1232
+ z-index: 2;
1233
+ }
1234
+ @media (max-width: 720px) {
1235
+ .inn-actors {
1236
+ left: 8px;
1237
+ right: 8px;
1238
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1239
+ }
1240
+ }
1241
+ @media (max-width: 480px) {
1242
+ .inn-actors { grid-template-columns: repeat(2, minmax(0, 1fr)); }
1243
+ }
1244
+ .inn-desk {
1245
+ order: 2;
1246
+ position: relative;
1247
+ width: 72px;
1248
+ height: 20px;
1249
+ margin-top: -8px;
1250
+ background: #8a5a32;
1251
+ box-shadow: 0 3px 0 #6a4020, 0 5px 0 #3a2414, inset 0 2px 0 #b07a48;
1252
+ z-index: 1;
1253
+ }
1254
+ .inn-monitor {
1255
+ position: absolute;
1256
+ left: 50%;
1257
+ bottom: 14px;
1258
+ width: 28px;
1259
+ height: 18px;
1260
+ margin-left: -14px;
1261
+ background: #1a1a1a;
1262
+ box-shadow: 0 0 0 2px #111;
1263
+ }
1264
+ .inn-monitor::after {
1265
+ content: "";
1266
+ position: absolute;
1267
+ inset: 3px 3px 4px;
1268
+ background: repeating-linear-gradient(#7ec8e8 0 2px, #4aa3c8 2px 4px);
1269
+ }
1270
+ .inn-station:has(.rpg-npc.vacant) .inn-monitor::after { background: #2a2a2a; }
1271
+ .rpg-npc {
1272
+ position: relative;
1273
+ display: flex;
1274
+ flex-direction: column;
1275
+ align-items: center;
1276
+ order: 1;
1277
+ margin: 0;
1278
+ padding: 0;
1279
+ border: 0;
1280
+ background: transparent;
1281
+ color: inherit;
1282
+ cursor: pointer;
1283
+ z-index: 2;
1284
+ }
1285
+ .rpg-npc .npc-bust,
1286
+ .rpg-npc .npc-blank {
1287
+ width: 72px;
1288
+ height: 72px;
1289
+ box-sizing: border-box;
1290
+ border: 3px solid #1a1410;
1291
+ background: #2a2118;
1292
+ box-shadow: 2px 3px 0 #0006;
1293
+ }
1294
+ .rpg-npc .npc-bust {
1295
+ object-fit: cover;
1296
+ object-position: center 18%;
1297
+ display: block;
1298
+ }
1299
+ .rpg-npc .npc-blank {
1300
+ display: grid;
1301
+ place-items: center;
1302
+ color: #f0d9a0;
1303
+ font-family: VT323, ui-monospace, monospace;
1304
+ font-size: 28px;
1305
+ line-height: 1;
1306
+ }
1307
+ .rpg-npc.drawing .npc-bust,
1308
+ .rpg-npc.drawing .npc-blank {
1309
+ filter: brightness(1.25) drop-shadow(0 0 6px #f0d060);
1310
+ }
1311
+ .rpg-npc .tag {
1312
+ order: 3;
1313
+ margin-top: 6px;
1314
+ padding: 1px 5px;
1315
+ background: #1a1410;
1316
+ color: #f0d9a0;
1317
+ font-family: VT323, ui-monospace, monospace;
1318
+ font-size: 15px;
1319
+ line-height: 1.1;
1320
+ white-space: nowrap;
1321
+ z-index: 3;
1322
+ }
1323
+ .npc-state {
1324
+ position: absolute;
1325
+ top: 0;
1326
+ left: 50%;
1327
+ z-index: 4;
1328
+ padding: 0 5px;
1329
+ border: 0;
1330
+ background: #f4ead7;
1331
+ color: #1a1410;
1332
+ font-family: VT323, ui-monospace, monospace;
1333
+ font-size: 14px;
1334
+ line-height: 1.2;
1335
+ white-space: nowrap;
1336
+ box-shadow: 2px 2px 0 #1a1410;
1337
+ transform: translate(-50%, calc(-100% - 4px));
1338
+ }
1339
+ .npc-state.live {
1340
+ background: var(--signal);
1341
+ color: #1a1410;
1342
+ }
1343
+ .rpg-npc:hover .npc-bust,
1344
+ .rpg-npc:hover .npc-blank { filter: brightness(1.18) drop-shadow(0 0 6px #f0d060); }
1345
+ .rpg-npc.on .npc-bust,
1346
+ .rpg-npc.on .npc-blank { outline: 2px solid #f0d060; outline-offset: 1px; }
1347
+ .rpg-npc.vacant .npc-blank { opacity: 0.55; }
1348
+ .rpg-npc.vacant .tag { color: #f0d060; }
1349
+ .rpg-exit {
1350
+ position: absolute;
1351
+ left: 10px;
1352
+ top: 10px;
1353
+ z-index: 4;
1354
+ margin: 0;
1355
+ padding: 4px 8px;
1356
+ border: 2px solid #c9a227;
1357
+ background: #1a2248;
1358
+ color: #f4f0e0;
1359
+ font-family: "Press Start 2P", ui-monospace, monospace;
1360
+ font-size: 8px;
1361
+ cursor: pointer;
1362
+ }
1363
+ .rpg-exit:hover { background: #2a3460; }
1364
+ body.bar-page .rpg-exit {
1365
+ border-color: #1a1410;
1366
+ background: #f4ead7;
1367
+ color: #1a1410;
1368
+ }
1369
+ body.bar-page .rpg-exit:hover { background: #e8dcc4; }
1370
+ .rpg-dialog {
1371
+ grid-row: 2;
1372
+ position: relative;
1373
+ z-index: 5;
1374
+ margin: 8px 12px 10px;
1375
+ padding: 3px;
1376
+ background: #08080f;
1377
+ box-shadow: 0 0 0 2px #c9a227, inset 0 0 0 2px #3a4a8a;
1378
+ }
1379
+ body.bar-page .rpg-dialog {
1380
+ background: #1a1410;
1381
+ box-shadow: 0 0 0 3px #1a1410, 4px 4px 0 #1a1410;
1382
+ }
1383
+ .rpg-dialog-inner {
1384
+ display: flex;
1385
+ align-items: flex-start;
1386
+ gap: 10px;
1387
+ min-height: 92px;
1388
+ padding: 10px 14px 8px;
1389
+ background: linear-gradient(#2a3668, #1a2248 55%, #141a3a);
1390
+ }
1391
+ .rpg-face {
1392
+ flex: none;
1393
+ width: 56px;
1394
+ height: 56px;
1395
+ object-fit: cover;
1396
+ object-position: center 18%;
1397
+ border: 3px solid #1a1410;
1398
+ background: #2a2118;
1399
+ }
1400
+ .rpg-face[hidden] { display: none; }
1401
+ .rpg-copy { min-width: 0; flex: 1; }
1402
+ body.bar-page .rpg-dialog-inner {
1403
+ background: #f4ead7;
1404
+ }
1405
+ .rpg-name {
1406
+ margin: 0 0 6px;
1407
+ color: #f0d060;
1408
+ font-family: "Press Start 2P", ui-monospace, monospace;
1409
+ font-size: 10px;
1410
+ letter-spacing: 0.04em;
1411
+ }
1412
+ .rpg-line {
1413
+ margin: 0;
1414
+ min-height: 2.4em;
1415
+ color: #f4f4f8;
1416
+ font-family: VT323, ui-monospace, monospace;
1417
+ font-size: 22px;
1418
+ line-height: 1.2;
1419
+ overflow-wrap: anywhere;
1420
+ }
1421
+ body.bar-page .rpg-name { color: #6b4228; }
1422
+ body.bar-page .rpg-line { color: #1a1410; }
1423
+ .rpg-acts {
1424
+ display: flex;
1425
+ flex-wrap: wrap;
1426
+ gap: 8px;
1427
+ margin-top: 8px;
1428
+ min-height: 22px;
1429
+ }
1430
+ .rpg-acts a,
1431
+ .rpg-acts button {
1432
+ appearance: none;
1433
+ margin: 0;
1434
+ padding: 3px 8px;
1435
+ border: 2px solid #c9a227;
1436
+ border-radius: 0;
1437
+ background: #141a3a;
1438
+ color: #f4f0e0;
1439
+ font-family: VT323, ui-monospace, monospace;
1440
+ font-size: 18px;
1441
+ font-weight: 400;
1442
+ line-height: 1.2;
1443
+ text-decoration: none;
1444
+ box-shadow: none;
1445
+ cursor: pointer;
1446
+ }
1447
+ .rpg-acts a:hover,
1448
+ .rpg-acts button:hover { background: #2a3460; text-decoration: none; }
1449
+ body.bar-page .rpg-acts a,
1450
+ body.bar-page .rpg-acts button {
1451
+ border-color: #1a1410;
1452
+ background: #f4ead7;
1453
+ color: #1a1410;
1454
+ }
1455
+ body.bar-page .rpg-acts a:hover,
1456
+ body.bar-page .rpg-acts button:hover { background: #e8dcc4; }
1457
+
1458
+ body.office-page {
1459
+ background: #1a1714;
1460
+ }
1461
+ .office-shell {
1462
+ max-width: 72rem;
1463
+ margin: 0 auto;
1464
+ padding: 1.4rem 1.2rem 3rem;
1465
+ }
1466
+ .office-hud .eyebrow {
1467
+ font-family: "Press Start 2P", ui-monospace, monospace;
1468
+ font-size: 0.58rem;
1469
+ letter-spacing: 0.18em;
1470
+ }
1471
+ .office-hud h1 {
1472
+ font-family: "Press Start 2P", ui-monospace, monospace;
1473
+ font-size: 1.15rem;
1474
+ line-height: 1.5;
1475
+ letter-spacing: 0;
1476
+ }
1477
+ .office-hud .lede,
1478
+ .office-hud #status {
1479
+ font-family: VT323, ui-monospace, monospace;
1480
+ font-size: 1.25rem;
1481
+ }
1482
+ .office {
1483
+ display: grid;
1484
+ grid-template-columns: 92px 1fr 92px;
1485
+ grid-template-rows: 86px minmax(340px, auto) auto;
1486
+ grid-template-areas:
1487
+ "wall wall wall"
1488
+ "nookl floor nookr"
1489
+ "talk talk talk";
1490
+ margin-top: 0.8rem;
1491
+ border: 4px solid #0e0c0a;
1492
+ box-shadow: 8px 8px 0 #0e0c0a;
1493
+ image-rendering: pixelated;
1494
+ overflow: hidden;
1495
+ }
1496
+ .wall {
1497
+ grid-area: wall;
1498
+ position: relative;
1499
+ display: flex;
1500
+ align-items: flex-end;
1501
+ justify-content: center;
1502
+ gap: 1.4rem;
1503
+ padding: 0 1rem 0.7rem;
1504
+ background:
1505
+ linear-gradient(#1c2a44 0 18px, transparent 18px),
1506
+ repeating-linear-gradient(#6b5340 0 14px, #5a4534 14px 16px);
1507
+ }
1508
+ .window {
1509
+ width: 54px;
1510
+ height: 42px;
1511
+ background:
1512
+ linear-gradient(#0b1020 0 6px, transparent 6px) 0 18px / 100% 2px no-repeat,
1513
+ linear-gradient(90deg, #0b1020 0 2px, transparent 2px) 26px 0 / 2px 100% no-repeat,
1514
+ linear-gradient(#2a3a6a, #12182c);
1515
+ box-shadow: inset 0 0 0 3px #2a2118, 0 0 0 2px #1a1410;
1516
+ }
1517
+ .banner,
1518
+ .clock {
1519
+ position: absolute;
1520
+ top: 10px;
1521
+ font-family: "Press Start 2P", ui-monospace, monospace;
1522
+ font-size: 0.55rem;
1523
+ color: #f0d9a0;
1524
+ text-shadow: 2px 2px 0 #1a1410;
1525
+ }
1526
+ .banner { left: 14px; }
1527
+ .clock { right: 14px; color: #8ee0a8; }
1528
+ .nook {
1529
+ display: flex;
1530
+ flex-direction: column;
1531
+ align-items: center;
1532
+ justify-content: space-evenly;
1533
+ background:
1534
+ repeating-linear-gradient(
1535
+ 90deg,
1536
+ #2a4638 0 14px,
1537
+ #244032 14px 16px
1538
+ );
1539
+ background-size: 16px 16px;
1540
+ }
1541
+ .nook-l { grid-area: nookl; border-right: 2px solid #1a2a22; }
1542
+ .nook-r { grid-area: nookr; border-left: 2px solid #1a2a22; }
1543
+ .floor {
1544
+ grid-area: floor;
1545
+ display: grid;
1546
+ grid-template-columns: repeat(3, 1fr);
1547
+ gap: 0.6rem 0.4rem;
1548
+ padding: 1.6rem 1.2rem 1.8rem;
1549
+ background-color: #3d6b52;
1550
+ background-image: repeating-conic-gradient(#3d6b52 0% 25%, #335c46 0% 50%);
1551
+ background-size: 16px 16px;
1552
+ }
1553
+ .station {
1554
+ position: relative;
1555
+ display: flex;
1556
+ flex-direction: column;
1557
+ align-items: center;
1558
+ color: inherit;
1559
+ text-decoration: none;
1560
+ image-rendering: pixelated;
1561
+ }
1562
+ .station:hover,
1563
+ .station:focus-visible {
1564
+ text-decoration: none;
1565
+ filter: brightness(1.08);
1566
+ z-index: 4;
1567
+ }
1568
+ .desk-sprite {
1569
+ width: 96px;
1570
+ height: 30px;
1571
+ background: #8a5a32;
1572
+ box-shadow:
1573
+ 0 4px 0 #6a4020,
1574
+ 0 6px 0 #3a2414,
1575
+ inset 0 2px 0 #b07a48;
1576
+ position: relative;
1577
+ z-index: 2;
1578
+ margin-top: -40px;
1579
+ }
1580
+ .monitor {
1581
+ position: absolute;
1582
+ left: 50%;
1583
+ bottom: 20px;
1584
+ width: 34px;
1585
+ height: 22px;
1586
+ margin-left: -17px;
1587
+ background: #1a1a1a;
1588
+ box-shadow: 0 0 0 2px #111;
1589
+ }
1590
+ .monitor::after {
1591
+ content: "";
1592
+ position: absolute;
1593
+ inset: 3px 3px 4px;
1594
+ background: repeating-linear-gradient(#7ec8e8 0 2px, #4aa3c8 2px 4px);
1595
+ }
1596
+ .buddy {
1597
+ width: 72px;
1598
+ height: 128px;
1599
+ position: relative;
1600
+ z-index: 1;
1601
+ image-rendering: pixelated;
1602
+ animation: bob 1.2s steps(2) infinite;
1603
+ }
1604
+ @keyframes bob {
1605
+ 0%, 100% { transform: translateY(0); }
1606
+ 50% { transform: translateY(-4px); }
1607
+ }
1608
+ .nameplate {
1609
+ position: relative;
1610
+ z-index: 3;
1611
+ margin-top: 0.55rem;
1612
+ padding: 0.2rem 0.45rem;
1613
+ background: #1a1410;
1614
+ color: #f0d9a0;
1615
+ font-family: "Press Start 2P", ui-monospace, monospace;
1616
+ font-size: 0.48rem;
1617
+ line-height: 1.6;
1618
+ max-width: 140px;
1619
+ text-align: center;
1620
+ }
1621
+ .dialogue {
1622
+ grid-area: talk;
1623
+ min-height: 3.2rem;
1624
+ padding: 0.7rem 0.9rem;
1625
+ background: #f4ead7;
1626
+ color: #1a1410;
1627
+ font-family: VT323, ui-monospace, monospace;
1628
+ font-size: 1.2rem;
1629
+ line-height: 1.35;
1630
+ border-top: 4px solid #0e0c0a;
1631
+ }
1632
+ .station.vacant { opacity: 0.62; }
1633
+ .station.vacant .buddy { display: none; }
1634
+ .station.vacant .desk-sprite { margin-top: 40px; }
1635
+ .station.vacant .monitor::after { background: #2a2a2a; }
1636
+ .prop {
1637
+ image-rendering: pixelated;
1638
+ width: 36px;
1639
+ height: 48px;
1640
+ }
1641
+ .prop.plant {
1642
+ background:
1643
+ linear-gradient(#3d8c4a 0 18px, transparent 18px),
1644
+ linear-gradient(#8a5a32 0 100%);
1645
+ background-position: center 0, center 22px;
1646
+ background-repeat: no-repeat;
1647
+ background-size: 22px 22px, 10px 26px;
1648
+ box-shadow: 8px 6px 0 -6px #2f6a38, -8px 8px 0 -6px #4aa056;
1649
+ }
1650
+ .prop.cooler {
1651
+ background:
1652
+ linear-gradient(#7ec8e8 0 14px, #d8eef6 14px 18px, #d0d4d8 18px 100%);
1653
+ box-shadow: inset 0 0 0 2px #1a1410;
1654
+ }
1655
+ .prop.coffee {
1656
+ background:
1657
+ linear-gradient(#2a2a2a 0 10px, #6a4030 10px 16px, #1a1a1a 16px 100%);
1658
+ box-shadow: inset 0 0 0 2px #111;
1659
+ }
1660
+ .prop.board {
1661
+ width: 44px;
1662
+ height: 36px;
1663
+ background: #e8e2c8;
1664
+ box-shadow: inset 0 0 0 3px #5a4030, 0 0 0 2px #1a1410;
1665
+ }
1666
+ @media (max-width: 720px) {
1667
+ .office {
1668
+ grid-template-columns: 1fr;
1669
+ grid-template-rows: 72px auto auto auto;
1670
+ grid-template-areas:
1671
+ "wall"
1672
+ "floor"
1673
+ "nookl"
1674
+ "nookr"
1675
+ "talk";
1676
+ }
1677
+ .nook { flex-direction: row; justify-content: center; gap: 2rem; min-height: 64px; }
1678
+ }