QR code SDK Redesign (#1536)

* Refactor NFC scanner tests to use a global variable for platform OS, allowing dynamic switching between iOS and Android during tests. This change improves test isolation and avoids hoisting issues with jest.mock.

* Triggering GitHub workflows

* Add status animations and self logos

* Update utilities and styles for statuses

* Remove old LED implementation and occurences

* Update Self QR Code with new design

* Add status banner

* Remove console and use QRcodeSteps in styles

* Add ARIA and use Memo to prevent re-renders

* Add refs for success and error callbacks

* Use ref for self app in qrcode

* Use selfapp ref consistently

* Update connected state animtion

* Skip 'parses Android response' test in nfcScanner

---------

Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
Co-authored-by: Javier Cortejoso <javier.cortejoso@gmail.com>
This commit is contained in:
Kartik Mehta
2026-01-21 18:37:24 +05:30
committed by GitHub
parent a0c67458a9
commit bebaebc872
20 changed files with 2774 additions and 1921 deletions

View File

@@ -101,3 +101,4 @@ We are actively looking for contributors. Please check the [open issues](https:/
Thanks [Rémi](https://github.com/remicolin), [Florent](https://github.com/0xturboblitz), [Ayman](https://github.com/Nesopie), [Justin](https://github.com/transphorm), [Seshanth](https://github.com/seshanthS), [Nico](https://github.com/motemotech) and all other contributors for building Self.
Thanks [Aayush](https://twitter.com/yush_g), [Vivek](https://twitter.com/viv_boop), [Andy](https://twitter.com/AndyGuzmanEth) and [Vitalik](https://github.com/vbuterin) for contributing ideas and inspiring us to build this technology, and [PSE](https://pse.dev/) for supporting the initial work through grants!

View File

@@ -1,506 +0,0 @@
{
"v": "5.7.12",
"fr": 24,
"ip": 0,
"op": 63,
"w": 520,
"h": 520,
"nm": "Checklist 2",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Checklist",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 50,
"s": [100]
},
{ "t": 62, "s": [0] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [259.587, 260.119, 0], "ix": 2, "l": 2 },
"a": { "a": 0, "k": [297.587, 298.119, 0], "ix": 1, "l": 2 },
"s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[54.754, -36.121],
[-17.487, 36.12],
[-54.754, -1.147]
],
"c": false
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "st",
"c": { "a": 0, "k": [1, 1, 1, 1], "ix": 3 },
"o": { "a": 0, "k": 100, "ix": 4 },
"w": { "a": 0, "k": 23, "ix": 5 },
"lc": 2,
"lj": 2,
"bm": 0,
"nm": "Stroke 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "tr",
"p": { "a": 0, "k": [294.971, 298.679], "ix": 2 },
"a": { "a": 0, "k": [0, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100], "ix": 3 },
"r": { "a": 0, "k": 0, "ix": 6 },
"o": { "a": 0, "k": 100, "ix": 7 },
"sk": { "a": 0, "k": 0, "ix": 4 },
"sa": { "a": 0, "k": 0, "ix": 5 },
"nm": "Transform"
}
],
"nm": "Group 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
},
{
"ty": "tm",
"s": {
"a": 1,
"k": [
{ "i": { "x": [0], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 24, "s": [100] },
{ "t": 36, "s": [0] }
],
"ix": 1
},
"e": { "a": 0, "k": 100, "ix": 2 },
"o": { "a": 0, "k": 0, "ix": 3 },
"m": 1,
"ix": 2,
"nm": "Trim Paths 1",
"mn": "ADBE Vector Filter - Trim",
"hd": false
}
],
"ip": 0,
"op": 720,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Cricle",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 50,
"s": [100]
},
{ "t": 62, "s": [0] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [260, 260, 0], "ix": 2, "l": 2 },
"a": { "a": 0, "k": [-7.627, -7.691, 0], "ix": 1, "l": 2 },
"s": {
"a": 1,
"k": [
{
"i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
"o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] },
"t": 18,
"s": [124.222, 124.222, 100]
},
{
"i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
"o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
"t": 20,
"s": [134.222, 134.222, 100]
},
{
"i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] },
"o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
"t": 22,
"s": [114.222, 114.222, 100]
},
{ "t": 24, "s": [124.222, 124.222, 100] }
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"d": 1,
"ty": "el",
"s": { "a": 0, "k": [178.46, 178.46], "ix": 2 },
"p": { "a": 0, "k": [0, 0], "ix": 3 },
"nm": "Ellipse Path 1",
"mn": "ADBE Vector Shape - Ellipse",
"hd": false
},
{
"ty": "tm",
"s": { "a": 0, "k": 0, "ix": 1 },
"e": {
"a": 1,
"k": [
{
"i": { "x": [0.239], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 0,
"s": [0]
},
{ "t": 24, "s": [100] }
],
"ix": 2
},
"o": { "a": 0, "k": 0, "ix": 3 },
"m": 1,
"ix": 2,
"nm": "Trim Paths 1",
"mn": "ADBE Vector Filter - Trim",
"hd": false
},
{
"ty": "st",
"c": { "a": 0, "k": [0.3137, 0.7569, 0.3294, 1], "ix": 3 },
"o": { "a": 0, "k": 100, "ix": 4 },
"w": { "a": 0, "k": 10, "ix": 5 },
"lc": 2,
"lj": 2,
"bm": 0,
"nm": "Stroke 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.3137, 0.7569, 0.3294, 1], "ix": 4 },
"o": {
"a": 1,
"k": [
{
"i": { "x": [0], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 22,
"s": [0]
},
{ "t": 24, "s": [100] }
],
"ix": 5
},
"r": 1,
"bm": 0,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": { "a": 0, "k": [-7.627, -7.691], "ix": 2 },
"a": { "a": 0, "k": [0, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100], "ix": 3 },
"r": { "a": 0, "k": 0, "ix": 6 },
"o": { "a": 0, "k": 100, "ix": 7 },
"sk": { "a": 0, "k": 0, "ix": 4 },
"sa": { "a": 0, "k": 0, "ix": 5 },
"nm": "Transform"
}
],
"nm": "Ellipse 1",
"np": 4,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 0,
"op": 720,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Line",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 28, "s": [0] },
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 39,
"s": [100]
},
{ "t": 50, "s": [0] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [260, 260, 0], "ix": 2, "l": 2 },
"a": { "a": 0, "k": [298, 298, 0], "ix": 1, "l": 2 },
"s": {
"a": 1,
"k": [
{
"i": { "x": [0, 0, 0.667], "y": [1, 1, 1] },
"o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
"t": 28,
"s": [46, 46, 100]
},
{ "t": 50, "s": [100, 100, 100] }
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[-120.208, 0],
[0, -120.208],
[120.207, 0],
[0, 120.208]
],
"o": [
[120.207, 0],
[0, 120.208],
[-120.208, 0],
[0, -120.208]
],
"v": [
[0, -217.655],
[217.655, 0],
[0, 217.655],
[-217.655, 0]
],
"c": true
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "st",
"c": { "a": 0, "k": [0.6516, 0.8284, 0.6575, 1], "ix": 3 },
"o": { "a": 0, "k": 100, "ix": 4 },
"w": { "a": 0, "k": 2, "ix": 5 },
"lc": 1,
"lj": 1,
"ml": 10,
"bm": 0,
"nm": "Stroke 1",
"mn": "ADBE Vector Graphic - Stroke",
"hd": false
},
{
"ty": "tr",
"p": { "a": 0, "k": [297.587, 298.119], "ix": 2 },
"a": { "a": 0, "k": [0, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100], "ix": 3 },
"r": { "a": 0, "k": 0, "ix": 6 },
"o": { "a": 0, "k": 100, "ix": 7 },
"sk": { "a": 0, "k": 0, "ix": 4 },
"sa": { "a": 0, "k": 0, "ix": 5 },
"nm": "Transform"
}
],
"nm": "Group 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 28,
"op": 720,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 4,
"nm": "Shadow",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 22, "s": [0] },
{
"i": { "x": [0.667], "y": [1] },
"o": { "x": [0.333], "y": [0] },
"t": 33,
"s": [100]
},
{ "t": 44, "s": [0] }
],
"ix": 11
},
"r": { "a": 0, "k": 0, "ix": 10 },
"p": { "a": 0, "k": [260, 260, 0], "ix": 2, "l": 2 },
"a": { "a": 0, "k": [298, 298, 0], "ix": 1, "l": 2 },
"s": {
"a": 1,
"k": [
{
"i": { "x": [0, 0, 0.667], "y": [1, 1, 1] },
"o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] },
"t": 22,
"s": [60, 60, 100]
},
{ "t": 44, "s": [100, 100, 100] }
],
"ix": 6,
"l": 2
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ind": 0,
"ty": "sh",
"ix": 1,
"ks": {
"a": 0,
"k": {
"i": [
[-94.797, 0],
[0, -94.797],
[94.797, 0],
[0, 94.798]
],
"o": [
[94.797, 0],
[0, 94.798],
[-94.797, 0],
[0, -94.797]
],
"v": [
[0, -171.646],
[171.646, 0],
[0, 171.646],
[-171.646, 0]
],
"c": true
},
"ix": 2
},
"nm": "Path 1",
"mn": "ADBE Vector Shape - Group",
"hd": false
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.8936, 0.9464, 0.8954, 1], "ix": 4 },
"o": { "a": 0, "k": 100, "ix": 5 },
"r": 1,
"bm": 0,
"nm": "Fill 1",
"mn": "ADBE Vector Graphic - Fill",
"hd": false
},
{
"ty": "tr",
"p": { "a": 0, "k": [297.587, 298.119], "ix": 2 },
"a": { "a": 0, "k": [0, 0], "ix": 1 },
"s": { "a": 0, "k": [100, 100], "ix": 3 },
"r": { "a": 0, "k": 0, "ix": 6 },
"o": { "a": 0, "k": 100, "ix": 7 },
"sk": { "a": 0, "k": 0, "ix": 4 },
"sa": { "a": 0, "k": 0, "ix": 5 },
"nm": "Transform"
}
],
"nm": "Group 1",
"np": 2,
"cix": 2,
"bm": 0,
"ix": 1,
"mn": "ADBE Vector Group",
"hd": false
}
],
"ip": 22,
"op": 720,
"st": 0,
"bm": 0
}
],
"markers": []
}

