diff --git a/BusinessCard/Views/CardEditorView.swift b/BusinessCard/Views/CardEditorView.swift index d8138b9..7c91603 100644 --- a/BusinessCard/Views/CardEditorView.swift +++ b/BusinessCard/Views/CardEditorView.swift @@ -557,31 +557,23 @@ private struct ImageLayoutRow: View { var body: some View { VStack(alignment: .leading, spacing: Design.Spacing.medium) { // Live card preview based on selected layout - VStack(spacing: 0) { - ZStack(alignment: .bottomLeading) { - // Banner preview based on layout - EditorBannerPreviewView( - photoData: photoData, - coverPhotoData: coverPhotoData, - logoData: logoData, - avatarSystemName: avatarSystemName, - selectedTheme: selectedTheme, - selectedHeaderLayout: selectedHeaderLayout - ) - - // Overlay content based on layout - if hasOverlappingContent { - overlayContent - .padding(.leading, Design.Spacing.large) - .padding(.trailing, Design.Spacing.large) - .offset(y: Design.CardSize.avatarOverlap) - } - } + VStack(alignment: .leading, spacing: 0) { + // Banner preview + EditorBannerPreviewView( + photoData: photoData, + coverPhotoData: coverPhotoData, + logoData: logoData, + avatarSystemName: avatarSystemName, + selectedTheme: selectedTheme, + selectedHeaderLayout: selectedHeaderLayout + ) - // Spacer to make room for overlapping content + // Overlay content positioned below banner, overlapping upward if hasOverlappingContent { - Spacer() - .frame(height: Design.CardSize.avatarOverlap) + overlayContent + .padding(.horizontal, Design.Spacing.large) + .offset(y: -Design.CardSize.avatarOverlap) + .padding(.bottom, -Design.CardSize.avatarOverlap) } } diff --git a/BusinessCard/Views/Components/HeaderLayoutPickerView.swift b/BusinessCard/Views/Components/HeaderLayoutPickerView.swift index 03914d8..57d6adf 100644 --- a/BusinessCard/Views/Components/HeaderLayoutPickerView.swift +++ b/BusinessCard/Views/Components/HeaderLayoutPickerView.swift @@ -51,27 +51,33 @@ struct HeaderLayoutPickerView: View { var body: some View { NavigationStack { VStack(spacing: 0) { - ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: Design.Spacing.large) { - ForEach(CardHeaderLayout.allCases) { layout in - LayoutPreviewCard( - layout: layout, - isSelected: currentLayout == layout, - isSuggested: layout == suggestedLayout, - photoData: photoData, - coverPhotoData: coverPhotoData, - logoData: logoData, - avatarSystemName: avatarSystemName, - theme: theme - ) { - withAnimation(.snappy(duration: Design.Animation.quick)) { - currentLayout = layout + ScrollViewReader { proxy in + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: Design.Spacing.large) { + ForEach(CardHeaderLayout.allCases) { layout in + LayoutPreviewCard( + layout: layout, + isSelected: currentLayout == layout, + isSuggested: layout == suggestedLayout, + photoData: photoData, + coverPhotoData: coverPhotoData, + logoData: logoData, + avatarSystemName: avatarSystemName, + theme: theme + ) { + withAnimation(.snappy(duration: Design.Animation.quick)) { + currentLayout = layout + } } + .id(layout) } } + .padding(.horizontal, Design.Spacing.xLarge) + .padding(.vertical, Design.Spacing.large) + } + .onAppear { + proxy.scrollTo(currentLayout, anchor: .center) } - .padding(.horizontal, Design.Spacing.xLarge) - .padding(.vertical, Design.Spacing.large) } .scrollClipDisabled()