diff --git a/Projects/Bring/Project.swift b/Projects/Bring/Project.swift index f7cbf76..0de4ec6 100644 --- a/Projects/Bring/Project.swift +++ b/Projects/Bring/Project.swift @@ -14,5 +14,6 @@ let project = Project.excutable( dependencies: [ .project(target: "Network", path: "../Network"), .external(name: "BottomSheet"), + .external(name: "Lottie"), ] ) diff --git a/Projects/Bring/Resources/LaunchScreen.storyboard b/Projects/Bring/Resources/LaunchScreen.storyboard index 865e932..995d922 100644 --- a/Projects/Bring/Resources/LaunchScreen.storyboard +++ b/Projects/Bring/Resources/LaunchScreen.storyboard @@ -1,7 +1,8 @@ - - + + + - + @@ -11,15 +12,14 @@ - + - - + diff --git a/Projects/Bring/Resources/Lottie/bring_splash.json b/Projects/Bring/Resources/Lottie/bring_splash.json new file mode 100644 index 0000000..d72463b --- /dev/null +++ b/Projects/Bring/Resources/Lottie/bring_splash.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":60,"ip":0,"op":91,"w":375,"h":812,"nm":"스플래시","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"브랜드를 모으다","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"t":39,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[187.705,436.629,0],"ix":2,"l":2},"a":{"a":0,"k":[56.3,7.825,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.308,12.381],[0,12.381],[0,13.537],[14.308,13.537]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.691,9.249],[12.555,9.249],[12.555,1.119],[11.188,1.119],[11.188,4.04],[3.07,4.04],[3.07,1.119],[1.691,1.119]],"c":true},"ix":2},"nm":"패스 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.07,8.142],[3.07,5.146],[11.188,5.146],[11.188,8.142]],"c":true},"ix":2},"nm":"패스 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[28.827,0.012],[27.522,0.012],[27.522,4.686],[25.322,4.686],[25.322,0.311],[24.029,0.311],[24.029,11.188],[25.322,11.188],[25.322,5.842],[27.522,5.842],[27.522,11.648],[28.827,11.648]],"c":true},"ix":2},"nm":"패스 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.026,0.385],[0,0],[2.051,-0.006],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.262,0],[0,0],[-1.858,0.367],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[16.247,2.474],[20.847,2.474],[20.847,4.724],[16.285,4.724],[16.285,9.298],[17.304,9.298],[23.258,8.826],[23.109,7.707],[17.627,8.179],[17.627,5.805],[22.164,5.805],[22.164,1.355],[16.247,1.355]],"c":true},"ix":2},"nm":"패스 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.584,15.277],[29.312,15.277],[29.312,14.134],[19.964,14.134],[19.964,10.579],[18.584,10.579]],"c":true},"ix":2},"nm":"패스 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[43.744,7.508],[34.322,7.508],[34.322,2.598],[43.595,2.598],[43.595,1.454],[32.954,1.454],[32.954,8.652],[43.744,8.652]],"c":true},"ix":2},"nm":"패스 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[31.127,13.487],[45.435,13.487],[45.435,12.331],[31.127,12.331]],"c":true},"ix":2},"nm":"패스 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[60.974,7.26],[46.666,7.26],[46.666,8.341],[60.974,8.341]],"c":true},"ix":2},"nm":"패스 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[48.394,10.628],[57.816,10.628],[57.816,11.958],[48.418,11.958],[48.418,15.414],[59.693,15.414],[59.693,14.407],[49.798,14.407],[49.798,12.916],[59.184,12.916],[59.184,9.597],[48.394,9.597]],"c":true},"ix":2},"nm":"패스 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[48.481,1.467],[57.754,1.467],[57.754,2.76],[48.53,2.76],[48.53,6.079],[59.407,6.079],[59.407,5.072],[49.898,5.072],[49.898,3.704],[59.134,3.704],[59.134,0.472],[48.481,0.472]],"c":true},"ix":2},"nm":"패스 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[81.074,12.456],[74.561,12.456],[74.561,8.639],[79.297,8.639],[79.297,1.305],[68.457,1.305],[68.457,8.639],[73.193,8.639],[73.193,12.456],[66.767,12.456],[66.767,13.612],[81.074,13.612]],"c":true},"ix":2},"nm":"패스 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[69.8,7.533],[69.8,2.424],[77.954,2.424],[77.954,7.533]],"c":true},"ix":2},"nm":"패스 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[3.269,0.012],[0,-2.586],[-3.257,0.012],[0,2.598]],"o":[[-3.257,0.012],[0,2.598],[3.269,0.012],[0,-2.586]],"v":[[89.441,1.007],[83.735,5.308],[89.441,9.597],[95.159,5.308]],"c":true},"ix":2},"nm":"패스 14","mn":"ADBE Vector Shape - Group","hd":false},{"ind":14,"ty":"sh","ix":15,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[82.33,13.537],[96.638,13.537],[96.638,12.381],[82.33,12.381]],"c":true},"ix":2},"nm":"패스 15","mn":"ADBE Vector Shape - Group","hd":false},{"ind":15,"ty":"sh","ix":16,"ks":{"a":0,"k":{"i":[[-0.012,1.889],[-2.511,-0.012],[0,-1.877],[2.511,0]],"o":[[-0.012,-1.877],[2.511,-0.012],[0,1.889],[-2.511,0]],"v":[[85.052,5.308],[89.441,2.138],[93.829,5.308],[89.441,8.465]],"c":true},"ix":2},"nm":"패스 16","mn":"ADBE Vector Shape - Group","hd":false},{"ind":16,"ty":"sh","ix":17,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[109.989,0],[108.609,0],[108.609,15.65],[109.989,15.65],[109.989,7.334],[112.599,7.334],[112.599,6.178],[109.989,6.178]],"c":true},"ix":2},"nm":"패스 17","mn":"ADBE Vector Shape - Group","hd":false},{"ind":17,"ty":"sh","ix":18,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.449,0.435],[0,0],[2.828,-0.006],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[2.971,0],[0,0],[-2.318,0.429],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[98.577,11.735],[99.808,11.735],[107.279,11.213],[107.105,10.019],[99.957,10.566],[99.957,2.66],[105.874,2.66],[105.874,1.529],[98.577,1.529]],"c":true},"ix":2},"nm":"패스 18","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.81568627451,0.81568627451,0.81568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"칠 1","mn":"ADBE Vector Graphic - Fill","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":"변형"}],"nm":"브랜드를 모으다","np":20,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":46,"st":5,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"왼쪽","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":25,"s":[178.5,388,0],"to":[-0.667,0,0],"ti":[0.667,0,0]},{"t":55,"s":[174.5,388,0]}],"ix":2,"l":2},"a":{"a":0,"k":[7.5,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.556,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.589]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-4.556,0],[0,-12.589]],"v":[[15,2.206],[15,0],[0,0],[0,50],[15,50],[15,47.794],[6.75,25]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"op","nm":"패스 오프셋 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","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":"변형"}],"nm":"Vector Stroke","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":[[-4.556,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,12.589]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-4.556,0],[0,-12.589]],"v":[[15,2.206],[15,0],[0,0],[0,50],[15,50],[15,47.794],[6.75,25]],"c":true},"ix":2},"nm":"패스 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":"칠 1","mn":"ADBE Vector Graphic - Fill","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":"변형"}],"nm":"Vector Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":5,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"오른쪽","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":25,"s":[196.5,388,0],"to":[0.833,0,0],"ti":[-0.833,0,0]},{"t":55,"s":[201.5,388,0]}],"ix":2,"l":2},"a":{"a":0,"k":[7.5,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.556,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-12.589]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.556,0],[0,12.589]],"v":[[0,47.794],[0,50],[15,50],[15,0],[0,0],[0,2.206],[8.25,25]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"op","nm":"패스 오프셋 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","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":"변형"}],"nm":"Vector Stroke","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":[[4.556,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-12.589]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.556,0],[0,12.589]],"v":[[0,47.794],[0,50],[15,50],[15,0],[0,0],[0,2.206],[8.25,25]],"c":true},"ix":2},"nm":"패스 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":"칠 1","mn":"ADBE Vector Graphic - Fill","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":"변형"}],"nm":"Vector Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":5,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"bring","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":34,"s":[0]},{"t":50,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[188,438.072,0],"ix":2,"l":2},"a":{"a":0,"k":[26.1,10.872,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.504,0],[0.888,-1.296],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.992,0],[0,3.432]],"o":[[-1.992,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.888,1.296],[3.504,0],[0,-3.432]],"v":[[6.096,4.608],[1.8,6.744],[1.8,0],[0,0],[0,16.8],[1.8,16.8],[1.8,14.88],[6.096,16.992],[11.904,10.8]],"c":true},"ix":2},"nm":"패스 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.664,0],[0,2.472],[-2.664,0],[0,-2.472]],"o":[[-2.664,0],[0,-2.472],[2.664,0],[0,2.472]],"v":[[5.856,15.36],[1.704,10.8],[5.856,6.24],[10.104,10.8]],"c":true},"ix":2},"nm":"패스 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0.24,-0.816],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.688,0],[0,0],[0,0]],"o":[[-2.976,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-2.64],[0,0],[0,0],[0,0]],"v":[[20.472,4.608],[16.056,7.752],[16.056,4.8],[14.256,4.8],[14.256,16.8],[16.056,16.8],[16.056,11.52],[20.376,6.408],[20.592,6.408],[20.592,4.608]],"c":true},"ix":2},"nm":"패스 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[22.536,16.8],[24.336,16.8],[24.336,4.8],[22.536,4.8]],"c":true},"ix":2},"nm":"패스 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[22.464,0.432],[22.464,2.784],[24.408,2.784],[24.408,0.432]],"c":true},"ix":2},"nm":"패스 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-1.992,0],[0,-2.184],[0,0],[0,0],[0,0],[2.472,0],[0.864,-1.152],[0,0]],"o":[[0,0],[0,0],[0,0],[0,-2.16],[1.968,0],[0,0],[0,0],[0,0],[0,-3.408],[-1.944,0],[0,0],[0,0]],"v":[[27.456,4.8],[27.456,16.8],[29.256,16.8],[29.256,9.888],[32.88,6.24],[36.24,9.864],[36.24,16.8],[38.04,16.8],[38.04,9.816],[33.24,4.608],[29.256,6.672],[29.256,4.8]],"c":true},"ix":2},"nm":"패스 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.992,0],[0,-3.432],[-3.504,0],[-0.888,1.296],[0,0],[2.76,0],[0.48,1.176],[0,0],[-3.024,0],[0,3.432],[0,0]],"o":[[0,0],[-0.888,-1.296],[-3.504,0],[0,3.432],[1.992,0],[0,0],[0,2.472],[-1.824,0],[0,0],[0.672,2.088],[3.6,0],[0,0],[0,0]],"v":[[50.4,4.8],[50.4,6.72],[46.104,4.608],[40.296,10.704],[46.104,16.8],[50.4,14.664],[50.4,16.32],[46.44,20.112],[42.936,18.24],[40.944,18.24],[46.536,21.744],[52.2,16.44],[52.2,4.8]],"c":true},"ix":2},"nm":"패스 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[2.616,0],[0,2.472],[-2.664,0],[0,-2.472]],"o":[[-2.664,0],[0,-2.472],[2.616,0],[0,2.472]],"v":[[46.344,15.168],[42.096,10.704],[46.344,6.24],[50.496,10.704]],"c":true},"ix":2},"nm":"패스 8","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":"칠 1","mn":"ADBE Vector Graphic - Fill","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":"변형"}],"nm":"bring","np":10,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":91,"st":32,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/Projects/Bring/Sources/DomainModels/Dummy.swift b/Projects/Bring/Sources/DomainModels/Dummy.swift index 9acf67c..671be6f 100644 --- a/Projects/Bring/Sources/DomainModels/Dummy.swift +++ b/Projects/Bring/Sources/DomainModels/Dummy.swift @@ -39,18 +39,18 @@ struct BrandModel: Hashable, Identifiable { static let mockDatas = [ BrandModel( id: 1, - title: "Title1", - subTitle: "Subtitle1", - brandLink: "www.naver.com", - imageName: "cityGuide", + title: "길동이 선물주자", + subTitle: "길동이 선물", + brandLink: "https://store.musinsa.com/app/goods/1115974", + imageName: "https://image.msscdn.net/images/goods_img/20190812/1115974/1115974_3_big.jpg", category: .shoes ), BrandModel( id: 2, - title: "Title2", - subTitle: "Subtitle2", - brandLink: "www.google.com", - imageName: "cityGuide", + title: "후드티", + subTitle: "T-Logo Hoodie Heather Grey", + brandLink: "https://store.musinsa.com/app/goods/2115560", + imageName: "https://image.msscdn.net/images/goods_img/20210908/2115560/2115560_2_500.jpg", category: .accesary ), BrandModel( diff --git a/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailCardView.swift b/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailCardView.swift index add7fb7..867a682 100644 --- a/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailCardView.swift +++ b/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailCardView.swift @@ -10,48 +10,99 @@ import SwiftUI struct ProductDetailCardView: View { - var imageURL: String? = nil - var brandURL: String? = nil + enum Constant: CGFloat { + case size = 150 + } + let index: Int + init(tempIndex: Int) { + index = tempIndex + } + var thumbnailUrls: [String] = [ + "https://image.msscdn.net/images/goods_img/20210908/2115560/2115560_2_500.jpg", + "https://image.msscdn.net/images/goods_img/20190812/1115974/1115974_3_big.jpg", + "https://image.msscdn.net/images/goods_img/20210112/1744960/1744960_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20210813/2064478/2064478_3_500.jpg", + "https://image.msscdn.net/images/goods_img/20200225/1322019/1322019_8_500.jpg" + ] + var brandUrl: [String] = [ + "https://image.msscdn.net/display/images/2021/06/25/196e5d0096454623911ab0e4bfaedd51.png", + "https://image.msscdn.net/display/images/2021/06/25/6e4431a19154401982ea35a9c040f320.png", + "https://image.msscdn.net/images/brand/2019021211221000000099990.png", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.msscdn.net/mfile_s01/_brand/free_medium/lafudgestore.png?202110061655", + "https://image.musinsa.com/images/brand/2020050812382500000027035.png" + ] var body: some View { ZStack { //AsyncImage(url: URL(string: "https://your_image_url_address")) // iOS15이상이면 이렇게 바로 쓸수 있는것같네요 - Image("montreal") - .resizable() - .aspectRatio(188/255, - contentMode: .fill) - .overlay(BrandOverlay(brandURL: brandURL)) + AsyncImage(url: URL(string: thumbnailUrls[index])){ phase in + switch phase { + case .empty: + ProgressView() + .aspectRatio(contentMode: .fill) + .frame(width: Constant.size.rawValue, + height: Constant.size.rawValue) + case .success(let image): + image.resizable() + .aspectRatio(contentMode: .fill) + .frame(width: Constant.size.rawValue, + height: Constant.size.rawValue) + default: + Image(systemName: "photo") + .aspectRatio(contentMode: .fill) + .frame(width: Constant.size.rawValue, + height: Constant.size.rawValue) + } + } + Circle() + .strokeBorder(.white, lineWidth: 1) + .background(AsyncCircularImageView(imageUrl: brandUrl[index], size: .size13)) + .clipShape(Circle()) + .frame(width: .size13, height: .size13) + .padding(EdgeInsets(top: .size4, leading: 0, bottom: .size4, trailing: 0)) } } } -struct BrandOverlay: View { - var brandURL: String? = nil - - var body: some View { - ZStack(alignment: .topTrailing, content: { - Rectangle() - .foregroundColor(.clear) - Image(brandURL ?? "toronto") - .resizable() - .modifier(CircleImageModifier()) - .frame(width: 36, height: 36, alignment: .center) - .padding() - }) - - } -} - -struct BrandOverlay_Previews: PreviewProvider { - static var previews: some View { - BrandOverlay() - } -} - -struct ProductDetailCardView_Previews: PreviewProvider { - static var previews: some View { - ProductDetailCardView() - } -} +//struct BrandOverlay: View { +// var brandURL: String? = nil +// +// var body: some View { +// ZStack(alignment: .topTrailing, content: { +// Rectangle() +// .foregroundColor(.clear) +// Image(brandURL ?? "toronto") +// .resizable() +// .modifier(CircleImageModifier()) +// .frame(width: 36, height: 36, alignment: .center) +// .padding() +// }) +// +// } +//} +// +//struct BrandOverlay_Previews: PreviewProvider { +// static var previews: some View { +// BrandOverlay() +// } +//} +// +//struct ProductDetailCardView_Previews: PreviewProvider { +// static var previews: some View { +// ProductDetailCardView() +// } +//} diff --git a/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailView.swift b/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailView.swift index 78eb674..513be25 100644 --- a/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailView.swift +++ b/Projects/Bring/Sources/Presentation/Bookmark/Product/ProductDetail/View/ProductDetailView.swift @@ -50,61 +50,84 @@ struct ProductDetailView: View { HStack { - VStack(alignment: .leading, spacing: 6) { - Text("길동이 선물") - .font(BringFontStyle.heading0.font) - - Text("길동이 선물 description") - .font(BringFontStyle.textM.font) - .foregroundColor(Color("gray06")) - } - .overlay( - GeometryReader { reader -> Color in - let width = reader.frame(in: .global).maxX - - DispatchQueue.main.async { - if titleOffset == 0 { - titleOffset = width + Text("길동이 선물") + .font(BringFontStyle.heading0.font) + .overlay( + GeometryReader { reader -> Color in + let width = reader.frame(in: .global).maxX + + DispatchQueue.main.async { + if titleOffset == 0 { + print("아휴: \(width)") + titleOffset = -width + } } - } - - return Color.clear - } - ) - - .padding() - .scaleEffect(getScale()) - .offset(getOffset()) + + return Color.clear + }.frame(width: 0, height: 0 ) + ) + .padding() + .scaleEffect(getScale()) + .offset(getOffset()) Spacer() } - }.background(.orange) - .zIndex(1) - .padding(.bottom, getOffset().height) - BookmarkFilterView() + HStack { + Text("길동이 선물 description") + .font(BringFontStyle.textM.font) + .foregroundColor(Color("gray06")) + Spacer() + } + .padding() + .padding(.top, -16) + .offset(y: offset > 0 ? (offset <= 95 ? -offset : -95) : -15) + } + .zIndex(1) + .padding(.bottom, getOffset().height) + .background( + offset >= 20 ? Color.orange : Color.white + ) + .overlay( + GeometryReader { reader -> Color in + + let height = reader.frame(in: .global).minY + + DispatchQueue.main.async { + titleBarHeight = height - ( UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0) + } + return Color.clear + } + ) if model.brandDatas.isEmpty { FolderDetailDefaultView() } else { ScrollView { + BookmarkFilterView() LazyVGrid(columns: columns, spacing: 0) { - ForEach(model.brandDatas) { data in - ProductDetailCardView() + // ForEach(model.brandDatas) { data in + ForEach(0..<11 /*model.brandDatas.count*/) { i in + ProductDetailCardView(tempIndex: i) } - }.font(.largeTitle) - }.overlay(GeometryReader{ proxy -> Color in + } + .padding(.top, 10) + .padding(.top, titleBarHeight) + .overlay(GeometryReader{ proxy -> Color in let minY = proxy.frame(in: .global).minY - + DispatchQueue.main.async { if startOffset == 0 { startOffset = minY } - offset = startOffset - minY + offset = -(minY + startOffset - 44) > 0 ? -(minY + startOffset - 44) : 0 + //print("offset: \(offset), startOffset: \(startOffset), minY: \(minY)") } return Color.clear - } - ) + }.frame(width: 0, height: 0) ,alignment: .top + ) + } + } @@ -119,7 +142,9 @@ struct ProductDetailView: View { let screenWidth = UIScreen.main.bounds.width / 2 - size.width = offset > 0 ? (offset * 1.5 <= (screenWidth - titleOffset) ? offset * 1.5 : (screenWidth - titleOffset)) : 0 + //print("screenWidth: \(screenWidth), titleOffset: \(titleOffset), offset: \(offset)") + + size.width = offset > 0 ? (offset * 1.5 <= (screenWidth - titleOffset/2) ? offset * 1.5 : (screenWidth - titleOffset/2)) : 0 size.height = offset > 0 ? (offset <= 75 ? -offset : -75) : 0 return size @@ -128,10 +153,10 @@ struct ProductDetailView: View { func getScale() -> CGFloat { if offset > 0 { - let screenWi9dth = UIScreen.main.bounds.width - let progress = 1 - (getOffset().width / screenWi9dth) - - return progress >= 0.9 ? progress : 0.9 + let screenWidth = UIScreen.main.bounds.width + let progress = 1 - (getOffset().width / screenWidth) + print("progress: \(progress)") + return progress >= 0.8 ? progress : 0.8 } else { return 1 } diff --git a/Projects/Bring/Sources/Presentation/Main/View/Detail/MainDetailView.swift b/Projects/Bring/Sources/Presentation/Main/View/Detail/MainDetailView.swift index 79d90c0..5b6daa6 100644 --- a/Projects/Bring/Sources/Presentation/Main/View/Detail/MainDetailView.swift +++ b/Projects/Bring/Sources/Presentation/Main/View/Detail/MainDetailView.swift @@ -12,25 +12,19 @@ struct MainDetailView: View { var url: String var title: String? - var presentedAsModal: Binding - - enum Tab { - case main - case bookmark - case my - } + @Binding var presentedAsModal: Bool init(url: String, title: String? = nil, presentedAsModal: Binding) { self.url = url self.title = title - self.presentedAsModal = presentedAsModal + self._presentedAsModal = presentedAsModal } var body: some View { VStack { BringWebView(url: url, title: title, - presentedAsModal: presentedAsModal) + presentedAsModal: $presentedAsModal) } } } diff --git a/Projects/Bring/Sources/Presentation/Main/View/MainBrand/MainBracketsMaskView.swift b/Projects/Bring/Sources/Presentation/Main/View/MainBrand/MainBracketsMaskView.swift index 2ec7b8f..806cacb 100644 --- a/Projects/Bring/Sources/Presentation/Main/View/MainBrand/MainBracketsMaskView.swift +++ b/Projects/Bring/Sources/Presentation/Main/View/MainBrand/MainBracketsMaskView.swift @@ -33,7 +33,6 @@ struct MainBracketsMaskView: View { ) } } - .buttonStyle(DefaultButtonStyle()) } .listRowSeparator(.hidden) diff --git a/Projects/Bring/Sources/Presentation/Main/View/MainView.swift b/Projects/Bring/Sources/Presentation/Main/View/MainView.swift index e9b8771..78998c8 100644 --- a/Projects/Bring/Sources/Presentation/Main/View/MainView.swift +++ b/Projects/Bring/Sources/Presentation/Main/View/MainView.swift @@ -10,7 +10,8 @@ import SwiftUI import Network protocol MainEventDelegate { - func callLike(id: Int, completion: (() -> Void)?) + func callLike(id: Int, completion: (() -> Void)?) + func presentFullScreen(brand: Brand) } struct MainView: View { @@ -33,6 +34,10 @@ struct MainView: View { @State var presentSearchView: Bool = false + @State + var presentedAsModal: Bool = false + @State + var selectedBrand: Brand? = nil var body: some View { return NavigationView { @@ -107,10 +112,6 @@ struct MainView: View { .sheet(isPresented: $presentSearchView) { MainSearchView() } -// .fullScreenCover(isPresented: $presentSearchView, content: { -// MainSearchView() -// }) - } } @@ -123,6 +124,13 @@ struct MainView: View { .navigationBarTitleDisplayMode(.inline) } } + .fullScreenCover(isPresented: $presentedAsModal) { + MainDetailView( + url: selectedBrand?.brandLink ?? "", + title: selectedBrand?.name, + presentedAsModal: $presentedAsModal + ) + } } } @@ -132,6 +140,10 @@ extension MainView: MainEventDelegate { viewModel.postLike(id: id, completion: completion) } + func presentFullScreen(brand: Brand) { + presentedAsModal.toggle() + selectedBrand = brand + } } struct MainView_Previews: PreviewProvider { diff --git a/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandItemView.swift b/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandItemView.swift index a9d817f..3a4df87 100644 --- a/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandItemView.swift +++ b/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandItemView.swift @@ -15,8 +15,10 @@ struct PopularBrandItemView: View { case size = 150 } + @State var selectedBrand: Brand? = nil var delegate: MainEventDelegate? @State var brand: Brand + @Binding var presentedAsModal: Bool var body: some View { LazyVStack(alignment: .center) { @@ -80,6 +82,27 @@ struct PopularBrandItemView: View { .frame(width: Constant.size.rawValue, height: 40) } .padding(5) + .onTapGesture { + presentedAsModal.toggle() + selectedBrand = brand + delegate?.presentFullScreen(brand: brand) + } +// .fullScreenCover(isPresented: $presentedAsModal) { +// MainDetailView( +// url: $selectedBrand?.brandLink ?? "", +// title: $selectedBrand?.name, +// presentedAsModal: $presentedAsModal +// ) +// } +// .fullScreenCover(item: $selectedBrand, onDismiss: { +// selectedBrand = nil +// }) { +// MainDetailView( +// url: $0.brandLink, +// title: $0.name, +// presentedAsModal: $presentedAsModal +// ) +// } } } @@ -89,6 +112,6 @@ struct PopularBrandItem_Previews: PreviewProvider { let viewModel = MainViewModel(serviceManager: BrandServiceManagerMock()) viewModel.fetchPopularBrands() - return PopularBrandItemView(brand: viewModel.popularBrands.first!) + return PopularBrandItemView(brand: viewModel.popularBrands.first!, presentedAsModal: .constant(false)) } } diff --git a/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandRow.swift b/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandRow.swift index 4ffbd95..bfb17b0 100644 --- a/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandRow.swift +++ b/Projects/Bring/Sources/Presentation/Main/View/PopularBrand/PopularBrandRow.swift @@ -12,7 +12,7 @@ import Network struct PopularBrandRow: View { var delegate: MainEventDelegate? - var brands: [Brand] + @State var brands: [Brand] @State var presentedAsModal: Bool = false var body: some View { @@ -24,21 +24,24 @@ struct PopularBrandRow: View { ScrollView(.horizontal, showsIndicators: false) { LazyHStack(alignment: .top, spacing: 0) { ForEach(Array(zip(brands.indices, brands)), id: \.0) { (index, brand) in - Button { - presentedAsModal = true - } label: { +// ForEach(brands, id: \.id) { brand in +// Button { +// print("index:\(index)") +// presentedAsModal = true +// } label: { ZStack { PopularBrandItemView( delegate: delegate, - brand: brand + brand: brand, + presentedAsModal: $presentedAsModal ) - .fullScreenCover(isPresented: $presentedAsModal) { - MainDetailView( - url: brand.brandLink, - title: brand.name, - presentedAsModal: $presentedAsModal - ) - } +// .fullScreenCover(isPresented: $presentedAsModal) { +// MainDetailView( +// url: brand.brandLink, +// title: brand.name, +// presentedAsModal: $presentedAsModal +// ) +// } VStack { HStack { @@ -59,7 +62,7 @@ struct PopularBrandRow: View { Spacer() } } - } +// } } } } diff --git a/Projects/Bring/Sources/Presentation/Splash/LottieView.swift b/Projects/Bring/Sources/Presentation/Splash/LottieView.swift new file mode 100644 index 0000000..8080205 --- /dev/null +++ b/Projects/Bring/Sources/Presentation/Splash/LottieView.swift @@ -0,0 +1,43 @@ +// +// LottieView.swift +// Bring +// +// Created by cado.avo on 2021/12/04. +// Copyright © 2021 com.666. All rights reserved. +// + +import SwiftUI +import UIKit +import Lottie + +struct LottieView: UIViewRepresentable { + + typealias UIViewType = UIView + + var name: String = "bring_splash" + @Binding var show: Bool + + func makeUIView(context: UIViewRepresentableContext) -> UIView { + + let animationView = AnimationView() + animationView.animation = Animation.named(name) + animationView.contentMode = .scaleAspectFit + animationView.loopMode = .playOnce + + animationView.play { status in + if status { + // toggling view... + withAnimation(.interactiveSpring(response: 0.7, dampingFraction: 0.8, blendDuration: 0.8)){ + show.toggle() + } + } + } + + return animationView + } + + func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext) { + + } +} + diff --git a/Projects/Bring/Sources/Presentation/Tab/BringTabView.swift b/Projects/Bring/Sources/Presentation/Tab/BringTabView.swift index ab98d36..49059cf 100644 --- a/Projects/Bring/Sources/Presentation/Tab/BringTabView.swift +++ b/Projects/Bring/Sources/Presentation/Tab/BringTabView.swift @@ -11,6 +11,8 @@ import Network struct BringTabView: View { @State private var selection: Tab = .main + @State var show = false + let viewModel: TabViewModel init() { @@ -24,32 +26,42 @@ struct BringTabView: View { } var body: some View { - TabView(selection: $selection, - content: { - MainView() - .tabItem { - Image(selection == .main - ? "icTabHomeFill" - : "icTabHome") - } - .tag(Tab.main) - - BookmarkView() - .tabItem { - Image(selection == .bookmark - ? "icTabHeartFill" - : "icTabHeart") - } - .tag(Tab.bookmark) + ZStack { + LottieView(name: "bring_splash", show: $show) + // default Frame.... + .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height, alignment: .center) + .background(.black) + .opacity(show ? 0 : 1) - MypageView() - .tabItem { - Image(selection == .my - ? "icTabMyPageFill" - : "icTabMyPage") - } - .tag(Tab.my) - }) + TabView(selection: $selection, + content: { + MainView() + .tabItem { + Image(selection == .main + ? "icTabHomeFill" + : "icTabHome") + } + .tag(Tab.main) + + BookmarkView() + .tabItem { + Image(selection == .bookmark + ? "icTabHeartFill" + : "icTabHeart") + } + .tag(Tab.bookmark) + + MypageView() + .tabItem { + Image(selection == .my + ? "icTabMyPageFill" + : "icTabMyPage") + } + .tag(Tab.my) + }) + .opacity(show ? 1 : 0) + } + } } diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift index ddfcd52..f02ea26 100644 --- a/Tuist/Dependencies.swift +++ b/Tuist/Dependencies.swift @@ -5,7 +5,10 @@ let dependencies = Dependencies( .remote(url: "https://github.com/Moya/Moya", requirement: .upToNextMajor(from: "15.0.0")), .remote(url: "https://github.com/LucasMucGH/BottomSheet.git", - requirement: .upToNextMajor(from: "2.4.0")) + requirement: .upToNextMajor(from: "2.4.0")), + .remote(url: "https://github.com/airbnb/lottie-ios", + requirement: .upToNextMajor(from: "3.2.1")) + ], platforms: [.iOS] )