Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade: New Home Screen for Khoj #860

Merged
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
8ba79fc
V1 of the new automations page
sabaimran Jul 12, 2024
05bf911
Improve notice of which email address is being delivered to
sabaimran Jul 12, 2024
a8d4b8f
Fix validation bugs in the edit form
sabaimran Jul 13, 2024
ce99c48
Remove console logs for debugging
sabaimran Jul 13, 2024
9c553b9
Fix spacing in page css
sabaimran Jul 13, 2024
eaab311
Fix spaving in nav menu
sabaimran Jul 13, 2024
a830839
Remove syntax import for highlight.js in code
sabaimran Jul 13, 2024
0213848
Manually insert preferred styling for light/dark mode from highlight.…
sabaimran Jul 13, 2024
6ea3746
Fix copy button rendering issue (it disappears if you've hovered on t…
sabaimran Jul 13, 2024
f3c5deb
Fix some linting errors with unescaped characters on the automations …
sabaimran Jul 13, 2024
eaf924e
Add an alert pane showing the email, location for automations
sabaimran Jul 13, 2024
201a5d7
Merge branch 'features/chat-ui-updates-big' of github.com:khoj-ai/kho…
sabaimran Jul 13, 2024
05b616d
Add more icons and add a left bar for styling on each individual auto…
sabaimran Jul 13, 2024
ccbfc4a
Add support for setting color and icons on the agents in the backend
sabaimran Jul 13, 2024
07ead01
Migrate agents page to use the new shadcn component library and the c…
sabaimran Jul 13, 2024
4f7fe3e
Update styling of cards
sabaimran Jul 13, 2024
2e43c2e
Fix dark/light mode toggle rendering bug
sabaimran Jul 13, 2024
a22c1da
Remove dead styling
sabaimran Jul 13, 2024
d2afe26
Navigate nav urls within same page, add an info piece to the agents page
sabaimran Jul 14, 2024
4243419
Merge branch 'features/big-upgrade-chat-ux' of github.com:khoj-ai/kho…
sabaimran Jul 14, 2024
a69e3e3
Merge branch 'features/big-upgrade-chat-ux' of github.com:khoj-ai/kho…
sabaimran Jul 15, 2024
c976315
Revert packages removed in merging
sabaimran Jul 15, 2024
a771c6f
Merge branch 'features/big-upgrade-chat-ux' of github.com:khoj-ai/kho…
sabaimran Jul 15, 2024
9288fb1
Merge branch 'features/update-automations-page' of github.com:khoj-ai…
sabaimran Jul 15, 2024
ccc145c
simplify conditional with ternary operator
sabaimran Jul 15, 2024
7945471
Merge branch 'features/big-upgrade-chat-ux' of github.com:khoj-ai/kho…
sabaimran Jul 15, 2024
3de92b0
rough draft of khoj homepage finished!
MythicalCow Jul 15, 2024
a5f91a9
Merge remote-tracking branch 'upstream/features/big-upgrade-chat-ux' …
MythicalCow Jul 16, 2024
da11415
UI completed and ready for review. working on mechanics
MythicalCow Jul 16, 2024
ca2b430
bugs on some things
MythicalCow Jul 17, 2024
60fc4d5
UI cleanup and phosphor icons integration. backend in progress but hi…
MythicalCow Jul 18, 2024
c621548
agents fix causing chat flow issue
MythicalCow Jul 18, 2024
c207940
removing localConversationId trial
MythicalCow Jul 18, 2024
ac3cdb9
removing localConversationId trial
MythicalCow Jul 18, 2024
0529001
fixed new conversation gen from homepage
MythicalCow Jul 18, 2024
76eb8fc
homepage changes?
MythicalCow Jul 18, 2024
4c116d5
non crashing homepage. (currently non-functional)
MythicalCow Jul 18, 2024
94b0fe5
working new page screen
MythicalCow Jul 18, 2024
2dfa092
removed debug button
MythicalCow Jul 18, 2024
1f996af
added support for autofilling text based suggestions
MythicalCow Jul 18, 2024
b8b4c1e
added small local storage fix
MythicalCow Jul 18, 2024
7b0c7da
fixed double message glitch
MythicalCow Jul 18, 2024
203b4db
made connection status in side panel connected for homepage
MythicalCow Jul 18, 2024
56d306c
changed menu icon based on figma
MythicalCow Jul 18, 2024
80a36f3
added side panel new conversation button
MythicalCow Jul 18, 2024
5d4c132
added centering for main page items
MythicalCow Jul 18, 2024
00791a6
homepage mostly finished. agents still isn't getting sent over during…
MythicalCow Jul 19, 2024
eb716c3
homepage finished! code cleanup remains
MythicalCow Jul 19, 2024
3368742
code cleaned up :)
MythicalCow Jul 19, 2024
85e811b
placed home page on / instead of /home for debugging. /home functional
MythicalCow Jul 19, 2024
784edd8
removed old agentShortcut
MythicalCow Jul 19, 2024
5f68731
removed excessive logging
MythicalCow Jul 19, 2024
a08e58f
additional code cleaning
MythicalCow Jul 19, 2024
1668f8d
small fix for suggestions
MythicalCow Jul 19, 2024
4eae39f
Remove yarn.lock
sabaimran Jul 21, 2024
eccb849
resolve updates with latest yarn.lock
sabaimran Jul 21, 2024
20c7b9c
Small updates to overall styling and components usage for homepage
sabaimran Jul 21, 2024
68b3801
Resolve merge conflicts
sabaimran Jul 21, 2024
e56ee3b
Implement mobile-friendly view for homepage
sabaimran Jul 21, 2024
08dbc25
Fix issue of new conversations being created when selected agent is c…
sabaimran Jul 21, 2024
8442fe6
Improve center of the homepage experience
sabaimran Jul 21, 2024
6fcbbfb
Fix showing agent during first chat experience
sabaimran Jul 21, 2024
82750d3
update profile card in chat history to use tooltip
sabaimran Jul 21, 2024
bae2164
Fix errors for missing key prop react
sabaimran Jul 22, 2024
9f4374d
removed legacy svgs and moved /home page to /
MythicalCow Jul 22, 2024
2da12a8
Merge branch 'homescreen-ui' of https://github.com/MythicalCow/khoj i…
MythicalCow Jul 22, 2024
f276352
removing weird formatting errors
MythicalCow Jul 22, 2024
22e96fe
dark mode upgrades
MythicalCow Jul 22, 2024
b650d1f
agent highlighting simplification
MythicalCow Jul 22, 2024
7610906
dark mode gradient updates
MythicalCow Jul 23, 2024
546af11
fixed mobile width issues and used cards for agents
MythicalCow Jul 23, 2024
b810a21
fixed mobile width issues and used cards for agents!
MythicalCow Jul 23, 2024
67902a2
merge mobile changes
MythicalCow Jul 23, 2024
7636e70
mobile changes merge conflict resolution
MythicalCow Jul 23, 2024
1ebec5e
moved icon and tailwind color functionalities into util imports
MythicalCow Jul 23, 2024
264a016
moved util files to /common
MythicalCow Jul 23, 2024
397b901
Improve layout with side panel, resolve issues with mobile rendering,…
sabaimran Jul 24, 2024
ca63f14
Re-use common functions for css in suggestionscard
sabaimran Jul 24, 2024
e0bdf7e
Simplify package versions and address missing key react errors
sabaimran Jul 24, 2024
66a4f69
Improve dark mode for chat input area on home page, chat
sabaimran Jul 24, 2024
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
1,266 changes: 1,266 additions & 0 deletions package-lock.json
MythicalCow marked this conversation as resolved.
Show resolved Hide resolved

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions package.json
MythicalCow marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"dependencies": {
"tailwindcss": "^3.4.6"
}
}
7 changes: 4 additions & 3 deletions src/interface/web/app/agents/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,9 @@ async function openChat(slug: string, userData: UserProfile | null) {
}

