Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"electron-liquid-glass": "^1.1.1",
"electron-updater": "^6.7.3",
"esbuild": "^0.19.12",
"katex": "^0.16.38",
"lucide-react": "^0.312.0",
"node-edge-tts": "^1.2.10",
"node-window-manager": "^2.2.4",
Expand Down
19 changes: 15 additions & 4 deletions src/main/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,7 @@ const DETACHED_SPEAK_WINDOW_NAME = 'supercmd-speak-window';
const DETACHED_WINDOW_MANAGER_WINDOW_NAME = 'supercmd-window-manager-window';
const DETACHED_PROMPT_WINDOW_NAME = 'supercmd-prompt-window';
const DETACHED_MEMORY_STATUS_WINDOW_NAME = 'supercmd-memory-status-window';
const DETACHED_NOTES_WINDOW_NAME = 'supercmd-notes-window';
const DETACHED_WINDOW_QUERY_KEY = 'sc_detached';
const MEMORY_STATUS_WINDOW_WIDTH = 340;
const MEMORY_STATUS_WINDOW_HEIGHT = 60;
Expand Down Expand Up @@ -812,19 +813,22 @@ function resolveDetachedPopupName(details: any): string | null {
byFrameName === DETACHED_WINDOW_MANAGER_WINDOW_NAME ||
byFrameName === DETACHED_PROMPT_WINDOW_NAME ||
byFrameName === DETACHED_MEMORY_STATUS_WINDOW_NAME ||
byFrameName === DETACHED_NOTES_WINDOW_NAME ||
byFrameName.startsWith(`${DETACHED_WHISPER_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_WHISPER_ONBOARDING_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_SPEAK_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_WINDOW_MANAGER_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_PROMPT_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_MEMORY_STATUS_WINDOW_NAME}-`)
byFrameName.startsWith(`${DETACHED_MEMORY_STATUS_WINDOW_NAME}-`) ||
byFrameName.startsWith(`${DETACHED_NOTES_WINDOW_NAME}-`)
) {
if (byFrameName.startsWith(DETACHED_WHISPER_WINDOW_NAME)) return DETACHED_WHISPER_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_WHISPER_ONBOARDING_WINDOW_NAME)) return DETACHED_WHISPER_ONBOARDING_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_SPEAK_WINDOW_NAME)) return DETACHED_SPEAK_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_WINDOW_MANAGER_WINDOW_NAME)) return DETACHED_WINDOW_MANAGER_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_PROMPT_WINDOW_NAME)) return DETACHED_PROMPT_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_MEMORY_STATUS_WINDOW_NAME)) return DETACHED_MEMORY_STATUS_WINDOW_NAME;
if (byFrameName.startsWith(DETACHED_NOTES_WINDOW_NAME)) return DETACHED_NOTES_WINDOW_NAME;
return byFrameName;
}
const rawUrl = String(details?.url || '').trim();
Expand All @@ -838,7 +842,8 @@ function resolveDetachedPopupName(details: any): string | null {
byQuery === DETACHED_SPEAK_WINDOW_NAME ||
byQuery === DETACHED_WINDOW_MANAGER_WINDOW_NAME ||
byQuery === DETACHED_PROMPT_WINDOW_NAME ||
byQuery === DETACHED_MEMORY_STATUS_WINDOW_NAME
byQuery === DETACHED_MEMORY_STATUS_WINDOW_NAME ||
byQuery === DETACHED_NOTES_WINDOW_NAME
) {
return byQuery;
}
Expand Down Expand Up @@ -5180,6 +5185,8 @@ function createWindow(): void {
? CURSOR_PROMPT_WINDOW_WIDTH
: detachedPopupName === DETACHED_MEMORY_STATUS_WINDOW_NAME
? 340
: detachedPopupName === DETACHED_NOTES_WINDOW_NAME
? 420
: 520;
const defaultHeight = detachedPopupName === DETACHED_WHISPER_WINDOW_NAME
? 52
Expand All @@ -5191,6 +5198,8 @@ function createWindow(): void {
? CURSOR_PROMPT_WINDOW_HEIGHT
: detachedPopupName === DETACHED_MEMORY_STATUS_WINDOW_NAME
? 60
: detachedPopupName === DETACHED_NOTES_WINDOW_NAME
? 560
: 112;
const finalWidth = typeof popupBounds.width === 'number' ? popupBounds.width : defaultWidth;
const finalHeight = typeof popupBounds.height === 'number' ? popupBounds.height : defaultHeight;
Expand All @@ -5215,6 +5224,8 @@ function createWindow(): void {
? 'SuperCmd Window Manager'
: detachedPopupName === DETACHED_MEMORY_STATUS_WINDOW_NAME
? 'SuperCmd Status'
: detachedPopupName === DETACHED_NOTES_WINDOW_NAME
? 'SuperCmd Notes'
: 'SuperCmd Read',
frame: false,
titleBarStyle: 'hidden',
Expand All @@ -5230,8 +5241,8 @@ function createWindow(): void {
detachedPopupName === DETACHED_WHISPER_ONBOARDING_WINDOW_NAME || useNativeVibrancyForWindowManager
? 'active'
: undefined,
hasShadow: false,
resizable: false,
hasShadow: detachedPopupName === DETACHED_NOTES_WINDOW_NAME,
resizable: detachedPopupName === DETACHED_NOTES_WINDOW_NAME,
minimizable: false,
maximizable: false,
fullscreenable: false,
Expand Down
55 changes: 34 additions & 21 deletions src/renderer/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,17 @@ const App: React.FC = () => {
},
});

const notesPortalTarget = useDetachedPortalWindow(!!showNotesManager, {
name: 'supercmd-notes-window',
title: 'SuperCmd Notes',
width: 420,
height: 560,
anchor: 'center',
onClosed: () => {
setShowNotesManager(null);
},
});

const windowManagerPortalTarget = useDetachedPortalWindow(showWindowManager, {
name: 'supercmd-window-manager-window',
title: 'SuperCmd Window Manager',
Expand Down Expand Up @@ -616,10 +627,12 @@ const App: React.FC = () => {
}
if (routedSystemCommandId === 'system-search-notes') {
openNotesManager('search');
window.electron.hideWindow();
return;
}
if (routedSystemCommandId === 'system-create-note') {
openNotesManager('create');
window.electron.hideWindow();
return;
}
if (routedSystemCommandId === 'system-search-snippets') {
Expand Down Expand Up @@ -1921,11 +1934,13 @@ const App: React.FC = () => {
if (commandId === 'system-search-notes') {
whisperSessionRef.current = false;
openNotesManager('search');
window.electron.hideWindow();
return true;
}
if (commandId === 'system-create-note') {
whisperSessionRef.current = false;
openNotesManager('create');
window.electron.hideWindow();
return true;
}
if (commandId === 'system-search-snippets') {
Expand Down Expand Up @@ -2752,6 +2767,24 @@ const App: React.FC = () => {
cursorPromptPortalTarget
)
: null}
{showNotesManager && notesPortalTarget
? createPortal(
<div className="w-full h-full" style={{ background: 'var(--bg-primary)', color: 'var(--text-primary)' }}>
<div className="glass-effect overflow-hidden h-full flex flex-col">
<NotesManager
initialView={showNotesManager}
onClose={() => {
setShowNotesManager(null);
setSearchQuery('');
setSelectedIndex(0);
setTimeout(() => inputRef.current?.focus(), 50);
}}
/>
</div>
</div>,
notesPortalTarget
)
: null}
</>
);

Expand Down Expand Up @@ -2969,27 +3002,7 @@ const App: React.FC = () => {
);
}

// ─── Notes Manager mode ──────────────────────────────────────────
if (showNotesManager) {
return (
<>
{alwaysMountedRunners}
<div className="w-full h-full">
<div className="glass-effect overflow-hidden h-full flex flex-col">
<NotesManager
initialView={showNotesManager}
onClose={() => {
setShowNotesManager(null);
setSearchQuery('');
setSelectedIndex(0);
setTimeout(() => inputRef.current?.focus(), 50);
}}
/>
</div>
</div>
</>
);
}
// ─── Notes Manager — rendered in detached floating window ────────

// ─── Snippet Manager mode ─────────────────────────────────────────
if (showSnippetManager) {
Expand Down
Loading