@@ -885,7 +885,7 @@ export default function Layout(props: ParentProps) {
885885 return (
886886 < div
887887 data-session-id = { props . session . id }
888- class = "group/session relative w-full rounded-md cursor-default transition-colors pl-2 pr -3
888+ class = "group/session relative w-full rounded-md cursor-default transition-colors px -3
889889 hover:bg-surface-raised-base-hover focus-within:bg-surface-raised-base-hover has-[.active]:bg-surface-base-active"
890890 >
891891 < Tooltip placement = { props . mobile ? "bottom" : "right" } value = { props . session . title } gutter = { 16 } openDelay = { 1000 } >
@@ -902,7 +902,7 @@ export default function Layout(props: ParentProps) {
902902 >
903903 < Switch >
904904 < Match when = { isWorking ( ) } >
905- < Spinner class = "size-[15px] opacity-50 " />
905+ < Spinner class = "size-[15px]" />
906906 </ Match >
907907 < Match when = { hasPermissions ( ) } >
908908 < div class = "size-1.5 rounded-full bg-surface-warning-strong" />
@@ -944,6 +944,17 @@ export default function Layout(props: ParentProps) {
944944 )
945945 }
946946
947+ const SessionSkeleton = ( props : { count ?: number } ) : JSX . Element => {
948+ const items = Array . from ( { length : props . count ?? 4 } , ( _ , index ) => index )
949+ return (
950+ < div class = "flex flex-col gap-1" >
951+ < For each = { items } >
952+ { ( ) => < div class = "h-8 w-full rounded-md bg-surface-raised-base opacity-60 animate-pulse" /> }
953+ </ For >
954+ </ div >
955+ )
956+ }
957+
947958 const SortableProject = ( props : { project : LocalProject ; mobile ?: boolean } ) : JSX . Element => {
948959 const sortable = createSortable ( props . project . worktree )
949960 const selected = createMemo ( ( ) => {
@@ -1105,6 +1116,7 @@ export default function Layout(props: ParentProps) {
11051116 return `${ kind } : ${ name } `
11061117 } )
11071118 const open = createMemo ( ( ) => store . workspaceExpanded [ props . directory ] ?? true )
1119+ const loading = createMemo ( ( ) => open ( ) && workspaceStore . status !== "complete" && sessions ( ) . length === 0 )
11081120 const hasMore = createMemo ( ( ) => local ( ) && workspaceStore . sessionTotal > workspaceStore . session . length )
11091121 const loadMore = async ( ) => {
11101122 if ( ! local ( ) ) return
@@ -1166,6 +1178,9 @@ export default function Layout(props: ParentProps) {
11661178 >
11671179 New session
11681180 </ Button >
1181+ < Show when = { loading ( ) } >
1182+ < SessionSkeleton />
1183+ </ Show >
11691184 < For each = { sessions ( ) } >
11701185 { ( session ) => < SessionItem session = { session } slug = { slug ( ) } mobile = { props . mobile } /> }
11711186 </ For >
@@ -1200,6 +1215,7 @@ export default function Layout(props: ParentProps) {
12001215 . filter ( ( session ) => ! session . parentID )
12011216 . toSorted ( sortSessions ) ,
12021217 )
1218+ const loading = createMemo ( ( ) => workspaceStore . status !== "complete" && sessions ( ) . length === 0 )
12031219 const hasMore = createMemo ( ( ) => workspaceStore . sessionTotal > workspaceStore . session . length )
12041220 const loadMore = async ( ) => {
12051221 setWorkspaceStore ( "limit" , ( limit ) => limit + 5 )
@@ -1214,6 +1230,9 @@ export default function Layout(props: ParentProps) {
12141230 class = "size-full flex flex-col py-2 overflow-y-auto no-scrollbar"
12151231 >
12161232 < nav class = "flex flex-col gap-1 px-2" >
1233+ < Show when = { loading ( ) } >
1234+ < SessionSkeleton />
1235+ </ Show >
12171236 < For each = { sessions ( ) } >
12181237 { ( session ) => < SessionItem session = { session } slug = { slug ( ) } mobile = { props . mobile } /> }
12191238 </ For >
0 commit comments