From 28b787b0df03043014f27d84bc3a47c421796747 Mon Sep 17 00:00:00 2001 From: posimai Date: Tue, 31 Mar 2026 01:04:47 +0900 Subject: [PATCH] feat(posimai-dev): slash commands, quick chips, input history, paste fix, voice toggle MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /morning /status /commit /deploy /fix /explain /test /ls — popup with keyboard nav - Quick chips row: tap to send preset prompts (朝の確認/状況確認/コミット/デプロイ/エラー修正) - Input history: ArrowUp/Down navigates previous messages (bash-style) - Paste fix: submitChat keeps focus on chat input so Ctrl+V works immediately - Right-click on terminal: paste clipboard to shell - Voice auto-send toggle in settings panel (persisted to localStorage) Co-Authored-By: Claude Sonnet 4.6 --- posimai-dev/index.html | 377 +++++++++++++++++++++++++++++++++-------- 1 file changed, 302 insertions(+), 75 deletions(-) diff --git a/posimai-dev/index.html b/posimai-dev/index.html index a9a47f8c..748fd188 100644 --- a/posimai-dev/index.html +++ b/posimai-dev/index.html @@ -74,7 +74,7 @@ } .status-badge.disconnected { background: rgba(239,68,68,0.12); color: #F87171; } - /* Claude開始ボタン — アイコンのみ */ + /* Claude 開始ボタン */ .claude-btn { width: 36px; height: 36px; border-radius: 8px; border: none; cursor: pointer; background: var(--accent-dim); color: var(--accent); @@ -83,28 +83,9 @@ } .claude-btn:hover { background: rgba(167,139,250,0.25); } - /* マイクボタン */ - .mic-btn { - width: 38px; height: 38px; border-radius: 10px; border: none; - background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.35); cursor: pointer; - display: none; align-items: center; justify-content: center; - flex-shrink: 0; transition: background 0.15s, color 0.15s; - } - .mic-btn.available { display: flex; } - .mic-btn:hover { background: rgba(255,255,255,0.1); color: #F3F4F6; } - .mic-btn.listening { - background: rgba(239,68,68,0.15); color: #F87171; - animation: mic-pulse 1s ease-in-out infinite; - } - @keyframes mic-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } } - - /* 設定パネル内セッション表示 */ - .session-info-row { - display: flex; align-items: center; gap: 8px; margin-top: 8px; - font-size: 11px; color: rgba(255,255,255,0.35); font-family: monospace; - background: rgba(255,255,255,0.04); border-radius: 8px; padding: 8px 10px; - } - .session-info-row.hidden { display: none; } + /* icon-btn */ + .icon-btn { color: rgba(255,255,255,0.5); } + .icon-btn:hover { color: #F3F4F6; background: rgba(255,255,255,0.06); } /* ── Terminal ── */ #terminal-container { @@ -120,23 +101,79 @@ #terminal-container .xterm { height: 100%; } #terminal-container .xterm-viewport { border-radius: 8px 8px 0 0; } - /* スクロールバー — 細く・半透明 */ .xterm-viewport::-webkit-scrollbar { width: 4px; } .xterm-viewport::-webkit-scrollbar-track { background: transparent; } .xterm-viewport::-webkit-scrollbar-thumb { background: rgba(167,139,250,0.25); border-radius: 2px; } .xterm-viewport::-webkit-scrollbar-thumb:hover { background: rgba(167,139,250,0.5); } - /* ── Chat input bar ── */ + /* ── Input wrapper (relative anchor for slash popup) ── */ + .input-wrapper { + position: relative; + flex-shrink: 0; + background: rgba(12, 18, 33, 0.9); + border-top: 1px solid rgba(255,255,255,0.06); + } + + /* ── Quick chips ── */ + .chips-bar { + display: flex; + align-items: center; + padding: 8px 12px 4px; + gap: 6px; + overflow-x: auto; + scrollbar-width: none; + } + .chips-bar::-webkit-scrollbar { display: none; } + + .chip { + display: flex; align-items: center; gap: 5px; + padding: 4px 10px; border-radius: 20px; + border: 1px solid rgba(255,255,255,0.07); + background: rgba(255,255,255,0.04); color: rgba(255,255,255,0.45); + font-size: 11px; font-weight: 500; font-family: Inter, sans-serif; + cursor: pointer; white-space: nowrap; flex-shrink: 0; + transition: background 0.15s, color 0.15s, border-color 0.15s; + } + .chip:hover { background: var(--accent-dim); color: var(--accent); border-color: rgba(167,139,250,0.2); } + + /* ── Slash command popup ── */ + .slash-popup { + position: absolute; + bottom: 100%; + left: 12px; right: 12px; + background: rgba(10, 14, 28, 0.98); + border: 1px solid rgba(255,255,255,0.1); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 -8px 32px rgba(0,0,0,0.5); + display: none; + z-index: 100; + } + .slash-popup.open { display: block; } + + .slash-item { + display: flex; align-items: center; gap: 12px; + padding: 10px 14px; cursor: pointer; + transition: background 0.1s; + border-bottom: 1px solid rgba(255,255,255,0.04); + } + .slash-item:last-child { border-bottom: none; } + .slash-item:hover, .slash-item.active { background: rgba(167,139,250,0.1); } + .slash-cmd { + font-family: monospace; font-size: 12px; font-weight: 600; + color: var(--accent); min-width: 82px; + } + .slash-label { font-size: 12px; color: rgba(255,255,255,0.35); } + + /* ── Chat bar ── */ .chat-bar { display: flex; align-items: center; gap: 8px; - padding: 10px 12px; + padding: 6px 12px; padding-bottom: max(10px, env(safe-area-inset-bottom)); - background: rgba(12, 18, 33, 0.9); - border-top: 1px solid rgba(255,255,255,0.06); - flex-shrink: 0; } + .chat-input { flex: 1; background: rgba(255,255,255,0.05); @@ -149,8 +186,22 @@ outline: none; transition: border-color 0.15s; } - .chat-input::placeholder { color: rgba(255,255,255,0.25); } .chat-input:focus { border-color: rgba(167,139,250,0.4); } + + .mic-btn { + width: 38px; height: 38px; border-radius: 10px; border: none; + background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.35); cursor: pointer; + display: none; align-items: center; justify-content: center; + flex-shrink: 0; transition: background 0.15s, color 0.15s; + } + .mic-btn.available { display: flex; } + .mic-btn:hover { background: rgba(255,255,255,0.1); color: #F3F4F6; } + .mic-btn.listening { + background: rgba(239,68,68,0.15); color: #F87171; + animation: mic-pulse 1s ease-in-out infinite; + } + @keyframes mic-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } + .send-btn { width: 38px; height: 38px; border-radius: 10px; border: none; background: var(--accent); color: #0C1221; cursor: pointer; @@ -160,12 +211,36 @@ .send-btn:hover { opacity: 0.85; } .send-btn:disabled { opacity: 0.3; cursor: default; } + /* ── Settings panel extras ── */ .overlay { display: none; } .settings-panel { z-index: 1000; } - /* icon-btn override for dark bg */ - .icon-btn { color: rgba(255,255,255,0.5); } - .icon-btn:hover { color: #F3F4F6; background: rgba(255,255,255,0.06); } + .session-info-row { + display: flex; align-items: center; gap: 8px; margin-top: 8px; + font-size: 11px; color: rgba(255,255,255,0.35); font-family: monospace; + background: rgba(255,255,255,0.04); border-radius: 8px; padding: 8px 10px; + } + .session-info-row.hidden { display: none; } + + /* Toggle switch */ + .toggle-row { + display: flex; align-items: center; justify-content: space-between; + margin-top: 10px; cursor: pointer; user-select: none; + } + .toggle-label { font-size: 13px; color: rgba(255,255,255,0.55); } + .toggle-wrap { position: relative; display: inline-block; width: 38px; height: 22px; flex-shrink: 0; } + .toggle-wrap input { position: absolute; opacity: 0; width: 0; height: 0; } + .toggle-track { + position: absolute; inset: 0; border-radius: 11px; + background: rgba(255,255,255,0.1); transition: background 0.2s; cursor: pointer; + } + .toggle-track::after { + content: ''; position: absolute; top: 3px; left: 3px; + width: 16px; height: 16px; border-radius: 50%; + background: rgba(255,255,255,0.35); transition: transform 0.2s, background 0.2s; + } + .toggle-wrap input:checked + .toggle-track { background: rgba(167,139,250,0.3); } + .toggle-wrap input:checked + .toggle-track::after { transform: translateX(16px); background: var(--accent); } @@ -186,6 +261,16 @@ +
+
音声入力
+ +
セッション