getting back to this

This commit is contained in:
Michael Freno
2026-01-26 23:20:14 -05:00
parent b888e1126a
commit b1996c8324
6 changed files with 1524 additions and 459 deletions

View File

@@ -1,140 +1,85 @@
{
"v": "5.7.4",
"fr": 30,
"fr": 60,
"ip": 0,
"op": 90,
"w": 200,
"h": 400,
"nm": "Posture Arrow Animation",
"op": 180,
"w": 300,
"h": 300,
"nm": "Posture Correction - Side View",
"ddd": 0,
"assets": [],
"date": "2026-01-09T00:00:00Z",
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Arrow",
"nm": "Head",
"parent": 2,
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, -38, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"t": 0,
"s": [
0
],
"h": 1
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [36, 36] },
"nm": "Head"
},
{
"t": 10,
"s": [
100
],
"h": 1
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"t": 60,
"s": [
100
],
"h": 1
},
{
"t": 70,
"s": [
0
],
"h": 1
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
]
},
"r": {
"a": 0,
"k": 0
},
"p": {
"a": 1,
"k": [
{
"t": 0,
"s": [
100,
200,
0
],
"h": 1
},
{
"t": 60,
"s": [
100,
200,
0
],
"h": 1
},
{
"t": 90,
"s": [
100,
-100,
0
],
"h": 1
}
]
},
"a": {
"a": 0,
"k": [
0,
0,
0
]
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0,
0,
100
],
"h": 1
},
{
"t": 10,
"s": [
100,
100,
100
],
"h": 1
},
{
"t": 60,
"s": [
100,
100,
100
],
"h": 1
},
{
"t": 70,
"s": [
50,
50,
100
],
"h": 1
}
]
],
"nm": "Head Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Neck",
"parent": 3,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": {
"a": 1,
"k": [
{ "t": 0, "s": [30], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 70, "s": [0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [0] }
]
},
"p": { "a": 0, "k": [0, -50, 0] },
"a": { "a": 0, "k": [0, 20, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
@@ -146,285 +91,60 @@
"ks": {
"a": 0,
"k": {
"i": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"o": [
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
],
[
0,
0
]
],
"v": [
[
0,
-40
],
[
-30,
-10
],
[
-12,
-10
],
[
-12,
40
],
[
12,
40
],
[
12,
-10
],
[
30,
-10
]
],
"c": true
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, -20], [0, 20]],
"c": false
}
},
"nm": "Arrow Path"
"nm": "Neck Path"
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0,
0,
0,
1
]
},
"o": {
"a": 0,
"k": 100
},
"r": 1,
"nm": "Fill"
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
]
},
"a": {
"a": 0,
"k": [
0,
0
]
},
"s": {
"a": 0,
"k": [
100,
100
]
},
"r": {
"a": 0,
"k": 0
},
"o": {
"a": 0,
"k": 100
}
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Arrow Shape"
"nm": "Neck Shape"
}
],
"ip": 0,
"op": 90,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ind": 3,
"ty": 4,
"nm": "Circle Background",
"nm": "Torso",
"parent": 7,
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0
],
"h": 1
},
{
"t": 10,
"s": [
100
],
"h": 1
},
{
"t": 60,
"s": [
100
],
"h": 1
},
{
"t": 70,
"s": [
0
],
"h": 1
}
]
},
"o": { "a": 0, "k": 100 },
"r": {
"a": 0,
"k": 0
},
"p": {
"a": 1,
"k": [
{
"t": 0,
"s": [
100,
200,
0
],
"h": 1
},
{
"t": 60,
"s": [
100,
200,
0
],
"h": 1
},
{
"t": 90,
"s": [
100,
-100,
0
],
"h": 1
}
{ "t": 0, "s": [25], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 70, "s": [-5], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [-5] }
]
},
"a": {
"a": 0,
"k": [
0,
0,
0
]
},
"s": {
"a": 1,
"k": [
{
"t": 0,
"s": [
0,
0,
100
],
"h": 1
},
{
"t": 10,
"s": [
100,
100,
100
],
"h": 1
},
{
"t": 60,
"s": [
100,
100,
100
],
"h": 1
},
{
"t": 70,
"s": [
50,
50,
100
],
"h": 1
}
]
}
"p": { "a": 0, "k": [0, 0, 0] },
"a": { "a": 0, "k": [0, 50, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
@@ -432,79 +152,407 @@
"ty": "gr",
"it": [
{
"ty": "el",
"p": {
"ty": "sh",
"ks": {
"a": 0,
"k": [
0,
0
]
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, -50], [0, 50]],
"c": false
}
},
"s": {
"nm": "Torso Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Torso Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 4,
"nm": "Upper Arm",
"parent": 3,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": {
"a": 1,
"k": [
{ "t": 0, "s": [40], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 70, "s": [70], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [70] }
]
},
"p": { "a": 0, "k": [0, -40, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": [
120,
120
]
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 35]],
"c": false
}
},
"nm": "Circle Ellipse"
"nm": "Upper Arm Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Upper Arm Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 5,
"ty": 4,
"nm": "Forearm",
"parent": 4,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": {
"a": 1,
"k": [
{ "t": 0, "s": [-80], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 70, "s": [-110], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [-110] }
]
},
"p": { "a": 0, "k": [0, 35, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 30]],
"c": false
}
},
"nm": "Forearm Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Forearm Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 6,
"ty": 4,
"nm": "Thigh",
"parent": 7,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 90 },
"p": { "a": 0, "k": [0, 0, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 50]],
"c": false
}
},
"nm": "Thigh Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Thigh Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 7,
"ty": 4,
"nm": "Hip (Root)",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [150, 200, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 8,
"ty": 4,
"nm": "Lower Leg",
"parent": 6,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": -90 },
"p": { "a": 0, "k": [0, 50, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 45]],
"c": false
}
},
"nm": "Lower Leg Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Lower Leg Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 9,
"ty": 4,
"nm": "Chair Seat",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 50 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [125, 208, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "rc",
"d": 1,
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [70, 8] },
"r": { "a": 0, "k": 4 },
"nm": "Seat"
},
{
"ty": "fl",
"c": {
"a": 0,
"k": [
0.9,
0.9,
0.9,
1
]
},
"o": {
"a": 0,
"k": 30
},
"c": { "a": 0, "k": [0.5, 0.5, 0.5, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": {
"a": 0,
"k": [
0,
0
]
},
"a": {
"a": 0,
"k": [
0,
0
]
},
"s": {
"a": 0,
"k": [
100,
100
]
},
"r": {
"a": 0,
"k": 0
},
"o": {
"a": 0,
"k": 100
}
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Circle"
"nm": "Seat Shape"
}
],
"ip": 0,
"op": 90,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 10,
"ty": 4,
"nm": "Chair Back",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 50 },
"r": { "a": 0, "k": -5 },
"p": { "a": 0, "k": [92, 160, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "rc",
"d": 1,
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [8, 90] },
"r": { "a": 0, "k": 4 },
"nm": "Back"
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.5, 0.5, 0.5, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Back Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
}

