@youtyan/code-viewer 0.1.54 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/style.css CHANGED
@@ -282,12 +282,12 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
282
282
  z-index: 50;
283
283
  }
284
284
  .brand {
285
- display: flex; align-items: center; gap: 9px;
285
+ display: flex; align-items: center; gap: 8px;
286
286
  font-weight: 600;
287
287
  font-size: 15px;
288
288
  color: var(--fg);
289
289
  min-width: 0;
290
- max-width: min(34vw, 420px);
290
+ max-width: min(40vw, 560px);
291
291
  flex: 0 1 auto;
292
292
  text-decoration: none;
293
293
  }
@@ -304,6 +304,34 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
304
304
  text-overflow: ellipsis;
305
305
  white-space: nowrap;
306
306
  }
307
+ .project-branch {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ height: 24px;
311
+ flex: 0 1 auto;
312
+ max-width: min(20vw, 260px);
313
+ overflow: hidden;
314
+ text-overflow: ellipsis;
315
+ white-space: nowrap;
316
+ padding: 0 8px;
317
+ border: 1px solid var(--border);
318
+ border-radius: 999px;
319
+ background: color-mix(in srgb, var(--bg) 72%, var(--bg-soft));
320
+ color: var(--fg-muted);
321
+ font-family: "Monaspace Neon", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
322
+ font-size: 11px;
323
+ font-weight: 600;
324
+ line-height: 1;
325
+ }
326
+ .project-branch::before {
327
+ content: "";
328
+ flex: 0 0 auto;
329
+ width: 6px;
330
+ height: 6px;
331
+ margin-right: 6px;
332
+ border-radius: 999px;
333
+ background: var(--success);
334
+ }
307
335
 
308
336
  .app-menu {
309
337
  display: flex;
@@ -420,6 +448,24 @@ body[data-code-font-size="xlarge"] { --code-font-size: 15px; }
420
448
  border-color: var(--success);
421
449
  color: var(--success);
422
450
  }
451
+ #cancel-requests {
452
+ width: auto;
453
+ padding: 0 8px;
454
+ font-size: 11px;
455
+ font-weight: 600;
456
+ }
457
+ #cancel-requests.active {
458
+ color: var(--danger);
459
+ border-color: var(--danger);
460
+ }
461
+ #cancel-requests:disabled {
462
+ cursor: default;
463
+ opacity: 0.45;
464
+ }
465
+ #cancel-requests:disabled:hover {
466
+ background: var(--bg);
467
+ border-color: var(--border);
468
+ }
423
469
 
424
470
  #meta {
425
471
  display: flex; align-items: center; gap: 10px;
@@ -1005,6 +1051,29 @@ body.gdp-history-page.gdp-sidebar-hidden main#content {
1005
1051
  body.gdp-history-page #sidebar-resizer {
1006
1052
  left: calc(var(--history-w) + var(--sidebar-w) - 4px);
1007
1053
  }
1054
+ body.gdp-history-page #repo-target-wrap {
1055
+ display: none !important;
1056
+ }
1057
+ #history-resizer {
1058
+ display: none;
1059
+ position: fixed;
1060
+ top: var(--chrome-h);
1061
+ bottom: 0;
1062
+ left: calc(var(--history-w) - 4px);
1063
+ width: 8px;
1064
+ cursor: col-resize;
1065
+ z-index: 32;
1066
+ background: transparent;
1067
+ transition: background 0.12s;
1068
+ }
1069
+ body.gdp-history-page #history-resizer {
1070
+ display: block;
1071
+ }
1072
+ #history-resizer:hover,
1073
+ body.gdp-history-resizing #history-resizer {
1074
+ background: var(--accent);
1075
+ opacity: 0.5;
1076
+ }
1008
1077
  /* The history screen drives its diff range from the commit list; the topbar
1009
1078
  from/to pickers belong to the Diff Viewer and are hidden here. */
1010
1079
  body.gdp-history-page #topbar .ref-pickers {
@@ -1135,6 +1204,14 @@ body.gdp-history-page #topbar .ref-pickers {
1135
1204
  background: var(--bg-mute);
1136
1205
  border-left-color: var(--accent);
1137
1206
  }
1207
+ .history-item-worktree {
1208
+ background: color-mix(in srgb, var(--bg-soft) 72%, var(--bg-mute));
1209
+ color: var(--fg-muted);
1210
+ font-style: italic;
1211
+ }
1212
+ .history-item-worktree .sha {
1213
+ font-style: normal;
1214
+ }
1138
1215
  .history-item .subject {
1139
1216
  display: block;
1140
1217
  font-size: 12.5px;
@@ -1158,8 +1235,8 @@ body.gdp-history-page #topbar .ref-pickers {
1158
1235
  #history-sentinel { height: 1px; }
1159
1236
  #history-commit-info {
1160
1237
  display: none;
1161
- margin: 12px 16px 4px;
1162
- padding: 12px 16px;
1238
+ margin: 0 0 16px;
1239
+ padding: 16px 20px 18px;
1163
1240
  border: 1px solid var(--border);
1164
1241
  border-radius: 8px;
1165
1242
  background: var(--bg-soft);
@@ -1178,13 +1255,13 @@ body.gdp-history-page #history-commit-info:not([hidden]) { display: block; }
1178
1255
  user-select: all;
1179
1256
  }
1180
1257
  #history-commit-info .hci-subject {
1181
- margin: 6px 0 0;
1258
+ margin: 8px 0 0;
1182
1259
  font-size: 15px;
1183
1260
  line-height: 1.4;
1184
1261
  overflow-wrap: anywhere;
1185
1262
  }
1186
1263
  #history-commit-info .hci-body {
1187
- margin: 8px 0 0;
1264
+ margin: 12px 0 0;
1188
1265
  padding: 0;
1189
1266
  background: transparent;
1190
1267
  border: 0;
@@ -1192,9 +1269,67 @@ body.gdp-history-page #history-commit-info:not([hidden]) { display: block; }
1192
1269
  font-size: 12.5px;
