feat(market): search + pull-to-refresh in the market list

Match the inventory patterns the market was missing:
- Search: OffersState gains a `query` + `visibleOffers` getter and
  OffersCubit.search() filters the already-discovered offers locally by
  summary (case-insensitive), never re-hitting the transport. The filter
  survives a refresh. Rounded search field mirrors inventory's.
- Pull-to-refresh: RefreshIndicator re-runs discovery for the current
  area (empty state included, so a swipe re-scans). Text filter kept.
- i18n: market.searchHint / market.noMatches (en/es/pt).

Note: the shared slang output (strings*.g.dart, incl. the generated
Asturian locale) is regenerated wholesale, so it also carries the
in-progress `ast` locale keys already present in the working tree.
This commit is contained in:
vjrj 2026-07-10 15:40:13 +02:00
parent bd18978aff
commit beb29915d8
11 changed files with 1614 additions and 21 deletions

View file

@ -219,6 +219,9 @@ class Translations$settings$en {
/// en: 'Português'
String get langPt => 'Português';
/// en: 'Asturianu'
String get langAst => 'Asturianu';
/// en: 'About'
String get about => 'About';
@ -1101,6 +1104,12 @@ class Translations$market$en {
/// en: 'No seeds shared near you yet'
String get empty => 'No seeds shared near you yet';
/// en: 'Search these seeds'
String get searchHint => 'Search these seeds';
/// en: 'No shared seeds match your search'
String get noMatches => 'No shared seeds match your search';
/// en: 'Near you'
String get near => 'Near you';
@ -1778,6 +1787,7 @@ extension on Translations {
'settings.langEs' => 'Español',
'settings.langEn' => 'English',
'settings.langPt' => 'Português',
'settings.langAst' => 'Asturianu',
'settings.about' => 'About',
'settings.aboutText' => 'Local-first, encrypted inventory for traditional seeds. AGPL-3.0.',
'settings.aboutOpen' => 'About Tanemaki',
@ -2056,6 +2066,8 @@ extension on Translations {
'market.setAreaBody' => 'Tell the market roughly where you are to see seeds nearby.',
'market.searching' => 'Looking around your area…',
'market.empty' => 'No seeds shared near you yet',
'market.searchHint' => 'Search these seeds',
'market.noMatches' => 'No shared seeds match your search',
'market.near' => 'Near you',
'market.contact' => 'Message',
'market.mine' => 'You',