backpack-viewer 0.2.13 → 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.
package/dist/style.css CHANGED
@@ -246,13 +246,37 @@ body {
246
246
  color: var(--text-dim);
247
247
  }
248
248
 
249
- /* --- Theme Toggle --- */
249
+ /* --- Top Bar --- */
250
250
 
251
- .theme-toggle {
251
+ .canvas-top-bar {
252
252
  position: absolute;
253
253
  top: 16px;
254
+ left: 16px;
254
255
  right: 16px;
255
256
  z-index: 30;
257
+ display: flex;
258
+ justify-content: space-between;
259
+ align-items: flex-start;
260
+ pointer-events: none;
261
+ }
262
+
263
+ .canvas-top-left,
264
+ .canvas-top-center,
265
+ .canvas-top-right {
266
+ pointer-events: auto;
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 4px;
270
+ }
271
+
272
+ .canvas-top-center {
273
+ flex: 1;
274
+ justify-content: center;
275
+ }
276
+
277
+ /* --- Theme Toggle --- */
278
+
279
+ .theme-toggle {
256
280
  background: var(--bg-surface);
257
281
  border: 1px solid var(--border);
258
282
  border-radius: 8px;
@@ -274,18 +298,8 @@ body {
274
298
  /* --- Zoom Controls --- */
275
299
 
276
300
  .zoom-controls {
277
- position: absolute;
278
- top: 16px;
279
- right: 16px;
280
- z-index: 30;
281
301
  display: flex;
282
302
  gap: 4px;
283
- transition: right 0.2s ease;
284
- }
285
-
286
- /* Shift left when theme toggle is present (standalone viewer) */
287
- .theme-toggle ~ .zoom-controls {
288
- right: 58px;
289
303
  }
290
304
 
291
305
  .zoom-btn {
@@ -333,11 +347,7 @@ body {
333
347
  /* --- Search Overlay --- */
334
348
 
335
349
  .search-overlay {
336
- position: absolute;
337
- top: 16px;
338
- left: 50%;
339
- transform: translateX(-50%);
340
- z-index: 20;
350
+ position: relative;
341
351
  display: flex;
342
352
  flex-direction: column;
343
353
  align-items: center;
@@ -953,9 +963,435 @@ body {
953
963
  background: rgba(239, 68, 68, 0.1);
954
964
  }
955
965
 
966
+ /* --- Tools Pane (left side) --- */
967
+
968
+ .tools-pane-toggle {
969
+ background: var(--bg-surface);
970
+ border: 1px solid var(--border);
971
+ border-radius: 8px;
972
+ color: var(--text-muted);
973
+ font-size: 18px;
974
+ cursor: pointer;
975
+ padding: 6px 10px;
976
+ line-height: 1;
977
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
978
+ box-shadow: 0 2px 8px var(--shadow);
979
+ }
980
+
981
+ .tools-pane-toggle.hidden {
982
+ display: none;
983
+ }
984
+
985
+ .tools-pane-toggle:hover {
986
+ color: var(--text);
987
+ border-color: var(--text-muted);
988
+ background: var(--bg-hover);
989
+ }
990
+
991
+ .tools-pane-toggle.active {
992
+ color: var(--accent);
993
+ border-color: rgba(212, 162, 127, 0.4);
994
+ }
995
+
996
+ .tools-pane-content {
997
+ position: absolute;
998
+ top: 56px;
999
+ left: 16px;
1000
+ z-index: 20;
1001
+ width: 200px;
1002
+ max-height: calc(100vh - 72px);
1003
+ overflow-y: auto;
1004
+ background: var(--bg-surface);
1005
+ border: 1px solid var(--border);
1006
+ border-radius: 10px;
1007
+ padding: 12px;
1008
+ box-shadow: 0 8px 32px var(--shadow);
1009
+ }
1010
+
1011
+ .tools-pane-content.hidden {
1012
+ display: none;
1013
+ }
1014
+
1015
+ .tools-pane-section {
1016
+ margin-bottom: 12px;
1017
+ }
1018
+
1019
+ .tools-pane-section:last-child {
1020
+ margin-bottom: 0;
1021
+ }
1022
+
1023
+ .tools-pane-heading {
1024
+ font-size: 10px;
1025
+ font-weight: 600;
1026
+ text-transform: uppercase;
1027
+ letter-spacing: 0.05em;
1028
+ color: var(--text-dim);
1029
+ margin-bottom: 6px;
1030
+ }
1031
+
1032
+ .tools-pane-row {
1033
+ display: flex;
1034
+ align-items: center;
1035
+ gap: 6px;
1036
+ padding: 3px 0;
1037
+ font-size: 12px;
1038
+ }
1039
+
1040
+ .tools-pane-dot {
1041
+ width: 6px;
1042
+ height: 6px;
1043
+ border-radius: 50%;
1044
+ flex-shrink: 0;
1045
+ }
1046
+
1047
+ .tools-pane-name {
1048
+ flex: 1;
1049
+ color: var(--text);
1050
+ overflow: hidden;
1051
+ text-overflow: ellipsis;
1052
+ white-space: nowrap;
1053
+ }
1054
+
1055
+ .tools-pane-count {
1056
+ color: var(--text-dim);
1057
+ font-size: 11px;
1058
+ flex-shrink: 0;
1059
+ }
1060
+
1061
+ .tools-pane-summary {
1062
+ display: flex;
1063
+ align-items: center;
1064
+ gap: 4px;
1065
+ font-size: 11px;
1066
+ color: var(--text-muted);
1067
+ padding-bottom: 10px;
1068
+ margin-bottom: 10px;
1069
+ border-bottom: 1px solid var(--border);
1070
+ }
1071
+
1072
+ .tools-pane-sep {
1073
+ color: var(--text-dim);
1074
+ }
1075
+
1076
+ .tools-pane-clickable {
1077
+ cursor: pointer;
1078
+ border-radius: 4px;
1079
+ padding: 3px 4px;
1080
+ margin: 0 -4px;
1081
+ transition: background 0.1s;
1082
+ }
1083
+
1084
+ .tools-pane-clickable:hover {
1085
+ background: var(--bg-hover);
1086
+ }
1087
+
1088
+ .tools-pane-clickable.active {
1089
+ background: var(--bg-hover);
1090
+ outline: 1px solid var(--border);
1091
+ }
1092
+
1093
+ .tools-pane-badge {
1094
+ font-size: 9px;
1095
+ color: var(--accent);
1096
+ flex-shrink: 0;
1097
+ opacity: 0.8;
1098
+ }
1099
+
1100
+ .tools-pane-issue .tools-pane-name {
1101
+ color: var(--text-muted);
1102
+ }
1103
+
1104
+ .tools-pane-more {
1105
+ font-size: 10px;
1106
+ color: var(--text-dim);
1107
+ padding: 4px 0 0;
1108
+ }
1109
+
1110
+ .tools-pane-edit {
1111
+ background: none;
1112
+ border: none;
1113
+ color: var(--text-dim);
1114
+ font-size: 11px;
1115
+ cursor: pointer;
1116
+ padding: 0 2px;
1117
+ opacity: 0;
1118
+ transition: opacity 0.1s, color 0.1s;
1119
+ flex-shrink: 0;
1120
+ }
1121
+
1122
+ .tools-pane-row:hover .tools-pane-edit {
1123
+ opacity: 1;
1124
+ }
1125
+
1126
+ .tools-pane-edit:hover {
1127
+ color: var(--accent);
1128
+ }
1129
+
1130
+ .tools-pane-editing {
1131
+ background: none !important;
1132
+ }
1133
+
1134
+ .tools-pane-inline-input {
1135
+ width: 100%;
1136
+ background: var(--bg);
1137
+ border: 1px solid var(--accent);
1138
+ border-radius: 4px;
1139
+ color: var(--text);
1140
+ font-size: 12px;
1141
+ padding: 2px 6px;
1142
+ outline: none;
1143
+ }
1144
+
1145
+ .tools-pane-slider-row {
1146
+ display: flex;
1147
+ align-items: center;
1148
+ gap: 6px;
1149
+ padding: 4px 0;
1150
+ }
1151
+
1152
+ .tools-pane-slider-label {
1153
+ font-size: 11px;
1154
+ color: var(--text-muted);
1155
+ white-space: nowrap;
1156
+ min-width: 56px;
1157
+ }
1158
+
1159
+ .tools-pane-slider {
1160
+ flex: 1;
1161
+ min-width: 0;
1162
+ height: 4px;
1163
+ accent-color: var(--accent);
1164
+ cursor: pointer;
1165
+ }
1166
+
1167
+ .tools-pane-slider-value {
1168
+ font-size: 10px;
1169
+ color: var(--text-dim);
1170
+ min-width: 28px;
1171
+ text-align: right;
1172
+ font-family: monospace;
1173
+ }
1174
+
1175
+ .tools-pane-checkbox {
1176
+ width: 14px;
1177
+ height: 14px;
1178
+ accent-color: var(--accent);
1179
+ cursor: pointer;
1180
+ flex-shrink: 0;
1181
+ }
1182
+
1183
+ .tools-pane-export-row {
1184
+ display: flex;
1185
+ gap: 4px;
1186
+ margin-top: 6px;
1187
+ }
1188
+
1189
+ .tools-pane-export-btn {
1190
+ flex: 1;
1191
+ padding: 4px 8px;
1192
+ font-size: 11px;
1193
+ background: var(--bg);
1194
+ border: 1px solid var(--border);
1195
+ border-radius: 6px;
1196
+ color: var(--text-muted);
1197
+ cursor: pointer;
1198
+ transition: color 0.15s, border-color 0.15s;
1199
+ }
1200
+
1201
+ .tools-pane-export-btn:hover {
1202
+ color: var(--text);
1203
+ border-color: var(--text-muted);
1204
+ }
1205
+
1206
+ .tools-pane-empty {
1207
+ font-size: 11px;
1208
+ color: var(--text-dim);
1209
+ text-align: center;
1210
+ padding: 8px 0;
1211
+ }
1212
+
1213
+ /* --- Empty State --- */
1214
+
1215
+ .empty-state {
1216
+ position: absolute;
1217
+ inset: 0;
1218
+ display: flex;
1219
+ align-items: center;
1220
+ justify-content: center;
1221
+ z-index: 5;
1222
+ pointer-events: none;
1223
+ }
1224
+
1225
+ .empty-state.hidden {
1226
+ display: none;
1227
+ }
1228
+
1229
+ .empty-state-content {
1230
+ text-align: center;
1231
+ max-width: 420px;
1232
+ padding: 40px 24px;
1233
+ }
1234
+
1235
+ .empty-state-icon {
1236
+ color: var(--text-dim);
1237
+ margin-bottom: 16px;
1238
+ }
1239
+
1240
+ .empty-state-title {
1241
+ font-size: 18px;
1242
+ font-weight: 600;
1243
+ color: var(--text);
1244
+ margin-bottom: 8px;
1245
+ }
1246
+
1247
+ .empty-state-desc {
1248
+ font-size: 13px;
1249
+ color: var(--text-muted);
1250
+ line-height: 1.5;
1251
+ margin-bottom: 20px;
1252
+ }
1253
+
1254
+ .empty-state-setup {
1255
+ background: var(--bg-surface);
1256
+ border: 1px solid var(--border);
1257
+ border-radius: 8px;
1258
+ padding: 12px 16px;
1259
+ margin-bottom: 16px;
1260
+ }
1261
+
1262
+ .empty-state-label {
1263
+ font-size: 11px;
1264
+ color: var(--text-dim);
1265
+ margin-bottom: 8px;
1266
+ }
1267
+
1268
+ .empty-state-code {
1269
+ display: block;
1270
+ font-size: 12px;
1271
+ color: var(--accent);
1272
+ font-family: monospace;
1273
+ word-break: break-all;
1274
+ }
1275
+
1276
+ .empty-state-hint {
1277
+ font-size: 11px;
1278
+ color: var(--text-dim);
1279
+ }
1280
+
1281
+ .empty-state-hint kbd {
1282
+ padding: 1px 5px;
1283
+ border: 1px solid var(--border);
1284
+ border-radius: 3px;
1285
+ background: var(--bg-surface);
1286
+ font-family: monospace;
1287
+ font-size: 11px;
1288
+ }
1289
+
1290
+ /* --- Keyboard Shortcuts Modal --- */
1291
+
1292
+ .shortcuts-overlay {
1293
+ position: fixed;
1294
+ inset: 0;
1295
+ background: rgba(0, 0, 0, 0.5);
1296
+ display: flex;
1297
+ align-items: center;
1298
+ justify-content: center;
1299
+ z-index: 100;
1300
+ }
1301
+
1302
+ .shortcuts-overlay.hidden {
1303
+ display: none;
1304
+ }
1305
+
1306
+ .shortcuts-modal {
1307
+ background: var(--bg-surface);
1308
+ border: 1px solid var(--border);
1309
+ border-radius: 12px;
1310
+ padding: 24px;
1311
+ min-width: 300px;
1312
+ max-width: 400px;
1313
+ box-shadow: 0 16px 48px var(--shadow);
1314
+ position: relative;
1315
+ }
1316
+
1317
+ .shortcuts-close {
1318
+ position: absolute;
1319
+ top: 12px;
1320
+ right: 14px;
1321
+ background: none;
1322
+ border: none;
1323
+ color: var(--text-dim);
1324
+ font-size: 20px;
1325
+ cursor: pointer;
1326
+ padding: 0 4px;
1327
+ line-height: 1;
1328
+ }
1329
+
1330
+ .shortcuts-close:hover {
1331
+ color: var(--text);
1332
+ }
1333
+
1334
+ .shortcuts-title {
1335
+ font-size: 15px;
1336
+ font-weight: 600;
1337
+ color: var(--text);
1338
+ margin-bottom: 16px;
1339
+ }
1340
+
1341
+ .shortcuts-list {
1342
+ display: flex;
1343
+ flex-direction: column;
1344
+ gap: 8px;
1345
+ }
1346
+
1347
+ .shortcuts-row {
1348
+ display: flex;
1349
+ align-items: center;
1350
+ justify-content: space-between;
1351
+ gap: 12px;
1352
+ }
1353
+
1354
+ .shortcuts-keys {
1355
+ display: flex;
1356
+ align-items: center;
1357
+ gap: 4px;
1358
+ }
1359
+
1360
+ .shortcuts-keys kbd {
1361
+ padding: 2px 7px;
1362
+ border: 1px solid var(--border);
1363
+ border-radius: 4px;
1364
+ background: var(--bg);
1365
+ color: var(--text);
1366
+ font-size: 11px;
1367
+ font-family: monospace;
1368
+ }
1369
+
1370
+ .shortcuts-or {
1371
+ font-size: 10px;
1372
+ color: var(--text-dim);
1373
+ }
1374
+
1375
+ .shortcuts-desc {
1376
+ font-size: 12px;
1377
+ color: var(--text-muted);
1378
+ }
1379
+
956
1380
  /* --- Mobile --- */
957
1381
 
958
1382
  @media (max-width: 768px) {
1383
+ #app {
1384
+ flex-direction: column;
1385
+ }
1386
+
1387
+ #sidebar {
1388
+ width: 100%;
1389
+ min-width: 0;
1390
+ max-height: 35vh;
1391
+ border-right: none;
1392
+ border-bottom: 1px solid var(--border);
1393
+ }
1394
+
959
1395
  .info-panel {
960
1396
  top: auto;
961
1397
  bottom: 72px;
@@ -971,4 +1407,22 @@ body {
971
1407
  left: 0;
972
1408
  right: 0;
973
1409
  }
1410
+
1411
+ .canvas-top-bar {
1412
+ top: 8px;
1413
+ left: 8px;
1414
+ right: 8px;
1415
+ }
1416
+
1417
+ .tools-pane-content {
1418
+ top: 48px;
1419
+ left: 8px;
1420
+ width: 160px;
1421
+ max-height: calc(100% - 200px);
1422
+ max-width: calc(100vw - 24px);
1423
+ }
1424
+
1425
+ .tools-pane-edit {
1426
+ opacity: 0.6;
1427
+ }
974
1428
  }
@@ -0,0 +1,18 @@
1
+ import type { LearningGraphData } from "backpack-ontology";
2
+ interface ToolsPaneCallbacks {
3
+ onFilterByType: (type: string | null) => void;
4
+ onNavigateToNode: (nodeId: string) => void;
5
+ onRenameNodeType: (oldType: string, newType: string) => void;
6
+ onRenameEdgeType: (oldType: string, newType: string) => void;
7
+ onToggleEdgeLabels: (visible: boolean) => void;
8
+ onToggleTypeHulls: (visible: boolean) => void;
9
+ onToggleMinimap: (visible: boolean) => void;
10
+ onLayoutChange: (param: string, value: number) => void;
11
+ onExport: (format: "png" | "svg") => void;
12
+ onOpen?: () => void;
13
+ }
14
+ export declare function initToolsPane(container: HTMLElement, callbacks: ToolsPaneCallbacks): {
15
+ collapse(): void;
16
+ setData(newData: LearningGraphData | null): void;
17
+ };
18
+ export {};