docs: multi-value reminders + new components; drop stray README conflict marker

Record core-reminders (multi-value) and the new components in CHANGELOG,
README module table and the ROADMAP extracted list; clarify that only the
reminder *scheduler* stays app-local. Also removes a leftover '>>>>>>> origin/main'
merge-conflict marker committed in README by an earlier merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-06 21:11:25 +02:00
parent 89e3deb9f6
commit 2e47271904
3 changed files with 27 additions and 8 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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.