Commit Graph
86 Commits
Author SHA1 Message Date
Jean-Luc Makiola 0b44d353d2 Merge pull request 'feat(components): revealOnFocus' (#12) from feat/reveal-on-focus into main
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/12
2026-10-09 12:04:21 +02:00
makiolaj 675724411e feat(components): revealOnFocus keeps a focused input group above the keyboard
On by default in InlineTextField, GroupedSurface and OptionalFormSection.
2026-10-09 11:50:25 +02:00
Jean-Luc Makiolaandmakiolaj 8b33635a85 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
2026-10-07 09:36:15 +02:00
Jean-Luc Makiola 318aeab6bd Merge predictive-back fixes 2026-09-30 13:32:24 +02:00
makiolaj b7e73ee880 Spring back a cancelled back preview even though its job is cancelled 2026-09-27 12:11:10 +02:00
makiolaj 1d6b1ed2a9 Drop the back preview when the surface is shown again 2026-09-27 12:06:45 +02:00
makiolaj 1ab46897c3 Finish predictive back from the scaled preview 2026-09-27 11:21:29 +02:00
Jean-Luc Makiola db4be68dad Merge pull request 'floret-kit 0.4.0' (#8) from feat/agendula-1.0 into main 2026-09-24 16:29:03 +02:00
makiolaj ffca74791f release: floret-kit 0.4.0 2026-09-24 16:25:14 +02:00
makiolaj a344b2aa04 Merge remote-tracking branch 'origin/main' into feat/agendula-1.0
# Conflicts:
#	CHANGELOG.md
2026-09-24 16:24:52 +02:00
makiolaj 94cb850fa4 core-time: optional 12/24-hour override for formatTime and friends 2026-09-23 18:15:12 +02:00
makiolaj 8ed9b1dbdc components: ReorderableColumn resists dragging past the ends 2026-09-23 17:24:36 +02:00
makiolaj 1e49fd5067 components: ReorderableColumn drag shadow follows the card 2026-09-23 17:13:07 +02:00
makiolaj d5f5ad7b9d components: ReorderableColumn row height parameter 2026-09-23 16:51:55 +02:00
Jean-Luc Makiola 14c13bae6d Merge pull request 'fix(core-crash): file the prefilled crash issue in English' (#7) from fix/crash-issue-english into main 2026-09-12 15:14:00 +02:00
makiolaj ae5b7548d0 fix(core-crash): file the prefilled crash issue in English
The issue the crash flow prefills took its title and body from string
resources, so both followed the device language: a crash on a French
phone opened the tracker with a French issue, which is unreadable to
whoever has to triage it. The report itself was always English — only
the wrapper around it wasn't.

That text is posted rather than shown, so it is no longer a resource at
all: title and body are fixed English in CrashReportSubmit, and
CrashConfig drops issueTitle (apps pass one fewer argument and can
delete their own crash_report_issue_title / crash_report_body_* strings).
What the reporter sees in the app — the dialog, the toasts, the
clipboard label — stays translated, which is the line the kdoc and the
resource header now draw.
2026-09-12 15:12:23 +02:00
makiolaj 103a37cb28 components: numbered instruction steps
A connected list for a procedure the user has to carry out somewhere
else. Collapsible, so it can be shown again as a reference once it has
already had a screen of its own.
2026-09-09 20:57:53 +02:00
makiolaj 97b4d24724 fix(components): take the section header's metrics from Calendula's
The header was invented here rather than converged from the app that
already had one. Calendula's SectionHeader is labelLarge at top 16 /
bottom 4, and separates one group from the next with the caller's own 8dp
spacer — a hub's first header follows the About card, not another group,
so the gap cannot live on the header. Matched exactly, so the two apps'
settings hubs are the same page.
2026-09-09 15:33:53 +02:00
makiolaj 1af24841ae feat(components): a named header above a run of grouped rows
A settings page with a dozen categories in one flat run has no way to say
which of them are about how the app behaves and which are about the app
itself. GroupedSectionHeader is that label: it starts on GroupedListInset,
the edge the cards it names start on, and owns the gap to the group above,
so a page writes header-then-rows and nothing else.

primary rather than onSurfaceVariant — after the Android-15 settings
pattern Position already follows, and because a header that matches the
summaries underneath it stops separating anything.
2026-09-09 15:17:56 +02:00
makiolaj d7b7a542cd feat(components): the preview picker's plate and scaled screen preview
ScaledViewPreview measures real screen composables at a phone viewport and
scales the finished layout down; ViewPreviewFrame is the tonal plate it sits
on, cross-fading between options at the grouped rows' width and radius so
preview and options read as one stack.

Converged from Calendula's view and month-style choosers, where the pattern
was invented, and now Agendula's quick-add step. The viewport height is a
parameter here rather than a calendar-shaped constant.
2026-09-09 13:48:24 +02:00
makiolaj 692c0a84c4 feat(components): let a tinted grouped row name its content colour
GroupedRow's container had no `on*` pair, so a row given a tint kept its
text on onSurface — readable by luck rather than by the theme. Wanted by a
status row that colours itself by outcome.
2026-09-09 13:48:17 +02:00
makiolaj 3dc3448265 feat(components): let an inline text field mask its value
KeyboardType.Password only tells the IME to drop suggestions; without a
visual transformation a borderless password field renders the secret in
the clear.
2026-09-07 18:39:39 +02:00
Jean-Luc Makiola ad440e8cac Merge pull request 'Resolve the applied locale back onto a shipped tag' (#5) from fix/language-picker-tag-match into main
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/5
2026-08-11 18:08:04 +02:00
makiolaj c6071239ce Resolve the applied locale back onto a shipped tag
The per-app-language store re-parses the applied locale through ICU and
fills in the implied script, so a zh-CN choice reads back as zh-Hans-CN and
no longer matches the tag the picker offers — the selected row lost its
mark after a restart. currentTag(supported) maps it back.
2026-08-11 18:05:33 +02:00
makiolaj 05c79f2afc release: floret-kit 0.3.0
Two new components since 0.2.1 — the onboarding shell (OnboardingScaffold,
OnboardingProgress, BenefitRow) that Calendula's first-run wizard is built
on, and SnackChip, the compact confirmation converged from Agendula's and
Calendula's undo chips — plus grouped-list and picker richness (long-press
rows, styled row text, exported GroupedListInset, per-option summaries,
public SelectedCheck, AboutCard in a group) and two fixes: all-day values
rendering a day early west of UTC, and full-screen picker bar icons
following the XML theme rather than the running one.

The changelog had gone unwritten since 0.2.1; this backfills every entry.
2026-08-10 17:20:57 +02:00
Jean-Luc Makiola 4e0b97538a Merge pull request 'feat(components): navigation slot, full-bleed content and scrolling actions for the onboarding shell' (#4) from feat/onboarding-shell into main 2026-08-10 17:18:47 +02:00
makiolaj 1705e67eeb feat(components): let scrolling actions inherit the content inset
Pinned actions keep their own 24dp margin; scrolling ones sit inside the
content column, so the caller's inset decides how wide they run.
2026-08-10 17:17:16 +02:00
makiolaj 98dcaf09ad feat(components): let the onboarding actions scroll with the content
A step whose content is taller than the screen loses room to a pinned bar,
and the bar hides that there is more below it. scrollingActions moves the
call-to-action stack to the end of the scrolling column instead.
2026-08-10 17:17:16 +02:00
makiolaj a366ca9188 feat(components): navigation slot and full-bleed content for the onboarding shell
A step that can be stepped back from passes navigationIcon. The slot's
width is reserved whether or not it is filled, and mirrored on the other
side, so the progress stays centred as steps come and go.

contentPadding lets a step built from grouped rows drop the column's own
inset, since those rows carry their own.
2026-08-10 17:17:16 +02:00
Jean-Luc Makiola 63661b9a7e Merge pull request 'feat(components): step progress for the onboarding scaffold' (#3) from feat/onboarding-progress into main
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/3
2026-08-10 17:13:00 +02:00
makiolaj b36c330ada feat(components): step progress for the onboarding scaffold
A multi-step flow passes a progress slot, pinned above the scrolling
content, and OnboardingProgress draws it as one capsule per step with the
caller's own localised label. topSpacing lets a step whose hero is a large
picture rather than a mark keep the content on one screen.
2026-08-08 21:01:52 +02:00
makiolaj ea860ed781 Merge feat/grouped-row-rich-text for Calendula's pin 2026-08-08 16:24:39 +02:00
makiolaj fd1f283b77 feat(components): let a grouped row carry styled text
GroupedRow took plain Strings, so a caller that needs emphasis inside the
title or summary — a search hit marking what it matched — had no way in short
of rebuilding the row. Adds an AnnotatedString overload and delegates the
String one to it.
2026-08-08 16:24:39 +02:00
makiolaj b9475688a8 Merge feat/grouped-row-long-press for Calendula's pin 2026-08-02 20:56:04 +02:00
makiolaj 3134098965 feat(components): let a grouped row take a long-press
GroupedSurface/GroupedRow gain onLongClick (with the platform long-press
haptic), for lists that enter a selection mode from a row — Calendula's
search results (#80).
2026-08-02 20:55:57 +02:00
Jean-Luc Makiola e047a2bd48 Merge pull request 'feat(components): share the undo snack chip' (#2) from feat/snack-chip into main 2026-08-02 20:45:18 +02:00
makiolaj 71a4f371b6 Merge feat/picker-richness for Calendula's pin 2026-08-02 18:27:33 +02:00
makiolaj b08fb69843 feat(components): spring the snack chip open
A slide-in is clipped to the animating bounds, so at pill size the chip
looked painted on from one edge. It now springs from its anchored corner on
the expressive fast specs, which are also quicker than the default
visibility spring.
2026-08-02 18:27:32 +02:00
makiolaj b614e427df feat(components): share the undo snack chip
Agendula's swipe-delete chip and Calendula's reschedule confirmation were
the same pill twice. Placement and timing stay with the caller; the shared
one keeps the polite live region and takes a maxWidth so the message can't
run into a bottom-end FAB.
2026-08-02 18:19:14 +02:00
Jean-Luc Makiola fc4ff6b7dc Merge pull request 'fix(core-time): render all-day values in UTC, not the device zone' (#1) from fix/all-day-utc-formatting into main
Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/1
2026-08-02 17:47:19 +02:00
makiolajandClaude Opus 5 ed1d3ca5e8 feat(components): let AboutCard join a grouped list
AboutCard drew its own Surface, so it could only stand alone. Taking a
Position and rendering through GroupedSurface lets it be the top of a group
with rows continuing underneath — for apps whose call to action reads better
as a row of its own than as a tonal button inside the card.

Defaults to Position.Alone, so existing callers are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 21:12:37 +02:00
makiolajandClaude Opus 5 38e508b259 feat(components): export the grouped-list inset as GroupedListInset
The 16dp a grouped list keeps from the screen edge was a private literal in
GroupedRow, so everything that sits outside the cards but belongs to them —
section headers, hints, picker descriptions — had to repeat the number and
had quietly drifted to 24dp in places, leaving pages with two ragged left
margins. Exporting it gives those callers the one value to take.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 21:12:37 +02:00
makiolajandClaude Opus 5 bb3ff1f316 feat(components): give OptionPicker a per-option summary slot
A picker row often names something it doesn't spell out — a range's dates, a
reminder's firing time, what "follow the system" resolves to today. The
summary slot puts that under the label, so every option shows its effect at
once and stays comparable, without the cost of a live preview.

The KDoc now also states the three rungs of picker richness (plain rows /
per-option summary / live preview) and the rule that a preview picker must
not close on selection, since closing hides the thing it exists to show.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 21:12:37 +02:00
makiolaj b4d3ead8f0 Merge pull request 'fix(components): match full-screen picker bar icons to the runtime theme' (#3) from fix/picker-bar-icon-appearance into main 2026-07-24 15:24:12 +00:00
makiolajandClaude Opus 4.8 9bbef911c0 fix(components): match full-screen picker bar icons to the runtime theme
A Compose Dialog owns its own Window whose status/navigation-bar icon
appearance is seeded from the XML theme, not from the host activity's
runtime edge-to-edge state. With decorFitsSystemWindows = false the
FullScreenPicker draws under the bars, exposing icons that don't match
the active theme — dark icons on a dark picker (near-invisible), and the
mirror-image nav-bar bug in light theme.

Expose the resolved light/dark decision from FloretExpressiveTheme as
LocalFloretDarkTheme and drive the dialog window's
isAppearanceLight{Status,Navigation}Bars from it, so the appearance
tracks the in-app light/dark choice even when it diverges from the
system night resource qualifier.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 17:11:16 +02:00
makiolajandClaude Opus 4.8 396e538903 fix(core-time): render all-day values in UTC, not the device zone
All-day items are date-only in iCalendar and are stored as UTC midnight of
their calendar date — the convention the tasks and calendar providers read
back (OpenTasks resolves them through DateTime.toAllDay(), which discards the
time and resolves the remaining date against UTC).

formatDate/formatDateTime/formatDateTimeCompact resolved every instant against
ZoneId.systemDefault(), so an all-day value rendered as the *previous* day for
anyone west of UTC: a task stored as 2026-07-20T00:00Z showed as 19 Jul in New
York. East of UTC it happened to land on the right day, which is why this went
unnoticed.

formatDate now takes an allDay flag (defaulting to false, so existing call
sites are unaffected) and all-day values resolve against UTC.

Callers must pass allDay at the call site — agendula and calendula both have
sites that need updating.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 22:09:28 +02:00
makiolaj 75b90d1b3b Merge pull request 'feat(components): expose SelectedCheck as a family primitive' (#2) from feat/selected-check-primitive into main 2026-07-20 13:27:22 +00:00
makiolajandClaude Opus 4.8 b4954713ff feat(components): expose SelectedCheck as a family primitive
The trailing check that marks a chosen row in a full-screen picker was
private to OptionPicker, so every consumer hand-rolled its own copy.
Calendula alone carried five, and they had drifted: the kit drew
Icons.Rounded.Check, all five app copies drew Icons.Default.Check.

Make it public with KDoc so pickers share one selection affordance
instead of re-deriving it. Rounded wins, as the kit's existing choice.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 15:17:29 +02:00
makiolajandClaude Opus 4.8 df8bdbaf73 release: floret-kit 0.2.1
Adds components' `scrollable` opt-out on CollapsingScaffold (and its
FullScreenPicker passthrough), so a picker with more options than an
eagerly composed column can carry can drive its own LazyColumn.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v0.2.1
2026-07-17 15:36:44 +02:00
makiolaj 9fe655a33b Merge branch 'feat/scrollable-scaffold' into main 2026-07-17 15:36:21 +02:00