@kevin5251984/guild 0.2.12 → 0.2.14

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.
@@ -16,7 +16,12 @@
16
16
  --accent: #A8B0BC;
17
17
  --ok: #9fdfb2;
18
18
  --err: #fca5a5;
19
+ --danger: #f0a8a8;
19
20
  --radius: 14px;
21
+ --press: 0.97;
22
+ --ease-out: cubic-bezier(0.23, 1, 0.32, 1);
23
+ --press-ms: 140ms;
24
+ --hover-ms: 160ms;
20
25
  --focus: 0 0 0 2px var(--bg), 0 0 0 3px var(--steel);
21
26
  color: var(--text);
22
27
  background: var(--bg);
@@ -88,6 +93,7 @@ select:focus-visible {
88
93
  }
89
94
  .locale-switch button.on,
90
95
  .locale-switch button:hover { background: var(--lift); color: var(--text); }
96
+ .locale-switch button:active:not(:disabled) { transform: scale(var(--press)); }
91
97
 
92
98
  body.app {
93
99
  display: grid;
@@ -329,6 +335,19 @@ button {
329
335
  border: 0;
330
336
  border-radius: 999px;
331
337
  cursor: pointer;
338
+ transition:
339
+ background-color var(--hover-ms) ease,
340
+ border-color var(--hover-ms) ease,
341
+ color var(--hover-ms) ease,
342
+ transform var(--press-ms) var(--ease-out),
343
+ opacity var(--hover-ms) ease;
344
+ }
345
+ /* :where keeps this weaker than tavern / steel / ghost rules. */
346
+ button:where(:hover):where(:not(:disabled)) {
347
+ background: color-mix(in srgb, var(--paper) 88%, white);
348
+ }
349
+ button:where(:active):where(:not(:disabled)) {
350
+ transform: scale(var(--press));
332
351
  }
333
352
  button.secondary {
334
353
  background: transparent;
@@ -336,31 +355,15 @@ button.secondary {
336
355
  border: 1px solid var(--line);
337
356
  margin-top: 0.55rem;
338
357
  }
358
+ button.secondary:hover:not(:disabled) {
359
+ background: var(--lift);
360
+ color: var(--text);
361
+ }
339
362
  button.danger {
340
- color: #fca5a5;
363
+ color: var(--danger);
341
364
  border-color: #4a2a2a;
342
365
  }
343
366
  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
367
 
365
368
  .grid { display: grid; gap: 1rem; }
366
369
  @media (min-width: 760px) {
@@ -523,7 +526,10 @@ button.is-busy::after {
523
526
  background: var(--fill);
524
527
  color: var(--muted);
525
528
  font-size: 0.85rem;
529
+ transition: background-color var(--hover-ms) ease, color var(--hover-ms) ease, transform var(--press-ms) var(--ease-out);
526
530
  }
531
+ .chip:hover:not(.on) { color: var(--text); background: var(--lift); }
532
+ .chip:active { transform: scale(var(--press)); }
527
533
  .chip.on { background: var(--paper); color: var(--ink); }
528
534
  .chip-n {
529
535
  opacity: 0.55;
@@ -547,8 +553,10 @@ button.is-busy::after {
547
553
  font: inherit;
548
554
  font-size: 0.72rem;
549
555
  cursor: pointer;
556
+ transition: background-color var(--hover-ms) ease, color var(--hover-ms) ease, transform var(--press-ms) var(--ease-out);
550
557
  }
551
558
  .mini-tag:hover { color: var(--text); background: var(--lift); }
559
+ .mini-tag:active { transform: scale(var(--press)); }
552
560
  .mini-tag.on { background: var(--paper); color: var(--ink); }
553
561
 
554
562
  .more {
@@ -652,13 +660,15 @@ a.btn {
652
660
  margin: 0;
653
661
  padding: 0.55rem 0.95rem;
654
662
  font-weight: 560;
655
- color: #111;
656
- background: var(--text);
663
+ color: var(--ink);
664
+ background: var(--paper);
657
665
  border-radius: 999px;
658
666
  text-decoration: none;
659
667
  white-space: nowrap;
668
+ transition: background-color var(--hover-ms) ease, transform var(--press-ms) var(--ease-out);
660
669
  }
661
- a.btn:hover { text-decoration: none; opacity: 0.92; }
670
+ a.btn:hover { text-decoration: none; background: color-mix(in srgb, var(--paper) 88%, white); }
671
+ a.btn:active { transform: scale(var(--press)); }
662
672
 
663
673
  .lib-card {
664
674
  display: grid;
@@ -933,12 +943,13 @@ a.btn:hover { text-decoration: none; opacity: 0.92; }
933
943
  font: inherit;
934
944
  font-size: 0.86rem;
935
945
  cursor: pointer;
946
+ transition: background-color var(--hover-ms) ease, border-color var(--hover-ms) ease, color var(--hover-ms) ease, transform var(--press-ms) var(--ease-out);
936
947
  }
937
- .key-tab:hover { color: var(--text); border-color: #333; }
948
+ .key-tab:hover { color: var(--text); border-color: color-mix(in srgb, var(--steel) 45%, var(--line)); background: var(--lift); }
938
949
  .key-tab.on {
939
- background: #1c1c1c;
950
+ background: var(--lift);
940
951
  color: var(--text);
941
- border-color: #3a3a3a;
952
+ border-color: color-mix(in srgb, var(--steel) 45%, var(--line));
942
953
  }
943
954
  .key-tab.add {
944
955
  border-style: dashed;
@@ -947,12 +958,13 @@ a.btn:hover { text-decoration: none; opacity: 0.92; }
947
958
  }
948
959
  .key-tab.add:hover {
949
960
  color: var(--text);
950
- border-color: #555;
961
+ border-color: color-mix(in srgb, var(--steel) 45%, var(--line));
951
962
  background: var(--fill);
952
963
  }
964
+ .key-tab:active:not(:disabled) { transform: scale(var(--press)); }
953
965
  .key-tab:focus { outline: none; }
954
966
  .key-tab:focus-visible {
955
- box-shadow: 0 0 0 2px #000, 0 0 0 4px #6a6a6a;
967
+ box-shadow: var(--focus);
956
968
  }
957
969
  .key-tab .badge { margin-left: 0.15rem; }
958
970
  dialog.pick.add-provider { width: min(32rem, 92vw); }
@@ -976,13 +988,13 @@ dialog.pick.add-provider { width: min(32rem, 92vw); }
976
988
  cursor: pointer;
977
989
  }
978
990
  .preset-grid button:hover {
979
- border-color: #3a3a3a;
980
- background: #1c1c1c;
991
+ border-color: color-mix(in srgb, var(--steel) 45%, var(--line));
992
+ background: var(--lift);
981
993
  }
994
+ .preset-grid button:active:not(:disabled) { transform: scale(var(--press)); }
982
995
  .preset-grid button:focus { outline: none; }
983
996
  .preset-grid button:focus-visible {
984
- border-color: #6a6a6a;
985
- box-shadow: 0 0 0 2px #000, 0 0 0 4px #5a5a5a;
997
+ box-shadow: var(--focus);
986
998
  }
987
999
  .preset-grid button[data-preset="custom"] { grid-column: 1 / -1; }
988
1000
  .preset-grid button .hint {
@@ -1072,28 +1084,15 @@ body.app.bar-page .shell {
1072
1084
  padding: 0 0 0.4rem;
1073
1085
  }
1074
1086
  .rpg-screen {
1075
- display: grid;
1076
- grid-template-rows: auto auto;
1077
1087
  position: relative;
1088
+ aspect-ratio: 16 / 9;
1078
1089
  overflow: hidden;
1079
1090
  background: #000;
1080
1091
  border: 4px solid #0a0a12;
1081
1092
  box-shadow: 8px 8px 0 #000;
1082
1093
  image-rendering: pixelated;
1083
1094
  }
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
- }
1095
+ .rpg-scene { position: absolute; inset: 0; }
1097
1096
  .rpg-scene[hidden] { display: none; }
1098
1097
  .rpg-bg {
1099
1098
  display: block;
@@ -1135,216 +1134,120 @@ body.bar-page .rpg-screen {
1135
1134
  .inn-map {
1136
1135
  position: absolute;
1137
1136
  inset: 0;
1138
- background-color: #3d6b52;
1139
- background-image: repeating-conic-gradient(#3d6b52 0% 25%, #335c46 0% 50%);
1140
- background-size: 16px 16px;
1137
+ background-color: #3f3f48;
1138
+ background-image:
1139
+ linear-gradient(#2a1812 0 70px, transparent 70px),
1140
+ repeating-linear-gradient(90deg, transparent 0 15px, #35353c 15px 16px),
1141
+ repeating-linear-gradient(transparent 0 15px, #35353c 15px 16px);
1141
1142
  }
1142
1143
  .inn-wall {
1143
1144
  position: absolute;
1144
1145
  left: 0;
1145
1146
  right: 0;
1146
1147
  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;
1148
+ height: 70px;
1153
1149
  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;
1150
+ repeating-linear-gradient(90deg, #3a2218 0 40px, #2a1812 40px 44px),
1151
+ linear-gradient(#4a2c20, #2a1812);
1152
+ box-shadow: inset 0 -6px 0 #1a100c;
1158
1153
  }
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 {
1154
+ .inn-rail {
1169
1155
  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;
1156
+ left: 0;
1157
+ right: 0;
1158
+ top: 64px;
1159
+ height: 10px;
1160
+ background: #6b4228;
1161
+ box-shadow: 0 4px 0 #3a2414;
1193
1162
  }
1194
1163
  .inn-bar {
1195
- width: 36px;
1196
- height: 48%;
1164
+ position: absolute;
1165
+ right: 4%;
1166
+ top: 18%;
1167
+ width: 20%;
1168
+ height: 62%;
1197
1169
  background: #6b3e22;
1198
- box-shadow: inset 0 0 0 3px #4a2814, 4px 4px 0 #2a160e;
1170
+ box-shadow: inset 0 0 0 4px #4a2814, 6px 6px 0 #2a160e;
1199
1171
  }
1200
1172
  .inn-bottles {
1173
+ position: absolute;
1174
+ right: 6%;
1175
+ top: 12%;
1201
1176
  display: flex;
1202
- gap: 4px;
1177
+ gap: 6px;
1203
1178
  align-items: flex-end;
1204
- height: 22px;
1179
+ height: 28px;
1180
+ z-index: 1;
1205
1181
  }
1206
1182
  .inn-bottles span {
1207
- width: 6px;
1208
- height: 16px;
1209
- box-shadow: 0 -4px 0 -2px #e8e8e8;
1183
+ width: 7px;
1184
+ height: 18px;
1185
+ box-shadow: 0 -5px 0 -2px #e8e8e8;
1210
1186
  }
1211
- .inn-actors {
1187
+ .inn-table {
1212
1188
  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;
1189
+ width: 56px;
1190
+ height: 36px;
1191
+ background: #7a4a28;
1192
+ box-shadow: 8px 10px 0 -4px #3a2414, inset 0 0 0 3px #5a3218;
1193
+ border-radius: 40% 40% 30% 30%;
1253
1194
  }
1254
- .inn-monitor {
1195
+ .inn-table.t1 { left: 10%; top: 28%; }
1196
+ .inn-table.t2 { left: 28%; top: 22%; }
1197
+ .inn-barrel {
1255
1198
  position: absolute;
1256
- left: 50%;
1257
- bottom: 14px;
1258
1199
  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: "";
1200
+ height: 32px;
1201
+ background: repeating-linear-gradient(#8a5a32 0 6px, #5a3218 6px 8px);
1202
+ border-radius: 40%;
1203
+ box-shadow: 3px 3px 0 #1a1008;
1204
+ }
1205
+ .inn-barrel.b1 { left: 6%; bottom: 28%; }
1206
+ .inn-barrel.b2 { left: 72%; top: 24%; }
1207
+ .inn-hearth {
1266
1208
  position: absolute;
1267
- inset: 3px 3px 4px;
1268
- background: repeating-linear-gradient(#7ec8e8 0 2px, #4aa3c8 2px 4px);
1209
+ left: 4%;
1210
+ top: 8%;
1211
+ width: 54px;
1212
+ height: 48px;
1213
+ background: #2a1c18;
1214
+ box-shadow: inset 0 0 0 4px #1a100c, inset 0 0 12px #e07020;
1269
1215
  }
1270
- .inn-station:has(.rpg-npc.vacant) .inn-monitor::after { background: #2a2a2a; }
1216
+ .inn-actors { position: absolute; inset: 0; z-index: 2; }
1271
1217
  .rpg-npc {
1272
- position: relative;
1218
+ position: absolute;
1273
1219
  display: flex;
1274
1220
  flex-direction: column;
1275
1221
  align-items: center;
1276
- order: 1;
1277
1222
  margin: 0;
1278
1223
  padding: 0;
1279
1224
  border: 0;
1280
1225
  background: transparent;
1281
1226
  color: inherit;
1227
+ transform: translate(-50%, -88%);
1282
1228
  cursor: pointer;
1283
1229
  z-index: 2;
1284
1230
  }
1285
- .rpg-npc .npc-bust,
1286
- .rpg-npc .npc-blank {
1287
- width: 72px;
1231
+ .rpg-npc canvas {
1232
+ width: 48px;
1288
1233
  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);
1234
+ image-rendering: pixelated;
1235
+ filter: drop-shadow(2px 3px 0 #0008);
1236
+ animation: bob 1.1s steps(2) infinite;
1310
1237
  }
1311
1238
  .rpg-npc .tag {
1312
- order: 3;
1313
- margin-top: 6px;
1239
+ margin-top: 2px;
1314
1240
  padding: 1px 5px;
1315
- background: #1a1410;
1316
- color: #f0d9a0;
1241
+ background: #000c;
1242
+ color: #f4f0e0;
1317
1243
  font-family: VT323, ui-monospace, monospace;
1318
1244
  font-size: 15px;
1319
1245
  line-height: 1.1;
1320
1246
  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
1247
  }
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; }
1248
+ .rpg-npc:hover canvas { filter: brightness(1.18) drop-shadow(0 0 6px #f0d060); }
1249
+ .rpg-npc.on canvas { outline: 2px solid #f0d060; outline-offset: 1px; }
1250
+ .rpg-npc.vacant canvas { opacity: 0.35; }
1348
1251
  .rpg-npc.vacant .tag { color: #f0d060; }
1349
1252
  .rpg-exit {
1350
1253
  position: absolute;
@@ -1361,47 +1264,26 @@ body.bar-page .rpg-screen {
1361
1264
  cursor: pointer;
1362
1265
  }
1363
1266
  .rpg-exit:hover { background: #2a3460; }
1364
- body.bar-page .rpg-exit {
1365
- border-color: #1a1410;
1366
- background: #f4ead7;
1367
- color: #1a1410;
1267
+ .rpg-npc:hover { background: transparent; }
1268
+ .rpg-exit:active,
1269
+ .rpg-npc:active {
1270
+ transform: none;
1368
1271
  }
1369
- body.bar-page .rpg-exit:hover { background: #e8dcc4; }
1370
1272
  .rpg-dialog {
1371
- grid-row: 2;
1372
- position: relative;
1273
+ position: absolute;
1274
+ left: 3.5%;
1275
+ right: 3.5%;
1276
+ bottom: 3%;
1373
1277
  z-index: 5;
1374
- margin: 8px 12px 10px;
1375
1278
  padding: 3px;
1376
1279
  background: #08080f;
1377
1280
  box-shadow: 0 0 0 2px #c9a227, inset 0 0 0 2px #3a4a8a;
1378
1281
  }
1379
- body.bar-page .rpg-dialog {
1380
- background: #1a1410;
1381
- box-shadow: 0 0 0 3px #1a1410, 4px 4px 0 #1a1410;
1382
- }
1383
1282
  .rpg-dialog-inner {
1384
- display: flex;
1385
- align-items: flex-start;
1386
- gap: 10px;
1387
1283
  min-height: 92px;
1388
1284
  padding: 10px 14px 8px;
1389
1285
  background: linear-gradient(#2a3668, #1a2248 55%, #141a3a);
1390
1286
  }
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
1287
  .rpg-name {
1406
1288
  margin: 0 0 6px;
1407
1289
  color: #f0d060;
@@ -1416,44 +1298,31 @@ body.bar-page .rpg-dialog-inner {
1416
1298
  font-family: VT323, ui-monospace, monospace;
1417
1299
  font-size: 22px;
1418
1300
  line-height: 1.2;
1419
- overflow-wrap: anywhere;
1420
1301
  }
1421
- body.bar-page .rpg-name { color: #6b4228; }
1422
- body.bar-page .rpg-line { color: #1a1410; }
1423
1302
  .rpg-acts {
1424
1303
  display: flex;
1425
- flex-wrap: wrap;
1426
1304
  gap: 8px;
1427
1305
  margin-top: 8px;
1428
1306
  min-height: 22px;
1429
1307
  }
1430
1308
  .rpg-acts a,
1431
1309
  .rpg-acts button {
1432
- appearance: none;
1433
1310
  margin: 0;
1434
1311
  padding: 3px 8px;
1435
1312
  border: 2px solid #c9a227;
1436
- border-radius: 0;
1437
1313
  background: #141a3a;
1438
1314
  color: #f4f0e0;
1439
1315
  font-family: VT323, ui-monospace, monospace;
1440
1316
  font-size: 18px;
1441
- font-weight: 400;
1442
- line-height: 1.2;
1443
1317
  text-decoration: none;
1444
- box-shadow: none;
1445
1318
  cursor: pointer;
1446
1319
  }
1447
1320
  .rpg-acts a:hover,
1448
1321
  .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;
1322
+ .rpg-acts a:active,
1323
+ .rpg-acts button:active {
1324
+ transform: none;
1454
1325
  }
1455
- body.bar-page .rpg-acts a:hover,
1456
- body.bar-page .rpg-acts button:hover { background: #e8dcc4; }
1457
1326
 
1458
1327
  body.office-page {
1459
1328
  background: #1a1714;
@@ -1575,7 +1444,7 @@ body.office-page {
1575
1444
  inset 0 2px 0 #b07a48;
1576
1445
  position: relative;
1577
1446
  z-index: 2;
1578
- margin-top: -40px;
1447
+ margin-top: -28px;
1579
1448
  }
1580
1449
  .monitor {
1581
1450
  position: absolute;
@@ -1594,8 +1463,8 @@ body.office-page {
1594
1463
  background: repeating-linear-gradient(#7ec8e8 0 2px, #4aa3c8 2px 4px);
1595
1464
  }
1596
1465
  .buddy {
1597
- width: 72px;
1598
- height: 128px;
1466
+ width: 64px;
1467
+ height: 96px;
1599
1468
  position: relative;
1600
1469
  z-index: 1;
1601
1470
  image-rendering: pixelated;
@@ -1676,3 +1545,24 @@ body.office-page {
1676
1545
  }
1677
1546
  .nook { flex-direction: row; justify-content: center; gap: 2rem; min-height: 64px; }
1678
1547
  }
1548
+
1549
+ @media (prefers-reduced-motion: reduce) {
1550
+ button,
1551
+ .chip,
1552
+ .mini-tag,
1553
+ a.btn,
1554
+ .key-tab,
1555
+ .preset-grid button,
1556
+ .locale-switch button {
1557
+ transition: none;
1558
+ }
1559
+ button:active:not(:disabled),
1560
+ .chip:active,
1561
+ .mini-tag:active,
1562
+ a.btn:active,
1563
+ .key-tab:active,
1564
+ .preset-grid button:active,
1565
+ .locale-switch button:active {
1566
+ transform: none;
1567
+ }
1568
+ }
@@ -91,12 +91,7 @@
91
91
  return;
92
92
  }
93
93
  const button = document.getElementById("ai-generate");
94
- if (button.disabled || button.getAttribute("aria-busy") === "true") return;
95
94
  button.disabled = true;
96
- button.setAttribute("aria-busy", "true");
97
- button.classList.add("is-busy");
98
- const idle = button.textContent;
99
- button.textContent = t("studio.generating");
100
95
  try {
101
96
  const response = await fetch("/generate", {
102
97
  method: "POST",
@@ -120,9 +115,6 @@
120
115
  setFlash("error", err.message);
121
116
  } finally {
122
117
  button.disabled = false;
123
- button.removeAttribute("aria-busy");
124
- button.classList.remove("is-busy");
125
- button.textContent = idle;
126
118
  }
127
119
  });
128
120
  document.getElementById("ai-save").addEventListener("click", async () => {
package/src/router.ts CHANGED
@@ -18,7 +18,6 @@ import {
18
18
  setChannelMemory,
19
19
  generateKind,
20
20
  pickBotSkills,
21
- generateBotLook,
22
21
  getBotDetail,
23
22
  getLiveTurn,
24
23
  abortLiveTurn,
@@ -78,7 +77,6 @@ const PAGES: Record<string, { file: string; type: string }> = {
78
77
  "/chat.css": { file: "chat.css", type: "text/css; charset=utf-8" },
79
78
  "/md.js": { file: "md.js", type: "text/javascript; charset=utf-8" },
80
79
  "/i18n.js": { file: "i18n.js", type: "text/javascript; charset=utf-8" },
81
- "/buddy.js": { file: "buddy.js", type: "text/javascript; charset=utf-8" },
82
80
  "/favicon.ico": { file: "favicon.ico", type: "image/x-icon" },
83
81
  "/favicon.svg": { file: "favicon.svg", type: "image/svg+xml" },
84
82
  "/favicon-16.svg": { file: "favicon-16.svg", type: "image/svg+xml" },
@@ -893,12 +891,6 @@ export async function handleRequest(
893
891
  return;
894
892
  }
895
893
 
896
- const lookId = path.match(/^\/bots\/([^/]+)\/look$/)?.[1];
897
- if (lookId && method === "POST") {
898
- json(res, 200, await generateBotLook(store, decodeURIComponent(lookId), env));
899
- return;
900
- }
901
-
902
894
  const botId = path.match(/^\/bots\/([^/]+)$/)?.[1];
903
895
  if (botId && method === "GET") {
904
896
  json(res, 200, getBotDetail(store, botId));
@@ -914,9 +906,6 @@ export async function handleRequest(
914
906
  name: str(body, "name") || undefined,
915
907
  handle: str(body, "handle") || undefined,
916
908
  oneLiner: str(body, "oneLiner") || undefined,
917
- ...(Object.hasOwn(body, "portrait")
918
- ? { portrait: body.portrait == null ? null : str(body, "portrait") }
919
- : {}),
920
909
  skillIds: Object.hasOwn(body, "skillIds")
921
910
  ? strList(body, "skillIds")
922
911
  : undefined,