const response = await fetch(`/api/chat/sessions?agent_slug=${slug}`, { method: "POST" });
const data = await response.json();
if (response.status == 200) {
window.location.href = `/home`;
window.location.href = `/chat?conversationId=${data.conversation_id}`;
} else if (response.status == 403 || response.status == 401) {
window.location.href = unauthenticatedRedirectUrl;
} else {
Expand Down Expand Up @@ -294,7 +295,7 @@ export default function Agents() {
return (
<main className={styles.main}>
<div className={`${styles.titleBar} text-5xl`}>
Talk to a Specialized Agent
Agents
</div>
<div className={styles.agentList}>
Error loading agents
Expand All @@ -307,7 +308,7 @@ export default function Agents() {
return (
<main className={styles.main}>
<div className={`${styles.titleBar} text-5xl`}>
Talk to a Specialized Agent
Agents
</div>
<div className={styles.agentList}>
<InlineLoading /> booting up your agents
Expand Down
22 changes: 5 additions & 17 deletions src/interface/web/app/chat/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,6 @@ import { welcomeConsole } from '../common/utils';
import ChatInputArea, { ChatOptions } from '../components/chatInputArea/chatInputArea';
import { useAuthenticatedData } from '../common/auth';

export interface AgentData {
slug: string;
avatar: string;
name: string;
personality: string;
color: string;
icon: string;
}

interface ChatBodyDataProps {
chatOptionsData: ChatOptions | null;
setTitle: (title: string) => void;
Expand All @@ -36,9 +27,7 @@ interface ChatBodyDataProps {
setUploadedFiles: (files: string[]) => void;
isMobileWidth?: boolean;
isLoggedIn: boolean;
conversationId: string | null; // Added this line
}
type Suggestion = [string, string, string, string, string];

function ChatBodyData(props: ChatBodyDataProps) {
const searchParams = useSearchParams();
Expand Down Expand Up @@ -77,7 +66,7 @@ function ChatBodyData(props: ChatBodyDataProps) {
}, [props.streamedMessages]);

if(!conversationId) {
window.location.href = '/home';
window.location.href = '/';
return;
}

Expand All @@ -90,13 +79,13 @@ function ChatBodyData(props: ChatBodyDataProps) {
pendingMessage={processingMessage ? message : ''}
incomingMessages={props.streamedMessages} />
</div>
<div className={`${styles.inputBox} bg-background align-middle items-center justify-center px-3`}>
<div className={`${styles.inputBox} bg-background align-middle items-center justify-center px-3 dark:bg-neutral-700 dark:border-0 dark:shadow-sm`}>
<ChatInputArea
isLoggedIn={props.isLoggedIn}
sendMessage={(message) => setMessage(message)}
sendDisabled={processingMessage}
chatOptionsData={props.chatOptionsData}
conversationId={props.conversationId ?? conversationId}
conversationId={conversationId}
isMobileWidth={props.isMobileWidth}
setUploadedFiles={props.setUploadedFiles} />
</div>
Expand Down Expand Up @@ -282,7 +271,7 @@ export default function Chat() {
<title>
{title}
</title>
<div className={styles.sidePanel}>
<div>
<SidePanel
webSocketConnected={chatWS !== null}
conversationId={conversationId}
Expand All @@ -302,8 +291,7 @@ export default function Chat() {
setQueryToProcess={setQueryToProcess}
setUploadedFiles={setUploadedFiles}
isMobileWidth={isMobileWidth}
onConversationIdChange={handleConversationIdChange}
conversationId={conversationId}/>
onConversationIdChange={handleConversationIdChange} />
</Suspense>
</div>
</div>
Expand Down
2 changes: 0 additions & 2 deletions src/interface/web/app/common/chatFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ export const setupWebSocket = async (conversationId: string, initialMessage?: st
let webSocketUrl = `${wsProtocol}//${host}/api/chat/ws`;

if (conversationId === null) {
console.error("No conversation ID provided");
return null;
}

Expand All @@ -91,7 +90,6 @@ export const setupWebSocket = async (conversationId: string, initialMessage?: st
console.log('WebSocket connection established');
if (initialMessage) {
chatWS.send(initialMessage);
console.log("ws data: ", initialMessage, conversationId, webSocketUrl);
}
};

Expand Down
15 changes: 14 additions & 1 deletion src/interface/web/app/components/chatHistory/chatHistory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ export default function ChatHistory(props: ChatHistoryProps) {
fetch(conversationFetchURL)
.then(response => response.json())
.then((chatData: ChatResponse) => {
console.log("CHAT DATA RESPONSE", chatData);
MythicalCow marked this conversation as resolved.
Show resolved Hide resolved
props.setTitle(chatData.response.slug);
if (chatData && chatData.response && chatData.response.chat && chatData.response.chat.length > 0) {

Expand All @@ -192,6 +193,16 @@ export default function ChatHistory(props: ChatHistoryProps) {
}
setFetchingData(false);
} else {
if (chatData.response.agent && chatData.response.conversation_id) {
const chatMetadata ={
chat: [],
agent: chatData.response.agent,
conversation_id: chatData.response.conversation_id,
slug: chatData.response.slug,
}
setData(chatMetadata);
}

setHasMoreMessages(false);
setFetchingData(false);
MythicalCow marked this conversation as resolved.
Show resolved Hide resolved
}
Expand Down Expand Up @@ -243,6 +254,8 @@ export default function ChatHistory(props: ChatHistoryProps) {
return null;
}

console.log("CHAT HISTORY DATA", data);

return (
<ScrollArea className={`h-[80vh]`}>
<div ref={ref}>
Expand Down Expand Up @@ -335,7 +348,7 @@ export default function ChatHistory(props: ChatHistoryProps) {
<ProfileCard
name={constructAgentName()}
link={constructAgentLink()}
avatar={<Lightbulb color='orange' weight='fill' className="mt-1 mx-1" />}
avatar={<Lightbulb color='orange' weight='fill' />}
description={constructAgentPersona()}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,11 +306,11 @@ export default function ChatInputArea(props: ChatInputProps) {
className="!bg-none p-1 h-auto text-3xl rounded-full text-gray-300 hover:text-gray-500"
disabled={props.sendDisabled}
onClick={handleFileButtonClick}>
<FileArrowUp weight='fill' />
<FileArrowUp weight='fill' className={`${props.isMobileWidth ? 'w-6 h-6' : 'w-8 h-8'}`} />
</Button>
<div className="grid w-full gap-1.5 relative">
<Textarea
className='border-none w-full h-16 min-h-16 md:py-4 rounded-lg text-lg resize-none'
className={`border-none w-full h-16 min-h-16 md:py-4 rounded-lg resize-none dark:bg-neutral-700 ${props.isMobileWidth ? 'text-md' : 'text-lg'}`}
placeholder="Type / to see a list of commands"
id="message"
value={message}
Expand All @@ -327,13 +327,13 @@ export default function ChatInputArea(props: ChatInputProps) {
variant={'ghost'}
className="!bg-none p-1 h-auto text-3xl rounded-full text-gray-300 hover:text-gray-500"
disabled={props.sendDisabled}>
<Microphone weight='fill' />
<Microphone weight='fill' className={`${props.isMobileWidth ? 'w-6 h-6' : 'w-8 h-8'}`} />
</Button>
<Button
className="bg-orange-300 hover:bg-orange-500 rounded-full p-0 h-auto text-3xl transition transform hover:-translate-y-1"
onClick={onSendMessage}
disabled={props.sendDisabled}>
<ArrowCircleUp />
<ArrowCircleUp className={`${props.isMobileWidth ? 'w-6 h-6' : 'w-8 h-8'}`} />
</Button>
</div>
</>
Expand Down
4 changes: 2 additions & 2 deletions src/interface/web/app/components/navMenu/navMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ export default function NavMenu(props: NavMenuProps) {
<DropdownMenuTrigger>=</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>
<Link href='/chat' className={`${props.selected.toLowerCase() === 'chat' ? styles.selected : ''} hover:bg-background no-underline`}>Chat</Link>
<Link href='/' className={`${props.selected.toLowerCase() === 'chat' ? styles.selected : ''} hover:bg-background no-underline`}>Chat</Link>
</DropdownMenuItem>
<DropdownMenuItem>
<Link href='/agents' className={`${props.selected.toLowerCase() === 'agent' ? styles.selected : ''} hover:bg-background no-underline`}>Agents</Link>
Expand All @@ -142,7 +142,7 @@ export default function NavMenu(props: NavMenuProps) {
:
<Menubar className='items-top inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground'>
<MenubarMenu>
<Link href='/home' className={`${props.selected.toLowerCase() === 'chat' ? styles.selected : ''} hover:bg-background no-underline`}>
<Link href='/' className={`${props.selected.toLowerCase() === 'chat' ? styles.selected : ''} hover:bg-background no-underline`}>
<MenubarTrigger>Chat</MenubarTrigger>
</Link>
</MenubarMenu>
Expand Down
60 changes: 41 additions & 19 deletions src/interface/web/app/components/profileCard/profileCard.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,56 @@
import React from 'react';
import { ArrowRight } from '@phosphor-icons/react';

import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { Button } from '@/components/ui/button';


interface ProfileCardProps {
name: string;
avatar: JSX.Element;
avatar: JSX.Element;
link: string;
description?: string; // Optional description field
}

const ProfileCard: React.FC<ProfileCardProps> = ({ name, avatar, link, description }) => {
return (
<div className="relative group flex">
{avatar}
<span>{name}</span>
<div className="absolute left-0 bottom-full w-80 h-30 p-2 pb-4 bg-white border border-gray-300 rounded-lg shadow-lg opacity-0 group-hover:opacity-100 transition-opacity duration-300">
<div className="flex items-center">
{avatar}
<span className="mr-2 mt-1 flex">
{name}
<a href={link} target="_blank" rel="noreferrer" className="mt-1 ml-2 block">
<ArrowRight weight="bold"/>
</a>
</span>
</div>
{description && (
<p className="mt-2 ml-6 text-sm text-gray-600 line-clamp-2">
{description || 'A Khoj agent'}
</p>
)}
</div>
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Button variant="ghost" className="flex items-center justify-center gap-2">
{avatar}
<div>{name}</div>
</Button>
</TooltipTrigger>
<TooltipContent>
<div className='w-80 h-30'>
{/* <div className="absolute left-0 bottom-full w-80 h-30 p-2 pb-4 bg-white border border-gray-300 rounded-lg shadow-lg opacity-0 group-hover:opacity-100 transition-opacity duration-300"> */}
<a href={link} target="_blank" rel="noreferrer" className="mt-1 ml-2 block no-underline">
<div className="flex items-center justify-start gap-2">
{avatar}
<div className="mr-2 mt-1 flex justify-center items-center text-sm font-semibold text-gray-800">
{name}
<ArrowRight weight="bold" className='ml-1' />
</div>
</div>
</a>
{description && (
<p className="mt-2 ml-6 text-sm text-gray-600 line-clamp-2">
{description || 'A Khoj agent'}
</p>
)}
</div>
</TooltipContent>
</Tooltip>
</TooltipProvider>


</div>
);
};
Expand Down
36 changes: 21 additions & 15 deletions src/interface/web/app/components/sidePanel/chatHistorySidePanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ function SessionsAndFiles(props: SessionsAndFilesProps) {
agent_avatar={chatHistory.agent_avatar}
agent_name={chatHistory.agent_name}
showSidePanel={props.setEnabled}
/>
/>
))}
</div>
))}
Expand Down Expand Up @@ -548,7 +548,7 @@ function ChatSessionsModal({ data, showSidePanel }: ChatSessionsModalProps) {
<Dialog>
<DialogTrigger
className="flex text-left text-medium text-gray-500 hover:text-gray-300 cursor-pointer my-4 text-sm p-[0.5rem]">
<span className="mr-2">See All <ArrowRight className="inline h-4 w-4" weight="bold"/></span>
<span className="mr-2">See All <ArrowRight className="inline h-4 w-4" weight="bold" /></span>
</DialogTrigger>
<DialogContent>
<DialogHeader>
Expand All @@ -570,7 +570,7 @@ function ChatSessionsModal({ data, showSidePanel }: ChatSessionsModalProps) {
slug={chatHistory.slug}
agent_avatar={chatHistory.agent_avatar}
agent_name={chatHistory.agent_name}
showSidePanel={showSidePanel}/>
showSidePanel={showSidePanel} />
))}
</div>
))}
Expand Down Expand Up @@ -701,21 +701,27 @@ export default function SidePanel(props: SidePanelProps) {
}, [chatSessions]);

function newConvo() {
window.location.href = '/home';
window.location.href = '/';
}

return (
<div className={`${styles.panel} ${enabled ? styles.expanded : styles.collapsed}`}>
<div className="flex items-center justify-between">
<img src="/khoj-logo.svg" alt="logo" className="w-16 relative bottom-1"/>
<div className={`flex items-center justify-between ${enabled ? 'flex-row' : 'flex-col'}`}>
<Link href='/'>
<img
src="/khoj-logo.svg"
alt="khoj logo"
width={52}
height={52} />
</Link>
{
authenticatedData && props.isMobileWidth ?
<Drawer open={enabled} onOpenChange={(open) => {
if (!enabled) setEnabled(false);
setEnabled(open);
}
}>
<DrawerTrigger><ArrowRight className="h-4 w-4 mx-2" weight="bold"/></DrawerTrigger>
<DrawerTrigger><ArrowRight className="h-4 w-4 mx-2" weight="bold" /></DrawerTrigger>
<DrawerContent>
<DrawerHeader>
<DrawerTitle>Sessions and Files</DrawerTitle>
Expand All @@ -742,13 +748,13 @@ export default function SidePanel(props: SidePanelProps) {
</DrawerContent>
</Drawer>
:
<div>
<button className={`ml-4 mr-4 ${styles.button}`} onClick={newConvo}>
{enabled ? <NotePencil className="h-7 w-7"/> : <NotePencil className="h-7 w-7" color="gray"/>}
</button>
<button className={styles.button} onClick={() => setEnabled(!enabled)}>
{enabled ? <Sidebar className="h-7 w-7"/> : <Sidebar className="ml-2 h-7 w-7" color="gray"/>}
</button>
<div className={`flex items-center ${enabled ? 'flex-row gap-2' : 'flex-col pt-2'}`}>
<Link className={` ${enabled ? 'ml-2' : ''}`} href="/">
{enabled ? <NotePencil className="h-6 w-6" /> : <NotePencil className="h-6 w-6" color="gray" />}
</Link>
<button className={styles.button} onClick={() => setEnabled(!enabled)}>
{enabled ? <Sidebar className="h-6 w-6" /> : <Sidebar className="h-6 w-6" color="gray" />}
</button>
</div>
}
</div>
Expand Down Expand Up @@ -778,7 +784,7 @@ export default function SidePanel(props: SidePanelProps) {
<Button variant="ghost"><StackPlus className="h-4 w-4 mr-1" />New Conversation</Button>
</Link>
<Link href={`/login?next=${encodeURIComponent(window.location.pathname)}`}> {/* Redirect to login page */}
<Button variant="default"><UserCirclePlus className="h-4 w-4 mr-1"/>Sign Up</Button>
<Button variant="default"><UserCirclePlus className="h-4 w-4 mr-1" />Sign Up</Button>
</Link>
</div>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ div.collapsed {
display: grid;
grid-template-columns: 1fr;
height: fit-content;
padding-top: 1rem;
padding-right: 0;
padding-bottom: 0;
padding-left: 1rem;
}

p.session {
Expand Down
Loading
Loading