condis Design System

Condis Design System

Source of truth for all visual decisions across the Flutter mobile app and the web. Every colour, spacing value, and component pattern is documented here.

Last updated: 2026-04-11 · Mobile → Web token parity

1. Brand Colors

Primary (Condis Red)

The primary brand colour is a warm red-orange (#E63946), chosen for colorblind accessibility — distinguishable from greens and blues even with deuteranopia/protanopia.

50#FFF1F2
100#FFE1E3
200#FFC7CB
300#FF9FA6
400#FF6B77
500 (Primary)#E63946
600#D62839
700 (Dark)#B8232E
800#991F28
900#7A1C23

Neutrals

White#FFFFFF
Gray 50#FAFAFA
Gray 100#F5F5F5
Gray 200#EEEEEE
Gray 300#E0E0E0
Gray 400#BDBDBD
Gray 500#9E9E9E
Gray 600#757575
Gray 700#616161
Gray 800#424242
Gray 900#212121
Black#000000

Semantic Colors

Success#10B981
Warning#F59E0B
Error (= Primary)#E63946
Info#3B82F6

Dark Mode

Background#121212
Surface#1E1E1E
Surface Variant#2A2A2A
Border#3A3A3A

2. Typography

Font Family

Mobile: System default (Roboto on Android, SF Pro on iOS) via Material 3
Web: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif

Cross-platform: Both platforms use the OS system font. No custom web fonts are loaded — this ensures fast loading and native feel.

Type Scale (Material 3)

Display Large57px / 3.5625rem
Condis
Headline Small24px / 1.5rem
Section heading
Title Large22px / 1.375rem
Card title
Title Medium16px / 1rem
Subtitle or label
Body Large16px / 1rem
Default body text for paragraphs
Body Medium14px / 0.875rem
Secondary body text
Body Small12px / 0.75rem
Captions and helper text
Label Large14px / 0.875rem
Button label
Label Small11px / 0.6875rem
Smallest labels

Web CSS Tokens

--text-display:   3.5625rem  /* 57px */
--text-headline:  1.5rem     /* 24px — section titles */
--text-title-lg:  1.375rem   /* 22px — card titles */
--text-title:     1rem       /* 16px — subtitles */
--text-body:      1rem       /* 16px — body text */
--text-body-sm:   0.875rem   /* 14px — secondary text */
--text-label:     0.75rem    /* 12px — labels, captions */
--text-label-sm:  0.6875rem  /* 11px — smallest labels */

3. Spacing

Based on a 4px base unit. Canonical values from design_tokens.dart.

xs
4px
sm
8px
md
12px
lg
16px
xl
24px
xxl
32px

CSS Tokens

--space-xs:  4px;   /* 0.25rem — tight gaps, icon padding */
--space-sm:  8px;   /* 0.5rem  — compact spacing, inline gaps */
--space-md:  12px;  /* 0.75rem — default content padding */
--space-lg:  16px;  /* 1rem    — section padding, card padding */
--space-xl:  24px;  /* 1.5rem  — large gaps, section margins */
--space-xxl: 32px;  /* 2rem    — page-level margins */

4. Border Radius

0
none
4px
sm
8px
md
12px
lg
16px
xl
circle
Cards use 12px (lg), buttons/inputs use 8px (md), chips use 4px (sm). This is consistent across mobile and web.

CSS Tokens

--radius-none:   0;
--radius-sm:     4px;   /* chips, small elements */
--radius-md:     8px;   /* buttons, inputs */
--radius-lg:     12px;  /* cards, dialogs */
--radius-xl:     16px;  /* large cards, bottom sheets */
--radius-circle: 999px; /* avatars, circular buttons */

5. Elevation & Shadows

Condis uses a flat design with minimal shadows. Cards are delineated by borders (1px solid) rather than drop shadows.

none
None Default
sm
Small 0 1px 2px
0.05 opacity
md
Medium 0 2px 4px
0.08 opacity
lg
Large 0 4px 8px
0.12 opacity

6. Components

Buttons

VariantBackgroundTextBorderRadius
Primary#E63946WhiteNone12px
Secondarygray-200PrimaryNone12px
OutlinedTransparentOn-surface1px outline12px
TextTransparentPrimaryNone
Disabledgray-300gray-500None12px
Padding: 12px 24px (vertical × horizontal). Loading state: Replace text with circular progress indicator.

Cards

Default Card

Flat design, 1px border, 12px radius, 16px padding. Elevation is always 0 — no box shadow.

Hover State

On hover: slight background tint and translateY(-2px). Border colour shifts to primary at 20% opacity.

Content Card

Used for feature cards, program cards, exercise cards. Same border + radius pattern everywhere.

PropertyValueToken
BackgroundWhite (light) / surface (dark)--card-bg
Border1px solid outline-variant--card-border
Radius12px--radius-lg
Padding16px--space-lg
Elevation0 (flat)--shadow-none
Hover BGWhite at 8% opacity--card-hover

Inputs

StateBackgroundBorderRadius
DefaultSurface container1px solid outline12px
FocusedSurface container2px solid primary12px
ErrorSurface container2px solid error12px

7. Icon Sizes

xs 16px
sm 20px
md 24px
lg 32px
xl 48px
xxl 64px
TokenSizeUsage
xs16pxInline indicators
sm20pxButton icons, list icons
md24pxDefault, navigation
lg32pxFeature icons
xl48pxHero / empty state icons
xxl64pxSplash, onboarding

8. Animation & Transitions

TokenDurationUsageCSS Variable
Fast150msMicro-interactions, toggles, hover states--transition-fast
Normal300msPage transitions, reveals, modals--transition-normal
Slow500msElaborate animations, hero entrances--transition-slow

Mobile Curves (Flutter)

NameCurveUsage
StandardeaseInOutGeneral purpose
EmphasizedeaseInOutCubicImportant transitions
DecelerateeaseOutEnter animations
AccelerateeaseInExit animations

9. Themes

Condis Default (Active)

Condis Red

Default brand theme — active in production

Primary #E63946 Light #FF5A67 Dark #B8232E
PropertyValue
Seed Colour#E63946 (red-orange)
Theme EngineMaterial 3 ColorScheme.fromSeed
StyleFlat, minimal shadows, border-delineated cards
Dark ModeSupported via darkTheme Riverpod provider
Error ColourSame as primary (brand red)

Whitelabel Support

The mobile app supports whitelabel theming via BrandConfig. Brands can override primary/secondary/accent colours, logos, splash screens, and welcome messages. Configuration is loaded from assets/config/brand.json.

Example: Whitelabel Themes

FitCoach Pro (Example)

Blue-based whitelabel brand

Primary #2563EB Dark #1D4ED8 Accent #3B82F6

GreenFit (Example)

Green-based whitelabel brand

Primary #059669 Dark #047857 Accent #10B981

VioletGym (Example)

Purple-based whitelabel brand

Primary #7C3AED Dark #6D28D9 Accent #8B5CF6

brand.json Format

{
  "appName": "FitCoach Pro",
  "appId": "com.fitcoachpro.app",
  "colors": {
    "primaryLight": "#2563EB",
    "primaryDark": "#1D4ED8",
    "secondaryLight": "#64748B",
    "secondaryDark": "#475569",
    "accentLight": "#3B82F6",
    "accentDark": "#1E40AF"
  },
  "assets": {
    "logo": "assets/brands/fitcoachpro/logo.png"
  },
  "messages": {
    "welcomeMessage": "Welcome to FitCoach Pro",
    "tagline": "Train smarter"
  }
}
Web note: The web does not currently support whitelabel. To add whitelabel web support, override CSS custom properties in design-tokens.css via a brand-specific CSS file or inline <style> block.

10. Platform Comparison

AspectMobile (Flutter)Web (HTML/CSS/TS)
Font familyOS system font (Material 3)system-ui stack
Theme engineThemeData + ColorScheme.fromSeedCSS custom properties
Dark modedarkTheme provider, auto-detects OSprefers-color-scheme media query
NavigationBottom nav bar + GoRouterPage links, topbar
CardsCard widget, elevation 0 + borderdiv.card with border
ButtonsFilledButton, OutlinedButton.btn-primary, .btn-secondary
Bottom sheetsMaterial bottom sheetsN/A (simple landing pages)
AnimationsFlutter Curves + DurationCSS transition
IconsMaterial IconsInline SVG / emoji

11. File Structure

Mobile (Canonical Source)

lib/core/
├── constants/
│   ├── design_tokens.dart    ← Canonical spacing, radius, elevation, animation
│   └── app_colors.dart       ← Canonical colour palette
├── theme/
│   ├── app_theme.dart        ← ThemeData providers (light + dark)
│   └── typography.dart       ← M3 type scale
└── config/
    └── brand_config.dart     ← Whitelabel configuration

Web

src/
├── design-tokens.css         ← CSS custom properties (mirrors design_tokens.dart)
├── condis-home.css           ← Home/landing page styles
└── style.css                 ← Global base styles + status page

style-guide/
├── index.html                ← This page
└── style-guide.css           ← Style guide page styles

12. Rules for Contributors

  1. Never hardcode colours. Use AppColors.* (mobile) or var(--color-*) (web).
  2. Never hardcode spacing. Use AppSpacing.* (mobile) or var(--space-*) (web).
  3. Cards are flat. Use elevation: 0 + 1px border, not box shadows.
  4. Radius is 12px for cards, 8px for buttons/inputs, 4px for chips.
  5. Primary colour is red (#E63946), not purple or blue.
  6. System font only. No custom fonts loaded.
  7. Mobile is the source of truth. Web design should follow mobile patterns.
  8. Dark mode: Always test both. Use semantic colour tokens, not raw hex values.
  9. Accessibility: Primary red is chosen for colorblind safety. Maintain WCAG AA contrast ratios (4.5:1 for text, 3:1 for large text/UI).
  10. Use design tokens exclusively. design_tokens.dart is the single source of truth.