@youtyan/code-viewer 0.1.53 → 0.2.0

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;
@@ -1005,6 +1033,29 @@ body.gdp-history-page.gdp-sidebar-hidden main#content {
1005
1033
  body.gdp-history-page #sidebar-resizer {
1006
1034
  left: calc(var(--history-w) + var(--sidebar-w) - 4px);
1007
1035
  }
1036
+ body.gdp-history-page #repo-target-wrap {
1037
+ display: none !important;
1038
+ }
1039
+ #history-resizer {
1040
+ display: none;
1041
+ position: fixed;
1042
+ top: var(--chrome-h);
1043
+ bottom: 0;
1044
+ left: calc(var(--history-w) - 4px);
1045
+ width: 8px;
1046
+ cursor: col-resize;
1047
+ z-index: 32;
1048
+ background: transparent;
1049
+ transition: background 0.12s;
1050
+ }
1051
+ body.gdp-history-page #history-resizer {
1052
+ display: block;
1053
+ }
1054
+ #history-resizer:hover,
1055
+ body.gdp-history-resizing #history-resizer {
1056
+ background: var(--accent);
1057
+ opacity: 0.5;
1058
+ }
1008
1059
  /* The history screen drives its diff range from the commit list; the topbar
1009
1060
  from/to pickers belong to the Diff Viewer and are hidden here. */
1010
1061
  body.gdp-history-page #topbar .ref-pickers {
@@ -1135,6 +1186,14 @@ body.gdp-history-page #topbar .ref-pickers {
1135
1186
  background: var(--bg-mute);
1136
1187
  border-left-color: var(--accent);
1137
1188
  }
1189
+ .history-item-worktree {
1190
+ background: color-mix(in srgb, var(--bg-soft) 72%, var(--bg-mute));
1191
+ color: var(--fg-muted);
1192
+ font-style: italic;
1193
+ }
1194
+ .history-item-worktree .sha {
1195
+ font-style: normal;
1196
+ }
1138
1197
  .history-item .subject {
1139
1198
  display: block;
1140
1199
  font-size: 12.5px;
@@ -1158,8 +1217,8 @@ body.gdp-history-page #topbar .ref-pickers {
1158
1217
  #history-sentinel { height: 1px; }
1159
1218
  #history-commit-info {
1160
1219
  display: none;
1161
- margin: 12px 16px 4px;
1162
- padding: 12px 16px;
1220
+ margin: 0 0 16px;
1221
+ padding: 16px 20px 18px;
1163
1222
  border: 1px solid var(--border);
1164
1223
  border-radius: 8px;
1165
1224
  background: var(--bg-soft);
@@ -1178,13 +1237,13 @@ body.gdp-history-page #history-commit-info:not([hidden]) { display: block; }
1178
1237
  user-select: all;
1179
1238
  }
1180
1239
  #history-commit-info .hci-subject {
1181
- margin: 6px 0 0;
1240
+ margin: 8px 0 0;
1182
1241
  font-size: 15px;
1183
1242
  line-height: 1.4;
1184
1243
  overflow-wrap: anywhere;
1185
1244
  }
1186
1245
  #history-commit-info .hci-body {
1187
- margin: 8px 0 0;
1246
+ margin: 12px 0 0;
1188
1247
  padding: 0;
1189
1248
  background: transparent;
1190
1249
  border: 0;
@@ -1192,9 +1251,67 @@ body.gdp-history-page #history-commit-info:not([hidden]) { display: block; }
1192
1251
  font-size: 12.5px;
1193
1252
  line-height: 1.6;
1194
1253
  color: var(--fg-muted);
1195
- white-space: pre-wrap;
1196
1254
  overflow-wrap: anywhere;
1197
1255
  }
1256
+ #history-commit-info .hci-body .gdp-markdown-preview {
1257
+ color: inherit;
1258
+ font-size: inherit;
1259
+ line-height: inherit;
1260
+ }
1261
+ #history-commit-info .hci-body .gdp-markdown-preview > :first-child {
1262
+ margin-top: 0;
1263
+ }
1264
+ #history-commit-info .hci-body .gdp-markdown-preview > :last-child {
1265
+ margin-bottom: 0;
1266
+ }
1267
+ .hci-body-expandable {
1268
+ display: block;
1269
+ }
1270
+ .hci-body-collapsible {
1271
+ position: relative;
1272
+ max-height: calc(10em * 1.6 + 8px);
1273
+ overflow: hidden;
1274
+ transition: max-height 200ms ease;
1275
+ }
1276
+ .hci-body-collapsible.expanded {
1277
+ max-height: none;
1278
+ }
1279
+ .hci-body-collapsible:not(.expanded)::after {
1280
+ content: "";
1281
+ position: absolute;
1282
+ left: 0;
1283
+ right: 0;
1284
+ bottom: 0;
1285
+ height: 52px;
1286
+ background: linear-gradient(to bottom, transparent, var(--bg-soft));
1287
+ pointer-events: none;
1288
+ }
1289
+ .hci-body-toggle {
1290
+ display: flex;
1291
+ align-items: center;
1292
+ justify-content: center;
1293
+ width: 100%;
1294
+ min-height: 36px;
1295
+ margin-top: 0;
1296
+ padding: 8px 12px;
1297
+ border-top: 1px solid var(--border);
1298
+ background: transparent;
1299
+ color: var(--fg);
1300
+ font-size: 12px;
1301
+ font-weight: 500;
1302
+ cursor: pointer;
1303
+ user-select: none;
1304
+ transition: background 120ms ease, color 120ms ease;
1305
+ }
1306
+ .hci-body-toggle:hover,
1307
+ .hci-body-toggle:focus-visible {
1308
+ background: var(--bg-mute);
1309
+ color: var(--fg);
1310
+ }
1311
+ .hci-body-toggle:focus-visible {
1312
+ outline: 2px solid var(--accent);
1313
+ outline-offset: 2px;
1314
+ }
1198
1315
 
