feat(ux): usable amounts, colour-coded category/form chips, currency quick-picks
Four usability passes across the everyday flows: - Quantity picker: a countable unit (cob/pod/ear…) now defaults to 1 and the stepper clamps at a minimum of 1 — you can never store 'a cob' with a blank/zero figure. Vibe units (a few) still carry no number. - Category & form chips are colour-coded (new category_palette.dart): a small muted earthy palette maps each botanical family to a STABLE tonality (fill + readable ink), and each lot form gets its own tone. Applied to the inventory filter bar (now grouped attributes | forms | families, separated by a hairline), the list's category headers (a matching colour dot), and the lot-form selector. - Sale currency: quick-pick chips (€ · Ğ1 · hours) fill the field in one tap — Ğ1 offered quietly among familiar options, never imposed — while free text still takes anything else. New i18n key sale.hours (en/es/pt/ast). Tests: quantity_picker_test (default-1, clamp, vibe, clear-still-1), category_palette_test (stable/distinct swatches); overflow guard + the inventory widget tests stay green.
This commit is contained in:
parent
e2665c27d4
commit
5b487ba1ec
15 changed files with 364 additions and 53 deletions
|
|
@ -132,14 +132,31 @@ class _SaleSheetState extends State<_SaleSheet> {
|
|||
controller: _currency,
|
||||
decoration: InputDecoration(
|
||||
labelText: t.sale.currency,
|
||||
helperText: t.sale.currencyHint,
|
||||
helperMaxLines: 2,
|
||||
border: const OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (_) => setState(() {}),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
// Quick picks so a currency is one tap. Ğ1 sits quietly among the
|
||||
// familiar ones — offered, never imposed — and free text still takes
|
||||
// anything else.
|
||||
Wrap(
|
||||
spacing: 8,
|
||||
children: [
|
||||
for (final c in ['€', 'Ğ1', t.sale.hours])
|
||||
ChoiceChip(
|
||||
key: Key('sale.currencyChip.$c'),
|
||||
label: Text(c),
|
||||
selected: _currency.text.trim() == c,
|
||||
onSelected: (sel) => setState(() {
|
||||
_currency.text = sel ? c : '';
|
||||
}),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
TextField(
|
||||
key: const Key('sale.note'),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue