@co0ontty/wand 1.1.7 → 1.2.2

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.
@@ -2042,6 +2042,10 @@
2042
2042
  position: relative;
2043
2043
  flex-shrink: 0;
2044
2044
  }
2045
+ /* Desktop: expanded row is always hidden (mobile only) */
2046
+ .inline-shortcuts-expanded-row {
2047
+ display: none;
2048
+ }
2045
2049
  .shortcuts-toggle {
2046
2050
  display: none;
2047
2051
  }
@@ -5128,14 +5132,18 @@
5128
5132
  display: none;
5129
5133
  }
5130
5134
 
5131
- /* 移动端内联快捷键 - 折叠为左右滑动条 */
5135
+ /* 移动端内联快捷键 - 折叠为展开按钮,展开到独立第二行 */
5132
5136
  .inline-shortcuts-inline {
5133
5137
  display: none;
5134
5138
  }
5135
5139
  .inline-shortcuts-wrap {
5136
- flex-shrink: 1;
5137
- min-width: 0;
5138
- overflow: hidden;
5140
+ display: flex;
5141
+ align-items: center;
5142
+ flex-shrink: 0;
5143
+ }
5144
+ /* 移动端: strip 永远不显示,展开由独立的 expanded-row 承载 */
5145
+ .inline-shortcuts-strip {
5146
+ display: none !important;
5139
5147
  }
