Keyboard Shortcuts

j / kScroll down / up
ggScroll to top
GScroll to bottom
K / /Open search
?Show this help
EscClose search / help
n / NNext / previous section
hGo to landing
dGo to docs
:Command mode — type section name

Press ? or Esc to close

Getting Started

Conventions

Team decisions written down once. No verbal agreements, no tribal knowledge.

Colorscontext.colors.* — never AppColors.* directly
Stringscontext.l10n.t(TranslationKeys.xxx)
SpacingAppSpacing constants — never raw numbers
Tap handlingAppTap — never GestureDetector / InkWell
Loggingsl<Logger>().i/e/w() — never print()
NavigationAppRoutes enum — never hardcoded paths
JSON keyssnake_case from backend → camelCase in Dart
ScreensStatefulWidget — cubit calls in initState only
Stateinitial() factory + copyWith() always present
Data accessCheck isSuccess before accessing response.data

In practice

The same widget, written the right way — tokens for color and space, localized strings, typed navigation, and AppTap for gestures.

lib/features/profile/presentation/widgets/profile_card.dart
AppTap(
  onTap: () => context.go(AppRoutes.profileView.route, pathParameters: {'id': user.id}),
  child: Container(
    margin: EdgeInsets.only(bottom: AppSpacing.md),
    padding: AppSpacing.paddingMd,
    decoration: BoxDecoration(
      color: context.colors.surface,
      borderRadius: AppSpacing.radiusMd,
    ),
    child: Text(
      context.l10n.t(TranslationKeys.profileName),
      style: AppTypography.bodyMdRegular.copyWith(color: context.colors.textPrimary),
    ),
  ),
);
sam's arch — A Pragmatic Flutter Architecture