View File

@@ -0,0 +1,6 @@
import statusConnecting from './status-connecting.json' with { type: 'json' };
import statusError from './status-error.json' with { type: 'json' };
import statusFailed from './status-failed.json' with { type: 'json' };
import statusSuccess from './status-success.json' with { type: 'json' };
export { statusConnecting, statusError, statusFailed, statusSuccess };

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,712 @@
{
"nm": "newScene",
"ddd": 0,
"h": 93,
"w": 93,
"meta": { "g": "SVG to Lottie" },
"layers": [
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [],
"ind": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [46, 46.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [4, 11] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 3.5
},
{ "s": [100, 100], "t": 20 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 3.5
},
{ "s": [0, 0], "t": 20 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 3.5 },
{ "s": [100], "t": 20 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [46, 56] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [4, 4] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 3
},
{ "s": [100, 100], "t": 17.5 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 3
},
{ "s": [0, 0], "t": 17.5 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 3 },
{ "s": [100], "t": 17.5 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[46.3205, 31],
[63.641, 61],
[29, 61],
[46.3205, 31]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0.9922, 0.8784, 0.2784] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2.5
},
{ "s": [100, 100], "t": 15 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2.5
},
{ "s": [0, 0], "t": 15 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 2.5 },
{ "s": [100], "t": 15 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0.8000000000000043, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0.8000000000000043],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[62.42, 36.38],
[62.42, 60.65],
[60.98, 62.09],
[36.71, 62.09],
[16.79, 82.01],
[64.78, 82.01],
[82, 64.79],
[82, 36.39],
[62.42, 36.39],
[62.42, 36.38]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2
},
{ "s": [100, 100], "t": 12.5 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2
},
{ "s": [0, 0], "t": 12.5 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 2 },
{ "s": [100], "t": 12.5 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[-0.8000000000000007, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, -0.8000000000000007],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[29.58, 30.69],
[31.02, 29.25],
[55.96, 29.25],
[75.21, 10],
[27.22, 10],
[10, 27.22],
[10, 55.55],
[29.58, 55.55],
[29.58, 30.68],
[29.58, 30.69]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1.5
},
{ "s": [100, 100], "t": 10 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1.5
},
{ "s": [0, 0], "t": 10 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 1.5 },
{ "s": [100], "t": 10 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [37, 55.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1
},
{ "s": [100, 100], "t": 7.5 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1
},
{ "s": [0, 0], "t": 7.5 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 1 },
{ "s": [100], "t": 7.5 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [55, 36.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0.5
},
{ "s": [100, 100], "t": 5 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0.5
},
{ "s": [0, 0], "t": 5 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 0.5 },
{ "s": [100], "t": 5 }
]
}
}
]
}
],
"ind": 2,
"parent": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [46.0817, 46.0817] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [92.1634, 92.1634] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [1, 1, 1] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0
},
{ "s": [100, 100], "t": 2.5 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0
},
{ "s": [0, 0], "t": 2.5 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 0 },
{ "s": [100], "t": 2.5 }
]
}
}
]
}
],
"ind": 3,
"parent": 1
}
],
"v": "5.7.0",
"fr": 60,
"op": 50,
"ip": 0,
"assets": []
}

View File

@@ -0,0 +1,704 @@
{
"nm": "newScene",
"ddd": 0,
"h": 93,
"w": 93,
"meta": { "g": "SVG to Lottie" },
"layers": [
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [],
"ind": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[52, 57.3333],
[57.6667, 51.6666],
[40.6667, 34.6666],
[35, 40.3333],
[52, 57.3333]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0.9373, 0.2667, 0.2667] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 3.428571428571429
},
{ "s": [100, 100], "t": 20 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 3.428571428571429
},
{ "s": [0, 0], "t": 20 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 3.428571428571429
},
{ "s": [100], "t": 20 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[57.6667, 40.3333],
[52, 34.6666],
[35, 51.6666],
[40.6667, 57.3333],
[57.6667, 40.3333]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0.9373, 0.2667, 0.2667] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2.857142857142858
},
{ "s": [100, 100], "t": 17.142857142857142 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2.857142857142858
},
{ "s": [0, 0], "t": 17.142857142857142 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 2.857142857142858
},
{ "s": [100], "t": 17.142857142857142 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0.8000000000000043, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0.8000000000000043],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[62.42, 36.38],
[62.42, 60.65],
[60.98, 62.09],
[36.71, 62.09],
[16.79, 82.01],
[64.78, 82.01],
[82, 64.79],
[82, 36.39],
[62.42, 36.39],
[62.42, 36.38]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2.285714285714286
},
{ "s": [100, 100], "t": 14.285714285714286 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2.285714285714286
},
{ "s": [0, 0], "t": 14.285714285714286 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 2.285714285714286
},
{ "s": [100], "t": 14.285714285714286 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[-0.8000000000000007, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, -0.8000000000000007],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[29.58, 30.69],
[31.02, 29.25],
[55.96, 29.25],
[75.21, 10],
[27.22, 10],
[10, 27.22],
[10, 55.55],
[29.58, 55.55],
[29.58, 30.68],
[29.58, 30.69]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1.714285714285714
},
{ "s": [100, 100], "t": 11.428571428571427 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1.714285714285714
},
{ "s": [0, 0], "t": 11.428571428571427 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 1.714285714285714
},
{ "s": [100], "t": 11.428571428571427 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [37, 55.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1.142857142857143
},
{ "s": [100, 100], "t": 8.571428571428571 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1.142857142857143
},
{ "s": [0, 0], "t": 8.571428571428571 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 1.142857142857143
},
{ "s": [100], "t": 8.571428571428571 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [55, 36.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0.571428571428571
},
{ "s": [100, 100], "t": 5.714285714285714 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0.571428571428571
},
{ "s": [0, 0], "t": 5.714285714285714 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 0.571428571428571
},
{ "s": [100], "t": 5.714285714285714 }
]
}
}
]
}
],
"ind": 2,
"parent": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [46.0817, 46.0817] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [92.1634, 92.1634] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [1, 1, 1] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0
},
{ "s": [100, 100], "t": 2.857142857142857 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0
},
{ "s": [0, 0], "t": 2.857142857142857 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 0 },
{ "s": [100], "t": 2.857142857142857 }
]
}
}
]
}
],
"ind": 3,
"parent": 1
}
],
"v": "5.7.0",
"fr": 60,
"op": 50,
"ip": 0,
"assets": []
}

