diff --git a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Insights/MarketsTokenDetailsInsightsView.swift b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Insights/MarketsTokenDetailsInsightsView.swift index 8e18d09378..1985e33991 100644 --- a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Insights/MarketsTokenDetailsInsightsView.swift +++ b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Insights/MarketsTokenDetailsInsightsView.swift @@ -22,9 +22,8 @@ struct MarketsTokenDetailsInsightsView: View { } var body: some View { - VStack(spacing: 12) { + VStack(spacing: .zero) { header - .padding(.bottom, 6) LazyVGrid(columns: gridItems, alignment: .center, spacing: 16, content: { ForEach(viewModel.records.indexed(), id: \.0) { index, info in @@ -40,8 +39,9 @@ struct MarketsTokenDetailsInsightsView: View { } }) .drawingGroup() + .padding(.vertical, Constants.itemsSpacing) } - .defaultRoundedBackground(with: Colors.Background.action, horizontalPadding: Constants.backgroundHorizontalPadding) + .defaultRoundedBackground(with: Colors.Background.action, verticalPadding: .zero, horizontalPadding: Constants.backgroundHorizontalPadding) } private var header: some View { @@ -70,6 +70,8 @@ struct MarketsTokenDetailsInsightsView: View { titleFactory: { $0.tokenDetailsNameLocalized } ) } + .padding(.top, 12) + .padding(.bottom, 6) } private var headerLabel: some View { diff --git a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Links/TokenMarketsDetailsLinksView.swift b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Links/TokenMarketsDetailsLinksView.swift index 59ca52aecf..1f454a3ea1 100644 --- a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Links/TokenMarketsDetailsLinksView.swift +++ b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Links/TokenMarketsDetailsLinksView.swift @@ -23,40 +23,38 @@ struct TokenMarketsDetailsLinksView: View { if sections.isEmpty { EmptyView() } else { - VStack(alignment: .leading, spacing: Constants.verticalSpacing) { - HStack { - Text(Localization.marketsTokenDetailsLinks) - .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) + VStack(alignment: .leading, spacing: .zero) { + BlockHeaderTitleView(title: Localization.marketsTokenDetailsLinks) + .padding(.horizontal, Constants.horizontalPadding) - Spacer() - } - .padding(.horizontal, Constants.horizontalPadding) - - ForEach(sections) { sectionInfo in - if sectionInfo.chips.isEmpty { - EmptyView() - } else { - VStack(alignment: .leading, spacing: Constants.verticalSpacing) { - Group { - Text(sectionInfo.section.title) - .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) + VStack(alignment: .leading) { + ForEach(sections) { sectionInfo in + if sectionInfo.chips.isEmpty { + EmptyView() + } else { + VStack(alignment: .leading, spacing: Constants.verticalSpacing) { + Group { + Text(sectionInfo.section.title) + .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) - MarketsTokenDetailsChipsContainer( - chipsData: sectionInfo.chips, - parentWidth: viewWidth - Constants.horizontalPadding * 2 - ) - } - .padding(.horizontal, Constants.horizontalPadding) + MarketsTokenDetailsChipsContainer( + chipsData: sectionInfo.chips, + parentWidth: viewWidth - Constants.horizontalPadding * 2 + ) + } + .padding(.horizontal, Constants.horizontalPadding) - if sectionInfo.id != sections.last?.id { - Separator(color: Colors.Stroke.primary, axis: .horizontal) - .padding(.leading, Constants.horizontalPadding) + if sectionInfo.id != sections.last?.id { + Separator(color: Colors.Stroke.primary, axis: .horizontal) + .padding(.leading, Constants.horizontalPadding) + } } } } } + .padding(.vertical, Constants.verticalSpacing) } - .defaultRoundedBackground(with: Colors.Background.action, horizontalPadding: 0) + .defaultRoundedBackground(with: Colors.Background.action, verticalPadding: .zero, horizontalPadding: .zero) } } } diff --git a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/MarketsPortfolioContainerView/MarketsPortfolioContainerView.swift b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/MarketsPortfolioContainerView/MarketsPortfolioContainerView.swift index 5aa8acef8b..02de5e6600 100644 --- a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/MarketsPortfolioContainerView/MarketsPortfolioContainerView.swift +++ b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/MarketsPortfolioContainerView/MarketsPortfolioContainerView.swift @@ -19,48 +19,26 @@ struct MarketsPortfolioContainerView: View { view .padding(.bottom, 12) // Bottom padding use for no list views }) - .padding(.top, 12) // Need for top padding without bottom padding .defaultRoundedBackground(with: Colors.Background.action, verticalPadding: .zero) } - private var headerView: some View { - HStack(alignment: .center) { - Text(Localization.marketsCommonMyPortfolio) - .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) - - Spacer() - - addTokenButton - } - } - @ViewBuilder - private var addTokenButton: some View { + private var headerView: some View { switch viewModel.typeView { case .empty, .loading, .unavailable: - EmptyView() + BlockHeaderTitleView(title: Localization.marketsCommonMyPortfolio) case .list: - Button(action: { + BlockHeaderTitleButtonView( + title: Localization.marketsCommonMyPortfolio, + button: .init( + asset: Assets.plus14, + title: Localization.marketsAddToken, + isDisabled: viewModel.isAddTokenButtonDisabled, + isLoading: viewModel.isLoadingNetworks + ) + ) { viewModel.onAddTapAction() - }, label: { - HStack(spacing: 2) { - Assets.plus14.image - .foregroundStyle(viewModel.isAddTokenButtonDisabled ? Colors.Icon.inactive : Colors.Icon.primary1) - - Text(Localization.marketsAddToken) - .style( - Fonts.Regular.footnote.bold(), - color: viewModel.isAddTokenButtonDisabled ? Colors.Icon.inactive : Colors.Text.primary1 - ) - } - .padding(.leading, 8) - .padding(.trailing, 10) - .padding(.vertical, 4) - }) - .background(Colors.Button.secondary) - .cornerRadiusContinuous(Constants.buttonCornerRadius) - .skeletonable(isShown: viewModel.isLoadingNetworks, size: .init(width: 60, height: 18), radius: 3, paddings: .init(top: 3, leading: 0, bottom: 3, trailing: 0)) - .disabled(viewModel.isAddTokenButtonDisabled) + } } } @@ -135,7 +113,7 @@ struct MarketsPortfolioContainerView: View { @ViewBuilder private func viewWithHeader(_ view: some View) -> some View { - VStack(alignment: .leading, spacing: 6) { + VStack(alignment: .leading, spacing: .zero) { headerView view diff --git a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Metrics/MarketsTokenDetailsMetricsView.swift b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Metrics/MarketsTokenDetailsMetricsView.swift index 2649458500..5e7ed2dc01 100644 --- a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Metrics/MarketsTokenDetailsMetricsView.swift +++ b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/Metrics/MarketsTokenDetailsMetricsView.swift @@ -21,13 +21,8 @@ struct MarketsTokenDetailsMetricsView: View { } var body: some View { - VStack(spacing: 20) { - HStack { - Text(Localization.marketsTokenDetailsMetrics) - .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) - - Spacer() - } + VStack(spacing: .zero) { + BlockHeaderTitleView(title: Localization.marketsTokenDetailsMetrics) LazyVGrid(columns: gridItems, alignment: .center, spacing: 16, content: { ForEach(viewModel.records.indexed(), id: \.1.id) { index, info in @@ -43,8 +38,9 @@ struct MarketsTokenDetailsMetricsView: View { } }) .drawingGroup() + .padding(.vertical, Constants.itemsSpacing) } - .defaultRoundedBackground(with: Colors.Background.action, horizontalPadding: Constants.backgroundHorizontalPadding) + .defaultRoundedBackground(with: Colors.Background.action, verticalPadding: .zero, horizontalPadding: Constants.backgroundHorizontalPadding) } } diff --git a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/PricePerformance/MarketsTokenDetailsPricePerformanceView.swift b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/PricePerformance/MarketsTokenDetailsPricePerformanceView.swift index d0303ff5b4..a0d59ddaa1 100644 --- a/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/PricePerformance/MarketsTokenDetailsPricePerformanceView.swift +++ b/Tangem/Modules/Markets/TokenMarketsDetails/Subviews/PricePerformance/MarketsTokenDetailsPricePerformanceView.swift @@ -13,55 +13,59 @@ struct MarketsTokenDetailsPricePerformanceView: View { @ObservedObject var viewModel: MarketsTokenDetailsPricePerformanceViewModel var body: some View { - VStack(spacing: 18) { - HStack(content: { - Text(Localization.marketsTokenDetailsPricePerformance) - .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) + VStack(spacing: .zero) { + header - Spacer(minLength: 8) + content + } + .defaultRoundedBackground(with: Colors.Background.action, verticalPadding: .zero) + } - MarketsPickerView( - marketPriceIntervalType: $viewModel.selectedInterval, - options: viewModel.intervalOptions, - shouldStretchToFill: false, - style: .init(textVerticalPadding: 2), - titleFactory: { $0.tokenDetailsNameLocalized } - ) - }) + private var header: some View { + BlockHeaderTitleView(title: Localization.marketsTokenDetailsPricePerformance) { + MarketsPickerView( + marketPriceIntervalType: $viewModel.selectedInterval, + options: viewModel.intervalOptions, + shouldStretchToFill: false, + style: .init(textVerticalPadding: 2), + titleFactory: { $0.tokenDetailsNameLocalized } + ) + } + } - VStack(spacing: 12) { - HStack { - Text(Localization.marketsTokenDetailsLow) - .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) + private var content: some View { + VStack(spacing: 12) { + HStack { + Text(Localization.marketsTokenDetailsLow) + .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) - Spacer(minLength: 8) + Spacer(minLength: 8) - Text(Localization.marketsTokenDetailsHigh) - .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) - } + Text(Localization.marketsTokenDetailsHigh) + .style(Fonts.Regular.footnote, color: Colors.Text.tertiary) + } - ProgressView(value: viewModel.pricePerformanceProgress) - .progressViewStyle(TangemProgressViewStyle( - height: 6, - backgroundColor: Colors.Background.tertiary, - progressColor: Colors.Text.accent - )) - .animation(.default, value: viewModel.pricePerformanceProgress) + ProgressView(value: viewModel.pricePerformanceProgress) + .progressViewStyle(TangemProgressViewStyle( + height: 6, + backgroundColor: Colors.Background.tertiary, + progressColor: Colors.Text.accent + )) + .animation(.default, value: viewModel.pricePerformanceProgress) - HStack { - Text(viewModel.lowValue) - .style(Fonts.Regular.callout, color: Colors.Text.primary1) - .animation(.default, value: viewModel.lowValue) + HStack { + Text(viewModel.lowValue) + .style(Fonts.Regular.callout, color: Colors.Text.primary1) + .animation(.default, value: viewModel.lowValue) - Spacer(minLength: 8) + Spacer(minLength: 8) - Text(viewModel.highValue) - .style(Fonts.Regular.callout, color: Colors.Text.primary1) - .animation(.default, value: viewModel.highValue) - } + Text(viewModel.highValue) + .style(Fonts.Regular.callout, color: Colors.Text.primary1) + .animation(.default, value: viewModel.highValue) } } - .defaultRoundedBackground(with: Colors.Background.action) + .padding(.vertical, 12) } } diff --git a/Tangem/Modules/Markets/TokensNetworkSelector/MarketsTokensNetworkSelectorView.swift b/Tangem/Modules/Markets/TokensNetworkSelector/MarketsTokensNetworkSelectorView.swift index ccbacb982c..cd8dd6ba9d 100644 --- a/Tangem/Modules/Markets/TokensNetworkSelector/MarketsTokensNetworkSelectorView.swift +++ b/Tangem/Modules/Markets/TokensNetworkSelector/MarketsTokensNetworkSelectorView.swift @@ -41,16 +41,20 @@ struct MarketsTokensNetworkSelectorView: View { private var contentView: some View { VStack(alignment: .leading, spacing: .zero) { - VStack(alignment: .leading, spacing: Constants.headerTokenInfoSpace) { - Text(Localization.marketsSelectNetwork) - .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) + VStack(alignment: .leading, spacing: .zero) { + BlockHeaderTitleView(title: Localization.marketsSelectNetwork) tokenInfoView } networkListView } - .roundedBackground(with: Colors.Background.action, padding: 14, radius: Constants.cornerRadius) + .roundedBackground( + with: Colors.Background.action, + verticalPadding: .zero, + horizontalPadding: 14, + radius: Constants.cornerRadius + ) } private var tokenInfoView: some View { @@ -111,6 +115,5 @@ struct MarketsTokensNetworkSelectorView: View { private extension MarketsTokensNetworkSelectorView { enum Constants { static let cornerRadius = 14.0 - static let headerTokenInfoSpace = 8.0 } } diff --git a/Tangem/Modules/OrganizeTokens/ListSection/OrganizeTokensListSectionView.swift b/Tangem/Modules/OrganizeTokens/ListSection/OrganizeTokensListSectionView.swift index 93cbcf58c3..e966f0d8ca 100644 --- a/Tangem/Modules/OrganizeTokens/ListSection/OrganizeTokensListSectionView.swift +++ b/Tangem/Modules/OrganizeTokens/ListSection/OrganizeTokensListSectionView.swift @@ -33,8 +33,8 @@ struct OrganizeTokensListSectionView: View { } } .padding(.horizontal, 14.0) - .padding(.top, 14) - .padding(.bottom, 8) + .padding(.top, 12) + .padding(.bottom, 6) } } diff --git a/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleButtonView.swift b/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleButtonView.swift new file mode 100644 index 0000000000..b9f1b66a37 --- /dev/null +++ b/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleButtonView.swift @@ -0,0 +1,71 @@ +// +// BlockHeaderTitleButtonView.swift +// Tangem +// +// Created by Alexander Skibin on 29.09.2024. +// Copyright © 2024 Tangem AG. All rights reserved. +// + +import SwiftUI + +/// This is a common component of the system design - a common header + button. +/// Required due to specific dimensions +struct BlockHeaderTitleButtonView: View { + let title: String + let button: ButtonInput + let action: (() -> Void)? + + // MARK: - UI + + var body: some View { + BlockHeaderTitleView(title: title) { + addTokenButton + } + } + + @ViewBuilder + private var addTokenButton: some View { + Button(action: { + action?() + }, label: { + HStack(spacing: 2) { + if let asset = button.asset { + asset.image + .foregroundStyle(button.isDisabled ? Colors.Icon.inactive : Colors.Icon.primary1) + } + + Text(button.title) + .style( + Fonts.Regular.footnote.bold(), + color: button.isDisabled ? Colors.Icon.inactive : Colors.Text.primary1 + ) + } + .padding(.leading, 8) + .padding(.trailing, 10) + .padding(.vertical, 4) + }) + .background(Colors.Button.secondary) + .cornerRadiusContinuous(Constants.buttonCornerRadius) + .skeletonable(isShown: button.isLoading, size: .init(width: 60, height: 18), radius: 3, paddings: .init(top: 3, leading: 0, bottom: 3, trailing: 0)) + .disabled(button.isDisabled) + } +} + +extension BlockHeaderTitleButtonView { + struct ButtonInput: Identifiable { + let id: UUID = .init() + + let asset: ImageType? + let title: String + let isDisabled: Bool + let isLoading: Bool + } +} + +private extension BlockHeaderTitleButtonView { + enum Constants { + static let buttonCornerRadius: CGFloat = 8.0 + static let topPaddingTitle: CGFloat = 12.0 + static let bottomPaddingTitle: CGFloat = 6.0 + } +} diff --git a/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleView.swift b/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleView.swift new file mode 100644 index 0000000000..5189f8908f --- /dev/null +++ b/Tangem/UIComponents/CommonHeaders/BlockHeaderTitleView.swift @@ -0,0 +1,71 @@ +// +// BlockHeaderTitleView.swift +// Tangem +// +// Created by Alexander Skibin on 02.10.2024. +// Copyright © 2024 Tangem AG. All rights reserved. +// + +import SwiftUI + +/// This is a common component of the system design - a common header + button. +/// Required due to specific dimensions +struct BlockHeaderTitleView: View { + private typealias Constants = BlockHeaderConstants + + private let trailingItem: TrailingView? + private let title: String + + // MARK: - Init + + init(title: String) { + self.title = title + trailingItem = nil + } + + init(title: String, @ViewBuilder trailingItem: () -> TrailingView?) { + self.title = title + self.trailingItem = trailingItem() + } + + // MARK: - UI + + var body: some View { + HStack(spacing: .zero) { + headerView + + Spacer(minLength: trailingItem == nil ? .zero : 8) + + if let trailingItem { + trailingItem + .padding(.top, 12.0) + .padding(.bottom, 6.0) + } + } + } + + private var headerView: some View { + Text(title) + .lineLimit(1) + .style(Fonts.Bold.footnote, color: Colors.Text.tertiary) + .if(trailingItem == nil, transform: { view in + view + .padding(.top, Constants.topPaddingTitle) + .padding(.bottom, Constants.topPaddingTitle) + }) + } +} + +private enum BlockHeaderConstants { + static let topPaddingTitle: CGFloat = 12.0 + static let bottomPaddingTitle: CGFloat = 8.0 +} + +// MARK: - Helpers + +extension BlockHeaderTitleView where TrailingView == EmptyView { + init(title: String) { + self.title = title + trailingItem = nil + } +} diff --git a/TangemApp.xcodeproj/project.pbxproj b/TangemApp.xcodeproj/project.pbxproj index 0520aa4b9c..1fdbdabd90 100644 --- a/TangemApp.xcodeproj/project.pbxproj +++ b/TangemApp.xcodeproj/project.pbxproj @@ -115,6 +115,8 @@ 2DD754D72AE1660D0009CA64 /* GenerateAddressesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD754D62AE1660D0009CA64 /* GenerateAddressesViewModel.swift */; }; 2DDF91942A14DA2700B31113 /* TokenItemMenuActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDF91932A14DA2700B31113 /* TokenItemMenuActions.swift */; }; 2DDFA7952C230E2F00E51F7F /* MarketCapFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDFA7942C230E2F00E51F7F /* MarketCapFormatter.swift */; }; + 2DE0BA992CA93100002C09D9 /* BlockHeaderTitleButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE0BA982CA93100002C09D9 /* BlockHeaderTitleButtonView.swift */; }; + 2DE0BB602CAD41E3002C09D9 /* BlockHeaderTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE0BB5F2CAD41E3002C09D9 /* BlockHeaderTitleView.swift */; }; 2DF1D92A2C2C519C00B1CEE7 /* MarketsChartModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DF1D9292C2C519C00B1CEE7 /* MarketsChartModel.swift */; }; 2DF5A81F2B13C33D00AA5E73 /* ManageTokensNetworkDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DF5A81E2B13C33C00AA5E73 /* ManageTokensNetworkDataSource.swift */; }; 2DFC278D2C78E7A5009B247E /* TokenContextActionsBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DFC278C2C78E7A5009B247E /* TokenContextActionsBuilder.swift */; }; @@ -2023,6 +2025,8 @@ 2DD754D62AE1660D0009CA64 /* GenerateAddressesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenerateAddressesViewModel.swift; sourceTree = ""; }; 2DDF91932A14DA2700B31113 /* TokenItemMenuActions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenItemMenuActions.swift; sourceTree = ""; }; 2DDFA7942C230E2F00E51F7F /* MarketCapFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketCapFormatter.swift; sourceTree = ""; }; + 2DE0BA982CA93100002C09D9 /* BlockHeaderTitleButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockHeaderTitleButtonView.swift; sourceTree = ""; }; + 2DE0BB5F2CAD41E3002C09D9 /* BlockHeaderTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockHeaderTitleView.swift; sourceTree = ""; }; 2DF1D9292C2C519C00B1CEE7 /* MarketsChartModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarketsChartModel.swift; sourceTree = ""; }; 2DF5A81E2B13C33C00AA5E73 /* ManageTokensNetworkDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManageTokensNetworkDataSource.swift; sourceTree = ""; }; 2DFC278C2C78E7A5009B247E /* TokenContextActionsBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenContextActionsBuilder.swift; sourceTree = ""; }; @@ -4225,6 +4229,15 @@ path = MarketCapFormatter; sourceTree = ""; }; + 2DE0BA972CA930CE002C09D9 /* CommonHeaders */ = { + isa = PBXGroup; + children = ( + 2DE0BA982CA93100002C09D9 /* BlockHeaderTitleButtonView.swift */, + 2DE0BB5F2CAD41E3002C09D9 /* BlockHeaderTitleView.swift */, + ); + path = CommonHeaders; + sourceTree = ""; + }; 2DFC27912C78E833009B247E /* TokenItemInfo */ = { isa = PBXGroup; children = ( @@ -5661,6 +5674,7 @@ 2DB361492C14FB9200BB1D38 /* SegmentPickerView */, 2DC46C372C98022500749F7C /* Shapes */, 2DADFF9E2C98A9F30029F390 /* Tooltip */, + 2DE0BA972CA930CE002C09D9 /* CommonHeaders */, ); path = UIComponents; sourceTree = ""; @@ -11516,6 +11530,7 @@ EF0DC1072A0BD7F8007E3DA7 /* OptionPicker.swift in Sources */, B63FDB182A5F09F10080240F /* CardsInfoPagerFlexibleFooterView.swift in Sources */, B0C87B482566492000F861DE /* TwinData.swift in Sources */, + 2DE0BA992CA93100002C09D9 /* BlockHeaderTitleButtonView.swift in Sources */, EFF2A52D2C60BA0F007DB0C1 /* StakingNotificationEvent.swift in Sources */, B0FAD00E26BAC51F00F45E88 /* CircledCheckmarkView.swift in Sources */, 5D12D21325B60AA4006060A1 /* SearchBar.swift in Sources */, @@ -11918,6 +11933,7 @@ B0FC72EB29B7991A001930D4 /* OnboardingSeedPhraseIntroView.swift in Sources */, B0F62C5525DE4F6B005C8BA0 /* DeviceInfoProvider.swift in Sources */, EF8D780F2981458500B67418 /* UserTokenListManagerMock.swift in Sources */, + 2DE0BB602CAD41E3002C09D9 /* BlockHeaderTitleView.swift in Sources */, DA4055262ABDD3A300353F8A /* AddCustomTokenNetworksListItemView.swift in Sources */, 2D1BB36C2C0745ED008392F7 /* MarketsListOrderType.swift in Sources */, DA4371A72A7D1937006215CA /* ManageTokensCoinItemView.swift in Sources */,