Converge sibling branches into main (0.7.0) (#11)

Brings the branches the sibling apps actually ship from back onto main, so floret-kit stops forking per project.

Merged in:
- `vouch/settings` (what vouch pins), which already contains `feat/clockula` (what clockula pins) and `chore/deps-2026-10`: core-prefs, core-di, CollapsingScaffold FAB/no-back slots, the glance module, LocaleManager on API 33+, and the dependency bump
- `feat/glance-module`: the three glance commits clockula's branch didn't have yet (progress ring/tile/check button, expressive shapes + header pill, WidgetDoneState)

Both merged without conflicts. Version ends up at 0.7.0 (untagged).

Heads-up for consumers: the deps bump moves the toolchain to Gradle 9.8.0 / AGP 9.4.1 / Kotlin 2.4.20. Since floret-kit is a composite build, a consumer must be on Gradle >= 9.6 to pin anything from here on. Calendula builds, tests and lints against this branch with just that toolchain bump, no source changes.

Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/11
This commit is contained in:
Jean-Luc Makiolaandmakiolaj committed 2026-10-07 09:36:15 +02:00
1 parent 318aeab6bd
commit 8b33635a85
55 files changed
+2517 -80

No files matched your search

+15 -1
View File
@@ -74,6 +74,8 @@ should scan the submodule's Gradle scripts (see §5).
|---|---|---|
| Plumbing | `core-time` (JVM) | Pure logic; no Android, no deps. |
| Plumbing | `core-crash` (Android) | Self-contained subsystem; parameterized per app. |
| Plumbing | `core-prefs` (Android) | Typed DataStore layer. The store's name and construction stay with the app. |
| Plumbing | `core-di` (JVM) | Dispatcher/scope qualifiers + their Hilt module. The only module that knows about DI. |
| Design — identity | `identity` (Android) | Theme factory + motion. App supplies seed/palette. |
| Design — components | `components` (Android) | Shared Compose primitives. App composes screens. |
@@ -93,7 +95,7 @@ Two kinds of module:
- **JVM library** (`core-time`) — `org.jetbrains.kotlin.jvm`, `jvmTarget = 17`,
JUnit 5 + Truth tests. The right home for pure logic; cheapest to build and
test.
- **Android library** (`core-crash`, `identity`, `components`) —
- **Android library** (`core-crash`, `core-prefs`, `identity`, `components`) —
`com.android.library` + the Compose plugin, `compileSdk 37` / `minSdk 29`.
> **AGP 9.x provides built-in Kotlin compilation.** Android modules therefore
@@ -101,6 +103,18 @@ Two kinds of module:
> **not** a separate `org.jetbrains.kotlin.android` plugin (applying it errors).
> They set `jvmTarget` directly in a `kotlin { compilerOptions { … } }` block.
> **An Android module with no Compose in it applies only `com.android.library`**
> — `core-prefs` is the first such module. The Compose plugin is added per
> module, when the module actually has composables.
> **`core-di` is the one module carrying an annotation processor** — the KSP
> plugin plus `hilt-compiler`. A `@Module @InstallIn(...)` only reaches a
> consuming app's Hilt component if the *library* is processed: the app's
> processor reads `@AggregatedDeps` metadata off the classpath, it does not
> reprocess library sources. As a non-Android module it uses `hilt-core` +
> `hilt-compiler` rather than the Android Hilt Gradle plugin. Every other module
> stays DI-free.
Versions live in [`gradle/libs.versions.toml`](../gradle/libs.versions.toml),
kept in lockstep with the apps' catalogs.
+2 -1
View File
@@ -3,7 +3,8 @@
floret-kit is the shared **Material 3 Expressive design system + plumbing** for
the Floret family of Android apps
([Calendula](https://gitea.jeanlucmakiola.de/makiolaj/calendula),
[Agendula](https://gitea.jeanlucmakiola.de/makiolaj/agendula), and future
[Agendula](https://gitea.jeanlucmakiola.de/makiolaj/agendula),
[Clockula](https://gitea.jeanlucmakiola.de/makiolaj/clockula), and future
siblings). It is consumed from source as a git submodule + Gradle composite
build. See the top-level [`../README.md`](../README.md) for the pitch.
+15 -5
View File
@@ -15,20 +15,28 @@ divergent or app-specific code where it lives.
| `core-reminders` | JVM | Agendula (and Calendula's pending branch) |
| `core-locale` | Android | Agendula, Calendula |
| `core-crash` | Android | Agendula |
| `core-prefs` | Android | Clockula |
| `core-di` | JVM | Clockula |
| `identity` | Android | Agendula |
| `components` | Android | Agendula |
| `glance` | Android | Agendula (Calendula pending — its own M3 Expressive widget pass) |
See [`../CHANGELOG.md`](../CHANGELOG.md) for the contents of each.
### Follow-ups on what's extracted
- **Migrate Calendula and Agendula onto `core-prefs` + `core-di`** — Clockula
triggered the extraction (the third app that made the duplication hurt) and is
its only consumer today. Both siblings still carry their own `ThemeMode`,
`toEnum()` and `@IoDispatcher`. The stored key names are identical
(`theme_mode`, `dynamic_color`), so each migration is a code change with **no
data migration** — deliberately out of scope for the extraction, and done by
each sibling when it next re-pins the kit.
---
## Deferred / not yet worth it
- **`core-prefs`** (DataStore base: `ThemeMode`, `dynamicColor`, the typed
wrapper, `toEnum()`) and **`core-di`** (`@IoDispatcher` + provider) — genuinely
shared but **low value**: pure relocation, no new capability, the shared
surface is tiny once the store name and bindings stay app-local. Sensible to
defer until a third app makes the duplication hurt.
- **`ReminderFormatting`** (`ReminderUnit` + `reminderLeadTimeLabel` +
`decomposeReminder`) — the labels are `@Composable` over app-specific
`R.plurals`, and the presets differ per app. Extract later behind a
@@ -66,6 +74,8 @@ See [`../CHANGELOG.md`](../CHANGELOG.md) for the contents of each.
## Consumers & cadence
- **Agendula** consumes the kit on `main` (active development).
- **Clockula** consumes the kit on `main` (active development); the first
consumer of `core-prefs` and `core-di`.
- **Calendula** (ships via official F-Droid reproducible builds) has a pending
adoption branch. Bringing it onto the kit is where the canonical-`GroupedSurface`
convergence becomes visible, and where the F-Droid reproducibility checklist