View File

@@ -0,0 +1,345 @@
{
"v": "5.7.4",
"fr": 60,
"ip": 0,
"op": 180,
"w": 300,
"h": 300,
"nm": "Posture 2 - Spine Only",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Head",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, -25, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [40, 40] },
"nm": "Head"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 8 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Head Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Spine Curve",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [150, 150, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 1,
"k": [
{
"t": 0,
"s": [{
"i": [[0, 0], [20, 0], [25, 0], [0, 0]],
"o": [[0, 0], [-20, 0], [-25, 0], [0, 0]],
"v": [[40, -80], [50, -30], [45, 40], [0, 90]],
"c": false
}],
"i": { "x": 0.3, "y": 1 },
"o": { "x": 0.7, "y": 0 }
},
{
"t": 70,
"s": [{
"i": [[0, 0], [0, 0], [0, 0], [0, 0]],
"o": [[0, 0], [0, 0], [0, 0], [0, 0]],
"v": [[0, -80], [0, -30], [0, 40], [0, 90]],
"c": false
}],
"i": { "x": 0.3, "y": 1 },
"o": { "x": 0.7, "y": 0 }
},
{
"t": 180,
"s": [{
"i": [[0, 0], [0, 0], [0, 0], [0, 0]],
"o": [[0, 0], [0, 0], [0, 0], [0, 0]],
"v": [[0, -80], [0, -30], [0, 40], [0, 90]],
"c": false
}]
}
]
},
"nm": "Spine Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 8 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Spine Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Vertebrae 1",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 10, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [14, 14] },
"nm": "Dot"
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Vertebra"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 4,
"nm": "Vertebrae 2",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 45, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [14, 14] },
"nm": "Dot"
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Vertebra"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 5,
"ty": 4,
"nm": "Vertebrae 3",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 80, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [14, 14] },
"nm": "Dot"
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Vertebra"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 6,
"ty": 4,
"nm": "Vertebrae 4",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 115, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [14, 14] },
"nm": "Dot"
},
{
"ty": "fl",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"r": 1,
"nm": "Fill"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Vertebra"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
}
],
"markers": []
}

View File

