diff --git a/Projects/Presentation/Resources/Colors.xcassets/Green/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Green/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Green/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/RoutineCategory/Green10.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Green/Green10.colorset/Contents.json similarity index 100% rename from Projects/Presentation/Resources/Colors.xcassets/RoutineCategory/Green10.colorset/Contents.json rename to Projects/Presentation/Resources/Colors.xcassets/Green/Green10.colorset/Contents.json diff --git a/Projects/Presentation/Resources/Colors.xcassets/Green/Green5.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Green/Green5.colorset/Contents.json new file mode 100644 index 00000000..7573c27b --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Green/Green5.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD0", + "green" : "0xFA", + "red" : "0xE9" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Green/Green500.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Green/Green500.colorset/Contents.json new file mode 100644 index 00000000..83db25a1 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Green/Green500.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x01", + "green" : "0x9F", + "red" : "0x5F" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Mint/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Mint/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Mint/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint10.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint10.colorset/Contents.json new file mode 100644 index 00000000..4bacfb81 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint10.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xF6", + "green" : "0xF3", + "red" : "0xE2" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint500.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint500.colorset/Contents.json new file mode 100644 index 00000000..6fd70c77 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Mint/Mint500.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x91", + "green" : "0xA7", + "red" : "0x25" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Purple/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Purple/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Purple/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/RoutineCategory/Purple10.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple10.colorset/Contents.json similarity index 100% rename from Projects/Presentation/Resources/Colors.xcassets/RoutineCategory/Purple10.colorset/Contents.json rename to Projects/Presentation/Resources/Colors.xcassets/Purple/Purple10.colorset/Contents.json diff --git a/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple5.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple5.colorset/Contents.json new file mode 100644 index 00000000..2514f5a2 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple5.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xEC", + "red" : "0xEE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple500.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple500.colorset/Contents.json new file mode 100644 index 00000000..18c928f8 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Purple/Purple500.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xD0", + "green" : "0x2B", + "red" : "0x69" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Red/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Red/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Red/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Red/Red10.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Red/Red10.colorset/Contents.json new file mode 100644 index 00000000..9afb550d --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Red/Red10.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE0", + "green" : "0xE0", + "red" : "0xFE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Colors.xcassets/Red/Red500.colorset/Contents.json b/Projects/Presentation/Resources/Colors.xcassets/Red/Red500.colorset/Contents.json new file mode 100644 index 00000000..8390a54f --- /dev/null +++ b/Projects/Presentation/Resources/Colors.xcassets/Red/Red500.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x50", + "green" : "0x51", + "red" : "0xFF" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/Contents.json new file mode 100644 index 00000000..49ae460f --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "emotion_background_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "emotion_background_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "emotion_background_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@1x.png new file mode 100644 index 00000000..cfb6e9fe Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@2x.png new file mode 100644 index 00000000..7c2f96aa Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@3x.png new file mode 100644 index 00000000..3b9cdb8e Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_background_graphic.imageset/emotion_background_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/Contents.json new file mode 100644 index 00000000..5c561327 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ground_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ground_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ground_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@1x.png new file mode 100644 index 00000000..f9927602 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@2x.png new file mode 100644 index 00000000..e290b177 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@3x.png new file mode 100644 index 00000000..5ae92a21 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/emotion_ground_graphic.imageset/ground_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/Contents.json new file mode 100644 index 00000000..bf581786 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fomo_hand_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fomo_hand_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fomo_hand_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@1x.png new file mode 100644 index 00000000..224e1552 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@2x.png new file mode 100644 index 00000000..c73958f4 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@3x.png new file mode 100644 index 00000000..a8a51c65 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_hand_graphic.imageset/fomo_hand_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/Contents.json new file mode 100644 index 00000000..b62ab3a0 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "fomo_thumb_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "fomo_thumb_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "fomo_thumb_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@1x.png new file mode 100644 index 00000000..4abbb786 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@2x.png new file mode 100644 index 00000000..654ce0fc Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@3x.png new file mode 100644 index 00000000..affa3050 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/fomo_thumb_graphic.imageset/fomo_thumb_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/Contents.json new file mode 100644 index 00000000..4b5585c5 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marblePomo_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marblePomo_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marblePomo_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@1x.png new file mode 100644 index 00000000..cf909be6 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@2x.png new file mode 100644 index 00000000..ad573450 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@3x.png new file mode 100644 index 00000000..405b5dbf Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marblePomo_graphic.imageset/marblePomo_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/Contents.json new file mode 100644 index 00000000..7eef970e --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_gray_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_gray_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_gray_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@1x.png new file mode 100644 index 00000000..1bdf2491 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@2x.png new file mode 100644 index 00000000..ac6252a5 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@3x.png new file mode 100644 index 00000000..7e2e7f90 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_gray_graphic.imageset/marble_gray_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/Contents.json new file mode 100644 index 00000000..b68b8813 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_green_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_green_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_green_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@1x.png new file mode 100644 index 00000000..c64605a7 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@2x.png new file mode 100644 index 00000000..cfdb7ec2 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@3x.png new file mode 100644 index 00000000..e3008032 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_green_graphic.imageset/marble_green_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/Contents.json new file mode 100644 index 00000000..374009ca --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_mint_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_mint_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_mint_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@1x.png new file mode 100644 index 00000000..34b7574a Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@2x.png new file mode 100644 index 00000000..cd351b50 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@3x.png new file mode 100644 index 00000000..bb7b41e2 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_mint_graphic.imageset/marble_mint_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/Contents.json new file mode 100644 index 00000000..51892a3b --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_none_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_none_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_none_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@1x.png new file mode 100644 index 00000000..77d49bf6 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@2x.png new file mode 100644 index 00000000..f1ece55c Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@3x.png new file mode 100644 index 00000000..0202f232 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_none_graphic.imageset/marble_none_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/Contents.json new file mode 100644 index 00000000..f71a4d3c --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_orange_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_orange_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_orange_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@1x.png new file mode 100644 index 00000000..d6d502ad Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@2x.png new file mode 100644 index 00000000..abdfc057 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@3x.png new file mode 100644 index 00000000..2b44750f Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_orange_graphic.imageset/marble_orange_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/Contents.json new file mode 100644 index 00000000..f316937a --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_pomo_left_hand_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_pomo_left_hand_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_pomo_left_hand_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@1x.png new file mode 100644 index 00000000..b5b5652d Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@2x.png new file mode 100644 index 00000000..a2cba632 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@3x.png new file mode 100644 index 00000000..4d10ca75 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_left_hand_graphic.imageset/marble_pomo_left_hand_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/Contents.json new file mode 100644 index 00000000..e64ea462 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_pomo_right_hand_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_pomo_right_hand_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_pomo_right_hand_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@1x.png new file mode 100644 index 00000000..99bb3185 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@2x.png new file mode 100644 index 00000000..0765b838 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@3x.png new file mode 100644 index 00000000..dac70634 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_pomo_right_hand_graphic.imageset/marble_pomo_right_hand_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/Contents.json new file mode 100644 index 00000000..85f3c59c --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_purple_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_purple_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_purple_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@1x.png new file mode 100644 index 00000000..d267a47d Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@2x.png new file mode 100644 index 00000000..3fc537b9 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@3x.png new file mode 100644 index 00000000..89eaabb9 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_purple_graphic.imageset/marble_purple_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/Contents.json new file mode 100644 index 00000000..1063afd9 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_red_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_red_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_red_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@1x.png new file mode 100644 index 00000000..7e8d35f8 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@2x.png new file mode 100644 index 00000000..37c6881a Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@3x.png new file mode 100644 index 00000000..517e9468 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_red_graphic.imageset/marble_red_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/Contents.json new file mode 100644 index 00000000..7bf67282 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "marble_speech_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "marble_speech_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "marble_speech_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@1x.png new file mode 100644 index 00000000..2ecf4695 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@2x.png new file mode 100644 index 00000000..548811f4 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@3x.png new file mode 100644 index 00000000..4a5f7a10 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/Graphic/Emotion/marble_speech_graphic.imageset/marble_speech_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/Contents.json new file mode 100644 index 00000000..49a65226 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "background_graphic@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "background_graphic@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "background_graphic@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@1x.png b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@1x.png new file mode 100644 index 00000000..24bdaa46 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@2x.png b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@2x.png new file mode 100644 index 00000000..b0d0ccd0 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@3x.png b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@3x.png new file mode 100644 index 00000000..73713abd Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/background_graphic.imageset/background_graphic@3x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/Contents.json b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/Contents.json new file mode 100644 index 00000000..f5e87743 --- /dev/null +++ b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "double_chevron_icon@1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "double_chevron_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "double_chevron_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@1x.png b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@1x.png new file mode 100644 index 00000000..20c23d1e Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@1x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@2x.png b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@2x.png new file mode 100644 index 00000000..2ef82de4 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@2x.png differ diff --git a/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@3x.png b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@3x.png new file mode 100644 index 00000000..0d980747 Binary files /dev/null and b/Projects/Presentation/Resources/Images.xcassets/double_chevron_icon.imageset/double_chevron_icon@3x.png differ diff --git a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift index 1b2318cb..ffd9e158 100644 --- a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift +++ b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift @@ -35,9 +35,7 @@ enum BitnagilColor { static let gray99 = UIColor(named: "Gray99", in: bundle, compatibleWith: nil) // MARK: - Category Color - static let green10 = UIColor(named: "Green10", in: bundle, compatibleWith: nil) static let pink10 = UIColor(named: "Pink10", in: bundle, compatibleWith: nil) - static let purple10 = UIColor(named: "Purple10", in: bundle, compatibleWith: nil) static let skyblue10 = UIColor(named: "Skyblue10", in: bundle, compatibleWith: nil) static let yellow10 = UIColor(named: "Yellow10", in: bundle, compatibleWith: nil) @@ -54,6 +52,24 @@ enum BitnagilColor { static let orange800 = UIColor(named: "Orange800", in: bundle, compatibleWith: nil) static let orange900 = UIColor(named: "Orange900", in: bundle, compatibleWith: nil) + // MARK: - Red Colors + static let red10 = UIColor(named: "Red10", in: bundle, compatibleWith: nil) + static let red500 = UIColor(named: "Red500", in: bundle, compatibleWith: nil) + + // MARK: - Green Colors + static let green5 = UIColor(named: "Green5", in: bundle, compatibleWith: nil) + static let green10 = UIColor(named: "Green10", in: bundle, compatibleWith: nil) + static let green500 = UIColor(named: "Green500", in: bundle, compatibleWith: nil) + + // MARK: - Purple Colors + static let purple5 = UIColor(named: "Purple5", in: bundle, compatibleWith: nil) + static let purple10 = UIColor(named: "Purple10", in: bundle, compatibleWith: nil) + static let purple500 = UIColor(named: "Purple500", in: bundle, compatibleWith: nil) + + // MARK: - Mint Colors + static let mint10 = UIColor(named: "Mint10", in: bundle, compatibleWith: nil) + static let mint500 = UIColor(named: "Mint500", in: bundle, compatibleWith: nil) + // MARK: - Gradient static let gradientLeft = UIColor(named: "GradientLeft", in: bundle, compatibleWith: nil) static let gradientRight = UIColor(named: "GradientRight", in: bundle, compatibleWith: nil) diff --git a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift index 3088d68c..48f1d6ae 100644 --- a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift +++ b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilGraphic.swift @@ -39,4 +39,21 @@ enum BitnagilGraphic { static let tutorialHomeMoreGraphic = UIImage(named: "tutorial_home_more_graphic", in: bundle, with: nil) static let tutorialRecommendationRoutineGraphic = UIImage(named: "tutorial_recommendation_routine_graphic", in: bundle, with: nil) static let tutorialEditRoutineGraphic = UIImage(named: "tutorial_edit_routine_graphic", in: bundle, with: nil) + // MARK: - Emotion + static let marbleSpeechGraphic = UIImage(named: "marble_speech_graphic", in: bundle, with: nil) + static let fomoHandGraphic = UIImage(named: "fomo_hand_graphic", in: bundle, with: nil) + static let fomoThumbGraphic = UIImage(named: "fomo_thumb_graphic", in: bundle, with: nil) + static let marbleRedGraphic = UIImage(named: "marble_red_graphic", in: bundle, with: nil) + static let marbleNoneGraphic = UIImage(named: "marble_none_graphic", in: bundle, with: nil) + static let marbleOrangeGraphic = UIImage(named: "marble_orange_graphic", in: bundle, with: nil) + static let marbleMintGraphic = UIImage(named: "marble_mint_graphic", in: bundle, with: nil) + static let marbleGreenGraphic = UIImage(named: "marble_green_graphic", in: bundle, with: nil) + static let marbleGrayGraphic = UIImage(named: "marble_gray_graphic", in: bundle, with: nil) + static let marblePurpleGraphic = UIImage(named: "marble_purple_graphic", in: bundle, with: nil) + // MARK: - Emotion Register Completion + static let emotionCompletionBackgroundGraphic = UIImage(named: "emotion_background_graphic", in: bundle, with: nil) + static let emotionCompletionGroundGraphic = UIImage(named: "emotion_ground_graphic", in: bundle, with: nil) + static let pomoLeftHandGraphic = UIImage(named: "marble_pomo_left_hand_graphic", in: bundle, with: nil) + static let pomoRightHandGraphic = UIImage(named: "marble_pomo_right_hand_graphic", in: bundle, with: nil) + static let marblePomoGraphic = UIImage(named: "marblePomo_graphic", in: bundle, with: nil) } diff --git a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift index edf2dab6..3d5de9b6 100644 --- a/Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift +++ b/Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift @@ -90,6 +90,12 @@ enum BitnagilIcon { static let editIcon = UIImage(named: "edit_icon", in: bundle, with: nil) static let trashIcon = UIImage(named: "trash_icon", in: bundle, with: nil) static let closeIcon = UIImage(named: "close_icon", in: bundle, with: nil) + + // MARK: - Routine Creation + static let doubleChevronIcon = UIImage(named: "double_chevron_icon", in: bundle, with: nil) + static func doubleChevronIcon(direction: Direction) -> UIImage? { + return BitnagilIcon.doubleChevronIcon?.rotate(degrees: direction.rotation)?.withRenderingMode(.alwaysTemplate) + } } enum Direction { diff --git a/Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift b/Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift index 9e5c8101..9e8ae0f9 100644 --- a/Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift +++ b/Projects/Presentation/Sources/Common/DesignSystem/Font/FontStyle.swift @@ -26,6 +26,7 @@ enum FontStyle { case button2 case cafe24Title1 + case cafe24Title2 case custom(fontAttribute: FontAttributes) @@ -53,6 +54,7 @@ enum FontStyle { case .custom(let fontAttribute): fontAttribute case .cafe24Title1: FontAttributes(fontSize: 20, lineHeight: 30, letterSpacing: -0.5) + case .cafe24Title2: FontAttributes(fontSize: 16, lineHeight: 30, letterSpacing: -0.5) } } } diff --git a/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift b/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift index 5d0e91ba..6e9dec58 100644 --- a/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift +++ b/Projects/Presentation/Sources/EmotionRegister/Model/Emotion.swift @@ -7,12 +7,33 @@ import Domain import Foundation +import UIKit -struct Emotion { +struct Emotion: Hashable { + let id = UUID() let emotionType: String let emotionTitle: String let emotionImageUrl: URL? let emotionMessage: String? + // TODO: - 서버 연동 후 삭제 + var image: UIImage? + var fomoImage: UIImage? + var textColor: UIColor? + var backgroundColor: UIColor? + var titleDescription: String? + + func copy() -> Emotion { + return .init( + emotionType: emotionType, + emotionTitle: emotionTitle, + emotionImageUrl: emotionImageUrl, + emotionMessage: emotionMessage, + image: image, + fomoImage: fomoImage, + textColor: textColor, + backgroundColor: backgroundColor, + titleDescription: titleDescription) + } } extension EmotionEntity { @@ -24,3 +45,159 @@ extension EmotionEntity { emotionMessage: emotionMessage) } } + +// TODO: - 서버 연동 후 삭제 +let emotinonDummies: [Emotion] = Marble.allCases.map { Emotion( + emotionType: $0.rawValue, + emotionTitle: $0.name, + emotionImageUrl: nil, + emotionMessage: $0.description, + image: $0.marbleImage, + textColor: $0.textColor, + backgroundColor: $0.backgroundColor, + titleDescription: $0.koreanDescription)} + +enum Marble:String, CaseIterable { + case NONE + case CALM + case VITALITY + case LETHARGY + case ANXIETY + case SATISFACTION + case FATIGUE + + var backgroundColor: UIColor? { + switch self { + case .NONE: + return BitnagilColor.gray97 + case .CALM: + return BitnagilColor.purple5 + case .VITALITY: + return BitnagilColor.green5 + case .LETHARGY: + return BitnagilColor.gray95 + case .ANXIETY: + return BitnagilColor.orange50 + case .SATISFACTION: + return BitnagilColor.mint10 + case .FATIGUE: + return BitnagilColor.red10 + } + } + + var textColor: UIColor? { + switch self { + case .NONE: + return BitnagilColor.gray10 + case .CALM: + return BitnagilColor.purple500 + case .VITALITY: + return BitnagilColor.green500 + case .LETHARGY: + return BitnagilColor.gray30 + case .ANXIETY: + return BitnagilColor.orange500 + case .SATISFACTION: + return BitnagilColor.mint500 + case .FATIGUE: + return BitnagilColor.red500 + } + } + + var marbleImage: UIImage? { + switch self { + case .NONE: + return BitnagilGraphic.marbleNoneGraphic + case .CALM: + return BitnagilGraphic.marblePurpleGraphic + case .VITALITY: + return BitnagilGraphic.marbleGreenGraphic + case .LETHARGY: + return BitnagilGraphic.marbleGrayGraphic + case .ANXIETY: + return BitnagilGraphic.marbleOrangeGraphic + case .SATISFACTION: + return BitnagilGraphic.marbleMintGraphic + case .FATIGUE: + return BitnagilGraphic.marbleRedGraphic + } + } + + var name: String { + switch self { + case .NONE: + "구슬 선택" + case .CALM: + "평온함" + case .VITALITY: + "활기참" + case .LETHARGY: + "무기력함" + case .ANXIETY: + "불안함" + case .SATISFACTION: + "만족함" + case .FATIGUE: + "피곤함" + } + } + + var koreanDescription: String { + switch self { + case .NONE: + return "구슬 선택" + case .CALM: + return "평온한" + case .VITALITY: + return "활기찬" + case .LETHARGY: + return "무기력한" + case .ANXIETY: + return "불안한" + case .SATISFACTION: + return "만족하는" + case .FATIGUE: + return "피곤한" + } + } + + var description: String { + switch self { + case .NONE: + """ + 오늘 기분 어때요? + 기록해 두면 내 루틴에 도움 돼요 + """ + case .CALM: + """ + 평온함은 마음이 고요하고 편안해 + 균형을 이루는 상태예요. + """ + case .VITALITY: + """ + 활기참은 생기가 가득 차 + 활발하고 적극적인 상태예요. + """ + case .LETHARGY: + """ + 무기력함은 의욕이 없어 아무것도 + 하기 힘든 상태예요. + """ + case .ANXIETY: + """ + 불안함은 마음이 불안정하고 쉽게 + 안심하기 어려운 상태예요. + """ + case .SATISFACTION: + """ + 만족함은 기대가 충족되어 + 더 바랄 것이 없는 상태예요. + """ + case .FATIGUE: + """ + 피곤함은 몸과 마음이 지쳐 + 휴식이 필요한 상태예요. + """ + } + } +} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewCell.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewCell.swift new file mode 100644 index 00000000..d661f8e8 --- /dev/null +++ b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewCell.swift @@ -0,0 +1,69 @@ +// +// EmotionCollectionViewCell.swift +// Presentation +// +// Created by 이동현 on 8/19/25. +// + +import SnapKit +import UIKit + +final class EmotionCollectionViewCell: UICollectionViewCell { + private enum Layout { + static let imageViewSize: CGFloat = 120 + static let maxImageViewSize: CGFloat = 140 + static let maxTranslateY: CGFloat = 51 + } + + private let emotionImageView = UIImageView() + + override init(frame: CGRect) { + super.init(frame: frame) + configureAttribute() + configureLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func prepareForReuse() { + super.prepareForReuse() + contentView.transform = .identity + } + + override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { + super.apply(layoutAttributes) + + guard let attributes = layoutAttributes as? EmotionCollectionViewLayoutAttributes else { return } + + let progress = attributes.progress + let targetScale = Layout.maxImageViewSize / Layout.imageViewSize + let scale = 1.0 + (targetScale - 1.0) * progress + let translateY = Layout.maxTranslateY * progress + let transform = CGAffineTransform.identity + .scaledBy(x: scale, y: scale) + .translatedBy(x: 0, y: translateY) + + emotionImageView.transform = transform + } + + func configure(image: UIImage?) { + emotionImageView.image = image + } + + private func configureAttribute() { + emotionImageView.layer.cornerRadius = Layout.imageViewSize / 2 + emotionImageView.layer.masksToBounds = true + } + + private func configureLayout() { + contentView.addSubview(emotionImageView) + + emotionImageView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + make.size.equalTo(Layout.imageViewSize) + } + } +} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayout.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayout.swift new file mode 100644 index 00000000..c397b006 --- /dev/null +++ b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayout.swift @@ -0,0 +1,78 @@ +// +// EmotionCollectionViewLayout.swift +// Presentation +// +// Created by 이동현 on 8/19/25. +// + +import UIKit + +final class EmotionCollectionViewLayout: UICollectionViewFlowLayout { + private let itemWidthRatio: CGFloat = 0.5 + private let lineSpacing: CGFloat = 16 + private var baseDistance: CGFloat { itemSize.width + minimumLineSpacing } + + override class var layoutAttributesClass: AnyClass { EmotionCollectionViewLayoutAttributes.self } + + override func prepare() { + super.prepare() + guard let collectionView else { return } + + scrollDirection = .horizontal + minimumLineSpacing = lineSpacing + + let itemWidth = floor(collectionView.bounds.width * itemWidthRatio) + let itemHeight = collectionView.bounds.height + itemSize = CGSize(width: itemWidth, height: itemHeight) + + let insetX = (collectionView.bounds.width - itemWidth) / 2 + sectionInset = UIEdgeInsets(top: 0, left: insetX, bottom: 0, right: insetX) + + collectionView.decelerationRate = .fast + } + + override func targetContentOffset(forProposedContentOffset proposed: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint { + guard let collectionView else { return proposed } + + let visibleRect = CGRect( + origin: CGPoint(x: proposed.x, y: collectionView.contentOffset.y), + size: collectionView.bounds.size) + + guard + let layoutAttributesList = super.layoutAttributesForElements(in: visibleRect), + !layoutAttributesList.isEmpty + else { return proposed } + + // 화면 중앙에 가장 가까운 셀 찾기 + let centerX = proposed.x + collectionView.bounds.width / 2 + let closestTarget = layoutAttributesList.min { abs($0.center.x - centerX) < abs($1.center.x - centerX) } + + guard let closestTarget else { return proposed } + + let newX = closestTarget.center.x - collectionView.bounds.width / 2 + return CGPoint(x: newX, y: proposed.y) + } + + override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { + guard + let collectionView, + let baseAttributesList = super.layoutAttributesForElements(in: rect) + else { return super.layoutAttributesForElements(in: rect) } + + let centerX = collectionView.contentOffset.x + collectionView.bounds.width / 2 + + return baseAttributesList.map { base in + guard let copied = base.copy() as? EmotionCollectionViewLayoutAttributes else { return base } + + let distanceFromCenter = abs(copied.center.x - centerX) + let t = min(distanceFromCenter / baseDistance, 1) + + copied.progress = 1 - t + return copied + } + } + + override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { + return true + } +} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayoutAttributes.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayoutAttributes.swift new file mode 100644 index 00000000..fea62ac8 --- /dev/null +++ b/Projects/Presentation/Sources/EmotionRegister/View/EmotionCollectionViewLayoutAttributes.swift @@ -0,0 +1,27 @@ +// +// EmotionCollectionViewLayoutAttributes.swift +// Presentation +// +// Created by 이동현 on 8/19/25. +// + +import UIKit + +final class EmotionCollectionViewLayoutAttributes: UICollectionViewLayoutAttributes { + var progress: CGFloat = 0 + + override func copy(with zone: NSZone? = nil) -> Any { + let superCopy = super.copy(with: zone) + + guard let copied = superCopy as? EmotionCollectionViewLayoutAttributes else { return superCopy } + + copied.progress = progress + return copied + } + + override func isEqual(_ object: Any?) -> Bool { + guard let object = object as? EmotionCollectionViewLayoutAttributes else { return false } + + return super.isEqual(object) && object.progress == progress + } +} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterCompletionViewController.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterCompletionViewController.swift new file mode 100644 index 00000000..bfd8d223 --- /dev/null +++ b/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterCompletionViewController.swift @@ -0,0 +1,139 @@ +// +// EmotionRegisterCompletionViewController.swift +// Presentation +// +// Created by 이동현 on 8/23/25. +// + +import SnapKit +import UIKit + +final class EmotionRegisterCompletionViewController: UIViewController { + private enum Layout { + static let speechImageHorizontalSpacing: CGFloat = 54 + static let speechImageHeight: CGFloat = 102 + static let speechImageBottomSpacing: CGFloat = 24 + static let speechLabelHorizontalSpacing: CGFloat = 20 + static let speechLabelTopSpacing: CGFloat = 22 + static let groundImageHeight: CGFloat = 171 + static let pomoImageWidth: CGFloat = 200 + static let pomoImageHeight: CGFloat = 282 + static let pomoBottomSpacing: CGFloat = 10 + static let pomoLeftHandImageHeight: CGFloat = 52.98 + static let pomoLeftHandImageWidth: CGFloat = 48.51 + static let pomoLeftHandLeadingSpacing: CGFloat = 17.71 + static let pomoRightHandImageHeight: CGFloat = 52.89 + static let pomoRightHandImageWidth: CGFloat = 48.91 + static let pomoRightHandTrailingSpacing: CGFloat = 16.65 + static let pomoHandImageTopSpacing: CGFloat = 116.77 + static let marbleImageSize: CGFloat = 120 + static let marbleImageTopSpacing: CGFloat = 96.92 + } + + private let backgroundImageView = UIImageView() + private let groundImageView = UIImageView() + private let speechImageView = UIImageView() + private let speechLabel = UILabel() + private let pomoImageView = UIImageView() + private let marbleImageView = UIImageView() + private let pomoLeftHandImageView = UIImageView() + private let pomoRightHandImageView = UIImageView() + + init(emotion: Emotion) { + super.init(nibName: nil, bundle: nil) + + marbleImageView.image = emotion.image + speechLabel.text = """ + \(emotion.titleDescription ?? "") 하루에 맞춰 + 루틴을 추천해드릴게요! + """ + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + configureAttribute() + configureLayout() + + // TODO: - 임시 네비 바 설정 + configureCustomNavigationBar(navigationBarStyle: .withBackButton(title: "임시뒤로가기")) + let filteredNavigations = navigationController?.viewControllers.filter { !($0 is EmotionRegistrationViewController) } ?? [] + navigationController?.setViewControllers(filteredNavigations, animated: false) + } + + func configureAttribute() { + backgroundImageView.image = BitnagilGraphic.emotionCompletionBackgroundGraphic + groundImageView.image = BitnagilGraphic.emotionCompletionGroundGraphic + pomoImageView.image = BitnagilGraphic.marblePomoGraphic + pomoLeftHandImageView.image = BitnagilGraphic.pomoLeftHandGraphic + pomoRightHandImageView.image = BitnagilGraphic.pomoRightHandGraphic + + speechImageView.image = BitnagilGraphic.marbleSpeechGraphic?.withRenderingMode(.alwaysTemplate) + speechImageView.tintColor = BitnagilColor.gray10 + speechLabel.font = BitnagilFont.init(style: .cafe24Title2, weight: .light).font + speechLabel.numberOfLines = 2 + speechLabel.textColor = .white + speechLabel.textAlignment = .center + } + + func configureLayout() { + view.addSubview(backgroundImageView) + view.addSubview(groundImageView) + view.addSubview(pomoImageView) + view.addSubview(marbleImageView) + view.addSubview(pomoLeftHandImageView) + view.addSubview(pomoRightHandImageView) + view.addSubview(speechImageView) + view.addSubview(speechLabel) + + backgroundImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + groundImageView.snp.makeConstraints { make in + make.horizontalEdges.bottom.equalToSuperview() + make.height.equalTo(Layout.groundImageHeight) + } + + pomoImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(groundImageView.snp.top).offset(Layout.pomoBottomSpacing) + make.width.equalTo(Layout.pomoImageWidth) + make.height.equalTo(Layout.pomoImageHeight) + } + + marbleImageView.snp.makeConstraints { make in + make.top.equalTo(pomoImageView.snp.top).offset(Layout.marbleImageTopSpacing) + make.centerX.equalTo(pomoImageView) + make.size.equalTo(Layout.marbleImageSize) + } + + pomoLeftHandImageView.snp.makeConstraints { make in + make.top.equalTo(pomoImageView.snp.top).offset(Layout.pomoHandImageTopSpacing) + make.leading.equalTo(pomoImageView).offset(Layout.pomoLeftHandLeadingSpacing) + make.height.equalTo(Layout.pomoLeftHandImageHeight) + make.width.equalTo(Layout.pomoLeftHandImageWidth) + } + + pomoRightHandImageView.snp.makeConstraints { make in + make.top.equalTo(pomoImageView.snp.top).offset(Layout.pomoHandImageTopSpacing) + make.trailing.equalTo(pomoImageView).offset(-Layout.pomoRightHandTrailingSpacing) + make.width.equalTo(Layout.pomoRightHandImageWidth) + make.height.equalTo(Layout.pomoRightHandImageHeight) + } + + speechImageView.snp.makeConstraints { make in + make.horizontalEdges.equalToSuperview().inset(Layout.speechImageHorizontalSpacing) + make.height.equalTo(Layout.speechImageHeight) + make.bottom.equalTo(pomoImageView.snp.top).offset(-Layout.speechImageBottomSpacing) + } + + speechLabel.snp.makeConstraints { make in + make.top.equalTo(speechImageView.snp.top).offset(Layout.speechLabelTopSpacing) + make.horizontalEdges.equalTo(speechImageView).inset(Layout.speechImageHorizontalSpacing) + } + } +} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterView.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterView.swift deleted file mode 100644 index 78a97486..00000000 --- a/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegisterView.swift +++ /dev/null @@ -1,149 +0,0 @@ -// -// EmotionRegisterView.swift -// Presentation -// -// Created by 최정인 on 7/28/25. -// - -import Combine -import Shared -import SnapKit -import UIKit - -final class EmotionRegisterView: BaseViewController { - - private enum Layout { - static let mainLabelTopSpacing: CGFloat = 32 - static let mainLabelHeight: CGFloat = 30 - static let subLabelTopSpacing: CGFloat = 6 - static let subLabelHeight: CGFloat = 28 - static let emotionOrbCellWidth: CGFloat = 96 - static let emotionOrbCellHeight: CGFloat = 126 - static let emotionOrbCollectionViewItemSpacing: CGFloat = 13 - static let emotionOrbCollectionViewLineSpacing: CGFloat = 28 - static let emotionOrbCollectionViewTopSpacing: CGFloat = 56 - static let emotionOrbCollectionViewHorizontalMargin: CGFloat = 30 - static let emotionOrbCollectionViewHeight: CGFloat = 280 - } - - private let mainLabel = UILabel() - private let subLabel = UILabel() - private let emotionOrbCollectionView: UICollectionView = { - let layout = UICollectionViewFlowLayout() - layout.itemSize = CGSize(width: Layout.emotionOrbCellWidth, height: Layout.emotionOrbCellHeight) - layout.minimumInteritemSpacing = Layout.emotionOrbCollectionViewItemSpacing - layout.minimumLineSpacing = Layout.emotionOrbCollectionViewLineSpacing - layout.sectionInset = .zero - - let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) - return collectionView - }() - private var emotionList: [Emotion] = [] - private var cancellables: Set - - override init(viewModel: EmotionRegisterViewModel) { - cancellables = [] - super.init(viewModel: viewModel) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - viewModel.action(input: .fetchEmotions) - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) -// configureNavigationBar(navigationStyle: .withBackButton(title: "")) - } - - override func configureAttribute() { - mainLabel.text = "오늘의 감정구슬을 골라보세요" - mainLabel.textAlignment = .center - mainLabel.font = BitnagilFont(style: .title2, weight: .bold).font - mainLabel.textColor = BitnagilColor.navy500 - - subLabel.text = "감정구슬을 등록하면 루틴을 추천받아요!" - subLabel.textAlignment = .center - subLabel.font = BitnagilFont(style: .subtitle1, weight: .regular).font - subLabel.textColor = BitnagilColor.navy300 - - emotionOrbCollectionView.backgroundColor = .clear - - emotionOrbCollectionView.delegate = self - emotionOrbCollectionView.dataSource = self - emotionOrbCollectionView.register(EmotionOrbCollectionViewCell.self, forCellWithReuseIdentifier: EmotionOrbCollectionViewCell.className) - } - - override func configureLayout() { - let safeArea = view.safeAreaLayoutGuide - view.backgroundColor = .systemBackground - - view.addSubview(mainLabel) - view.addSubview(subLabel) - view.addSubview(emotionOrbCollectionView) - - mainLabel.snp.makeConstraints { make in - make.top.equalTo(safeArea).offset(Layout.mainLabelTopSpacing) - make.horizontalEdges.equalTo(safeArea) - make.height.equalTo(Layout.mainLabelHeight) - } - - subLabel.snp.makeConstraints { make in - make.top.equalTo(mainLabel.snp.bottom).offset(Layout.subLabelTopSpacing) - make.horizontalEdges.equalTo(safeArea) - make.height.equalTo(Layout.subLabelHeight) - } - - emotionOrbCollectionView.snp.makeConstraints { make in - make.top.equalTo(subLabel.snp.bottom).offset(Layout.emotionOrbCollectionViewTopSpacing) - make.leading.equalTo(safeArea).offset(Layout.emotionOrbCollectionViewHorizontalMargin) - make.trailing.equalTo(safeArea).inset(Layout.emotionOrbCollectionViewHorizontalMargin) - make.height.equalTo(Layout.emotionOrbCollectionViewHeight) - } - } - - override func bind() { - viewModel.output.emotionListPublisher - .receive(on: DispatchQueue.main) - .sink { [weak self] emotionList in - self?.emotionList = emotionList - if !emotionList.isEmpty { - self?.emotionOrbCollectionView.reloadData() - } - } - .store(in: &cancellables) - } -} - -// MARK: UICollectionViewDelegate -extension EmotionRegisterView: UICollectionViewDelegate { - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - let selectedEmotion = emotionList[indexPath.item] - guard let resultRecommendedRoutineViewModel = DIContainer.shared.resolve(type: ResultRecommendedRoutineViewModel.self) - else { fatalError("resultRecommendedRoutineViewModel 의존성이 등록되지 않았습니다.") } - resultRecommendedRoutineViewModel.configure(viewModelType: .emotion(emotion: selectedEmotion)) - - let resultRecommendedRoutineView = ResultRecommendedRoutineViewController(entryPoint: .emotion, viewModel: resultRecommendedRoutineViewModel) - self.navigationController?.pushViewController(resultRecommendedRoutineView, animated: true) - } -} - -// MARK: UICollectionViewDataSource -extension EmotionRegisterView: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return emotionList.count - } - - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: EmotionOrbCollectionViewCell.className, for: indexPath) as? EmotionOrbCollectionViewCell - else { return UICollectionViewCell() } - - let emotion = emotionList[indexPath.item] - cell.configureCell(emotion: emotion) - return cell - } -} diff --git a/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegistrationViewController.swift b/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegistrationViewController.swift new file mode 100644 index 00000000..185f193f --- /dev/null +++ b/Projects/Presentation/Sources/EmotionRegister/View/EmotionRegistrationViewController.swift @@ -0,0 +1,479 @@ +// +// EmotionRegistrationViewController.swift +// Presentation +// +// Created by 이동현 on 8/19/25. +// + +import Combine +import SnapKit +import UIKit + +final class EmotionRegistrationViewController: BaseViewController { + private enum Layout { + static let smallMarbleScrollViewHeight: CGFloat = 40 + static let smallMarbleScrollViewTopSpacing: CGFloat = 70 + static let marbleStackViewHorizontalSpacing: CGFloat = 20 + static let marbleStackViewContentSpacing: CGFloat = 19 + static let smallMarbleImageSize: CGFloat = 40 + static let emotionLabelWidth: CGFloat = 92 + static let emotionLabelHeight: CGFloat = 36 + static let emotionCollectionViewHeight: CGFloat = 191 + static let emotionMarbleImageViewSize: CGFloat = 140 + static let emotionMarbleImageViewTopSpacing: CGFloat = 13 + static let speechImageTopSpacing: CGFloat = 26 + static let speechImageHorizontalSpacing: CGFloat = 54 + static let speechImageHeight: CGFloat = 102 + static let speechLabelTopSpacing: CGFloat = 22 + static let fomoHandImageWidth: CGFloat = 263 + static let fomoHandImageHeight: CGFloat = 207 + static let fomoThumbImageWidth: CGFloat = 80 + static let fomoThumbImageHeight: CGFloat = 65 + static let foromThumbTopSpacing: CGFloat = 64 + static let foromThumbLeadingSpacing: CGFloat = 71 + static let handMarbleImageViewBottomSpacing: CGFloat = 7 + static let handMarbleImageViewTopSpacing: CGFloat = 50 + static let infoLabelTopSpacing: CGFloat = 30 + static let doubleChevronIconSize: CGFloat = 24 + static let doubleChevronIconHorizontalSpacing: CGFloat = 26 + static let doubleChevronIconTopSpacing: CGFloat = 10 + static let infoViewSize: CGFloat = 0 + } + + private let smallMarbleScrollView = UIScrollView() + private let smallMarbleStackView = UIStackView() + private let emotionLabel = UILabel() + private let emotionCollectionView = UICollectionView(frame: .zero, collectionViewLayout: EmotionCollectionViewLayout()) + private let emotionMarbleImageView = UIImageView() + private let handMarbleView = UIView() + private let speechImageView = UIImageView() + private let speechLabel = UILabel() + private let handImageView = UIImageView() + private let thumbImageView = UIImageView() + private let infoView = UIView() + private let infoLabel = UILabel() + private let leftDoubleChevronImageView = UIImageView() + private let rightDoubleChevronImageView = UIImageView() + private let downDoubleChevronImageView = UIImageView() + private var isMarbleHeld = false + private var marbleImageViewMidY: CGFloat? + private var marbleImageViewPanGesture: UIPanGestureRecognizer? + private var emotion: Emotion? + private var dataSource: UICollectionViewDiffableDataSource? + private var cancellables: Set + var itemCount: Int { + return (dataSource?.snapshot().numberOfItems ?? 0) / 3 + } + + + override init(viewModel: EmotionRegisterViewModel) { + cancellables = [] + super.init(viewModel: viewModel) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + viewModel.action(input: .fetchEmotions) + } + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + if view.frame.maxY == view.safeAreaLayoutGuide.layoutFrame.maxY { + handMarbleView.snp.remakeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(infoLabel.snp.bottom).offset(Layout.handMarbleImageViewTopSpacing) + make.size.equalTo(Layout.emotionMarbleImageViewSize) + } + + handImageView.isHidden = true + thumbImageView.isHidden = true + } + + if marbleImageViewMidY == nil { marbleImageViewMidY = emotionMarbleImageView.center.y } + } + + override func configureAttribute() { + view.backgroundColor = .white + + configureMarbleImageView() + configureSmallMarbleViews() + configureCustomNavigationBar(navigationBarStyle: .withBackButton(title: "오늘 감정 등록하기")) + + emotionCollectionView.register(EmotionCollectionViewCell.self, forCellWithReuseIdentifier: EmotionCollectionViewCell.className) + emotionCollectionView.delegate = self + emotionCollectionView.showsHorizontalScrollIndicator = false + emotionCollectionView.decelerationRate = .fast + + emotionLabel.layer.cornerRadius = 10 + emotionLabel.layer.masksToBounds = true + emotionLabel.font = BitnagilFont(style: .title3, weight: .semiBold).font + emotionLabel.textAlignment = .center + + speechImageView.image = BitnagilGraphic.marbleSpeechGraphic?.withRenderingMode(.alwaysTemplate) + speechImageView.tintColor = .clear + speechLabel.numberOfLines = 2 + speechLabel.textAlignment = .center + speechLabel.font = BitnagilFont.init(style:.cafe24Title2, weight: .light).font + speechLabel.textColor = .clear + + infoLabel.numberOfLines = 0 + infoLabel.font = BitnagilFont.init(style: .body2, weight: .medium).font + infoLabel.textColor = BitnagilColor.gray50 + infoLabel.textAlignment = .center + + leftDoubleChevronImageView.image = BitnagilIcon.doubleChevronIcon(direction: .left) + rightDoubleChevronImageView.image = BitnagilIcon.doubleChevronIcon(direction: .right) + downDoubleChevronImageView.image = BitnagilIcon.doubleChevronIcon(direction: .down) + + handImageView.image = BitnagilGraphic.fomoHandGraphic + thumbImageView.image = BitnagilGraphic.fomoThumbGraphic + + [ + leftDoubleChevronImageView, + rightDoubleChevronImageView, + downDoubleChevronImageView].forEach { + $0.tintColor = BitnagilColor.gray60 + } + + dataSource = UICollectionViewDiffableDataSource(collectionView: emotionCollectionView) { collectionView, indexPath, item in + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: EmotionCollectionViewCell.className, for: indexPath) as? EmotionCollectionViewCell else { return UICollectionViewCell() } + cell.configure(image: item.image) + return cell + } + } + + override func configureLayout() { + let safeArea = view.safeAreaLayoutGuide + + view.addSubview(smallMarbleScrollView) + view.addSubview(emotionCollectionView) + view.addSubview(emotionLabel) + view.addSubview(speechImageView) + view.addSubview(speechLabel) + view.addSubview(handImageView) + view.addSubview(emotionMarbleImageView) + view.addSubview(handMarbleView) + view.addSubview(thumbImageView) + view.addSubview(infoView) + smallMarbleScrollView.addSubview(smallMarbleStackView) + infoView.addSubview(infoLabel) + infoView.addSubview(leftDoubleChevronImageView) + infoView.addSubview(rightDoubleChevronImageView) + infoView.addSubview(downDoubleChevronImageView) + + smallMarbleScrollView.snp.makeConstraints { make in + make.height.equalTo(Layout.smallMarbleScrollViewHeight) + make.horizontalEdges.equalToSuperview() + make.top.equalTo(safeArea.snp.top).offset(Layout.smallMarbleScrollViewTopSpacing) + } + + smallMarbleStackView.snp.makeConstraints { make in + make.verticalEdges.equalTo(smallMarbleScrollView.contentLayoutGuide) + make.horizontalEdges.equalTo(smallMarbleScrollView.contentLayoutGuide).inset(Layout.marbleStackViewHorizontalSpacing) + make.height.equalTo(smallMarbleScrollView.snp.height) + make.width.equalTo(smallMarbleScrollView.frameLayoutGuide).priority(.low) + } + + speechImageView.snp.makeConstraints { make in + make.top.equalTo(smallMarbleStackView.snp.bottom).offset(Layout.speechImageTopSpacing) + make.horizontalEdges.equalToSuperview().inset(Layout.speechImageHorizontalSpacing) + make.height.equalTo(Layout.speechImageHeight) + } + + speechLabel.snp.makeConstraints { make in + make.top.equalTo(speechImageView.snp.top).offset(Layout.speechLabelTopSpacing) + make.centerX.equalTo(speechImageView) + } + + emotionCollectionView.snp.makeConstraints { + $0.top.equalTo(speechImageView.snp.bottom).offset(17) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(Layout.emotionCollectionViewHeight) + } + + emotionLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalTo(emotionCollectionView) + make.height.equalTo(Layout.emotionLabelHeight) + make.width.equalTo(Layout.emotionLabelWidth) + } + + emotionMarbleImageView.snp.makeConstraints { make in + make.top.equalTo(emotionLabel.snp.bottom).offset(Layout.emotionMarbleImageViewTopSpacing) + make.centerX.equalToSuperview() + make.size.equalTo(Layout.emotionMarbleImageViewSize) + } + + infoView.snp.makeConstraints { make in + make.top.equalTo(emotionCollectionView.snp.bottom).offset(Layout.infoLabelTopSpacing) + make.centerX.equalToSuperview() + make.width.equalTo(Layout.infoViewSize).priority(.low) + make.height.equalTo(Layout.infoViewSize).priority(.low) + } + + infoLabel.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + leftDoubleChevronImageView.snp.makeConstraints { make in + make.centerY.equalTo(infoLabel) + make.trailing.equalTo(infoLabel.snp.leading).offset(-Layout.doubleChevronIconHorizontalSpacing) + make.size.equalTo(Layout.doubleChevronIconSize) + } + + rightDoubleChevronImageView.snp.makeConstraints { make in + make.centerY.equalTo(infoLabel) + make.leading.equalTo(infoLabel.snp.trailing).offset(Layout.doubleChevronIconHorizontalSpacing) + make.size.equalTo(Layout.doubleChevronIconSize) + } + + downDoubleChevronImageView.snp.makeConstraints { make in + make.centerX.equalTo(infoLabel) + make.top.equalTo(infoLabel.snp.bottom).offset(Layout.doubleChevronIconTopSpacing) + make.size.equalTo(Layout.doubleChevronIconSize) + } + + handImageView.snp.makeConstraints { make in + make.bottom.equalToSuperview() + make.centerX.equalToSuperview() + make.height.equalTo(Layout.fomoHandImageHeight) + make.width.equalTo(Layout.fomoHandImageWidth) + } + + thumbImageView.snp.makeConstraints { make in + make.top.equalTo(handImageView.snp.top).offset(Layout.foromThumbTopSpacing) + make.leading.equalTo(handImageView.snp.leading).offset(Layout.foromThumbLeadingSpacing) + make.height.equalTo(Layout.fomoThumbImageHeight) + make.width.equalTo(Layout.fomoThumbImageWidth) + } + + handMarbleView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(thumbImageView.snp.bottom).offset(-Layout.handMarbleImageViewBottomSpacing) + make.size.equalTo(Layout.emotionMarbleImageViewSize) + } + } + + override func bind() { + viewModel.output.emotionListPublisher + .receive(on: DispatchQueue.main) + .sink {[weak self] emotions in + guard let self = self else { return } + + let originalEmotionCount = emotions.count + let tripledEmotions = emotions.map({ $0.copy() }) + emotions + emotions.map({ $0.copy() }) + + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([0]) + snapshot.appendItems(tripledEmotions) + self.dataSource?.apply(snapshot, animatingDifferences: false) + + self.scrollToIndex(index: originalEmotionCount) + viewModel.action(input: .selectEmotion(index: 0)) + } + .store(in: &cancellables) + + viewModel.output.selectedEmotionPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] emotion in + guard + let self = self, + let emotion + else { return } + + self.emotion = emotion + UIView.animate( + withDuration: 0.4, + delay: 0, + options: [.curveEaseInOut] + ) { + self.emotionMarbleImageView.image = emotion.image + self.emotionLabel.backgroundColor = emotion.backgroundColor + self.speechImageView.tintColor = emotion.backgroundColor + self.speechLabel.textColor = emotion.textColor + self.emotionLabel.textColor = emotion.textColor + self.speechLabel.text = emotion.emotionMessage + self.emotionLabel.text = emotion.emotionTitle + self.emotionMarbleImageView.isHidden = false + } + } + .store(in: &cancellables) + + viewModel.output.confirmEmotionEnabledPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] canConfirmEmotion in + self?.emotionMarbleImageView.isUserInteractionEnabled = canConfirmEmotion + self?.rightDoubleChevronImageView.isHidden = canConfirmEmotion + self?.leftDoubleChevronImageView.isHidden = canConfirmEmotion + self?.downDoubleChevronImageView.isHidden = !canConfirmEmotion + + let infoMessage = canConfirmEmotion + ? """ + 선택한 감정 구슬을 아래로 놓아주세요 + """ + : """ + 좌우로 스와이프해 + 감정 구슬을 골라주세요 + """ + self?.infoLabel.text = infoMessage + } + .store(in: &cancellables) + } + + private func configureSmallMarbleViews() { + smallMarbleScrollView.showsHorizontalScrollIndicator = false + + smallMarbleStackView.axis = .horizontal + smallMarbleStackView.distribution = .equalSpacing + smallMarbleStackView.spacing = Layout.marbleStackViewContentSpacing + + Marble.allCases.dropFirst().forEach { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapSmallMarbleImage(gesture:))) + let smallMarbleImageView = UIImageView() + + smallMarbleImageView.image = $0.marbleImage + smallMarbleImageView.addGestureRecognizer(tapGesture) + smallMarbleImageView.isUserInteractionEnabled = true + + smallMarbleImageView.snp.makeConstraints { make in + make.size.equalTo(Layout.smallMarbleImageSize) + } + + smallMarbleStackView.addArrangedSubview(smallMarbleImageView) + } + } + + private func configureMarbleImageView() { + marbleImageViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:))) + marbleImageViewPanGesture?.cancelsTouchesInView = false + + handMarbleView.layer.cornerRadius = Layout.emotionMarbleImageViewSize / 2 + handMarbleView.layer.masksToBounds = true + handMarbleView.backgroundColor = .clear + + emotionMarbleImageView.isUserInteractionEnabled = true + emotionMarbleImageView.layer.cornerRadius = Layout.emotionMarbleImageViewSize / 2 + emotionMarbleImageView.layer.masksToBounds = true + + guard let marbleImageViewPanGesture else { return } + + emotionMarbleImageView.addGestureRecognizer(marbleImageViewPanGesture) + } + + @objc private func handleTapSmallMarbleImage(gesture: UITapGestureRecognizer) { + guard + let tappedSmallMarbleView = gesture.view, + let index = smallMarbleStackView.arrangedSubviews.firstIndex(of: tappedSmallMarbleView) + else { return } + + scrollToIndex(index: index + 1, animated: true) { [weak self] in + self?.viewModel.action(input: .selectEmotion(index: index + 1)) + } + } + + @objc private func handlePan(gesture: UIPanGestureRecognizer) { + guard let marbleImageViewMidY else { return } + + switch gesture.state { + case .began: + infoView.isHidden = true + case .changed: + let translationY = gesture.translation(in: view).y + let offSet = max(0, translationY) + + guard offSet <= handMarbleView.frame.midY - marbleImageViewMidY else { return } + + emotionMarbleImageView.transform = CGAffineTransform(translationX: 0, y: offSet) + case .ended, .cancelled, .failed: + if emotionMarbleImageView.frame.maxY > handMarbleView.frame.minY + (Layout.emotionMarbleImageViewSize / 2) { + let dy = handMarbleView.frame.midY - marbleImageViewMidY + UIView.animate( + withDuration: 0.3, + delay: 0, + options: [.curveEaseInOut] + ) { + self.emotionMarbleImageView.transform = CGAffineTransform(translationX: 0, y: dy) + } completion: { _ in + guard let emotion = self.emotion else { return } + let completionViewController = EmotionRegisterCompletionViewController(emotion: emotion) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { + self.navigationController?.pushViewController(completionViewController, animated: true) + } + } + } else { + UIView.animate( + withDuration: 0.2, + delay: 0, + options: [.curveEaseInOut] + ) { + self.emotionMarbleImageView.transform = .identity + self.infoView.isHidden = false + } + } + default: + break + } + } + + private func scrollToIndex( + index: Int, + animated: Bool = false, + completion: (() -> Void)? = nil + ) { + guard itemCount > 0 else { return } + + let index = (index + itemCount) % itemCount + let targetIndex = index + itemCount + let indexPath = IndexPath(item: targetIndex, section: 0) + + emotionMarbleImageView.isHidden = true + emotionCollectionView.scrollToItem( + at: indexPath, + at: .centeredHorizontally, + animated: animated) + + if !animated { + completion?() + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + completion?() + } + } + } +} + +extension EmotionRegistrationViewController: UICollectionViewDelegate { + +} + +extension EmotionRegistrationViewController: UIScrollViewDelegate { + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + emotionMarbleImageView.isHidden = true + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + let centerPoint = CGPoint( + x: emotionCollectionView.contentOffset.x + emotionCollectionView.frame.midX, + y: emotionCollectionView.contentOffset.y) + + guard + let collectionView = scrollView as? UICollectionView, + let indexPath = collectionView.indexPathForItem(at: centerPoint), + itemCount > 0 + else { return } + + let index = indexPath.row % itemCount + if indexPath.row < itemCount / 3 || indexPath.row >= itemCount * 2 / 3 { + scrollToIndex(index: index) + } + viewModel.action(input: .selectEmotion(index: index)) + } +} + diff --git a/Projects/Presentation/Sources/EmotionRegister/ViewModel/EmotionRegisterViewModel.swift b/Projects/Presentation/Sources/EmotionRegister/ViewModel/EmotionRegisterViewModel.swift index 3e7c7b20..a3369854 100644 --- a/Projects/Presentation/Sources/EmotionRegister/ViewModel/EmotionRegisterViewModel.swift +++ b/Projects/Presentation/Sources/EmotionRegister/ViewModel/EmotionRegisterViewModel.swift @@ -12,27 +12,35 @@ import Shared final class EmotionRegisterViewModel: ViewModel { enum Input { case fetchEmotions + case selectEmotion(index: Int) } struct Output { let emotionListPublisher: AnyPublisher<[Emotion], Never> + let selectedEmotionPublisher: AnyPublisher + let confirmEmotionEnabledPublisher: AnyPublisher } private(set) var output: Output private let emotionListSubject = CurrentValueSubject<[Emotion], Never>([]) + private let selectedEmotionSubject = CurrentValueSubject(nil) + private let confirmEmotionEnabledSubject = PassthroughSubject() private let emotionUseCase: EmotionUseCaseProtocol init(emotionUseCase: EmotionUseCaseProtocol) { self.emotionUseCase = emotionUseCase output = Output( - emotionListPublisher: emotionListSubject.eraseToAnyPublisher() - ) + emotionListPublisher: emotionListSubject.eraseToAnyPublisher(), + selectedEmotionPublisher: selectedEmotionSubject.eraseToAnyPublisher(), + confirmEmotionEnabledPublisher: confirmEmotionEnabledSubject.eraseToAnyPublisher()) } func action(input: Input) { switch input { case .fetchEmotions: fetchEmotions() + case .selectEmotion(let index): + selectEmotion(index: index) } } @@ -40,7 +48,9 @@ final class EmotionRegisterViewModel: ViewModel { Task { do { let emotionEntities = try await emotionUseCase.fetchEmotions() - let emotionList = emotionEntities.compactMap({ $0.toEmotion() }) +// let emotionList = emotionEntities.compactMap({ $0.toEmotion() }) + // TODO: - 서버 연동 후 삭제 + let emotionList = emotinonDummies BitnagilLogger.log(logType: .info, message: "감정 구슬 목록들 조회에 성공했습니다.") emotionListSubject.send(emotionList) } catch { @@ -49,4 +59,18 @@ final class EmotionRegisterViewModel: ViewModel { } } } + + private func selectEmotion(index: Int) { + let emotions = emotionListSubject.value + + guard + index >= 0, + index < emotions.count + else { return } + + let emotion = emotions[index] + + selectedEmotionSubject.send(emotion) + confirmEmotionEnabledSubject.send(emotion.emotionType != "NONE") + } } diff --git a/Projects/Presentation/Sources/Home/View/HomeViewController.swift b/Projects/Presentation/Sources/Home/View/HomeViewController.swift index c40f1f1b..6333b492 100644 --- a/Projects/Presentation/Sources/Home/View/HomeViewController.swift +++ b/Projects/Presentation/Sources/Home/View/HomeViewController.swift @@ -623,9 +623,11 @@ final class HomeViewController: BaseViewController { guard let emotionRegisterViewModel = DIContainer.shared.resolve(type: EmotionRegisterViewModel.self) else { fatalError("emotionRegisterViewModel 의존성이 등록되지 않았습니다.") } - let emotionRegisterView = EmotionRegisterView(viewModel: emotionRegisterViewModel) - emotionRegisterView.hidesBottomBarWhenPushed = true - navigationController?.pushViewController(emotionRegisterView, animated: true) + + let emotionRegistrationViewController = EmotionRegistrationViewController(viewModel: emotionRegisterViewModel) + + emotionRegistrationViewController.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(emotionRegistrationViewController, animated: true) } } diff --git a/Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineViewController.swift b/Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineViewController.swift index 363d1542..0b2b03c9 100644 --- a/Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineViewController.swift +++ b/Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineViewController.swift @@ -91,8 +91,6 @@ final class RecommendedRoutineViewController: BaseViewController