Miler rider app: surface system, visible design language, backend lifecycle

Design system
- MilerSurface ladder (canvas → working → raised → floating) with MilerPanel
  as layer 1; canvas moved to #DEE3EA so white separates at 1.290:1.
- Visible vocabulary applied across Home, Deliveries, Activity, Account and
  the sheets: hero heads (tabular numeral + small caption, clamped at 1.3x),
  canvas wells for anything that opens, small filled tags for shelf labels,
  demoted placeholders. Recorded in DESIGN_SYSTEM.md §6.
- One icon family: 222 Material glyphs migrated to Lucide; none left outside
  lib/xpress.
- Colour semantics corrected: amber only for what is genuinely owed, brand red
  reserved for the live stop, disabled primaries go neutral rather than pale.

Data and lifecycle
- lib/data/lifecycle.dart reads mutations for what they prove; route_order.dart
  makes admin sequence the single ordering authority; service_day.dart, and
  stop_area.dart rewritten against live Coimbatore addresses (digit-token
  stripping, city stoplist, street suffixes, stammer collapse).
- countLabel states the load once, in bags.

Testing
- 1440 tests passing; golden shot harnesses for Home, Deliveries, Activity,
  sheets and verify, with test/failures/ now gitignored (diff debris).
- New pins: home_gutter_test, stop_area_test, plus updated structural bounds.

Note: this commit also carries pre-existing working-tree deletions that were
present before this work (API_SPEC.md, README.md, demo test fixtures).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 05:40:35 +05:30
parent c8350563d9
commit d7348e253f
387 changed files with 80693 additions and 12272 deletions

View File

@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:miler/views/helpers/constants/Colorconstants.dart';
import 'package:miler/views/helpers/widgets/app_widgets.dart';
import 'package:miler/views/helpers/constants/Font_constant.dart';
import 'package:miler/widget/Bottom_page.dart';
import 'package:miler/Models/stop_status.dart';
@@ -29,6 +31,15 @@ import 'package:miler/views/helpers/constants/design_constants.dart';
/// So the banner lifts itself clear by [BottomPage.bottomInset]. Both call sites
/// just pin it to `bottom: 0` and let it place itself.
class ActivePickupBanner extends StatefulWidget {
/// The tallest this banner gets, excluding the device inset.
///
/// Declared here because the surface that overlays a list is the only thing
/// that knows how much of the list it covers. The Deliveries queue reserved
/// a flat `80.h` for it — a number measured once, by eye, that every later
/// change to this widget made wrong silently by hiding the last row of the
/// run behind it.
static double get maxHeight => ButtonSizes.primary + 46.h;
final List<Map<String, dynamic>> activePickups;
final void Function(Map<String, dynamic>) onTap;
@@ -166,11 +177,7 @@ class _Card extends StatelessWidget {
color: ColorConstants.pureSurface.withValues(alpha: 0.16),
borderRadius: BorderRadius.circular(DesignConstants.radiusXl),
),
child: Icon(
Icons.two_wheeler_rounded,
color: Colors.white,
size: 22.sp,
),
child: Icon(LucideIcons.bike, color: Colors.white, size: 22.sp),
),
SizedBox(width: 11.w),
Expanded(
@@ -196,7 +203,7 @@ class _Card extends StatelessWidget {
style: TextStyle(
color: Colors.white,
fontSize: 15.sp,
fontWeight: FontWeight.w800,
fontWeight: FontWeight.w700,
letterSpacing: -0.3,
fontFamily: FontConstants.fontFamily,
),
@@ -208,7 +215,7 @@ class _Card extends StatelessWidget {
Row(
children: [
Icon(
Icons.place_rounded,
LucideIcons.mapPin,
color: Colors.white.withValues(alpha: 0.72),
size: 13.sp,
),
@@ -244,7 +251,7 @@ class _Card extends StatelessWidget {
shape: BoxShape.circle,
),
child: Icon(
Icons.arrow_forward_rounded,
LucideIcons.arrowRight,
color: Colors.white,
size: 16.sp,
),
@@ -312,11 +319,11 @@ class _LiveChip extends StatelessWidget {
),
SizedBox(width: 5.w),
Text(
'LIVE',
'Active',
style: TextStyle(
color: Colors.white,
fontSize: 9.sp,
fontWeight: FontWeight.w800,
fontWeight: FontWeight.w700,
letterSpacing: 0.7,
fontFamily: FontConstants.fontFamily,
),