1199
1316
  /* ===== Sidebar ===== */
1200
1317
  #sidebar {
@@ -1444,18 +1561,26 @@ body.gdp-resizing #sidebar-resizer {
1444
1561
 
1445
1562
  /* Lightweight preview line shown only while dragging — avoids reflowing the
1446
1563
  * (very tall) diff content on every mousemove. */
1447
- #sidebar-resize-preview {
1564
+ #sidebar-resize-preview,
1565
+ #history-resize-preview {
1448
1566
  display: none;
1449
1567
  position: fixed;
1450
- top: 0; bottom: 0;
1568
+ top: var(--chrome-h); bottom: 0;
1451
1569
  width: 2px;
1452
1570
  background: var(--accent);
1453
1571
  z-index: 100;
1454
1572
  pointer-events: none;
1455
1573
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 25%, transparent);
1456
1574
  }
1457
- body.gdp-resizing { cursor: col-resize !important; user-select: none; }
1458
- body.gdp-resizing * { user-select: none !important; }
1575
+ body.gdp-resizing,
1576
+ body.gdp-history-resizing {
1577
+ cursor: col-resize !important;
1578
+ user-select: none;
1579
+ }
1580
+ body.gdp-resizing *,
1581
+ body.gdp-history-resizing * {
1582
+ user-select: none !important;
1583
+ }
1459
1584
 
1460
1585
  #scope-settings-popover {
1461
1586
  position: fixed;
@@ -4226,6 +4351,9 @@ body.gdp-file-detail-page #empty {
4226
4351
  border-bottom: 1px solid var(--border);
4227
4352
  }
4228
4353
  body.gdp-history-page #sidebar { left: 0; }
4354
+ body.gdp-history-page #history-resizer {
4355
+ display: none;
4356
+ }
4229
4357
  body.gdp-history-page main#content,
4230
4358
  body.gdp-history-page.gdp-sidebar-hidden main#content {
4231
4359
  margin-left: 0;
@@ -4527,7 +4655,8 @@ body.gdp-file-detail-page #empty {
4527
4655
  /* Pages without the diff topbar start the panel right below the header. */
4528
4656
  body.gdp-repo-page #annotation-panel,
4529
4657
  body.gdp-file-detail-page #annotation-panel,
4530
- body.gdp-help-page #annotation-panel {
4658
+ body.gdp-help-page #annotation-panel,
4659
+ body.gdp-database-page #annotation-panel {
4531
4660
  top: var(--global-header-h);
4532
4661
  }
4533
4662
  /* Keep code readable next to the panel instead of underneath it. */
@@ -5147,6 +5276,63 @@ body.query-history-panel-open #content {
5147
5276
  height: 0;
5148
5277
  }
5149
5278
 
5279
+ .gdp-db-annotation-strip {
5280
+ display: grid;
5281
+ gap: 8px;
5282
+ flex-shrink: 0;
5283
+ max-height: min(40vh, 360px);
5284
+ overflow: auto;
5285
+ padding: 8px 10px;
5286
+ border-bottom: 1px solid var(--border);
5287
+ background: var(--bg);
5288
+ }
5289
+
5290
+ .gdp-db-annotation-inline {
5291
+ border: 1px solid var(--accent);
5292
+ border-radius: 6px;
5293
+ background: color-mix(in srgb, var(--accent) 7%, var(--bg));
5294
+ box-shadow: var(--shadow-sm);
5295
+ }
5296
+
5297
+ .gdp-db-annotation-inline.active {
5298
+ outline: 2px solid color-mix(in srgb, var(--accent) 35%, transparent);
5299
+ }
5300
+
5301
+ .gdp-db-annotation-inline-head {
5302
+ display: flex;
5303
+ align-items: center;
5304
+ gap: 8px;
5305
+ padding: 8px 10px 0;
5306
+ }
5307
+
5308
+ .gdp-db-annotation-inline-title {
5309
+ border: 0;
5310
+ background: transparent;
5311
+ color: var(--fg);
5312
+ font: inherit;
5313
+ font-weight: 700;
5314
+ padding: 0;
5315
+ cursor: pointer;
5316
+ }
5317
+
5318
+ .gdp-db-annotation-inline-location {
5319
+ min-width: 0;
5320
+ color: var(--muted);
5321
+ font-size: 12px;
5322
+ overflow: hidden;
5323
+ text-overflow: ellipsis;
5324
+ white-space: nowrap;
5325
+ }
5326
+
5327
+ .gdp-db-annotation-inline-body {
5328
+ padding: 6px 10px 10px;
5329
+ color: var(--fg);
5330
+ }
5331
+
5332
+ .gdp-db-annotation-inline-body p:last-child {
5333
+ margin-bottom: 0;
5334
+ }
5335
+
5150
5336
  /* ============================================================
5151
5337
  Database Viewer
5152
5338
  ============================================================ */
@@ -5154,11 +5340,8 @@ body.query-history-panel-open #content {
5154
5340
  .gdp-database-page #topbar,
5155
5341
  .gdp-database-page #sidebar,
5156
5342
  .gdp-database-page #sidebar-toggle,
5157
- .gdp-database-page #annotation-panel,
5158
5343
  .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 {
5344
+ .gdp-database-page #query-history-panel {
5162
5345
  display: none !important;
5163
5346
  }