View File

@@ -0,0 +1,704 @@
{
"nm": "newScene",
"ddd": 0,
"h": 93,
"w": 93,
"meta": { "g": "SVG to Lottie" },
"layers": [
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [],
"ind": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[49, 51.6666],
[37.6667, 40.3333],
[32, 46],
[43.3333, 57.3333],
[49, 51.6666]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 1, 0.7137] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 3.428571428571429
},
{ "s": [100, 100], "t": 20 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 3.428571428571429
},
{ "s": [0, 0], "t": 20 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 3.428571428571429
},
{ "s": [100], "t": 20 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[60.3333, 40.3334],
[54.6667, 34.6667],
[37.6667, 51.6667],
[43.3333, 57.3334],
[60.3333, 40.3334]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 1, 0.7137] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2.857142857142858
},
{ "s": [100, 100], "t": 17.142857142857142 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2.857142857142858
},
{ "s": [0, 0], "t": 17.142857142857142 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 2.857142857142858
},
{ "s": [100], "t": 17.142857142857142 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[0, 0],
[0.8000000000000043, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, 0],
[0, 0.8000000000000043],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[62.42, 36.38],
[62.42, 60.65],
[60.98, 62.09],
[36.71, 62.09],
[16.79, 82.01],
[64.78, 82.01],
[82, 64.79],
[82, 36.39],
[62.42, 36.39],
[62.42, 36.38]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 2.285714285714286
},
{ "s": [100, 100], "t": 14.285714285714286 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 2.285714285714286
},
{ "s": [0, 0], "t": 14.285714285714286 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 2.285714285714286
},
{ "s": [100], "t": 14.285714285714286 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "sh",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"ks": {
"a": 0,
"k": {
"c": true,
"i": [
[0, 0],
[-0.8000000000000007, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"o": [
[0, -0.8000000000000007],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0]
],
"v": [
[29.58, 30.69],
[31.02, 29.25],
[55.96, 29.25],
[75.21, 10],
[27.22, 10],
[10, 27.22],
[10, 55.55],
[29.58, 55.55],
[29.58, 30.68],
[29.58, 30.69]
]
}
}
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1.714285714285714
},
{ "s": [100, 100], "t": 11.428571428571427 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1.714285714285714
},
{ "s": [0, 0], "t": 11.428571428571427 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 1.714285714285714
},
{ "s": [100], "t": 11.428571428571427 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [37, 55.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 1.142857142857143
},
{ "s": [100, 100], "t": 8.571428571428571 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 1.142857142857143
},
{ "s": [0, 0], "t": 8.571428571428571 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 1.142857142857143
},
{ "s": [100], "t": 8.571428571428571 }
]
}
}
]
},
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [55, 36.5] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [54, 53] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [0, 0, 0] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0.571428571428571
},
{ "s": [100, 100], "t": 5.714285714285714 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0.571428571428571
},
{ "s": [0, 0], "t": 5.714285714285714 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0],
"t": 0.571428571428571
},
{ "s": [100], "t": 5.714285714285714 }
]
}
}
]
}
],
"ind": 2,
"parent": 1
},
{
"ty": 4,
"nm": "",
"sr": 1,
"st": 0,
"op": 50,
"ip": 0,
"hd": false,
"ddd": 0,
"bm": 0,
"hasMask": false,
"ao": 0,
"ks": {
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"sk": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0] },
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
},
"ef": [],
"shapes": [
{
"ty": "gr",
"bm": 0,
"hd": false,
"nm": "",
"it": [
{
"ty": "rc",
"bm": 0,
"hd": false,
"nm": "",
"d": 1,
"p": { "a": 0, "k": [46.0817, 46.0817] },
"r": { "a": 0, "k": 0 },
"s": { "a": 0, "k": [92.1634, 92.1634] }
},
{
"ty": "fl",
"bm": 0,
"hd": false,
"nm": "",
"c": { "a": 0, "k": [1, 1, 1] },
"r": 1,
"o": { "a": 0, "k": 100 }
},
{
"ty": "tr",
"a": { "a": 0, "k": [0, 0] },
"s": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [0, 0],
"t": 0
},
{ "s": [100, 100], "t": 2.857142857142857 }
]
},
"sk": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{
"o": { "x": 0.34, "y": 1.55 },
"i": { "x": 0.65, "y": 1 },
"s": [46.5, 46.5],
"t": 0
},
{ "s": [0, 0], "t": 2.857142857142857 }
]
},
"r": { "a": 0, "k": 0 },
"sa": { "a": 0, "k": 0 },
"o": {
"a": 1,
"k": [
{ "o": { "x": 0.34, "y": 1.55 }, "i": { "x": 0.65, "y": 1 }, "s": [0], "t": 0 },
{ "s": [100], "t": 2.857142857142857 }
]
}
}
]
}
],
"ind": 3,
"parent": 1
}
],
"v": "5.7.0",
"fr": 60,
"op": 50,
"ip": 0,
"assets": []
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
<svg width="92" height="92" viewBox="0 0 92 92" fill="none" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none">
<rect x="0" y="0" width="92" height="92" fill="white"/>
<path d="M29.4862 38.0341C29.4862 32.8577 33.6281 28.6604 38.7362 28.6604H56.599L76.3837 8.61108H27.0606L9.3623 26.5461V56.0524H29.4862V38.0237V38.0341Z" fill="black"/>
<path d="M63.2384 36.0864V53.4903C63.2384 58.6666 59.0965 62.864 53.9884 62.864H36.8142L16.3409 83.6111H65.664L83.3623 65.6761V36.0968H63.2384V36.0864Z" fill="black"/>
<path d="M46.3726 37.3923H46.3623C41.6113 37.3923 37.7598 41.2959 37.7598 46.1111V46.1215C37.7598 50.9367 41.6113 54.8403 46.3623 54.8403H46.3726C51.1236 54.8403 54.9751 50.9367 54.9751 46.1215V46.1111C54.9751 41.2959 51.1236 37.3923 46.3726 37.3923Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 790 B

