# Changelog All notable changes to floret-kit are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/). 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.1.0`). Entries are grouped by module. ## [Unreleased] ### Added - **`core-time`** (JVM library) — pure-Kotlin date/time helpers, no Android and no third-party dependencies: - `DayWindow.today()` — local-day boundaries for smart-list logic. - `Instant.formatDate()` / `formatTime()` / `formatDateTime()` — locale- and zone-aware display formatting over `kotlin.time.Instant`. - `TimeBridge` — `Long` epoch-millis ↔ `Instant`, for content-provider I/O. - **`core-crash`** (Android library) — privacy-respecting, on-device crash capture and reporting. Writes an allowlist-only report (app/Android/device version, locale, time, stack trace — nothing else) to private storage and chains to the platform handler; uploads nothing. Includes startup crash-loop detection, a report dialog that shows the full text before it leaves the device, and an issue-tracker hand-off. Per-app specifics (display name, issue URLs) come from a `CrashConfig` supplied at `install()`; each app keeps its own thin themed `CrashReportActivity`. - **`identity`** (Android library) — the family's Material 3 Expressive theme factory `FloretExpressiveTheme(lightScheme, darkScheme, …)` (dynamic colour on API 31+, system light/dark fallback, the standard motion scheme) plus `rememberNavSlideSpec()`. Each app passes its own seed-derived colour schemes and typography — the mechanics are shared, the look is not. - **`components`** (Android library) — the shared Compose component vocabulary: - `GroupedSurface` / `GroupedRow` + `Position` / `positionOf` — the canonical press-morphing tonal grouped-row primitive (the Android-15 settings pattern). - `InlineTextField` — the borderless tonal text input (capitalization is a parameter). - `OptionCard` — the sanctioned selection-dialog pick. - `CollapsingScaffold` — the collapsing settings/sub-screen scaffold; set `largeTopBar = false` for a pinned single-line bar (the picker variant). - `FullScreenPicker` / `OptionPicker` — the full-screen single-select picker. - `ReorderableColumn` — dependency-free drag-to-reorder for the short, fixed grouped-card Settings lists; pairs with `GroupedRow(gapBelow = false)`, which hands the column uniform control of row spacing. - `DebugRibbon` — a stark, un-themed "DEBUG" corner ribbon; gate on `BuildConfig.DEBUG` at the call site. - `InlineTextField` gained `enabled` (a disabled field dims to a locked value). - `pastelize()` — softens a raw provider colour to a theme-fitting pastel. App-agnostic by design: apps compose their own screens and keep their own identity chips/icons. String resources here (e.g. `back`) are fallbacks an app can override. - **`core-reminders`** (JVM library) — the app-agnostic reminder-override model: `ReminderOverride` (`Inherit` / `None` / `Minutes`), where `Minutes` carries a **list** of lead-times so a target can hold several reminders at once (an app that offers a single reminder just uses a one-element list). Map helpers (`reminderOverrideFor`, `reminderLeadsFor`, `applyReminderOverride`, `reminderOverrideForMinutes`, `normalizeReminders`) plus `ReminderOverrideCodec` (three configurable separators; single legacy values round-trip byte-identically) and the lead-time unit model (`ReminderUnit`, `decomposeReminderMinutes`). The labels/presets and the alarm scheduler stay per-app. ### Conventions - **No `foojay` toolchain resolver** anywhere — it can fetch a JDK at build time, which reproducible / official F-Droid builds reject. Modules set `jvmTarget` directly. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md). - AGP 9.x provides built-in Kotlin compilation, so Android modules apply only the Android library + Compose plugins (no separate `kotlin.android`).