diff --git a/CHANGELOG.md b/CHANGELOG.md index 3da06d3..63f339a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,13 +37,29 @@ are no binary releases; "version" tracks the shared `version` in the root build - `InlineTextField` — the borderless tonal text input (capitalization is a parameter). - `OptionCard` — the sanctioned selection-dialog pick. - - `CollapsingScaffold` — the collapsing settings/sub-screen scaffold. + - `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 diff --git a/README.md b/README.md index c817615..2d94e95 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for the full consumption mode | `core-locale` | Android | Per-app language plumbing (`AppLanguage`): read the shipped languages from the app's `res/xml/locales_config.xml`, get/set the applied language via `AppCompatDelegate`, render each language's autonym. The app passes its own `locales_config`; appcompat only, no Compose. | | `core-crash` | Android | Privacy-respecting on-device crash capture + report dialog + issue-tracker hand-off. Parameterized per app via `CrashConfig`. | | `identity` | Android | The M3 Expressive theme factory `FloretExpressiveTheme(…)`, `rememberNavSlideSpec()`, the content transitions (`expandEnter`/`collapseExit`/`itemEnter`/…) and the `predictiveBack` peek. Each app supplies its own seed/palette. | -| `components` | Android | Shared Compose vocabulary + recipes: `GroupedSurface`/`GroupedRow`, `InlineTextField`, `OptionCard`, `CollapsingScaffold`, `OptionPicker`, `pastelize()`, `DialogControls`, `OnboardingScaffold`, `OptionalFormSection`, `AboutCard`, `LanguagePickerRow`. | +| `components` | Android | Shared Compose vocabulary + recipes: `GroupedSurface`/`GroupedRow`, `InlineTextField`, `OptionCard`, `CollapsingScaffold`, `OptionPicker`, `ReorderableColumn`, `DebugRibbon`, `pastelize()`, `DialogControls`, `OnboardingScaffold`, `OptionalFormSection`, `AboutCard`, `LanguagePickerRow`. | _The principle: the **mechanics** are shared, the **look** stays per-app. See [`docs/ROADMAP.md`](docs/ROADMAP.md) for what's extracted, deferred, and @@ -51,7 +51,6 @@ See [`docs/`](docs/) — start with [`docs/README.md`](docs/README.md) ([ARCHITECTURE](docs/ARCHITECTURE.md), [ROADMAP](docs/ROADMAP.md)) and [`CONTRIBUTING.md`](CONTRIBUTING.md) to add or change a module. [`CHANGELOG.md`](CHANGELOG.md) tracks what landed. ->>>>>>> origin/main ## Build diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 85a5cd3..c4a21ec 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -12,6 +12,7 @@ divergent or app-specific code where it lives. | Module | Type | Consumers | |---|---|---| | `core-time` | JVM | Agendula (and Calendula's pending branch) | +| `core-reminders` | JVM | Agendula (and Calendula's pending branch) | | `core-crash` | Android | Agendula | | `identity` | Android | Agendula | | `components` | Android | Agendula | @@ -47,11 +48,14 @@ See [`../CHANGELOG.md`](../CHANGELOG.md) for the contents of each. captured instead at the **component** level (shared `GroupedRow`/section primitives + `CollapsingScaffold` + `OptionPicker`); each app composes its own settings from those. -- **`core-reminders`** (unified) — Agendula self-schedules alarms (pull), - Calendula is provider-event-driven (push). Opposite architectures over - incompatible data models; forcing a shared abstraction would be leaky. A tiny - `core-notification` (idempotent channel setup, `POST_NOTIFICATIONS` checks) - *might* land later; schedulers stay app-local. +- **The reminder *scheduler*** — the shared `core-reminders` module is the + app-agnostic override *model* only (`ReminderOverride` + codec + unit model, + now multi-value). The *delivery* stays app-local: Agendula self-schedules + alarms (pull), Calendula is provider-event-driven (push) — opposite + architectures over incompatible data models, so forcing a shared scheduler + abstraction would be leaky. A tiny `core-notification` (idempotent channel + setup, `POST_NOTIFICATIONS` checks) *might* land later; schedulers stay + app-local. - Domain-specific UI (date/time fields tied to a domain, calendar/timeline widgets, recurrence text, domain pickers) and all string wording — these encode each app's model and resist parameterization.