5140
5148
  .shortcuts-toggle {
5141
5149
  display: inline-flex;
@@ -5158,30 +5166,31 @@
5158
5166
  .shortcuts-toggle.active {
5159
5167
  color: var(--accent);
5160
5168
  }
5161
- .inline-shortcuts-strip {
5169
+ /* 独立第二行:默认隐藏 */
5170
+ .inline-shortcuts-expanded-row {
5162
5171
  display: none;
5163
- overflow-x: auto;
5164
- -webkit-overflow-scrolling: touch;
5165
- scrollbar-width: none;
5166
- align-items: center;
5172
+ }
5173
+ /* 独立第二行:展开时显示,居中、自动换行 */
5174
+ .inline-shortcuts-expanded-row.visible {
5175
+ display: flex;
5176
+ justify-content: center;
5177
+ align-items: flex-start;
5178
+ align-content: flex-start;
5179
+ flex-wrap: wrap;
5167
5180
  gap: 3px;
5168
- flex: 1;
5169
- min-width: 0;
5181
+ padding: 4px 6px;
5170
5182
  }
5171
- .inline-shortcuts-strip::-webkit-scrollbar {
5183
+ .inline-shortcuts-expanded-row .shortcut-sep {
5172
5184
  display: none;
5173
5185
  }
5174
- .inline-shortcuts-wrap.expanded .inline-shortcuts-strip {
5175
- display: flex;
5176
- }
5177
- .inline-shortcuts-strip .shortcut-key {
5186
+ .inline-shortcuts-expanded-row .shortcut-key {
5178
5187
  height: 22px;
5179
5188
  min-width: 22px;
5180
5189
  font-size: 0.5625rem;
5181
5190
  padding: 0 4px;
5182
- flex-shrink: 0;
5191
+ flex: 0 0 auto;
5183
5192
  }
5184
- .inline-shortcuts-strip .shortcut-key.shortcut-dir {
5193
+ .inline-shortcuts-expanded-row .shortcut-key.shortcut-dir {
5185
5194
  min-width: 20px;
5186
5195
  }
5187
5196
 
@@ -5830,6 +5839,109 @@
5830
5839
  to { opacity: 1; transform: translateX(-50%) translateY(0); }
5831
5840
  }
5832
5841
 
5842
+ /* ── Notification Bubble ── */
5843
+ .notification-bubble {
5844
+ position: fixed;
5845
+ left: 50%;
5846
+ transform: translateX(-50%);
5847
+ z-index: 10000;
5848
+ min-width: 280px;
5849
+ max-width: 380px;
5850
+ background: var(--bg-primary);
5851
+ border: 1px solid var(--border);
5852
+ border-radius: var(--radius-lg);
5853
+ box-shadow: var(--shadow-lg);
5854
+ padding: 14px 16px;
5855
+ animation: notification-slide-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
5856
+ transition: top 0.25s ease, opacity 0.25s ease;
5857
+ }
5858
+ .notification-bubble.slide-out {
5859
+ animation: notification-slide-out 0.25s ease forwards;
5860
+ transform: translateX(-50%);
5861
+ }
5862
+ .notification-bubble-header {
5863
+ display: flex;
5864
+ align-items: center;
5865
+ gap: 8px;
5866
+ margin-bottom: 6px;
5867
+ }
5868
+ .notification-bubble-icon {
5869
+ width: 20px;
5870
+ height: 20px;
5871
+ flex-shrink: 0;
5872
+ display: flex;
5873
+ align-items: center;
5874
+ justify-content: center;
5875
+ border-radius: var(--radius-sm);
5876
+ font-size: 12px;
5877
+ }
5878
+ .notification-bubble-icon.info { background: var(--accent); color: white; }
5879
+ .notification-bubble-icon.warning { background: var(--warning); color: white; }
5880
+ .notification-bubble-icon.success { background: var(--success); color: white; }
5881
+ .notification-bubble-title {
5882
+ font-size: 0.875rem;
5883
+ font-weight: 600;
5884
+ color: var(--fg-primary);
5885
+ flex: 1;
5886
+ min-width: 0;
5887
+ }
5888
+ .notification-bubble-close {
5889
+ background: none;
5890
+ border: none;
5891
+ color: var(--fg-muted);
5892
+ cursor: pointer;
5893
+ font-size: 16px;
5894
+ line-height: 1;
5895
+ padding: 2px 4px;
5896
+ border-radius: var(--radius-sm);
5897
+ flex-shrink: 0;
5898
+ }
5899
+ .notification-bubble-close:hover {
5900
+ background: var(--bg-hover);
5901
+ color: var(--fg-primary);
5902
+ }
5903
+ .notification-bubble-body {
5904
+ font-size: 0.8125rem;
5905
+ color: var(--fg-secondary);
5906
+ line-height: 1.45;
5907
+ margin-bottom: 0;
5908
+ }
5909
+ .notification-bubble-actions {
5910
+ margin-top: 10px;
5911
+ display: flex;
5912
+ gap: 8px;
5913
+ justify-content: flex-end;
5914
+ }
5915
+ .notification-bubble-actions button {
5916
+ font-size: 0.8125rem;
5917
+ padding: 4px 12px;
5918
+ border-radius: var(--radius-sm);
5919
+ cursor: pointer;
5920
+ border: 1px solid var(--border);
5921
+ background: var(--bg-secondary);
5922
+ color: var(--fg-primary);
5923
+ transition: background 0.15s;
5924
+ }
5925
+ .notification-bubble-actions button:hover {
5926
+ background: var(--bg-hover);
5927
+ }
5928
+ .notification-bubble-actions button.primary {
5929
+ background: var(--accent);
5930
+ color: white;
5931
+ border-color: var(--accent);
5932
+ }
5933
+ .notification-bubble-actions button.primary:hover {
5934
+ filter: brightness(1.1);
5935
+ }
5936
+ @keyframes notification-slide-in {
5937
+ from { opacity: 0; transform: translateX(-50%) translateY(-20px); }
5938
+ to { opacity: 1; transform: translateX(-50%) translateY(0); }
5939
+ }
5940
+ @keyframes notification-slide-out {
5941
+ from { opacity: 1; transform: translateX(-50%) translateY(0); }
5942
+ to { opacity: 0; transform: translateX(-50%) translateY(-20px); }
5943
+ }
5944
+
5833
5945
  /* File Preview Modal */
5834
5946
  .file-preview-overlay {
5835
5947
  position: fixed;
@@ -5931,6 +6043,19 @@
5931
6043
  padding-top: 14px;
5932
6044
  }
5933
6045
 
6046
+ .settings-notification-section {
6047
+ border-top: 1px solid var(--border-subtle);
6048
+ padding-top: 14px;
6049
+ margin-top: 4px;
6050
+ }
6051
+ .settings-section-title {
6052
+ font-size: 0.8125rem;
6053
+ font-weight: 600;
6054
+ color: var(--fg-primary);
6055
+ margin-bottom: 10px;
6056
+ letter-spacing: 0.02em;
6057
+ }
6058
+
5934
6059
  .settings-update-actions {
5935
6060
  display: flex;
5936
6061
  gap: 8px;
@@ -5,7 +5,7 @@
5
5
  import { WebSocketServer } from "ws";
6
6
  import type { SessionSnapshot } from "./types.js";
7
7
  export interface ProcessEvent {
8
- type: "output" | "status" | "started" | "ended" | "usage" | "task";
8
+ type: "output" | "status" | "started" | "ended" | "usage" | "task" | "notification";
9
9
  sessionId: string;
10
10
  data?: unknown;
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@co0ontty/wand",
3
- "version": "1.1.7",
3
+ "version": "1.2.2",
4
4
  "description": "A web terminal for local CLI tools like Claude.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,7 +19,8 @@
19
19
  "build": "tsc -p tsconfig.json && npm run build:copy-content",
20
20
  "build:copy-content": "cp -r src/web-ui/content dist/web-ui/",
21
21
  "dev": "tsx src/cli.ts web",
22
- "check": "tsc --noEmit -p tsconfig.json"
22
+ "check": "tsc --noEmit -p tsconfig.json",
23
+ "prepublishOnly": "TAG=$(git tag --sort=-v:refname --list 'v*' | head -1) && VER=${TAG#v} && npm version $VER --no-git-tag-version --allow-same-version && npm run build"
23
24
  },
24
25
  "keywords": [
25
26
  "cli",