Compare commits
No commits in common. "e03d91ece9c23f9ed3cf1bbfd007972f1c9d6de4" and "1ccac024a4a1fd225315c66d7ecca05ac6ff38d8" have entirely different histories.
e03d91ece9
...
1ccac024a4
2 changed files with 7 additions and 27 deletions
|
|
@ -201,7 +201,7 @@ const cardStyle = computed(() => {
|
||||||
'transparent'
|
'transparent'
|
||||||
|
|
||||||
return {
|
return {
|
||||||
transform: `translate(${deltaX.value}px, ${deltaY.value - 80}px) scale(0.55)`,
|
transform: `translate(${deltaX.value}px, ${deltaY.value}px) scale(0.35)`,
|
||||||
borderRadius: '50%',
|
borderRadius: '50%',
|
||||||
background: aura,
|
background: aura,
|
||||||
transition: 'border-radius 150ms ease, background 150ms ease',
|
transition: 'border-radius 150ms ease, background 150ms ease',
|
||||||
|
|
@ -230,7 +230,6 @@ const cardStyle = computed(() => {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
overflow: visible; /* ball must escape the collapsed stack bounds */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-stack.bucket-mode .card-shadow {
|
.card-stack.bucket-mode .card-shadow {
|
||||||
|
|
@ -270,10 +269,6 @@ const cardStyle = computed(() => {
|
||||||
}
|
}
|
||||||
.card-wrapper.is-held {
|
.card-wrapper.is-held {
|
||||||
cursor: grabbing;
|
cursor: grabbing;
|
||||||
/* Override bucket-mode clip and opacity so the held ball renders cleanly */
|
|
||||||
clip-path: none !important;
|
|
||||||
opacity: 1 !important;
|
|
||||||
pointer-events: auto !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dismissal animations — dismiss class is only applied during the motion.rich await window,
|
/* Dismissal animations — dismiss class is only applied during the motion.rich await window,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="label-view">
|
<div class="label-view">
|
||||||
<!-- Header bar -->
|
<!-- Header bar -->
|
||||||
<header class="lv-header" :class="{ 'is-held': isHeld }">
|
<header class="lv-header">
|
||||||
<span class="queue-count">
|
<span class="queue-count">
|
||||||
<span v-if="loading" class="queue-status">Loading…</span>
|
<span v-if="loading" class="queue-status">Loading…</span>
|
||||||
<template v-else-if="store.totalRemaining > 0">
|
<template v-else-if="store.totalRemaining > 0">
|
||||||
|
|
@ -54,7 +54,7 @@
|
||||||
>→</div>
|
>→</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
<div class="card-stack-wrapper" :class="{ 'is-held': isHeld }">
|
<div class="card-stack-wrapper">
|
||||||
<EmailCardStack
|
<EmailCardStack
|
||||||
:item="store.current"
|
:item="store.current"
|
||||||
:is-bucket-mode="isHeld"
|
:is-bucket-mode="isHeld"
|
||||||
|
|
@ -314,8 +314,7 @@ onUnmounted(() => {
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
max-width: 640px;
|
max-width: 640px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
height: 100dvh; /* hard cap — prevents grid from drifting below fold */
|
min-height: 100dvh;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.queue-status {
|
.queue-status {
|
||||||
|
|
@ -329,11 +328,6 @@ onUnmounted(() => {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 0.75rem;
|
gap: 0.75rem;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
transition: opacity 200ms ease;
|
|
||||||
}
|
|
||||||
.lv-header.is-held {
|
|
||||||
opacity: 0.2;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.queue-count {
|
.queue-count {
|
||||||
|
|
@ -424,33 +418,24 @@ onUnmounted(() => {
|
||||||
|
|
||||||
.card-stack-wrapper {
|
.card-stack-wrapper {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: 0; /* allow flex child to shrink — default auto prevents this */
|
/* Give bottom breathing room so grid doesn't overlap content */
|
||||||
overflow-y: auto;
|
|
||||||
padding-bottom: 0.5rem;
|
padding-bottom: 0.5rem;
|
||||||
transition: opacity 200ms ease;
|
|
||||||
}
|
|
||||||
/* When held: escape the overflow clip so the ball floats freely,
|
|
||||||
and rise above the footer (z-index 10) so the ball is visible. */
|
|
||||||
.card-stack-wrapper.is-held {
|
|
||||||
overflow: visible;
|
|
||||||
position: relative;
|
|
||||||
z-index: 20;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bucket grid stays pinned to the bottom of the viewport while the email card
|
/* Bucket grid stays pinned to the bottom of the viewport while the email card
|
||||||
can be scrolled freely. "hired" (10th button) may clip on very small screens
|
can be scrolled freely. "hired" (10th button) may clip on very small screens
|
||||||
— that is intentional per design. */
|
— that is intentional per design. */
|
||||||
.bucket-grid-footer {
|
.bucket-grid-footer {
|
||||||
|
position: sticky;
|
||||||
|
bottom: 0;
|
||||||
background: var(--color-bg, var(--color-surface, #f0f4fc));
|
background: var(--color-bg, var(--color-surface, #f0f4fc));
|
||||||
padding: 0.5rem 0 0.75rem;
|
padding: 0.5rem 0 0.75rem;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
transition: transform 250ms cubic-bezier(0.34, 1.56, 0.64, 1),
|
transition: transform 250ms cubic-bezier(0.34, 1.56, 0.64, 1),
|
||||||
opacity 200ms ease,
|
|
||||||
background 200ms ease;
|
background 200ms ease;
|
||||||
}
|
}
|
||||||
.bucket-grid-footer.grid-active {
|
.bucket-grid-footer.grid-active {
|
||||||
transform: translateY(-8px);
|
transform: translateY(-8px);
|
||||||
opacity: 0.45; /* semi-transparent so ball aura is visible through it */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Toss edge zones ── */
|
/* ── Toss edge zones ── */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue