@philomelcc/dsh-workbench 0.1.6 → 0.1.8
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/client.js +65 -13
- package/package.json +1 -1
package/client.js
CHANGED
|
@@ -470,6 +470,11 @@ window.__ModuleLoader__.load({
|
|
|
470
470
|
'--dsw-specific-input-major': '#f2ece0',
|
|
471
471
|
'--dsw-specific-tip': '#f7f2e7',
|
|
472
472
|
'--dsw-specific-menu': '#fcf9f3',
|
|
473
|
+
// Scrollbars read their own alias pair and default to neutral grey.
|
|
474
|
+
'--dsw-alias-scrollbar-bg-l1': '#d8cfba',
|
|
475
|
+
'--dsw-alias-scrollbar-bg-l2': '#d8cfba',
|
|
476
|
+
'--dsw-alias-scrollbar-hover-l1': '#c6bba2',
|
|
477
|
+
'--dsw-alias-scrollbar-hover-l2': '#c6bba2',
|
|
473
478
|
// The neutral greys are blue-tinted. Buttons ("load earlier"), inputs,
|
|
474
479
|
// chips and cards read their pale surfaces from this ramp, so warm it up
|
|
475
480
|
// too; deep steps stay untouched because they are text/borders.
|
|
@@ -555,12 +560,15 @@ window.__ModuleLoader__.load({
|
|
|
555
560
|
return;
|
|
556
561
|
}
|
|
557
562
|
const rect = settings.getBoundingClientRect();
|
|
558
|
-
if (rect.width > 0)
|
|
559
|
-
|
|
560
|
-
// the account's optical center instead of a guessed offset.
|
|
561
|
-
if (rect.height > 0) {
|
|
563
|
+
if (rect.width > 0) {
|
|
564
|
+
box.style.right = (rect.width + 16 + 12) + 'px';
|
|
562
565
|
box.style.top = rect.top + 'px';
|
|
563
566
|
box.style.height = rect.height + 'px';
|
|
567
|
+
} else {
|
|
568
|
+
// Narrow screens hide the account block; pin the swatches right.
|
|
569
|
+
box.style.right = '12px';
|
|
570
|
+
box.style.top = '2px';
|
|
571
|
+
box.style.height = '40px';
|
|
564
572
|
}
|
|
565
573
|
};
|
|
566
574
|
place();
|
|
@@ -777,12 +785,32 @@ window.__ModuleLoader__.load({
|
|
|
777
785
|
if (wsRoot) {
|
|
778
786
|
Array.from(wsRoot.children).forEach((g, i) => { if (i > 0) g.style.display = 'none'; });
|
|
779
787
|
}
|
|
788
|
+
// Narrow screens keep the official sidebar toggle: the workbench has no
|
|
789
|
+
// session list of its own, so hiding it strands phone users.
|
|
790
|
+
const narrowScreen = typeof window !== 'undefined' && window.innerWidth < 768;
|
|
780
791
|
document.querySelectorAll('button[aria-label]').forEach((b) => {
|
|
781
792
|
const label = b.getAttribute('aria-label') || '';
|
|
782
|
-
if (label.includes('侧栏') || label.includes('侧边栏') || label.includes('折叠') || label.includes('collapse') || label.includes('toggle')) {
|
|
793
|
+
if (!narrowScreen && (label.includes('侧栏') || label.includes('侧边栏') || label.includes('折叠') || label.includes('collapse') || label.includes('toggle'))) {
|
|
783
794
|
b.style.display = 'none';
|
|
784
795
|
}
|
|
785
796
|
});
|
|
797
|
+
if (narrowScreen) {
|
|
798
|
+
// The official toggle lives inside the translated sidebar container,
|
|
799
|
+
// so a fixed copy would ride along with it. Own button in <body>,
|
|
800
|
+
// clicks delegated to the official one.
|
|
801
|
+
const original = Array.from(document.querySelectorAll('button[aria-label]'))
|
|
802
|
+
.find((b) => b.getAttribute('aria-label') === '打开侧边栏');
|
|
803
|
+
if (original) {
|
|
804
|
+
const toggle = document.createElement('button');
|
|
805
|
+
toggle.type = 'button';
|
|
806
|
+
toggle.className = 'wb-mobile-sidebar-toggle';
|
|
807
|
+
toggle.setAttribute('aria-label', '显示会话列表');
|
|
808
|
+
toggle.textContent = '☰';
|
|
809
|
+
toggle.addEventListener('click', () => original.click());
|
|
810
|
+
document.body.appendChild(toggle);
|
|
811
|
+
cleanup.push(() => toggle.remove());
|
|
812
|
+
}
|
|
813
|
+
}
|
|
786
814
|
const settings = document.querySelector('[class*="settingsArea"]');
|
|
787
815
|
if (settings) {
|
|
788
816
|
settings.style.position = 'fixed';
|
|
@@ -858,8 +886,8 @@ window.__ModuleLoader__.load({
|
|
|
858
886
|
|
|
859
887
|
return h('div', { ref: rootRef, style: { position: 'fixed', top: 0, left: 0, right: 0, height: TOPBAR_HEIGHT, zIndex: 100, pointerEvents: 'auto', display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base)', borderBottom: '1px solid var(--dsw-alias-border-l1)' } },
|
|
860
888
|
h('div', { style: { height: 56, display: 'flex', alignItems: 'center', gap: 10, padding: '0 14px' } },
|
|
861
|
-
h('div', { style: { width: 214, flex: '0 0 auto' } }),
|
|
862
|
-
h('div', { style: { display: 'flex', gap: 2, flex: 1, overflow: 'hidden' } },
|
|
889
|
+
h('div', { className: 'wb-topbar-brand', style: { width: 214, flex: '0 0 auto' } }),
|
|
890
|
+
h('div', { className: 'wb-topbar-icons', style: { display: 'flex', gap: 2, flex: 1, overflow: 'hidden' } },
|
|
863
891
|
iconBtn('workbench', '工作台', IconGrid),
|
|
864
892
|
iconBtn('plugins', '插件', IconPlugins),
|
|
865
893
|
iconBtn('schedules', '自动化任务', IconClock),
|
|
@@ -1184,6 +1212,9 @@ window.__ModuleLoader__.load({
|
|
|
1184
1212
|
z-index: 1;
|
|
1185
1213
|
filter: drop-shadow(0 0 2px rgba(170, 200, 255, 0.65));
|
|
1186
1214
|
}
|
|
1215
|
+
body[data-wb-paper="1"] .dsh-glow-canvas {
|
|
1216
|
+
filter: drop-shadow(0 0 2px rgba(198, 156, 96, 0.6));
|
|
1217
|
+
}
|
|
1187
1218
|
/* 隐藏运行中会话左侧的转圈:不依赖 JS 加的 class,React 重建行时也能兜底 */
|
|
1188
1219
|
div[data-row-key^="session:"]:has(svg[data-state="ongoing"]) svg[data-state="ongoing"],
|
|
1189
1220
|
.dsh-glow-on svg[data-state="ongoing"],
|
|
@@ -1208,6 +1239,19 @@ body[data-wb-paper="1"] [class*="_header_1mqf1"] {
|
|
|
1208
1239
|
body[data-wb-paper="1"] :not(pre) > code {
|
|
1209
1240
|
background: #efe6d4 !important;
|
|
1210
1241
|
}
|
|
1242
|
+
/* Session hover preview ships white-on-dark copy; invert it on paper. */
|
|
1243
|
+
body[data-wb-paper="1"] [class*="_hoverTitle"] {
|
|
1244
|
+
color: #2f2a22 !important;
|
|
1245
|
+
}
|
|
1246
|
+
body[data-wb-paper="1"] [class*="_hoverStatus"] {
|
|
1247
|
+
color: #6f6557 !important;
|
|
1248
|
+
}
|
|
1249
|
+
body[data-wb-paper="1"] [class*="_hoverTime"] {
|
|
1250
|
+
color: #8a7f6e !important;
|
|
1251
|
+
}
|
|
1252
|
+
body[data-wb-paper="1"] [class*="_hoverPath"] {
|
|
1253
|
+
color: #6f6557 !important;
|
|
1254
|
+
}
|
|
1211
1255
|
`;
|
|
1212
1256
|
|
|
1213
1257
|
function installGlow(ctx) {
|
|
@@ -1365,12 +1409,18 @@ body[data-wb-paper="1"] :not(pre) > code {
|
|
|
1365
1409
|
var breath = 0.5 + 0.5 * Math.sin((now / 2800) * Math.PI * 2);
|
|
1366
1410
|
var dim = entry.lights === 1 ? 0.35 : 1;
|
|
1367
1411
|
var edgeAlpha = (0.12 + breath * 0.33) * dim;
|
|
1412
|
+
// Paper turns the blue streak into a bronze one; blue reads as ink
|
|
1413
|
+
// smear on a warm sheet.
|
|
1414
|
+
var paperNow = false;
|
|
1415
|
+
try { paperNow = document.body.hasAttribute("data-wb-paper"); } catch (_error) { paperNow = false; }
|
|
1416
|
+
var glowBase = paperNow ? [138, 106, 69] : [99, 149, 255];
|
|
1417
|
+
var glowHot = paperNow ? [198, 156, 96] : [205, 180, 255];
|
|
1368
1418
|
|
|
1369
1419
|
context.save();
|
|
1370
1420
|
context.lineWidth = 1;
|
|
1371
|
-
context.strokeStyle = "rgba(
|
|
1421
|
+
context.strokeStyle = "rgba(" + glowBase[0] + ", " + glowBase[1] + ", " + glowBase[2] + ", " + edgeAlpha.toFixed(3) + ")";
|
|
1372
1422
|
context.shadowBlur = (4 + breath * 10) * dim;
|
|
1373
|
-
context.shadowColor = "rgba(
|
|
1423
|
+
context.shadowColor = "rgba(" + glowBase[0] + ", " + glowBase[1] + ", " + glowBase[2] + ", " + ((0.2 + breath * 0.35) * dim).toFixed(3) + ")";
|
|
1374
1424
|
context.beginPath();
|
|
1375
1425
|
if (typeof context.roundRect === "function") {
|
|
1376
1426
|
context.roundRect(0.5, 0.5, width - 1, height - 1, r);
|
|
@@ -1387,9 +1437,9 @@ body[data-wb-paper="1"] :not(pre) > code {
|
|
|
1387
1437
|
if (weight < 0.02) continue;
|
|
1388
1438
|
var p0 = pointOnRect(width, height, phase);
|
|
1389
1439
|
var p1 = pointOnRect(width, height, (i + 1) / count);
|
|
1390
|
-
var rChannel = Math.round(
|
|
1391
|
-
var gChannel = Math.round(
|
|
1392
|
-
var bChannel =
|
|
1440
|
+
var rChannel = Math.round(glowBase[0] + (glowHot[0] - glowBase[0]) * weight);
|
|
1441
|
+
var gChannel = Math.round(glowBase[1] + (glowHot[1] - glowBase[1]) * weight);
|
|
1442
|
+
var bChannel = Math.round(glowBase[2] + (glowHot[2] - glowBase[2]) * weight);
|
|
1393
1443
|
// lights === 1 表示「只有后台任务」,整体压暗。
|
|
1394
1444
|
var alpha = (0.05 + 0.95 * weight) * (entry.lights === 1 ? 0.35 : 1);
|
|
1395
1445
|
context.strokeStyle =
|
|
@@ -1462,7 +1512,9 @@ body[data-wb-paper="1"] :not(pre) > code {
|
|
|
1462
1512
|
+ '\n.wb-session-row { display: flex; align-items: center; gap: 6px; width: 100%; padding: 5px 8px; border: none; border-radius: 6px; background: transparent; color: var(--dsw-alias-label-primary); cursor: pointer; text-align: left; font-size: 12px; }'
|
|
1463
1513
|
+ '\n.wb-session-row:hover { background: var(--dsw-alias-bg-layer-2); }'
|
|
1464
1514
|
+ '\n.wb-session-row .wb-session-more { opacity: 0; transition: opacity .12s; }'
|
|
1465
|
-
+ '\n.wb-balance-tip { position: absolute; top: calc(100% + 6px); right: 0; z-index: 500; padding: 8px 10px; border-radius: 8px; background: #23262c; border: 1px solid #2f333b; color: var(--dsw-alias-label-primary); font-size: 11px; line-height: 1.7; white-space: nowrap; max-width: 240px; box-sizing: border-box; box-shadow: 0 6px 20px rgba(0,0,0,.28); pointer-events: none; }'
|
|
1515
|
+
+ '\n.wb-balance-tip { position: absolute; top: calc(100% + 6px); right: 0; z-index: 500; padding: 8px 10px; border-radius: 8px; background: var(--dsw-alias-bg-overlay, #23262c); border: 1px solid var(--dsw-alias-border-l2, #2f333b); color: var(--dsw-alias-label-primary); font-size: 11px; line-height: 1.7; white-space: nowrap; max-width: 240px; box-sizing: border-box; box-shadow: 0 6px 20px rgba(0,0,0,.28); pointer-events: none; }'
|
|
1516
|
+
+ '\n.wb-mobile-sidebar-toggle { position: fixed; left: 10px; top: 10px; z-index: 5000; width: 30px; height: 30px; border-radius: 8px; border: 1px solid var(--dsw-alias-border-l2); background: var(--dsw-alias-bg-layer-1); color: var(--dsw-alias-label-primary); font-size: 15px; line-height: 1; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; padding: 0; box-shadow: 0 1px 4px rgba(0,0,0,.12); }'
|
|
1517
|
+
+ '\n@media (max-width: 767px) { .wb-topbar-brand, [class*="settingsArea"] { display: none !important; } .wb-topbar-icons { margin-left: 42px; } [class*="sidebarCol"] [class*="brand"] { display: none !important; } [class*="sidebarCol"] { padding-top: 44px !important; } [aria-label="收起侧边栏"] { display: none !important; } }'
|
|
1466
1518
|
+ '\n.wb-balance:hover { border-color: #4ade80 !important; background: rgba(74,222,128,.12) !important; }'
|
|
1467
1519
|
+ '\n.wb-nav-item { position: relative; }'
|
|
1468
1520
|
+ '\n.wb-nav-label { max-width: 0; opacity: 0; overflow: hidden; white-space: nowrap; font-size: 12px; transition: max-width .18s ease, opacity .18s ease; }'
|
package/package.json
CHANGED