Commit Graph
37 Commits
Author SHA1 Message Date
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
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
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 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
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 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 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
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
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
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 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 3aa4ceada5 feat(components): let picker content own its scrolling
CollapsingScaffold always wrapped its content in a verticalScroll Column,
which composes every row up front. That suits the short lists these
surfaces normally hold, but it rules out a LazyColumn entirely: nesting a
same-axis scrollable inside it throws, so a caller with a few hundred
options had no way to render them.

Add `scrollable` (default true, so every existing caller is unchanged).
When false the content gets a plain column to fill and brings its own
scrolling container, keeping the insets, IME padding and top-bar collapse
as they were. FullScreenPicker forwards the flag for pickers that need it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 15:31:18 +02:00
makiolajandClaude Opus 4.8 2124227a7f feat(components): add CustomAmountEditor, bump to 0.2.0
Extract the shared presets-plus-custom editor card — tonal surface with the
connected shape, an optional single-choice unit toggle, and an amount field
with a live preview + confirm — used by the reminder, agenda-range and snooze
pickers into one reusable, presentational component.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 18:01:42 +02:00
makiolajandClaude Opus 4.8 e1919cab83 components: FullScreenPicker takes an optional actions slot
Forwards a trailing app-bar `actions` lambda through to CollapsingScaffold,
so a full-screen picker can carry a commit/extra action — a custom-value
Add/OK, a Reset — instead of being select-and-dismiss only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 14:23:07 +02:00
makiolajandClaude Opus 4.8 5a576c4d28 components: FullScreenPicker uses the pinned bar
Completes the picker upstream: FullScreenPicker now passes largeTopBar=false
to CollapsingScaffold, so the family's selection pickers sit under a pinned
single-line bar instead of a tall collapsing header (the short list has nothing
to scroll past). Matches Calendula's scrollable-picker fix; applies family-wide.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 21:47:17 +02:00
makiolajandClaude Opus 4.8 89e3deb9f6 components: extract ReorderableColumn + DebugRibbon
Family-generic widgets upstreamed from Calendula: ReorderableColumn (a
dependency-free drag-to-reorder for the short grouped-card Settings lists; pairs
with GroupedRow(gapBelow=false)) and DebugRibbon (a stark un-themed DEBUG corner
ribbon).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 21:11:25 +02:00
makiolajandClaude Opus 4.8 53217f139e components: largeTopBar, gapBelow, enabled
CollapsingScaffold gains largeTopBar (false = pinned single-line bar, the
picker variant); GroupedSurface/GroupedRow gain gapBelow to suppress the 2dp
inter-row gap for a caller that owns spacing; InlineTextField gains enabled
(disabled dims to a locked value). All additive, defaults preserve behaviour.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-06 21:11:25 +02:00
makiolajandClaude Opus 4.8 d9e4e877cc components: grow GroupedRow + CollapsingScaffold + pickers to the family superset
Promote the richer variants Calendula had kept app-local into the shared kit, as
backward-compatible additions (every new parameter defaults to the prior
behaviour, so Agendula's call sites are unchanged):

- GroupedRow: add `dimmed` (fade headline/summary to M3 disabled emphasis while
  the trailing control stays live — for present-but-off rows) and `container`
  (tonal-colour override, e.g. a category tint).
- CollapsingScaffold: add `actions` (trailing app-bar items), `snackbarHost`,
  and opt-in `predictiveBack` (wires the back-gesture preview to onBack for
  full-screen surfaces that want it).
- FullScreenPicker: thread opt-in `predictiveBack` to the scaffold, and apply
  SOFT_INPUT_ADJUST_NOTHING so a picker's own imePadding lifts the focused field
  instead of leaving a black gap above the keyboard.
- OptionPicker: forward `predictiveBack` and add an optional `header` slot above
  the option rows.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:49:34 +02:00
makiolajandClaude Opus 4.8 09d3f9b934 components: add AboutCard + LanguagePickerRow settings recipes
AboutCard — logo slot + app name/author, a row of outlined link buttons and an
optional tonal highlight link (each opens its URL). LanguagePickerRow — a
GroupedRow that opens the full-screen language picker, backed by core-locale's
AppLanguage. Both parameterized so each app keeps its own strings, logo and row
icon. Adds the components -> core-locale dependency.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:24:17 +02:00
makiolajandClaude Opus 4.8 24ada183e2 components: add OptionalFormSection (revealable form section)
The shared wrapper for optional edit-form fields behind a "More fields" toggle:
AnimatedVisibility with the family's expand+fade motion over a full-width Column.
Adds the first intra-kit dependency (components -> identity) for the shared
transitions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:17:57 +02:00
makiolajandClaude Opus 4.8 1e36c229ca components: add DialogControls (DialogAmountField + DialogUnitDropdown)
The tonal 3-digit amount input and unit dropdown shared by the custom
reminder/recurrence steps — the family's InlineTextField over a tonal surface,
matching the card/grouped-row language. Drawn from Calendula.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 15:15:08 +02:00
makiolajandClaude Opus 4.8 10e0ca0b06 components: add the shared onboarding scaffold recipe
OnboardingScaffold (scrollable hero + body, CTAs pinned to the bottom),
BenefitRow and the OnboardingSpace scale — identical across Agendula and
Calendula. The hero is a slot, so each app keeps its own mark.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:16:48 +02:00
makiolajandClaude Opus 4.8 0db0e3883f components: add CollapsingScaffold + OptionPicker/FullScreenPicker (batch-2)
The family's collapsing settings/sub-screen scaffold and the full-screen
single-select picker built on it (used for theme/list/reminder option dialogs).
Adds material-icons-core (ArrowBack/Check) and a generic 'back' string apps can
override. ReminderFormatting (labels over app-specific R.plurals + per-app
presets) deliberately NOT included — it needs a label-callback API, a separate
pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:24:08 +02:00
makiolajandClaude Opus 4.8 1bd3e03ad5 components: shared Compose vocabulary (GroupedSurface, InlineTextField, OptionCard, pastelize)
Phase 4 (components). The family's canonical grouped-row primitive
(GroupedSurface/GroupedRow + Position/positionOf, press-morphing tonal
container), the borderless InlineTextField (capitalization parameterized),
the OptionCard selection-dialog pick, and the pastelize() colour softener.
All app-agnostic (no R, no domain) and taken from Agendula's versions as the
canonical reference per design sign-off; apps keep their own identity chips
and compose their own screens from these. android-library, Compose-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 13:06:34 +02:00