@@ -15,13 +15,15 @@ import { SessionState, USER, ASSISTANT, SYSTEM } from './SessionState.svelte.js'
1515let props = $props ()
1616const sessionId = props .sessionId // https://github.com/sveltejs/svelte/issues/15697
1717const autoReply = props .autoReply
18+ const windowState = props .state
1819if (! sessionId) { throw new Error (' sessionId is required' ) }
1920
2021const sessionState = new SessionState ({ sessionId, autoReply })
2122const sessionScripts = sessionState .sessionScripts
2223let sessionLoaded = $derived (sessionState .sessionLoaded )
2324let sessionData = $derived (sessionState .sessionData )
2425let messages = $derived (sessionState .messages )
26+ let layoutLoaded = $state (false )
2527let messageStats = $derived .by (() => {
2628 const cnt = messages .length
2729 let roots = 0
@@ -37,6 +39,8 @@ let messageStats = $derived.by(() => {
3739
3840onMount (async () => {
3941 await sessionState .loadSession ()
42+ windowState? .loadSessionLayout (sessionState .sessionData ? .windowLayout )
43+ layoutLoaded = true
4044 const savedScrollY = sessionStorage .getItem (` scroll-${ sessionId} ` )
4145 if (savedScrollY) {
4246 await tick ()
@@ -68,13 +72,19 @@ onMount(() => {
6872})
6973
7074onDestroy (async () => {
75+ if (sessionState .sessionData ) sessionState .sessionData .windowLayout = windowState? .getSessionLayout ()
7176 await sessionState .destroy ()
7277})
7378
7479$effect (() => {
7580 if (sessionData) document .title = ` ${ sessionData .title } - Eimi LLM UI`
7681})
7782
83+ $effect (() => {
84+ if (! layoutLoaded || ! sessionLoaded || ! sessionData || ! windowState) return
85+ sessionData .windowLayout = windowState .getSessionLayout ()
86+ })
87+
7888function getMessageFromEvent (event ) {
7989 const el = event .target .closest (' .message' )
8090 if (! el) { return }
@@ -229,27 +239,6 @@ function createMessage(values, index = 0) {
229239}
230240< / script>
231241
232- {#if sessionLoaded}
233- < SessionFaviconChanger {messages} / >
234- < SessionHotkeys {messages} {genResponse} {onCreateMessage} {getMessageFromEvent} {deleteMessage} {moveMessage}/ >
235- < Parameters
236- {sessionId}
237- bind: parameters= {sessionData .parameters }
238- scripts= {sessionScripts .scripts }
239- / >
240-
241- < div>
242- < input class = " title-input" value= {sessionData .title } oninput= {onTitleUpdate} / >
243- < button onclick= {onDup} title= " make a copy of this session" > dup< / button>
244- < button onclick= {onDelete} title= " delete session (hold shift)" > delete < / button>
245- < / div>
246- < div class = " meta-gray" >
247- {new Date (sessionData .createdAt ).toLocaleString ()}
248- | messages: {messageStats .cnt }
249- | roots: {messageStats .roots }
250- | leafs: {messageStats .leafs }
251- < / div>
252-
253242{#snippet renderMessage (c, i)}
254243 <!-- svelte- ignore a11y_no_noninteractive_tabindex -->
255244 < div class = " message-content" class : generating= " {c.generating}" tabindex= " 0" >
@@ -375,6 +364,29 @@ function createMessage(values, index = 0) {
375364 < / div>
376365{/ snippet}
377366
367+ < div class = " session-view" >
368+ {#if sessionLoaded}
369+ < SessionFaviconChanger {messages} / >
370+ < SessionHotkeys {messages} {genResponse} {onCreateMessage} {getMessageFromEvent} {deleteMessage} {moveMessage}/ >
371+ < Parameters
372+ state= {windowState}
373+ {sessionId}
374+ bind: parameters= {sessionData .parameters }
375+ scripts= {sessionScripts .scripts }
376+ / >
377+
378+ < div>
379+ < input class = " title-input" value= {sessionData .title } oninput= {onTitleUpdate} / >
380+ < button onclick= {onDup} title= " make a copy of this session" > dup< / button>
381+ < button onclick= {onDelete} title= " delete session (hold shift)" > delete < / button>
382+ < / div>
383+ < div class = " meta-gray" >
384+ {new Date (sessionData .createdAt ).toLocaleString ()}
385+ | messages: {messageStats .cnt }
386+ | roots: {messageStats .roots }
387+ | leafs: {messageStats .leafs }
388+ < / div>
389+
378390< div id= " messages" class = " messages" >
379391{#each messages as c, i (c .id )}
380392 < div id= {` m_${ c .id } ` } class = " message message-pad" data- id= " {c.id}" data- index= " {i}" class: linear= " {c.linear}" style= " --depth: {c.ddepth}" >
@@ -396,8 +408,14 @@ function createMessage(values, index = 0) {
396408< div id= " messages" class = " messages" >< / div>
397409< div id= " scroll-restoration" style= " height: 50000px;" >< / div>
398410{/ if }
411+ < / div>
399412
400413< style>
414+ .session - view {
415+ display: flex;
416+ flex- direction: column;
417+ align- items: center;
418+ }
401419.title - input {
402420 width: 40ch ;
403421}
@@ -410,6 +428,10 @@ function createMessage(values, index = 0) {
410428 color: var (-- brand- hover- color);
411429}
412430
431+ .messages {
432+ max- width: fit- content; /* tmp! */
433+ }
434+
413435.message {
414436 position: relative;
415437 padding- left: calc (var (-- depth) * 8px );
0 commit comments