@co0ontty/wand 1.29.1 → 1.29.3

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.
@@ -1399,10 +1399,14 @@
1399
1399
  var preferredTool = getComposerTool();
1400
1400
  var composerMode = getSafeModeForTool(preferredTool, state.chatMode);
1401
1401
 
1402
+ var isDesktopPinned = state.sidebarPinned && !isMobileLayout();
1403
+ var isCollapsed = isDesktopPinned && state.sidebarCollapsed;
1404
+ var collapsedCls = isCollapsed ? ' sidebar-collapsed' : '';
1405
+ var sidebarCollapsedCls = isCollapsed ? ' collapsed' : '';
1402
1406
  return '<div class="app-container">' +
1403
1407
  '<div id="sessions-drawer-backdrop" class="drawer-backdrop' + drawerClass + '"></div>' +
1404
- '<div class="main-layout' + (state.sessionsDrawerOpen ? ' sidebar-open' : '') + (state.sidebarPinned && !isMobileLayout() ? ' sidebar-pinned' : '') + '">' +
1405
- '<aside id="sessions-drawer" class="sidebar' + drawerClass + (state.sidebarPinned && !isMobileLayout() ? ' pinned' : '') + '">' +
1408
+ '<div class="main-layout' + (state.sessionsDrawerOpen ? ' sidebar-open' : '') + (isDesktopPinned ? ' sidebar-pinned' : '') + collapsedCls + '">' +
1409
+ '<aside id="sessions-drawer" class="sidebar' + drawerClass + (isDesktopPinned ? ' pinned' : '') + sidebarCollapsedCls + '">' +
1406
1410
  '<div class="sidebar-header">' +
1407
1411
  '<div class="sidebar-header-main">' +
1408
1412
  '<div class="topbar-logo-icon">W</div>' +
@@ -1428,8 +1432,10 @@
1428
1432
  '<button id="sidebar-pin-btn" class="btn btn-ghost btn-sm sidebar-pin-toggle' + (state.sidebarPinned ? ' pinned' : '') + '" type="button" title="' + (state.sidebarPinned ? '取消固定侧栏' : '固定侧栏') + '">' +
1429
1433
  '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="17" x2="12" y2="22"/><path d="M5 17h14v-1.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V6h1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4h1v4.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24z"/></svg>' +
1430
1434
  '</button>' +
1431
- '<button id="sidebar-collapse-btn" class="btn btn-ghost btn-sm sidebar-collapse-toggle" type="button" title="收起为窄条" aria-label="收起为窄条">' +
1432
- '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="14 6 8 12 14 18"/><line x1="4" y1="5" x2="4" y2="19"/></svg>' +
1435
+ '<button id="sidebar-collapse-btn" class="btn btn-ghost btn-sm sidebar-collapse-toggle' + (isCollapsed ? ' collapsed' : '') + '" type="button" title="' + (isCollapsed ? '展开侧栏' : '收起为窄条') + '" aria-label="' + (isCollapsed ? '展开侧栏' : '收起为窄条') + '">' +
1436
+ (isCollapsed
1437
+ ? '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="10 6 16 12 10 18"/><line x1="20" y1="5" x2="20" y2="19"/></svg>'
1438
+ : '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="14 6 8 12 14 18"/><line x1="4" y1="5" x2="4" y2="19"/></svg>') +
1433
1439
  '</button>' +
1434
1440
  '<button id="close-drawer-button" class="btn btn-ghost btn-icon sidebar-close drawer-close-btn" type="button" aria-label="关闭菜单"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg></button>' +
1435
1441
  '</div>' +
@@ -5511,6 +5517,8 @@
5511
5517
  if (closeDrawerBtn) closeDrawerBtn.addEventListener("click", closeSessionsDrawer);
5512
5518
  var pinBtn = document.getElementById("sidebar-pin-btn");
5513
5519
  if (pinBtn) pinBtn.addEventListener("click", toggleSidebarPin);
5520
+ var collapseBtn = document.getElementById("sidebar-collapse-btn");
5521
+ if (collapseBtn) collapseBtn.addEventListener("click", toggleSidebarCollapsed);
5514
5522
  var sidebarMoreBtn = document.getElementById("sidebar-more-btn");
5515
5523
  var sidebarOverflow = document.getElementById("sidebar-overflow-menu");
