From 8a52495fc56464362c7afe1bd2e94708815e2ab0 Mon Sep 17 00:00:00 2001 From: "Ng Wing Tat, David" Date: Fri, 25 Oct 2024 15:20:46 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=84=20Revamp=20signature=20banner=20(#?= =?UTF-8?q?1909)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ♻️ Refactor NFTBookSignatureBanner mockup * ✨ Revamp mockup in signature banner * 💫 Add signature animation * 💩 Use absolute position to mitigate Safari issue * 💄 Prevent mockup collapse by banner text * 💫 Animate signature page text * 💬 Update signature banner names & messages Co-authored-by: William Chong <6198816+williamchong@users.noreply.github.com> * 💫 Shuffle messages & names in signature banner --------- Co-authored-by: William Chong <6198816+williamchong@users.noreply.github.com> --- functions/package-lock.json | 14 ++ functions/package.json | 1 + .../NFTBook/SignatureBanner/Mockup.vue | 177 ++++++++++++++++++ .../NFTBook/SignatureBanner/device-frame.png | Bin 0 -> 18544 bytes .../NFTBook/SignatureBanner/index.vue | 54 +++++- .../SignatureBanner/signature-animation.json | 1 + .../NFTBook/SignatureBanner/signed-book.png | Bin 61020 -> 0 bytes src/package-lock.json | 14 ++ src/package.json | 1 + 9 files changed, 252 insertions(+), 10 deletions(-) create mode 100644 src/components/NFTBook/SignatureBanner/Mockup.vue create mode 100644 src/components/NFTBook/SignatureBanner/device-frame.png create mode 100644 src/components/NFTBook/SignatureBanner/signature-animation.json delete mode 100644 src/components/NFTBook/SignatureBanner/signed-book.png diff --git a/functions/package-lock.json b/functions/package-lock.json index f6c368ba8..2928fb466 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -51,6 +51,7 @@ "jwt-decode": "^4.0.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", + "lottie-web-vue": "^1.2.1", "lru-cache": "^10.0.0", "magic-grid": "^3.2.4", "marked": "^5.1.2", @@ -14713,6 +14714,19 @@ "loose-envify": "cli.js" } }, + "node_modules/lottie-web": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz", + "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==" + }, + "node_modules/lottie-web-vue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/lottie-web-vue/-/lottie-web-vue-1.2.1.tgz", + "integrity": "sha512-JwHb8x5zOBBOL4zObVgBIVmVDMBALo1zMP6/OR+gbEWDpQTpRndixjhjwiVvjUWlrZPl7ScUwiHQGwrn6qlfEw==", + "dependencies": { + "lottie-web": "^5.7.4" + } + }, "node_modules/lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", diff --git a/functions/package.json b/functions/package.json index 958468b8c..f69474ed4 100644 --- a/functions/package.json +++ b/functions/package.json @@ -58,6 +58,7 @@ "jwt-decode": "^4.0.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", + "lottie-web-vue": "^1.2.1", "lru-cache": "^10.0.0", "magic-grid": "^3.2.4", "marked": "^5.1.2", diff --git a/src/components/NFTBook/SignatureBanner/Mockup.vue b/src/components/NFTBook/SignatureBanner/Mockup.vue new file mode 100644 index 000000000..33c6c6457 --- /dev/null +++ b/src/components/NFTBook/SignatureBanner/Mockup.vue @@ -0,0 +1,177 @@ + + + diff --git a/src/components/NFTBook/SignatureBanner/device-frame.png b/src/components/NFTBook/SignatureBanner/device-frame.png new file mode 100644 index 0000000000000000000000000000000000000000..8f92ef3e657408dd56c47bc80b6e40c6bcd1729c GIT binary patch literal 18544 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 - + + + + + +
@@ -99,7 +138,6 @@