From 84be8c4b5ce350d829ec51c940054bfe3f433193 Mon Sep 17 00:00:00 2001 From: empty Date: Fri, 16 Jan 2026 15:15:17 +0800 Subject: [PATCH] feat: redesign Big Screen voting view with philatelic postcard UI - Add PostcardItem.vue component with Chinese postal aesthetics - Add PostcardGrid.vue container with 4x2 CSS Grid layout - Add Postmark.vue component for real-time vote stamp visualization - Update LiveVotingView.vue with cream paper theme (#FDFBF7) - Add Year of the Horse 2026 stamp image - Add responsive breakpoints for different screen sizes - Enhance admin service with program voting control - Add vote stamp accumulation for big screen display Co-Authored-By: Claude Opus 4.5 --- .../src/assets/images/stamp-horse-2026.png | Bin 0 -> 1114772 bytes .../client-mobile/src/components/Postmark.vue | 117 ++--- .../src/components/ProgramCard.vue | 94 +++- .../client-mobile/src/stores/connection.ts | 30 +- packages/client-mobile/src/stores/voting.ts | 86 ++++ packages/client-mobile/src/views/HomeView.vue | 14 +- packages/client-mobile/src/views/VoteView.vue | 97 +++- .../src/assets/images/stamp-horse-2026.png | Bin 0 -> 1114772 bytes .../src/components/PostcardDisplay.vue | 466 ++++++++++++++++++ .../src/components/PostcardGrid.vue | 154 ++++++ .../src/components/PostcardItem.vue | 354 +++++++++++++ .../client-screen/src/components/Postmark.vue | 139 ++++++ packages/client-screen/src/stores/admin.ts | 12 +- .../client-screen/src/views/AdminControl.vue | 59 +++ .../src/views/LiveVotingView.vue | 457 ++++++++--------- packages/server/src/services/admin.service.ts | 200 +++++++- packages/server/src/socket/index.ts | 111 ++++- packages/shared/src/types/admin.types.ts | 46 ++ packages/shared/src/types/socket.types.ts | 2 + 19 files changed, 2056 insertions(+), 382 deletions(-) create mode 100644 packages/client-mobile/src/assets/images/stamp-horse-2026.png create mode 100644 packages/client-screen/src/assets/images/stamp-horse-2026.png create mode 100644 packages/client-screen/src/components/PostcardDisplay.vue create mode 100644 packages/client-screen/src/components/PostcardGrid.vue create mode 100644 packages/client-screen/src/components/PostcardItem.vue create mode 100644 packages/client-screen/src/components/Postmark.vue diff --git a/packages/client-mobile/src/assets/images/stamp-horse-2026.png b/packages/client-mobile/src/assets/images/stamp-horse-2026.png new file mode 100644 index 0000000000000000000000000000000000000000..60ff07f9449f8dfd92bd373d08ed3af1a2f53253 GIT binary patch literal 1114772 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