1193
1270
  line-height: 1.6;
1194
1271
  color: var(--fg-muted);
1195
- white-space: pre-wrap;
1196
1272
  overflow-wrap: anywhere;
1197
1273
  }
1274
+ #history-commit-info .hci-body .gdp-markdown-preview {
1275
+ color: inherit;
1276
+ font-size: inherit;
1277
+ line-height: inherit;
1278
+ }
1279
+ #history-commit-info .hci-body .gdp-markdown-preview > :first-child {
1280
+ margin-top: 0;
1281
+ }
1282
+ #history-commit-info .hci-body .gdp-markdown-preview > :last-child {
1283
+ margin-bottom: 0;
1284
+ }
1285
+ .hci-body-expandable {
1286
+ display: block;
1287
+ }
1288
+ .hci-body-collapsible {
1289
+ position: relative;
1290
+ max-height: calc(10em * 1.6 + 8px);
1291
+ overflow: hidden;
1292
+ transition: max-height 200ms ease;
1293
+ }
1294
+ .hci-body-collapsible.expanded {
1295
+ max-height: none;
1296
+ }
1297
+ .hci-body-collapsible:not(.expanded)::after {
1298
+ content: "";
1299
+ position: absolute;
1300
+ left: 0;
1301
+ right: 0;
1302
+ bottom: 0;
1303
+ height: 52px;
1304
+ background: linear-gradient(to bottom, transparent, var(--bg-soft));
1305
+ pointer-events: none;
1306
+ }
1307
+ .hci-body-toggle {
1308
+ display: flex;
1309
+ align-items: center;
1310
+ justify-content: center;
1311
+ width: 100%;
1312
+ min-height: 36px;
1313
+ margin-top: 0;
1314
+ padding: 8px 12px;
1315
+ border-top: 1px solid var(--border);
1316
+ background: transparent;
1317
+ color: var(--fg);
1318
+ font-size: 12px;
1319
+ font-weight: 500;
1320
+ cursor: pointer;
1321
+ user-select: none;
1322
+ transition: background 120ms ease, color 120ms ease;
1323
+ }
1324
+ .hci-body-toggle:hover,
1325
+ .hci-body-toggle:focus-visible {
1326
+ background: var(--bg-mute);
1327
+ color: var(--fg);
1328
+ }
1329
+ .hci-body-toggle:focus-visible {
1330
+ outline: 2px solid var(--accent);
1331
+ outline-offset: 2px;
1332
+ }
1198
1333
 
1199
1334
  /* ===== Sidebar ===== */
1200
1335
  #sidebar {
@@ -1444,18 +1579,26 @@ body.gdp-resizing #sidebar-resizer {
1444
1579
 
1445
1580
  /* Lightweight preview line shown only while dragging — avoids reflowing the
1446
1581
  * (very tall) diff content on every mousemove. */
1447
- #sidebar-resize-preview {
1582
+ #sidebar-resize-preview,
1583
+ #history-resize-preview {
1448
1584
  display: none;
1449
1585
  position: fixed;
1450
- top: 0; bottom: 0;
1586
+ top: var(--chrome-h); bottom: 0;
1451
1587
  width: 2px;
1452
1588
  background: var(--accent);
1453
1589
  z-index: 100;
1454
1590
  pointer-events: none;
1455
1591
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 25%, transparent);
1456
1592
  }
1457
- body.gdp-resizing { cursor: col-resize !important; user-select: none; }
1458
- body.gdp-resizing * { user-select: none !important; }
1593
+ body.gdp-resizing,
1594
+ body.gdp-history-resizing {
1595
+ cursor: col-resize !important;
1596
+ user-select: none;
1597
+ }
1598
+ body.gdp-resizing *,
1599
+ body.gdp-history-resizing * {
1600
+ user-select: none !important;
1601
+ }
1459
1602
 
1460
1603
  #scope-settings-popover {
1461
1604
  position: fixed;
@@ -4226,6 +4369,9 @@ body.gdp-file-detail-page #empty {
4226
4369
  border-bottom: 1px solid var(--border);
4227
4370
  }
4228
4371
  body.gdp-history-page #sidebar { left: 0; }
4372
+ body.gdp-history-page #history-resizer {
4373
+ display: none;
4374
+ }
4229
4375
  body.gdp-history-page main#content,
4230
4376
  body.gdp-history-page.gdp-sidebar-hidden main#content {
4231
4377
  margin-left: 0;
@@ -4527,7 +4673,8 @@ body.gdp-file-detail-page #empty {
4527
4673
  /* Pages without the diff topbar start the panel right below the header. */
4528
4674
  body.gdp-repo-page #annotation-panel,
4529
4675
  body.gdp-file-detail-page #annotation-panel,
4530
- body.gdp-help-page #annotation-panel {
4676
+ body.gdp-help-page #annotation-panel,
4677
+ body.gdp-database-page #annotation-panel {
4531
4678
  top: var(--global-header-h);
4532
4679
  }
4533
4680
  /* Keep code readable next to the panel instead of underneath it. */
@@ -5147,6 +5294,63 @@ body.query-history-panel-open #content {
5147
5294
  height: 0;
5148
5295
  }
5149
5296
 
5297
+ .gdp-db-annotation-strip {
5298
+ display: grid;
5299
+ gap: 8px;
5300
+ flex-shrink: 0;
5301
+ max-height: min(40vh, 360px);
5302
+ overflow: auto;
5303
+ padding: 8px 10px;
5304
+ border-bottom: 1px solid var(--border);
5305
+ background: var(--bg);
5306
+ }
5307
+
5308
+ .gdp-db-annotation-inline {
5309
+ border: 1px solid var(--accent);
5310
+ border-radius: 6px;
5311
+ background: color-mix(in srgb, var(--accent) 7%, var(--bg));
5312
+ box-shadow: var(--shadow-sm);
5313
+ }
5314
+
5315
+ .gdp-db-annotation-inline.active {
5316
+ outline: 2px solid color-mix(in srgb, var(--accent) 35%, transparent);
5317
+ }
5318
+
5319
+ .gdp-db-annotation-inline-head {
5320
+ display: flex;
5321
+ align-items: center;
5322
+ gap: 8px;
5323
+ padding: 8px 10px 0;
5324
+ }
5325
+
5326
+ .gdp-db-annotation-inline-title {
5327
+ border: 0;
5328
+ background: transparent;
5329
+ color: var(--fg);
5330
+ font: inherit;
5331
+ font-weight: 700;
5332
+ padding: 0;
5333
+ cursor: pointer;
5334
+ }
5335
+
5336
+ .gdp-db-annotation-inline-location {
5337
+ min-width: 0;
5338
+ color: var(--muted);
5339
+ font-size: 12px;
5340
+ overflow: hidden;
5341
+ text-overflow: ellipsis;
5342
+ white-space: nowrap;
5343
+ }
5344
+
5345
+ .gdp-db-annotation-inline-body {
5346
+ padding: 6px 10px 10px;
5347
+ color: var(--fg);
5348
+ }
5349
+
5350
+ .gdp-db-annotation-inline-body p:last-child {
5351
+ margin-bottom: 0;
5352
+ }
5353
+
5150
5354
  /* ============================================================
5151
5355
  Database Viewer
5152
5356
  ============================================================ */
@@ -5154,14 +5358,19 @@ body.query-history-panel-open #content {
5154
5358
  .gdp-database-page #topbar,
5155
5359
  .gdp-database-page #sidebar,
5156
5360
  .gdp-database-page #sidebar-toggle,
5157
- .gdp-database-page #annotation-panel,
5158
5361
  .gdp-database-page #sidebar-resizer,
5159
- .gdp-database-page #annotations-toggle,
5160
- .gdp-database-page #query-history-panel,
5161
- .gdp-database-page #query-history-toggle {
5362
+ .gdp-database-page #query-history-panel {
5162
5363
  display: none !important;
5163
5364
  }
5164
5365
 
5366
+ body.gdp-database-page {
5367
+ --chrome-h: var(--global-header-h);
5368
+ }
5369
+
5370
+ body.gdp-database-page #load-bar {
5371
+ top: var(--global-header-h);
5372
+ }
5373
+
5165
5374
  .gdp-database-page #content {
5166
5375
  margin-left: 0;
5167
5376
  padding: var(--global-header-h) 0 0;
@@ -5169,29 +5378,42 @@ body.query-history-panel-open #content {
5169
5378
  max-width: none;
5170
5379
  }
5171
5380
 
5381
+ .db-root,
5172
5382
  .db-container {
5173
5383
  --db-font-sm: 11px;
5174
5384
  --db-font-base: 12px;
5175
5385
  --db-font-md: 13px;
5176
5386
  --db-font-mono: 13px;
5387
+ }
5388
+
5389
+ .db-container {
5177
5390
  display: flex;
5178
5391
  flex-direction: column;
5179
- height: calc(100vh - var(--global-header-h));
5392
+ /* `.db-tab-host` の中に置かれるので親の高さに合わせる。
5393
+ Round 5 multi-tab 以前は #content 直下だったため calc(100vh - header) で
5394
+ 固定していたが、いまは .db-root > .db-tabs-bar (固定) + .db-tab-host
5395
+ (flex: 1) の下にいるため、ここで自分で viewport 高さを再計算すると
5396
+ 親より縦長になり sidebar 末尾の history toggle が下にはみ出す。 */
5397
+ height: 100%;
5398
+ min-height: 0;
5180
5399
  overflow: hidden;
5181
5400
  font-size: var(--db-font-base);
5182
5401
  }
5402
+ body[data-sidebar-font-size="compact"] .db-root,
5183
5403
  body[data-sidebar-font-size="compact"] .db-container {
5184
5404
  --db-font-sm: 10px;
5185
5405
  --db-font-base: 11px;
5186
5406
  --db-font-md: 12px;
5187
5407
  --db-font-mono: 12px;
5188
5408
  }
5409
+ body[data-sidebar-font-size="large"] .db-root,
5189
5410
  body[data-sidebar-font-size="large"] .db-container {
5190
5411
  --db-font-sm: 12px;
5191
5412
  --db-font-base: 14px;
5192
5413
  --db-font-md: 15px;
5193
5414
  --db-font-mono: 14px;
5194
5415
  }
5416
+ body[data-sidebar-font-size="xlarge"] .db-root,
5195
5417
  body[data-sidebar-font-size="xlarge"] .db-container {
5196
5418
  --db-font-sm: 13px;
5197
5419
  --db-font-base: 15px;
@@ -5228,12 +5450,61 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5228
5450
  border-top: 1px solid var(--border);
5229
5451
  padding: 6px 8px;
5230
5452
  display: flex;
5231
- gap: 6px;
5453
+ flex-direction: column;
5454
+ gap: 4px;
5455
+ flex-shrink: 0;
5456
+ }
5457
+
5458
+ /* ---------- Icon toolbar (案 B 改: TablePlus / Beekeeper 風) ---------- */
5459
+ .db-icon-toolbar {
5460
+ display: flex;
5461
+ flex-direction: row;
5462
+ align-items: center;
5463
+ gap: 2px;
5464
+ padding: 4px 6px;
5465
+ border-bottom: 1px solid var(--border);
5466
+ background: var(--bg);
5232
5467
  flex-shrink: 0;
5468
+ min-height: 36px;
5469
+ }
5470
+ .db-icon-toolbar[hidden] {
5471
+ display: none !important;
5472
+ }
5473
+ .db-icon-btn {
5474
+ display: inline-flex;
5475
+ align-items: center;
5476
+ justify-content: center;
5477
+ width: 30px;
5478
+ height: 28px;
5479
+ padding: 0;
5480
+ border: none;
5481
+ background: transparent;
5482
+ color: var(--fg-muted);
5483
+ border-radius: 4px;
5484
+ cursor: pointer;
5485
+ font-size: var(--db-font-base);
5486
+ transition: background-color 0.12s, color 0.12s;
5487
+ }
5488
+ .db-icon-btn:hover {
5489
+ background: var(--bg-soft);
5490
+ color: var(--fg);
5491
+ }
5492
+ .db-icon-btn.active {
5493
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
5494
+ color: var(--accent);
5495
+ }
5496
+ .db-icon-btn:focus-visible {
5497
+ outline: 2px solid var(--accent);
5498
+ outline-offset: -1px;
5499
+ }
5500
+ .db-icon-btn svg {
5501
+ pointer-events: none;
5502
+ width: 1.25em;
5503
+ height: 1.25em;
5233
5504
  }
5234
5505
  .db-tool-btn {
5235
- flex: 1;
5236
- padding: 5px 8px;
5506
+ width: 100%;
5507
+ padding: 6px 10px;
5237
5508
  border: 1px solid var(--border);
5238
5509
  border-radius: 6px;
5239
5510
  background: var(--bg);
@@ -5241,7 +5512,10 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5241
5512
  font-size: var(--db-font-base);
5242
5513
  font-family: inherit;
5243
5514
  cursor: pointer;
5244
- text-align: center;
5515
+ text-align: left;
5516
+ white-space: nowrap;
5517
+ overflow: hidden;
5518
+ text-overflow: ellipsis;
5245
5519
  }
5246
5520
  .db-tool-btn:hover {
5247
5521
  background: var(--bg-mute);
@@ -5278,6 +5552,26 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5278
5552
  font-weight: 600;
5279
5553
  }
5280
5554
 
5555
+ /* ---------- [hidden] 属性を効かせる ---------- */
5556
+ /* `.db-*` クラスの多くが `display: flex` を主張しており、ブラウザ標準の
5557
+ `[hidden] { display: none }` (specificity 0,1,0) と CSS specificity が
5558
+ 同点で後勝ちで負ける。各要素について [hidden] 専用ルールを明示する。 */
5559
+ .db-tools-section[hidden],
5560
+ .db-tool-btn[hidden],
5561
+ .db-tab-bar[hidden],
5562
+ .db-history-toggle[hidden],
5563
+ .db-history-pane[hidden],
5564
+ .db-history-resizer[hidden],
5565
+ .db-table-list[hidden],
5566
+ .db-table-list-wrapper[hidden],
5567
+ .db-table-filter-wrap[hidden],
5568
+ .db-toolbar[hidden],
5569
+ .db-upper-area[hidden],
5570
+ .db-container[hidden],
5571
+ .db-tab-host[hidden] {
5572
+ display: none !important;
5573
+ }
5574
+
5281
5575
  /* ---------- Sidebar ---------- */
5282
5576
  .db-sidebar {
5283
5577
  width: 260px;
@@ -5611,20 +5905,6 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5611
5905
  white-space: nowrap;
5612
5906
  }
5613
5907
 