View File

@@ -0,0 +1,5 @@
<svg width="47" height="46" viewBox="0 0 47 46" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.7814 13.2168C12.7814 12.7057 13.1992 12.2969 13.7214 12.2969H30.0017L42.5676 0H11.2408L0 11.0001V29.0973H12.7814V13.2104V13.2168Z" fill="white"/>
<path d="M34.2186 16.8515V32.3552C34.2186 32.8663 33.8008 33.2751 33.2786 33.2751H17.4357L4.43236 46H35.7592L47 34.9999V16.8579H34.2186V16.8515Z" fill="white"/>
<path d="M28.9703 17.6525H18.0362V28.3539H28.9703V17.6525Z" fill="#00FFB6"/>
</svg>

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -1,40 +0,0 @@
import React from 'react';
import { QRcodeSteps } from '../utils/utils.js';
interface LEDProps {
size?: number;
connectionStatus?: number;
}
const green = '#31F040';
const blue = '#424AD8';
const gray = '#95a5a6';
const LED: React.FC<LEDProps> = ({ size = 8, connectionStatus = QRcodeSteps.DISCONNECTED }) => {
const getColor = () => {
if (connectionStatus >= QRcodeSteps.MOBILE_CONNECTED) {
return green;
} else if (connectionStatus >= QRcodeSteps.WAITING_FOR_MOBILE) {
return blue;
} else {
return gray;
}
};
return (
<div
style={{
width: `${size}px`,
height: `${size}px`,
borderRadius: '50%',
backgroundColor: getColor(),
boxShadow: `0 0 ${size * 1.5}px ${getColor()}`,
transition: 'all 0.3s ease',
marginBottom: '8px',
}}
/>
);
};
export default LED;

