Compare commits
5 Commits
feat/scrol
...
9bbef911c0
| Author | SHA1 | Date | |
|---|---|---|---|
| 9bbef911c0 | |||
| 75b90d1b3b | |||
| b4954713ff | |||
| df8bdbaf73 | |||
| 9fe655a33b |
16
CHANGELOG.md
16
CHANGELOG.md
@@ -6,10 +6,24 @@ All notable changes to floret-kit are documented here. The format follows
|
||||
floret-kit is consumed **from source** — each app embeds it as a git submodule
|
||||
and builds it through a Gradle composite build, pinning a specific commit. There
|
||||
are no binary releases; "version" tracks the shared `version` in the root build
|
||||
(currently `0.2.0`). Entries are grouped by module.
|
||||
(currently `0.2.1`). Entries are grouped by module.
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.2.1] - 2026-07-17
|
||||
|
||||
### Added
|
||||
|
||||
- **`components`** — `CollapsingScaffold` takes a `scrollable` flag (default
|
||||
`true`, so every existing caller is unchanged). Set it to `false` when the
|
||||
content brings its own scrolling container: the scaffold's own
|
||||
`verticalScroll` composes each row up front and can't host a `LazyColumn`
|
||||
(nesting a same-axis scrollable throws), which ruled out any surface with more
|
||||
options than fit an eager pass. Opting out hands the content a plain column and
|
||||
leaves the insets, IME padding and top-bar collapse as they were.
|
||||
`FullScreenPicker` forwards the flag. Consumed by Calendula's ~600-entry
|
||||
time-zone picker from 2.16.0.
|
||||
|
||||
## [0.2.0] - 2026-07-17
|
||||
|
||||
### Added
|
||||
|
||||
@@ -10,5 +10,5 @@ plugins {
|
||||
|
||||
subprojects {
|
||||
group = "de.jeanlucmakiola.floret"
|
||||
version = "0.2.0"
|
||||
version = "0.2.1"
|
||||
}
|
||||
|
||||
@@ -39,6 +39,8 @@ dependencies {
|
||||
// core-locale backs the language-picker recipe (AppLanguage).
|
||||
implementation(project(":core-locale"))
|
||||
|
||||
implementation(libs.androidx.core.ktx)
|
||||
|
||||
implementation(platform(libs.androidx.compose.bom))
|
||||
implementation(libs.androidx.ui)
|
||||
implementation(libs.androidx.foundation)
|
||||
|
||||
@@ -13,6 +13,8 @@ import androidx.compose.ui.platform.LocalView
|
||||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
import androidx.compose.ui.window.DialogWindowProvider
|
||||
import androidx.core.view.WindowCompat
|
||||
import de.jeanlucmakiola.floret.identity.LocalFloretDarkTheme
|
||||
|
||||
/**
|
||||
* Full-screen scaffold for selection pickers: a full-bleed [Dialog] that reuses
|
||||
@@ -41,14 +43,28 @@ fun FullScreenPicker(
|
||||
decorFitsSystemWindows = false,
|
||||
),
|
||||
) {
|
||||
// The dialog window pans by default when the keyboard opens, which —
|
||||
// A Compose Dialog owns a separate android.view.Window whose bar-icon
|
||||
// appearance is seeded from the XML theme, not from the activity window's
|
||||
// runtime edge-to-edge state — so with decorFitsSystemWindows = false it
|
||||
// draws edge-to-edge under bars whose icons don't match the active theme
|
||||
// (dark icons on a dark picker). Drive the appearance from the runtime
|
||||
// [LocalFloretDarkTheme] so it tracks the in-app light/dark choice even
|
||||
// when that diverges from the system night qualifier.
|
||||
//
|
||||
// Same window also pans by default when the keyboard opens, which —
|
||||
// combined with the content's own imePadding — leaves a fixed black gap
|
||||
// above the keyboard. Switch it to ADJUST_NOTHING so the window stays
|
||||
// full-screen and imePadding alone lifts the focused field.
|
||||
val view = LocalView.current
|
||||
val darkTheme = LocalFloretDarkTheme.current
|
||||
SideEffect {
|
||||
(view.parent as? DialogWindowProvider)?.window
|
||||
?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
|
||||
(view.parent as? DialogWindowProvider)?.window?.let { window ->
|
||||
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
|
||||
WindowCompat.getInsetsController(window, view).apply {
|
||||
isAppearanceLightStatusBars = !darkTheme
|
||||
isAppearanceLightNavigationBars = !darkTheme
|
||||
}
|
||||
}
|
||||
}
|
||||
CollapsingScaffold(
|
||||
title = title,
|
||||
@@ -102,8 +118,18 @@ fun <T> OptionPicker(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The trailing check that marks the chosen row in a full-screen picker — the
|
||||
* family's single selection affordance, so every picker (option, reminder,
|
||||
* agenda range, timezone, calendar, recurrence) marks its selection the same
|
||||
* way. Pair it with `GroupedRow(selected = true)`: the tonal highlight carries
|
||||
* the state at a glance, the check confirms it unambiguously.
|
||||
*
|
||||
* Purely decorative — the row itself owns the semantics, so it takes no
|
||||
* content description.
|
||||
*/
|
||||
@Composable
|
||||
private fun SelectedCheck() {
|
||||
fun SelectedCheck() {
|
||||
Icon(
|
||||
imageVector = Icons.Rounded.Check,
|
||||
contentDescription = null,
|
||||
|
||||
@@ -10,8 +10,19 @@ import androidx.compose.material3.Typography
|
||||
import androidx.compose.material3.dynamicDarkColorScheme
|
||||
import androidx.compose.material3.dynamicLightColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.staticCompositionLocalOf
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
|
||||
/**
|
||||
* The resolved light/dark decision the current [FloretExpressiveTheme] is running
|
||||
* with, carried down the tree so components can align window chrome (e.g. status-
|
||||
* and navigation-bar icon appearance) with the *runtime* theme rather than the
|
||||
* system night resource qualifier — the two diverge whenever an app overrides
|
||||
* light/dark from settings. Defaults to `false` (light) outside a Floret theme.
|
||||
*/
|
||||
val LocalFloretDarkTheme = staticCompositionLocalOf { false }
|
||||
|
||||
/**
|
||||
* The family's Material 3 Expressive theme factory. Honours system light/dark
|
||||
* and Material You dynamic colour (API 31+), falling back to the app-supplied
|
||||
@@ -43,10 +54,12 @@ fun FloretExpressiveTheme(
|
||||
else -> lightScheme
|
||||
}
|
||||
|
||||
CompositionLocalProvider(LocalFloretDarkTheme provides darkTheme) {
|
||||
MaterialExpressiveTheme(
|
||||
colorScheme = colorScheme,
|
||||
typography = typography,
|
||||
motionScheme = MotionScheme.standard(),
|
||||
content = content,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user