feat(ui): month card grid + week timeline, wire view switcher
Replace the throwaway debug screen with the first real calendar UI and a functional Month <-> Week switcher, on Material 3 Expressive. Month view (S1): - Material 3 Expressive card-per-day grid; only the current month's weeks render (neighbouring days left blank) - per-day event dots with "+N" overflow, today via primaryContainer - spring-based press feedback from the active motion scheme - swipe + drawer navigation, Loading/Failure/Success states Week view (S2): - vertical time schedule with overlap-resolved lanes (per-day clipping, midnight spanning, instant events) - all-day / multi-day events as connected horizontal spans - single scroll container (gutter + day columns stay aligned), columns bundled in a rounded container, noon-centred on load - top section colour-shifts with the app bar on scroll; swipe navigation, three states Shared / infra: - CalendarHost holds the active view; RootScreen renders it post-permission - ui/common building blocks: CalendarDrawer, CalendarFailure, ViewSwitcherPill, pastelize, observable locale, M3 Expressive slide transition (motionScheme fastSpatialSpec) - unit tests for the week layout (lanes, clipping, all-day spans) - build: compileSdk 37, material3 pinned to 1.5.0-alpha21 for Expressive Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
package de.jeanlucmakiola.calendula.ui
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import de.jeanlucmakiola.calendula.ui.common.CalendarView
|
||||
import de.jeanlucmakiola.calendula.ui.month.MonthScreen
|
||||
import de.jeanlucmakiola.calendula.ui.week.WeekScreen
|
||||
|
||||
/**
|
||||
* Holds the active top-level view (spec M1) and swaps between the calendar
|
||||
* screens. Each screen owns its own ViewModel and date anchor; the view-switcher
|
||||
* pill in their top bars writes back here via [onSelectView].
|
||||
*/
|
||||
@Composable
|
||||
fun CalendarHost(modifier: Modifier = Modifier) {
|
||||
var view by rememberSaveable { mutableStateOf(CalendarView.Month) }
|
||||
val onSelectView: (CalendarView) -> Unit = { view = it }
|
||||
|
||||
when (view) {
|
||||
CalendarView.Week -> WeekScreen(
|
||||
selectedView = view,
|
||||
onSelectView = onSelectView,
|
||||
modifier = modifier,
|
||||
)
|
||||
// Month, plus Day as a fallback until the day view lands (v0.5).
|
||||
else -> MonthScreen(
|
||||
selectedView = view,
|
||||
onSelectView = onSelectView,
|
||||
modifier = modifier,
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user