View File

@@ -0,0 +1,67 @@
import Lottie from 'lottie-react';
import { QRCodeSVG } from 'qrcode.react';
import React, { memo } from 'react';
import { qrAnimationOverlayStyle, qrContainerStyle } from '../utils/styles.js';
import { getStatusAnimation, getStatusIcon, QRcodeSteps } from '../utils/utils.js';
const LottieComponent = Lottie.default || Lottie;
const QR_IMAGE_SIZE_RATIO = 0.32;
interface QRCodeProps {
value: string;
size: number;
darkMode: boolean;
proofStep: number;
}
const QRCode = memo(({ value, size, darkMode, proofStep }: QRCodeProps) => {
const isInitialState =
proofStep === QRcodeSteps.DISCONNECTED || proofStep === QRcodeSteps.WAITING_FOR_MOBILE;
const isConnectingState =
proofStep === QRcodeSteps.MOBILE_CONNECTED ||
proofStep === QRcodeSteps.PROOF_GENERATION_STARTED ||
proofStep === QRcodeSteps.PROOF_GENERATED;
const showAnimation = !isInitialState;
const statusIcon = getStatusIcon(proofStep);
const bgColor = darkMode ? '#000000' : '#ffffff';
const fgColor = darkMode ? '#ffffff' : '#000000';
const imageSize = size * QR_IMAGE_SIZE_RATIO;
return (
<div style={qrContainerStyle(size)}>
<QRCodeSVG
value={value}
size={size}
bgColor={bgColor}
fgColor={fgColor}
level="H"
imageSettings={
statusIcon
? {
src: statusIcon,
height: imageSize,
width: imageSize,
excavate: true,
}
: undefined
}
/>
{showAnimation && (
<div style={qrAnimationOverlayStyle(imageSize)}>
{/* @ts-expect-error Lottie typings don't match the default export shape */}
<LottieComponent
animationData={getStatusAnimation(proofStep)}
loop={isConnectingState}
speed={1}
/>
</div>
)}
</div>
);
});
export default QRCode;

View File

