fix(editor): AI composer 400, slash-menu arrows, drag handle, block outline, hint
FlowDeck CI / test (push) Failing after 14s
FlowDeck CI / docker (push) Skipped

- AI (space) -> 400 DeepSeek: fdAgent.generate now uses the clean no-tools
  /api/agent/generate endpoint instead of the tool-enabled conversation engine
  (which sends tools/tool_choice schemas DeepSeek rejects). Fixes the composer,
  Ask AI, AI meeting note and summarize flows.
- Slash menu arrows: selection highlight was invisible on open (nothing marked),
  so up/down appeared dead. Call _rs() on open + after filtering, and give the
  selected item an accent background + left bar. Verified with jsdom harness:
  Down/Up move selection, Enter applies.
- Block outline when selected: suppress focus rings (outline/box-shadow) on all
  editable blocks ([data-bid], .block-content, page title).
- Drag handle (6-dot): add .block-wrapper:hover/:focus-within .block-handle so
  it shows on hover for normal blocks (only column-wrappers showed it before).
- Empty-block hint: brighter (--text-secondary, opacity .75) so the
  "Press space for AI or / for commands" text is clearly visible on empty paras.
- VERSION + app.main -> 5.1.3; CHANGELOG updated.
- 271 tests pass; page renders 200; /api/agent/generate route registered;
  JS validated (node --check + jsdom).
This commit is contained in:
2026-09-07 11:35:24 -04:00
parent d6bb424021
commit 43aca1a1f7
6 changed files with 73 additions and 40 deletions
+22 -2
View File
@@ -2243,6 +2243,10 @@ button.breadcrumb-current { max-width: 260px; }
.block-wrapper:hover {
background: rgba(0,0,0,0.02);
}
.block-wrapper:hover .block-handle,
.block-wrapper:focus-within .block-handle {
opacity: 1;
}
/* 6-dot drag handle */
.block-handle {
@@ -2332,7 +2336,8 @@ button.breadcrumb-current { max-width: 260px; }
}
.block-content.empty::before {
content: attr(data-placeholder);
color: var(--text-dim);
color: var(--text-secondary);
opacity: .75;
pointer-events: none;
font-style: normal;
}
@@ -4580,10 +4585,25 @@ button.breadcrumb-current { max-width: 260px; }
@keyframes ai-pulse { 0%,100%{opacity:.45} 50%{opacity:1} }
.slash-menu { flex-direction: column; }
.slash-menu .sm-footer:hover { background: var(--bg-hover); }
.slash-item.selected { background: var(--bg-hover); }
.slash-item.selected { background: rgba(35,131,226,.16); box-shadow: inset 2px 0 0 var(--accent,#2383E2); }
.slash-item.selected .slash-item-name { color: var(--text); }
.slash-item-hint { font-size: 12px; color: var(--text-dim); opacity: .7; }
.sm-preview { font-family: inherit; }
.sm-preview h2 { margin: 0 0 6px; }
.sm-preview .sm-pv-label { font-size: 11px; color: var(--text-dim); text-transform: uppercase; letter-spacing: .4px; margin: 8px 0 2px; }
#_aiC { font-family: inherit; }
/* No focus "contour" on selected/editable blocks */
.block-content:focus,
.block-content:focus-visible,
[data-bid]:focus,
[data-bid]:focus-visible,
.page-title-input:focus { outline: none !important; box-shadow: none !important; }
/* Drag handle: keep hover-visible but drop the invisible default outside gutter */
.block-handle { opacity: .0; }
.block-wrapper:hover .block-handle,
.block-wrapper:focus-within .block-handle { opacity: 1; }
.aici-result p { margin: 0 0 8px; }
.aici-result h1,.aici-result h2,.aici-result h3,.aici-result h4 { margin: 10px 0 6px; font-weight: 700; }
.aici-result h1{font-size:1.4em}.aici-result h2{font-size:1.25em}.aici-result h3{font-size:1.1em}.aici-result h4{font-size:1em}