5164
5347
 
@@ -5169,29 +5352,42 @@ body.query-history-panel-open #content {
5169
5352
  max-width: none;
5170
5353
  }
5171
5354
 
5355
+ .db-root,
5172
5356
  .db-container {
5173
5357
  --db-font-sm: 11px;
5174
5358
  --db-font-base: 12px;
5175
5359
  --db-font-md: 13px;
5176
5360
  --db-font-mono: 13px;
5361
+ }
5362
+
5363
+ .db-container {
5177
5364
  display: flex;
5178
5365
  flex-direction: column;
5179
- height: calc(100vh - var(--global-header-h));
5366
+ /* `.db-tab-host` の中に置かれるので親の高さに合わせる。
5367
+ Round 5 multi-tab 以前は #content 直下だったため calc(100vh - header) で
5368
+ 固定していたが、いまは .db-root > .db-tabs-bar (固定) + .db-tab-host
5369
+ (flex: 1) の下にいるため、ここで自分で viewport 高さを再計算すると
5370
+ 親より縦長になり sidebar 末尾の history toggle が下にはみ出す。 */
5371
+ height: 100%;
5372
+ min-height: 0;
5180
5373
  overflow: hidden;
5181
5374
  font-size: var(--db-font-base);
5182
5375
  }
5376
+ body[data-sidebar-font-size="compact"] .db-root,
5183
5377
  body[data-sidebar-font-size="compact"] .db-container {
5184
5378
  --db-font-sm: 10px;
5185
5379
  --db-font-base: 11px;
5186
5380
  --db-font-md: 12px;
5187
5381
  --db-font-mono: 12px;
5188
5382
  }
5383
+ body[data-sidebar-font-size="large"] .db-root,
5189
5384
  body[data-sidebar-font-size="large"] .db-container {
5190
5385
  --db-font-sm: 12px;
5191
5386
  --db-font-base: 14px;
5192
5387
  --db-font-md: 15px;
5193
5388
  --db-font-mono: 14px;
5194
5389
  }
5390
+ body[data-sidebar-font-size="xlarge"] .db-root,
5195
5391
  body[data-sidebar-font-size="xlarge"] .db-container {
5196
5392
  --db-font-sm: 13px;
5197
5393
  --db-font-base: 15px;
@@ -5228,12 +5424,61 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5228
5424
  border-top: 1px solid var(--border);
5229
5425
  padding: 6px 8px;
5230
5426
  display: flex;
5231
- gap: 6px;
5427
+ flex-direction: column;
5428
+ gap: 4px;
5429
+ flex-shrink: 0;
5430
+ }
5431
+
5432
+ /* ---------- Icon toolbar (案 B 改: TablePlus / Beekeeper 風) ---------- */
5433
+ .db-icon-toolbar {
5434
+ display: flex;
5435
+ flex-direction: row;
5436
+ align-items: center;
5437
+ gap: 2px;
5438
+ padding: 4px 6px;
5439
+ border-bottom: 1px solid var(--border);
5440
+ background: var(--bg);
5232
5441
  flex-shrink: 0;
5442
+ min-height: 36px;
5443
+ }
5444
+ .db-icon-toolbar[hidden] {
5445
+ display: none !important;
5446
+ }
5447
+ .db-icon-btn {
5448
+ display: inline-flex;
5449
+ align-items: center;
5450
+ justify-content: center;
5451
+ width: 30px;
5452
+ height: 28px;
5453
+ padding: 0;
5454
+ border: none;
5455
+ background: transparent;
5456
+ color: var(--fg-muted);
5457
+ border-radius: 4px;
5458
+ cursor: pointer;
5459
+ font-size: var(--db-font-base);
5460
+ transition: background-color 0.12s, color 0.12s;
5461
+ }
5462
+ .db-icon-btn:hover {
5463
+ background: var(--bg-soft);
5464
+ color: var(--fg);
5465
+ }
5466
+ .db-icon-btn.active {
5467
+ background: color-mix(in srgb, var(--accent) 14%, transparent);
5468
+ color: var(--accent);
5469
+ }
5470
+ .db-icon-btn:focus-visible {
5471
+ outline: 2px solid var(--accent);
5472
+ outline-offset: -1px;
5473
+ }
5474
+ .db-icon-btn svg {
5475
+ pointer-events: none;
5476
+ width: 1.25em;
5477
+ height: 1.25em;
5233
5478
  }
5234
5479
  .db-tool-btn {
5235
- flex: 1;
5236
- padding: 5px 8px;
5480
+ width: 100%;
5481
+ padding: 6px 10px;
5237
5482
  border: 1px solid var(--border);
5238
5483
  border-radius: 6px;
5239
5484
  background: var(--bg);
@@ -5241,7 +5486,10 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5241
5486
  font-size: var(--db-font-base);
5242
5487
  font-family: inherit;
5243
5488
  cursor: pointer;
5244
- text-align: center;
5489
+ text-align: left;
5490
+ white-space: nowrap;
5491
+ overflow: hidden;
5492
+ text-overflow: ellipsis;
5245
5493
  }
