DIEVAS

✶ Flutter Design System

Every token.
Every brand.

Production grade Flutter components built from the token layer up. Your apps own the brand. The system stays out of the way.

3 packages · 36 components · 9 theme aspects · brands
4 shipped
Buttons Filled · Outlined · Text · Icon
12 shipped
Form TextField · TextArea · Search · AuthCode Checkbox · Switch · Radio · Dropdown · SegmentedControl
9 shipped
Display Avatar · Badge · Tag · Icon Divider · Progress · Loader
9 typed aspects
System InheritedModel · Multi-brand Zero hardcoded values
4 planned
Up Next Carousel · Table SingleSelectComboBox · MultiSelectComboBox
FilledButton
OutlinedButton
TextButton
IconButton
AuthCode
Breadcrumb
DotIndicator
Checkbox
Dropdown
SegmentedControl
Switch
TextInput
TextArea
Radio
TextInputGroup
Search
Avatar
Badge
Tag
Divider
CircularProgress
LinearProgress
Icon
Loader
EmptyState
Alert
Snackbar
Banner
BottomSheet
Modal
Tooltip
Accordion
Drawer
MenuItem
Popover
TabBar
FilledButton
OutlinedButton
TextButton
IconButton
AuthCode
Breadcrumb
DotIndicator
Checkbox
Dropdown
SegmentedControl
Switch
TextInput
TextArea
Radio
TextInputGroup
Search
Avatar
Badge
Tag
Divider
CircularProgress
LinearProgress
Icon
Loader
EmptyState
Alert
Snackbar
Banner
BottomSheet
Modal
Tooltip
Accordion
Drawer
MenuItem
Popover
TabBar

✶ The problem

Components that know
nothing about brands.

Most Flutter codebases scatter Color(), TextStyle(), and magic numbers across every widget.
Dievas moves them all to the token layer.

typical flutter widget before
class SaveButton extends StatelessWidget {
                  @override
                    Widget build(BuildContext context) {
                      return Container(
                        decoration: BoxDecoration(
                          color: Color(0xFF6366F1),  // ← hardcoded
                          borderRadius: BorderRadius
                            .circular(8),          // ← hardcoded
                        ),
                        child: Text('Save',
                          style: TextStyle(
                            color: Color(0xFFFFFFFF), // ← hardcoded
                            fontSize: 14,            // ← hardcoded
                            fontWeight: FontWeight.w600,// ← hardcoded
                          ),
                        ),
                      );
                    }
                  }
with dievas after
class SaveButton extends StatelessWidget {
                    @override
                    Widget build(BuildContext context) {
                      return Container(
                        decoration: BoxDecoration(
                          color: context.colors.action
                            .actionPrimary,
                          borderRadius: BorderRadius
                            .circular(
                              context.border.radiusMd,
                            ),
                        ),
                        child: Text('Save',
                          style: context.typography.labelMd,
                          // color baked in   ✓
                          // size baked in    ✓
                          // weight baked in  ✓
                        ),
                      );
                    }
                  }
The rule: No hardcoded values. Not one. Not anywhere.

✶ Architecture

Three layers.
One rule.

Each layer has exactly one responsibility.
Tokens define.
Theme composes.
Components consume.

Tokens. Pure Dart
// primitive scale — raw ints
                  abstract final class DievasColourPrimitives {
                    static const int indigo500 = 0xFF6366F1;
                    static const int slate900  = 0xFF0F172A;
                  }
                  
                  // semantic alias — no Flutter import
                  abstract final class DievasColourSemanticLight {
                    static const int actionPrimary =
                      DievasColourPrimitives.indigo500;
                    static const int textPrimary =
                      DievasColourPrimitives.slate900;
                  }
theme + components Flutter
// Color wrapping happens once, here
                  import 'package:flutter/painting.dart';
                  import 'package:dievas_tokens/...';
                  
                  class ActionColors extends Equatable {
                    static const Color actionPrimary = Color(
                      DievasColourSemanticLight.actionPrimary,
                    );
                  }
                  
                  // 9 typed aspects — surgical rebuilds
                  enum DievasThemeAspect {
                    colors, typography, spacing,
                    sizing, border, elevation, ...
                  }
Your app Consumer
// extend with your brand tokens
                  class CadenceLightThemeData
                      extends DievasGlobalThemeData {
                    CadenceLightThemeData({super.components})
                      : super(colors: ..., border: ...);
                  }
                  
                  // wire up — system is brand-agnostic
                  DievasScope(
                    lightTheme: CadenceLightThemeData(),
                    darkTheme:  CadenceDarkThemeData(),
                    child: MaterialApp.router(...),
                  )
01

Token-first, always

Primitives → semantic aliases → Flutter Color. Nothing in a component file is ever a raw hex or a magic number.

02

InheritedModel precision

DievasTheme has 9 aspects. A widget reading colors never rebuilds when spacing changes. Surgical, not shotgun.

03

Multi-brand by design

Apps extend DievasGlobalThemeData with their own brand tokens. The design system never knows which brand is active.

04

Pure Dart token layer

dievas_tokens has zero Flutter imports. Safe for Jaspr, CLI, and server-side Dart targets. No platform lock-in.

✶ Component catalog

36 shipped.
4 not started.

Every component covers all sizes, states, and variants. All verified in the live gallery.

Buttons 4

Four button styles covering the full interaction spectrum. Filled, outlined, ghost, and square icon variants all driven by DievasButtonThemeData, no hardcoded values.

Filled
Outlined
Ghost
Active
Disabled
Form Inputs 12

The full input surface: text fields, text areas, checkboxes, switches, radio groups, auth codes, breadcrumbs, dot indicators, input groups, dropdowns, segmented controls, and search. Token driven states for focus, error, and disabled. Localized via DievasLocalizations.

Checkbox — checked
Switch — on
Enter value...
Radio — selected
Display 9

Avatar, badges, tags, dividers, loaders, and progress variants cover the visual data layer. Each derives color, sizing, and border radius entirely from DievasComponentThemeData.

AB
3
Tag
Overlays 6

Alert dialogs, bottom sheets, modals, snackbars, banners, and tooltips provide contextual feedback. Each integrates with DievasOverlayThemeData for backdrop and animation.

Alert
Important notice here
Item saved
Modal
Hover me
Tooltip
Nav / Disclosure 5

Accordion, drawer, popover, menu items, and tab bars provide progressive disclosure and contextual navigation. All surfaces are token-driven and animated via DievasAnimationThemeData.

Section
Content
Popover
In progress 4
Carousel
Table
SingleSelectComboBox
MultiSelectComboBox

✶ proof of work

The gallery is the proof.

Every component. Every state. Every size.
Toggle themes, resize viewports — live.

Open Dievas Gallery