diff --git a/src/components/chat/session-sidebar/SessionList.svelte b/src/components/chat/session-sidebar/SessionList.svelte new file mode 100644 index 00000000..3161231f --- /dev/null +++ b/src/components/chat/session-sidebar/SessionList.svelte @@ -0,0 +1,226 @@ + + +
+ + +
+ +
+ + +
+ +{#if !showArchived && sections.pinned.length} +
+
Pinned
+ {#each sections.pinned as row (row.threadId)} + open(row.threadId)} + onRename={() => rename(row.threadId, row.title)} + onDelete={() => del(row.threadId, row.title)} + onTogglePin={() => togglePin(row.threadId, row.pinned)} + onToggleArchive={() => toggleArchive(row.threadId, row.archived)} + /> + {/each} +
+{/if} + +
+
{showArchived ? "Archived" : "Sessions"}
+ {#if visibleRows.length === 0} +
{query ? "No matching sessions" : "No conversations"}
+ {/if} + {#each visibleRows as row (row.threadId)} + open(row.threadId)} + onRename={() => rename(row.threadId, row.title)} + onDelete={() => del(row.threadId, row.title)} + onTogglePin={() => togglePin(row.threadId, row.pinned)} + onToggleArchive={() => toggleArchive(row.threadId, row.archived)} + /> + {/each} + {#if remaining > 0} + + {/if} +
+ + diff --git a/src/components/chat/session-sidebar/SessionSheetModal.ts b/src/components/chat/session-sidebar/SessionSheetModal.ts new file mode 100644 index 00000000..2e00a543 --- /dev/null +++ b/src/components/chat/session-sidebar/SessionSheetModal.ts @@ -0,0 +1,35 @@ +import type { App } from "obsidian"; +import type { ThreadPathStore } from "../../../views/chat/threadPathStore.svelte"; +import { SvelteModal } from "../../modal/SvelteModal"; +import SessionList from "./SessionList.svelte"; + +/** + * Full-height modal hosting the shared session list for narrow/mobile widths, + * where the docked `SessionSidebar` has no room. Opening a chat from the list + * closes the modal (`onOpenSession`). + */ +export class SessionSheetModal extends SvelteModal { + constructor( + app: App, + private threadPathStore: ThreadPathStore, + ) { + super(app); + } + + onOpen() { + this.setTitle("Sessions"); + this.modalEl.addClass("s2b-session-sheet"); + + this.mountComponent( + SessionList, + { threadPathStore: this.threadPathStore, onOpenSession: () => this.close() }, + { + fullScreenOnPhone: true, + width: "min(420px, 94vw)", + maxWidth: "94vw", + height: "min(840px, 92vh)", + contentOverflow: "hidden", + }, + ); + } +} diff --git a/src/components/chat/session-sidebar/SessionSidebar.svelte b/src/components/chat/session-sidebar/SessionSidebar.svelte index 0b2eb6d7..5b5f4f57 100644 --- a/src/components/chat/session-sidebar/SessionSidebar.svelte +++ b/src/components/chat/session-sidebar/SessionSidebar.svelte @@ -1,145 +1,15 @@
-
- - -
- -
- - -
- - {#if !showArchived && sections.pinned.length} -
- - {#each sections.pinned as row (row.threadId)} - open(row.threadId)} - onRename={() => rename(row.threadId, row.title)} - onDelete={() => del(row.threadId, row.title)} - onTogglePin={() => togglePin(row.threadId, row.pinned)} - onToggleArchive={() => toggleArchive(row.threadId, row.archived)} - /> - {/each} -
- {/if} - -
- - {#if visibleRows.length === 0} -
{query ? "No matching sessions" : "No conversations"}
- {/if} - {#each visibleRows as row (row.threadId)} - open(row.threadId)} - onRename={() => rename(row.threadId, row.title)} - onDelete={() => del(row.threadId, row.title)} - onTogglePin={() => togglePin(row.threadId, row.pinned)} - onToggleArchive={() => toggleArchive(row.threadId, row.archived)} - /> - {/each} - {#if remaining > 0} - - {/if} -
+
diff --git a/src/components/chat/session-sidebar/SessionSidebarItem.svelte b/src/components/chat/session-sidebar/SessionSidebarItem.svelte index c7ee310e..2f6b2d7b 100644 --- a/src/components/chat/session-sidebar/SessionSidebarItem.svelte +++ b/src/components/chat/session-sidebar/SessionSidebarItem.svelte @@ -1,11 +1,13 @@
+