feat(inventory): local sharing — per-lot share terms, filter and printable catalog

The local half of the original Fase 2 (no network, no Offer entity yet):
- Lot sheet gains a 'do you share it?' choice (gift/swap first, sale last,
  never the default); declaring plenty of abundance reveals it with a nudge.
- Lot lines and list tiles badge shared batches; an 'I share' filter and
  a printable PDF catalog (paper bridge for fairs) round out the view.
- Catalog PDF embeds DejaVu (Latin-ext/Cyrillic/Greek); fonts are a
  per-locale resource like the OCR packs.
This commit is contained in:
vjrj 2026-07-09 22:19:55 +02:00
parent e3ec855630
commit ba87bf2719
20 changed files with 982 additions and 36 deletions

View file

@ -62,6 +62,7 @@ class Translations with BaseTranslations<AppLocale, Translations> {
late final Translations$presentation$en presentation = Translations$presentation$en.internal(_root);
late final Translations$provenance$en provenance = Translations$provenance$en.internal(_root);
late final Translations$abundance$en abundance = Translations$abundance$en.internal(_root);
late final Translations$share$en share = Translations$share$en.internal(_root);
late final Translations$cropCalendar$en cropCalendar = Translations$cropCalendar$en.internal(_root);
late final Translations$needsReproduction$en needsReproduction = Translations$needsReproduction$en.internal(_root);
late final Translations$preservation$en preservation = Translations$preservation$en.internal(_root);
@ -765,6 +766,51 @@ class Translations$abundance$en {
String get runningLow => 'Running low';
}
// Path: share
class Translations$share$en {
Translations$share$en.internal(this._root);
final Translations _root; // ignore: unused_field
// Translations
/// en: 'Do you share it?'
String get add => 'Do you share it?';
/// en: 'Do you share it?'
String get title => 'Do you share it?';
/// en: 'You have plenty — you could share some.'
String get nudge => 'You have plenty — you could share some.';
/// en: 'Just for me'
String get private => 'Just for me';
/// en: 'To give away'
String get gift => 'To give away';
/// en: 'To swap'
String get exchange => 'To swap';
/// en: 'For sale'
String get sell => 'For sale';
/// en: 'I share'
String get filterChip => 'I share';
/// en: 'Print what I share'
String get printCatalog => 'Print what I share';
/// en: 'What I share'
String get catalogTitle => 'What I share';
/// en: 'Catalog saved'
String get catalogSaved => 'Catalog saved';
/// en: 'Cancelled'
String get cancelled => 'Cancelled';
}
// Path: cropCalendar
class Translations$cropCalendar$en {
Translations$cropCalendar$en.internal(this._root);
@ -1588,6 +1634,18 @@ extension on Translations {
'abundance.enoughToShare' => 'Enough to share a little',
'abundance.enoughForMe' => 'Enough for me',
'abundance.runningLow' => 'Running low',
'share.add' => 'Do you share it?',
'share.title' => 'Do you share it?',
'share.nudge' => 'You have plenty — you could share some.',
'share.private' => 'Just for me',
'share.gift' => 'To give away',
'share.exchange' => 'To swap',
'share.sell' => 'For sale',
'share.filterChip' => 'I share',
'share.printCatalog' => 'Print what I share',
'share.catalogTitle' => 'What I share',
'share.catalogSaved' => 'Catalog saved',
'share.cancelled' => 'Cancelled',
'cropCalendar.add' => 'Crop calendar',
'cropCalendar.title' => 'Crop calendar',
'cropCalendar.sow' => 'Sow',