Apply a Material 3 seed-green palette and rounded components across the home, inventory, quick-add, quantity picker and variety-detail screens. The full-screen photo viewer can now set any photo as the cover (via attachment sort order) and delete after confirmation. Lot forms and packaging surface as choice chips. Extract About out of Settings into its own screen (app version via package_info_plus, website link). Add es/en strings for the new lot types, presentation, home tagline and About. Update Seedees v2 mockups.
115 lines
3.9 KiB
Dart
115 lines
3.9 KiB
Dart
import 'package:commons_core/commons_core.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:material_symbols_icons/symbols.dart';
|
||
|
||
import '../db/enums.dart';
|
||
|
||
/// Renders a glyph from the bundled `seedks` icon font, whose characters `a`–`k`
|
||
/// map to seed-themed pictograms (jar, packet, spoon…). See
|
||
/// docs/mockups/seedks-glyphs.png.
|
||
class SeedGlyph extends StatelessWidget {
|
||
const SeedGlyph(this.char, {this.size = 24, this.color, super.key});
|
||
|
||
final String char;
|
||
final double size;
|
||
final Color? color;
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Text(
|
||
char,
|
||
style: TextStyle(
|
||
fontFamily: 'seedks',
|
||
fontSize: size,
|
||
height: 1,
|
||
color: color ?? Theme.of(context).colorScheme.primary,
|
||
),
|
||
);
|
||
}
|
||
}
|
||
|
||
/// Named seedks glyphs (the character each pictogram is mapped to).
|
||
abstract final class SeedGlyphs {
|
||
static const jar = 'a';
|
||
static const jars = 'b';
|
||
static const search = 'c';
|
||
static const share = 'd';
|
||
static const sack = 'e';
|
||
static const smallSpoon = 'f';
|
||
static const bigSpoon = 'g';
|
||
static const mug = 'h';
|
||
static const envelope = 'i';
|
||
static const pouring = 'j';
|
||
static const scattered = 'k';
|
||
}
|
||
|
||
/// The seedks character for a quantity [kind], or null for plant-form/precise
|
||
/// kinds that have no seed pictogram (they fall back to a Material icon).
|
||
String? seedGlyphForKind(QuantityKind kind) => switch (kind) {
|
||
QuantityKind.aFew => SeedGlyphs.scattered,
|
||
QuantityKind.some => SeedGlyphs.smallSpoon,
|
||
QuantityKind.plenty => SeedGlyphs.jars,
|
||
QuantityKind.pinch => SeedGlyphs.scattered,
|
||
QuantityKind.handful => SeedGlyphs.bigSpoon,
|
||
QuantityKind.teaspoon => SeedGlyphs.smallSpoon,
|
||
QuantityKind.spoon => SeedGlyphs.bigSpoon,
|
||
QuantityKind.cup => SeedGlyphs.mug,
|
||
QuantityKind.jar => SeedGlyphs.jar,
|
||
QuantityKind.sack => SeedGlyphs.sack,
|
||
QuantityKind.packet => SeedGlyphs.envelope,
|
||
_ => null,
|
||
};
|
||
|
||
IconData _materialIconForKind(QuantityKind kind) => switch (kind) {
|
||
QuantityKind.grams => Icons.scale_outlined,
|
||
QuantityKind.count => Icons.tag,
|
||
// Seed/fruit forms — each a distinct icon so they're told apart at a glance.
|
||
QuantityKind.cob => Symbols.grass, // mazorca
|
||
QuantityKind.ear => Symbols.grain, // espiga
|
||
QuantityKind.head => Symbols.filter_vintage, // cabezuela
|
||
QuantityKind.seedHead => Symbols.spa,
|
||
QuantityKind.fruit => Symbols.nutrition, // fruto (apple)
|
||
QuantityKind.bulb => Symbols.spa, // bulbo
|
||
QuantityKind.tuber => Symbols.egg, // tubérculo
|
||
QuantityKind.bunch => Symbols.local_florist, // manojo
|
||
// Living material counted as individuals.
|
||
QuantityKind.seedling => Symbols.potted_plant,
|
||
QuantityKind.plant => Symbols.yard,
|
||
QuantityKind.tree => Symbols.park,
|
||
QuantityKind.cutting => Symbols.content_cut,
|
||
QuantityKind.pot => Symbols.yard,
|
||
QuantityKind.tray => Symbols.grid_on,
|
||
_ => Icons.eco_outlined,
|
||
};
|
||
|
||
/// The icon for a lot's [LotType] form (used in the form selector and lot chip),
|
||
/// distinct across all forms so the selector reads clearly.
|
||
IconData iconForLotType(LotType type) => switch (type) {
|
||
LotType.seed => Symbols.eco, // overridden by a seed glyph where shown
|
||
LotType.seedling => Symbols.potted_plant,
|
||
LotType.plant => Symbols.local_florist,
|
||
LotType.tree => Symbols.park,
|
||
LotType.bulb => Symbols.spa,
|
||
LotType.cutting => Symbols.content_cut,
|
||
};
|
||
|
||
/// A consistent icon for a [QuantityKind]: the seed glyph where one exists,
|
||
/// otherwise a Material fallback.
|
||
class QuantityKindIcon extends StatelessWidget {
|
||
const QuantityKindIcon(this.kind, {this.size = 24, this.color, super.key});
|
||
|
||
final QuantityKind kind;
|
||
final double size;
|
||
final Color? color;
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
final glyph = seedGlyphForKind(kind);
|
||
if (glyph != null) return SeedGlyph(glyph, size: size, color: color);
|
||
return Icon(
|
||
_materialIconForKind(kind),
|
||
size: size,
|
||
color: color ?? Theme.of(context).colorScheme.primary,
|
||
);
|
||
}
|
||
}
|