design-system
SKILL.md
Design Tokens
Design tokens are the atomic values of the design system. UI elements MUST use tokens — never raw values.
Colors
- ✅ Use
AppColors.primary,AppColors.secondary,AppColors.error,AppColors.success,AppColors.warning,AppColors.surface,AppColors.textPrimary,AppColors.textSecondary - ❌ NEVER use
Color(0xFF...),Colors.blue, or inline hex values - Map semantic tokens to Material 3
ColorSchemefor platform consistency - Each color token MUST document its use case and ensure WCAG AA contrast ratio
- Support light and dark mode via
ThemeData— never branch onBrightnessmanually in widgets
Spacing
- ✅ Use
AppSpacing.xxs(2),AppSpacing.xs(4),AppSpacing.sm(8),AppSpacing.md(16),AppSpacing.lg(24),AppSpacing.xl(32),AppSpacing.xxl(48) - ✅ Use
AppSpacing.screenHorizontal(24),AppSpacing.screenVertical(16) for consistent screen padding - ❌ NEVER use
EdgeInsets.all(16.0),SizedBox(height: 8), or hardcoded padding values - Use
SizedBox(height: AppSpacing.sm)for gaps — notContainerorPaddingwith empty child
Border Radius
- ✅ Use
AppRadius.xs(4),AppRadius.sm(8),AppRadius.md(12),AppRadius.lg(16),AppRadius.xl(24),AppRadius.full(999) - ❌ NEVER use
BorderRadius.circular(12)or inline radius values
Typography
- ✅ Use
context.textTheme.headlineLarge,context.textTheme.bodyMedium, etc. via theme extensions - ✅ Optionally use
AppTypographywrapper for custom token names mapping toTextTheme - ❌ NEVER use
TextStyle(fontSize: 16)or inline text styles - Define font family, size, weight, and letter spacing as tokens
Iconography
- Use a consistent icon set (Material Icons, Cupertino Icons, or custom icon font)
- Wrap icon usage in
AppIconsconstants for consistency - Use
Icon(AppIcons.settings, size: AppSpacing.lg)— not rawIcons.settings
Reusable Components
Component Rules
- Single Responsibility: Each component has one clear purpose. Complex UIs MUST be composed of smaller, focused components.
- Parameterization: Components expose parameters for customization (text, callbacks, styles). Avoid creating near-duplicate widgets.
- Composition Over Inheritance: Build widgets by composing smaller widgets. Do NOT extend framework widgets unless strictly necessary.
- Immutable Widgets: Design widgets as stateless wherever possible. Manage state externally via BLoC.
- Reuse Threshold: If a widget or pattern appears 2+ times, extract it into
core/views/widgets/. - Testability: Every reusable component MUST have a corresponding widget test in the mirror structure.
Component Organization
core/
├── views/
│ └── widgets/
│ ├── buttons/ (AppPrimaryButton, AppOutlinedButton, AppIconButton)
│ ├── cards/ (AppCard, AppInfoCard, AppActionCard)
│ ├── dialogs/ (AppAlertDialog, AppConfirmDialog)
│ ├── inputs/ (AppTextField, AppSearchField, AppDropdown)
│ ├── feedback/ (AppSnackbar, AppToast, AppEmptyState, AppErrorState)
│ ├── loading/ (AppLoadingIndicator, AppShimmer, AppSkeleton)
│ └── layout/ (AppScaffold, AppSectionHeader, AppDivider)
├── theme/
│ ├── app_colors.dart
│ ├── app_spacing.dart
│ ├── app_radius.dart
│ ├── app_typography.dart
│ ├── app_theme.dart (ThemeData assembly)
│ └── app_theme_extensions.dart (BuildContext extensions)
└── constants/
└── app_icons.dart
Component Best Practices
- All reusable widgets MUST accept
Keyparameter viasuper.key - Use
constconstructors in all reusable components - Provide sensible defaults — components should work with minimal configuration
- Document each public component with
///comment explaining purpose, required params, and an inline usage example
Theming
ThemeData Assembly
- Assemble
ThemeDatain a singleapp_theme.dartfile using token classes - Use
ColorScheme.fromSeed()or map semanticAppColorstoColorSchemeslots - Define both
lightThemeanddarkThemein the same file - Use
ThemeExtension<T>for custom tokens beyond Material's defaults (e.g.,AppSpacing,AppRadius)
Theme Access
- ALWAYS access via
BuildContextextensions:context.colorScheme,context.textTheme,context.theme - NEVER pass theme values as constructor parameters when
contextis available - NEVER use
Theme.of(context)directly — use extensions for readability
Dark Mode
- Every screen and component MUST render correctly in both light and dark mode
- Test dark mode as part of widget tests using
MediaQuerytheme override - Use semantic color tokens (
surface,onSurface,primary,onPrimary) — not absolute colors
Accessibility
- All interactive components MUST include
Semanticslabels - Support minimum touch target size (48x48 dp) per Material guidelines
- Ensure text scales correctly via
MediaQuery.textScaleFactor - Use sufficient color contrast (WCAG AA: 4.5:1 for normal text, 3:1 for large text)
Weekly Installs
4
Repository
dhruvanbhalara/skillsGitHub Stars
14
First Seen
12 days ago
Security Audits
Installed on
opencode4
gemini-cli4
antigravity4
claude-code4
github-copilot4
amp4