5516
5524
  if (sidebarMoreBtn && sidebarOverflow) {
@@ -8571,11 +8579,15 @@
8571
8579
  var drawer = document.getElementById("sessions-drawer");
8572
8580
  var mainLayout = document.querySelector(".main-layout");
8573
8581
  var pinBtn = document.getElementById("sidebar-pin-btn");
8582
+ var isDesktopPinned = state.sidebarPinned && !isMobileLayout();
8583
+ var isCollapsed = isDesktopPinned && state.sidebarCollapsed;
8574
8584
  if (drawer) {
8575
- drawer.classList.toggle("pinned", state.sidebarPinned && !isMobileLayout());
8585
+ drawer.classList.toggle("pinned", isDesktopPinned);
8586
+ drawer.classList.toggle("collapsed", isCollapsed);
8576
8587
  }
8577
8588
  if (mainLayout) {
8578
- mainLayout.classList.toggle("sidebar-pinned", state.sidebarPinned && !isMobileLayout());
8589
+ mainLayout.classList.toggle("sidebar-pinned", isDesktopPinned);
8590
+ mainLayout.classList.toggle("sidebar-collapsed", isCollapsed);
8579
8591
  }
8580
8592
  if (pinBtn) {
8581
8593
  pinBtn.classList.toggle("pinned", state.sidebarPinned);
@@ -8623,6 +8635,27 @@
8623
8635
  updateLayoutState();
8624
8636
  }
8625
8637
 
8638
+ function toggleSidebarCollapsed() {
8639
+ if (isMobileLayout()) return;
8640
+ if (!state.sidebarPinned) return;
8641
+ state.sidebarCollapsed = !state.sidebarCollapsed;
8642
+ try {
8643
+ localStorage.setItem("wand-sidebar-collapsed", String(state.sidebarCollapsed));
8644
+ } catch (e) {}
8645
+ render();
8646
+ var mainLayout = document.querySelector(".main-layout");
8647
+ if (mainLayout) {
8648
+ var onEnd = function(e) {
8649
+ if (e.propertyName === "padding-left") {
8650
+ mainLayout.removeEventListener("transitionend", onEnd);
8651
+ scheduleTerminalResize(true);
8652
+ }
8653
+ };
8654
+ mainLayout.addEventListener("transitionend", onEnd);
8655
+ }
8656
+ setTimeout(function() { scheduleTerminalResize(true); }, 350);
8657
+ }
8658
+
8626
8659
  function toggleSidebarPin() {
8627
8660
  if (isMobileLayout()) return;
8628
8661
  state.sidebarPinned = !state.sidebarPinned;
@@ -99,6 +99,7 @@
99
99
 
100
100
  /* ===== 布局尺寸 ===== */
101
101
  --sidebar-width: 300px;
102
+ --sidebar-collapsed-width: 56px;
102
103
  --file-panel-width: 320px;
103
104
  --safe-bottom: 0px;
104
105
 
@@ -447,10 +448,14 @@
447
448
  /* ===== 侧边栏常驻 ===== */
448
449
  .main-layout.sidebar-pinned {
449
450
  padding-left: var(--sidebar-width);
451
+ transition: padding-left 0.3s var(--ease-out-expo);
450
452
  }
451
453
  .main-layout.sidebar-pinned .floating-sidebar-toggle {
452
454
  display: none;
453
455
  }
456
+ .main-layout.sidebar-pinned.sidebar-collapsed {
457
+ padding-left: var(--sidebar-collapsed-width);
458
+ }
454
459
 
455
460
  /* ===== 抽屉背景遮罩 ===== */
456
461
  .drawer-backdrop {
@@ -507,12 +512,65 @@
507
512
  pointer-events: auto;
508
513
  opacity: 1;
509
514
  box-shadow: none;
515
+ transition: width 0.3s var(--ease-out-expo), transform 0.35s var(--ease-out-expo), box-shadow 0.35s ease, opacity 0.25s ease;
510
516
  }
511
517
 
512
518
  .sidebar.pinned .sidebar-close {
513
519
  display: none;
514
520
  }
515
521
 
522
+ /* ===== 侧栏窄条模式(仅 desktop pin 模式生效)===== */
523
+ .sidebar.pinned.collapsed {
524
+ width: var(--sidebar-collapsed-width);
525
+ }
526
+ .sidebar.pinned.collapsed .sidebar-header {
527
+ padding: 14px 8px;
528
+ justify-content: center;
529
+ gap: 0;
530
+ }
531
+ .sidebar.pinned.collapsed .sidebar-header-main,
532
+ .sidebar.pinned.collapsed .sidebar-header-more,
533
+ .sidebar.pinned.collapsed .sidebar-pin-toggle,
534
+ .sidebar.pinned.collapsed .sidebar-body {
535
+ display: none;
536
+ }
537
+ .sidebar.pinned.collapsed .sidebar-header-actions {
538
+ gap: 0;
539
+ width: 100%;
540
+ justify-content: center;
541
+ }
542
+ .sidebar.pinned.collapsed .sidebar-footer {
543
+ padding: 10px 6px;
544
+ }
545
+ .sidebar.pinned.collapsed #drawer-new-session-button {
546
+ display: none;
547
+ }
548
+ .sidebar.pinned.collapsed .sidebar-footer-actions {
549
+ flex-direction: column;
550
+ gap: 6px;
551
+ align-items: stretch;
552
+ }
553
+ .sidebar.pinned.collapsed .sidebar-footer-actions .btn {
554
+ width: 100%;
555
+ min-width: 0;
556
+ padding: 8px 0;
557
+ justify-content: center;
558
+ }
559
+ .sidebar.pinned.collapsed .sidebar-footer-actions .btn span,
560
+ .sidebar.pinned.collapsed .sidebar-meta {
561
+ display: none;
562
+ }
563
+ .sidebar-collapse-toggle {
564
+ flex-shrink: 0;
565
+ transition: color var(--transition-fast);
566
+ }
567
+ .sidebar-collapse-toggle.collapsed {
568
+ color: var(--primary);
569
+ }
570
+ .sidebar:not(.pinned) .sidebar-collapse-toggle {
571
+ display: none;
572
+ }
573
+
516
574
  /* ===== 图钉按钮 ===== */
517
575
  .sidebar-pin-toggle {
518
576
  flex-shrink: 0;
@@ -8338,6 +8396,7 @@
8338
8396
  /* 平板适配 */
8339
8397
  @media (max-width: 768px) {
8340
8398
  .sidebar-pin-toggle { display: none; }
8399
+ .sidebar-collapse-toggle { display: none; }
8341
8400
  .sidebar.pinned:not(.open) {
8342
8401
  transform: translateX(-100%);
8343
8402
  pointer-events: none;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@co0ontty/wand",
3
- "version": "1.29.1",
3
+ "version": "1.29.3",
4
4
  "description": "A web terminal for local CLI tools like Claude.",
5
5
  "type": "module",
6
6
  "bin": {