From 4a462aa3fe1c3429d9fa3c3c492378b4f9019126 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Fri, 10 Nov 2023 15:57:15 +0400 Subject: [PATCH 1/4] Add shared logic --- .../view/fragment/DefaultStepQuizFragment.kt | 27 ++++-- .../Modules/StepQuiz/StepQuizViewModel.swift | 12 ++- .../Modules/StepQuiz/Views/StepQuizView.swift | 13 +-- .../hyperskill/HyperskillAnalyticPart.kt | 2 + .../hyperskill/HyperskillAnalyticTarget.kt | 2 + .../cache/OnboardingCacheDataSourceImpl.kt | 16 +++- .../cache/OnboardingCacheKeyValues.kt | 6 +- .../repository/OnboardingRepositoryImpl.kt | 16 +++- .../data/source/OnboardingCacheDataSource.kt | 6 ++ .../domain/interactor/OnboardingInteractor.kt | 16 +++- .../domain/model/ProblemsOnboardingFlags.kt | 7 ++ .../domain/repository/OnboardingRepository.kt | 17 +++- ...rdingModalHiddenHyperskillAnalyticEvent.kt | 30 ------- ...ardingModalShownHyperskillAnalyticEvent.kt | 30 ------- ...rdingModalHiddenHyperskillAnalyticEvent.kt | 44 +++++++++ ...ardingModalShownHyperskillAnalyticEvent.kt | 44 +++++++++ .../presentation/StepQuizActionDispatcher.kt | 18 +++- .../step_quiz/presentation/StepQuizFeature.kt | 20 +++-- .../step_quiz/presentation/StepQuizReducer.kt | 89 +++++++++++++++---- 19 files changed, 309 insertions(+), 106 deletions(-) create mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/model/ProblemsOnboardingFlags.kt delete mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt delete mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent.kt create mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt create mode 100644 shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalShownHyperskillAnalyticEvent.kt diff --git a/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz/view/fragment/DefaultStepQuizFragment.kt b/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz/view/fragment/DefaultStepQuizFragment.kt index 1a685f8fee..7d9bb34ad4 100644 --- a/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz/view/fragment/DefaultStepQuizFragment.kt +++ b/androidHyperskillApp/src/main/java/org/hyperskill/app/android/step_quiz/view/fragment/DefaultStepQuizFragment.kt @@ -285,9 +285,18 @@ abstract class DefaultStepQuizFragment : ProblemsLimitReachedBottomSheet.newInstance(action.modalText) .showIfNotExists(childFragmentManager, ProblemsLimitReachedBottomSheet.TAG) } - StepQuizFeature.Action.ViewAction.ShowParsonsProblemOnboardingModal -> { - ParsonsStepQuizOnboardingBottomSheetDialogFragment.newInstance() - .showIfNotExists(childFragmentManager, ParsonsStepQuizOnboardingBottomSheetDialogFragment.TAG) + is StepQuizFeature.Action.ViewAction.ShowProblemOnboardingModal -> { + when (action.modalType) { + StepQuizFeature.ProblemOnboardingModal.Parsons -> + ParsonsStepQuizOnboardingBottomSheetDialogFragment.newInstance() + .showIfNotExists( + childFragmentManager, + ParsonsStepQuizOnboardingBottomSheetDialogFragment.TAG + ) + is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> { + // TODO: ALTAPPS-1031 Implement FillBlanks onboarding modal + } + } } is StepQuizFeature.Action.ViewAction.StepQuizHintsViewAction -> { stepQuizHintsDelegate?.onAction(action.viewAction) @@ -415,11 +424,19 @@ abstract class DefaultStepQuizFragment : } override fun parsonsProblemOnboardingShown() { - stepQuizViewModel.onNewMessage(StepQuizFeature.Message.ParsonsProblemOnboardingModalShownMessage) + stepQuizViewModel.onNewMessage( + StepQuizFeature.Message.ProblemOnboardingModalShownMessage( + modalType = StepQuizFeature.ProblemOnboardingModal.Parsons + ) + ) } override fun parsonsProblemOnboardingHidden() { - stepQuizViewModel.onNewMessage(StepQuizFeature.Message.ParsonsProblemOnboardingModalHiddenEventMessage) + stepQuizViewModel.onNewMessage( + StepQuizFeature.Message.ProblemOnboardingModalHiddenMessage( + modalType = StepQuizFeature.ProblemOnboardingModal.Parsons + ) + ) } protected fun syncReplyState(reply: Reply) { diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift index 0d64f4a544..71ad177101 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift @@ -225,12 +225,20 @@ extension StepQuizViewModel: StepQuizParsonsOnboardingModalViewControllerDelegat func stepQuizParsonsOnboardingModalViewControllerDidAppear( _ viewController: StepQuizParsonsOnboardingModalViewController ) { - onNewMessage(StepQuizFeatureMessageParsonsProblemOnboardingModalShownMessage()) + onNewMessage( + StepQuizFeatureMessageProblemOnboardingModalShownMessage( + modalType: StepQuizFeatureProblemOnboardingModalParsons() + ) + ) } func stepQuizParsonsOnboardingModalViewControllerDidDisappear( _ viewController: StepQuizParsonsOnboardingModalViewController ) { - onNewMessage(StepQuizFeatureMessageParsonsProblemOnboardingModalHiddenEventMessage()) + onNewMessage( + StepQuizFeatureMessageProblemOnboardingModalHiddenMessage( + modalType: StepQuizFeatureProblemOnboardingModalParsons() + ) + ) } } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift index b9cc5178d2..f3c122e9a1 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift @@ -296,8 +296,8 @@ struct StepQuizView: View { presentResetCodePermissionAlert() case .showProblemsLimitReachedModal(let showProblemsLimitReachedModalViewAction): presentProblemsLimitReachedModal(modalText: showProblemsLimitReachedModalViewAction.modalText) - case .showParsonsProblemOnboardingModal: - presentParsonsProblemOnboardingModal() + case .showProblemOnboardingModal(let showProblemOnboardingModalViewAction): + presentProblemOnboardingModal(modalType: showProblemOnboardingModalViewAction.modalType) case .navigateTo(let viewActionNavigateTo): switch StepQuizFeatureActionViewActionNavigateToKs(viewActionNavigateTo) { case .home: @@ -355,9 +355,12 @@ private extension StepQuizView { panModalPresenter.presentPanModal(panModal) } - func presentParsonsProblemOnboardingModal() { - let panModal = StepQuizParsonsOnboardingModalViewController(delegate: viewModel) - panModalPresenter.presentPanModal(panModal) + func presentProblemOnboardingModal(modalType: StepQuizFeatureProblemOnboardingModal) { + let modalViewController = switch StepQuizFeatureProblemOnboardingModalKs(modalType) { + case .parsons: StepQuizParsonsOnboardingModalViewController(delegate: viewModel) + case .fillBlanks(let mode): fatalError("TODO: Implement \(mode)") + } + panModalPresenter.presentPanModal(modalViewController) } } diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt index 9e4c707a0f..b3f539f9cb 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticPart.kt @@ -22,6 +22,8 @@ enum class HyperskillAnalyticPart(val partName: String) { TOPIC_COMPLETED_MODAL("topic_completed_modal"), PROBLEMS_LIMIT_REACHED_MODAL("problems_limit_reached_modal"), PARSONS_PROBLEM_ONBOARDING_MODAL("parsons_problem_onboarding_modal"), + FILL_BLANKS_INPUT_MODE_ONBOARDING_MODAL("fill_blanks_input_mode_onboarding_modal"), + FILL_BLANKS_SELECT_MODE_ONBOARDING_MODAL("fill_blanks_select_mode_onboarding_modal"), MODAL("modal"), STREAK_WIDGET("streak_widget"), STREAK_FREEZE_MODAL("streak_freeze_modal"), diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt index ec159f4da7..ef31bb987c 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/analytic/domain/model/hyperskill/HyperskillAnalyticTarget.kt @@ -61,6 +61,8 @@ enum class HyperskillAnalyticTarget(val targetName: String) { DAILY_STEP_COMPLETED_MODAL("daily_step_completed_modal"), PROBLEMS_LIMIT_REACHED_MODAL("problems_limit_reached_modal"), PARSONS_PROBLEM_ONBOARDING_MODAL("parsons_problem_onboarding_modal"), + FILL_BLANKS_INPUT_MODE_ONBOARDING_MODAL("fill_blanks_input_mode_onboarding_modal"), + FILL_BLANKS_SELECT_MODE_ONBOARDING_MODAL("fill_blanks_select_mode_onboarding_modal"), TOPIC_COMPLETED_MODAL("topic_completed_modal"), CLOSE("close"), STREAK("streak"), diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheDataSourceImpl.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheDataSourceImpl.kt index 18393bcf36..4fa7f72ff4 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheDataSourceImpl.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheDataSourceImpl.kt @@ -3,7 +3,7 @@ package org.hyperskill.app.onboarding.cache import com.russhwolf.settings.Settings import org.hyperskill.app.onboarding.data.source.OnboardingCacheDataSource -class OnboardingCacheDataSourceImpl( +internal class OnboardingCacheDataSourceImpl( private val settings: Settings ) : OnboardingCacheDataSource { override fun isOnboardingShown(): Boolean = @@ -20,6 +20,20 @@ class OnboardingCacheDataSourceImpl( settings.putBoolean(OnboardingCacheKeyValues.IS_PARSONS_ONBOARDING_SHOWN, isShown) } + override fun isFillBlanksInputModeOnboardingShown(): Boolean = + settings.getBoolean(OnboardingCacheKeyValues.IS_FILL_BLANKS_INPUT_MODE_ONBOARDING_SHOWN) + + override fun setFillBlanksInputModeOnboardingShown(isShown: Boolean) { + settings.putBoolean(OnboardingCacheKeyValues.IS_FILL_BLANKS_INPUT_MODE_ONBOARDING_SHOWN, isShown) + } + + override fun isFillBlanksSelectModeOnboardingShown(): Boolean = + settings.getBoolean(OnboardingCacheKeyValues.IS_FILL_BLANKS_SELECT_MODE_ONBOARDING_SHOWN) + + override fun setFillBlanksSelectModeOnboardingShown(isShown: Boolean) { + settings.putBoolean(OnboardingCacheKeyValues.IS_FILL_BLANKS_SELECT_MODE_ONBOARDING_SHOWN, isShown) + } + override fun wasNotificationOnboardingShown(): Boolean = settings.getBoolean(OnboardingCacheKeyValues.IS_NOTIFICATIONS_ONBOARDING_SHOWN, defaultValue = false) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheKeyValues.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheKeyValues.kt index beded86de2..8f17a1087b 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheKeyValues.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/cache/OnboardingCacheKeyValues.kt @@ -1,8 +1,12 @@ package org.hyperskill.app.onboarding.cache -object OnboardingCacheKeyValues { +internal object OnboardingCacheKeyValues { const val IS_ONBOARDING_SHOWN = "is_onboarding_shown" + const val IS_PARSONS_ONBOARDING_SHOWN = "is_parsons_onboarding_shown" + const val IS_FILL_BLANKS_INPUT_MODE_ONBOARDING_SHOWN = "is_fill_blanks_input_mode_onboarding_shown" + const val IS_FILL_BLANKS_SELECT_MODE_ONBOARDING_SHOWN = "is_fill_blanks_select_mode_onboarding_shown" + const val IS_NOTIFICATIONS_ONBOARDING_SHOWN = "is_notifications_onboarding_shown" const val IS_FIRST_PROBLEM_ONBOARDING_SHOWN = "is_first_problem_onboarding_shown" } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/repository/OnboardingRepositoryImpl.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/repository/OnboardingRepositoryImpl.kt index 1bd53adac8..6952bbce90 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/repository/OnboardingRepositoryImpl.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/repository/OnboardingRepositoryImpl.kt @@ -3,7 +3,7 @@ package org.hyperskill.app.onboarding.data.repository import org.hyperskill.app.onboarding.data.source.OnboardingCacheDataSource import org.hyperskill.app.onboarding.domain.repository.OnboardingRepository -class OnboardingRepositoryImpl( +internal class OnboardingRepositoryImpl( private val onboardingCacheDataSource: OnboardingCacheDataSource ) : OnboardingRepository { override fun isOnboardingShown(): Boolean = @@ -20,6 +20,20 @@ class OnboardingRepositoryImpl( onboardingCacheDataSource.setParsonsOnboardingShown(isShown) } + override fun isFillBlanksInputModeOnboardingShown(): Boolean = + onboardingCacheDataSource.isFillBlanksInputModeOnboardingShown() + + override fun setFillBlanksInputModeOnboardingShown(isShown: Boolean) { + onboardingCacheDataSource.setFillBlanksInputModeOnboardingShown(isShown) + } + + override fun isFillBlanksSelectModeOnboardingShown(): Boolean = + onboardingCacheDataSource.isFillBlanksSelectModeOnboardingShown() + + override fun setFillBlanksSelectModeOnboardingShown(isShown: Boolean) { + onboardingCacheDataSource.setFillBlanksSelectModeOnboardingShown(isShown) + } + override fun wasNotificationOnboardingShown(): Boolean = onboardingCacheDataSource.wasNotificationOnboardingShown() diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/source/OnboardingCacheDataSource.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/source/OnboardingCacheDataSource.kt index 61dd5bab29..b8f49638b7 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/source/OnboardingCacheDataSource.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/data/source/OnboardingCacheDataSource.kt @@ -3,9 +3,15 @@ package org.hyperskill.app.onboarding.data.source interface OnboardingCacheDataSource { fun isOnboardingShown(): Boolean fun setOnboardingShown(isShown: Boolean) + fun isParsonsOnboardingShown(): Boolean fun setParsonsOnboardingShown(isShown: Boolean) + fun isFillBlanksInputModeOnboardingShown(): Boolean + fun setFillBlanksInputModeOnboardingShown(isShown: Boolean) + fun isFillBlanksSelectModeOnboardingShown(): Boolean + fun setFillBlanksSelectModeOnboardingShown(isShown: Boolean) + fun wasNotificationOnboardingShown(): Boolean fun setNotificationOnboardingWasShown(wasShown: Boolean) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/interactor/OnboardingInteractor.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/interactor/OnboardingInteractor.kt index a6cdba3f93..58ec828a23 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/interactor/OnboardingInteractor.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/interactor/OnboardingInteractor.kt @@ -1,6 +1,8 @@ package org.hyperskill.app.onboarding.domain.interactor +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags import org.hyperskill.app.onboarding.domain.repository.OnboardingRepository +import org.hyperskill.app.onboarding.domain.repository.getProblemsOnboardingFlags class OnboardingInteractor( private val onboardingRepository: OnboardingRepository @@ -12,13 +14,21 @@ class OnboardingInteractor( onboardingRepository.setOnboardingShown(isShown) } - fun isParsonsOnboardingShown(): Boolean = - onboardingRepository.isParsonsOnboardingShown() - fun setParsonsOnboardingShown(isShown: Boolean) { onboardingRepository.setParsonsOnboardingShown(isShown) } + fun setFillBlanksInputModeOnboardingShown(isShown: Boolean) { + onboardingRepository.setFillBlanksInputModeOnboardingShown(isShown) + } + + fun setFillBlanksSelectModeOnboardingShown(isShown: Boolean) { + onboardingRepository.setFillBlanksSelectModeOnboardingShown(isShown) + } + + fun getProblemsOnboardingFlags(): ProblemsOnboardingFlags = + onboardingRepository.getProblemsOnboardingFlags() + fun wasNotificationOnboardingShown(): Boolean = onboardingRepository.wasNotificationOnboardingShown() diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/model/ProblemsOnboardingFlags.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/model/ProblemsOnboardingFlags.kt new file mode 100644 index 0000000000..7ae74a41ba --- /dev/null +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/model/ProblemsOnboardingFlags.kt @@ -0,0 +1,7 @@ +package org.hyperskill.app.onboarding.domain.model + +class ProblemsOnboardingFlags( + val isParsonsOnboardingShown: Boolean, + val isFillBlanksInputModeOnboardingShown: Boolean, + val isFillBlanksSelectModeOnboardingShown: Boolean +) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/repository/OnboardingRepository.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/repository/OnboardingRepository.kt index 3b7e7c8ade..d468974325 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/repository/OnboardingRepository.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/onboarding/domain/repository/OnboardingRepository.kt @@ -1,14 +1,29 @@ package org.hyperskill.app.onboarding.domain.repository +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags + interface OnboardingRepository { fun isOnboardingShown(): Boolean fun setOnboardingShown(isShown: Boolean) + fun isParsonsOnboardingShown(): Boolean fun setParsonsOnboardingShown(isShown: Boolean) + fun isFillBlanksInputModeOnboardingShown(): Boolean + fun setFillBlanksInputModeOnboardingShown(isShown: Boolean) + fun isFillBlanksSelectModeOnboardingShown(): Boolean + fun setFillBlanksSelectModeOnboardingShown(isShown: Boolean) + fun wasNotificationOnboardingShown(): Boolean fun setNotificationOnboardingWasShown(wasShown: Boolean) fun wasFirstProblemOnboardingShown(): Boolean fun setFirstProblemOnboardingWasShown(wasShown: Boolean) -} \ No newline at end of file +} + +fun OnboardingRepository.getProblemsOnboardingFlags(): ProblemsOnboardingFlags = + ProblemsOnboardingFlags( + isParsonsOnboardingShown = isParsonsOnboardingShown(), + isFillBlanksInputModeOnboardingShown = isFillBlanksInputModeOnboardingShown(), + isFillBlanksSelectModeOnboardingShown = isFillBlanksSelectModeOnboardingShown() + ) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt deleted file mode 100644 index f2eb1fee58..0000000000 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.hyperskill.app.step_quiz.domain.analytic - -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticAction -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticEvent -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticPart -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticRoute -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticTarget - -/** - * Represents a hidden analytic event of the parsons problem onboarding modal. - * - * JSON payload: - * ``` - * { - * "route": "/learn/step/1", - * "action": "hidden", - * "part": "parsons_problem_onboarding_modal", - * "target": "close" - * } - * ``` - * @see HyperskillAnalyticEvent - */ -class ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent( - route: HyperskillAnalyticRoute -) : HyperskillAnalyticEvent( - route, - HyperskillAnalyticAction.HIDDEN, - HyperskillAnalyticPart.PARSONS_PROBLEM_ONBOARDING_MODAL, - HyperskillAnalyticTarget.CLOSE -) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent.kt deleted file mode 100644 index 5bbe65805a..0000000000 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent.kt +++ /dev/null @@ -1,30 +0,0 @@ -package org.hyperskill.app.step_quiz.domain.analytic - -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticAction -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticEvent -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticPart -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticRoute -import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticTarget - -/** - * Represents a shown analytic event of the parsons problem onboarding modal. - * - * JSON payload: - * ``` - * { - * "route": "/learn/step/1", - * "action": "shown", - * "part": "modal", - * "target": "parsons_problem_onboarding_modal" - * } - * ``` - * @see HyperskillAnalyticEvent - */ -class ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent( - route: HyperskillAnalyticRoute -) : HyperskillAnalyticEvent( - route, - HyperskillAnalyticAction.SHOWN, - HyperskillAnalyticPart.MODAL, - HyperskillAnalyticTarget.PARSONS_PROBLEM_ONBOARDING_MODAL -) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt new file mode 100644 index 0000000000..475297d533 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalHiddenHyperskillAnalyticEvent.kt @@ -0,0 +1,44 @@ +package org.hyperskill.app.step_quiz.domain.analytic + +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticAction +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticEvent +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticPart +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticRoute +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticTarget +import org.hyperskill.app.step_quiz.presentation.StepQuizFeature +import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode + +/** + * Represents a hidden analytic event of the problem onboarding modal. + * + * JSON payload: + * ``` + * { + * "route": "/learn/step/1", + * "action": "hidden", + * "part": "parsons_problem_onboarding_modal", + * "target": "close" + * } + * ``` + * + * @see HyperskillAnalyticEvent + */ +class ProblemOnboardingModalHiddenHyperskillAnalyticEvent( + route: HyperskillAnalyticRoute, + modalType: StepQuizFeature.ProblemOnboardingModal +) : HyperskillAnalyticEvent( + route, + HyperskillAnalyticAction.HIDDEN, + modalType.hyperskillAnalyticPart, + HyperskillAnalyticTarget.CLOSE +) + +internal val StepQuizFeature.ProblemOnboardingModal.hyperskillAnalyticPart: HyperskillAnalyticPart + get() = when (this) { + StepQuizFeature.ProblemOnboardingModal.Parsons -> HyperskillAnalyticPart.PARSONS_PROBLEM_ONBOARDING_MODAL + is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> + when (this.mode) { + FillBlanksMode.INPUT -> HyperskillAnalyticPart.FILL_BLANKS_INPUT_MODE_ONBOARDING_MODAL + FillBlanksMode.SELECT -> HyperskillAnalyticPart.FILL_BLANKS_SELECT_MODE_ONBOARDING_MODAL + } + } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalShownHyperskillAnalyticEvent.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalShownHyperskillAnalyticEvent.kt new file mode 100644 index 0000000000..0a558b6840 --- /dev/null +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/domain/analytic/ProblemOnboardingModalShownHyperskillAnalyticEvent.kt @@ -0,0 +1,44 @@ +package org.hyperskill.app.step_quiz.domain.analytic + +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticAction +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticEvent +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticPart +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticRoute +import org.hyperskill.app.analytic.domain.model.hyperskill.HyperskillAnalyticTarget +import org.hyperskill.app.step_quiz.presentation.StepQuizFeature +import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode + +/** + * Represents a shown analytic event of the problem onboarding modal. + * + * JSON payload: + * ``` + * { + * "route": "/learn/step/1", + * "action": "shown", + * "part": "modal", + * "target": "parsons_problem_onboarding_modal" + * } + * ``` + * + * @see HyperskillAnalyticEvent + */ +class ProblemOnboardingModalShownHyperskillAnalyticEvent( + route: HyperskillAnalyticRoute, + modalType: StepQuizFeature.ProblemOnboardingModal +) : HyperskillAnalyticEvent( + route, + HyperskillAnalyticAction.SHOWN, + HyperskillAnalyticPart.MODAL, + modalType.hyperskillAnalyticTarget +) + +internal val StepQuizFeature.ProblemOnboardingModal.hyperskillAnalyticTarget: HyperskillAnalyticTarget + get() = when (this) { + StepQuizFeature.ProblemOnboardingModal.Parsons -> HyperskillAnalyticTarget.PARSONS_PROBLEM_ONBOARDING_MODAL + is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> + when (this.mode) { + FillBlanksMode.INPUT -> HyperskillAnalyticTarget.FILL_BLANKS_INPUT_MODE_ONBOARDING_MODAL + FillBlanksMode.SELECT -> HyperskillAnalyticTarget.FILL_BLANKS_SELECT_MODE_ONBOARDING_MODAL + } + } \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizActionDispatcher.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizActionDispatcher.kt index 949e8c9506..b42a05b1ca 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizActionDispatcher.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizActionDispatcher.kt @@ -16,6 +16,7 @@ import org.hyperskill.app.step_quiz.domain.model.submissions.isWrongOrRejected import org.hyperskill.app.step_quiz.domain.validation.StepQuizReplyValidator import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.Action import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.Message +import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode import ru.nobird.app.presentation.redux.dispatcher.CoroutineActionDispatcher class StepQuizActionDispatcher( @@ -79,7 +80,7 @@ class StepQuizActionDispatcher( submissionState = it, isProblemsLimitReached = isProblemsLimitReached, problemsLimitReachedModalText = problemsLimitReachedModalText, - isParsonsOnboardingShown = onboardingInteractor.isParsonsOnboardingShown() + problemsOnboardingFlags = onboardingInteractor.getProblemsOnboardingFlags() ) }, onFailure = { @@ -193,8 +194,19 @@ class StepQuizActionDispatcher( } ) } - is Action.SaveParsonsProblemOnboardingModalShownCacheFlag -> { - onboardingInteractor.setParsonsOnboardingShown(isShown = true) + is Action.SaveProblemOnboardingModalShownCacheFlag -> { + when (action.modalType) { + StepQuizFeature.ProblemOnboardingModal.Parsons -> + onboardingInteractor.setParsonsOnboardingShown(isShown = true) + is StepQuizFeature.ProblemOnboardingModal.FillBlanks -> { + when (action.modalType.mode) { + FillBlanksMode.INPUT -> + onboardingInteractor.setFillBlanksInputModeOnboardingShown(isShown = true) + FillBlanksMode.SELECT -> + onboardingInteractor.setFillBlanksSelectModeOnboardingShown(isShown = true) + } + } + } } is Action.LogAnalyticEvent -> analyticInteractor.logEvent(action.analyticEvent) diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt index 3efa28da65..f5afcc1b25 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizFeature.kt @@ -1,6 +1,7 @@ package org.hyperskill.app.step_quiz.presentation import org.hyperskill.app.analytic.domain.model.AnalyticEvent +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags import org.hyperskill.app.step.domain.model.Step import org.hyperskill.app.step.domain.model.StepContext import org.hyperskill.app.step.domain.model.StepRoute @@ -8,6 +9,7 @@ import org.hyperskill.app.step_quiz.domain.model.attempts.Attempt import org.hyperskill.app.step_quiz.domain.model.submissions.Reply import org.hyperskill.app.step_quiz.domain.model.submissions.Submission import org.hyperskill.app.step_quiz.domain.validation.ReplyValidationResult +import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode import org.hyperskill.app.step_quiz_hints.presentation.StepQuizHintsFeature interface StepQuizFeature { @@ -39,6 +41,11 @@ interface StepQuizFeature { ) : SubmissionState } + sealed interface ProblemOnboardingModal { + object Parsons : ProblemOnboardingModal + data class FillBlanks(val mode: FillBlanksMode) : ProblemOnboardingModal + } + sealed interface Message { data class InitWithStep(val step: Step, val forceUpdate: Boolean = false) : Message data class FetchAttemptSuccess( @@ -47,7 +54,7 @@ interface StepQuizFeature { val submissionState: SubmissionState, val isProblemsLimitReached: Boolean, val problemsLimitReachedModalText: String?, - val isParsonsOnboardingShown: Boolean + val problemsOnboardingFlags: ProblemsOnboardingFlags ) : Message data class FetchAttemptError(val throwable: Throwable) : Message @@ -88,9 +95,10 @@ interface StepQuizFeature { object ProblemsLimitReachedModalGoToHomeScreenClicked : Message /** - * Parsons problem onboarding modal + * Problem onboarding modal */ - object ParsonsProblemOnboardingModalShownMessage : Message + data class ProblemOnboardingModalShownMessage(val modalType: ProblemOnboardingModal) : Message + data class ProblemOnboardingModalHiddenMessage(val modalType: ProblemOnboardingModal) : Message /** * Click on step theory topic in toolbar @@ -117,8 +125,6 @@ interface StepQuizFeature { object ProblemsLimitReachedModalShownEventMessage : Message object ProblemsLimitReachedModalHiddenEventMessage : Message - object ParsonsProblemOnboardingModalHiddenEventMessage : Message - /** * Message Wrappers */ @@ -144,7 +150,7 @@ interface StepQuizFeature { val submission: Submission ) : Action - object SaveParsonsProblemOnboardingModalShownCacheFlag : Action + data class SaveProblemOnboardingModalShownCacheFlag(val modalType: ProblemOnboardingModal) : Action /** * Analytic @@ -163,7 +169,7 @@ interface StepQuizFeature { data class ShowProblemsLimitReachedModal(val modalText: String) : ViewAction - object ShowParsonsProblemOnboardingModal : ViewAction + data class ShowProblemOnboardingModal(val modalType: ProblemOnboardingModal) : ViewAction data class StepQuizHintsViewAction( val viewAction: StepQuizHintsFeature.Action.ViewAction diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt index 80f923a40f..11426cc2f5 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt @@ -1,10 +1,12 @@ package org.hyperskill.app.step_quiz.presentation import kotlinx.datetime.Clock +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags import org.hyperskill.app.step.domain.model.BlockName +import org.hyperskill.app.step.domain.model.Step import org.hyperskill.app.step.domain.model.StepRoute -import org.hyperskill.app.step_quiz.domain.analytic.ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent -import org.hyperskill.app.step_quiz.domain.analytic.ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent +import org.hyperskill.app.step_quiz.domain.analytic.ProblemOnboardingModalHiddenHyperskillAnalyticEvent +import org.hyperskill.app.step_quiz.domain.analytic.ProblemOnboardingModalShownHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalClickedGoToHomeScreenHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalHiddenHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.ProblemsLimitReachedModalShownHyperskillAnalyticEvent @@ -18,6 +20,7 @@ import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedTheoryToolbar import org.hyperskill.app.step_quiz.domain.analytic.StepQuizCodeEditorClickedInputAccessoryButtonHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizFullScreenCodeEditorClickedCodeDetailsHyperskillAnalyticEvent import org.hyperskill.app.step_quiz.domain.analytic.StepQuizFullScreenCodeEditorClickedStepTextDetailsHyperskillAnalyticEvent +import org.hyperskill.app.step_quiz.domain.model.attempts.Attempt import org.hyperskill.app.step_quiz.domain.model.submissions.Reply import org.hyperskill.app.step_quiz.domain.model.submissions.Submission import org.hyperskill.app.step_quiz.domain.model.submissions.SubmissionStatus @@ -26,6 +29,8 @@ import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.Action import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.Message import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.State import org.hyperskill.app.step_quiz.presentation.StepQuizFeature.StepQuizState +import org.hyperskill.app.step_quiz_fill_blanks.model.FillBlanksMode +import org.hyperskill.app.step_quiz_fill_blanks.presentation.FillBlanksResolver import org.hyperskill.app.step_quiz_hints.presentation.StepQuizHintsFeature import org.hyperskill.app.step_quiz_hints.presentation.StepQuizHintsReducer import ru.nobird.app.presentation.redux.reducer.StateReducer @@ -282,19 +287,27 @@ class StepQuizReducer( ProblemsLimitReachedModalHiddenHyperskillAnalyticEvent(stepRoute.analyticRoute) ) ) - is Message.ParsonsProblemOnboardingModalShownMessage -> + is Message.ProblemOnboardingModalShownMessage -> { state to setOf( + Action.SaveProblemOnboardingModalShownCacheFlag(modalType = message.modalType), Action.LogAnalyticEvent( - ParsonsProblemOnboardingModalShownHyperskillAnalyticEvent(stepRoute.analyticRoute) - ), - Action.SaveParsonsProblemOnboardingModalShownCacheFlag + ProblemOnboardingModalShownHyperskillAnalyticEvent( + route = stepRoute.analyticRoute, + modalType = message.modalType + ) + ) ) - is Message.ParsonsProblemOnboardingModalHiddenEventMessage -> + } + is Message.ProblemOnboardingModalHiddenMessage -> { state to setOf( Action.LogAnalyticEvent( - ParsonsProblemOnboardingModalHiddenHyperskillAnalyticEvent(stepRoute.analyticRoute) + ProblemOnboardingModalHiddenHyperskillAnalyticEvent( + route = stepRoute.analyticRoute, + modalType = message.modalType + ) ) ) + } // Wrapper Messages is Message.StepQuizHintsMessage -> { val (stepQuizHintsState, stepQuizHintsActions) = @@ -314,15 +327,16 @@ class StepQuizReducer( else -> message.isProblemsLimitReached } - val actions = when { - isProblemsLimitReached && message.problemsLimitReachedModalText != null -> - setOf( - Action.ViewAction.ShowProblemsLimitReachedModal(message.problemsLimitReachedModalText) - ) - !message.isParsonsOnboardingShown && message.step.block.name == BlockName.PARSONS -> - setOf(Action.ViewAction.ShowParsonsProblemOnboardingModal) - else -> - emptySet() + val actions = if (isProblemsLimitReached && message.problemsLimitReachedModalText != null) { + setOf( + Action.ViewAction.ShowProblemsLimitReachedModal(message.problemsLimitReachedModalText) + ) + } else { + getProblemOnboardingModalActions( + step = message.step, + attempt = message.attempt, + problemsOnboardingFlags = message.problemsOnboardingFlags + ) } state.copy( @@ -414,6 +428,47 @@ class StepQuizReducer( ) } + private fun getProblemOnboardingModalActions( + step: Step, + attempt: Attempt, + problemsOnboardingFlags: ProblemsOnboardingFlags + ): Set = + when (step.block.name) { + BlockName.PARSONS -> { + if (!problemsOnboardingFlags.isParsonsOnboardingShown) { + setOf( + Action.ViewAction.ShowProblemOnboardingModal( + modalType = StepQuizFeature.ProblemOnboardingModal.Parsons + ) + ) + } else { + emptySet() + } + } + BlockName.FILL_BLANKS -> { + val fillBlanksMode = kotlin.runCatching { + val dataset = attempt.dataset ?: return@runCatching null + FillBlanksResolver.resolve(dataset) + }.getOrNull()?.takeIf { + when (it) { + FillBlanksMode.INPUT -> !problemsOnboardingFlags.isFillBlanksInputModeOnboardingShown + FillBlanksMode.SELECT -> !problemsOnboardingFlags.isFillBlanksSelectModeOnboardingShown + } + } + + if (fillBlanksMode != null) { + setOf( + Action.ViewAction.ShowProblemOnboardingModal( + modalType = StepQuizFeature.ProblemOnboardingModal.FillBlanks(FillBlanksMode.INPUT) + ) + ) + } else { + emptySet() + } + } + else -> emptySet() + } + private fun reduceStepQuizHintsMessage( state: StepQuizHintsFeature.State, message: StepQuizHintsFeature.Message From b453c2926b859ff6939e5b2026a14c5cefba1a12 Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Fri, 10 Nov 2023 18:34:56 +0400 Subject: [PATCH 2/4] Add iOS logic --- .../fragment_step_quiz_parsons_onboarding.xml | 6 +- .../project.pbxproj | 38 ++++++--- .../LottieAnimations/LottieAnimations.swift | 10 +++ ...put-problem-onboarding-animation-dark.json | 1 + ...ut-problem-onboarding-animation-light.json | 1 + ...ect-problem-onboarding-animation-dark.json | 1 + ...ct-problem-onboarding-animation-light.json | 1 + .../Sources/Models/Constants/Strings.swift | 16 ++-- .../Modules/StepQuiz/StepQuizViewModel.swift | 26 +++--- .../StepQuizProblemOnboardingModalView.swift | 79 +++++++++++++++++++ ...ProblemOnboardingModalViewController.swift | 46 +++++++++++ .../Modules/StepQuiz/Views/StepQuizView.swift | 10 +-- .../StepQuizParsonsOnboardingModalView.swift | 34 -------- ...ParsonsOnboardingModalViewController.swift | 38 --------- .../step_quiz/presentation/StepQuizReducer.kt | 2 +- .../commonMain/resources/MR/base/strings.xml | 13 ++- 16 files changed, 205 insertions(+), 117 deletions(-) create mode 100644 iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-dark.json create mode 100644 iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-light.json create mode 100644 iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-dark.json create mode 100644 iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-light.json create mode 100644 iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift create mode 100644 iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalViewController.swift delete mode 100644 iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalView.swift delete mode 100644 iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalViewController.swift diff --git a/androidHyperskillApp/src/main/res/layout/fragment_step_quiz_parsons_onboarding.xml b/androidHyperskillApp/src/main/res/layout/fragment_step_quiz_parsons_onboarding.xml index 608f2f01ac..2b29bf636b 100644 --- a/androidHyperskillApp/src/main/res/layout/fragment_step_quiz_parsons_onboarding.xml +++ b/androidHyperskillApp/src/main/res/layout/fragment_step_quiz_parsons_onboarding.xml @@ -22,7 +22,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppTheme.Headline6" - android:text="@string/step_quiz_parsons_onboarding_header" + android:text="@string/step_quiz_problem_onboarding_modal_header" android:layout_marginTop="16dp" android:layout_marginHorizontal="20dp"/> @@ -41,7 +41,7 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppTheme.Headline6" android:textSize="18sp" - android:text="@string/step_quiz_parsons_onboarding_title" + android:text="@string/step_quiz_problem_onboarding_modal_title" android:layout_marginHorizontal="20dp" android:layout_marginTop="32dp"/> @@ -51,7 +51,7 @@ android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textColor="@color/color_on_surface_alpha_60" - android:text="@string/step_quiz_parsons_onboarding_description" + android:text="@string/step_quiz_problem_onboarding_modal_parsons_description" android:layout_marginHorizontal="20dp" android:layout_marginTop="12dp"/> diff --git a/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj b/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj index 7b3446f493..210171b847 100644 --- a/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj +++ b/iosHyperskillApp/iosHyperskillApp.xcodeproj/project.pbxproj @@ -349,8 +349,8 @@ 2CAA3C672AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-light.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CAA3C652AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-light.json */; }; 2CAA3C682AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CAA3C662AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-dark.json */; }; 2CAA3C6A2AA9C7B6004F6CE6 /* LottieAnimations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA3C692AA9C7B6004F6CE6 /* LottieAnimations.swift */; }; - 2CAA3C6D2AA9CA9D004F6CE6 /* StepQuizParsonsOnboardingModalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizParsonsOnboardingModalViewController.swift */; }; - 2CAA3C6F2AA9CAB1004F6CE6 /* StepQuizParsonsOnboardingModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizParsonsOnboardingModalView.swift */; }; + 2CAA3C6D2AA9CA9D004F6CE6 /* StepQuizProblemOnboardingModalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizProblemOnboardingModalViewController.swift */; }; + 2CAA3C6F2AA9CAB1004F6CE6 /* StepQuizProblemOnboardingModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizProblemOnboardingModalView.swift */; }; 2CAE8CF0280525BE00E6C83D /* StepViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAE8CEF280525BE00E6C83D /* StepViewModel.swift */; }; 2CAE8CF2280525C900E6C83D /* StepView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAE8CF1280525C900E6C83D /* StepView.swift */; }; 2CAE8CF4280525D400E6C83D /* StepAssembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAE8CF3280525D400E6C83D /* StepAssembly.swift */; }; @@ -444,6 +444,10 @@ 2CEEE03528916A6800282849 /* ProblemOfDayOutputProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CEEE03428916A6800282849 /* ProblemOfDayOutputProtocol.swift */; }; 2CEEE03728917F1100282849 /* TimeIntervalExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CEEE03628917F1100282849 /* TimeIntervalExtensions.swift */; }; 2CF0B4E629F9CEAF009C2A2D /* StudyPlanSectionActivitiesList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CF0B4E529F9CEAF009C2A2D /* StudyPlanSectionActivitiesList.swift */; }; + 2CF270862AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CF270842AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-dark.json */; }; + 2CF270872AFE689500D696EC /* fill-blanks-input-problem-onboarding-animation-light.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CF270852AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-light.json */; }; + 2CF2708A2AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CF270882AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-dark.json */; }; + 2CF2708B2AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-light.json in Resources */ = {isa = PBXBuildFile; fileRef = 2CF270892AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-light.json */; }; 2CF2DA3A27EC5B2D0055426D /* Assembly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CF2DA3927EC5B2D0055426D /* Assembly.swift */; }; 2CF41A8E28505D2C000736D6 /* SwiftUIProcessedContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CF41A8D28505D2C000736D6 /* SwiftUIProcessedContentView.swift */; }; 2CF4341228126C79002893CD /* View+EndEditing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CF4341128126C79002893CD /* View+EndEditing.swift */; }; @@ -987,8 +991,8 @@ 2CAA3C652AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-light.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "parsons-problem-onboarding-animation-light.json"; sourceTree = ""; }; 2CAA3C662AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "parsons-problem-onboarding-animation-dark.json"; sourceTree = ""; }; 2CAA3C692AA9C7B6004F6CE6 /* LottieAnimations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LottieAnimations.swift; sourceTree = ""; }; - 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizParsonsOnboardingModalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepQuizParsonsOnboardingModalViewController.swift; sourceTree = ""; }; - 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizParsonsOnboardingModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepQuizParsonsOnboardingModalView.swift; sourceTree = ""; }; + 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizProblemOnboardingModalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepQuizProblemOnboardingModalViewController.swift; sourceTree = ""; }; + 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizProblemOnboardingModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepQuizProblemOnboardingModalView.swift; sourceTree = ""; }; 2CAE8CEF280525BE00E6C83D /* StepViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepViewModel.swift; sourceTree = ""; }; 2CAE8CF1280525C900E6C83D /* StepView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepView.swift; sourceTree = ""; }; 2CAE8CF3280525D400E6C83D /* StepAssembly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepAssembly.swift; sourceTree = ""; }; @@ -1083,6 +1087,10 @@ 2CEEE03428916A6800282849 /* ProblemOfDayOutputProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemOfDayOutputProtocol.swift; sourceTree = ""; }; 2CEEE03628917F1100282849 /* TimeIntervalExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeIntervalExtensions.swift; sourceTree = ""; }; 2CF0B4E529F9CEAF009C2A2D /* StudyPlanSectionActivitiesList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyPlanSectionActivitiesList.swift; sourceTree = ""; }; + 2CF270842AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "fill-blanks-input-problem-onboarding-animation-dark.json"; sourceTree = ""; }; + 2CF270852AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-light.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "fill-blanks-input-problem-onboarding-animation-light.json"; sourceTree = ""; }; + 2CF270882AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "fill-blanks-select-problem-onboarding-animation-dark.json"; sourceTree = ""; }; + 2CF270892AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-light.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "fill-blanks-select-problem-onboarding-animation-light.json"; sourceTree = ""; }; 2CF2DA3927EC5B2D0055426D /* Assembly.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assembly.swift; sourceTree = ""; }; 2CF41A8D28505D2C000736D6 /* SwiftUIProcessedContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIProcessedContentView.swift; sourceTree = ""; }; 2CF4341128126C79002893CD /* View+EndEditing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+EndEditing.swift"; sourceTree = ""; }; @@ -2789,6 +2797,10 @@ 2CAA3C642AA9C40C004F6CE6 /* LottieAnimations */ = { isa = PBXGroup; children = ( + 2CF270842AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-dark.json */, + 2CF270852AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-light.json */, + 2CF270882AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-dark.json */, + 2CF270892AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-light.json */, 2CAA3C662AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-dark.json */, 2CAA3C652AA9C4EB004F6CE6 /* parsons-problem-onboarding-animation-light.json */, 2CAA3C692AA9C7B6004F6CE6 /* LottieAnimations.swift */, @@ -2796,13 +2808,13 @@ path = LottieAnimations; sourceTree = ""; }; - 2CAA3C6B2AA9CA6F004F6CE6 /* OnboardingModal */ = { + 2CAA3C6B2AA9CA6F004F6CE6 /* ProblemOnboarding */ = { isa = PBXGroup; children = ( - 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizParsonsOnboardingModalView.swift */, - 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizParsonsOnboardingModalViewController.swift */, + 2CAA3C6E2AA9CAB1004F6CE6 /* StepQuizProblemOnboardingModalView.swift */, + 2CAA3C6C2AA9CA9D004F6CE6 /* StepQuizProblemOnboardingModalViewController.swift */, ); - path = OnboardingModal; + path = ProblemOnboarding; sourceTree = ""; }; 2CAE8CEE280525A100E6C83D /* Step */ = { @@ -3498,7 +3510,6 @@ E96D493A2A9CCF3600BD78FE /* StepQuizParsonsItemView.swift */, E94BB0432A9DEEFC00736B7C /* StepQuizParsonsSkeletonView.swift */, E94BB0472A9DF9DD00736B7C /* StepQuizParsonsView.swift */, - 2CAA3C6B2AA9CA6F004F6CE6 /* OnboardingModal */, ); path = Views; sourceTree = ""; @@ -3650,6 +3661,7 @@ children = ( E9ACD3402937342F0005E05B /* ProblemOfDaySolvedModalViewController.swift */, E9B55A5C29C978E40066900E /* ProblemsLimitReachedModalViewController.swift */, + 2CAA3C6B2AA9CA6F004F6CE6 /* ProblemOnboarding */, 2C8DD40A2AFB7E3100FD5359 /* ShareStreak */, ); path = Modals; @@ -3985,8 +3997,10 @@ 2C98C7A62850B93100857783 /* alt.css in Resources */, E9954647288EC11000013FA6 /* LaunchScreen.storyboard in Resources */, 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, + 2CF2708A2AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-dark.json in Resources */, 2C20FBBC284F647C006D879E /* wysiwyg.css in Resources */, 2C98C7AD2850B93100857783 /* icons.css in Resources */, + 2CF270862AFE689400D696EC /* fill-blanks-input-problem-onboarding-animation-dark.json in Resources */, 2C98C7A72850B93100857783 /* fonts.css in Resources */, 2C20FBB2284F4FEA006D879E /* highlight.js in Resources */, 2C20B28C286C4426000F458A /* code-language-samples.plist in Resources */, @@ -4002,6 +4016,8 @@ 2C2FD62028191FFE004E7AF6 /* Sentry-Info.plist in Resources */, 2C20FBB8284F630C006D879E /* MathJax.js in Resources */, 2C0DB91E2864617E001EA35E /* code-completion-keywords.plist in Resources */, + 2CF2708B2AFE690900D696EC /* fill-blanks-select-problem-onboarding-animation-light.json in Resources */, + 2CF270872AFE689500D696EC /* fill-blanks-input-problem-onboarding-animation-light.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4290,7 +4306,7 @@ 2C27C77E28773042006A641A /* NukeManager.swift in Sources */, 2C0DB91028645332001EA35E /* CodeEditorTheme.swift in Sources */, 2CBD1919291D399500F5FB0B /* UIKitBounceButton.swift in Sources */, - 2CAA3C6D2AA9CA9D004F6CE6 /* StepQuizParsonsOnboardingModalViewController.swift in Sources */, + 2CAA3C6D2AA9CA9D004F6CE6 /* StepQuizProblemOnboardingModalViewController.swift in Sources */, E9523BF029DA933C0013A661 /* StudyPlanViewModel.swift in Sources */, 2CCF3B5828004FC40075D12C /* UserAgentBuilder.swift in Sources */, 2C963BC52812D1A70036DD53 /* HomeView.swift in Sources */, @@ -4521,7 +4537,7 @@ E99B21832887E996006A6154 /* StepQuizChoiceSkeletonView.swift in Sources */, 2C9EB95D2861BABC007DDE44 /* ProfileView.swift in Sources */, 2CF41A8E28505D2C000736D6 /* SwiftUIProcessedContentView.swift in Sources */, - 2CAA3C6F2AA9CAB1004F6CE6 /* StepQuizParsonsOnboardingModalView.swift in Sources */, + 2CAA3C6F2AA9CAB1004F6CE6 /* StepQuizProblemOnboardingModalView.swift in Sources */, 2CF72AA32847757300E1C192 /* StepQuizTableViewData.swift in Sources */, E93B3745283E527000968DF0 /* PlaceholderView.swift in Sources */, 2C93AF2129B34C5A004639E0 /* StepQuizPyCharmViewDataMapper.swift in Sources */, diff --git a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/LottieAnimations.swift b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/LottieAnimations.swift index 2ff463558d..01fe84457d 100644 --- a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/LottieAnimations.swift +++ b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/LottieAnimations.swift @@ -5,4 +5,14 @@ enum LottieAnimations { light: "parsons-problem-onboarding-animation-light", dark: "parsons-problem-onboarding-animation-dark" ) + + static let fillBlanksInputProblemOnboarding = LottieAnimationFileName( + light: "fill-blanks-input-problem-onboarding-animation-light", + dark: "fill-blanks-input-problem-onboarding-animation-dark" + ) + + static let fillBlanksSelectProblemOnboarding = LottieAnimationFileName( + light: "fill-blanks-select-problem-onboarding-animation-light", + dark: "fill-blanks-select-problem-onboarding-animation-dark" + ) } diff --git a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-dark.json b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-dark.json new file mode 100644 index 0000000000..111fc7c119 --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-dark.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":360.000014663101,"w":320,"h":110,"nm":"input dark","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"tap Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":40.0000016292334,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.938,19.54,0],"ix":2},"a":{"a":0,"k":[16,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.821,0.821,0.821],"y":[1,1,1]},"o":{"x":[0.16,0.16,0.16],"y":[0,0,0]},"t":20,"s":[120,120,100]},{"t":40.0000016292334,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.837,0],[0,0],[0,-8.837],[8.837,0],[0,8.837]],"o":[[0,0],[8.837,0],[0,8.837],[-8.837,0],[0,-8.837]],"v":[[0,-16],[0,-16],[16,0],[0,16],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38431372549,0.38431372549,0.38431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40.0000016292334,"st":-23.0000009368092,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"caret Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[100]},{"t":14.0000005702317,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.435,15.04,0],"ix":2},"a":{"a":0,"k":[0.75,9.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.5,9],[0.5,9],[0.5,-9],[-0.5,-9]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.75,9.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.0000005702317,"st":-70.0000028511585,"bm":0}]}],"fonts":{"list":[{"fName":"SFMono-Regular","fFamily":"SF Mono","fStyle":"Regular","ascent":73.779296875}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119.825,39.135,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":35.0000014255792,"op":75.0000030548126,"st":35.0000014255792,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"caret dark","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":137,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":187,"s":[0]},{"t":188.000007657397,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[106.751,39.843,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187,"s":[106.751,39.843,0],"to":[0,0,0],"ti":[0,0,0]},{"t":188.000007657397,"s":[146,39.843,0]}],"ix":2},"a":{"a":0,"k":[4,16,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[0]},{"t":105.000004276738,"s":[0.467]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"w":8,"h":32,"ip":69.0000028104276,"op":271.000011038056,"st":69.0000028104276,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"code","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[107.91,43.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"SFMono-Regular","t":"code","j":0,"tr":0,"lh":18,"ls":0,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"a":0,"k":0,"ix":7},"ne":{"a":0,"k":0,"ix":8},"a":{"a":0,"k":100,"ix":4},"b":1,"rn":0,"sh":1,"s":{"a":1,"k":[{"i":{"x":[0.645],"y":[0.997]},"o":{"x":[0.437],"y":[-0.005]},"t":119,"s":[0]},{"t":196.000007983244,"s":[100]}],"ix":1},"r":1},"a":{"o":{"a":0,"k":0,"ix":9}}}]},"ip":119.000004846969,"op":333.000013563368,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"gap Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[96.575,39.135,0],"ix":2},"a":{"a":0,"k":[1.119,16.5,0],"ix":1},"s":{"a":0,"k":[89.589,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[18.571,-15.5],[26.071,-8],[26.071,8],[18.571,15.5],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":192,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[31.685,-15.49],[39.185,-7.99],[39.185,8.01],[31.685,15.51],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[31.685,-15.49],[39.185,-7.99],[39.185,8.01],[31.685,15.51],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"t":345.000014052138,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[18.711,-15.469],[26.211,-7.969],[26.211,8.031],[18.711,15.531],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0.384313732386,0.384313732386,0.384313732386,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0.364705890417,0.447058826685,0.913725495338,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":316,"s":[0.364705890417,0.447058826685,0.913725495338,1]},{"t":330.000013441176,"s":[0.384313732386,0.384313732386,0.384313732386,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[27.071,16.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"line1-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[165.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":192,"s":[177.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[177.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"t":345.000014052138,"s":[165.5,39.04,0]}],"ix":2},"a":{"a":0,"k":[12.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-8.5,-7],[8.5,-7],[12.5,-3],[12.5,3],[8.5,7],[-8.5,7],[-12.5,3],[-12.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"line1-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[231.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":192,"s":[244.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[244.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"t":345.000014052138,"s":[232,39.04,0]}],"ix":2},"a":{"a":0,"k":[55.25,7.25,0],"ix":1},"s":{"a":0,"k":[79,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-51,-7],[51,-7],[55,-3],[55,3],[51,7],[-51,7],[-55,3],[-55,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line1-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.935,39.04,0],"ix":2},"a":{"a":0,"k":[34.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-30.5,-7],[30.5,-7],[34.5,-3],[34.5,3],[30.5,7],[-30.5,7],[-34.5,3],[-34.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line2-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[189.935,78.04,0],"ix":2},"a":{"a":0,"k":[48.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-44.5,-7],[44.5,-7],[48.5,-3],[48.5,3],[44.5,7],[-44.5,7],[-48.5,3],[-48.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"line2-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.435,78.04,0],"ix":2},"a":{"a":0,"k":[43.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-39,-7],[39,-7],[43,-3],[43,3],[39,7],[-39,7],[-43,3],[-43,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"line2-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.935,78.04,0],"ix":2},"a":{"a":0,"k":[8.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-4.5,-7],[4.5,-7],[8.5,-3],[8.5,3],[4.5,7],[-4.5,7],[-8.5,3],[-8.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"back Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,55,0],"ix":2},"a":{"a":0,"k":[160.25,55.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0],[0,-4.418]],"v":[[-152,-55],[152,-55],[160,-47],[160,47],[152,55],[-152,55],[-160,47],[-160,-47]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647058824,0.117647058824,0.117647058824,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,55.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"c","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[11.719,0],[0,-15.186],[0,0],[-14.404,0],[-1.318,10.791],[0,0],[6.836,0],[0,11.377],[0,0],[-9.229,0],[-1.025,-6.201]],"o":[[-1.367,-10.889],[-14.404,0],[0,0],[0,15.186],[11.719,0],[0,0],[-1.025,6.055],[-9.229,0],[0,0],[0,-11.377],[6.836,0],[0,0]],"v":[[52.979,-36.475],[31.885,-54.004],[9.082,-29.98],[9.082,-23.047],[31.885,0.977],[52.979,-16.406],[44.775,-16.406],[31.738,-6.494],[17.383,-24.121],[17.383,-28.906],[31.738,-46.582],[44.775,-36.475]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"o","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.014,0],[0,14.307],[0,0],[14.014,0],[0,-14.307],[0,0]],"o":[[14.014,0],[0,0],[0,-14.307],[-14.014,0],[0,0],[0,14.307]],"v":[[30.908,0.977],[53.857,-22.461],[53.857,-30.469],[30.908,-53.906],[7.959,-30.469],[7.959,-22.461]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-9.082,0],[0,-10.4],[0,0],[9.082,0],[0,10.449],[0,0]],"o":[[9.082,0],[0,0],[0,10.449],[-9.082,0],[0,0],[0,-10.4]],"v":[[30.908,-46.582],[45.654,-29.736],[45.654,-23.242],[30.908,-6.396],[16.162,-23.242],[16.162,-29.736]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"d","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.256,0],[-2.734,5.859],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.666,0],[0,-13.574],[0,0]],"o":[[7.568,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.295,-5.811],[-12.256,0],[0,0],[0,13.623]],"v":[[27.588,0.879],[43.457,-8.105],[44.385,-8.105],[44.385,0],[52.539,0],[52.539,-73.779],[44.092,-73.779],[44.092,-44.775],[43.213,-44.775],[27.588,-53.857],[7.324,-31.445],[7.324,-21.582]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[8.691,0],[0,9.766],[0,0],[-8.74,0],[0,-9.766],[0,0]],"o":[[-8.74,0],[0,0],[0,-9.766],[8.691,0],[0,0],[0,9.814]],"v":[[30.029,-6.689],[15.674,-22.754],[15.674,-30.371],[30.029,-46.387],[44.336,-30.371],[44.336,-22.754]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"e","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.689,0],[0,9.717],[0,0],[0,0],[0,0],[13.77,0],[0,-13.965],[0,0],[-14.551,0],[-1.611,8.74]],"o":[[-1.465,4.639],[-9.033,0],[0,0],[0,0],[0,0],[0,-15.332],[-13.477,0],[0,0],[0,15.088],[11.133,0],[0,0]],"v":[[45.215,-13.672],[32.129,-6.201],[17.334,-22.168],[17.334,-24.316],[53.418,-24.316],[53.418,-29.492],[31.543,-53.955],[9.131,-30.811],[9.131,-22.852],[32.129,0.977],[53.271,-13.672]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-8.838,0],[0,-10.107],[0,0]],"o":[[8.545,0],[0,0],[0,-10.156]],"v":[[31.494,-46.826],[45.215,-30.615],[17.334,-30.615]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"}]} \ No newline at end of file diff --git a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-light.json b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-light.json new file mode 100644 index 0000000000..4f1a6369f3 --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-input-problem-onboarding-animation-light.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":360.000014663101,"w":320,"h":110,"nm":"input light","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"tap Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":40.0000016292334,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.938,19.54,0],"ix":2},"a":{"a":0,"k":[16,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.821,0.821,0.821],"y":[1,1,1]},"o":{"x":[0.16,0.16,0.16],"y":[0,0,0]},"t":20,"s":[120,120,100]},{"t":40.0000016292334,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.837,0],[0,0],[0,-8.837],[8.837,0],[0,8.837]],"o":[[0,0],[8.837,0],[0,8.837],[-8.837,0],[0,-8.837]],"v":[[0,-16],[0,-16],[16,0],[0,16],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38431372549,0.38431372549,0.38431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40.0000016292334,"st":-23.0000009368092,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"caret Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[100]},{"t":14.0000005702317,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.435,15.04,0],"ix":2},"a":{"a":0,"k":[0.75,9.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-0.5,9],[0.5,9],[0.5,-9],[-0.5,-9]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.75,9.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":14.0000005702317,"st":-70.0000028511585,"bm":0}]}],"fonts":{"list":[{"fName":"SFMono-Regular","fFamily":"SF Mono","fStyle":"Regular","ascent":73.779296875}]},"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,55,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119.825,39.135,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":35.0000014255792,"op":75.0000030548126,"st":35.0000014255792,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"caret light","refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":137,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":187,"s":[0]},{"t":188.000007657397,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":73,"s":[106.751,39.843,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":187,"s":[106.751,39.843,0],"to":[0,0,0],"ti":[0,0,0]},{"t":188.000007657397,"s":[146,39.843,0]}],"ix":2},"a":{"a":0,"k":[4,16,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69,"s":[0]},{"t":105.000004276738,"s":[0.467]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"w":8,"h":32,"ip":69.0000028104276,"op":271.000011038056,"st":69.0000028104276,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"code","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[107.91,43.75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"SFMono-Regular","t":"code","j":0,"tr":0,"lh":18,"ls":0,"fc":[0,0,0]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"a":0,"k":0,"ix":7},"ne":{"a":0,"k":0,"ix":8},"a":{"a":0,"k":100,"ix":4},"b":1,"rn":0,"sh":1,"s":{"a":1,"k":[{"i":{"x":[0.645],"y":[0.997]},"o":{"x":[0.437],"y":[-0.005]},"t":119,"s":[0]},{"t":196.000007983244,"s":[100]}],"ix":1},"r":1},"a":{"o":{"a":0,"k":0,"ix":9}}}]},"ip":119.000004846969,"op":333.000013563368,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"gap Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[96.575,39.135,0],"ix":2},"a":{"a":0,"k":[1.119,16.5,0],"ix":1},"s":{"a":0,"k":[89.6,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[18.571,-15.5],[26.071,-8],[26.071,8],[18.571,15.5],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":192,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[31.685,-15.49],[39.185,-7.99],[39.185,8.01],[31.685,15.51],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[31.685,-15.49],[39.185,-7.99],[39.185,8.01],[31.685,15.51],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]},{"t":345.000014052138,"s":[{"i":[[-4.142,0],[0,0],[0,-4.142],[0,0],[4.142,0],[0,0],[0,4.142],[0,0]],"o":[[0,0],[4.142,0],[0,0],[0,4.142],[0,0],[-4.142,0],[0,0],[0,-4.142]],"v":[[-18.571,-15.5],[18.711,-15.469],[26.211,-7.969],[26.211,8.031],[18.711,15.531],[-18.571,15.5],[-26.071,8],[-26.071,-8]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0.384313732386,0.384313732386,0.384313732386,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0.364705890417,0.447058826685,0.913725495338,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":316,"s":[0.364705890417,0.447058826685,0.913725495338,1]},{"t":330.000013441176,"s":[0.384313732386,0.384313732386,0.384313732386,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[27.071,16.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"line1-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[165.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":192,"s":[177.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[177.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"t":345.000014052138,"s":[165.5,39.04,0]}],"ix":2},"a":{"a":0,"k":[12.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-8.5,-7],[8.5,-7],[12.5,-3],[12.5,3],[8.5,7],[-8.5,7],[-12.5,3],[-12.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line1-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":173,"s":[231.986,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":192,"s":[244.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":330,"s":[244.486,39.04,0],"to":[0,0,0],"ti":[0,0,0]},{"t":345.000014052138,"s":[232,39.04,0]}],"ix":2},"a":{"a":0,"k":[55.25,7.25,0],"ix":1},"s":{"a":0,"k":[79,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-51,-7],[51,-7],[55,-3],[55,3],[51,7],[-51,7],[-55,3],[-55,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line1-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.935,39.04,0],"ix":2},"a":{"a":0,"k":[34.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-30.5,-7],[30.5,-7],[34.5,-3],[34.5,3],[30.5,7],[-30.5,7],[-34.5,3],[-34.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"line2-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[189.935,78.04,0],"ix":2},"a":{"a":0,"k":[48.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-44.5,-7],[44.5,-7],[48.5,-3],[48.5,3],[44.5,7],[-44.5,7],[-48.5,3],[-48.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"line2-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[88.435,78.04,0],"ix":2},"a":{"a":0,"k":[43.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-39,-7],[39,-7],[43,-3],[43,3],[39,7],[-39,7],[-43,3],[-43,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"line2-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.935,78.04,0],"ix":2},"a":{"a":0,"k":[8.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.209,0],[0,0],[0,-2.209],[0,0],[2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[2.209,0],[0,0],[0,2.209],[0,0],[-2.209,0],[0,0],[0,-2.209]],"v":[[-4.5,-7],[4.5,-7],[8.5,-3],[8.5,3],[4.5,7],[-4.5,7],[-8.5,3],[-8.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"back Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,55,0],"ix":2},"a":{"a":0,"k":[160.25,55.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.418,0],[0,0],[0,-4.418],[0,0],[4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[4.418,0],[0,0],[0,4.418],[0,0],[-4.418,0],[0,0],[0,-4.418]],"v":[[-152,-55],[152,-55],[160,-47],[160,47],[152,55],[-152,55],[-160,47],[-160,-47]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784373564,0.960784373564,0.960784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,55.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360.000014663101,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"c","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[11.719,0],[0,-15.186],[0,0],[-14.404,0],[-1.318,10.791],[0,0],[6.836,0],[0,11.377],[0,0],[-9.229,0],[-1.025,-6.201]],"o":[[-1.367,-10.889],[-14.404,0],[0,0],[0,15.186],[11.719,0],[0,0],[-1.025,6.055],[-9.229,0],[0,0],[0,-11.377],[6.836,0],[0,0]],"v":[[52.979,-36.475],[31.885,-54.004],[9.082,-29.98],[9.082,-23.047],[31.885,0.977],[52.979,-16.406],[44.775,-16.406],[31.738,-6.494],[17.383,-24.121],[17.383,-28.906],[31.738,-46.582],[44.775,-36.475]],"c":true},"ix":2},"nm":"c","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"c","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"o","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-14.014,0],[0,14.307],[0,0],[14.014,0],[0,-14.307],[0,0]],"o":[[14.014,0],[0,0],[0,-14.307],[-14.014,0],[0,0],[0,14.307]],"v":[[30.908,0.977],[53.857,-22.461],[53.857,-30.469],[30.908,-53.906],[7.959,-30.469],[7.959,-22.461]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-9.082,0],[0,-10.4],[0,0],[9.082,0],[0,10.449],[0,0]],"o":[[9.082,0],[0,0],[0,10.449],[-9.082,0],[0,0],[0,-10.4]],"v":[[30.908,-46.582],[45.654,-29.736],[45.654,-23.242],[30.908,-6.396],[16.162,-23.242],[16.162,-29.736]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"d","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.256,0],[-2.734,5.859],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.666,0],[0,-13.574],[0,0]],"o":[[7.568,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.295,-5.811],[-12.256,0],[0,0],[0,13.623]],"v":[[27.588,0.879],[43.457,-8.105],[44.385,-8.105],[44.385,0],[52.539,0],[52.539,-73.779],[44.092,-73.779],[44.092,-44.775],[43.213,-44.775],[27.588,-53.857],[7.324,-31.445],[7.324,-21.582]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[8.691,0],[0,9.766],[0,0],[-8.74,0],[0,-9.766],[0,0]],"o":[[-8.74,0],[0,0],[0,-9.766],[8.691,0],[0,0],[0,9.814]],"v":[[30.029,-6.689],[15.674,-22.754],[15.674,-30.371],[30.029,-46.387],[44.336,-30.371],[44.336,-22.754]],"c":true},"ix":2},"nm":"d","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"d","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"},{"ch":"e","size":15,"style":"Regular","w":61.82,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.689,0],[0,9.717],[0,0],[0,0],[0,0],[13.77,0],[0,-13.965],[0,0],[-14.551,0],[-1.611,8.74]],"o":[[-1.465,4.639],[-9.033,0],[0,0],[0,0],[0,0],[0,-15.332],[-13.477,0],[0,0],[0,15.088],[11.133,0],[0,0]],"v":[[45.215,-13.672],[32.129,-6.201],[17.334,-22.168],[17.334,-24.316],[53.418,-24.316],[53.418,-29.492],[31.543,-53.955],[9.131,-30.811],[9.131,-22.852],[32.129,0.977],[53.271,-13.672]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-8.838,0],[0,-10.107],[0,0]],"o":[[8.545,0],[0,0],[0,-10.156]],"v":[[31.494,-46.826],[45.215,-30.615],[17.334,-30.615]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"SF Mono"}]} \ No newline at end of file diff --git a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-dark.json b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-dark.json new file mode 100644 index 0000000000..82ddbeac88 --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-dark.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":225.000009164438,"w":320,"h":198,"nm":"select dark","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"tap Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":40.0000016292334,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.938,19.54,0],"ix":2},"a":{"a":0,"k":[16,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.821,0.821,0.821],"y":[1,1,1]},"o":{"x":[0.16,0.16,0.16],"y":[0,0,0]},"t":20,"s":[120,120,100]},{"t":40.0000016292334,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.837,0],[0,0],[0,-8.837],[8.837,0],[0,8.837]],"o":[[0,0],[8.837,0],[0,8.837],[-8.837,0],[0,-8.837]],"v":[[0,-16],[0,-16],[16,0],[0,16],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38431372549,0.38431372549,0.38431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40.0000016292334,"st":-23.0000009368092,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[125.5,41,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":123.000005009893,"op":163.000006639126,"st":123.000005009893,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.5,158.5,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":0,"op":40.0000016292334,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line1-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[245,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":68,"s":[258.25,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[258.25,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":180.00000733155,"s":[245.125,40.5,0]}],"ix":2},"a":{"a":0,"k":[38.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[34,-7],[-34,-7],[-38,-3],[-38,3],[-34,7],[34,7],[38,3],[38,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"line1-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[175.5,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":68,"s":[188.75,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[188.75,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":180.00000733155,"s":[175.625,40.5,0]}],"ix":2},"a":{"a":0,"k":[21.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[17.5,-7],[-17.5,-7],[-21.5,-3],[-21.5,3],[-17.5,7],[17.5,7],[21.5,3],[21.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"gap-filled Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[100]},{"t":194.000007901782,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119,40.5,0],"ix":2},"a":{"a":0,"k":[16.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[25.5,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[25.5,7],[29.5,3],[29.5,-3]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":163,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[25.5,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[25.5,7],[29.5,3],[29.5,-3]],"c":true}]},{"t":180.00000733155,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"gap Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[93.875,40.5,0],"ix":2},"a":{"a":0,"k":[2.375,19,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[17,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[17,16.5],[25,8.5],[25,-8.5]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[30,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[30,16.5],[38,8.5],[38,-8.5]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":163,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[30,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[30,16.5],[38,8.5],[38,-8.5]],"c":true}]},{"t":180.00000733155,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[17,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[17,16.5],[25,8.5],[25,-8.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0.364705890417,0.447058856487,0.913725554943,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"t":194.000007901782,"s":[0.364705890417,0.447058826685,0.913725495338,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0.156862745098,0.156862745098,0.156862745098,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0.156862750649,0.156862750649,0.156862750649,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.117647059262,0.117647059262,0.117647059262,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[0.117647059262,0.117647059262,0.117647059262,1]},{"t":194.000007901782,"s":[0.156862750649,0.156862750649,0.156862750649,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.408,19],"ix":2},"a":{"a":0,"k":[-25.092,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line1-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,40.5,0],"ix":2},"a":{"a":0,"k":[34.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[30,-7],[-30,-7],[-34,-3],[-34,3],[-30,7],[30,7],[34,3],[34,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[127.5,79,0],"ix":2},"a":{"a":0,"k":[111.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[46,-7],[-46,-7],[-50,-3],[-50,3],[-46,7],[46,7],[50,3],[50,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[39,-7],[-39,-7],[-43,-3],[-43,3],[-39,7],[39,7],[43,3],[43,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[4.5,-7],[-4.5,-7],[-8.5,-3],[-8.5,3],[-4.5,7],[4.5,7],[8.5,3],[8.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"back1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,55,0],"ix":2},"a":{"a":0,"k":[160.25,55.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[152,-55],[-152,-55],[-160,-47],[-160,47],[-152,55],[152,55],[160,47],[160,-47]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647058824,0.117647058824,0.117647058824,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,55.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"variant-filled Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":163,"s":[0]},{"t":183.000007453743,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48,158.5,0],"ix":2},"a":{"a":0,"k":[21.148,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[16.898,-7],[-16.898,-7],[-20.898,-3],[-20.898,3],[-16.898,7],[16.898,7],[20.898,3],[20.898,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.148,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"variant1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.125,104.625,0],"ix":2},"a":{"a":0,"k":[60.125,71.375,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[24,-16.5],[-24,-16.5],[-32,-8.5],[-32,8.5],[-24,16.5],[24,16.5],[32,8.5],[32,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.627451002598,0.627451002598,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0.117647059262,0.117647059262,0.117647059262,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.156862750649,0.156862750649,0.156862750649,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":163,"s":[0.156862750649,0.156862750649,0.156862750649,1]},{"t":183.000007453743,"s":[0.117647059262,0.117647059262,0.117647059262,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33,125.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"variant2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[121.5,158.5,0],"ix":2},"a":{"a":0,"k":[25.5,17.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.266666666667,0.266666666667,0.266666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.5,17.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[16.5,-16.5],[-16.5,-16.5],[-24.5,-8.5],[-24.5,8.5],[-16.5,16.5],[16.5,16.5],[24.5,8.5],[24.5,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.627451002598,0.627451002598,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[25.5,17.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"back2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,158,0],"ix":2},"a":{"a":0,"k":[160.25,40.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[152,-40],[-152,-40],[-160,-32],[-160,32],[-152,40],[152,40],[160,32],[160,-32]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117647058824,0.117647058824,0.117647058824,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,40.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-light.json b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-light.json new file mode 100644 index 0000000000..0a7485cd84 --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/LottieAnimations/fill-blanks-select-problem-onboarding-animation-light.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 3.5.1","a":"","k":"","d":"","tc":""},"fr":29.9700012207031,"ip":0,"op":225.000009164438,"w":320,"h":198,"nm":"select light","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"tap Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"t":40.0000016292334,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[19.938,19.54,0],"ix":2},"a":{"a":0,"k":[16,16,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[1,1,0.333],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.821,0.821,0.821],"y":[1,1,1]},"o":{"x":[0.16,0.16,0.16],"y":[0,0,0]},"t":20,"s":[120,120,100]},{"t":40.0000016292334,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.837,0],[0,0],[0,-8.837],[8.837,0],[0,8.837]],"o":[[0,0],[8.837,0],[0,8.837],[-8.837,0],[0,-8.837]],"v":[[0,-16],[0,-16],[16,0],[0,16],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":4,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.38431372549,0.38431372549,0.38431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16,16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40.0000016292334,"st":-23.0000009368092,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[125.5,41,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":123.000005009893,"op":163.000006639126,"st":123.000005009893,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"tap light","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48.5,158.5,0],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":40,"h":40,"ip":0,"op":40.0000016292334,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line1-3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[245,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":68,"s":[258.25,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[258.25,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":180.00000733155,"s":[245.125,40.5,0]}],"ix":2},"a":{"a":0,"k":[38.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[34,-7],[-34,-7],[-38,-3],[-38,3],[-34,7],[34,7],[38,3],[38,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"line1-2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[175.5,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":68,"s":[188.75,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":163,"s":[188.75,40.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":180.00000733155,"s":[175.625,40.5,0]}],"ix":2},"a":{"a":0,"k":[21.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[17.5,-7],[-17.5,-7],[-21.5,-3],[-21.5,3],[-17.5,7],[17.5,7],[21.5,3],[21.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"gap-filled Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[100]},{"t":194.000007901782,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[119,40.5,0],"ix":2},"a":{"a":0,"k":[16.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[25.5,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[25.5,7],[29.5,3],[29.5,-3]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":163,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[25.5,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[25.5,7],[29.5,3],[29.5,-3]],"c":true}]},{"t":180.00000733155,"s":[{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"gap Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[93.875,40.5,0],"ix":2},"a":{"a":0,"k":[2.375,19,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[17,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[17,16.5],[25,8.5],[25,-8.5]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":69,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[30,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[30,16.5],[38,8.5],[38,-8.5]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":163,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[30,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[30,16.5],[38,8.5],[38,-8.5]],"c":true}]},{"t":180.00000733155,"s":[{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[17,-16.5],[-17,-16.5],[-25,-8.5],[-25,8.5],[-17,16.5],[17,16.5],[25,8.5],[25,-8.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0.364705890417,0.447058856487,0.913725554943,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"t":194.000007901782,"s":[0.364705890417,0.447058826685,0.913725495338,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.960784316063,0.960784316063,0.960784316063,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":172,"s":[0.960784316063,0.960784316063,0.960784316063,1]},{"t":194.000007901782,"s":[0.627451002598,0.627451002598,0.627451002598,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.408,19],"ix":2},"a":{"a":0,"k":[-25.092,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line1-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,40.5,0],"ix":2},"a":{"a":0,"k":[34.25,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[30,-7],[-30,-7],[-34,-3],[-34,3],[-30,7],[30,7],[34,3],[34,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[34.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[127.5,79,0],"ix":2},"a":{"a":0,"k":[111.75,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[46,-7],[-46,-7],[-50,-3],[-50,3],[-46,7],[46,7],[50,3],[50,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[39,-7],[-39,-7],[-43,-3],[-43,3],[-39,7],[39,7],[43,3],[43,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.25,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[4.5,-7],[-4.5,-7],[-8.5,-3],[-8.5,3],[-4.5,7],[4.5,7],[8.5,3],[8.5,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.75,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"back1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,55,0],"ix":2},"a":{"a":0,"k":[160.25,55.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[152,-55],[-152,-55],[-160,-47],[-160,47],[-152,55],[152,55],[160,47],[160,-47]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784373564,0.960784373564,0.960784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,55.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"variant-filled Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":163,"s":[0]},{"t":183.000007453743,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[48,158.5,0],"ix":2},"a":{"a":0,"k":[21.148,7.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[16.898,-7],[-16.898,-7],[-20.898,-3],[-20.898,3],[-16.898,7],[16.898,7],[20.898,3],[20.898,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.148,7.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"variant1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[75.125,104.625,0],"ix":2},"a":{"a":0,"k":[60.125,71.375,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[24,-16.5],[-24,-16.5],[-32,-8.5],[-32,8.5],[-24,16.5],[24,16.5],[32,8.5],[32,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.627451002598,0.627451002598,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0.960784375668,0.960784375668,0.960784375668,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":163,"s":[0.627451002598,0.627451002598,0.627451002598,1]},{"t":183.000007453743,"s":[0.960784316063,0.960784316063,0.960784316063,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33,125.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"variant2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[121.5,158.5,0],"ix":2},"a":{"a":0,"k":[25.5,17.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.209,0],[0,0],[0,-2.209],[0,0],[-2.209,0],[0,0],[0,2.209],[0,0]],"o":[[0,0],[-2.209,0],[0,0],[0,2.209],[0,0],[2.209,0],[0,0],[0,-2.209]],"v":[[12,-7],[-12,-7],[-16,-3],[-16,3],[-12,7],[12,7],[16,3],[16,-3]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.878431432387,0.878431432387,0.878431432387,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.5,17.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[16.5,-16.5],[-16.5,-16.5],[-24.5,-8.5],[-24.5,8.5],[-16.5,16.5],[16.5,16.5],[24.5,8.5],[24.5,-8.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.627451002598,0.627451002598,0.627451002598,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[25.5,17.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"back2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,158,0],"ix":2},"a":{"a":0,"k":[160.25,40.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.418,0],[0,0],[0,-4.418],[0,0],[-4.418,0],[0,0],[0,4.418],[0,0]],"o":[[0,0],[-4.418,0],[0,0],[0,4.418],[0,0],[4.418,0],[0,0],[0,-4.418]],"v":[[152,-40],[-152,-40],[-160,-32],[-160,32],[-152,40],[152,40],[160,32],[160,-32]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.960784373564,0.960784373564,0.960784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.25,40.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":225.000009164438,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Models/Constants/Strings.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Models/Constants/Strings.swift index 4309b91a7f..f34d15d224 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Models/Constants/Strings.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Models/Constants/Strings.swift @@ -143,6 +143,16 @@ enum Strings { static let sharingText = sharedStrings.share_streak_sharing_text.localized() static let sharingURL = sharedStrings.share_streak_sharing_url.localized() } + + enum ProblemOnboardingModal { + static let header = sharedStrings.step_quiz_problem_onboarding_modal_header.localized() + static let title = sharedStrings.step_quiz_problem_onboarding_modal_title.localized() + + static let parsonsDescription = + sharedStrings.step_quiz_problem_onboarding_modal_parsons_description.localized() + static let fillBlanksDescription = + sharedStrings.step_quiz_problem_onboarding_modal_fill_blanks_description.localized() + } } // MARK: - StepQuizChoice - @@ -207,12 +217,6 @@ enum Strings { enum StepQuizParsons { static let tab = sharedStrings.step_quiz_parsons_tab_text.localized() - - enum OnboardingModal { - static let header = sharedStrings.step_quiz_parsons_onboarding_header.localized() - static let title = sharedStrings.step_quiz_parsons_onboarding_title.localized() - static let description = sharedStrings.step_quiz_parsons_onboarding_description.localized() - } } // MARK: - StepQuizFillBlanks- diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift index 71ad177101..0d9ef37184 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/StepQuizViewModel.swift @@ -219,26 +219,20 @@ extension StepQuizViewModel: ProblemsLimitReachedModalViewControllerDelegate { } } -// MARK: - StepQuizViewModel: StepQuizParsonsOnboardingModalViewControllerDelegate - +// MARK: - StepQuizViewModel: StepQuizProblemOnboardingModalViewControllerDelegate - -extension StepQuizViewModel: StepQuizParsonsOnboardingModalViewControllerDelegate { - func stepQuizParsonsOnboardingModalViewControllerDidAppear( - _ viewController: StepQuizParsonsOnboardingModalViewController +extension StepQuizViewModel: StepQuizProblemOnboardingModalViewControllerDelegate { + func stepQuizProblemOnboardingModalViewControllerDidAppear( + _ viewController: StepQuizProblemOnboardingModalViewController, + modalType: StepQuizFeatureProblemOnboardingModalKs ) { - onNewMessage( - StepQuizFeatureMessageProblemOnboardingModalShownMessage( - modalType: StepQuizFeatureProblemOnboardingModalParsons() - ) - ) + onNewMessage(StepQuizFeatureMessageProblemOnboardingModalShownMessage(modalType: modalType.sealed)) } - func stepQuizParsonsOnboardingModalViewControllerDidDisappear( - _ viewController: StepQuizParsonsOnboardingModalViewController + func stepQuizProblemOnboardingModalViewControllerDidDisappear( + _ viewController: StepQuizProblemOnboardingModalViewController, + modalType: StepQuizFeatureProblemOnboardingModalKs ) { - onNewMessage( - StepQuizFeatureMessageProblemOnboardingModalHiddenMessage( - modalType: StepQuizFeatureProblemOnboardingModalParsons() - ) - ) + onNewMessage(StepQuizFeatureMessageProblemOnboardingModalHiddenMessage(modalType: modalType.sealed)) } } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift new file mode 100644 index 0000000000..c5860be6d9 --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift @@ -0,0 +1,79 @@ +import shared +import SwiftUI + +struct StepQuizProblemOnboardingModalView: View { + let modalType: StepQuizFeatureProblemOnboardingModalKs + + var body: some View { + VStack(alignment: .leading, spacing: LayoutInsets.defaultInset) { + Text(Strings.StepQuiz.ProblemOnboardingModal.header) + .font(.title2).bold() + .foregroundColor(.primaryText) + + animationView + + Text(Strings.StepQuiz.ProblemOnboardingModal.title) + .font(.headline) + .foregroundColor(.primaryText) + + Text(description) + .font(.subheadline) + .foregroundColor(.secondaryText) + } + .padding() + } + + private var animationView: some View { + let height: CGFloat = switch modalType { + case .parsons: 264 + case .fillBlanks(let data): + switch FillBlanksModeWrapper(shared: data.mode).require() { + case .input: 110 + case .select: 198 + } + } + + let fileName = switch modalType { + case .parsons: + LottieAnimations.parsonsProblemOnboarding + case .fillBlanks(let data): + switch FillBlanksModeWrapper(shared: data.mode).require() { + case .input: + LottieAnimations.fillBlanksInputProblemOnboarding + case .select: + LottieAnimations.fillBlanksSelectProblemOnboarding + } + } + + return LottieAnimationViewWrapper( + fileName: fileName + ) + .frame(height: height) + .frame(maxWidth: .infinity) + } + + private var description: String { + switch modalType { + case .parsons: + Strings.StepQuiz.ProblemOnboardingModal.parsonsDescription + case .fillBlanks: + Strings.StepQuiz.ProblemOnboardingModal.fillBlanksDescription + } + } +} + +#Preview { + StepQuizProblemOnboardingModalView(modalType: .parsons) +} + +#Preview { + StepQuizProblemOnboardingModalView( + modalType: .fillBlanks(StepQuizFeatureProblemOnboardingModalFillBlanks(mode: .input)) + ) +} + +#Preview { + StepQuizProblemOnboardingModalView( + modalType: .fillBlanks(StepQuizFeatureProblemOnboardingModalFillBlanks(mode: .select)) + ) +} diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalViewController.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalViewController.swift new file mode 100644 index 0000000000..e35f4a124f --- /dev/null +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalViewController.swift @@ -0,0 +1,46 @@ +import Foundation +import shared +import SwiftUI + +protocol StepQuizProblemOnboardingModalViewControllerDelegate: AnyObject { + func stepQuizProblemOnboardingModalViewControllerDidAppear( + _ viewController: StepQuizProblemOnboardingModalViewController, + modalType: StepQuizFeatureProblemOnboardingModalKs + ) + func stepQuizProblemOnboardingModalViewControllerDidDisappear( + _ viewController: StepQuizProblemOnboardingModalViewController, + modalType: StepQuizFeatureProblemOnboardingModalKs + ) +} + +final class StepQuizProblemOnboardingModalViewController: PanModalSwiftUIViewController< + StepQuizProblemOnboardingModalView +> { + weak var delegate: StepQuizProblemOnboardingModalViewControllerDelegate? + + private let modalType: StepQuizFeatureProblemOnboardingModalKs + + override var shouldUpdateAdditionalSafeAreaInsets: Bool { false } + + init( + modalType: StepQuizFeatureProblemOnboardingModalKs, + delegate: StepQuizProblemOnboardingModalViewControllerDelegate? + ) { + self.modalType = modalType + self.delegate = delegate + super.init( + isPresented: .constant(false), + content: { StepQuizProblemOnboardingModalView(modalType: modalType) } + ) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + delegate?.stepQuizProblemOnboardingModalViewControllerDidAppear(self, modalType: modalType) + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + delegate?.stepQuizProblemOnboardingModalViewControllerDidDisappear(self, modalType: modalType) + } +} diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift index f3c122e9a1..21110a8f31 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/StepQuizView.swift @@ -356,11 +356,11 @@ private extension StepQuizView { } func presentProblemOnboardingModal(modalType: StepQuizFeatureProblemOnboardingModal) { - let modalViewController = switch StepQuizFeatureProblemOnboardingModalKs(modalType) { - case .parsons: StepQuizParsonsOnboardingModalViewController(delegate: viewModel) - case .fillBlanks(let mode): fatalError("TODO: Implement \(mode)") - } - panModalPresenter.presentPanModal(modalViewController) + let panModal = StepQuizProblemOnboardingModalViewController( + modalType: StepQuizFeatureProblemOnboardingModalKs(modalType), + delegate: viewModel + ) + panModalPresenter.presentPanModal(panModal) } } diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalView.swift deleted file mode 100644 index f03fc978e7..0000000000 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalView.swift +++ /dev/null @@ -1,34 +0,0 @@ -import SwiftUI - -struct StepQuizParsonsOnboardingModalView: View { - private static let animationViewHeight: CGFloat = 264 - - var body: some View { - VStack(alignment: .leading, spacing: LayoutInsets.defaultInset) { - Text(Strings.StepQuizParsons.OnboardingModal.header) - .font(.title2).bold() - .foregroundColor(.primaryText) - - LottieAnimationViewWrapper( - fileName: LottieAnimations.parsonsProblemOnboarding - ) - .frame(height: Self.animationViewHeight) - .frame(maxWidth: .infinity) - - Text(Strings.StepQuizParsons.OnboardingModal.title) - .font(.headline) - .foregroundColor(.primaryText) - - Text(Strings.StepQuizParsons.OnboardingModal.description) - .font(.subheadline) - .foregroundColor(.secondaryText) - } - .padding() - } -} - -struct StepQuizParsonsOnboardingModalView_Previews: PreviewProvider { - static var previews: some View { - StepQuizParsonsOnboardingModalView() - } -} diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalViewController.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalViewController.swift deleted file mode 100644 index ea5affc3d8..0000000000 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuizSubmodules/StepQuizParsons/Views/OnboardingModal/StepQuizParsonsOnboardingModalViewController.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation -import shared -import SwiftUI - -protocol StepQuizParsonsOnboardingModalViewControllerDelegate: AnyObject { - func stepQuizParsonsOnboardingModalViewControllerDidAppear( - _ viewController: StepQuizParsonsOnboardingModalViewController - ) - func stepQuizParsonsOnboardingModalViewControllerDidDisappear( - _ viewController: StepQuizParsonsOnboardingModalViewController - ) -} - -final class StepQuizParsonsOnboardingModalViewController: PanModalSwiftUIViewController< - StepQuizParsonsOnboardingModalView -> { - weak var delegate: StepQuizParsonsOnboardingModalViewControllerDelegate? - - override var shouldUpdateAdditionalSafeAreaInsets: Bool { false } - - init(delegate: StepQuizParsonsOnboardingModalViewControllerDelegate?) { - self.delegate = delegate - super.init( - isPresented: .constant(false), - content: { StepQuizParsonsOnboardingModalView() } - ) - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - delegate?.stepQuizParsonsOnboardingModalViewControllerDidAppear(self) - } - - override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - delegate?.stepQuizParsonsOnboardingModalViewControllerDidDisappear(self) - } -} diff --git a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt index 11426cc2f5..11f66bf38c 100644 --- a/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt +++ b/shared/src/commonMain/kotlin/org/hyperskill/app/step_quiz/presentation/StepQuizReducer.kt @@ -459,7 +459,7 @@ class StepQuizReducer( if (fillBlanksMode != null) { setOf( Action.ViewAction.ShowProblemOnboardingModal( - modalType = StepQuizFeature.ProblemOnboardingModal.FillBlanks(FillBlanksMode.INPUT) + modalType = StepQuizFeature.ProblemOnboardingModal.FillBlanks(fillBlanksMode) ) ) } else { diff --git a/shared/src/commonMain/resources/MR/base/strings.xml b/shared/src/commonMain/resources/MR/base/strings.xml index f4564aee59..e702384b5d 100644 --- a/shared/src/commonMain/resources/MR/base/strings.xml +++ b/shared/src/commonMain/resources/MR/base/strings.xml @@ -162,9 +162,16 @@ Rearrange the lines to make the code work. Use the “Tab” button on the left to add indentation. Rearrange the lines Tab - Great news! - You\'ve unlocked a new problem type! - Now you can rearrange the lines to make the code work. Use the "Tab" button to add indentation. + + + Great news! + You\'ve unlocked a new problem type! + Now you can rearrange the lines to make the + code work. Use the "Tab" button to add indentation. + + Fill in the gaps with the relevant code + elements. + From 020b12dbcdd15d482fbed8d774f33124b05f04cb Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Fri, 10 Nov 2023 18:40:23 +0400 Subject: [PATCH 3/4] Fix swiftlint --- .../StepQuizProblemOnboardingModalView.swift | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift index c5860be6d9..d069b9bb73 100644 --- a/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift +++ b/iosHyperskillApp/iosHyperskillApp/Sources/Modules/StepQuiz/Views/Modals/ProblemOnboarding/StepQuizProblemOnboardingModalView.swift @@ -25,24 +25,27 @@ struct StepQuizProblemOnboardingModalView: View { private var animationView: some View { let height: CGFloat = switch modalType { - case .parsons: 264 - case .fillBlanks(let data): - switch FillBlanksModeWrapper(shared: data.mode).require() { - case .input: 110 - case .select: 198 - } + case .parsons: + 264 + case .fillBlanks(let data): + switch FillBlanksModeWrapper(shared: data.mode).require() { + case .input: + 110 + case .select: + 198 + } } let fileName = switch modalType { - case .parsons: - LottieAnimations.parsonsProblemOnboarding - case .fillBlanks(let data): - switch FillBlanksModeWrapper(shared: data.mode).require() { - case .input: - LottieAnimations.fillBlanksInputProblemOnboarding - case .select: - LottieAnimations.fillBlanksSelectProblemOnboarding - } + case .parsons: + LottieAnimations.parsonsProblemOnboarding + case .fillBlanks(let data): + switch FillBlanksModeWrapper(shared: data.mode).require() { + case .input: + LottieAnimations.fillBlanksInputProblemOnboarding + case .select: + LottieAnimations.fillBlanksSelectProblemOnboarding + } } return LottieAnimationViewWrapper( From 5901a6efd3a566c805b0cf614569cf34c60e7ebb Mon Sep 17 00:00:00 2001 From: Ivan Magda Date: Fri, 10 Nov 2023 18:43:46 +0400 Subject: [PATCH 4/4] Fix tests build --- .../step_quiz/AndroidStepQuizTest.kt | 7 +++++- .../org/hyperskill/step_quiz/StepQuizTest.kt | 25 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/shared/src/androidUnitTest/kotlin/org/hyperskill/step_quiz/AndroidStepQuizTest.kt b/shared/src/androidUnitTest/kotlin/org/hyperskill/step_quiz/AndroidStepQuizTest.kt index 3a9b96becf..8ba140613d 100644 --- a/shared/src/androidUnitTest/kotlin/org/hyperskill/step_quiz/AndroidStepQuizTest.kt +++ b/shared/src/androidUnitTest/kotlin/org/hyperskill/step_quiz/AndroidStepQuizTest.kt @@ -1,6 +1,7 @@ package org.hyperskill.step_quiz import kotlin.test.assertEquals +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags import org.hyperskill.app.step.domain.model.Step import org.hyperskill.app.step.domain.model.StepRoute import org.hyperskill.app.step_quiz.domain.model.attempts.Attempt @@ -72,7 +73,11 @@ class AndroidStepQuizTest { submissionState, isProblemsLimitReached = false, problemsLimitReachedModalText = null, - isParsonsOnboardingShown = false + problemsOnboardingFlags = ProblemsOnboardingFlags( + isParsonsOnboardingShown = false, + isFillBlanksInputModeOnboardingShown = false, + isFillBlanksSelectModeOnboardingShown = false + ) ) ) diff --git a/shared/src/commonTest/kotlin/org/hyperskill/step_quiz/StepQuizTest.kt b/shared/src/commonTest/kotlin/org/hyperskill/step_quiz/StepQuizTest.kt index 8ad1bed7c4..123bf74679 100644 --- a/shared/src/commonTest/kotlin/org/hyperskill/step_quiz/StepQuizTest.kt +++ b/shared/src/commonTest/kotlin/org/hyperskill/step_quiz/StepQuizTest.kt @@ -3,6 +3,7 @@ package org.hyperskill.step_quiz import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import org.hyperskill.app.onboarding.domain.model.ProblemsOnboardingFlags import org.hyperskill.app.step.domain.model.Step import org.hyperskill.app.step.domain.model.StepRoute import org.hyperskill.app.step_quiz.domain.analytic.StepQuizClickedTheoryToolbarItemHyperskillAnalyticEvent @@ -49,7 +50,11 @@ class StepQuizTest { submissionState, isProblemsLimitReached = true, problemsLimitReachedModalText = "", - isParsonsOnboardingShown = false + problemsOnboardingFlags = ProblemsOnboardingFlags( + isParsonsOnboardingShown = false, + isFillBlanksInputModeOnboardingShown = false, + isFillBlanksSelectModeOnboardingShown = false + ) ) ) @@ -90,7 +95,11 @@ class StepQuizTest { submissionState, isProblemsLimitReached = true, problemsLimitReachedModalText = "", - isParsonsOnboardingShown = false + problemsOnboardingFlags = ProblemsOnboardingFlags( + isParsonsOnboardingShown = false, + isFillBlanksInputModeOnboardingShown = false, + isFillBlanksSelectModeOnboardingShown = false + ) ) ) @@ -134,7 +143,11 @@ class StepQuizTest { submissionState, isProblemsLimitReached = false, problemsLimitReachedModalText = null, - isParsonsOnboardingShown = false + problemsOnboardingFlags = ProblemsOnboardingFlags( + isParsonsOnboardingShown = false, + isFillBlanksInputModeOnboardingShown = false, + isFillBlanksSelectModeOnboardingShown = false + ) ) ) @@ -192,7 +205,11 @@ class StepQuizTest { submissionState, isProblemsLimitReached = false, problemsLimitReachedModalText = null, - isParsonsOnboardingShown = false + problemsOnboardingFlags = ProblemsOnboardingFlags( + isParsonsOnboardingShown = false, + isFillBlanksInputModeOnboardingShown = false, + isFillBlanksSelectModeOnboardingShown = false + ) ) )