@@ -1,19 +1,13 @@
import type { SelfApp } from '@selfxyz/sdk-common';
import { getUniversalLink, REDIRECT_URL, WS_DB_RELAYER } from '@selfxyz/sdk-common';
import Lottie from 'lottie-react';
import { QRCodeSVG } from 'qrcode.react';
import React, { useEffect, useRef, useState } from 'react';
import { BounceLoader } from 'react-spinners';
import { v4 as uuidv4 } from 'uuid';
import CHECK_ANIMATION from '../animations/check_animation.json' with { type: 'json' };
import X_ANIMATION from '../animations/x_animation.json' with { type: 'json' };
import { containerStyle, ledContainerStyle, qrContainerStyle } from '../utils/styles.js';
import { qrWrapperStyle } from '../utils/styles.js';
import { QRcodeSteps } from '../utils/utils.js';
import { initWebSocket } from '../utils/websocket.js';
import LED from './LED.js';
const LottieComponent = Lottie.default || Lottie;
import QRCode from './QRCode.js';
import StatusBanner from './StatusBanner.js';
interface SelfQRcodeProps {
selfApp: SelfApp;
@@ -23,7 +17,8 @@ interface SelfQRcodeProps {
websocketUrl?: string;
size?: number;
darkMode?: boolean;
children?: React.ReactNode;
showBorder?: boolean;
showStatusText?: boolean;
}
const SelfQRcodeWrapper = (props: SelfQRcodeProps) => {
@@ -46,11 +41,24 @@ const SelfQRcode = ({
websocketUrl = WS_DB_RELAYER,
size = 300,
darkMode = false,
showBorder = true,
showStatusText = true,
}: SelfQRcodeProps) => {
const [proofStep, setProofStep] = useState(QRcodeSteps.WAITING_FOR_MOBILE);
const [sessionId, setSessionId] = useState('');
const socketRef = useRef<ReturnType<typeof initWebSocket> | null>(null);
// Refs for callbacks to avoid unnecessary WebSocket reconnections.
const onSuccessRef = useRef(onSuccess);
const onErrorRef = useRef(onError);
const selfAppRef = useRef(selfApp);
useEffect(() => {
onSuccessRef.current = onSuccess;
onErrorRef.current = onError;
selfAppRef.current = selfApp;
}, [onSuccess, onError, selfApp]);
useEffect(() => {
setSessionId(uuidv4());
}, []);
@@ -61,13 +69,13 @@ const SelfQRcode = ({
socketRef.current = initWebSocket(
websocketUrl,
{
...selfApp,
...selfAppRef.current,
sessionId: sessionId,
},
type,
setProofStep,
onSuccess,
onError
() => onSuccessRef.current(),
(data) => onErrorRef.current(data)
);
}
@@ -78,70 +86,30 @@ const SelfQRcode = ({
socketRef.current = null;
}
};
}, [sessionId, type, websocketUrl, onSuccess, selfApp]);
}, [sessionId, type, websocketUrl]);
if (!sessionId) {
return null;
}
const renderProofStatus = () => (
<div style={containerStyle}>
<div style={ledContainerStyle}>
<LED connectionStatus={proofStep} />
</div>
<div style={qrContainerStyle(size)}>
{(() => {
switch (proofStep) {
case QRcodeSteps.PROOF_GENERATION_STARTED:
case QRcodeSteps.PROOF_GENERATED:
return <BounceLoader loading={true} size={200} color="#94FBAB" />;
case QRcodeSteps.PROOF_GENERATION_FAILED:
return (
// @ts-expect-error Lottie typings don't match the default export shape
<LottieComponent
animationData={X_ANIMATION}
style={{ width: 200, height: 200 }}
onComplete={() => {
setProofStep(QRcodeSteps.WAITING_FOR_MOBILE);
}}
loop={false}
/>
);
case QRcodeSteps.PROOF_VERIFIED:
return (
// @ts-expect-error Lottie typings don't match the default export shape
<LottieComponent
animationData={CHECK_ANIMATION}
style={{ width: 200, height: 200 }}
onComplete={() => {
setProofStep(QRcodeSteps.WAITING_FOR_MOBILE);
}}
loop={false}
/>
);
default:
return (
<QRCodeSVG
value={
type === 'websocket'
? `${REDIRECT_URL}?sessionId=${sessionId}`
: getUniversalLink({
...selfApp,
sessionId: sessionId,
})
}
size={size}
bgColor={darkMode ? '#000000' : '#ffffff'}
fgColor={darkMode ? '#ffffff' : '#000000'}
/>
);
}
})()}
</div>
const qrValue =
type === 'websocket'
? `${REDIRECT_URL}?sessionId=${sessionId}`
: getUniversalLink({
...selfAppRef.current,
sessionId: sessionId,
});
return (
<div
style={qrWrapperStyle(proofStep, showBorder)}
role="img"
aria-label="Self authentication QR code"
>
<QRCode value={qrValue} size={size} darkMode={darkMode} proofStep={proofStep} />
{showStatusText && <StatusBanner proofStep={proofStep} qrSize={size} />}
</div>
);
return <div style={containerStyle}>{renderProofStatus()}</div>;
};
// Also export other components/types that might be needed

View File

@@ -0,0 +1,24 @@
import React, { memo } from 'react';
import selfLogo from '../assets/self-logo.svg';
import { statusBannerLogoStyle, statusBannerStyle } from '../utils/styles.js';
import { getStatusText, QRcodeSteps } from '../utils/utils.js';
interface StatusBannerProps {
proofStep: number;
qrSize: number;
}
const StatusBanner = memo(({ proofStep, qrSize }: StatusBannerProps) => {
const showLogo =
proofStep === QRcodeSteps.DISCONNECTED || proofStep === QRcodeSteps.WAITING_FOR_MOBILE;
return (
<div style={statusBannerStyle(qrSize)} role="status" aria-live="polite">
{showLogo && <img src={selfLogo} alt="Self Logo" style={statusBannerLogoStyle} />}
{getStatusText(proofStep)}
</div>
);
});
export default StatusBanner;

View File

