diff --git a/.gitignore b/.gitignore index 1a14ca0..29c18f8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,9 +10,9 @@ .svn/ *.env .vscode -/lib/firebase_options.dart /android/app/google-services.json /firebase.json +/android/app/upload-keystore.jks diff --git a/animations/empty.json b/animations/empty.json new file mode 100644 index 0000000..cdb7e5f --- /dev/null +++ b/animations/empty.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.1.0","a":"","k":"","d":"","tc":""},"fr":30,"ip":0,"op":77,"w":1000,"h":1000,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[480,505.99999999999994,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[41,-30],[34,-78],[-36.607,20.098],[40,-43],[-71,185],[26,-28]],"o":[[0,0],[-30.454,22.283],[-34,78],[51,-28],[-61.995,66.645],[70.57,-183.88],[-26,28]],"v":[[-142,44],[-139,140],[-352,106],[-171,308],[-204,227],[-313,168],[-413,67]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":30,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":1369,"ix":2}},{"n":"o","nm":"offset","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[103]},{"t":70.0000028511585,"s":[-1303]}],"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22.0000008960784,"op":1810.00007372281,"st":12.00000048877,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[41,-30],[34,-78],[-36.607,20.098],[40,-43],[-71,185],[26,-28]],"o":[[0,0],[-30.454,22.283],[-34,78],[51,-28],[-61.995,66.645],[70.57,-183.88],[-26,28]],"v":[[-142,44],[-139,140],[-352,106],[-171,308],[-204,227],[-313,168],[-413,67]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":12,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":1369,"ix":2}},{"n":"o","nm":"offset","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[103]},{"t":58.0000023623884,"s":[-1303]}],"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"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":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":22.0000008960784,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"head/boxgirl2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[-5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[-5]},{"t":75.0000030548126,"s":[0]}],"ix":10},"p":{"a":0,"k":[504.173,279.4,0],"ix":2},"a":{"a":0,"k":[615.874,302.163,0],"ix":1},"s":{"a":0,"k":[83,83,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.203,0],[0,0],[0.188,-0.112],[0.266,-0.265],[0.11,-0.275],[-0.203,0],[0,0],[-0.188,0.113],[-0.266,0.266],[-0.11,0.274]],"o":[[0,0],[-0.231,0],[-0.322,0.194],[-0.206,0.206],[-0.041,0.103],[0,0],[0.232,0],[0.322,-0.194],[0.206,-0.205],[0.041,-0.104]],"v":[[3.115,-1.01],[-1.033,-1.01],[-1.711,-0.745],[-2.621,-0.032],[-3.193,0.682],[-3.115,1.01],[1.032,1.01],[1.711,0.745],[2.621,0.031],[3.193,-0.682]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[592.024,140.01],"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":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.441,0],[0,0],[0.377,-0.376],[-0.441,0],[0,0],[-0.377,0.376]],"o":[[0,0],[-0.571,0],[-0.086,0.085],[0,0],[0.572,0],[0.085,-0.085]],"v":[[4.643,-1.01],[-2.561,-1.01],[-4.149,-0.032],[-4.643,1.01],[2.56,1.01],[4.149,0.032]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[589.932,134.862],"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 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.203,0],[0,0],[0.187,-0.112],[0.266,-0.265],[0.109,-0.275],[-0.203,0],[0,0],[-0.188,0.113],[-0.266,0.265],[-0.11,0.274]],"o":[[0,0],[-0.232,0],[-0.323,0.194],[-0.206,0.206],[-0.042,0.103],[0,0],[0.232,0],[0.322,-0.193],[0.206,-0.206],[0.041,-0.104]],"v":[[2.569,-1.01],[-0.487,-1.01],[-1.165,-0.745],[-2.076,-0.032],[-2.647,0.682],[-2.57,1.01],[0.486,1.01],[1.165,0.745],[2.075,0.032],[2.647,-0.682]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[594.189,130.405],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.697,0.13],[1.381,-1.402],[-1.277,-1.162],[-0.539,-2.933],[1.291,0.371],[0.599,1.294],[-0.397,-0.857],[-2.347,3.604],[1.566,1.335],[1.014,0.42],[0.075,0.558],[-0.756,-0.141]],"o":[[-1.872,-0.349],[-1.032,1.047],[1.762,1.602],[0.338,1.839],[-1.421,-0.409],[-0.212,-0.458],[1.982,4.281],[1.124,-1.727],[-0.848,-0.723],[-0.383,-0.158],[-0.118,-0.875],[0.82,0.152]],"v":[[2.104,-7.117],[-2.682,-5.892],[-3.188,-2.149],[2.92,2.141],[-0.213,3.831],[-3.175,1.063],[-5.296,3.185],[4.569,3.198],[3.753,-1.848],[0.801,-3.374],[-1.262,-4.469],[0.261,-4.868]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[602.895,136.398],"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 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.784,2.336]],"o":[[0,0],[0,0]],"v":[[-6.716,-0.848],[6.716,-1.168]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4823529411764706,0.3686274509803922,0.9490196078431372,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":[605.021,201.209],"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 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.784,2.336]],"o":[[0,0],[0,0]],"v":[[-6.716,-2.008],[6.716,-0.328]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4823529411764706,0.3686274509803922,0.9490196078431372,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":[582.244,200.369],"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 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.901,0.241],[8.078,-4.259],[-3.323,-5.913],[-6.748,-0.677],[-6.62,1.477],[0,0]],"o":[[-0.963,-0.223],[-21.25,-5.699],[-6,3.163],[3.324,5.912],[6.748,0.678],[0,0],[0,0]],"v":[[22.043,0.722],[19.248,0.025],[-14.734,-11.997],[-18.914,5.764],[-1.981,15.578],[22.237,12.775],[19.248,0.025]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4823529411764706,0.3686274509803922,0.9490196078431372,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":[543.515,174.404],"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 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-27.722,-3.24],[2.66,-27.783],[19.547,5.242],[8.078,-4.258],[-3.324,-5.912],[-6.748,-0.677],[-6.62,1.476],[0,0]],"o":[[0,0],[3.818,-27.648],[27.722,3.24],[-63.214,18.371],[-21.25,-5.699],[-6,3.163],[3.323,5.912],[6.748,0.678],[0,0],[0,0]],"v":[[-72.745,16.895],[-29.706,4.359],[30.081,-41.908],[77.588,16.899],[-38.763,28.917],[-72.745,16.895],[-76.924,34.656],[-59.992,44.47],[-35.774,41.668],[-38.763,28.917]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6431372549019608,0.5647058823529412,0.9568627450980393,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":[601.526,145.512],"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 8","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.734,-12.941],[-15.624,-0.096],[-3.417,15.247]],"o":[[2.734,12.941],[3.23,15.288],[15.625,0.095],[0,0]],"v":[[-36.33,-25.893],[-31.201,-1.615],[2.397,25.799],[36.33,-1.201]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[602.33,214.252],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.091,-7.297]],"o":[[-0.924,12.992],[0,0]],"v":[[5.451,-19.487],[-5.451,19.487]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[594.411,259.908],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[0,0],[1.404,-13.995],[-7.319,-22.945],[-22.358,-8.953],[-13.565,19.901],[22.678,8.11],[-0.689,25.725],[5.686,1.105]],"o":[[7.301,7.834],[-2.405,23.964],[7.32,22.944],[22.358,8.953],[13.565,-19.9],[-24.231,-8.665],[0.155,-5.79],[-5.686,-1.106]],"v":[[-67.624,-74.46],[-60.836,-50.411],[-55.453,11.567],[-9.899,64.62],[54.789,47.744],[37.918,-12.56],[2.322,-69.611],[-7.677,-82.077]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[{"i":[[0,0],[1.404,-13.995],[-7.319,-22.945],[-22.358,-8.953],[-13.565,19.901],[22.678,8.11],[-0.689,25.725],[5.686,1.105]],"o":[[7.301,7.834],[-2.405,23.964],[7.32,22.944],[22.358,8.953],[13.565,-19.9],[-24.231,-8.665],[0.155,-5.79],[-5.686,-1.106]],"v":[[-67.624,-74.46],[-60.836,-50.411],[-56.182,21.178],[-10.628,74.23],[54.06,57.355],[37.189,-2.949],[2.322,-69.611],[-7.677,-82.077]],"c":true}]},{"t":74.0000030140818,"s":[{"i":[[0,0],[1.404,-13.995],[-7.319,-22.945],[-22.358,-8.953],[-13.565,19.901],[22.678,8.11],[-0.689,25.725],[5.686,1.105]],"o":[[7.301,7.834],[-2.405,23.964],[7.32,22.944],[22.358,8.953],[13.565,-19.9],[-24.231,-8.665],[0.155,-5.79],[-5.686,-1.106]],"v":[[-67.624,-74.46],[-60.836,-50.411],[-55.453,11.567],[-9.899,64.62],[54.789,47.744],[37.918,-12.56],[2.322,-69.611],[-7.677,-82.077]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9372549019607843,0.5254901960784314,0.8313725490196079,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":[692.302,244.019],"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 11","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"arms/boxgirl2 Outlines","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7,"s":[-18]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":13.824,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[-18]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37,"s":[-18]},{"t":54.0000021994651,"s":[-18]}],"ix":10},"p":{"a":0,"k":[506.439,444.242,0],"ix":2},"a":{"a":0,"k":[534.439,398.222,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.407],[3.407,0],[0,3.407],[-3.407,0]],"o":[[0,3.407],[-3.407,0],[0,-3.407],[3.407,0]],"v":[[6.169,0],[0,6.169],[-6.168,0],[0,-6.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[632.081,461.246],"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":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":7,"s":[{"i":[[0,0],[-22.517,-0.724],[-10.788,37.86]],"o":[[25.288,-7.398],[36.098,3.218],[0,0]],"v":[[-38.207,26.791],[38.078,30.823],[87.513,-6.807]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[{"i":[[0,0],[-22.888,-13.053],[-2.749,18.008]],"o":[[25.288,-7.398],[-17.303,-28.448],[0,0]],"v":[[-38.207,26.791],[38.207,35.761],[21.086,-17.93]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":21,"s":[{"i":[[0,0],[-22.517,-0.724],[-10.788,37.86]],"o":[[25.288,-7.398],[36.098,3.218],[0,0]],"v":[[-38.207,26.791],[38.078,30.823],[87.513,-6.807]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":27.176,"s":[{"i":[[0,0],[-22.888,-13.053],[-2.749,18.008]],"o":[[25.288,-7.398],[-17.303,-28.448],[0,0]],"v":[[-38.207,26.791],[38.207,35.761],[21.086,-17.93]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":37,"s":[{"i":[[0,0],[-22.517,-0.724],[-10.788,37.86]],"o":[[25.288,-7.398],[36.098,3.218],[0,0]],"v":[[-38.207,26.791],[38.078,30.823],[87.513,-6.807]],"c":false}]},{"t":54.0000021994651,"s":[{"i":[[0,0],[-22.517,-0.724],[-10.788,37.86]],"o":[[25.288,-7.398],[36.098,3.218],[0,0]],"v":[[-38.207,26.791],[38.078,30.823],[87.513,-6.807]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[636.453,358.075],"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 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-2.991,-1.935],[1.393,-9.397],[3.254,-8.925],[-1.049,-10.002],[0,0],[-11.042,-10.598],[20.008,35.512]],"o":[[3.543,-0.536],[7.976,5.16],[-1.392,9.397],[-3.253,8.925],[0,0],[0.418,10.558],[7.218,-35.73],[0,0]],"v":[[-34.042,-55.116],[-23.763,-53.142],[-14.661,-27.77],[-23.79,-0.843],[-27.997,28.159],[-28.105,26.975],[6.752,55.652],[14.035,-54.499]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6431372549019608,0.5647058823529412,0.9568627450980393,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":[635.71,439.352],"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 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-19.251,-20.715],[19.252,-11.749],[12.525,20.715],[-9.779,13.975]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":3,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8823529411764706,0.9215686274509803,1,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":[617.497,415.331],"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 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.037,-6.22],[4.993,-23.691],[-34.033,29.139],[0,0]],"o":[[0,0],[0,0],[-4.999,-3.701],[0,0],[-3.982,18.892],[0,0],[0,0]],"v":[[55.805,-7.473],[11.559,-17.777],[-4.366,-29.569],[-16.488,-23.507],[-52.904,-14.08],[1.026,8.632],[56.886,25.512]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[554.414,404.877],"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 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.976,-5.16],[1.393,-9.397],[3.254,-8.925],[-1.049,-10.001],[2.982,11.029]],"o":[[0.571,-9.482],[7.975,5.161],[-1.393,9.396],[-3.254,8.925],[-2.982,-11.029],[0,0]],"v":[[-16.19,-29.242],[5.695,-38.07],[14.797,-12.698],[5.668,14.229],[1.461,43.23],[-8.484,4.143]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4823529411764706,0.3686274509803922,0.9490196078431372,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":[606.252,424.28],"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 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":7,"s":[{"i":[[0,0],[76.287,8.852],[17.248,1.993]],"o":[[77.45,65.728],[-17.247,-2.001],[0,0]],"v":[[63.279,-99.083],[-7.091,82.071],[-65.557,72.343]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":14,"s":[{"i":[[0,0],[84.904,4.88],[17.248,1.993]],"o":[[83.039,26.063],[-17.334,-0.997],[0,0]],"v":[[-26.996,-99.139],[-19.347,87.726],[-65.557,72.343]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[{"i":[[0,0],[76.287,8.852],[17.248,1.993]],"o":[[77.45,65.728],[-17.247,-2.001],[0,0]],"v":[[63.279,-99.083],[-7.091,82.071],[-65.557,72.343]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":27,"s":[{"i":[[0,0],[84.904,4.88],[17.248,1.993]],"o":[[88.231,6.819],[-17.334,-0.997],[0,0]],"v":[[-46.273,-107.574],[-19.347,87.726],[-65.557,72.343]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":37,"s":[{"i":[[0,0],[76.287,8.852],[17.248,1.993]],"o":[[77.45,65.728],[-17.247,-2.001],[0,0]],"v":[[63.279,-99.083],[-7.091,82.071],[-65.557,72.343]],"c":false}]},{"t":54.0000021994651,"s":[{"i":[[0,0],[76.287,8.852],[17.248,1.993]],"o":[[77.45,65.728],[-17.247,-2.001],[0,0]],"v":[[63.279,-99.083],[-7.091,82.071],[-65.557,72.343]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6431372549019608,0.5647058823529412,0.9568627450980393,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":[717.313,386.909],"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 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"BOX/boxgirl2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[-11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14.961,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21.216,"s":[-11]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":26.903,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36.569,"s":[-11]},{"t":76.0000030955435,"s":[-11]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":497.232,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.525],"y":[0.999]},"o":{"x":[0.167],"y":[0.012]},"t":7,"s":[534.782]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.714],"y":[-0.001]},"t":14.961,"s":[473.393]},{"i":{"x":[0.086],"y":[1.001]},"o":{"x":[0.333],"y":[0]},"t":20.648,"s":[554.791]},{"i":{"x":[0.345],"y":[1.257]},"o":{"x":[0.475],"y":[0.001]},"t":26.903,"s":[484.088]},{"i":{"x":[0.058],"y":[8.039]},"o":{"x":[0.207],"y":[-15.641]},"t":37.138,"s":[534.782]},{"t":76.0000030955435,"s":[534.782]}],"ix":4}},"a":{"a":0,"k":[572.5,586.5,0],"ix":1},"s":{"a":0,"k":[83,83,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.345,-40.918],[0,0],[0,0],[0,0]],"o":[[0,0],[5.794,-40.405],[0,0],[0,0]],"v":[[2.264,43.63],[-8.285,42.896],[-2.262,-43.63],[8.286,-42.896]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,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":[307.842,426.297],"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.221,1.428]],"o":[[0,0],[0,0]],"v":[[0.841,-83.44],[-2.611,82.013]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[306.142,427.058],"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 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-69.992,1.014]],"o":[[69.993,-1.014],[0,0]],"v":[[-112.026,3.123],[112.026,-3.123]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[477.19,351.902],"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 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-38.969,-5.99],[1.82,-62.867]],"o":[[41.66,9.085],[-1.821,62.868],[0,0]],"v":[[-56.581,-95.724],[56.581,-72.475],[52.313,95.724]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666726505,0.737254901961,0.549019607843,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":[308.254,427.051],"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 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-43.799,3.2],[-73.661,-9.244],[-9.976,-73.578],[68.598,2.806],[42.988,11.764],[6.219,42.049]],"o":[[64.703,16],[-14.075,53.761],[-67.608,11.939],[-42.988,-11.764],[7.574,-63.979],[43.799,-3.2]],"v":[[-15.044,-99.102],[169.981,-81.65],[161.058,90.364],[-59.207,94.101],[-169.981,65.062],[-167.562,-99.102]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666726505,0.737254901961,0.549019607843,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":[419.236,430.43],"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 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.235,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.475],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[18.337,-0.432],[53.327,11.084],[-23.981,4.669]],"o":[[-25.774,-4.099],[-48.63,-17.126],[24.904,-3.29],[0,0]],"v":[[81.443,-11.521],[31.961,-12.457],[-76.764,-40.908],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.921,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28.608,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[18.337,-0.432],[53.327,11.084],[-23.981,4.669]],"o":[[-25.774,-4.099],[-48.63,-17.126],[24.904,-3.29],[0,0]],"v":[[81.443,-11.521],[31.961,-12.457],[-76.764,-40.909],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":62,"s":[{"i":[[0,0],[5.295,-25.538],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[68.394,55.122],[-39.877,9.497],[-29.331,-40.56]],"c":false}]},{"t":77.0000031362743,"s":[{"i":[[0,0],[4.29,-26.25],[54.595,20.476],[-5.348,26.556]],"o":[[-5.881,28.24],[-48.63,-17.126],[7.005,-28.32],[0,0]],"v":[[81.443,-11.521],[72.476,56.222],[-39.877,9.497],[-29.331,-40.56]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666726505,0.737254901961,0.549019607843,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":[278.586,536.051],"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 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.976],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.352,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[{"i":[[0,0],[-7.408,-22.677],[85.647,-5.975],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.353,-34.341],[110.216,25.436],[-110.292,41.803],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16.666,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.975],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.353,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-29.356,-13.941],[84.442,-5.729],[19.387,14.399]],"o":[[13.559,13.713],[-83.638,8.019],[-32.035,-13.191],[0,0]],"v":[[96.353,-34.341],[136.329,-10.87],[-68.498,3.481],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22.921,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.976],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.352,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28.608,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.976],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.352,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[-29.356,-13.941],[84.442,-5.729],[19.387,14.399]],"o":[[13.559,13.713],[-83.638,8.019],[-32.035,-13.191],[0,0]],"v":[[96.353,-34.341],[136.329,-10.87],[-68.498,3.481],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.976],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.352,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":52,"s":[{"i":[[0,0],[4.341,-23.172],[85.647,-5.976],[-5.305,25.866]],"o":[[-4.364,20.108],[-80.626,8.376],[3.168,-26.192],[0,0]],"v":[[96.352,-34.341],[83.496,23.989],[-128.163,39.03],[-118.704,-27.565]],"c":false}]},{"t":77.0000031362743,"s":[{"i":[[0,0],[-3.518,-24.757],[85.647,-5.976],[4.373,25.634]],"o":[[1.938,21.197],[-80.626,8.376],[-2.305,-27.236],[0,0]],"v":[[96.352,-34.341],[106.656,24.809],[-115.038,40.968],[-118.704,-27.565]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.866666726505,0.737254901961,0.549019607843,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":[483.54,552.116],"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 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Legs/boxgirl2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[477.2320000000001,513.782,0],"ix":2},"a":{"a":0,"k":[572.5,586.5,0],"ix":1},"s":{"a":0,"k":[83,83,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.742,-7.41],[-14.493,-3.584],[-25.452,2.565]],"o":[[-5.443,5.57],[2.029,20.261],[13.455,3.327],[0,0]],"v":[[-48.474,-30.191],[-57.779,-10.254],[-0.625,23.639],[58.521,27.626]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[647.342,989.901],"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-8.064,5.222]],"o":[[0,0],[0,0]],"v":[[-11.624,-6.953],[11.624,1.731]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[618.704,1014.636],"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 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,3.45],[0,0],[0,0],[0,0],[0,0],[3.45,0]],"o":[[-3.45,0],[0,0],[0,0],[0,0],[0,0],[0,3.45],[0,0]],"v":[[-66.997,10.39],[-73.244,4.143],[-73.244,-10.39],[-70.416,-10.39],[73.244,-10.39],[73.244,4.143],[66.997,10.39]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[630.328,1057.988],"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 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.745,2.543],[-7.412,2.56],[0,0],[0,0]],"o":[[0,0],[0,0],[-2.561,-2.245],[-2.206,-7.525],[0,0],[0,0],[0,0]],"v":[[74.419,-1.574],[75.315,23.542],[-68.346,23.542],[-73.109,16.217],[-63.465,-1.762],[-21.177,-16.372],[-11.369,-23.542]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[628.258,1024.055],"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 4","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.406,-7.312],[-14.756,-2.265],[-25.117,4.846]],"o":[[0,20.776],[3.845,19.996],[13.701,2.102],[0,0]],"v":[[-30.309,-32.271],[-58.915,0.168],[1.056,28.779],[60.321,27.425]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[561.487,975.205],"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 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.561,5.927]],"o":[[0,0],[0,0]],"v":[[-11.967,-6.242],[11.968,0.315]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[519.21,1005.327],"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 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-3.437,0.31]],"o":[[0,0],[0,0],[0,0],[0.311,3.436],[0,0]],"v":[[74.051,5],[71.843,-16.903],[-74.051,-3.715],[-72.448,10.933],[-65.663,16.593]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[535.094,1047.055],"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 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.577,12.468],[-1.576,-12.468]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[605.36,1017.685],"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 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.874,-7.296],[-2.753,-2.005]],"o":[[0,0],[0,0],[-7.151,3.218],[0.971,2.467],[0,0]],"v":[[30.393,-26.012],[21.269,-17.987],[-19.532,0.37],[-27.519,19.143],[-22.114,26.012]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[485.974,1017.073],"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 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.98,"s":[{"i":[[0,0],[-3.442,-105.571]],"o":[[-18.704,112.217],[0,0]],"v":[[-9.493,-158.357],[9.494,158.357]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.393,"s":[{"i":[[0,0],[-3.442,-105.571]],"o":[[3.442,105.571],[0,0]],"v":[[-9.493,-158.357],[9.494,158.357]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.648,"s":[{"i":[[0,0],[-3.442,-105.571]],"o":[[-18.704,112.217],[0,0]],"v":[[-9.493,-158.357],[9.494,158.357]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.765,"s":[{"i":[[0,0],[-3.442,-105.571]],"o":[[3.442,105.571],[0,0]],"v":[[-9.493,-158.357],[9.494,158.357]],"c":false}]},{"t":32.588751327367,"s":[{"i":[[0,0],[-3.442,-105.571]],"o":[[-18.704,112.217],[0,0]],"v":[[-9.493,-158.357],[9.494,158.357]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[519.695,753.384],"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 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.98,"s":[{"i":[[0,0],[3.081,-104.652]],"o":[[-11.201,108.609],[0,0]],"v":[[2.06,-160.308],[6.06,160.309]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.393,"s":[{"i":[[0,0],[3.081,-104.652]],"o":[[5.242,106.157],[0,0]],"v":[[2.06,-160.308],[6.06,160.309]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.648,"s":[{"i":[[0,0],[3.081,-104.652]],"o":[[-11.201,108.609],[0,0]],"v":[[2.06,-160.308],[6.06,160.309]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.765,"s":[{"i":[[0,0],[3.081,-104.652]],"o":[[5.242,106.156],[0,0]],"v":[[2.06,-160.308],[6.06,160.309]],"c":false}]},{"t":32.588751327367,"s":[{"i":[[0,0],[3.081,-104.652]],"o":[[-11.201,108.609],[0,0]],"v":[[2.06,-160.308],[6.06,160.309]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[591.424,810.794],"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 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.98,"s":[{"i":[[0,0],[-21.928,-106.278]],"o":[[-33.777,91.486],[0,0]],"v":[[12.646,-187.238],[21.131,187.238]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.393,"s":[{"i":[[0,0],[-10.66,-108.482]],"o":[[-4.585,92.5],[0,0]],"v":[[12.646,-187.238],[21.131,187.238]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.648,"s":[{"i":[[0,0],[-21.928,-106.278]],"o":[[-33.777,91.486],[0,0]],"v":[[12.646,-187.238],[21.131,187.238]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.765,"s":[{"i":[[0,0],[-10.66,-108.482]],"o":[[-4.585,92.5],[0,0]],"v":[[12.646,-187.238],[21.131,187.238]],"c":false}]},{"t":32.588751327367,"s":[{"i":[[0,0],[-21.928,-106.278]],"o":[[-33.777,91.486],[0,0]],"v":[[12.646,-187.238],[21.131,187.238]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[685.846,756.199],"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 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Body/boxgirl2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10.98,"s":[477.2320000000001,513.782,0],"to":[0,-1.167,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14.393,"s":[477.2320000000001,506.78200000000004,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.648,"s":[477.2320000000001,513.782,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.765,"s":[477.2320000000001,506.78200000000004,0],"to":[0,0,0],"ti":[0,-1.167,0]},{"t":32.588751327367,"s":[477.2320000000001,513.782,0]}],"ix":2},"a":{"a":0,"k":[572.5,586.5,0],"ix":1},"s":{"a":0,"k":[83,83,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[{"i":[[0,0],[-1.842,-18.593],[20.162,4.991],[50.908,0.473],[-108.373,217.759],[-16.355,0],[0,0],[0,0],[-16.432,-8.614]],"o":[[6.366,18.406],[2.049,20.67],[-36.237,-8.969],[0,0],[10.336,-20.768],[0,0],[0,0],[18.522,-12.748],[0,0]],"v":[[132.53,-11.826],[161.147,106.417],[106.529,126.902],[-0.019,112.697],[-47.61,-79.325],[-1.019,-144.415],[23.696,-102.197],[71.999,-130.707],[125.265,-134.421]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[{"i":[[0,0],[-1.842,-18.593],[20.162,4.991],[50.908,0.473],[-104.743,241.812],[-16.355,0],[0,0],[0,0],[-16.432,-8.614]],"o":[[6.366,18.406],[2.049,20.67],[-36.237,-8.969],[0,0],[9.221,-21.286],[0,0],[0,0],[18.522,-12.748],[0,0]],"v":[[132.53,-11.826],[161.147,106.417],[106.529,126.902],[-0.019,112.697],[-75.32,-116.675],[-1.019,-144.415],[23.696,-102.197],[71.999,-130.707],[125.265,-134.421]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[-1.842,-18.593],[20.162,4.991],[50.908,0.473],[-108.373,217.759],[-16.355,0],[0,0],[0,0],[-16.432,-8.614]],"o":[[6.366,18.406],[2.049,20.67],[-36.237,-8.969],[0,0],[10.336,-20.768],[0,0],[0,0],[18.522,-12.748],[0,0]],"v":[[132.53,-11.826],[161.147,106.417],[106.529,126.902],[-0.019,112.697],[-47.61,-88.964],[-1.019,-144.415],[23.696,-102.197],[71.999,-130.707],[125.265,-134.421]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[-1.842,-18.593],[20.162,4.991],[50.908,0.473],[-108.373,217.759],[-16.355,0],[0,0],[0,0],[-16.432,-8.614]],"o":[[6.366,18.406],[2.049,20.67],[-36.237,-8.969],[0,0],[10.336,-20.768],[0,0],[0,0],[18.522,-12.748],[0,0]],"v":[[132.53,-11.826],[161.147,106.417],[106.529,126.902],[-0.019,112.697],[-63.272,-105.831],[-1.019,-144.415],[23.696,-102.197],[71.999,-130.707],[125.265,-134.421]],"c":false}]},{"t":33.0000013441176,"s":[{"i":[[0,0],[-1.842,-18.593],[20.162,4.991],[50.908,0.473],[-108.373,217.759],[-16.355,0],[0,0],[0,0],[-16.432,-8.614]],"o":[[6.366,18.406],[2.049,20.67],[-36.237,-8.969],[0,0],[10.336,-20.768],[0,0],[0,0],[18.522,-12.748],[0,0]],"v":[[132.53,-11.826],[161.147,106.417],[106.529,126.902],[-0.019,112.697],[-47.61,-79.325],[-1.019,-144.415],[23.696,-102.197],[71.999,-130.707],[125.265,-134.421]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6431372549019608,0.5647058823529412,0.9568627450980393,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":[559.529,428.725],"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":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1798.00007323404,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 8/boxgirl2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[477.2320000000001,513.782,0],"ix":2},"a":{"a":0,"k":[572.5,586.5,0],"ix":1},"s":{"a":0,"k":[83,83,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[47.878,-14.752],[3.234,-71.293],[-5.895,-75.093],[33.038,-81.93],[-85.728,-107.22],[-68.517,107.681],[-69.828,139.983],[-38.029,115.117],[46.807,57.257],[162.699,89.342]],"o":[[-55.539,17.112],[-3.198,70.52],[6.233,79.398],[-49.442,122.608],[99.596,124.565],[62.205,-97.761],[57.996,-116.263],[25.413,-76.926],[-71.866,-87.91],[-72.635,-39.886]],"v":[[-164.114,-536.141],[-273.101,-369.18],[-225.408,-209.28],[-297.757,-3.278],[-280.381,426.328],[113.978,424.615],[140.88,74.349],[340.696,-142.095],[303.58,-375.651],[-19.035,-471.694]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333393172,0.972549079446,1,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":[655.005,614.237],"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":0,"op":1798.00007323404,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/lib/core/utils/constants.dart b/lib/core/utils/constants.dart index 37b905d..74260a5 100644 --- a/lib/core/utils/constants.dart +++ b/lib/core/utils/constants.dart @@ -85,9 +85,8 @@ class Style { ); static TextStyle subHeading = TextStyle( - fontSize: 18, + fontSize: 20, fontWeight: FontWeight.bold, - color: textGray, ); static TextStyle body = TextStyle( diff --git a/lib/presentation/group/group_screen.dart b/lib/presentation/group/group_screen.dart index 43b7e4c..61a21b0 100644 --- a/lib/presentation/group/group_screen.dart +++ b/lib/presentation/group/group_screen.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:auto_route/auto_route.dart'; import 'package:beacon/domain/entities/beacon/beacon_entity.dart'; import 'package:beacon/domain/entities/group/group_entity.dart'; +import 'package:beacon/presentation/auth/auth_cubit/auth_cubit.dart'; import 'package:beacon/presentation/group/cubit/group_cubit/group_cubit.dart'; import 'package:beacon/presentation/group/cubit/group_cubit/group_state.dart'; import 'package:beacon/presentation/group/cubit/members_cubit/members_cubit.dart'; @@ -12,12 +13,10 @@ import 'package:beacon/presentation/group/widgets/group_widgets.dart'; import 'package:beacon/presentation/widgets/shimmer.dart'; import 'package:beacon/presentation/widgets/hike_button.dart'; import 'package:beacon/presentation/widgets/loading_screen.dart'; -import 'package:beacon/presentation/widgets/shape_painter.dart'; import 'package:beacon/locator.dart'; import 'package:beacon/core/utils/constants.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:gap/gap.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:responsive_sizer/responsive_sizer.dart'; @@ -71,7 +70,7 @@ class _GroupScreenState extends State @override Widget build(BuildContext context) { - TabController tabController = TabController(length: 1, vsync: this); + final screensize = MediaQuery.of(context).size; return Scaffold( resizeToAvoidBottomInset: false, @@ -86,62 +85,178 @@ class _GroupScreenState extends State return ModalProgressHUD( progressIndicator: const LoadingScreen(), inAsyncCall: state is LoadingGroupState, - child: Stack( - children: [ - CustomPaint( - size: Size(100.w, 100.h - 200), - painter: ShapePainter(), - ), - _buildGroupName(), - Align( - alignment: Alignment(0.9, -0.70), - child: GroupWidgetUtils.filterBeacons( - context, widget.group.id!, _groupCubit), - ), - Align( - alignment: Alignment(0.5, -0.70), - child: GroupWidgetUtils.membersWidget(context), - ), - _buildJoinCreateButton(), - Column( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: MediaQuery.of(context).size.height * 0.565, - margin: EdgeInsets.only(top: 20), - decoration: BoxDecoration( - color: kLightBlue, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(50.0), - topRight: Radius.circular(50.0), - ), + child: Padding( + padding: EdgeInsets.only( + left: screensize.width * 0.04, + right: screensize.width * 0.04, + top: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + visualDensity: VisualDensity.compact, + padding: EdgeInsets.all(0), + icon: const Icon(Icons.arrow_back_outlined, + color: Colors.grey), + onPressed: () => AutoRouter.of(context).maybePop(), + ), + Image.asset( + 'images/beacon_logo.png', + height: 28, ), - child: Column( + IconButton( + icon: const Icon(Icons.power_settings_new, + color: Colors.grey), + onPressed: () => showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: Color(0xffFAFAFA), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0), + ), + title: + Text('Logout', style: Style.heading), + content: Text( + 'Are you sure you want to logout?', + style: TextStyle( + fontSize: 16, color: kBlack), + ), + actions: [ + HikeButton( + buttonWidth: 80, + buttonHeight: 40, + isDotted: true, + onTap: () => AutoRouter.of(context) + .maybePop(false), + text: 'No', + textSize: 18.0, + ), + SizedBox( + height: 5, + ), + HikeButton( + buttonWidth: 80, + buttonHeight: 40, + onTap: () async { + appRouter.replaceNamed('/auth'); + localApi.deleteUser(); + context + .read() + .googleSignOut(); + }, + text: 'Yes', + textSize: 18.0, + ), + ], + ))), + ], + ), + const SizedBox(height: 10), + _buildGroupName(), + const SizedBox(height: 10), + Row( + children: [ + widget.group.members != null && + widget.group.members!.isNotEmpty + ? SizedBox( + width: 40 * + widget.group.members!.length.toDouble(), + // 40 is the width of each profile circle + height: 40, + child: Stack( + children: (widget.group.members != null && + widget.group.members!.length > 3 + ? widget.group.members!.sublist(0, 3) + : widget.group.members ?? []) + .map((member) { + if (member != null) { + return Positioned( + left: widget.group.members! + .indexOf(member) * + 20.0, + child: _buildProfileCircle( + member.id == localApi.userModel.id + ? Colors.teal + : shimmerSkeletonColor, + ), + ); + } else { + return const SizedBox.shrink(); + } + }).toList(), + ), + ) + : Container(), + const SizedBox(width: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - TabBar( - indicatorSize: TabBarIndicatorSize.tab, - indicatorColor: kBlue, - labelColor: kBlack, - tabs: [ - _buildTab(state), - ], - controller: tabController, + Text( + 'Group has ${widget.group.members!.length.toString()} ${widget.group.members!.length == 1 ? 'member' : 'members'}', + style: TextStyle( + color: Colors.grey, + fontSize: 14, + ), ), - Expanded( - child: TabBarView( - controller: tabController, - children: [ - _groupBeacons(state), - ], + const SizedBox(height: 2), + // view all members button + GestureDetector( + onTap: () { + GroupWidgetUtils.showMembers(context); + }, + child: Text( + "View all members", + style: TextStyle( + color: kBlack, + fontSize: 14, + decoration: TextDecoration.underline, + ), + textAlign: TextAlign.start, ), ) ], ), - ) - ], - ), - ], + ], + ), + const SizedBox(height: 30), + _buildJoinCreateButton(), + const SizedBox(height: 30), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'All Beacons', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.purple, + ), + ), + const SizedBox(width: 10), + IconButton( + padding: EdgeInsets.all(0), + visualDensity: VisualDensity.compact, + onPressed: () { + GroupWidgetUtils.showFilterBeaconAlertBox( + context, widget.group.id!, _groupCubit); + }, + icon: Icon( + Icons.filter_alt_outlined, + color: Colors.purple, + ), + ) + ], + ), + const SizedBox(height: 10), + Expanded(child: _groupBeacons(state)), + ], + ), ), ); }, @@ -151,57 +266,51 @@ class _GroupScreenState extends State } Widget _buildJoinCreateButton() { - return Padding( - padding: EdgeInsets.fromLTRB(4.w, 23.h, 4.w, 5), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 45.w, - child: HikeButton( - buttonWidth: homebwidth, - buttonHeight: homebheight - 2, - text: 'Create Hike', - textColor: Colors.white, - borderColor: Colors.white, - buttonColor: kYellow, - onTap: () { - CreateJoinBeaconDialog.createHikeDialog( - context, widget.group.id!); - }, + Size screensize = MediaQuery.of(context).size; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 45.w, + child: HikeButton( + text: 'Create Hike', + widget: Icon( + Icons.add, + color: Colors.black, + size: 18, ), + textColor: Colors.white, + borderColor: Colors.white, + buttonWidth: screensize.width * 0.44, + buttonHeight: 45, + onTap: () { + CreateJoinBeaconDialog.createHikeDialog( + context, widget.group.id!); + }, ), - SizedBox(width: 1.w), - Container( - width: 45.w, - child: HikeButton( - buttonWidth: homebwidth, - buttonHeight: homebheight - 2, - text: 'Join a Hike', - textColor: kYellow, - borderColor: kYellow, - buttonColor: Colors.white, - onTap: () async { - CreateJoinBeaconDialog.joinBeaconDialog(context); - }, + ), + SizedBox(width: 1.w), + Container( + width: 45.w, + child: HikeButton( + text: 'Join a Hike', + widget: Icon( + Icons.add, + color: Colors.black, + size: 18, ), + buttonColor: Colors.white, + isDotted: true, + buttonWidth: screensize.width * 0.44, + buttonHeight: 45, + onTap: () async { + CreateJoinBeaconDialog.joinBeaconDialog(context); + }, ), - ], - ), - ); - } - - Widget _buildTab(GroupState state) { - return Tab( - text: state is AllBeaconGroupState - ? 'All Beacons' - : state is NearbyBeaconGroupState - ? 'Nearby Beacons' - : state is StatusFilterBeaconGroupState - ? '${state.type!.name[0] + state.type!.name.substring(1).toLowerCase()} Beacons' - : 'Loading Beacons..', + ), + ], ); } @@ -238,16 +347,25 @@ class _GroupScreenState extends State } Widget _buildGroupName() { - return Align( - alignment: Alignment(-0.7, -0.95), - child: Container( - width: MediaQuery.of(context).size.width * 0.6, - child: Text( - 'Welcome to Group ${widget.group.title!}', + return Row( + children: [ + Text( + 'Welcome to Group ', textAlign: TextAlign.center, - style: TextStyle(fontSize: 25, color: Colors.white), + style: TextStyle(fontSize: 20, color: Colors.black), ), - ), + SizedBox( + width: 2.w, + ), + Text( + widget.group.title!, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 24, + color: Colors.tealAccent, + fontWeight: FontWeight.bold), + ), + ], ); } @@ -278,50 +396,20 @@ class _GroupScreenState extends State } Widget _buildBeaconCard(BeaconEntity beacon) { - return Slidable( - key: Key(beacon.id!.toString()), - startActionPane: ActionPane( - dragDismissible: true, - dismissible: DismissiblePane( - onDismissed: () { - _groupCubit.reloadState(message: 'Beacon deleted'); - }, - confirmDismiss: () async { - bool? value = await GroupWidgetUtils.deleteDialog(context); - if (value == null || !value) { - return false; - } - bool delete = await _groupCubit.deleteBeacon(beacon); - return delete; - }, - ), - motion: ScrollMotion(), - children: [ - SlidableAction( - onPressed: null, - backgroundColor: Color.fromARGB(255, 217, 100, 94), - foregroundColor: Colors.white, - icon: Icons.delete, - label: 'Delete', - ), - ], - ), - endActionPane: ActionPane( - motion: ScrollMotion(), - children: [ - SlidableAction( - flex: 1, - onPressed: (context) { - GroupWidgetUtils.reScheduleHikeDialog(context, beacon); - }, - backgroundColor: Colors.blueGrey, - foregroundColor: Colors.white, - icon: Icons.edit_calendar, - label: 'Reschedule', - ), - ], - ), - child: BeaconCard(beacon: beacon), + return BeaconCard( + beacon: beacon, + onDelete: () async { + bool? value = await GroupWidgetUtils.deleteDialog(context); + if (value == null || !value) { + return; + } + await _groupCubit.deleteBeacon(beacon); + _groupCubit.reloadState(message: 'Beacon deleted'); + return; + }, + onReschedule: () { + GroupWidgetUtils.reScheduleHikeDialog(context, beacon); + }, ); } @@ -412,3 +500,100 @@ class _GroupScreenState extends State ); } } + +Widget _buildProfileCircle(Color color) { + return Container( + width: 40, + height: 40, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + border: Border.all(color: Colors.white, width: 2), + ), + ); +} + +class HikeCard extends StatelessWidget { + final bool isActive; + final String startTime; + final String endTime; + final String passkey; + + const HikeCard({ + super.key, + required this.isActive, + required this.startTime, + required this.endTime, + required this.passkey, + }); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: const [ + Icon(Icons.hiking, size: 28), + SizedBox(width: 8), + Text('Hike 1', + style: + TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + ], + ), + const SizedBox(height: 8), + Text( + 'Hike is ${isActive ? "Active" : "inactive"}', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: isActive ? Colors.teal : Colors.black87, + ), + ), + const SizedBox(height: 8), + Text('Started at: $startTime'), + Text('Expires at: $endTime'), + const SizedBox(height: 8), + Row( + children: [ + Text('Passkey: $passkey', + style: const TextStyle(fontWeight: FontWeight.w500)), + const Spacer(), + IconButton( + icon: const Icon(Icons.copy), + onPressed: () { + // TODO: Copy to clipboard + }, + ), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + OutlinedButton( + onPressed: () { + // TODO: Delete action + }, + child: const Text("Delete"), + ), + const SizedBox(width: 8), + OutlinedButton( + onPressed: () { + // TODO: Reschedule action + }, + child: const Text("Reschedule"), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/group/widgets/beacon_card.dart b/lib/presentation/group/widgets/beacon_card.dart index 2656c30..6f9cc35 100644 --- a/lib/presentation/group/widgets/beacon_card.dart +++ b/lib/presentation/group/widgets/beacon_card.dart @@ -16,7 +16,14 @@ import 'package:responsive_sizer/responsive_sizer.dart'; class BeaconCard extends StatefulWidget { final BeaconEntity beacon; - const BeaconCard({required this.beacon}); + final void Function()? onDelete; + final void Function()? onReschedule; + BeaconCard( + {required this.beacon, + required this.onDelete, + required this.onReschedule, + Key? key}) + : super(key: key); @override State createState() => _BeaconCardState(); @@ -109,178 +116,214 @@ class _BeaconCardState extends State { locator().joinBeacon(beacon, hasEnded, hasStarted); }, child: Container( - margin: const EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, - ), - padding: EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8, top: 8), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: 70.w, - child: Text( - '${beacon.title} by ${beacon.leader!.name} ', - style: Style.titleTextStyle, - ), - ), - Align( - alignment: Alignment.topRight, - child: (hasStarted && !hasEnded) - ? BlinkIcon() - : willStart - ? Align( - alignment: Alignment.topRight, - child: Icon( - Icons.circle, - color: kYellow, - size: 10, - ), - ) - : null, - ), - ], - ), - SizedBox(height: 4.0), - (hasStarted && !hasEnded) - ? RichText( - text: TextSpan( - text: 'Hike is ', - style: Style.commonTextStyle, - children: const [ - TextSpan( - text: 'Active', + margin: const EdgeInsets.only(bottom: 10.0), + padding: EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8, top: 8), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 70.w, + child: Row( + children: [ + Icon( + Icons.hiking, + color: Colors.black, + ), + SizedBox(width: 8.0), + Text( + '${beacon.title!.toUpperCase()} by ${beacon.leader!.name} ', style: TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold, - letterSpacing: 1.0), + fontSize: 18.0, + color: Colors.black, + fontWeight: FontWeight.w700, + ), ), ], ), - ) - : willStart - ? Row( - children: [ - RichText( - text: TextSpan( - text: 'Hike ', - style: Style.commonTextStyle, - children: const [ - TextSpan( - text: 'Starts ', - style: TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold, - letterSpacing: 1.0), - ), - TextSpan( - text: 'in ', - style: TextStyle( - color: const Color(0xffb6b2df), - fontSize: 14.0, - fontWeight: FontWeight.w400), - ), - ], - ), - ), - SizedBox( - width: 3.0, - ), - CountdownTimerPage( - dateTime: DateTime.fromMillisecondsSinceEpoch( - beacon.startsAt!), - name: beacon.title, - beacon: beacon, - ) - ], - ) - : Row( - children: [ - RichText( - text: TextSpan( - text: 'Hike ', - style: Style.commonTextStyle, - children: const [ - TextSpan( - text: 'is Ended', - style: TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold, - letterSpacing: 1.0), + ), + Align( + alignment: Alignment.topRight, + child: (hasStarted && !hasEnded) + ? BlinkIcon() + : willStart + ? Align( + alignment: Alignment.topRight, + child: Icon( + Icons.circle, + color: kYellow, + size: 10, ), - ], - ), + ) + : null, + ), + ], + ), + SizedBox(height: 8.0), + (hasStarted && !hasEnded) + ? RichText( + text: TextSpan( + text: 'Hike is ', + style: Style.commonTextStyle, + children: const [ + TextSpan( + text: 'Active', + style: TextStyle( + fontSize: 16.0, + color: Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 1.0), ), ], ), - SizedBox(height: 4.0), - Row( - children: [ - Text('Passkey: ${beacon.shortcode}', - style: Style.commonTextStyle), - Gap(10), - InkWell( - onTap: () { - Clipboard.setData( - ClipboardData(text: beacon.shortcode.toString())); - utils.showSnackBar('Shortcode copied!', context); - }, - child: Icon( - Icons.copy, - color: Colors.white, - size: 15, - )) - ], - ), - SizedBox(height: 4.0), - (beacon.startsAt != null) - ? Text( - willStart - ? 'Starting At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.startsAt!)).toString()}' - : 'Started At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.startsAt!)).toString()}', - style: Style.commonTextStyle) - : Container(), - SizedBox(height: 4.0), - (beacon.expiresAt != null) - ? willStart - ? Text( - 'Expiring At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.expiresAt!)).toString()}', - style: Style.commonTextStyle) - : Text( - 'Expires At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.expiresAt!)).toString()}', - style: Style.commonTextStyle) - : Container(), - ], - ) - ], - ), - decoration: BoxDecoration( - color: willStart - ? Color(0xFF141546) - : hasEnded - ? lightkBlue - : kBlue, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8.0), - boxShadow: [ - BoxShadow( - color: Colors.black26, - blurRadius: 10.0, - offset: Offset(0.0, 10.0), - ), - ], - ), - ), + ) + : willStart + ? Row( + children: [ + RichText( + text: TextSpan( + text: 'Hike ', + style: Style.commonTextStyle, + children: const [ + TextSpan( + text: 'Starts ', + style: TextStyle( + fontSize: 16.0, + color: Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 1.0), + ), + TextSpan( + text: 'in ', + style: TextStyle( + color: const Color(0xffb6b2df), + fontSize: 14.0, + fontWeight: FontWeight.w400), + ), + ], + ), + ), + SizedBox( + width: 3.0, + ), + CountdownTimerPage( + dateTime: DateTime.fromMillisecondsSinceEpoch( + beacon.startsAt!), + name: beacon.title, + beacon: beacon, + ) + ], + ) + : Row( + children: [ + RichText( + text: TextSpan( + text: 'Hike ', + style: Style.commonTextStyle, + children: const [ + TextSpan( + text: 'is Ended', + style: TextStyle( + fontSize: 16.0, + color: Colors.black, + fontWeight: FontWeight.bold, + letterSpacing: 1.0), + ), + ], + ), + ), + ], + ), + SizedBox(height: 4.0), + Row( + children: [ + Text('Passkey: ${beacon.shortcode}', + style: Style.commonTextStyle), + Gap(10), + InkWell( + onTap: () { + Clipboard.setData(ClipboardData( + text: beacon.shortcode.toString())); + utils.showSnackBar('Shortcode copied!', context); + }, + child: Icon( + Icons.copy, + color: Colors.black, + size: 15, + )) + ], + ), + SizedBox(height: 4.0), + (beacon.startsAt != null) + ? Text( + willStart + ? 'Starting At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.startsAt!)).toString()}' + : 'Started At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.startsAt!)).toString()}', + style: Style.commonTextStyle) + : Container(), + SizedBox(height: 4.0), + (beacon.expiresAt != null) + ? willStart + ? Text( + 'Expiring At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.expiresAt!)).toString()}', + style: Style.commonTextStyle) + : Text( + 'Expires At: ${DateFormat("hh:mm a, d/M/y").format(DateTime.fromMillisecondsSinceEpoch(beacon.expiresAt!)).toString()}', + style: Style.commonTextStyle) + : Container(), + SizedBox(height: 4.0), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + OutlinedButton( + style: OutlinedButton.styleFrom( + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(horizontal: 2), + visualDensity: const VisualDensity( + horizontal: -2.0, vertical: -2.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0)), + side: const BorderSide(color: Colors.black)), + onPressed: widget.onDelete, + child: const Text("Delete"), + ), + const SizedBox(width: 10), + OutlinedButton( + style: OutlinedButton.styleFrom( + padding: const EdgeInsets.symmetric(horizontal: 4), + visualDensity: const VisualDensity( + horizontal: .0, vertical: -2.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0)), + foregroundColor: Colors.black, + side: const BorderSide(color: Colors.black)), + onPressed: widget.onReschedule, + child: const Text("Reschedule"), + ), + ], + ) + ], + ) + ], + ), + decoration: BoxDecoration( + color: Colors.grey[50], + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8.0), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + offset: Offset(0.0, 1.0), + blurRadius: 6.0, + ), + ], + )), ); } diff --git a/lib/presentation/group/widgets/create_join_dialog.dart b/lib/presentation/group/widgets/create_join_dialog.dart index fe4baa8..a1fd5ff 100644 --- a/lib/presentation/group/widgets/create_join_dialog.dart +++ b/lib/presentation/group/widgets/create_join_dialog.dart @@ -3,12 +3,10 @@ import 'package:beacon/core/utils/validators.dart'; import 'package:beacon/presentation/group/cubit/group_cubit/group_cubit.dart'; import 'package:beacon/presentation/home/home_cubit/home_cubit.dart'; import 'package:beacon/locator.dart'; -import 'package:beacon/presentation/widgets/hike_button.dart'; import 'package:beacon/core/utils/constants.dart'; import 'package:duration_picker/duration_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:gap/gap.dart'; import 'package:intl/intl.dart'; import 'package:responsive_sizer/responsive_sizer.dart'; @@ -18,75 +16,92 @@ class CreateJoinGroupDialog { static final TextEditingController _groupNameController = TextEditingController(); - static Future createGroupDialog( - BuildContext context, - ) { - bool isSmallSized = 100.h < 800; + static Future createGroupDialog(BuildContext context) { + // Use MediaQuery instead of responsive height for more consistent sizing + final size = MediaQuery.of(context).size; + final isSmallScreen = size.height < 800; + return showDialog( context: context, builder: (context) => Dialog( + backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + borderRadius: BorderRadius.circular(16.0), ), - child: SingleChildScrollView( + child: Container( + width: size.width * 0.85, // Set a reasonable width + height: isSmallScreen ? size.height * 0.3 : size.height * 0.25, + padding: const EdgeInsets.all(24), child: Form( key: _groupKey, - child: Container( - height: isSmallSized ? 30.h : 25.h, - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 32, vertical: 16), - child: Column( - children: [ - Container( - height: isSmallSized ? 12.h : 10.h, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: TextFormField( - controller: _groupNameController, - style: TextStyle(fontSize: 22.0), - validator: (value) => - Validator.validateBeaconTitle(value!), - onChanged: (name) {}, - decoration: InputDecoration( - border: InputBorder.none, - hintText: 'Enter Title Here', - labelStyle: TextStyle( - fontSize: labelsize, color: kYellow), - hintStyle: TextStyle( - fontSize: hintsize, color: hintColor), - labelText: 'Title', - alignLabelWithHint: true, - floatingLabelBehavior: - FloatingLabelBehavior.always, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none), - ), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Create New Group', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Container( + height: 60, + decoration: BoxDecoration( + color: kLightBlue, + borderRadius: BorderRadius.circular(8), + ), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: TextFormField( + controller: _groupNameController, + style: TextStyle(fontSize: 18.0), + validator: (value) => Validator.validateBeaconTitle(value!), + decoration: InputDecoration( + hintText: 'Enter Group Title', + labelText: 'Title', + labelStyle: TextStyle( + fontSize: 14, + color: Theme.of(context).primaryColor, ), - color: kLightBlue, + hintStyle: + TextStyle(fontSize: 16, color: Colors.grey[400]), + alignLabelWithHint: true, + floatingLabelBehavior: FloatingLabelBehavior.always, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + contentPadding: EdgeInsets.zero, ), - SizedBox( - height: 2.h, + ), + ), + SizedBox(height: 16), + ElevatedButton( + onPressed: () { + if (!_groupKey.currentState!.validate()) return; + AutoRouter.of(context).maybePop(); + context + .read() + .createGroup(_groupNameController.text.trim()); + _groupNameController.clear(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(160, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), ), - Flexible( - flex: 2, - child: HikeButton( - text: 'Create Group', - textSize: 18.0, - textColor: Colors.white, - buttonColor: kYellow, - onTap: () { - if (!_groupKey.currentState!.validate()) return; - AutoRouter.of(context).maybePop(); - context - .read() - .createGroup(_groupNameController.text.trim()); - _groupNameController.clear(); - }), + ), + child: Text( + 'Create Group', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, ), - ], + ), ), - ), + ], ), ), ), @@ -100,70 +115,95 @@ class CreateJoinGroupDialog { TextEditingController(); static Future joinGroupDialog(BuildContext context) { - bool isSmallSized = MediaQuery.of(context).size.height < 800; + final size = MediaQuery.of(context).size; + final isSmallScreen = size.height < 800; + return showDialog( context: context, builder: (context) => Dialog( + backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + borderRadius: BorderRadius.circular(16.0), ), - child: Form( - key: _joinGroupKey, - child: Container( - height: isSmallSized ? 30.h : 25.h, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), - child: Column( - children: [ - Container( - height: isSmallSized ? 12.h : 10.h, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: TextFormField( - controller: _joinGroupController, - keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.characters, - style: TextStyle(fontSize: 22.0), - validator: (value) => Validator.validatePasskey(value!), - onChanged: (value) { - _joinGroupController.text = value.toUpperCase(); - }, - decoration: InputDecoration( - alignLabelWithHint: true, - floatingLabelBehavior: FloatingLabelBehavior.always, - hintText: 'Enter Group Code Here', - hintStyle: - TextStyle(fontSize: hintsize, color: hintColor), - labelText: 'Code', - labelStyle: - TextStyle(fontSize: labelsize, color: kYellow), - border: InputBorder.none, - ), + child: Container( + width: size.width * 0.85, + height: isSmallScreen ? size.height * 0.3 : size.height * 0.25, + padding: const EdgeInsets.all(24), + child: Form( + key: _joinGroupKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Join Group', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Container( + height: 60, + decoration: BoxDecoration( + color: kLightBlue, + borderRadius: BorderRadius.circular(8), + ), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: TextFormField( + controller: _joinGroupController, + keyboardType: TextInputType.text, + textCapitalization: TextCapitalization.characters, + style: TextStyle(fontSize: 18.0), + validator: (value) => Validator.validatePasskey(value!), + onChanged: (value) { + _joinGroupController.text = value.toUpperCase(); + }, + decoration: InputDecoration( + hintText: 'Enter Group Code Here', + labelText: 'Code', + labelStyle: TextStyle( + fontSize: 14, + color: Theme.of(context).primaryColor, ), + hintStyle: + TextStyle(fontSize: 16, color: Colors.grey[400]), + alignLabelWithHint: true, + floatingLabelBehavior: FloatingLabelBehavior.always, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + contentPadding: EdgeInsets.zero, ), - color: kLightBlue, ), - SizedBox( - height: 2.h, + ), + SizedBox(height: 16), + ElevatedButton( + onPressed: () { + if (!_joinGroupKey.currentState!.validate()) return; + appRouter.maybePop(); + context + .read() + .joinGroup(_joinGroupController.text.trim()); + _joinGroupController.clear(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(160, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), ), - Flexible( - child: HikeButton( - text: 'Join Group', - textSize: 18.0, - textColor: Colors.white, - buttonColor: kYellow, - onTap: () { - if (!_joinGroupKey.currentState!.validate()) return; - appRouter.maybePop(); - context - .read() - .joinGroup(_joinGroupController.text.trim()); - _joinGroupController.clear(); - }, + child: Text( + 'Join Group', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, ), ), - ], - ), + ), + ], ), ), ), @@ -180,47 +220,74 @@ Duration? duration = Duration(minutes: 5); class CreateJoinBeaconDialog { static Future createHikeDialog(BuildContext context, String groupId) { - bool isSmallSized = 100.h < 800; + final size = MediaQuery.of(context).size; + final isSmallScreen = size.height < 800; + return showDialog( context: context, builder: (context) => Dialog( + backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + borderRadius: BorderRadius.circular(16.0), ), child: Container( - height: isSmallSized ? 30.h : 25.h, - child: ListView( - padding: EdgeInsets.symmetric(horizontal: 15.w), + width: size.width * 0.85, + height: isSmallScreen ? size.height * 0.3 : size.height * 0.25, + padding: const EdgeInsets.all(24), + child: Column( + //mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Gap(15), Text( - 'Create hike', - textAlign: TextAlign.center, + 'Create Hike', style: TextStyle( - fontSize: 25, + fontSize: 20, + fontWeight: FontWeight.bold, ), ), - Gap(20), - HikeButton( - text: 'Start Hike', - buttonWidth: 2, - buttonHeight: 16, - buttonColor: kYellow, - onTap: () { + const SizedBox(height: 16), + ElevatedButton( + onPressed: () { Navigator.of(context).pop(); createHikeBox(context, groupId, true); }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(double.infinity, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), + ), + child: Text( + 'Start Hike', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), ), - Gap(10), - HikeButton( - text: 'Schedule Hike', - buttonWidth: 5, - buttonHeight: 16, - buttonColor: kYellow, - onTap: () { + const SizedBox(height: 15), + ElevatedButton( + onPressed: () { Navigator.of(context).pop(); createHikeBox(context, groupId, false); }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(double.infinity, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), + ), + child: Text( + 'Schedule Hike', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), ), ], ), @@ -252,8 +319,9 @@ class CreateJoinBeaconDialog { builder: (context) => GestureDetector( onTap: () => FocusManager.instance.primaryFocus?.unfocus(), child: Dialog( + backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + borderRadius: BorderRadius.circular(16.0), ), child: SingleChildScrollView( child: Form( @@ -268,11 +336,12 @@ class CreateJoinBeaconDialog { : 65.h, child: Padding( padding: - const EdgeInsets.symmetric(horizontal: 32, vertical: 16), + const EdgeInsets.symmetric(horizontal: 20, vertical: 16), child: Column( children: [ Container( height: isSmallSized ? 14.h : 12.h, + child: Padding( padding: const EdgeInsets.all(4.0), child: TextFormField( @@ -287,10 +356,15 @@ class CreateJoinBeaconDialog { _titleNode.unfocus(); }, decoration: InputDecoration( + fillColor: Colors.grey[200], + filled: true, + contentPadding: EdgeInsets.symmetric( + horizontal: 16, vertical: 8), border: InputBorder.none, hintText: 'Enter Title Here', labelStyle: TextStyle( - fontSize: labelsize, color: kYellow), + fontSize: labelsize, + color: Theme.of(context).primaryColor), hintStyle: TextStyle( fontSize: hintsize, color: hintColor), labelText: 'Title', @@ -301,9 +375,9 @@ class CreateJoinBeaconDialog { enabledBorder: InputBorder.none), ), ), - color: kLightBlue, + // color: Colors.grey[200], ), - isInstant ? Container() : SizedBox(height: 2.h), + isInstant ? Container() : SizedBox(height: 1.2.h), // start date field isInstant ? Container() @@ -318,17 +392,6 @@ class CreateJoinBeaconDialog { initialDate: startDate ?? DateTime.now(), firstDate: startDate ?? DateTime.now(), lastDate: DateTime(2100), - // builder: (context, child) => Theme( - // // data: ThemeData().copyWith( - // // textTheme: - // // Theme.of(context).textTheme, - // // colorScheme: ColorScheme.light( - // // primary: kLightBlue, - // // onPrimary: Colors.grey, - // // surface: kBlue, - // // ), - // // ), - // child: child!), ); if (startDate == null) return; _dateController.text = @@ -343,11 +406,16 @@ class CreateJoinBeaconDialog { focusNode: _startDateNode, onEditingComplete: () {}, decoration: InputDecoration( + fillColor: Colors.grey[200], + filled: true, + contentPadding: EdgeInsets.symmetric( + horizontal: 16, vertical: 8), border: InputBorder.none, hintText: 'Choose Start Date', labelStyle: TextStyle( fontSize: labelsize, - color: kYellow), + color: + Theme.of(context).primaryColor), hintStyle: TextStyle( fontSize: hintsize, color: hintColor), @@ -360,9 +428,8 @@ class CreateJoinBeaconDialog { ), ), ), - color: kLightBlue, ), - isInstant ? Container() : SizedBox(height: 2.h), + isInstant ? Container() : SizedBox(height: 1.2.h), // Start Time Field isInstant ? SizedBox.shrink() @@ -397,6 +464,10 @@ class CreateJoinBeaconDialog { enabled: false, onEditingComplete: () {}, decoration: InputDecoration( + fillColor: Colors.grey[200], + filled: true, + contentPadding: EdgeInsets.symmetric( + horizontal: 16, vertical: 8), border: InputBorder.none, alignLabelWithHint: true, errorStyle: @@ -405,7 +476,9 @@ class CreateJoinBeaconDialog { FloatingLabelBehavior.always, labelText: 'Start Time', labelStyle: TextStyle( - fontSize: labelsize, color: kYellow), + fontSize: labelsize, + color: + Theme.of(context).primaryColor), hintStyle: TextStyle( fontSize: hintsize, color: hintColor), hintText: 'Choose start time', @@ -415,9 +488,8 @@ class CreateJoinBeaconDialog { ), ), ), - color: kLightBlue, ), - SizedBox(height: 2.h), + SizedBox(height: 1.2.h), // Duration Field Container( height: isSmallSized ? 14.h : 12.h, @@ -445,6 +517,10 @@ class CreateJoinBeaconDialog { validator: (value) => Validator.validateDuration(value.toString()), decoration: InputDecoration( + fillColor: Colors.grey[200], + filled: true, + contentPadding: EdgeInsets.symmetric( + horizontal: 16, vertical: 8), border: InputBorder.none, alignLabelWithHint: true, errorStyle: TextStyle(color: Colors.red[800]), @@ -452,7 +528,8 @@ class CreateJoinBeaconDialog { FloatingLabelBehavior.always, labelText: 'Duration', labelStyle: TextStyle( - fontSize: labelsize, color: kYellow), + fontSize: labelsize, + color: Theme.of(context).primaryColor), hintStyle: TextStyle( fontSize: hintsize, color: hintColor), hintText: 'Enter duration of hike', @@ -461,17 +538,13 @@ class CreateJoinBeaconDialog { ), ), ), - color: kLightBlue, ), SizedBox(height: 2.h), Flexible( - flex: 2, - child: HikeButton( - text: isInstant ? 'Start' : 'Create', - textSize: 18.0, - textColor: Colors.white, - buttonColor: kYellow, - onTap: () async { + flex: 2, + child: // Replace the Flexible widget with this + ElevatedButton( + onPressed: () async { if (_createFormKey.currentState!.validate()) { var groupCubit = locator(); if (!isInstant) { @@ -483,7 +556,6 @@ class CreateJoinBeaconDialog { startTime!.minute); final startsAt = start.millisecondsSinceEpoch; - final expiresAt = start .add(duration!) .millisecondsSinceEpoch; @@ -498,7 +570,6 @@ class CreateJoinBeaconDialog { } else { int startsAt = DateTime.now().millisecondsSinceEpoch; - int expiresAt = DateTime.now() .add(duration!) .millisecondsSinceEpoch; @@ -512,8 +583,25 @@ class CreateJoinBeaconDialog { appRouter.maybePop(); } } - }), - ), + }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(160, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), + padding: EdgeInsets.symmetric( + horizontal: 24, vertical: 12), + ), + child: Text( + isInstant ? 'Start' : 'Create', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + )), ], ), ), @@ -528,69 +616,92 @@ class CreateJoinBeaconDialog { static GlobalKey _joinBeaconKey = GlobalKey(); static TextEditingController _joinBeaconController = TextEditingController(); static Future joinBeaconDialog(BuildContext context) { - bool isSmallSized = MediaQuery.of(context).size.height < 800; + final size = MediaQuery.of(context).size; + final isSmallScreen = size.height < 800; + return showDialog( context: context, builder: (context) => Dialog( + backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), + borderRadius: BorderRadius.circular(16.0), ), - child: Form( - key: _joinBeaconKey, - child: Container( - height: isSmallSized ? 30.h : 25.h, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), - child: Column( - children: [ - Container( - height: isSmallSized ? 14.h : 12.h, - child: Padding( - padding: const EdgeInsets.all(4.0), - child: TextFormField( - controller: _joinBeaconController, - keyboardType: TextInputType.text, - textCapitalization: TextCapitalization.characters, - style: TextStyle(fontSize: 22.0), - validator: (value) => Validator.validatePasskey(value!), - onChanged: (key) { - _joinBeaconController.text = key.toUpperCase(); - }, - decoration: InputDecoration( - alignLabelWithHint: true, - floatingLabelBehavior: FloatingLabelBehavior.always, - hintText: 'Enter Passkey Here', - hintStyle: - TextStyle(fontSize: hintsize, color: hintColor), - labelText: 'Passkey', - labelStyle: - TextStyle(fontSize: labelsize, color: kYellow), - border: InputBorder.none, - ), - ), - ), + child: Container( + width: size.width * 0.85, + height: isSmallScreen ? size.height * 0.3 : size.height * 0.25, + padding: const EdgeInsets.all(24), + child: Form( + key: _joinBeaconKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Join Beacon', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Container( + height: 60, + decoration: BoxDecoration( color: kLightBlue, + borderRadius: BorderRadius.circular(8), + ), + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: TextFormField( + controller: _joinBeaconController, + keyboardType: TextInputType.text, + textCapitalization: TextCapitalization.characters, + style: TextStyle(fontSize: 18.0), + validator: (value) => Validator.validatePasskey(value!), + onChanged: (key) { + _joinBeaconController.text = key.toUpperCase(); + }, + decoration: InputDecoration( + hintText: 'Enter Passkey Here', + labelText: 'Passkey', + labelStyle: TextStyle( + fontSize: 14, color: Theme.of(context).primaryColor), + hintStyle: + TextStyle(fontSize: 16, color: Colors.grey[400]), + alignLabelWithHint: true, + floatingLabelBehavior: FloatingLabelBehavior.always, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + contentPadding: EdgeInsets.zero, + ), ), - SizedBox( - height: 2.h, + ), + SizedBox(height: 16), + ElevatedButton( + onPressed: () { + if (!_joinBeaconKey.currentState!.validate()) return; + locator() + .joinBeaconWithShortCode(_joinBeaconController.text); + appRouter.maybePop(); + _joinBeaconController.clear(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).primaryColor, + minimumSize: Size(160, 48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), ), - Flexible( - child: HikeButton( - text: 'Validate', - textSize: 18.0, - textColor: Colors.white, - buttonColor: kYellow, - onTap: () { - if (!_joinBeaconKey.currentState!.validate()) return; - locator().joinBeaconWithShortCode( - _joinBeaconController.text); - appRouter.maybePop(); - _joinBeaconController.clear(); - }, + child: Text( + 'Validate', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, ), ), - ], - ), + ), + ], ), ), ), diff --git a/lib/presentation/group/widgets/group_widgets.dart b/lib/presentation/group/widgets/group_widgets.dart index 0ad93de..6c36742 100644 --- a/lib/presentation/group/widgets/group_widgets.dart +++ b/lib/presentation/group/widgets/group_widgets.dart @@ -23,13 +23,13 @@ class GroupWidgetUtils { heroTag: 'members', backgroundColor: kYellow, onPressed: () { - _showMembers(context); + showMembers(context); }, child: Icon(Icons.person, size: 30), ); } - static void _showMembers(BuildContext context) { + static void showMembers(BuildContext context) { // Dialog for filtering beacons locator().loadMembers(); showDialog( @@ -163,7 +163,7 @@ class GroupWidgetUtils { return FloatingActionButton( heroTag: 'filter beacon', backgroundColor: kYellow, - onPressed: () => _showFilterBeaconAlertBox(context, groupId, groupCubit), + onPressed: () => showFilterBeaconAlertBox(context, groupId, groupCubit), child: ImageIcon( AssetImage(AppConstants.filterIconPath), size: 35, @@ -420,7 +420,7 @@ class GroupWidgetUtils { ); } - static void _showFilterBeaconAlertBox( + static void showFilterBeaconAlertBox( BuildContext context, String groupId, GroupCubit groupCubit) { log(100.h.toString()); // Dialog for filtering beacons @@ -429,12 +429,12 @@ class GroupWidgetUtils { builder: (context) { bool isSmallSized = 100.h < 800; return AlertDialog( + backgroundColor: Colors.grey[100], title: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ImageIcon( AssetImage(AppConstants.filterIconPath), - size: 30, semanticLabel: 'Filter', color: Colors.black, ), @@ -454,21 +454,27 @@ class GroupWidgetUtils { itemBuilder: (context, index) { String type = filters.values[index].name; - return HikeButton( - buttonWidth: 2.w, - buttonHeight: 1.h, - text: type, - onTap: () { - Navigator.pop(context); - if (filters.values[index] == filters.NEARBY) { - _neabyFilterAlertBox(context, groupId, groupCubit); - } else { - locator() - .changeFilter(filters.values[index]); - } - }, - buttonColor: kYellow, - ); + return ElevatedButton( + onPressed: () { + Navigator.pop(context); + if (filters.values[index] == filters.NEARBY) { + _neabyFilterAlertBox(context, groupId, groupCubit); + } else { + locator() + .changeFilter(filters.values[index]); + } + }, + child: Text( + type, + style: TextStyle(fontSize: 18, height: 1.5), + ), + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + padding: + EdgeInsets.symmetric(vertical: 10, horizontal: 20), + )); }, ), ), diff --git a/lib/presentation/home/home_screen.dart b/lib/presentation/home/home_screen.dart index 300b54b..96e609b 100644 --- a/lib/presentation/home/home_screen.dart +++ b/lib/presentation/home/home_screen.dart @@ -8,7 +8,6 @@ import 'package:beacon/presentation/widgets/shimmer.dart'; import 'package:beacon/presentation/home/widgets/group_card.dart'; import 'package:beacon/presentation/widgets/hike_button.dart'; import 'package:beacon/presentation/widgets/loading_screen.dart'; -import 'package:beacon/presentation/widgets/shape_painter.dart'; import 'package:beacon/locator.dart'; import 'package:beacon/core/utils/constants.dart'; import 'package:flutter/material.dart'; @@ -16,6 +15,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:responsive_sizer/responsive_sizer.dart'; +import 'package:lottie/lottie.dart'; @RoutePage() class HomeScreen extends StatefulWidget { @@ -98,6 +98,8 @@ class _HomeScreenState extends State { @override Widget build(BuildContext context) { + final screensize = MediaQuery.of(context).size; + return PopScope( canPop: false, onPopInvokedWithResult: (bool didPop, Object? result) async { @@ -125,180 +127,167 @@ class _HomeScreenState extends State { child: ModalProgressHUD( inAsyncCall: state is LoadingHomeState ? true : false, progressIndicator: LoadingScreen(), - child: Stack( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - CustomPaint( - size: Size(100.w, 100.h - 200), - painter: ShapePainter(), - ), - // CustomPaint( - // size: Size(100.w, 100.h), - // painter: DrawCircle(), - // ), - Align( - alignment: Alignment(0.9, -0.8), - child: FloatingActionButton( - onPressed: () => showDialog( - context: context, - builder: (context) => AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), - ), - title: Text( - localApi.userModel.isGuest == true - ? 'Create Account' - : 'Logout', - style: TextStyle( - fontSize: 25, color: kYellow), - ), - content: Text( - localApi.userModel.isGuest == true - ? 'Would you like to create an account?' - : 'Are you sure you want to logout?', - style: TextStyle( - fontSize: 16, color: kBlack), - ), - actions: [ - HikeButton( - buttonHeight: 2.5.h, - buttonWidth: 8.w, - onTap: () => AutoRouter.of(context) - .maybePop(false), - text: 'No', - textSize: 18.0, - ), - SizedBox( - height: 5, - ), - HikeButton( - buttonHeight: 2.5.h, - buttonWidth: 8.w, - onTap: () async { - appRouter.replaceNamed('/auth'); - localApi.deleteUser(); - context - .read() - .googleSignOut(); - }, - text: 'Yes', - textSize: 18.0, - ), - ], - )), - backgroundColor: kYellow, - child: localApi.userModel.isGuest == true - ? Icon(Icons.person) - : Icon(Icons.logout)), - ), Padding( - padding: EdgeInsets.fromLTRB(4.w, 23.h, 4.w, 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, + padding: EdgeInsets.only( + left: screensize.width * 0.04, + right: screensize.width * 0.04, + top: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - width: 45.w, - child: HikeButton( - buttonWidth: homebwidth - 10, - buttonHeight: homebheight - 2, - text: 'Create Group', - textColor: Colors.white, - borderColor: Colors.white, - buttonColor: kYellow, - onTap: () async { - CreateJoinGroupDialog.createGroupDialog( - context); - }, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'images/beacon_logo.png', + height: 28, + ), + IconButton( + icon: const Icon(Icons.power_settings_new, + color: Colors.grey), + onPressed: () => showDialog( + context: context, + builder: (context) => AlertDialog( + backgroundColor: Color(0xffFAFAFA), + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(12.0), + ), + title: Text('Logout', + style: Style.heading), + content: Text( + 'Are you sure you want to logout?', + style: TextStyle( + fontSize: 16, color: kBlack), + ), + actions: [ + HikeButton( + buttonWidth: 80, + buttonHeight: 40, + isDotted: true, + onTap: () => + AutoRouter.of(context) + .maybePop(false), + text: 'No', + textSize: 18.0, + ), + SizedBox( + height: 5, + ), + HikeButton( + buttonWidth: 80, + buttonHeight: 40, + onTap: () async { + appRouter + .replaceNamed('/auth'); + localApi.deleteUser(); + context + .read() + .googleSignOut(); + }, + text: 'Yes', + textSize: 18.0, + ), + ], + ))), + ], + ), + + // welcome message + const SizedBox(height: 20), + + // Welcome message + Row( + children: [ + Text( + 'Welcome back, ', + style: Style.subHeading + .copyWith(fontWeight: FontWeight.w600), + ), + Text( + localApi.userModel.name + .toString() + .toUpperCase()[0] + + localApi.userModel.name + .toString() + .substring(1), + style: Style.heading + .copyWith(color: Colors.teal)), + ], + ), + + // Ready to explore + Text( + 'Ready to explore?', + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: Color(0xFF673AB7), ), + textAlign: TextAlign.start, ), - SizedBox( - width: 1.w, + + SizedBox(height: 2.h), + + // Create and Join Group + + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + HikeButton( + widget: Icon( + Icons.add, + color: Colors.black, + size: 18, + ), + buttonWidth: screensize.width * 0.44, + buttonHeight: 45, + text: 'Create Group', + onTap: () async { + CreateJoinGroupDialog.createGroupDialog( + context); + }, + ), + SizedBox( + width: 1.w, + ), + HikeButton( + widget: Icon( + Icons.add, + color: Colors.teal, + size: 18, + ), + isDotted: true, + buttonWidth: screensize.width * 0.44, + buttonHeight: 45, + text: 'Join a Group', + onTap: () async { + CreateJoinGroupDialog.joinGroupDialog( + context); + }, + ), + ], ), - Container( - width: 45.w, - child: HikeButton( - buttonWidth: homebwidth, - buttonHeight: homebheight - 2, - text: 'Join a Group', - textColor: kYellow, - borderColor: kYellow, - buttonColor: Colors.white, - onTap: () async { - CreateJoinGroupDialog.joinGroupDialog(context); - }, + SizedBox(height: 4.h), + Text( + 'Your Groups', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, ), + textAlign: TextAlign.start, ), ], ), ), - Positioned( - bottom: 0, - child: Container( - decoration: BoxDecoration( - color: kLightBlue, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(30), - topRight: Radius.circular(30))), - height: 56.h, - width: 100.w, - child: Column( - children: [ - Tab(text: 'Your Groups'), - Container( - height: 0.2.h, - color: kBlack, - ), - localApi.userModel.isGuest == true - ? Expanded( - child: Center( - child: SingleChildScrollView( - physics: - AlwaysScrollableScrollPhysics(), - child: Column( - children: [ - Text( - 'You haven\'t joined or created any group yet', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.black, - fontSize: 20), - ), - SizedBox( - height: 20, - ), - RichText( - text: TextSpan( - style: TextStyle( - color: Colors.black, - fontSize: 20), - children: [ - TextSpan( - text: 'Join', - style: TextStyle( - fontWeight: - FontWeight - .bold)), - TextSpan( - text: ' a Group or '), - TextSpan( - text: 'Create', - style: TextStyle( - fontWeight: - FontWeight - .bold)), - TextSpan( - text: ' a new one!'), - ], - ), - ), - ], - ), - )), - ) - : _buildList() - ], - ))) + + // Your Groups + _buildList() ], ), )), @@ -321,39 +310,46 @@ class _HomeScreenState extends State { } else if (state is LoadedHomeState) { List groups = state.groups; if (groups.isEmpty) { - return Center( - child: SingleChildScrollView( + return SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), - child: Column( - children: [ - Text( - 'You haven\'t joined or created any group yet', - textAlign: TextAlign.center, - style: TextStyle(color: Colors.black, fontSize: 20), - ), - SizedBox( - height: 20, - ), - RichText( - text: TextSpan( - style: TextStyle(color: Colors.black, fontSize: 20), - children: [ - TextSpan( - text: 'Join', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan(text: ' a Group or '), - TextSpan( - text: 'Create', - style: TextStyle(fontWeight: FontWeight.bold)), - TextSpan(text: ' a new one!'), - ], + child: Padding( + padding: const EdgeInsets.only(top: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset('animations/empty.json', + width: 200, height: 200), + const SizedBox(height: 20), + Text( + 'You haven\'t joined or created any group yet', + textAlign: TextAlign.center, + style: TextStyle(color: Colors.black, fontSize: 14), ), - ), - ], + SizedBox( + height: 20, + ), + RichText( + text: TextSpan( + style: TextStyle(color: Colors.black, fontSize: 20), + children: [ + TextSpan( + text: 'Join', + style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan(text: ' a Group or '), + TextSpan( + text: 'Create', + style: TextStyle(fontWeight: FontWeight.bold)), + TextSpan(text: ' a new one!'), + ], + ), + ), + ], + ), ), - )); + ); } else { return ListView.builder( + shrinkWrap: true, controller: _scrollController, physics: AlwaysScrollableScrollPhysics(), scrollDirection: Axis.vertical, @@ -364,8 +360,11 @@ class _HomeScreenState extends State { if (index == groups.length) { return Center(child: LinearProgressIndicator()); } else { - return GroupCustomWidgets.getGroupCard( - context, groups[index]); + return GroupCard( + group: groups[index], + ); + // return GroupCustomWidgets.getGroupCard( + // context, groups[index]); } }, ); diff --git a/lib/presentation/home/widgets/group_card.dart b/lib/presentation/home/widgets/group_card.dart index 4e369cb..244e0c4 100644 --- a/lib/presentation/home/widgets/group_card.dart +++ b/lib/presentation/home/widgets/group_card.dart @@ -1,25 +1,23 @@ -import 'package:auto_route/auto_route.dart'; import 'package:beacon/core/resources/data_state.dart'; import 'package:beacon/domain/entities/group/group_entity.dart'; import 'package:beacon/domain/usecase/home_usecase.dart'; import 'package:beacon/presentation/home/home_cubit/home_cubit.dart'; import 'package:beacon/locator.dart'; -import 'package:beacon/core/utils/constants.dart'; import 'package:beacon/config/router/router.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; -import 'package:gap/gap.dart'; -import 'package:responsive_sizer/responsive_sizer.dart'; -import 'package:skeleton_text/skeleton_text.dart'; -class GroupCustomWidgets { - static final Color textColor = Color(0xFFAFAFAF); +class GroupCard extends StatelessWidget { + final GroupEntity group; + GroupCard({super.key, required this.group}); - static Widget getGroupCard(BuildContext context, GroupEntity group) { + @override + Widget build(BuildContext context) { String noMembers = group.members!.length.toString(); String noBeacons = group.beacons!.length.toString(); + return GestureDetector( onTap: () async { bool isMember = false; @@ -49,216 +47,133 @@ class GroupCustomWidgets { } } }, - child: Slidable( - key: ValueKey(group.id!.toString()), - endActionPane: ActionPane( - motion: ScrollMotion(), - children: [ - SlidableAction( - padding: EdgeInsets.symmetric(horizontal: 10), - onPressed: (context) { - context.read().changeShortCode(group); - }, - backgroundColor: kCupertinoModalBarrierColor, - foregroundColor: kDefaultIconDarkColor, - icon: Icons.code, - label: 'Change Code', - ), - ], + child: Container( + margin: const EdgeInsets.only(left: 10, right: 10, bottom: 14), + //padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(12), ), - child: Container( - margin: const EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, - ), - padding: EdgeInsets.only(left: 16.0, right: 16.0, bottom: 8, top: 8), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - width: 70.w, - child: Text( - '${group.title} by ${group.leader!.name} ', - style: Style.titleTextStyle, - ), - ), - ], - ), - SizedBox(height: 4.0), - Row( - children: [ - Text( - 'Group has $noMembers members ', - style: Style.commonTextStyle, - ), - group.hasMemberActivity - ? Align( - alignment: Alignment.topRight, - child: Icon( - Icons.circle, - color: kYellow, - size: 10, - ), - ) - : Container(), - ], - ), - SizedBox(height: 4.0), - Row( - children: [ - Text( - 'Group has $noBeacons beacons ', - style: Style.commonTextStyle, - ), - Gap(5), - group.hasBeaconActivity - ? Align( - alignment: Alignment.topRight, - child: Icon( - Icons.circle, - color: kYellow, - size: 10, - ), - ) - : Container(), - ], - ), - SizedBox(height: 4.0), - Row( - children: [ - Text('Passkey: ${group.shortcode}', - style: Style.commonTextStyle), - Gap(10), - InkWell( - onTap: () { - Clipboard.setData(ClipboardData( - text: group.shortcode.toString())); - utils.showSnackBar('Shortcode copied!', context); - }, - child: Icon( - Icons.copy, - size: 17, - color: Colors.white, - )) - ], - ) - ], - ), - ], - ), - decoration: BoxDecoration( - color: (group.hasMemberActivity == true || - group.hasBeaconActivity == true) - ? Color(0xFF141546) - : kBlue, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8.0), - boxShadow: [ - BoxShadow( - color: Colors.black26, - blurRadius: 10.0, - offset: Offset(0.0, 10.0), + child: Slidable( + key: ValueKey(group.id!.toString()), + endActionPane: ActionPane( + motion: ScrollMotion(), + children: [ + SlidableAction( + padding: EdgeInsets.symmetric(horizontal: 0), + onPressed: (context) { + context.read().changeShortCode(group); + }, + backgroundColor: Colors.teal, + foregroundColor: Colors.white, + icon: Icons.code, + label: 'Change Code', + borderRadius: BorderRadius.circular(12), ), ], ), - ), - ), - ); - } - - static ListView getPlaceholder() { - final BorderRadius borderRadius = BorderRadius.circular(10.0); - return ListView.builder( - scrollDirection: Axis.vertical, - physics: BouncingScrollPhysics(), - itemCount: 3, - padding: const EdgeInsets.all(8.0), - itemBuilder: (BuildContext context, int index) { - return Container( - margin: const EdgeInsets.symmetric( - vertical: 10.0, - horizontal: 10.0, - ), - height: 110, - decoration: BoxDecoration( - color: kBlue, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8.0), - boxShadow: [ - BoxShadow( - color: Colors.black26, - blurRadius: 10.0, - offset: Offset(0.0, 10.0), - ), - ], - ), - padding: - EdgeInsets.only(left: 16.0, right: 16.0, bottom: 10, top: 10), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), child: Column( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 15.0, bottom: 10.0, right: 15.0), - child: ClipRRect( - borderRadius: borderRadius, - child: SkeletonAnimation( - child: Container( - height: 15.0, - decoration: BoxDecoration(color: shimmerSkeletonColor), + children: [ + Row( + children: [ + const Icon(Icons.groups_2_rounded, color: Colors.grey), + const SizedBox(width: 8), + Text( + '${group.title.toString().toUpperCase()} by ${group.leader!.name} ', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, ), ), - ), + ], ), - Padding( - padding: const EdgeInsets.only( - left: 15.0, right: 30.0, bottom: 10.0), - child: ClipRRect( - borderRadius: borderRadius, - child: SkeletonAnimation( - child: Container( - height: 10.0, - decoration: BoxDecoration(color: shimmerSkeletonColor), + const SizedBox(height: 12), + Row( + children: [ + // Stack of profile circles + // noMembers != "0" + // ? SizedBox( + // width: 30 * group.members!.length.toDouble(), + // // 30 is the width of each profile circle + // height: 30, + // child: Stack( + // children: + // (group.members != null && group.members!.length > 3 + // ? group.members!.sublist(0, 3) + // : group.members ?? []) + // .map((member) { + // if (member != null) { + // return Positioned( + // left: group.members!.indexOf(member) * 20.0, + // child: _buildProfileCircle( + // member.id == localApi.userModel.id + // ? Colors.teal + // : Colors.grey, + // ), + // ); + // } else { + // return const SizedBox.shrink(); + // } + // }).toList(), + // ), + // ) + // : Container(), + Text( + 'Group has $noMembers members ', + style: TextStyle( + color: Colors.grey, + fontSize: 14, ), ), - ), + ], ), - Padding( - padding: const EdgeInsets.only( - left: 15.0, right: 45.0, bottom: 10.0), - child: ClipRRect( - borderRadius: BorderRadius.circular(10.0), - child: SkeletonAnimation( - child: Container( - height: 10.0, - decoration: BoxDecoration(color: shimmerSkeletonColor), - ), - ), + const SizedBox(height: 8), + Text( + 'Group has $noBeacons ${noBeacons == '1' ? 'beacon' : 'beacons'} ', + style: TextStyle( + color: Colors.black87, + fontSize: 14, ), ), - Padding( - padding: const EdgeInsets.only(left: 15.0, right: 60.0), - child: ClipRRect( - borderRadius: BorderRadius.circular(10.0), - child: SkeletonAnimation( - child: Container( - height: 10.0, - decoration: BoxDecoration(color: shimmerSkeletonColor), + const SizedBox(height: 4), + Row( + children: [ + Text( + 'Passkey: ${group.shortcode}', + style: TextStyle( + color: Colors.black87, + fontSize: 14, ), ), - ), + const SizedBox(width: 8), + InkWell( + onTap: () { + Clipboard.setData( + ClipboardData(text: group.shortcode!)); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Shortcode copied!'), + duration: Duration(seconds: 2), + ), + ); + }, + child: Icon( + Icons.copy, + size: 17, + color: Colors.grey, + ), + ) + ], ), ], ), - ); - }); + ), + ), + ), + ); } } diff --git a/lib/presentation/widgets/hike_button.dart b/lib/presentation/widgets/hike_button.dart index e22a2f3..a978765 100644 --- a/lib/presentation/widgets/hike_button.dart +++ b/lib/presentation/widgets/hike_button.dart @@ -1,5 +1,6 @@ import 'package:beacon/core/utils/constants.dart'; import 'package:flutter/material.dart'; +import 'package:dotted_border/dotted_border.dart'; class HikeButton extends StatelessWidget { final Function? onTap; @@ -11,36 +12,64 @@ class HikeButton extends StatelessWidget { final double buttonWidth; final double buttonHeight; final Widget? widget; + final bool? isDotted; + final bool? isDisabled; HikeButton( {this.onTap, this.borderColor = Colors.white, this.buttonColor = kYellow, this.text, this.textColor = Colors.white, - this.buttonWidth = 15, - this.buttonHeight = 20, + this.buttonWidth = 100, + this.buttonHeight = 30, this.textSize = 18, - this.widget}); + this.widget, + this.isDotted = false, + this.isDisabled = false}); @override Widget build(BuildContext context) { - return ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: buttonColor, - shape: RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(50.0), - side: BorderSide(color: borderColor)), - ), - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: buttonWidth, vertical: buttonHeight), - child: widget ?? - Text( - text!, - style: TextStyle(color: textColor, fontSize: textSize), + return InkWell( + borderRadius: BorderRadius.circular(12), + onTap: isDisabled! ? null : onTap as void Function()?, + child: DottedBorder( + strokeWidth: 1, + color: isDisabled! + ? Colors.grey + : !isDotted! + ? Colors.transparent + : Colors.teal, + borderType: BorderType.RRect, + radius: Radius.circular(12), + padding: EdgeInsets.all(0), + child: Container( + width: buttonWidth, + height: buttonHeight, + decoration: BoxDecoration( + color: isDotted! + ? Colors.transparent + : isDisabled! + ? Colors.grey + : Colors.teal, + borderRadius: BorderRadius.circular(12), ), - ), - onPressed: onTap as void Function()?, + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + widget ?? SizedBox(), + SizedBox( + width: widget == null ? 0 : 5, + ), + Text( + text!, + style: TextStyle( + color: isDotted! + ? Colors.teal + : isDisabled! + ? Colors.white + : Colors.black, + ), + ), + ]), + )), ); } } diff --git a/pubspec.lock b/pubspec.lock index 919fe86..8c17ced 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,6 +302,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.2" + dotted_border: + dependency: "direct main" + description: + name: dotted_border + sha256: "108837e11848ca776c53b30bc870086f84b62ed6e01c503ed976e8f8c7df9c04" + url: "https://pub.dev" + source: hosted + version: "2.1.0" duration_picker: dependency: "direct main" description: @@ -1046,6 +1054,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_drawing: + dependency: transitive + description: + name: path_drawing + sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -1286,6 +1310,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" + shimmer: + dependency: "direct main" + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" simple_pip_mode: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 1650ae1..7aa8812 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -68,6 +68,8 @@ dependencies: firebase_core: google_sign_in: ^6.2.1 change_app_package_name: ^1.5.0 + dotted_border: ^2.1.0 + shimmer: ^3.0.0 dev_dependencies: build_runner: ^2.1.2 flutter_launcher_icons: ^0.13.1