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:
@@ -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)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() }
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user