@@ -128,6 +154,10 @@ function delay(ms: number): Promise
{
+
+
![邮票]()
+
+
{
color="red"
class="applied-stamp"
/>
-
- 贴票处
- PLACE STAMP HERE
-
@@ -177,7 +203,7 @@ $ink-charcoal: #333;
border-radius: 4px;
overflow: hidden;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
- transition: transform 0.2s ease, box-shadow 0.2s ease;
+ transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.3s ease;
// Entrance animation
animation: postcard-enter 0.5s ease-out backwards;
@@ -197,6 +223,43 @@ $ink-charcoal: #333;
background-color: color.adjust($paper-cream, $lightness: -2%);
}
}
+
+ &.is-current {
+ box-shadow: 0 4px 25px rgba($color-gold, 0.4), 0 0 0 3px $color-gold;
+ }
+
+ &.is-disabled {
+ opacity: 0.6;
+ pointer-events: none;
+ }
+}
+
+// Status Badge
+.status-badge {
+ position: absolute;
+ top: 8px;
+ left: 8px;
+ padding: 4px 10px;
+ border-radius: 4px;
+ font-size: 10px;
+ font-weight: 600;
+ z-index: 5;
+
+ &.voting {
+ background: $color-gold;
+ color: #000;
+ animation: pulse-badge 1.5s ease-in-out infinite;
+ }
+
+ &.completed {
+ background: rgba(0, 0, 0, 0.5);
+ color: #fff;
+ }
+}
+
+@keyframes pulse-badge {
+ 0%, 100% { opacity: 1; }
+ 50% { opacity: 0.7; }
}
.paper-texture {
@@ -334,13 +397,24 @@ $ink-charcoal: #333;
width: 70px;
height: 70px;
display: flex;
- align-items: center;
- justify-content: center;
+ align-items: flex-start;
+ justify-content: flex-end;
+}
+
+.stamp-image {
+ width: 60px;
+ height: 60px;
+ object-fit: contain;
+ border: 1px solid rgba(0, 0, 0, 0.1);
}
.applied-stamp {
+ position: absolute;
+ bottom: -5px;
+ left: -10px;
mix-blend-mode: multiply;
- transform: rotate(5deg);
+ transform: rotate(-8deg);
+ z-index: 2;
}
.stamp-placeholder {
diff --git a/packages/client-mobile/src/stores/connection.ts b/packages/client-mobile/src/stores/connection.ts
index 673e58c..4912db9 100644
--- a/packages/client-mobile/src/stores/connection.ts
+++ b/packages/client-mobile/src/stores/connection.ts
@@ -7,6 +7,7 @@ import type {
ConnectionAckPayload,
VoteCategory,
SyncStatePayload,
+ AdminState,
} from '@gala/shared/types';
import { SOCKET_EVENTS } from '@gala/shared/constants';
import { CONFIG } from '@gala/shared/constants';
@@ -24,6 +25,7 @@ export const useConnectionStore = defineStore('connection', () => {
const reconnectAttempts = ref(0);
const userId = ref