5246
5494
  .db-tool-btn:hover {
5247
5495
  background: var(--bg-mute);
@@ -5278,6 +5526,26 @@ body[data-sidebar-font-size="xlarge"] .db-container {
5278
5526
  font-weight: 600;
5279
5527
  }
5280
5528
 
5529
+ /* ---------- [hidden] 属性を効かせる ---------- */
5530
+ /* `.db-*` クラスの多くが `display: flex` を主張しており、ブラウザ標準の
5531
+ `[hidden] { display: none }` (specificity 0,1,0) と CSS specificity が
5532
+ 同点で後勝ちで負ける。各要素について [hidden] 専用ルールを明示する。 */
5533
+ .db-tools-section[hidden],
5534
+ .db-tool-btn[hidden],
5535
+ .db-tab-bar[hidden],
5536
+ .db-history-toggle[hidden],
5537
+ .db-history-pane[hidden],
5538
+ .db-history-resizer[hidden],
5539
+ .db-table-list[hidden],
5540
+ .db-table-list-wrapper[hidden],
5541
+ .db-table-filter-wrap[hidden],
5542
+ .db-toolbar[hidden],
5543
+ .db-upper-area[hidden],
5544
+ .db-container[hidden],
5545
+ .db-tab-host[hidden] {
5546
+ display: none !important;
5547
+ }
5548
+
5281
5549
  /* ---------- Sidebar ---------- */
5282
5550
  .db-sidebar {
5283
5551
  width: 260px;
@@ -5875,6 +6143,16 @@ html[data-theme="dark"] .db-query-highlight span[style] {
5875
6143
  top: 0;
5876
6144
  z-index: 1;
5877
6145
  }
6146
+ .db-query-header-name {
6147
+ color: var(--fg);
6148
+ font-weight: 600;
6149
+ }
6150
+ .db-query-header-type {
6151
+ margin-top: 1px;
6152
+ color: var(--fg-subtle);
6153
+ font-size: var(--db-font-sm);
6154
+ font-weight: 400;
6155
+ }
5878
6156
  .db-query-table tr.alt td {
5879
6157
  background: var(--bg-soft);
5880
6158
  }
@@ -5885,6 +6163,14 @@ html[data-theme="dark"] .db-query-highlight span[style] {
5885
6163
  color: var(--fg-subtle);
5886
6164
  font-style: italic;
5887
6165
  }
6166
+ .db-query-table td.db-query-empty {
6167
+ padding: 22px 12px;
6168
+ color: var(--fg-muted);
6169
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
6170
+ Helvetica, Arial, sans-serif;
6171
+ font-style: normal;
6172
+ text-align: center;
6173
+ }
5888
6174
 
5889
6175
  /* ---------- Schema View ---------- */
5890
6176
  .db-schema-view {
@@ -6116,6 +6402,16 @@ html[data-theme="dark"] .db-query-highlight span[style] {
6116
6402
  color: var(--danger);
6117
6403
  background: none;
6118
6404
  }
6405
+ .db-grid-detail-copy {
6406
+ font-size: 11px;
6407
+ padding: 2px 8px;
6408
+ margin-left: auto;
6409
+ margin-right: 8px;
6410
+ color: var(--fg-muted);
6411
+ }
6412
+ .db-grid-detail-copy:hover {
6413
+ color: var(--fg);
6414
+ }
6119
6415
 
6120
6416
  .db-grid-detail-content {
6121
6417
  padding: 8px 12px;
@@ -6514,7 +6810,8 @@ body.db-resizing {
6514
6810
  margin-bottom: 12px;
6515
6811
  }
6516
6812
  .db-snapshot-create-btn,
6517
- .db-snapshot-refresh-btn {
6813
+ .db-snapshot-refresh-btn,
6814
+ .db-snapshot-job-cancel-btn {
6518
6815
  padding: 6px 14px;
6519
6816
  border: 1px solid var(--border);
6520
6817
  border-radius: 4px;
@@ -6524,7 +6821,8 @@ body.db-resizing {
6524
6821
  font-size: var(--db-font-base);
6525
6822
  }
6526
6823
  .db-snapshot-create-btn:hover,
6527
- .db-snapshot-refresh-btn:hover {
6824
+ .db-snapshot-refresh-btn:hover,
6825
+ .db-snapshot-job-cancel-btn:hover {
6528
6826
  background: var(--bg-mute);
6529
6827
  }
6530
6828
  .db-snapshot-table-selector {
@@ -6957,3 +7255,662 @@ body.db-resizing {
6957
7255
  background: var(--bg-soft);
6958
7256
  align-items: center;
6959
7257
  }
7258
+
7259
+ /* ---------- Redis explorer ---------- */
7260
+ .redis-explorer {
7261
+ flex: 1;
7262
+ display: flex;
7263
+ flex-direction: row;
7264
+ overflow: hidden;
7265
+ background: var(--bg);
7266
+ font-size: var(--db-font-base);
7267
+ }
7268
+ .redis-explorer[hidden] {
7269
+ display: none;
7270
+ }
7271
+ .redis-db-list-pane {
7272
+ width: 220px;
7273
+ border-right: 1px solid var(--border);
7274
+ display: flex;
7275
+ flex-direction: column;
7276
+ overflow: hidden;
7277
+ background: var(--bg-soft);
7278
+ }
7279
+ .db-explorer-pane-header {
7280
+ padding: 8px 12px;
7281
+ font-weight: 600;
7282
+ font-size: var(--db-font-md);
7283
+ border-bottom: 1px solid var(--border);
7284
+ background: var(--bg);
7285
+ flex-shrink: 0;
7286
+ }
7287
+ .redis-db-list {
7288
+ flex: 1;
7289
+ overflow-y: auto;
7290
+ padding: 4px 0;
7291
+ }
7292
+ .redis-db-item {
7293
+ display: flex;
7294
+ justify-content: space-between;
7295
+ align-items: center;
7296
+ padding: 6px 12px;
7297
+ cursor: pointer;
7298
+ border-left: 2px solid transparent;
7299
+ user-select: none;
7300
+ }
7301
+ .redis-db-item:hover {
7302
+ background: var(--bg-hover, var(--bg));
7303
+ }
7304
+ .redis-db-item.active {
7305
+ background: var(--bg-active, var(--bg-soft));
7306
+ border-left-color: var(--accent);
7307
+ }
7308
+ .redis-db-name {
7309
+ font-family: var(--mono, monospace);
7310
+ font-size: var(--db-font-mono);
7311
+ font-weight: 500;
7312
+ }
7313
+ .redis-db-count {
7314
+ font-size: var(--db-font-sm);
7315
+ color: var(--fg-muted);
7316
+ }
7317
+ .redis-key-list-pane {
7318
+ width: 320px;
7319
+ border-right: 1px solid var(--border);
7320
+ display: flex;
7321
+ flex-direction: column;
7322
+ overflow: hidden;
7323
+ background: var(--bg);
7324
+ }
7325
+ .redis-key-filter-form {
7326
+ display: flex;
7327
+ gap: 6px;
7328
+ padding: 8px;
7329
+ border-bottom: 1px solid var(--border);
7330
+ background: var(--bg-soft);
7331
+ }
7332
+ .redis-key-filter {
7333
+ flex: 1;
7334
+ min-width: 0;
7335
+ padding: 5px 7px;
7336
+ border: 1px solid var(--border);
7337
+ border-radius: 6px;
7338
+ background: var(--bg);
7339
+ color: var(--fg);
7340
+ font: inherit;
7341
+ }
7342
+ .redis-key-filter-btn {
7343
+ padding: 5px 8px;
7344
+ border: 1px solid var(--border);
7345
+ border-radius: 6px;
7346
+ background: var(--bg);
7347
+ color: var(--fg);
7348
+ cursor: pointer;
7349
+ font: inherit;
7350
+ }
7351
+ .redis-key-filter-btn:hover {
7352
+ background: var(--bg-hover, var(--bg));
7353
+ }
7354
+ .redis-key-list {
7355
+ flex: 1;
7356
+ overflow-y: auto;
7357
+ padding: 4px 0;
7358
+ }
7359
+ .redis-key-item {
7360
+ display: flex;
7361
+ align-items: center;
7362
+ gap: 6px;
7363
+ padding: 4px 12px;
7364
+ cursor: pointer;
7365
+ border-left: 2px solid transparent;
7366
+ user-select: none;
7367
+ font-family: var(--mono, monospace);
7368
+ font-size: var(--db-font-mono);
7369
+ }
7370
+ .redis-key-item:hover {
7371
+ background: var(--bg-hover, var(--bg-soft));
7372
+ }
7373
+ .redis-key-item.active {
7374
+ background: var(--bg-active, var(--bg-soft));
7375
+ border-left-color: var(--accent);
7376
+ }
7377
+ .redis-key-name {
7378
+ overflow: hidden;
7379
+ text-overflow: ellipsis;
7380
+ white-space: nowrap;
7381
+ flex: 1;
7382
+ }
7383
+ .redis-type-badge {
7384
+ display: inline-block;
7385
+ padding: 0 6px;
7386
+ border-radius: 3px;
7387
+ font-size: var(--db-font-sm);
7388
+ font-family: var(--mono, monospace);
7389
+ text-transform: uppercase;
7390
+ background: var(--bg-soft);
7391
+ color: var(--fg-muted);
7392
+ border: 1px solid var(--border);
7393
+ flex-shrink: 0;
7394
+ min-width: 44px;
7395
+ text-align: center;
7396
+ }
7397
+ .redis-type-string {
7398
+ background: #e8f0ff;
7399
+ color: #224a8a;
7400
+ }
7401
+ .redis-type-hash {
7402
+ background: #fff4e0;
7403
+ color: #8a5a22;
7404
+ }
7405
+ .redis-type-list {
7406
+ background: #e8f8e8;
7407
+ color: #226a3a;
7408
+ }
7409
+ .redis-type-set {
7410
+ background: #f0e8f8;
7411
+ color: #5a228a;
7412
+ }
7413
+ .redis-type-zset {
7414
+ background: #f8e8e8;
7415
+ color: #8a2a3a;
7416
+ }
7417
+ .redis-type-stream {
7418
+ background: #e8f8f8;
7419
+ color: #226a8a;
7420
+ }
7421
+ .redis-key-more-btn {
7422
+ padding: 6px;
7423
+ border: none;
7424
+ border-top: 1px solid var(--border);
7425
+ background: var(--bg-soft);
7426
+ cursor: pointer;
7427
+ font-size: var(--db-font-sm);
7428
+ color: var(--fg);
7429
+ }
7430
+ .redis-key-more-btn:hover {
7431
+ background: var(--bg-hover, var(--bg));
7432
+ }
7433
+ .redis-key-more-btn:disabled {
7434
+ cursor: default;
7435
+ color: var(--fg-muted);
7436
+ }
7437
+ .redis-main-pane {
7438
+ flex: 1;
7439
+ display: flex;
7440
+ flex-direction: column;
7441
+ overflow: hidden;
7442
+ padding: 12px;
7443
+ color: var(--fg);
7444
+ gap: 8px;
7445
+ }
7446
+ .redis-value-header {
7447
+ display: flex;
7448
+ align-items: center;
7449
+ gap: 8px;
7450
+ padding-bottom: 8px;
7451
+ border-bottom: 1px solid var(--border);
7452
+ flex-shrink: 0;
7453
+ }
7454
+ .redis-value-key-name {
7455
+ font-family: var(--mono, monospace);
7456
+ font-size: var(--db-font-mono);
7457
+ font-weight: 600;
7458
+ overflow: hidden;
7459
+ text-overflow: ellipsis;
7460
+ white-space: nowrap;
7461
+ }
7462
+ .redis-value-body {
7463
+ flex: 1;
7464
+ overflow: auto;
7465
+ min-height: 0;
7466
+ }
7467
+ .redis-value-empty {
7468
+ color: var(--fg-muted);
7469
+ font-size: var(--db-font-base);
7470
+ font-style: italic;
7471
+ }
7472
+ .redis-value-info,
7473
+ .redis-value-truncation {
7474
+ padding: 4px 8px;
7475
+ margin-bottom: 6px;
7476
+ border-radius: 4px;
7477
+ font-size: var(--db-font-sm);
7478
+ font-family: var(--mono, monospace);
7479
+ }
7480
+ .redis-value-info {
7481
+ background: var(--bg-soft);
7482
+ color: var(--fg-muted);
7483
+ }
7484
+ .redis-value-truncation {
7485
+ background: #fff4e0;
7486
+ color: #8a5a22;
7487
+ border: 1px solid #f0d8a0;
7488
+ }
7489
+ .redis-binary-badge {
7490
+ display: inline-block;
7491
+ padding: 0 6px;
7492
+ margin-right: 6px;
7493
+ border-radius: 3px;
7494
+ font-size: var(--db-font-sm);
7495
+ font-family: var(--mono, monospace);
7496
+ text-transform: uppercase;
7497
+ background: #f0e8f8;
7498
+ color: #5a228a;
7499
+ border: 1px solid #d0c0e0;
7500
+ vertical-align: middle;
7501
+ }
7502
+ .redis-value-string,
7503
+ .redis-value-raw-json {
7504
+ font-family: var(--mono, monospace);
7505
+ font-size: var(--db-font-mono);
7506
+ white-space: pre-wrap;
7507
+ word-break: break-all;
7508
+ margin: 0;
7509
+ padding: 8px;
7510
+ background: var(--bg-soft);
7511
+ border-radius: 4px;
7512
+ }
7513
+ .redis-value-hash-table {
7514
+ width: 100%;
7515
+ border-collapse: collapse;
7516
+ font-family: var(--mono, monospace);
7517
+ font-size: var(--db-font-mono);
7518
+ }
7519
+ .redis-value-hash-table th,
7520
+ .redis-value-hash-table td {
7521
+ text-align: left;
7522
+ padding: 4px 8px;
7523
+ border-bottom: 1px solid var(--border);
7524
+ vertical-align: top;
7525
+ }
7526
+ .redis-value-hash-table th {
7527
+ background: var(--bg-soft);
7528
+ font-weight: 600;
7529
+ }
7530
+ .redis-value-hash-field {
7531
+ width: 30%;
7532
+ word-break: break-all;
7533
+ color: var(--fg-muted);
7534
+ }
7535
+ .redis-value-hash-val {
7536
+ word-break: break-all;
7537
+ white-space: pre-wrap;
7538
+ }
7539
+ .redis-value-list {
7540
+ margin: 0;
7541
+ padding: 0 0 0 28px;
7542
+ font-family: var(--mono, monospace);
7543
+ font-size: var(--db-font-mono);
7544
+ }
7545
+ .redis-value-list li {
7546
+ padding: 2px 4px;
7547
+ border-bottom: 1px solid var(--border);
7548
+ word-break: break-all;
7549
+ white-space: pre-wrap;
7550
+ }
7551
+ .db-pane-note {
7552
+ padding: 8px 12px;
7553
+ color: var(--fg-muted);
7554
+ font-size: var(--db-font-sm);
7555
+ }
7556
+ .db-pane-error {
7557
+ padding: 8px 12px;
7558
+ color: var(--error, #c00);
7559
+ font-size: var(--db-font-sm);
7560
+ }
7561
+
7562
+ /* ---------- Elasticsearch explorer ---------- */
7563
+ .es-explorer {
7564
+ flex: 1;
7565
+ display: flex;
7566
+ flex-direction: row;
7567
+ overflow: hidden;
7568
+ background: var(--bg);
7569
+ font-size: var(--db-font-base);
7570
+ }
7571
+ .es-explorer[hidden] {
7572
+ display: none;
7573
+ }
7574
+ .es-index-list-pane {
7575
+ width: 260px;
7576
+ border-right: 1px solid var(--border);
7577
+ display: flex;
7578
+ flex-direction: column;
7579
+ overflow: hidden;
7580
+ background: var(--bg-soft);
7581
+ }
7582
+ .es-index-list {
7583
+ flex: 1;
7584
+ overflow-y: auto;
7585
+ padding: 4px 0;
7586
+ }
7587
+ .es-index-item {
7588
+ display: flex;
7589
+ flex-direction: column;
7590
+ padding: 6px 12px;
7591
+ cursor: pointer;
7592
+ border-left: 2px solid transparent;
7593
+ user-select: none;
7594
+ gap: 2px;
7595
+ }
7596
+ .es-index-item:hover {
7597
+ background: var(--bg-hover, var(--bg));
7598
+ }
7599
+ .es-index-item.active {
7600
+ background: var(--bg-active, var(--bg-soft));
7601
+ border-left-color: var(--accent);
7602
+ }
7603
+ .es-index-name {
7604
+ font-family: var(--mono, monospace);
7605
+ font-size: var(--db-font-mono);
7606
+ font-weight: 500;
7607
+ overflow: hidden;
7608
+ text-overflow: ellipsis;
7609
+ white-space: nowrap;
7610
+ }
7611
+ .es-index-meta {
7612
+ font-size: var(--db-font-sm);
7613
+ color: var(--fg-muted);
7614
+ }
7615
+ .es-doc-list-pane {
7616
+ width: 380px;
7617
+ border-right: 1px solid var(--border);
7618
+ display: flex;
7619
+ flex-direction: column;
7620
+ overflow: hidden;
7621
+ background: var(--bg);
7622
+ }
7623
+ .es-search-bar {
7624
+ display: flex;
7625
+ gap: 6px;
7626
+ padding: 8px 12px;
7627
+ border-bottom: 1px solid var(--border);
7628
+ background: var(--bg-soft);
7629
+ flex-shrink: 0;
7630
+ }
7631
+ .es-search-input {
7632
+ flex: 1;
7633
+ padding: 4px 8px;
7634
+ border: 1px solid var(--border);
7635
+ border-radius: 4px;
7636
+ background: var(--bg);
7637
+ color: var(--fg);
7638
+ font-family: var(--mono, monospace);
7639
+ font-size: var(--db-font-mono);
7640
+ }
7641
+ .es-search-btn {
7642
+ padding: 4px 10px;
7643
+ border: 1px solid var(--border);
7644
+ border-radius: 4px;
7645
+ background: var(--bg);
7646
+ color: var(--fg);
7647
+ cursor: pointer;
7648
+ font-size: var(--db-font-base);
7649
+ }
7650
+ .es-search-btn:hover {
7651
+ background: var(--bg-hover, var(--bg-soft));
7652
+ }
7653
+ .es-doc-list {
7654
+ flex: 1;
7655
+ overflow-y: auto;
7656
+ padding: 4px 0;
7657
+ }
7658
+ .es-doc-item {
7659
+ display: flex;
7660
+ flex-direction: column;
7661
+ padding: 4px 12px;
7662
+ cursor: pointer;
7663
+ border-left: 2px solid transparent;
7664
+ user-select: none;
7665
+ font-family: var(--mono, monospace);
7666
+ font-size: var(--db-font-mono);
7667
+ gap: 2px;
7668
+ border-bottom: 1px solid var(--border);
7669
+ }
7670
+ .es-doc-item:hover {
7671
+ background: var(--bg-hover, var(--bg-soft));
7672
+ }
7673
+ .es-doc-item.active {
7674
+ background: var(--bg-active, var(--bg-soft));
7675
+ border-left-color: var(--accent);
7676
+ }
7677
+ .es-doc-id {
7678
+ font-weight: 600;
7679
+ overflow: hidden;
7680
+ text-overflow: ellipsis;
7681
+ white-space: nowrap;
7682
+ }
7683
+ .es-doc-preview {
7684
+ color: var(--fg-muted);
7685
+ font-size: var(--db-font-sm);
7686
+ overflow: hidden;
7687
+ text-overflow: ellipsis;
7688
+ white-space: nowrap;
7689
+ }
7690
+ .es-doc-more-btn {
7691
+ padding: 6px;
7692
+ border: none;
7693
+ border-top: 1px solid var(--border);
7694
+ background: var(--bg-soft);
7695
+ cursor: pointer;
7696
+ font-size: var(--db-font-sm);
7697
+ color: var(--fg);
7698
+ }
7699
+ .es-doc-more-btn:hover {
7700
+ background: var(--bg-hover, var(--bg));
7701
+ }
7702
+ .es-doc-more-btn:disabled {
7703
+ cursor: default;
7704
+ color: var(--fg-muted);
7705
+ }
7706
+ .es-detail-pane {
7707
+ flex: 1;
7708
+ display: flex;
7709
+ flex-direction: column;
7710
+ overflow: hidden;
7711
+ background: var(--bg);
7712
+ }
7713
+ .es-detail-tabs {
7714
+ display: flex;
7715
+ border-bottom: 1px solid var(--border);
7716
+ background: var(--bg-soft);
7717
+ flex-shrink: 0;
7718
+ }
7719
+ .es-detail-tab {
7720
+ padding: 6px 14px;
7721
+ border: none;
7722
+ background: transparent;
7723
+ cursor: pointer;
7724
+ font-size: var(--db-font-base);
7725
+ color: var(--fg-muted);
7726
+ border-bottom: 2px solid transparent;
7727
+ }
7728
+ .es-detail-tab.active {
7729
+ color: var(--fg);
7730
+ border-bottom-color: var(--accent);
7731
+ }
7732
+ .es-mapping-body,
7733
+ .es-doc-body {
7734
+ flex: 1;
7735
+ overflow: auto;
7736
+ padding: 12px;
7737
+ color: var(--fg);
7738
+ }
7739
+ .es-mapping-header,
7740
+ .es-doc-detail-header {
7741
+ font-family: var(--mono, monospace);
7742
+ font-size: var(--db-font-mono);
7743
+ font-weight: 600;
7744
+ padding-bottom: 8px;
7745
+ border-bottom: 1px solid var(--border);
7746
+ margin-bottom: 8px;
7747
+ }
7748
+ .es-doc-detail-meta {
7749
+ font-family: var(--mono, monospace);
7750
+ font-size: var(--db-font-sm);
7751
+ color: var(--fg-muted);
7752
+ margin-bottom: 8px;
7753
+ }
7754
+ .es-mapping-table {
7755
+ width: 100%;
7756
+ border-collapse: collapse;
7757
+ font-family: var(--mono, monospace);
7758
+ font-size: var(--db-font-mono);
7759
+ }
7760
+ .es-mapping-table th,
7761
+ .es-mapping-table td {
7762
+ text-align: left;
7763
+ padding: 4px 8px;
7764
+ border-bottom: 1px solid var(--border);
7765
+ }
7766
+ .es-mapping-table th {
7767
+ font-weight: 600;
7768
+ background: var(--bg-soft);
7769
+ }
7770
+ .es-mapping-field {
7771
+ font-weight: 500;
7772
+ }
7773
+ .es-mapping-type {
7774
+ color: var(--fg-muted);
7775
+ }
7776
+ .es-doc-source {
7777
+ font-family: var(--mono, monospace);
7778
+ font-size: var(--db-font-mono);
7779
+ white-space: pre-wrap;
7780
+ word-break: break-all;
7781
+ margin: 0;
7782
+ }
7783
+ .es-value-empty {
7784
+ color: var(--fg-muted);
7785
+ font-size: var(--db-font-base);
7786
+ font-style: italic;
7787
+ text-align: center;
7788
+ padding: 8px;
7789
+ }
7790
+ /* ---------- Database multi-tab manager ---------- */
7791
+ .db-root {
7792
+ display: flex;
7793
+ flex-direction: column;
7794
+ /* `#content` 由来の高さが viewport いっぱいにならない環境があり、
7795
+ `height: 100%` だと `.db-tab-host` が縮んで内側の history pane / main
7796
+ content が画面途中で切れる。Round 5 前の `.db-container` と同様、
7797
+ ここで viewport 基準の高さを明示する。 */
7798
+ height: calc(100vh - var(--global-header-h));
7799
+ width: 100%;
7800
+ overflow: hidden;
7801
+ font-size: var(--db-font-base);
7802
+ }
7803
+ .db-tabs-bar {
7804
+ display: flex;
7805
+ flex-direction: row;
7806
+ align-items: stretch;
7807
+ background: var(--bg-soft);
7808
+ border-bottom: 1px solid var(--border);
7809
+ min-height: 32px;
7810
+ flex-shrink: 0;
7811
+ overflow: hidden;
7812
+ }
7813
+ .db-tabs-list {
7814
+ display: flex;
7815
+ flex-direction: row;
7816
+ flex: 1;
7817
+ overflow-x: auto;
7818
+ overflow-y: hidden;
7819
+ gap: 1px;
7820
+ }
7821
+ .db-tabs-chip {
7822
+ display: inline-flex;
7823
+ align-items: center;
7824
+ gap: 6px;
7825
+ padding: 4px 6px 4px 12px;
7826
+ border-right: 1px solid var(--border);
7827
+ background: var(--bg-soft);
7828
+ color: var(--fg-muted);
7829
+ cursor: pointer;
7830
+ user-select: none;
7831
+ font-size: var(--db-font-base);
7832
+ max-width: 240px;
7833
+ min-width: 80px;
7834
+ flex-shrink: 0;
7835
+ }
7836
+ .db-tabs-chip:hover {
7837
+ background: var(--bg-hover, var(--bg));
7838
+ color: var(--fg);
7839
+ }
7840
+ .db-tabs-chip.active {
7841
+ background: var(--bg);
7842
+ color: var(--fg);
7843
+ border-bottom: 2px solid var(--accent);
7844
+ font-weight: 500;
7845
+ margin-bottom: -1px;
7846
+ }
7847
+ .db-tabs-chip.dragging {
7848
+ opacity: 0.55;
7849
+ }
7850
+ .db-tabs-chip.drop-target {
7851
+ background: var(--accent-subtle);
7852
+ box-shadow: inset 2px 0 0 var(--accent);
7853
+ }
7854
+ .db-tabs-chip.drop-target.drop-after {
7855
+ box-shadow: inset -2px 0 0 var(--accent);
7856
+ }
7857
+ .db-tabs-chip:focus-visible,
7858
+ .db-tabs-new-btn:focus-visible,
7859
+ .db-tabs-chip-close:focus-visible {
7860
+ outline: 2px solid var(--accent);
7861
+ outline-offset: -2px;
7862
+ }
7863
+ .db-tabs-chip-label {
7864
+ flex: 1;
7865
+ overflow: hidden;
7866
+ text-overflow: ellipsis;
7867
+ white-space: nowrap;
7868
+ }
7869
+ .db-tabs-chip-close {
7870
+ display: inline-flex;
7871
+ align-items: center;
7872
+ justify-content: center;
7873
+ min-width: 24px;
7874
+ min-height: 24px;
7875
+ padding: 0;
7876
+ margin: 0;
7877
+ border: none;
7878
+ background: transparent;
7879
+ color: var(--fg-muted);
7880
+ border-radius: 3px;
7881
+ cursor: pointer;
7882
+ font-size: var(--db-font-md);
7883
+ line-height: 1;
7884
+ }
7885
+ .db-tabs-chip-close:hover {
7886
+ background: var(--bg-hover, var(--border));
7887
+ color: var(--fg);
7888
+ }
7889
+ .db-tabs-new-btn {
7890
+ border: none;
7891
+ border-left: 1px solid var(--border);
7892
+ background: var(--bg-soft);
7893
+ cursor: pointer;
7894
+ padding: 0 12px;
7895
+ font-size: var(--db-font-md);
7896
+ color: var(--fg-muted);
7897
+ min-width: 36px;
7898
+ }
7899
+ .db-tabs-new-btn:hover {
7900
+ background: var(--bg-hover, var(--bg));
7901
+ color: var(--fg);
7902
+ }
7903
+ .db-tab-host {
7904
+ flex: 1;
7905
+ display: flex;
7906
+ position: relative;
7907
+ overflow: hidden;
7908
+ min-height: 0;
7909
+ }
7910
+ .db-tab-host > .db-container {
7911
+ flex: 1;
7912
+ }
7913
+ .db-tab-host > .db-container[hidden] {
7914
+ display: none;
7915
+ }
7916
+