@@ -21,11 +21,6 @@
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.cjs"
},
"./components/LED": {
"types": "./dist/esm/components/LED.d.ts",
"import": "./dist/esm/components/LED.js",
"require": "./dist/cjs/components/LED.cjs"
},
"./components/SelfQRcode": {
"types": "./dist/esm/components/SelfQRcode.d.ts",
"import": "./dist/esm/components/SelfQRcode.js",

View File

@@ -15,6 +15,8 @@
},
"include": [
"animations",
"assets",
"types",
"index.ts",
"components/**.tsx",
"utils/*.ts"

View File

@@ -8,7 +8,6 @@ const __dirname = path.dirname(__filename);
const entries = {
index: 'index.ts',
'components/LED': 'components/LED.tsx',
'components/SelfQRcode': 'components/SelfQRcode.tsx',
'utils/utils': 'utils/utils.ts',
'utils/styles': 'utils/styles.ts',
@@ -28,6 +27,10 @@ export default defineConfig([
sourcemap: true,
target: 'es2020',
platform: 'neutral',
loader: {
'.svg': 'dataurl',
},
publicDir: path.resolve(__dirname, 'assets'),
external: [
/^react/,
/^react-dom/,
@@ -50,6 +53,10 @@ export default defineConfig([
sourcemap: true,
target: 'es2020',
platform: 'neutral',
loader: {
'.svg': 'dataurl',
},
publicDir: path.resolve(__dirname, 'assets'),
external: [
/^react/,
/^react-dom/,

4
sdk/qrcode/types/svg.d.ts vendored Normal file
View File

@@ -0,0 +1,4 @@
declare module '*.svg' {
const content: string;
export default content;
}

View File

@@ -1,22 +1,68 @@
const containerStyle: React.CSSProperties = {
display: 'flex',
import React from 'react';
import { QRcodeSteps } from './utils.js';
const getBorderColor = (step: number): string => {
switch (step) {
case QRcodeSteps.DISCONNECTED:
case QRcodeSteps.WAITING_FOR_MOBILE:
return '#E2E8F0';
case QRcodeSteps.MOBILE_CONNECTED:
case QRcodeSteps.PROOF_GENERATION_STARTED:
case QRcodeSteps.PROOF_GENERATED:
return '#3B82F6';
case QRcodeSteps.PROOF_GENERATION_FAILED:
return '#EF4444';
case QRcodeSteps.PROOF_VERIFIED:
return '#01BFFF';
default:
return '#E2E8F0';
}
};
export const qrAnimationOverlayStyle = (imageSize: number): React.CSSProperties => ({
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
width: imageSize,
height: imageSize,
pointerEvents: 'none',
});
export const qrContainerStyle = (size: number): React.CSSProperties => ({
position: 'relative',
width: size,
height: size,
});
export const qrWrapperStyle = (step: number, showBorder: boolean = true): React.CSSProperties => ({
display: 'inline-flex',
flexDirection: 'column',
alignItems: 'center',
width: '100%',
gap: '6px',
padding: '3px',
borderRadius: '10px',
border: showBorder ? `6px solid ${getBorderColor(step)}` : 'none',
backgroundColor: '#FFF',
transition: 'border-color 0.3s ease',
});
export const statusBannerLogoStyle: React.CSSProperties = {
width: 28,
height: 28,
marginRight: 8,
};
const ledContainerStyle: React.CSSProperties = {
marginBottom: '4px',
};
const qrContainerStyle = (size: number): React.CSSProperties => ({
width: `${size}px`,
height: `${size}px`,
export const statusBannerStyle = (qrSize: number): React.CSSProperties => ({
backgroundColor: '#000',
color: '#fff',
borderRadius: '5px',
width: qrSize,
fontWeight: '700',
fontSize: '18px',
height: '50px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
});
export { containerStyle };
export { ledContainerStyle };
export { qrContainerStyle };

View File

@@ -1,3 +1,6 @@
import { statusConnecting, statusError, statusFailed, statusSuccess } from '../animations/index.js';
import selfLogoBlack from '../assets/self-logo-qr.svg';
export const QRcodeSteps = {
DISCONNECTED: 0,
WAITING_FOR_MOBILE: 1,
@@ -7,3 +10,47 @@ export const QRcodeSteps = {
PROOF_GENERATED: 5,
PROOF_VERIFIED: 6,
};
export const getStatusAnimation = (proofStep: number) => {
switch (proofStep) {
case QRcodeSteps.MOBILE_CONNECTED:
case QRcodeSteps.PROOF_GENERATION_STARTED:
case QRcodeSteps.PROOF_GENERATED:
return statusConnecting;
case QRcodeSteps.PROOF_VERIFIED:
return statusSuccess;
case QRcodeSteps.PROOF_GENERATION_FAILED:
return statusFailed;
default:
return statusError;
}
};
export const getStatusIcon = (proofStep: number): string => {
switch (proofStep) {
case QRcodeSteps.DISCONNECTED:
case QRcodeSteps.WAITING_FOR_MOBILE:
return selfLogoBlack;
default:
return '';
}
};
export const getStatusText = (proofStep: number): string => {
switch (proofStep) {
case QRcodeSteps.DISCONNECTED:
case QRcodeSteps.WAITING_FOR_MOBILE:
return 'Prove your Self';
case QRcodeSteps.MOBILE_CONNECTED:
case QRcodeSteps.PROOF_GENERATION_STARTED:
return 'Connected to Self';
case QRcodeSteps.PROOF_GENERATED:
return 'Proof Generated';
case QRcodeSteps.PROOF_VERIFIED:
return 'Proof Successful';
case QRcodeSteps.PROOF_GENERATION_FAILED:
return 'Proof Failed';
default:
return 'An error occurred';
}
};