5614
- .db-grid-header-type {
5615
- font-size: var(--db-font-sm);
5616
- color: var(--fg-subtle);
5617
- padding: 1px 4px;
5618
- border-radius: 3px;
5619
- background: var(--bg-mute);
5620
- flex-shrink: 0;
5621
- }
5622
- .db-grid-header-type.pk {
5623
- background: var(--attention-subtle, #fff8c5);
5624
- color: var(--scope-accent);
5625
- font-weight: 600;
5626
- }
5627
-
5628
5908
  .db-grid-sort-icon {
5629
5909
  font-size: var(--db-font-sm);
5630
5910
  color: var(--accent);
@@ -5875,6 +6155,16 @@ html[data-theme="dark"] .db-query-highlight span[style] {
5875
6155
  top: 0;
5876
6156
  z-index: 1;
5877
6157
  }
6158
+ .db-query-header-name {
6159
+ color: var(--fg);
6160
+ font-weight: 600;
6161
+ }
6162
+ .db-query-header-type {
6163
+ margin-top: 1px;
6164
+ color: var(--fg-subtle);
6165
+ font-size: var(--db-font-sm);
6166
+ font-weight: 400;
6167
+ }
5878
6168
  .db-query-table tr.alt td {
5879
6169
  background: var(--bg-soft);
5880
6170
  }
@@ -5885,6 +6175,14 @@ html[data-theme="dark"] .db-query-highlight span[style] {
5885
6175
  color: var(--fg-subtle);
5886
6176
  font-style: italic;
5887
6177
  }
6178
+ .db-query-table td.db-query-empty {
6179
+ padding: 22px 12px;
6180
+ color: var(--fg-muted);
6181
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
6182
+ Helvetica, Arial, sans-serif;
6183
+ font-style: normal;
6184
+ text-align: center;
6185
+ }
5888
6186
 
5889
6187
  /* ---------- Schema View ---------- */
5890
6188
  .db-schema-view {
@@ -6524,7 +6822,8 @@ body.db-resizing {
6524
6822
  margin-bottom: 12px;
6525
6823
  }
6526
6824
  .db-snapshot-create-btn,
6527
- .db-snapshot-refresh-btn {
6825
+ .db-snapshot-refresh-btn,
6826
+ .db-snapshot-job-cancel-btn {
6528
6827
  padding: 6px 14px;
6529
6828
  border: 1px solid var(--border);
6530
6829
  border-radius: 4px;
@@ -6534,7 +6833,8 @@ body.db-resizing {
6534
6833
  font-size: var(--db-font-base);
6535
6834
  }
6536
6835
  .db-snapshot-create-btn:hover,
6537
- .db-snapshot-refresh-btn:hover {
6836
+ .db-snapshot-refresh-btn:hover,
6837
+ .db-snapshot-job-cancel-btn:hover {
6538
6838
  background: var(--bg-mute);
6539
6839
  }
6540
6840
  .db-snapshot-table-selector {
@@ -6967,3 +7267,662 @@ body.db-resizing {
6967
7267
  background: var(--bg-soft);
6968
7268
  align-items: center;
6969
7269
  }
7270
+
7271
+ /* ---------- Redis explorer ---------- */
7272
+ .redis-explorer {
7273
+ flex: 1;
7274
+ display: flex;
7275
+ flex-direction: row;
7276
+ overflow: hidden;
7277
+ background: var(--bg);
7278
+ font-size: var(--db-font-base);
7279
+ }
7280
+ .redis-explorer[hidden] {
7281
+ display: none;
7282
+ }
7283
+ .redis-db-list-pane {
7284
+ width: 220px;
7285
+ border-right: 1px solid var(--border);
7286
+ display: flex;
7287
+ flex-direction: column;
7288
+ overflow: hidden;
7289
+ background: var(--bg-soft);
7290
+ }
7291
+ .db-explorer-pane-header {
7292
+ padding: 8px 12px;
7293
+ font-weight: 600;
7294
+ font-size: var(--db-font-md);
7295
+ border-bottom: 1px solid var(--border);
7296
+ background: var(--bg);
7297
+ flex-shrink: 0;
7298
+ }
7299
+ .redis-db-list {
7300
+ flex: 1;
7301
+ overflow-y: auto;
7302
+ padding: 4px 0;
7303
+ }
7304
+ .redis-db-item {
7305
+ display: flex;
7306
+ justify-content: space-between;
7307
+ align-items: center;
7308
+ padding: 6px 12px;
7309
+ cursor: pointer;
7310
+ border-left: 2px solid transparent;
7311
+ user-select: none;
7312
+ }
7313
+ .redis-db-item:hover {
7314
+ background: var(--bg-hover, var(--bg));
7315
+ }
7316
+ .redis-db-item.active {
7317
+ background: var(--bg-active, var(--bg-soft));
7318
+ border-left-color: var(--accent);
7319
+ }
7320
+ .redis-db-name {
7321
+ font-family: var(--mono, monospace);
7322
+ font-size: var(--db-font-mono);
7323
+ font-weight: 500;
7324
+ }
7325
+ .redis-db-count {
7326
+ font-size: var(--db-font-sm);
7327
+ color: var(--fg-muted);
7328
+ }
7329
+ .redis-key-list-pane {
7330
+ width: 320px;
7331
+ border-right: 1px solid var(--border);
7332
+ display: flex;
7333
+ flex-direction: column;
7334
+ overflow: hidden;
7335
+ background: var(--bg);
7336
+ }
7337
+ .redis-key-filter-form {
7338
+ display: flex;
7339
+ gap: 6px;
7340
+ padding: 8px;
7341
+ border-bottom: 1px solid var(--border);
7342
+ background: var(--bg-soft);
7343
+ }
7344
+ .redis-key-filter {
7345
+ flex: 1;
7346
+ min-width: 0;
7347
+ padding: 5px 7px;
7348
+ border: 1px solid var(--border);
7349
+ border-radius: 6px;
7350
+ background: var(--bg);
7351
+ color: var(--fg);
7352
+ font: inherit;
7353
+ }
7354
+ .redis-key-filter-btn {
7355
+ padding: 5px 8px;
7356
+ border: 1px solid var(--border);
7357
+ border-radius: 6px;
7358
+ background: var(--bg);
7359
+ color: var(--fg);
7360
+ cursor: pointer;
7361
+ font: inherit;
7362
+ }
7363
+ .redis-key-filter-btn:hover {
7364
+ background: var(--bg-hover, var(--bg));
7365
+ }
7366
+ .redis-key-list {
7367
+ flex: 1;
7368
+ overflow-y: auto;
7369
+ padding: 4px 0;
7370
+ }
7371
+ .redis-key-item {
7372
+ display: flex;
7373
+ align-items: center;
7374
+ gap: 6px;
7375
+ padding: 4px 12px;
7376
+ cursor: pointer;
7377
+ border-left: 2px solid transparent;
7378
+ user-select: none;
7379
+ font-family: var(--mono, monospace);
7380
+ font-size: var(--db-font-mono);
7381
+ }
7382
+ .redis-key-item:hover {
7383
+ background: var(--bg-hover, var(--bg-soft));
7384
+ }
7385
+ .redis-key-item.active {
7386
+ background: var(--bg-active, var(--bg-soft));
7387
+ border-left-color: var(--accent);
7388
+ }
7389
+ .redis-key-name {
7390
+ overflow: hidden;
7391
+ text-overflow: ellipsis;
7392
+ white-space: nowrap;
7393
+ flex: 1;
7394
+ }
7395
+ .redis-type-badge {
7396
+ display: inline-block;
7397
+ padding: 0 6px;
7398
+ border-radius: 3px;
7399
+ font-size: var(--db-font-sm);
7400
+ font-family: var(--mono, monospace);
7401
+ text-transform: uppercase;
7402
+ background: var(--bg-soft);
7403
+ color: var(--fg-muted);
7404
+ border: 1px solid var(--border);
7405
+ flex-shrink: 0;
7406
+ min-width: 44px;
7407
+ text-align: center;
7408
+ }
7409
+ .redis-type-string {
7410
+ background: #e8f0ff;
7411
+ color: #224a8a;
7412
+ }
7413
+ .redis-type-hash {
7414
+ background: #fff4e0;
7415
+ color: #8a5a22;
7416
+ }
7417
+ .redis-type-list {
7418
+ background: #e8f8e8;
7419
+ color: #226a3a;
7420
+ }
7421
+ .redis-type-set {
7422
+ background: #f0e8f8;
7423
+ color: #5a228a;
7424
+ }
7425
+ .redis-type-zset {
7426
+ background: #f8e8e8;
7427
+ color: #8a2a3a;
7428
+ }
7429
+ .redis-type-stream {
7430
+ background: #e8f8f8;
7431
+ color: #226a8a;
7432
+ }
7433
+ .redis-key-more-btn {
7434
+ padding: 6px;
7435
+ border: none;
7436
+ border-top: 1px solid var(--border);
7437
+ background: var(--bg-soft);
7438
+ cursor: pointer;
7439
+ font-size: var(--db-font-sm);
7440
+ color: var(--fg);
7441
+ }
7442
+ .redis-key-more-btn:hover {
7443
+ background: var(--bg-hover, var(--bg));
7444
+ }
7445
+ .redis-key-more-btn:disabled {
7446
+ cursor: default;
7447
+ color: var(--fg-muted);
7448
+ }
7449
+ .redis-main-pane {
7450
+ flex: 1;
7451
+ display: flex;
7452
+ flex-direction: column;
7453
+ overflow: hidden;
7454
+ padding: 12px;
7455
+ color: var(--fg);
7456
+ gap: 8px;
7457
+ }
7458
+ .redis-value-header {
7459
+ display: flex;
7460
+ align-items: center;
7461
+ gap: 8px;
7462
+ padding-bottom: 8px;
7463
+ border-bottom: 1px solid var(--border);
7464
+ flex-shrink: 0;
7465
+ }
7466
+ .redis-value-key-name {
7467
+ font-family: var(--mono, monospace);
7468
+ font-size: var(--db-font-mono);
7469
+ font-weight: 600;
7470
+ overflow: hidden;
7471
+ text-overflow: ellipsis;
7472
+ white-space: nowrap;
7473
+ }
7474
+ .redis-value-body {
7475
+ flex: 1;
7476
+ overflow: auto;
7477
+ min-height: 0;
7478
+ }
7479
+ .redis-value-empty {
7480
+ color: var(--fg-muted);
7481
+ font-size: var(--db-font-base);
7482
+ font-style: italic;
7483
+ }
7484
+ .redis-value-info,
7485
+ .redis-value-truncation {
7486
+ padding: 4px 8px;
7487
+ margin-bottom: 6px;
7488
+ border-radius: 4px;
7489
+ font-size: var(--db-font-sm);
7490
+ font-family: var(--mono, monospace);
7491
+ }
7492
+ .redis-value-info {
7493
+ background: var(--bg-soft);
7494
+ color: var(--fg-muted);
7495
+ }
7496
+ .redis-value-truncation {
7497
+ background: #fff4e0;
7498
+ color: #8a5a22;
7499
+ border: 1px solid #f0d8a0;
7500
+ }
7501
+ .redis-binary-badge {
7502
+ display: inline-block;
7503
+ padding: 0 6px;
7504
+ margin-right: 6px;
7505
+ border-radius: 3px;
7506
+ font-size: var(--db-font-sm);
7507
+ font-family: var(--mono, monospace);
7508
+ text-transform: uppercase;
7509
+ background: #f0e8f8;
7510
+ color: #5a228a;
7511
+ border: 1px solid #d0c0e0;
7512
+ vertical-align: middle;
7513
+ }
7514
+ .redis-value-string,
7515
+ .redis-value-raw-json {
7516
+ font-family: var(--mono, monospace);
7517
+ font-size: var(--db-font-mono);
7518
+ white-space: pre-wrap;
7519
+ word-break: break-all;
7520
+ margin: 0;
7521
+ padding: 8px;
7522
+ background: var(--bg-soft);
7523
+ border-radius: 4px;
7524
+ }
7525
+ .redis-value-hash-table {
7526
+ width: 100%;
7527
+ border-collapse: collapse;
7528
+ font-family: var(--mono, monospace);
7529
+ font-size: var(--db-font-mono);
7530
+ }
7531
+ .redis-value-hash-table th,
7532
+ .redis-value-hash-table td {
7533
+ text-align: left;
7534
+ padding: 4px 8px;
7535
+ border-bottom: 1px solid var(--border);
7536
+ vertical-align: top;
7537
+ }
7538
+ .redis-value-hash-table th {
7539
+ background: var(--bg-soft);
7540
+ font-weight: 600;
7541
+ }
7542
+ .redis-value-hash-field {
7543
+ width: 30%;
7544
+ word-break: break-all;
7545
+ color: var(--fg-muted);
7546
+ }
7547
+ .redis-value-hash-val {
7548
+ word-break: break-all;
7549
+ white-space: pre-wrap;
7550
+ }
7551
+ .redis-value-list {
7552
+ margin: 0;
7553
+ padding: 0 0 0 28px;
7554
+ font-family: var(--mono, monospace);
7555
+ font-size: var(--db-font-mono);
7556
+ }
7557
+ .redis-value-list li {
7558
+ padding: 2px 4px;
7559
+ border-bottom: 1px solid var(--border);
7560
+ word-break: break-all;
7561
+ white-space: pre-wrap;
7562
+ }
7563
+ .db-pane-note {
7564
+ padding: 8px 12px;
7565
+ color: var(--fg-muted);
7566
+ font-size: var(--db-font-sm);
7567
+ }
7568
+ .db-pane-error {
7569
+ padding: 8px 12px;
7570
+ color: var(--error, #c00);
7571
+ font-size: var(--db-font-sm);
7572
+ }
7573
+
7574
+ /* ---------- Elasticsearch explorer ---------- */
7575
+ .es-explorer {
7576
+ flex: 1;
7577
+ display: flex;
7578
+ flex-direction: row;
7579
+ overflow: hidden;
7580
+ background: var(--bg);
7581
+ font-size: var(--db-font-base);
7582
+ }
7583
+ .es-explorer[hidden] {
7584
+ display: none;
7585
+ }
7586
+ .es-index-list-pane {
7587
+ width: 260px;
7588
+ border-right: 1px solid var(--border);
7589
+ display: flex;
7590
+ flex-direction: column;
7591
+ overflow: hidden;
7592
+ background: var(--bg-soft);
7593
+ }
7594
+ .es-index-list {
7595
+ flex: 1;
7596
+ overflow-y: auto;
7597
+ padding: 4px 0;
7598
+ }
7599
+ .es-index-item {
7600
+ display: flex;
7601
+ flex-direction: column;
7602
+ padding: 6px 12px;
7603
+ cursor: pointer;
7604
+ border-left: 2px solid transparent;
7605
+ user-select: none;
7606
+ gap: 2px;
7607
+ }
7608
+ .es-index-item:hover {
7609
+ background: var(--bg-hover, var(--bg));
7610
+ }
7611
+ .es-index-item.active {
7612
+ background: var(--bg-active, var(--bg-soft));
7613
+ border-left-color: var(--accent);
7614
+ }
7615
+ .es-index-name {
7616
+ font-family: var(--mono, monospace);
7617
+ font-size: var(--db-font-mono);
7618
+ font-weight: 500;
7619
+ overflow: hidden;
7620
+ text-overflow: ellipsis;
7621
+ white-space: nowrap;
7622
+ }
7623
+ .es-index-meta {
7624
+ font-size: var(--db-font-sm);
7625
+ color: var(--fg-muted);
7626
+ }
7627
+ .es-doc-list-pane {
7628
+ width: 380px;
7629
+ border-right: 1px solid var(--border);
7630
+ display: flex;
7631
+ flex-direction: column;
7632
+ overflow: hidden;
7633
+ background: var(--bg);
7634
+ }
7635
+ .es-search-bar {
7636
+ display: flex;
7637
+ gap: 6px;
7638
+ padding: 8px 12px;
7639
+ border-bottom: 1px solid var(--border);
7640
+ background: var(--bg-soft);
7641
+ flex-shrink: 0;
7642
+ }
7643
+ .es-search-input {
7644
+ flex: 1;
7645
+ padding: 4px 8px;
7646
+ border: 1px solid var(--border);
7647
+ border-radius: 4px;
7648
+ background: var(--bg);
7649
+ color: var(--fg);
7650
+ font-family: var(--mono, monospace);
7651
+ font-size: var(--db-font-mono);
7652
+ }
7653
+ .es-search-btn {
7654
+ padding: 4px 10px;
7655
+ border: 1px solid var(--border);
7656
+ border-radius: 4px;
7657
+ background: var(--bg);
7658
+ color: var(--fg);
7659
+ cursor: pointer;
7660
+ font-size: var(--db-font-base);
7661
+ }
7662
+ .es-search-btn:hover {
7663
+ background: var(--bg-hover, var(--bg-soft));
7664
+ }
7665
+ .es-doc-list {
7666
+ flex: 1;
7667
+ overflow-y: auto;
7668
+ padding: 4px 0;
7669
+ }
7670
+ .es-doc-item {
7671
+ display: flex;
7672
+ flex-direction: column;
7673
+ padding: 4px 12px;
7674
+ cursor: pointer;
7675
+ border-left: 2px solid transparent;
7676
+ user-select: none;
7677
+ font-family: var(--mono, monospace);
7678
+ font-size: var(--db-font-mono);
7679
+ gap: 2px;
7680
+ border-bottom: 1px solid var(--border);
7681
+ }
7682
+ .es-doc-item:hover {
7683
+ background: var(--bg-hover, var(--bg-soft));
7684
+ }
7685
+ .es-doc-item.active {
7686
+ background: var(--bg-active, var(--bg-soft));
7687
+ border-left-color: var(--accent);
7688
+ }
7689
+ .es-doc-id {
7690
+ font-weight: 600;
7691
+ overflow: hidden;
7692
+ text-overflow: ellipsis;
7693
+ white-space: nowrap;
7694
+ }
7695
+ .es-doc-preview {
7696
+ color: var(--fg-muted);
7697
+ font-size: var(--db-font-sm);
7698
+ overflow: hidden;
7699
+ text-overflow: ellipsis;
7700
+ white-space: nowrap;
7701
+ }
7702
+ .es-doc-more-btn {
7703
+ padding: 6px;
7704
+ border: none;
7705
+ border-top: 1px solid var(--border);
7706
+ background: var(--bg-soft);
7707
+ cursor: pointer;
7708
+ font-size: var(--db-font-sm);
7709
+ color: var(--fg);
7710
+ }
7711
+ .es-doc-more-btn:hover {
7712
+ background: var(--bg-hover, var(--bg));
7713
+ }
7714
+ .es-doc-more-btn:disabled {
7715
+ cursor: default;
7716
+ color: var(--fg-muted);
7717
+ }
7718
+ .es-detail-pane {
7719
+ flex: 1;
7720
+ display: flex;
7721
+ flex-direction: column;
7722
+ overflow: hidden;
7723
+ background: var(--bg);
7724
+ }
7725
+ .es-detail-tabs {
7726
+ display: flex;
7727
+ border-bottom: 1px solid var(--border);
7728
+ background: var(--bg-soft);
7729
+ flex-shrink: 0;
7730
+ }
7731
+ .es-detail-tab {
7732
+ padding: 6px 14px;
7733
+ border: none;
7734
+ background: transparent;
7735
+ cursor: pointer;
7736
+ font-size: var(--db-font-base);
7737
+ color: var(--fg-muted);
7738
+ border-bottom: 2px solid transparent;
7739
+ }
7740
+ .es-detail-tab.active {
7741
+ color: var(--fg);
7742
+ border-bottom-color: var(--accent);
7743
+ }
7744
+ .es-mapping-body,
7745
+ .es-doc-body {
7746
+ flex: 1;
7747
+ overflow: auto;
7748
+ padding: 12px;
7749
+ color: var(--fg);
7750
+ }
7751
+ .es-mapping-header,
7752
+ .es-doc-detail-header {
7753
+ font-family: var(--mono, monospace);
7754
+ font-size: var(--db-font-mono);
7755
+ font-weight: 600;
7756
+ padding-bottom: 8px;
7757
+ border-bottom: 1px solid var(--border);
7758
+ margin-bottom: 8px;
7759
+ }
7760
+ .es-doc-detail-meta {
7761
+ font-family: var(--mono, monospace);
7762
+ font-size: var(--db-font-sm);
7763
+ color: var(--fg-muted);
7764
+ margin-bottom: 8px;
7765
+ }
7766
+ .es-mapping-table {
7767
+ width: 100%;
7768
+ border-collapse: collapse;
7769
+ font-family: var(--mono, monospace);
7770
+ font-size: var(--db-font-mono);
7771
+ }
7772
+ .es-mapping-table th,
7773
+ .es-mapping-table td {
7774
+ text-align: left;
7775
+ padding: 4px 8px;
7776
+ border-bottom: 1px solid var(--border);
7777
+ }
7778
+ .es-mapping-table th {
7779
+ font-weight: 600;
7780
+ background: var(--bg-soft);
7781
+ }
7782
+ .es-mapping-field {
7783
+ font-weight: 500;
7784
+ }
7785
+ .es-mapping-type {
7786
+ color: var(--fg-muted);
7787
+ }
7788
+ .es-doc-source {
7789
+ font-family: var(--mono, monospace);
7790
+ font-size: var(--db-font-mono);
7791
+ white-space: pre-wrap;
7792
+ word-break: break-all;
7793
+ margin: 0;
7794
+ }
7795
+ .es-value-empty {
7796
+ color: var(--fg-muted);
7797
+ font-size: var(--db-font-base);
7798
+ font-style: italic;
7799
+ text-align: center;
7800
+ padding: 8px;
7801
+ }
7802
+ /* ---------- Database multi-tab manager ---------- */
7803
+ .db-root {
7804
+ display: flex;
7805
+ flex-direction: column;
7806
+ /* `#content` 由来の高さが viewport いっぱいにならない環境があり、
7807
+ `height: 100%` だと `.db-tab-host` が縮んで内側の history pane / main
7808
+ content が画面途中で切れる。Round 5 前の `.db-container` と同様、
7809
+ ここで viewport 基準の高さを明示する。 */
7810
+ height: calc(100vh - var(--global-header-h));
7811
+ width: 100%;
7812
+ overflow: hidden;
7813
+ font-size: var(--db-font-base);
7814
+ }
7815
+ .db-tabs-bar {
7816
+ display: flex;
7817
+ flex-direction: row;
7818
+ align-items: stretch;
7819
+ background: var(--bg-soft);
7820
+ border-bottom: 1px solid var(--border);
7821
+ min-height: 32px;
7822
+ flex-shrink: 0;
7823
+ overflow: hidden;
7824
+ }
7825
+ .db-tabs-list {
7826
+ display: flex;
7827
+ flex-direction: row;
7828
+ flex: 1;
7829
+ overflow-x: auto;
7830
+ overflow-y: hidden;
7831
+ gap: 1px;
7832
+ }
7833
+ .db-tabs-chip {
7834
+ display: inline-flex;
7835
+ align-items: center;
7836
+ gap: 6px;
7837
+ padding: 4px 6px 4px 12px;
7838
+ border-right: 1px solid var(--border);
7839
+ background: var(--bg-soft);
7840
+ color: var(--fg-muted);
7841
+ cursor: pointer;
7842
+ user-select: none;
7843
+ font-size: var(--db-font-base);
7844
+ max-width: 240px;
7845
+ min-width: 80px;
7846
+ flex-shrink: 0;
7847
+ }
7848
+ .db-tabs-chip:hover {
7849
+ background: var(--bg-hover, var(--bg));
7850
+ color: var(--fg);
7851
+ }
7852
+ .db-tabs-chip.active {
7853
+ background: var(--bg);
7854
+ color: var(--fg);
7855
+ border-bottom: 2px solid var(--accent);
7856
+ font-weight: 500;
7857
+ margin-bottom: -1px;
7858
+ }
7859
+ .db-tabs-chip.dragging {
7860
+ opacity: 0.55;
7861
+ }
7862
+ .db-tabs-chip.drop-target {
7863
+ background: var(--accent-subtle);
7864
+ box-shadow: inset 2px 0 0 var(--accent);
7865
+ }
7866
+ .db-tabs-chip.drop-target.drop-after {
7867
+ box-shadow: inset -2px 0 0 var(--accent);
7868
+ }
7869
+ .db-tabs-chip:focus-visible,
7870
+ .db-tabs-new-btn:focus-visible,
7871
+ .db-tabs-chip-close:focus-visible {
7872
+ outline: 2px solid var(--accent);
7873
+ outline-offset: -2px;
7874
+ }
7875
+ .db-tabs-chip-label {
7876
+ flex: 1;
7877
+ overflow: hidden;
7878
+ text-overflow: ellipsis;
7879
+ white-space: nowrap;
7880
+ }
7881
+ .db-tabs-chip-close {
7882
+ display: inline-flex;
7883
+ align-items: center;
7884
+ justify-content: center;
7885
+ min-width: 24px;
7886
+ min-height: 24px;
7887
+ padding: 0;
7888
+ margin: 0;
7889
+ border: none;
7890
+ background: transparent;
7891
+ color: var(--fg-muted);
7892
+ border-radius: 3px;
7893
+ cursor: pointer;
7894
+ font-size: var(--db-font-md);
7895
+ line-height: 1;
7896
+ }
7897
+ .db-tabs-chip-close:hover {
7898
+ background: var(--bg-hover, var(--border));
7899
+ color: var(--fg);
7900
+ }
7901
+ .db-tabs-new-btn {
7902
+ border: none;
7903
+ border-left: 1px solid var(--border);
7904
+ background: var(--bg-soft);
7905
+ cursor: pointer;
7906
+ padding: 0 12px;
7907
+ font-size: var(--db-font-md);
7908
+ color: var(--fg-muted);
7909
+ min-width: 36px;
7910
+ }
7911
+ .db-tabs-new-btn:hover {
7912
+ background: var(--bg-hover, var(--bg));
7913
+ color: var(--fg);
7914
+ }
7915
+ .db-tab-host {
7916
+ flex: 1;
7917
+ display: flex;
7918
+ position: relative;
7919
+ overflow: hidden;
7920
+ min-height: 0;
7921
+ }
7922
+ .db-tab-host > .db-container {
7923
+ flex: 1;
7924
+ }
7925
+ .db-tab-host > .db-container[hidden] {
7926
+ display: none;
7927
+ }
7928
+