diff --git a/web/src/client/components/session-list.ts b/web/src/client/components/session-list.ts
index ca196502..fe446df8 100644
--- a/web/src/client/components/session-list.ts
+++ b/web/src/client/components/session-list.ts
@@ -219,7 +219,7 @@ export class SessionList extends LitElement {
`
: html`
-
+
${repeat(
filteredSessions,
(session) => session.id,
diff --git a/web/src/client/styles.css b/web/src/client/styles.css
index 9da47eb6..265a6e6b 100644
--- a/web/src/client/styles.css
+++ b/web/src/client/styles.css
@@ -104,6 +104,32 @@
.form-label {
@apply text-dark-text-muted text-sm font-medium mb-2 flex items-center gap-2;
}
+
+ /* Responsive session flex layout */
+ .session-flex-responsive {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ padding: 0 0.5rem;
+ justify-content: flex-start;
+ }
+
+ .session-flex-responsive > * {
+ flex: 1 1 auto;
+ min-width: 300px;
+ max-width: 500px;
+ }
+
+ @media (max-width: 420px) {
+ .session-flex-responsive {
+ padding: 0 0.25rem;
+ }
+
+ .session-flex-responsive > * {
+ min-width: 100%;
+ max-width: 100%;
+ }
+ }
}
/* Fira Code Variable Font */
@@ -767,25 +793,31 @@ body {
/* View Transitions for Create Session */
::view-transition-old(create-session-button),
::view-transition-new(create-session-button) {
- animation-duration: 0.15s;
+ animation-duration: 0.25s;
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
::view-transition-old(create-session-modal),
::view-transition-new(create-session-modal) {
- animation-duration: 0.15s;
- animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ /* Handled by individual animations below */
+ mix-blend-mode: normal;
+ z-index: 1000;
}
- /* Custom morph animation from button to modal */
+ /* Custom morph animation from button to modal with spring effect */
@keyframes expand-from-button {
- from {
+ 0% {
transform: scale(0)
translate(calc(var(--vt-button-x) - 50vw), calc(var(--vt-button-y) - 50vh));
opacity: 0;
border-radius: 0.5rem;
}
- to {
+ 85% {
+ transform: scale(1.03) translate(0, 0);
+ opacity: 1;
+ border-radius: 0.75rem;
+ }
+ 100% {
transform: scale(1) translate(0, 0);
opacity: 1;
border-radius: 0.75rem;
@@ -793,24 +825,26 @@ body {
}
@keyframes shrink-to-button {
- from {
+ 0% {
transform: scale(1) translate(0, 0);
opacity: 1;
+ border-radius: 0.75rem;
}
- to {
+ 100% {
transform: scale(0)
translate(calc(var(--vt-button-x) - 50vw), calc(var(--vt-button-y) - 50vh));
opacity: 0;
+ border-radius: 0.5rem;
}
}
/* Apply the custom animations */
::view-transition-new(create-session-modal) {
- animation: expand-from-button 0.15s cubic-bezier(0.4, 0, 0.2, 1);
+ animation: expand-from-button 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
::view-transition-old(create-session-modal) {
- animation: shrink-to-button 0.15s cubic-bezier(0.4, 0, 0.2, 1);
+ animation: shrink-to-button 0.25s cubic-bezier(0.4, 0, 0.6, 1);
}
/* Hide button during forward transition */
@@ -830,7 +864,12 @@ body {
/* Ensure smooth backdrop fade */
.modal-backdrop {
- animation: fade-in 0.15s ease-out;
+ animation: fade-in 0.3s ease-out;
+ }
+
+ /* During close transition, fade backdrop out faster */
+ ::view-transition-old(create-session-modal) ~ .modal-backdrop {
+ animation: fade-out 0.25s ease-out;
}
@keyframes fade-in {