@@ -0,0 +1,254 @@
{
"v": "5.7.4",
"fr": 60,
"ip": 0,
"op": 180,
"w": 300,
"h": 300,
"nm": "Posture 3 - Arrow Up",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Arrow",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{ "t": 0, "s": [150, 180, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 40, "s": [150, 120, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 80, "s": [150, 140, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 120, "s": [150, 120, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 160, "s": [150, 140, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 180, "s": [150, 130, 0] }
]
},
"a": { "a": 0, "k": [0, 0, 0] },
"s": {
"a": 1,
"k": [
{ "t": 0, "s": [80, 80, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 40, "s": [100, 100, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 180, "s": [100, 100, 100] }
]
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0], [0, 0]],
"o": [[0, 0], [0, 0], [0, 0]],
"v": [[-40, 30], [0, -30], [40, 30]],
"c": false
}
},
"nm": "Arrow Head"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 12 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Arrow Head Shape"
},
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, -20], [0, 70]],
"c": false
}
},
"nm": "Arrow Stem"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 12 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Arrow Stem Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Circle Pulse 1",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{ "t": 30, "s": [0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 50, "s": [60], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 100, "s": [0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [0] }
]
},
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [150, 130, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": {
"a": 1,
"k": [
{ "t": 30, "s": [50, 50, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 100, "s": [150, 150, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 180, "s": [150, 150, 100] }
]
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [120, 120] },
"nm": "Circle"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 4 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Circle Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Circle Pulse 2",
"sr": 1,
"ks": {
"o": {
"a": 1,
"k": [
{ "t": 90, "s": [0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 110, "s": [60], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 160, "s": [0], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 180, "s": [0] }
]
},
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [150, 130, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": {
"a": 1,
"k": [
{ "t": 90, "s": [50, 50, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 160, "s": [150, 150, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 180, "s": [150, 150, 100] }
]
}
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [120, 120] },
"nm": "Circle"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 4 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Circle Shape"
}
],
"ip": 0,
"op": 180,
"st": 0,
"bm": 0
}
],
"markers": []
}

View File

