fix: visible Liquid Glass again, group icon on group events, week today colour

- Liquid Glass: the calendar content now scrolls underneath a translucent
  safeAreaInset bar (real glass look restored) while the inline title stays
  reliable — toggling Liquid Glass is visibly different again.
- Group events are prefixed with the group's own emoji icon (from group
  settings) instead of a generic people glyph, so they're recognisable.
- Week view: today's column header now uses the configured "today" colour
  instead of the accent colour (matches the current-time line).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-06-01 17:22:02 +02:00
parent 7f76df2600
commit 8521a28520
3 changed files with 23 additions and 14 deletions

View File

@@ -280,10 +280,13 @@ class CalendarStore {
private func decorateGroupEvent(_ ev: CalEvent) -> CalEvent { private func decorateGroupEvent(_ ev: CalEvent) -> CalEvent {
var e = ev var e = ev
let me = UserDefaults.standard.integer(forKey: "userId") let me = UserDefaults.standard.integer(forKey: "userId")
// Use the group's own icon (set in group settings) so group events are
// recognisable; fall back to a generic people glyph.
let groupIcon = activeGroup?.icon ?? "👥"
func first(_ s: String) -> String { s.split(separator: " ").first.map(String.init) ?? s } func first(_ s: String) -> String { s.split(separator: " ").first.map(String.init) ?? s }
if ev.isGroupEvent { if ev.isGroupEvent {
if let c = ev.creator, c.id != me { e.title = "👥 \(first(c.displayName)): \(ev.title)" } if let c = ev.creator, c.id != me { e.title = "\(groupIcon) \(first(c.displayName)): \(ev.title)" }
else { e.title = "👥 \(ev.title)" } else { e.title = "\(groupIcon) \(ev.title)" }
} else if let o = ev.owner, o.id != me { } else if let o = ev.owner, o.id != me {
e.title = "\(first(o.displayName)): \(ev.title)" e.title = "\(first(o.displayName)): \(ev.title)"
} }

View File

@@ -101,18 +101,24 @@ struct CalendarHostView: View {
// MARK: Liquid Glass variant // MARK: Liquid Glass variant
private var glassVariant: some View { private var glassVariant: some View {
VStack(spacing: 0) { // Floating glass bar via safeAreaInset: the calendar content scrolls
glassTopBar // *underneath* the translucent bar (the actual Liquid Glass look), while
groupBanner // the title is a plain inline Text in the bar which, unlike the
errorBanner // NavigationStack toolbar title, refreshes reliably on month change.
calendarContent calendarContent
.frame(maxWidth: .infinity, maxHeight: .infinity) .frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(hex: bgHex)) .background(Color(hex: bgHex))
.overlay(alignment: .top) { .overlay(alignment: .top) {
loadingIndicator.padding(.top, 12) loadingIndicator.padding(.top, 12)
}
.animation(.easeInOut(duration: 0.2), value: store.isLoading || store.isCachingBackground)
.safeAreaInset(edge: .top, spacing: 0) {
VStack(spacing: 0) {
glassTopBar
groupBanner
errorBanner
} }
.animation(.easeInOut(duration: 0.2), value: store.isLoading || store.isCachingBackground) }
}
.overlay(alignment: .bottomTrailing) { glassFAB } .overlay(alignment: .bottomTrailing) { glassFAB }
.modifier(calendarSheets) .modifier(calendarSheets)
.task { await startup() } .task { await startup() }

View File

@@ -61,7 +61,7 @@ struct WeekView: View {
ForEach(weekDays, id: \.self) { day in ForEach(weekDays, id: \.self) { day in
Text(headerFmt.string(from: day).uppercased()) Text(headerFmt.string(from: day).uppercased())
.font(.system(size: 10, weight: .semibold)) .font(.system(size: 10, weight: .semibold))
.foregroundStyle(cal.isDateInToday(day) ? Color.accentColor : Color(hex: textHex).opacity(secondaryTextOpacity(textContrast))) .foregroundStyle(cal.isDateInToday(day) ? Color(hex: todayHex) : Color(hex: textHex).opacity(secondaryTextOpacity(textContrast)))
.frame(maxWidth: .infinity, minHeight: 36) .frame(maxWidth: .infinity, minHeight: 36)
.overlay(alignment: .trailing) { .overlay(alignment: .trailing) {
Rectangle().fill(Color(hex: lineHex).opacity(gridLineOpacity(lineContrast))).frame(width: 0.5) Rectangle().fill(Color(hex: lineHex).opacity(gridLineOpacity(lineContrast))).frame(width: 0.5)