feat(meezi_app): Meezi green theme + rich discovery API (Koja parity, code-only)
CI/CD / CI · API (dotnet build + test) (push) Successful in 42s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 37s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m5s
CI/CD / CI · Admin Web (tsc) (push) Successful in 38s
CI/CD / CI · Website (tsc) (push) Successful in 45s
CI/CD / CI · Koja (tsc) (push) Successful in 50s
CI/CD / Deploy · all services (push) Successful in 23s

Head-start on the Koja-Flutter build while pub access is unavailable (pub.dev 403
under sanctions). NOT yet built/verified — needs `flutter create` + `pub get` once
package access is restored.

- core/theme/app_theme.dart: centralized MeeziTheme (brand green #0F6E56, Material 3,
  filled/outlined buttons, inputs), wired into main.dart (was a brown seed, no theme).
- public_api.dart: discover() gains the full filter set (themes/vibes/occasions/
  spaceFeatures/noise/priceTier/size/openNow) + discoverNearby/nlpParse/discoverTaxonomy,
  matching the web Koja's backend surface. Follows the existing dio pattern.
This commit is contained in:
soroush.asadi
2026-06-03 07:33:12 +03:30
parent 45dab8b253
commit 1d79dde5e1
3 changed files with 133 additions and 4 deletions
@@ -0,0 +1,76 @@
import 'package:flutter/material.dart';
/// Meezi brand palette. Green #0F6E56 matches the dashboard / Koja web.
class MeeziColors {
static const Color brand = Color(0xFF0F6E56);
static const Color brandDark = Color(0xFF0B5544);
static const Color accent = Color(0xFFE1F5EE);
static const Color surface = Color(0xFFF9FAFB);
}
/// Centralized Meezi theme. Uses Vazirmatn when the font is bundled (see pubspec);
/// falls back to the platform font otherwise. Kept to stable Material 3 APIs.
class MeeziTheme {
static ThemeData light() {
final scheme = ColorScheme.fromSeed(
seedColor: MeeziColors.brand,
primary: MeeziColors.brand,
brightness: Brightness.light,
);
return ThemeData(
useMaterial3: true,
colorScheme: scheme,
fontFamily: 'Vazirmatn',
scaffoldBackgroundColor: MeeziColors.surface,
appBarTheme: const AppBarTheme(
elevation: 0,
centerTitle: true,
backgroundColor: Colors.white,
foregroundColor: Colors.black87,
),
filledButtonTheme: FilledButtonThemeData(
style: FilledButton.styleFrom(
backgroundColor: MeeziColors.brand,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 14, horizontal: 18),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
),
outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom(
foregroundColor: MeeziColors.brand,
side: const BorderSide(color: MeeziColors.brand),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: Colors.white,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.black.withValues(alpha: 0.10)),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: Colors.black.withValues(alpha: 0.10)),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: MeeziColors.brand, width: 1.5),
),
),
);
}
static ThemeData dark() {
final scheme = ColorScheme.fromSeed(
seedColor: MeeziColors.brand,
brightness: Brightness.dark,
);
return ThemeData(
useMaterial3: true,
colorScheme: scheme,
fontFamily: 'Vazirmatn',
);
}
}