@@ -0,0 +1,407 @@
{
"v": "5.7.4",
"fr": 60,
"ip": 0,
"op": 150,
"w": 300,
"h": 300,
"nm": "Posture 4 - Shoulders Back Launch",
"ddd": 0,
"assets": [],
"layers": [
{
"ddd": 0,
"ind": 1,
"ty": 4,
"nm": "Head",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, -55, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "el",
"p": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [50, 50] },
"nm": "Head"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Head Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 2,
"ty": 4,
"nm": "Torso",
"parent": 7,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": { "a": 0, "k": [0, 0, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, -30], [0, 80]],
"c": false
}
},
"nm": "Torso Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Torso Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 3,
"ty": 4,
"nm": "Left Shoulder",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": {
"a": 1,
"k": [
{ "t": 0, "s": [30], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 50, "s": [-20], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 150, "s": [-20] }
]
},
"p": { "a": 0, "k": [-5, -20, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [-50, 20]],
"c": false
}
},
"nm": "Shoulder Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Shoulder Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 4,
"ty": 4,
"nm": "Right Shoulder",
"parent": 2,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": {
"a": 1,
"k": [
{ "t": 0, "s": [-30], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 50, "s": [20], "i": { "x": [0.3], "y": [1] }, "o": { "x": [0.7], "y": [0] } },
{ "t": 150, "s": [20] }
]
},
"p": { "a": 0, "k": [5, -20, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [50, 20]],
"c": false
}
},
"nm": "Shoulder Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Shoulder Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 5,
"ty": 4,
"nm": "Left Leg",
"parent": 7,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": -20 },
"p": { "a": 0, "k": [-5, 80, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 50]],
"c": false
}
},
"nm": "Leg Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Leg Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 6,
"ty": 4,
"nm": "Right Leg",
"parent": 7,
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 20 },
"p": { "a": 0, "k": [5, 80, 0] },
"a": { "a": 0, "k": [0, 0, 0] },
"s": { "a": 0, "k": [100, 100, 100] }
},
"ao": 0,
"shapes": [
{
"ty": "gr",
"it": [
{
"ty": "sh",
"ks": {
"a": 0,
"k": {
"i": [[0, 0], [0, 0]],
"o": [[0, 0], [0, 0]],
"v": [[0, 0], [0, 50]],
"c": false
}
},
"nm": "Leg Path"
},
{
"ty": "st",
"c": { "a": 0, "k": [0.298, 0.686, 0.314, 1] },
"o": { "a": 0, "k": 100 },
"w": { "a": 0, "k": 6 },
"lc": 2,
"lj": 2,
"nm": "Stroke"
},
{
"ty": "tr",
"p": { "a": 0, "k": [0, 0] },
"a": { "a": 0, "k": [0, 0] },
"s": { "a": 0, "k": [100, 100] },
"r": { "a": 0, "k": 0 },
"o": { "a": 0, "k": 100 }
}
],
"nm": "Leg Shape"
}
],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
},
{
"ddd": 0,
"ind": 7,
"ty": 4,
"nm": "Root",
"sr": 1,
"ks": {
"o": { "a": 0, "k": 100 },
"r": { "a": 0, "k": 0 },
"p": {
"a": 1,
"k": [
{ "t": 0, "s": [150, 150, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 50, "s": [150, 150, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 70, "s": [150, 160, 0], "i": { "x": 0.1, "y": 1 }, "o": { "x": 0.5, "y": 0 } },
{ "t": 120, "s": [150, -200, 0], "i": { "x": 0.3, "y": 1 }, "o": { "x": 0.7, "y": 0 } },
{ "t": 150, "s": [150, -200, 0] }
]
},
"a": { "a": 0, "k": [0, 0, 0] },
"s": {
"a": 1,
"k": [
{ "t": 0, "s": [100, 100, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 50, "s": [100, 100, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 70, "s": [110, 90, 100], "i": { "x": [0.1, 0.1, 0.1], "y": [1, 1, 1] }, "o": { "x": [0.5, 0.5, 0.5], "y": [0, 0, 0] } },
{ "t": 120, "s": [60, 60, 100], "i": { "x": [0.3, 0.3, 0.3], "y": [1, 1, 1] }, "o": { "x": [0.7, 0.7, 0.7], "y": [0, 0, 0] } },
{ "t": 150, "s": [60, 60, 100] }
]
}
},
"ao": 0,
"shapes": [],
"ip": 0,
"op": 150,
"st": 0,
"bm": 0
}
],
"markers": []
}

View File

@@ -10,9 +10,9 @@ import Foundation
enum AnimationAsset: String {
case blink = "blink"
case lookAway = "look-away"
case posture = "posture"
case posture = "posture4"
case ring = "ring"
var fileName: String {
return self.rawValue
}

View File

@@ -5,29 +5,47 @@
// Created by Mike Freno on 1/7/26.
//
import Lottie
import SwiftUI
struct PostureReminderView: View {
let sizePercentage: Double
var onDismiss: () -> Void
@State private var scale: CGFloat = 0
@State private var yOffset: CGFloat = 0
@State private var opacity: Double = 0
@State private var scale: CGFloat = 0
@State private var shouldShowAnimation = false
private let screenHeight = NSScreen.main?.frame.height ?? 800
private let screenWidth = NSScreen.main?.frame.width ?? 1200
private var baseSize: CGFloat {
screenWidth * (sizePercentage / 100.0) * 2.5
}
var body: some View {
VStack {
Image(systemName: "arrow.up.circle.fill")
.font(.system(size: scale))
.foregroundStyle(Color.accentColor)
if shouldShowAnimation {
GazeLottieView(
animationName: AnimationAsset.posture.fileName,
loopMode: .playOnce,
animationSpeed: 1.0,
onAnimationFinish: { completed in
if completed {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
fadeOut()
}
}
}
)
.frame(width: baseSize, height: baseSize)
.scaleEffect(scale)
}
Spacer()
}
.opacity(opacity)
.offset(y: yOffset)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.padding(.top, screenHeight * 0.075)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.padding(.top, screenHeight * 0.05)
.accessibilityIdentifier(AccessibilityIdentifiers.Reminders.postureView)
.onAppear {
startAnimation()
@@ -35,36 +53,29 @@ struct PostureReminderView: View {
}
private func startAnimation() {
// Phase 1: Fade in + Grow to configured size
withAnimation(.easeOut(duration: 0.4)) {
withAnimation(.easeOut(duration: 0.3)) {
opacity = 1.0
scale = screenWidth * (sizePercentage / 100.0)
scale = 1.0
}
// Phase 2: Hold
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4 + 0.5) {
// Phase 3: Shrink to half the configured size
withAnimation(.easeInOut(duration: 0.3)) {
scale = screenWidth * (sizePercentage / 100.0) * 0.5
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
shouldShowAnimation = true
}
}
// Phase 4: Shoot upward
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
withAnimation(.easeIn(duration: 0.4)) {
yOffset = -screenHeight
opacity = 0
}
private func fadeOut() {
withAnimation(.easeOut(duration: 0.3)) {
opacity = 0
scale = 0.7
}
// Dismiss after animation
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
onDismiss()
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
onDismiss()
}
}
}
#Preview("Posture Reminder") {
PostureReminderView(sizePercentage: 10.0, onDismiss: {})
PostureReminderView(sizePercentage: 15.0, onDismiss: {})
.frame(width: 800, height: 600)
}