diff --git a/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift b/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift index f5fdd95..81342ce 100644 --- a/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift +++ b/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift @@ -296,27 +296,41 @@ struct EventListView: View { var body: some View { ScrollViewReader { proxy in - List { - ForEach(filteredEvents) { event in - Button(action: { - if let url = event.calendarAppURL() { - openURL(url) + ZStack { + List { + ForEach(filteredEvents) { event in + Button(action: { + if let url = event.calendarAppURL() { + openURL(url) + } + }) { + eventRow(event) } - }) { - eventRow(event) + .id(event.id) + .padding(.leading, -5) + .buttonStyle(PlainButtonStyle()) + .listRowSeparator(.automatic) + .listRowSeparatorTint(.gray.opacity(0.2)) + .listRowBackground(Color.clear) } - .id(event.id) - .padding(.leading, -5) - .buttonStyle(PlainButtonStyle()) - .listRowSeparator(.automatic) - .listRowSeparatorTint(.gray.opacity(0.2)) - .listRowBackground(Color.clear) } + .listStyle(.plain) + .scrollIndicators(.never) + .scrollContentBackground(.hidden) + .background(Color.clear) + + LinearGradient(colors: [Color.black.opacity(0.65), .clear], startPoint: .top, endPoint: .bottom) + .frame(height: 16) + .allowsHitTesting(false) + .alignmentGuide(.top) { d in d[.top] } + .frame(maxHeight: .infinity, alignment: .top) + + LinearGradient(colors: [.clear, Color.black.opacity(0.65)], startPoint: .top, endPoint: .bottom) + .frame(height: 16) + .allowsHitTesting(false) + .alignmentGuide(.bottom) { d in d[.bottom] } + .frame(maxHeight: .infinity, alignment: .bottom) } - .listStyle(.plain) - .scrollIndicators(.never) - .scrollContentBackground(.hidden) - .background(Color.clear) .onAppear { scrollToRelevantEvent(proxy: proxy) } diff --git a/DynamicIsland/components/Notch/NotchTimerView.swift b/DynamicIsland/components/Notch/NotchTimerView.swift index 92f006e..e3a2d9c 100644 --- a/DynamicIsland/components/Notch/NotchTimerView.swift +++ b/DynamicIsland/components/Notch/NotchTimerView.swift @@ -99,20 +99,34 @@ struct NotchTimerView: View { } else { let computedHeight = CGFloat(timerPresets.count) * 60 + 4 let listHeight = min(max(0, maxTabContentHeight - 16), computedHeight) - List { - ForEach(timerPresets) { preset in - TimerPresetCard(preset: preset, isActive: timerManager.activePresetId == preset.id) { - timerManager.startTimer(duration: preset.duration, name: preset.name, preset: preset) - coordinator.currentView = .timer + ZStack { + List { + ForEach(timerPresets) { preset in + TimerPresetCard(preset: preset, isActive: timerManager.activePresetId == preset.id) { + timerManager.startTimer(duration: preset.duration, name: preset.name, preset: preset) + coordinator.currentView = .timer + } + .listRowInsets(EdgeInsets(top: 2, leading: 0, bottom: 2, trailing: 0)) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) } - .listRowInsets(EdgeInsets(top: 2, leading: 0, bottom: 2, trailing: 0)) - .listRowBackground(Color.clear) - .listRowSeparator(.hidden) } + .listStyle(.plain) + .scrollContentBackground(.hidden) + .scrollIndicators(.never) + + LinearGradient(colors: [Color.black.opacity(0.65), .clear], startPoint: .top, endPoint: .bottom) + .frame(height: 16) + .allowsHitTesting(false) + .alignmentGuide(.top) { d in d[.top] } + .frame(maxHeight: .infinity, alignment: .top) + + LinearGradient(colors: [.clear, Color.black.opacity(0.65)], startPoint: .top, endPoint: .bottom) + .frame(height: 16) + .allowsHitTesting(false) + .alignmentGuide(.bottom) { d in d[.bottom] } + .frame(maxHeight: .infinity, alignment: .bottom) } - .listStyle(.plain) - .scrollContentBackground(.hidden) - .scrollIndicators(.never) .frame(height: listHeight) } }