Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2713a87
feat(home): redesign home screen with personalized sections for post-…
lui7henrique Feb 7, 2026
93b53f5
fix(home): use HD backdrop (original resolution) for featured hero card
lui7henrique Feb 7, 2026
07f86f3
feat(home): redesign trending section with backdrop cards and rank ba…
lui7henrique Feb 7, 2026
da80bca
fix(home): hide Popular Movies/Series when In Theaters/Airing Today i…
lui7henrique Feb 7, 2026
5140efc
fix(home): personalize home for anime and dorama users
lui7henrique Feb 7, 2026
71575c1
feat(debug): add onboarding debug button on login screen
lui7henrique Feb 7, 2026
b7643de
fix: filter Featured and Trending sections by user content type prefe…
lui7henrique Feb 7, 2026
7185df5
feat: filter "For You" section by user's existing collection
lui7henrique Feb 7, 2026
a1aa38a
style: use sentence case for all home section titles
lui7henrique Feb 7, 2026
4d50492
fix: add @MainActor to loadUserCollectionIds to fix async concurrency…
lui7henrique Feb 7, 2026
816f005
fix: move async call out of guard-let to fix concurrency error
lui7henrique Feb 7, 2026
59f8eae
fix: use selected genres to filter anime/dorama in title selector and…
lui7henrique Feb 7, 2026
6e5625a
fix: add dedicated localized strings for top rated animes/doramas
lui7henrique Feb 7, 2026
6b2303e
feat: show review/status/watched buttons for guest users with login p…
lui7henrique Feb 7, 2026
384e285
style: make trending cards taller for a more square aspect ratio
lui7henrique Feb 7, 2026
ccdabb0
fix: make login prompt text universal for all contexts
lui7henrique Feb 7, 2026
7ada6ce
fix: remove translucent glass material from floating sheets on iOS 26
lui7henrique Feb 7, 2026
9c46966
fix: replace Liquid Glass with solid background on sheets and adjust …
lui7henrique Feb 7, 2026
0695b0e
refactor: adjust layout and improve content display in ReviewSheet an…
lui7henrique Feb 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/ios/Plotwist/Plotwist.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Plotwist/Plotwist.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 17;
CURRENT_PROJECT_VERSION = 19;
DEVELOPMENT_TEAM = 54XPVTP5PA;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
Expand Down Expand Up @@ -295,7 +295,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Plotwist/Plotwist.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 17;
CURRENT_PROJECT_VERSION = 19;
DEVELOPMENT_TEAM = 54XPVTP5PA;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ struct MediaDetailViewActions: View {
let isLoadingStatus: Bool
let onReviewTapped: () -> Void
let onStatusChanged: (UserItem?) -> Void
var onLoginRequired: (() -> Void)?

@State private var showStatusSheet = false

Expand All @@ -27,7 +28,13 @@ struct MediaDetailViewActions: View {
currentStatus: userItem?.statusEnum,
rewatchCount: userItem?.watchEntries?.count ?? 0,
isLoading: isLoadingStatus,
action: { showStatusSheet = true }
action: {
if AuthService.shared.isAuthenticated {
showStatusSheet = true
} else {
onLoginRequired?()
}
}
)

Spacer()
Expand Down
66 changes: 11 additions & 55 deletions apps/ios/Plotwist/Plotwist/Extensions/View+Sheet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,83 +5,39 @@

import SwiftUI

// MARK: - UIScreen Extension for Device Corner Radius
extension UIScreen {
/// Returns the display corner radius of the device screen
var deviceCornerRadius: CGFloat {
guard let cornerRadius = value(forKey: "_displayCornerRadius") as? CGFloat else {
return 44 // Fallback for older devices or simulator
}
return cornerRadius
}
}

// MARK: - Sheet Style Configuration
enum SheetStyle {
/// Margem horizontal do sheet flutuante
static let horizontalPadding: CGFloat = 8
/// Margem inferior do sheet flutuante
static let bottomPadding: CGFloat = 8
/// Raio de arredondamento do sheet - usa o raio do dispositivo
static var cornerRadius: CGFloat {
UIScreen.main.deviceCornerRadius
}
/// Altura extra para compensar o padding
static let heightOffset: CGFloat = 20
}

// MARK: - Floating Sheet Container
/// Container que aplica o estilo flutuante com margem e arredondamento
/// Container for sheet content — pass-through that preserves existing call sites.
struct FloatingSheetContainer<Content: View>: View {
let content: Content
@State private var keyboardVisible = false

init(@ViewBuilder content: () -> Content) {
self.content = content()
}

var body: some View {
VStack {
Spacer()
content
.background(Color.appSheetBackgroundAdaptive)
.clipShape(
UnevenRoundedRectangle(
topLeadingRadius: SheetStyle.cornerRadius,
bottomLeadingRadius: keyboardVisible ? 0 : SheetStyle.cornerRadius,
bottomTrailingRadius: keyboardVisible ? 0 : SheetStyle.cornerRadius,
topTrailingRadius: SheetStyle.cornerRadius
)
)
.padding(.horizontal, keyboardVisible ? 0 : SheetStyle.horizontalPadding)
.padding(.bottom, keyboardVisible ? 0 : SheetStyle.bottomPadding)
.animation(.easeInOut(duration: 0.25), value: keyboardVisible)
}
.ignoresSafeArea(.container, edges: .bottom)
.onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)) { _ in
keyboardVisible = true
}
.onReceive(NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)) { _ in
keyboardVisible = false
}
content
}
}

// MARK: - View Extension
extension View {
/// Aplica os modificadores de apresentação para sheet flutuante
/// Sheet com altura fixa e fundo sólido (substitui Liquid Glass do iOS 26).
func floatingSheetPresentation(height: CGFloat) -> some View {
self
.presentationDetents([.height(height + SheetStyle.heightOffset)])
.presentationBackground(.clear)
.presentationDetents([.height(height)])
.presentationBackground {
Color.appSheetBackgroundAdaptive.ignoresSafeArea()
}
.presentationDragIndicator(.hidden)
}

/// Aplica os modificadores de apresentação para sheet flutuante com detents customizados
/// Sheet com detents customizados e fundo sólido (substitui Liquid Glass do iOS 26).
func floatingSheetPresentation(detents: Set<PresentationDetent>) -> some View {
self
.presentationDetents(detents)
.presentationBackground(.clear)
.presentationBackground {
Color.appSheetBackgroundAdaptive.ignoresSafeArea()
}
.presentationDragIndicator(.hidden)
}
}
Loading
Loading